From 2b27302166941f9e74ec5504f5dd59d9b74211cb Mon Sep 17 00:00:00 2001 From: Tim LaBerge Date: Sat, 25 Feb 2012 17:52:52 -0800 Subject: [PATCH 01/12] 1) Require libxml-2 and build new file preset_xml.c 2) In effects.c, some EffectsValues are changed to better reflect the strings used in the XML. 3) New EffectSettings are added for use when writing out effects to XML. 4) Added an XmlLabel structure for mapping a value to a string. Generally, these are the union of the set of all values over the set of supported devices. 5) There's a large array of XmlSettings used to derive the translation of a preset to XML. 6) Add an enum for product_id and use it to set a filter for file suffix. 7) Minor cleanup in push_message() that suppresses spurious error messages. 8) Fixed a bad memset in read_data_thread(). 9) In gdigi.h, a few changes in names to be consistent with XML. There are some new definitions of LFO and VSWITCH parameters that need to be computed. 10) In gui.c, fixed up a compiler warning. Added a map from device id to file type and code to set a default filter in the read dialog. Wired up the 'save to XML' callback and reorganized the menue entries to better distinguish between 'save to file' and 'store to device'. In preset.c, sort the params so that what we write as XML more closely matches what is generated on the windows side. --- Makefile | 6 +- effects.c | 976 ++++++++++++++++++++++++++++++++++++++++++++++----- effects.h | 15 +- gdigi.c | 10 +- gdigi.h | 232 +++++++++--- gdigi_xml.h | 39 ++ gui.c | 103 +++++- gui.h | 2 + preset.c | 17 +- preset.h | 2 +- preset_xml.c | 262 ++++++++++++++ 11 files changed, 1499 insertions(+), 165 deletions(-) create mode 100644 gdigi_xml.h create mode 100644 preset_xml.c diff --git a/Makefile b/Makefile index 0a044fb..75d6d05 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,10 @@ CC = gcc EXTRA_CFLAGS ?= EXTRA_LDFLAGS ?= -CFLAGS := $(shell pkg-config --cflags glib-2.0 gio-2.0 gtk+-3.0) -Wall -g -ansi -std=c99 $(EXTRA_CFLAGS) +CFLAGS := $(shell pkg-config --cflags glib-2.0 gio-2.0 gtk+-3.0 libxml-2.0) -Wall -g -ansi -std=c99 $(EXTRA_CFLAGS) LDFLAGS = $(EXTRA_LDFLAGS) -Wl,--as-needed -LDADD := $(shell pkg-config --libs glib-2.0 gio-2.0 gtk+-3.0 gthread-2.0 alsa) -lexpat -OBJECTS = gdigi.o gui.o effects.o preset.o gtkknob.o +LDADD := $(shell pkg-config --libs glib-2.0 gio-2.0 gtk+-3.0 gthread-2.0 alsa libxml-2.0) -lexpat +OBJECTS = gdigi.o gui.o effects.o preset.o gtkknob.o preset_xml.o DEPFILES = $(foreach m,$(OBJECTS:.o=),.$(m).m) .PHONY : clean distclean all diff --git a/effects.c b/effects.c index ec0c267..8dccedf 100644 --- a/effects.c +++ b/effects.c @@ -16,6 +16,7 @@ #include "gdigi.h" #include "effects.h" +#include "gdigi_xml.h" #ifndef DOXYGEN_SHOULD_SKIP_THIS @@ -295,6 +296,11 @@ static EffectValues values_1_2_warp = { .labels = amp_channel_labels, }; +static EffectValues values_a_b = { + .min = 0.0, .max = 2.0, + .type = VALUE_TYPE_LABEL, +}; + static EffectValues values_0_to_99 = { .min = 0.0, .max = 99.0, .type = VALUE_TYPE_PLAIN, }; @@ -319,10 +325,6 @@ static EffectValues values_0_to_49 = { .min = 0.0, .max = 49.0, .type = VALUE_TYPE_PLAIN, }; -static EffectValues values_0_to_12 = { - .min = 0.0, .max = 12.0, .type = VALUE_TYPE_PLAIN, -}; - static EffectValues values_0_to_15 = { .min = 0.0, .max = 15.0, .type = VALUE_TYPE_PLAIN, }; @@ -374,6 +376,12 @@ static EffectValues values_eq_db = { .suffix = "dB", .offset = -12, }; +static EffectValues values_db_boost = { + .min = 0.0, .max = 24.0, + .type = VALUE_TYPE_SUFFIX, + .suffix = "dB", +}; + static EffectValues values_eq_bass_hz = { .min = 0.0, .max = 250.0, .type = VALUE_TYPE_SUFFIX | VALUE_TYPE_OFFSET, @@ -481,7 +489,7 @@ static EffectValues values_delay_time = { .min = 0.0, .max = 98.0, .type = VALUE_TYPE_SUFFIX | VALUE_TYPE_OFFSET | VALUE_TYPE_STEP | VALUE_TYPE_EXTRA, - .suffix = "msec", .offset = 1, + .suffix = "ms", .offset = 1, .step = 10.0, .extra = &values_delay_time_extra, }; @@ -514,7 +522,7 @@ static EffectValues values_delay_time_0_5000 = { static EffectValues values_delay_repeats_extra = { .min = 100.0, .max = 100.0, .type = VALUE_TYPE_LABEL, - .labels = rhold_labels + .labels = rhold_labels, }; static EffectValues values_delay_repeats = { @@ -540,7 +548,7 @@ static EffectValues values_delay_spread_0_49 = { 0.0, 49.0, .type = VALUE_TYPE_PLAIN, }; -static EffectValues values_on_off = { +EffectValues values_on_off = { .min = 0.0, .max = 1.0, .type = VALUE_TYPE_LABEL, .labels = on_off_labels, @@ -576,6 +584,119 @@ static EffectValues values_pickup_type = { .labels = pickup_type_labels, }; +static EffectValues values_comp_type = { + .min = 0.0, .max = 1.0, + .type = VALUE_TYPE_LABEL, +}; + +static EffectValues values_dist_type = { + .min = 0.0, .max = 24.0, + .type = VALUE_TYPE_LABEL, +}; + +static EffectValues values_amp_type = { + .min = 0.0, .max = 1.0, + .type = VALUE_TYPE_LABEL, +}; + +static EffectValues values_cab_type = { + .min = 0.0, .max = 19.0, + .type = VALUE_TYPE_LABEL, +}; + +static EffectValues values_gate_type = { + .min = 0.0, .max = 1.0, + .type = VALUE_TYPE_LABEL, +}; + +static EffectValues values_mod_type = { + .min = 0.0, .max = 19.0, + .type = VALUE_TYPE_LABEL, +}; + +static EffectValues values_pre_post = { + .min = 0.0, .max = 15.0, + .type = VALUE_TYPE_LABEL, +}; + +static EffectValues values_delay_type = { + .min = 0.0, .max = 15.0, + .type = VALUE_TYPE_LABEL, +}; + +static EffectValues values_reverb_type = { + .min = 0.0, .max = 14.0, + .type = VALUE_TYPE_LABEL, +}; + +static EffectValues values_wah_type = { + .min = 0.0, .max = 1.0, + .type = VALUE_TYPE_LABEL, +}; + +static EffectValues values_exp_assign = { + .min = 0.0, .max = 1.0, + .type = VALUE_TYPE_LABEL, +}; + +static EffectValues values_vswitch_pedal_assign = { + .min = 0.0, .max = 1.0, + .type = VALUE_TYPE_LABEL, +}; + +static EffectValues values_vswitch_assign = { + .min = 0.0, .max = 1.0, + .type = VALUE_TYPE_LABEL, +}; + +static EffectValues values_vswitch_type = { + .min = 0.0, .max = 1.0, + .type = VALUE_TYPE_LABEL, +}; + +static EffectValues values_lfo_assign = { + .min = 0.0, .max = 1.0, + .type = VALUE_TYPE_LABEL, +}; + +static EffectValues values_lfo_none = { + .min = 0.0, .max = 0.0, + .type = VALUE_TYPE_NONE, +}; + +static EffectValues values_lfo_speed_extra = { + .min = 95.0, .max = 185.0, + .type = VALUE_TYPE_PLAIN | VALUE_TYPE_OFFSET | VALUE_TYPE_STEP | VALUE_TYPE_DECIMAL, + .offset = 5.0, .step = 0.1, .decimal = 1, .suffix = "Hz", +}; + +static EffectValues values_lfo_speed = { + .min = 0.0, .max = 94.0, + .type = VALUE_TYPE_PLAIN | VALUE_TYPE_OFFSET | VALUE_TYPE_STEP | VALUE_TYPE_DECIMAL | VALUE_TYPE_EXTRA | VALUE_TYPE_SUFFIX, + .offset = 5, .step = 0.01, .decimal = 1, .suffix = "Hz", + .extra = &values_lfo_speed_extra, +}; + +static EffectValues values_eq_type = { + .min = 0.0, .max = 3.0, + .type = VALUE_TYPE_LABEL, +}; + +static EffectValues values_lfo_waveform = { + .min = 0.0, .max = 3.0, + .type = VALUE_TYPE_LABEL, +}; + +static EffectValues values_tone_lib_type= { + .min = 0.0, .max = 31.0, + .type = VALUE_TYPE_LABEL, +}; + +static EffectValues values_fx_lib_type= { + .min = 0.0, .max = 31.0, + .type = VALUE_TYPE_LABEL, +}; + static EffectValues values_1_to_10_step_0p1 = { .min = 0.0, .max = 90.0, .type = VALUE_TYPE_OFFSET | VALUE_TYPE_STEP | VALUE_TYPE_DECIMAL, @@ -596,6 +717,14 @@ static EffectSettings misc_settings[] = { {"Preset Level", PRESET_LEVEL, PRESET_POSITION, &values_0_to_99}, }; +static EffectSettings pre_fx_settings[] = { + {"Volume Pre FX", PRESET_LEVEL, VOLUME_PRE_FX_POSITION, &values_0_to_99}, +}; + +static EffectSettings post_fx_settings[] = { + {"Volume Post FX", PRESET_LEVEL, VOLUME_POST_FX_POSITION, &values_0_to_99}, +}; + static EffectSettings gnx3k_wah_settings[] = { {"Min", WAH_MIN, WAH_POSITION_MIN_MAX, &values_0_to_99}, {"Max", WAH_MAX, WAH_POSITION_MIN_MAX, &values_0_to_99}, @@ -604,7 +733,7 @@ static EffectSettings gnx3k_wah_settings[] = { static EffectSettings wah_settings[] = { {"Min", WAH_MIN, WAH_POSITION_MIN_MAX, &values_0_to_99}, {"Max", WAH_MAX, WAH_POSITION_MIN_MAX, &values_0_to_99}, - {"Level", WAH_LEVEL, WAH_POSITION, &values_0_to_12}, + {"Level", WAH_VOLUME_BOOST, WAH_POSITION, &values_db_boost}, }; static EffectSettings gnx3k_whammy_settings[] = { @@ -827,8 +956,8 @@ static EffectSettings rp355_amp_settings_A[] = { }; static EffectSettings rp355_amp_settings_B[] = { - {"Gain", AMP_GAIN, CH2_AMP_POSITION, &values_0_to_99}, - {"Level", AMP_LEVEL, CH2_AMP_POSITION, &values_0_to_99}, + {"Gain", AMP_GAIN, AMP_B_POSITION, &values_0_to_99}, + {"Level", AMP_LEVEL, AMP_B_POSITION, &values_0_to_99}, }; static EffectSettings rp355_amp_settings2_A[] = { @@ -836,7 +965,7 @@ static EffectSettings rp355_amp_settings2_A[] = { }; static EffectSettings rp355_amp_settings2_B[] = { - {"Level", AMP_LEVEL, CH2_AMP_POSITION, &values_0_to_99}, + {"Level", AMP_LEVEL, AMP_B_POSITION, &values_0_to_99}, }; static EffectSettings rp500_amp_settings[] = { @@ -863,7 +992,7 @@ static EffectSettings gnx3k_ch1_cab_tuning_settings[] = { }; static EffectSettings gnx3k_ch2_cab_tuning_settings[] = { - {"Tuning", AMP_CAB_TUNING, CH2_AMP_CAB_POSITION, &values_m12_to_12_semitones}, + {"Tuning", AMP_CAB_TUNING, AMP_CAB_B_POSITION, &values_m12_to_12_semitones}, }; static EffectSettings gnx3k_ch1_amp_eq_settings[] = { @@ -879,53 +1008,53 @@ static EffectSettings gnx3k_ch1_amp_eq_settings[] = { }; static EffectSettings gnx3k_ch2_amp_eq_settings[] = { - {"Gain", AMP_GAIN, CH2_AMP_POSITION, &values_0_to_99}, - {"Bass Freq", AMP_BASS_FREQ, CH2_AMP_POSITION, &values_eq_bass_hz}, - {"Bass Level", AMP_BASS_LEVEL, CH2_AMP_POSITION, &values_eq_db}, - {"Mid Freq", AMP_MID_FREQ, CH2_AMP_POSITION, &values_eq_mid_hz}, - {"Mid Level", AMP_MID_LEVEL, CH2_AMP_POSITION, &values_eq_db}, - {"Treb Freq", AMP_TREBLE_FREQ, CH2_AMP_POSITION, &values_eq_treb_hz}, - {"Treb Level", AMP_TREBLE_LEVEL, CH2_AMP_POSITION, &values_eq_db}, - {"Presence", AMP_PRESENCE, CH2_AMP_POSITION, &values_eq_db}, - {"Level", AMP_LEVEL, CH2_AMP_POSITION, &values_0_to_99}, + {"Gain", AMP_GAIN, AMP_B_POSITION, &values_0_to_99}, + {"Bass Freq", AMP_BASS_FREQ, AMP_B_POSITION, &values_eq_bass_hz}, + {"Bass Level", AMP_BASS_LEVEL, AMP_B_POSITION, &values_eq_db}, + {"Mid Freq", AMP_MID_FREQ, AMP_B_POSITION, &values_eq_mid_hz}, + {"Mid Level", AMP_MID_LEVEL, AMP_B_POSITION, &values_eq_db}, + {"Treb Freq", AMP_TREBLE_FREQ, AMP_B_POSITION, &values_eq_treb_hz}, + {"Treb Level", AMP_TREBLE_LEVEL, AMP_B_POSITION, &values_eq_db}, + {"Presence", AMP_PRESENCE, AMP_B_POSITION, &values_eq_db}, + {"Level", AMP_LEVEL, AMP_B_POSITION, &values_0_to_99}, }; static EffectSettings rp250_eq_settings[] = { - {"Bass", EQ_BASS, EQ_POSITION, &values_eq_db}, - {"Mid", EQ_MID, EQ_POSITION, &values_eq_db}, - {"Treble", EQ_TREBLE, EQ_POSITION, &values_eq_db}, - {"Mid Hz", EQ_MID_HZ, EQ_POSITION, &values_eq_mid_hz}, - {"Treb Hz", EQ_TREBLE_HZ, EQ_POSITION, &values_eq_treb_hz}, + {"Bass", EQ_BASS, EQ_A_POSITION, &values_eq_db}, + {"Mid", EQ_MID, EQ_A_POSITION, &values_eq_db}, + {"Treble", EQ_TREB, EQ_A_POSITION, &values_eq_db}, + {"Mid Hz", EQ_MID_FREQ, EQ_A_POSITION, &values_eq_mid_hz}, + {"Treb Hz", EQ_TREB_FREQ, EQ_A_POSITION, &values_eq_treb_hz}, }; static EffectSettings rp355_eq_settings_A[] = { - {"Bass", EQ_BASS, EQ_POSITION, &values_eq_db}, - {"Mid", EQ_MID, EQ_POSITION, &values_eq_db}, - {"Treble", EQ_TREBLE, EQ_POSITION, &values_eq_db}, - {"Mid Hz", EQ_MID_HZ, EQ_POSITION, &values_eq_mid_hz}, - {"Treb Hz", EQ_TREBLE_HZ, EQ_POSITION, &values_eq_treb_hz}, - {"Presence", EQ_PRESENCE, EQ_POSITION, &values_eq_db}, + {"Bass", EQ_BASS, EQ_A_POSITION, &values_eq_db}, + {"Mid", EQ_MID, EQ_A_POSITION, &values_eq_db}, + {"Treble", EQ_TREB, EQ_A_POSITION, &values_eq_db}, + {"Mid Hz", EQ_MID_FREQ, EQ_A_POSITION, &values_eq_mid_hz}, + {"Treb Hz", EQ_TREB_FREQ, EQ_A_POSITION, &values_eq_treb_hz}, + {"Presence", EQ_PRESENCE, EQ_A_POSITION, &values_eq_db}, }; static EffectSettings rp355_eq_settings_B[] = { - {"Bass", EQ_BASS, EQ_POSITION_B, &values_eq_db}, - {"Mid", EQ_MID, EQ_POSITION_B, &values_eq_db}, - {"Treble", EQ_TREBLE, EQ_POSITION_B, &values_eq_db}, - {"Mid Hz", EQ_MID_HZ, EQ_POSITION_B, &values_eq_mid_hz}, - {"Treb Hz", EQ_TREBLE_HZ, EQ_POSITION_B, &values_eq_treb_hz}, - {"Presence", EQ_PRESENCE, EQ_POSITION_B, &values_eq_db}, + {"Bass", EQ_BASS, EQ_B_POSITION, &values_eq_db}, + {"Mid", EQ_MID, EQ_B_POSITION, &values_eq_db}, + {"Treble", EQ_TREB, EQ_B_POSITION, &values_eq_db}, + {"Mid Hz", EQ_MID_FREQ, EQ_B_POSITION, &values_eq_mid_hz}, + {"Treb Hz", EQ_TREB_FREQ, EQ_B_POSITION, &values_eq_treb_hz}, + {"Presence", EQ_PRESENCE, EQ_B_POSITION, &values_eq_db}, }; static EffectSettings rp500_eq_settings[] = { - {"Low Level", EQ_LOW_LEVEL, EQ_POSITION, &values_eq_db}, - {"Mid Level", EQ_MID_LEVEL, EQ_POSITION, &values_eq_db}, - {"High Level", EQ_HIGH_LEVEL, EQ_POSITION, &values_eq_db}, - {"Low Freq", EQ_LOW_FREQ, EQ_POSITION, &values_eq_low_freq}, - {"Mid Freq", EQ_MID_FREQ, EQ_POSITION, &values_eq_mid_freq}, - {"High Freq", EQ_HIGH_FREQ, EQ_POSITION, &values_eq_high_freq}, - {"Low Bandwidth", EQ_LOW_BANDWIDTH, EQ_POSITION, &values_eq_bandwidth}, - {"Mid Bandwidth", EQ_MID_BANDWIDTH, EQ_POSITION, &values_eq_bandwidth}, - {"High Bandwidth", EQ_HIGH_BANDWIDTH, EQ_POSITION, &values_eq_bandwidth}, + {"Low Level", EQ_BASS, EQ_A_POSITION, &values_eq_db}, + {"Mid Level", EQ_MID, EQ_A_POSITION, &values_eq_db}, + {"High Level", EQ_TREB, EQ_A_POSITION, &values_eq_db}, + {"Low Freq", EQ_LOW_FREQ, EQ_A_POSITION, &values_eq_low_freq}, + {"Mid Freq", EQ_MID_FREQ, EQ_A_POSITION, &values_eq_mid_freq}, + {"High Freq", EQ_HIGH_FREQ, EQ_A_POSITION, &values_eq_high_freq}, + {"Low Bandwidth", EQ_LOW_BANDWIDTH, EQ_A_POSITION, &values_eq_bandwidth}, + {"Mid Bandwidth", EQ_MID_BANDWIDTH, EQ_A_POSITION, &values_eq_bandwidth}, + {"High Bandwidth", EQ_HIGH_BANDWIDTH, EQ_A_POSITION, &values_eq_bandwidth}, }; static EffectSettings noisegate_silencer_settings[] = { @@ -1441,9 +1570,9 @@ static EffectGroup gnx3k_wah_group[] = { }; static EffectGroup wah_group[] = { - {WAH_TYPE_CRY, "Cry wah", wah_settings, G_N_ELEMENTS(wah_settings)}, - {WAH_TYPE_FULLRANGE, "Fullrange wah", wah_settings, G_N_ELEMENTS(wah_settings)}, - {WAH_TYPE_CLYDE, "Clyde wah", wah_settings, G_N_ELEMENTS(wah_settings)}, + {WAH_TYPE_CRY, "Cry Wah", wah_settings, G_N_ELEMENTS(wah_settings)}, + {WAH_TYPE_FULLRANGE, "Fullrange Wah", wah_settings, G_N_ELEMENTS(wah_settings)}, + {WAH_TYPE_CLYDE, "Clyde Wah", wah_settings, G_N_ELEMENTS(wah_settings)}, }; static EffectGroup gnx3k_whammy_group[] = { @@ -1471,6 +1600,14 @@ static EffectGroup misc_group[] = { {-1, NULL, misc_settings, G_N_ELEMENTS(misc_settings)}, }; +static EffectGroup pre_fx_group[] = { + {-1, NULL, pre_fx_settings, G_N_ELEMENTS(pre_fx_settings)}, +}; + +static EffectGroup post_fx_group[] = { + {-1, NULL, post_fx_settings, G_N_ELEMENTS(post_fx_settings)}, +}; + static EffectGroup gnx3k_preset_group[] = { {-1, NULL, gnx3k_preset_settings, G_N_ELEMENTS(gnx3k_preset_settings)}, }; @@ -1945,7 +2082,7 @@ static EffectGroup rp150_amp_group[] = { {AMP_TYPE_SOLO, "Solo", rp250_amp_settings, G_N_ELEMENTS(rp250_amp_settings)}, {AMP_TYPE_METAL, "Metal", rp250_amp_settings, G_N_ELEMENTS(rp250_amp_settings)}, {AMP_TYPE_BRIGHT, "Bright", rp250_amp_settings, G_N_ELEMENTS(rp250_amp_settings)}, - {AMP_TYPE_CLEAN, "Clean", rp250_amp_settings, G_N_ELEMENTS(rp250_amp_settings)}, + {AMP_TYPE_DIGITECH_CLEAN, "Clean", rp250_amp_settings, G_N_ELEMENTS(rp250_amp_settings)}, {AMP_TYPE_ACOUSTIC, "Acoustic", rp250_amp_settings2, G_N_ELEMENTS(rp250_amp_settings2)}, {AMP_TYPE_DIRECT, "Direct", rp250_amp_settings2, G_N_ELEMENTS(rp250_amp_settings2)}, }; @@ -1971,7 +2108,7 @@ static EffectGroup rp155_amp_group[] = { {AMP_TYPE_METAL, "Metal", rp250_amp_settings, G_N_ELEMENTS(rp250_amp_settings)}, {AMP_TYPE_HIGH_GAIN, "High Gain", rp250_amp_settings, G_N_ELEMENTS(rp250_amp_settings)}, {AMP_TYPE_BRIGHT, "Bright", rp250_amp_settings, G_N_ELEMENTS(rp250_amp_settings)}, - {AMP_TYPE_CLEAN, "Clean", rp250_amp_settings, G_N_ELEMENTS(rp250_amp_settings)}, + {AMP_TYPE_DIGITECH_CLEAN, "Clean", rp250_amp_settings, G_N_ELEMENTS(rp250_amp_settings)}, {AMP_TYPE_ACOUSTIC, "Acoustic", rp250_amp_settings2, G_N_ELEMENTS(rp250_amp_settings2)}, {AMP_TYPE_DIRECT, "Direct", rp250_amp_settings2, G_N_ELEMENTS(rp250_amp_settings2)}, }; @@ -1995,7 +2132,7 @@ static EffectGroup rp250_amp_group[] = { {AMP_TYPE_SOLO, "Solo", rp250_amp_settings, G_N_ELEMENTS(rp250_amp_settings)}, {AMP_TYPE_METAL, "Metal", rp250_amp_settings, G_N_ELEMENTS(rp250_amp_settings)}, {AMP_TYPE_BRIGHT, "Bright", rp250_amp_settings, G_N_ELEMENTS(rp250_amp_settings)}, - {AMP_TYPE_CLEAN, "Clean", rp250_amp_settings, G_N_ELEMENTS(rp250_amp_settings)}, + {AMP_TYPE_DIGITECH_CLEAN, "Clean", rp250_amp_settings, G_N_ELEMENTS(rp250_amp_settings)}, {AMP_TYPE_HIGH_GAIN, "High Gain", rp250_amp_settings, G_N_ELEMENTS(rp250_amp_settings)}, {AMP_TYPE_ACOUSTIC, "Acoustic", rp250_amp_settings2, G_N_ELEMENTS(rp250_amp_settings2)}, {AMP_TYPE_DIRECT, "Direct", rp250_amp_settings2, G_N_ELEMENTS(rp250_amp_settings2)}, @@ -2010,7 +2147,7 @@ static EffectGroup rp255_amp_group[] = { {AMP_TYPE_BLACKFACE_DELUXE, "Blackface Deluxe", rp250_amp_settings, G_N_ELEMENTS(rp250_amp_settings)}, {AMP_TYPE_SUPER_LEAD_PLEXI, "Super Lead Plexi", rp250_amp_settings, G_N_ELEMENTS(rp250_amp_settings)}, {AMP_TYPE_PLEXI_JTM_45, "Plexi JTM-45", rp250_amp_settings, G_N_ELEMENTS(rp250_amp_settings)}, - {AMP_TYPE_PLEXI_JUMP_PANEL, "Plexi Jump Panel", rp250_amp_settings, G_N_ELEMENTS(rp250_amp_settings)}, + {AMP_TYPE_68_MARSHALL_JUMP, "Plexi Jump Panel", rp250_amp_settings, G_N_ELEMENTS(rp250_amp_settings)}, {AMP_TYPE_MASTER_VOLUME, "Master Volume", rp250_amp_settings, G_N_ELEMENTS(rp250_amp_settings)}, {AMP_TYPE_JCM800, "JCM800", rp250_amp_settings, G_N_ELEMENTS(rp250_amp_settings)}, {AMP_TYPE_JCM900, "JCM900", rp250_amp_settings, G_N_ELEMENTS(rp250_amp_settings)}, @@ -2024,7 +2161,7 @@ static EffectGroup rp255_amp_group[] = { {AMP_TYPE_SOLO, "Solo", rp250_amp_settings, G_N_ELEMENTS(rp250_amp_settings)}, {AMP_TYPE_METAL, "Metal", rp250_amp_settings, G_N_ELEMENTS(rp250_amp_settings)}, {AMP_TYPE_BRIGHT, "Bright", rp250_amp_settings, G_N_ELEMENTS(rp250_amp_settings)}, - {AMP_TYPE_CLEAN, "Clean", rp250_amp_settings, G_N_ELEMENTS(rp250_amp_settings)}, + {AMP_TYPE_DIGITECH_CLEAN, "Clean", rp250_amp_settings, G_N_ELEMENTS(rp250_amp_settings)}, {AMP_TYPE_HIGH_GAIN, "High Gain", rp250_amp_settings, G_N_ELEMENTS(rp250_amp_settings)}, {AMP_TYPE_ACOUSTIC, "Acoustic", rp250_amp_settings2, G_N_ELEMENTS(rp250_amp_settings2)}, {AMP_TYPE_DIRECT, "Direct", rp250_amp_settings2, G_N_ELEMENTS(rp250_amp_settings2)}, @@ -2043,7 +2180,7 @@ static EffectGroup rp355_amp_group_A[] = { {AMP_TYPE_BLACKFACE_DELUXE, "Blackface Deluxe", rp355_amp_settings_A, G_N_ELEMENTS(rp355_amp_settings_A)}, {AMP_TYPE_PLEXI_JTM_45, "Plexi JTM-45", rp355_amp_settings_A, G_N_ELEMENTS(rp355_amp_settings_A)}, {AMP_TYPE_SUPER_LEAD_PLEXI, "Plexi Lead", rp355_amp_settings_A, G_N_ELEMENTS(rp355_amp_settings_A)}, - {AMP_TYPE_PLEXI_JUMP_PANEL, "Plexi Jump Panel", rp355_amp_settings_A, G_N_ELEMENTS(rp355_amp_settings_A)}, + {AMP_TYPE_68_MARSHALL_JUMP, "Plexi Jump Panel", rp355_amp_settings_A, G_N_ELEMENTS(rp355_amp_settings_A)}, {AMP_TYPE_MASTER_VOLUME, "Master Volume", rp355_amp_settings_A, G_N_ELEMENTS(rp355_amp_settings_A)}, {AMP_TYPE_JCM800, "JCM800", rp355_amp_settings_A, G_N_ELEMENTS(rp355_amp_settings_A)}, {AMP_TYPE_JCM900, "JCM900", rp355_amp_settings_A, G_N_ELEMENTS(rp355_amp_settings_A)}, @@ -2058,7 +2195,7 @@ static EffectGroup rp355_amp_group_A[] = { {AMP_TYPE_METAL, "Metal", rp355_amp_settings_A, G_N_ELEMENTS(rp355_amp_settings_A)}, {AMP_TYPE_BRIGHT, "Bright Clean", rp355_amp_settings_A, G_N_ELEMENTS(rp355_amp_settings_A)}, {AMP_TYPE_CHUNK, "Chunk", rp355_amp_settings_A, G_N_ELEMENTS(rp355_amp_settings_A)}, - {AMP_TYPE_CLEAN, "Clean Tube", rp355_amp_settings_A, G_N_ELEMENTS(rp355_amp_settings_A)}, + {AMP_TYPE_DIGITECH_CLEAN, "Clean Tube", rp355_amp_settings_A, G_N_ELEMENTS(rp355_amp_settings_A)}, {AMP_TYPE_HIGH_GAIN, "High Gain", rp355_amp_settings_A, G_N_ELEMENTS(rp355_amp_settings_A)}, {AMP_TYPE_GSP2101_CLEAN_TUBE, "GSP2101 Clean Tube", rp355_amp_settings_A, G_N_ELEMENTS(rp355_amp_settings_A)}, {AMP_TYPE_GSP2101_SAT_TUBE, "GSP2101 Sat Tube", rp355_amp_settings_A, G_N_ELEMENTS(rp355_amp_settings_A)}, @@ -2081,7 +2218,7 @@ static EffectGroup rp355_amp_group_B[] = { {AMP_TYPE_BLACKFACE_DELUXE, "Blackface Deluxe", rp355_amp_settings_B, G_N_ELEMENTS(rp355_amp_settings_B)}, {AMP_TYPE_PLEXI_JTM_45, "Plexi JTM-45", rp355_amp_settings_B, G_N_ELEMENTS(rp355_amp_settings_B)}, {AMP_TYPE_SUPER_LEAD_PLEXI, "Plexi Lead", rp355_amp_settings_B, G_N_ELEMENTS(rp355_amp_settings_B)}, - {AMP_TYPE_PLEXI_JUMP_PANEL, "Plexi Jump Panel", rp355_amp_settings_B, G_N_ELEMENTS(rp355_amp_settings_B)}, + {AMP_TYPE_68_MARSHALL_JUMP, "Plexi Jump Panel", rp355_amp_settings_B, G_N_ELEMENTS(rp355_amp_settings_B)}, {AMP_TYPE_MASTER_VOLUME, "Master Volume", rp355_amp_settings_B, G_N_ELEMENTS(rp355_amp_settings_B)}, {AMP_TYPE_JCM800, "JCM800", rp355_amp_settings_B, G_N_ELEMENTS(rp355_amp_settings_B)}, {AMP_TYPE_JCM900, "JCM900", rp355_amp_settings_B, G_N_ELEMENTS(rp355_amp_settings_B)}, @@ -2096,7 +2233,7 @@ static EffectGroup rp355_amp_group_B[] = { {AMP_TYPE_METAL, "Metal", rp355_amp_settings_B, G_N_ELEMENTS(rp355_amp_settings_B)}, {AMP_TYPE_BRIGHT, "Bright Clean", rp355_amp_settings_B, G_N_ELEMENTS(rp355_amp_settings_B)}, {AMP_TYPE_CHUNK, "Chunk", rp355_amp_settings_B, G_N_ELEMENTS(rp355_amp_settings_B)}, - {AMP_TYPE_CLEAN, "Clean Tube", rp355_amp_settings_B, G_N_ELEMENTS(rp355_amp_settings_B)}, + {AMP_TYPE_DIGITECH_CLEAN, "Clean Tube", rp355_amp_settings_B, G_N_ELEMENTS(rp355_amp_settings_B)}, {AMP_TYPE_HIGH_GAIN, "High Gain", rp355_amp_settings_B, G_N_ELEMENTS(rp355_amp_settings_B)}, {AMP_TYPE_GSP2101_CLEAN_TUBE, "GSP2101 Clean Tube", rp355_amp_settings_B, G_N_ELEMENTS(rp355_amp_settings_B)}, {AMP_TYPE_GSP2101_SAT_TUBE, "GSP2101 Sat Tube", rp355_amp_settings_B, G_N_ELEMENTS(rp355_amp_settings_B)}, @@ -2120,7 +2257,7 @@ static EffectGroup rp500_amp_group[] = { {AMP_TYPE_BLACKFACE_DELUXE, "Blackface Deluxe", rp500_amp_settings, G_N_ELEMENTS(rp500_amp_settings)}, {AMP_TYPE_PLEXI_JTM_45, "Plexi JTM-45", rp500_amp_settings, G_N_ELEMENTS(rp500_amp_settings)}, {AMP_TYPE_SUPER_LEAD_PLEXI, "Plexi Lead", rp500_amp_settings, G_N_ELEMENTS(rp500_amp_settings)}, - {AMP_TYPE_PLEXI_JUMP_PANEL, "Plexi Jump Panel", rp500_amp_settings, G_N_ELEMENTS(rp500_amp_settings)}, + {AMP_TYPE_68_MARSHALL_JUMP, "Plexi Jump Panel", rp500_amp_settings, G_N_ELEMENTS(rp500_amp_settings)}, {AMP_TYPE_MASTER_VOLUME, "Master Volume", rp500_amp_settings, G_N_ELEMENTS(rp500_amp_settings)}, {AMP_TYPE_JCM800, "JCM800", rp500_amp_settings, G_N_ELEMENTS(rp500_amp_settings)}, {AMP_TYPE_JCM900, "JCM900", rp500_amp_settings, G_N_ELEMENTS(rp500_amp_settings)}, @@ -2146,7 +2283,7 @@ static EffectGroup rp500_amp_group[] = { {AMP_TYPE_METAL, "Metal", rp500_amp_settings, G_N_ELEMENTS(rp500_amp_settings)}, {AMP_TYPE_BRIGHT, "Bright Clean", rp500_amp_settings, G_N_ELEMENTS(rp500_amp_settings)}, {AMP_TYPE_CHUNK, "Chunk", rp500_amp_settings, G_N_ELEMENTS(rp500_amp_settings)}, - {AMP_TYPE_CLEAN, "Clean Tube", rp500_amp_settings, G_N_ELEMENTS(rp500_amp_settings)}, + {AMP_TYPE_DIGITECH_CLEAN, "Clean Tube", rp500_amp_settings, G_N_ELEMENTS(rp500_amp_settings)}, {AMP_TYPE_HIGH_GAIN, "High Gain", rp500_amp_settings, G_N_ELEMENTS(rp500_amp_settings)}, {AMP_TYPE_BLUES, "Blues", rp500_amp_settings, G_N_ELEMENTS(rp500_amp_settings)}, {AMP_TYPE_FUZZ, "Fuzz", rp500_amp_settings, G_N_ELEMENTS(rp500_amp_settings)}, @@ -2176,7 +2313,7 @@ static EffectGroup rp1000_amp_group[] = { {AMP_TYPE_BLACKFACE_DELUXE, "Blackface Deluxe", rp500_amp_settings, G_N_ELEMENTS(rp500_amp_settings)}, {AMP_TYPE_PLEXI_JTM_45, "Plexi JTM-45", rp500_amp_settings, G_N_ELEMENTS(rp500_amp_settings)}, {AMP_TYPE_SUPER_LEAD_PLEXI, "Plexi Lead", rp500_amp_settings, G_N_ELEMENTS(rp500_amp_settings)}, - {AMP_TYPE_PLEXI_JUMP_PANEL, "Plexi Jump Panel", rp500_amp_settings, G_N_ELEMENTS(rp500_amp_settings)}, + {AMP_TYPE_68_MARSHALL_JUMP, "Plexi Jump Panel", rp500_amp_settings, G_N_ELEMENTS(rp500_amp_settings)}, {AMP_TYPE_MASTER_VOLUME, "Master Volume", rp500_amp_settings, G_N_ELEMENTS(rp500_amp_settings)}, {AMP_TYPE_JCM800, "JCM800", rp500_amp_settings, G_N_ELEMENTS(rp500_amp_settings)}, {AMP_TYPE_JCM900, "JCM900", rp500_amp_settings, G_N_ELEMENTS(rp500_amp_settings)}, @@ -2204,7 +2341,7 @@ static EffectGroup rp1000_amp_group[] = { {AMP_TYPE_METAL, "Metal", rp500_amp_settings, G_N_ELEMENTS(rp500_amp_settings)}, {AMP_TYPE_BRIGHT, "Bright Clean", rp500_amp_settings, G_N_ELEMENTS(rp500_amp_settings)}, {AMP_TYPE_CHUNK, "Chunk", rp500_amp_settings, G_N_ELEMENTS(rp500_amp_settings)}, - {AMP_TYPE_CLEAN, "Clean Tube", rp500_amp_settings, G_N_ELEMENTS(rp500_amp_settings)}, + {AMP_TYPE_DIGITECH_CLEAN, "Clean Tube", rp500_amp_settings, G_N_ELEMENTS(rp500_amp_settings)}, {AMP_TYPE_HIGH_GAIN, "High Gain", rp500_amp_settings, G_N_ELEMENTS(rp500_amp_settings)}, {AMP_TYPE_BLUES, "Blues", rp500_amp_settings, G_N_ELEMENTS(rp500_amp_settings)}, {AMP_TYPE_FUZZ, "Fuzz", rp500_amp_settings, G_N_ELEMENTS(rp500_amp_settings)}, @@ -2235,7 +2372,7 @@ static EffectGroup gnx3k_amp_group[] = { {AMP_TYPE_BLACKFACE_DELUXE, "Blackface Deluxe", NULL, -1}, {AMP_TYPE_PLEXI_JTM_45, "Plexi JTM-45", NULL, -1}, {AMP_TYPE_SUPER_LEAD_PLEXI, "Plexi Lead", NULL, -1}, - {AMP_TYPE_PLEXI_JUMP_PANEL, "Plexi Jump Panel", NULL, -1}, + {AMP_TYPE_68_MARSHALL_JUMP, "Plexi Jump Panel", NULL, -1}, {AMP_TYPE_MASTER_VOLUME, "Master Volume", NULL, -1}, {AMP_TYPE_JCM800, "JCM800", NULL, -1}, {AMP_TYPE_JCM900, "JCM900", NULL, -1}, @@ -2254,7 +2391,7 @@ static EffectGroup gnx3k_amp_group[] = { {AMP_TYPE_METAL, "Metal", NULL, -1}, {AMP_TYPE_BRIGHT, "Bright Clean", NULL, -1}, {AMP_TYPE_CHUNK, "Chunk", NULL, -1}, - {AMP_TYPE_CLEAN, "Clean Tube", NULL, -1}, + {AMP_TYPE_DIGITECH_CLEAN, "Clean Tube", NULL, -1}, {AMP_TYPE_CRUNCH, "Crunch", NULL, -1}, {AMP_TYPE_HIGH_GAIN, "High Gain", NULL, -1}, {AMP_TYPE_BLUES, "Blues", NULL, -1}, @@ -2538,8 +2675,8 @@ static EffectGroup pickup_group[] = { }; static EffectGroup pre_post_group[] = { - {CHORUSFX_PRE, "PRE AMP", NULL, -1}, - {CHORUSFX_POST, "POST AMP", NULL, -1}, + {CHORUSFX_PRE, "Pre Amp", NULL, -1}, + {CHORUSFX_POST, "Post Amp", NULL, -1}, }; static EffectGroup delay_mult_group[] = { @@ -2707,7 +2844,7 @@ static Effect rp255_amp_effect[] = { }; static Effect rp355_select_amp_effect[] = { - {"Select Amp", -1, AMP_SELECT, AMP_SELECT_POSITION, rp355_amp_select_group, G_N_ELEMENTS(rp355_amp_select_group)}, + {"Select Amp", -1, AMP_CHANNEL, AMP_CHANNEL_POSITION, rp355_amp_select_group, G_N_ELEMENTS(rp355_amp_select_group)}, }; static Effect rp355_amp_effect_A[] = { @@ -2716,8 +2853,8 @@ static Effect rp355_amp_effect_A[] = { }; static Effect rp355_amp_effect_B[] = { - {NULL, AMP_ON_OFF, AMP_TYPE, CH2_AMP_POSITION, rp355_amp_group_B, G_N_ELEMENTS(rp355_amp_group_B)}, - {"Cabinet", -1, AMP_CAB_TYPE, CH2_AMP_CAB_POSITION, rp355_amp_cab_group, G_N_ELEMENTS(rp355_amp_cab_group)}, + {NULL, AMP_ON_OFF, AMP_TYPE, AMP_B_POSITION, rp355_amp_group_B, G_N_ELEMENTS(rp355_amp_group_B)}, + {"Cabinet", -1, AMP_CAB_TYPE, AMP_CAB_B_POSITION, rp355_amp_cab_group, G_N_ELEMENTS(rp355_amp_cab_group)}, }; static Effect rp500_amp_effect[] = { @@ -2740,31 +2877,33 @@ static Effect gnx3k_channel_1_effect[] = { }; static Effect gnx3k_channel_2_effect[] = { - {"EQ Enable", AMP_EQ_ON_OFF, AMP_TYPE, CH2_AMP_POSITION, gnx3k_amp_group, G_N_ELEMENTS(gnx3k_amp_group)}, - {NULL, -1, AMP_CAB_TYPE, CH2_AMP_CAB_POSITION, gnx3k_amp_cab_group, G_N_ELEMENTS(gnx3k_amp_cab_group)}, + {"EQ Enable", AMP_EQ_ON_OFF, AMP_TYPE, AMP_B_POSITION, gnx3k_amp_group, G_N_ELEMENTS(gnx3k_amp_group)}, + {NULL, -1, AMP_CAB_TYPE, AMP_CAB_B_POSITION, gnx3k_amp_cab_group, G_N_ELEMENTS(gnx3k_amp_cab_group)}, {NULL, -1, -1, -1, gnx3k_ch2_cab_tuning_group, G_N_ELEMENTS(gnx3k_ch2_cab_tuning_group)}, {NULL, -1, -1, -1, gnx3k_ch2_amp_eq_group, G_N_ELEMENTS(gnx3k_ch2_amp_eq_group)}, }; static Effect rp250_eq_effect[] = { - {NULL, EQ_ON_OFF, EQ_TYPE, EQ_POSITION, rp250_eq_group, G_N_ELEMENTS(rp250_eq_group)}, + {NULL, EQ_ENABLE, EQ_TYPE, EQ_A_POSITION, rp250_eq_group, G_N_ELEMENTS(rp250_eq_group)}, }; static Effect rp355_eq_effect_A[] = { - {NULL, EQ_ON_OFF, EQ_TYPE, EQ_POSITION, rp355_eq_group_A, G_N_ELEMENTS(rp355_eq_group_A)}, + {NULL, EQ_ENABLE, EQ_TYPE, EQ_A_POSITION, rp355_eq_group_A, G_N_ELEMENTS(rp355_eq_group_A)}, }; static Effect rp355_eq_effect_B[] = { - {NULL, EQ_ON_OFF, EQ_TYPE, EQ_POSITION_B, rp355_eq_group_B, G_N_ELEMENTS(rp355_eq_group_B)}, + {NULL, EQ_ENABLE, EQ_TYPE, EQ_B_POSITION, rp355_eq_group_B, G_N_ELEMENTS(rp355_eq_group_B)}, }; static Effect rp500_eq_effect[] = { - {"Enable Equalizer", EQ_ON_OFF, -1, EQ_POSITION, rp500_eq_group, G_N_ELEMENTS(rp500_eq_group)}, + {"Enable Equalizer", EQ_ENABLE, -1, EQ_A_POSITION, rp500_eq_group, G_N_ELEMENTS(rp500_eq_group)}, }; static Effect pickup_misc_effect[] = { {NULL, PICKUP_ON_OFF, PICKUP_TYPE, PICKUP_POSITION, pickup_group, G_N_ELEMENTS(pickup_group)}, - {NULL, -1, -1, -1, misc_group, G_N_ELEMENTS(misc_group)}, + {NULL, -1, PRESET_LEVEL, PRESET_POSITION, misc_group, G_N_ELEMENTS(misc_group)}, + {NULL, -1, PRESET_LEVEL, PRESET_POSITION, pre_fx_group, G_N_ELEMENTS(pre_fx_group)}, + {NULL, -1, PRESET_LEVEL, PRESET_POSITION, post_fx_group, G_N_ELEMENTS(post_fx_group)}, }; static Effect pickup_effect[] = { @@ -3123,10 +3262,10 @@ static Modifier modifiers[] = { {"Amp Channel Enable", AMP_ON_OFF, AMP_POSITION, &values_on_off}, {"Amp Gain", AMP_GAIN, AMP_POSITION, &values_0_to_99}, {"Amp Level", AMP_LEVEL, AMP_POSITION, &values_0_to_99}, - {"EQ Enable", EQ_ON_OFF, EQ_POSITION, &values_on_off}, - {"EQ Bass", EQ_BASS, EQ_POSITION, &values_eq_db}, - {"EQ Mid", EQ_MID, EQ_POSITION, &values_eq_db}, - {"EQ Treb", EQ_TREBLE, EQ_POSITION, &values_eq_db}, + {"EQ Enable", EQ_ENABLE, EQ_A_POSITION, &values_on_off}, + {"EQ Bass", EQ_BASS, EQ_A_POSITION, &values_eq_db}, + {"EQ Mid", EQ_MID, EQ_A_POSITION, &values_eq_db}, + {"EQ Treb", EQ_TREB, EQ_A_POSITION, &values_eq_db}, {"Gate Enable", NOISEGATE_ON_OFF, NOISEGATE_POSITION, &values_on_off}, {"Gate Pluck Sens", NOISEGATE_SWELL_SENS, NOISEGATE_POSITION, &values_0_to_99}, {"Gate Threshold", NOISEGATE_GATE_TRESHOLD, NOISEGATE_POSITION, &values_0_to_99}, @@ -3207,6 +3346,679 @@ static Modifier modifiers[] = { int n_modifiers = G_N_ELEMENTS(modifiers); +/* + * Structures for mapping presets to XML. There's duplication here, but this + * method is general and device independent. + */ + +static XmlLabel xml_on_off_labels[] = { + {0, "Off"}, + {1, "On"}, +}; + +static XmlLabel xml_pickup_labels[] = { + {PICKUP_TYPE_HB_SC, "HB>SC"}, + {PICKUP_TYPE_SC_HB, "SC>HB"}, +}; + +static XmlLabel xml_comp_labels[] = { + {COMP_TYPE_DIGI, "Digi Comp"}, + {COMP_TYPE_CS, "CS Comp"}, + {COMP_TYPE_DYNA, "Dyna Comp"}, +}; + +static XmlLabel xml_dist_labels[] = { + {DIST_TYPE_SCREAMER, "Screamer"}, + {DIST_TYPE_808, "808"}, + {DIST_TYPE_TS_MOD, "TS Mod"}, + {DIST_TYPE_SD_ODRV, "SD Overdrive"}, + {DIST_TYPE_OD_ODRV, "OD Overdrive"}, + {DIST_TYPE_SPARKDRIVE, "Sparkdrive"}, + {DIST_TYPE_GUYOD, "Guy Overdrive"}, + {DIST_TYPE_DOD250, "DOD250"}, + {DIST_TYPE_REDLINE, "Redline"}, + {DIST_TYPE_AMPDRIVR, "Amp Driver"}, + {DIST_TYPE_OC_DRIVE, "OC Drive"}, + {DIST_TYPE_RODENT, "Rodent"}, + {DIST_TYPE_MX, "MX Dist"}, + {DIST_TYPE_DS, "DS Dist"}, + {DIST_TYPE_GRUNGE, "Grunge"}, + {DIST_TYPE_ZONE, "Zone"}, + {DIST_TYPE_DEATH, "Death"}, + {DIST_TYPE_GONK, "Gonk"}, + {DIST_TYPE_8TAVIA, "8tavia"}, + {DIST_TYPE_FUZZLATOR, "Fuzzlator"}, + {DIST_TYPE_CLASSIC_FUZZ, "Classic Fuzz"}, + {DIST_TYPE_FUZZY, "Fuzzy"}, + {DIST_TYPE_MP, "Big Pi"}, +}; + +static XmlLabel xml_amp_channel_labels[] = { + {AMP_CHANNEL_A, "A"}, + {AMP_CHANNEL_B, "B"}, + {AMP_CHANNEL_WARP, "Warped"}, +}; + +static XmlLabel xml_amp_labels[] = { + {AMP_TYPE_TWEED_CHAMP, "'57 Tweed Champ\xc2\xae"}, + {AMP_TYPE_TWEED_DELUXE, "Tweed Deluxe"}, + {AMP_TYPE_TWEED_BASSMAN, "Tweed Bassman"}, + {AMP_TYPE_BROWN_BASSMAN, "Brown Bassman"}, + {AMP_TYPE_BLACKFACE_TWIN, "'65 Blackface Twin"}, + {AMP_TYPE_BLACKFACE_DELUXE, "'65Blackface Deluxe\xc2\xae"}, + {AMP_TYPE_PLEXI_JTM_45, "Plexi JTM-45"}, + {AMP_TYPE_SUPER_LEAD_PLEXI, "'68 Plexi Lead 100"}, + {AMP_TYPE_68_MARSHALL_JUMP, "'68 Marshall Jump"}, + {AMP_TYPE_MASTER_VOLUME, "Master Volume"}, + {AMP_TYPE_JCM800, "JCM800"}, + {AMP_TYPE_JCM900, "JCM900"}, + {AMP_TYPE_JCM2000, "JCM2000"}, + {AMP_TYPE_AC15, "AC-15"}, + {AMP_TYPE_AC30TB, "AC-30 TB"}, + {AMP_TYPE_HIWATT_100, "Hiwatt 100"}, + {AMP_TYPE_BOOGIE_MARK_II, "Boogie Mark IIC"}, + {AMP_TYPE_BOOGIE_MARK_IV, "Boogie Mark IV"}, + {AMP_TYPE_DUAL_RECTIFIER, "Dual Rectifier"}, + {AMP_TYPE_TRIPLE_RECTIFIER, "Triple Rectifier"}, + {AMP_TYPE_22_CALIBR, ".22 Caliber"}, + {AMP_TYPE_LEGACY_VL100, "Legacy VL-100"}, + {AMP_TYPE_MATCHLESS_HC30, "Matchless HC30"}, + {AMP_TYPE_CHIEF, "Matchless Chieftan"}, + {AMP_TYPE_SOLDANO_100, "Soldano 100"}, + {AMP_TYPE_SUPERGROUP, "Supergroup"}, + {AMP_TYPE_GA40, "GA-40"}, + {AMP_TYPE_OR120, "OR-120"}, + {AMP_TYPE_PV5150II, "PV 5150II"}, + {AMP_TYPE_RG100, "RG100"}, + {AMP_TYPE_JC120_JAZZ, "JC-120 Jazz"}, + {AMP_TYPE_SOLAR100, "Solar 100"}, + {AMP_TYPE_SOLO, "Solo"}, + {AMP_TYPE_METAL, "Metal"}, + {AMP_TYPE_BRIGHT, "Bright Clean"}, + {AMP_TYPE_CHUNK, "Chunk"}, + {AMP_TYPE_DIGITECH_CLEAN, "DigiTech\xc2\xae Clean"}, + {AMP_TYPE_HIGH_GAIN, "High Gain"}, + {AMP_TYPE_BLUES, "Blues"}, + {AMP_TYPE_FUZZ, "Fuzz"}, + {AMP_TYPE_SPANK, "Spank"}, + {AMP_TYPE_GSP2101_CLEAN_TUBE, "GSP2101 Clean Tube"}, + {AMP_TYPE_GSP2101_SAT_TUBE, "GSP2101 Sat Tube"}, + {AMP_TYPE_CRUNCH, "Crunch"}, + {AMP_TYPE_MONSTER, "Monster"}, + {AMP_TYPE_TWEEDFACE, "Tweedface"}, + {AMP_TYPE_BLACKBASS, "Blackbass"}, + {AMP_TYPE_STONER_ROCK, "Stoner Rock"}, + {AMP_TYPE_DARK_METAL, "Dark Metal"}, + {AMP_TYPE_TRANSISTOR, "Transistor"}, + {AMP_TYPE_BROWN_SOUND, "Brown Sound"}, + {AMP_TYPE_MOSH, "Mosh"}, + {AMP_TYPE_ACOUSTIC, "Dread Acoustic"}, + {AMP_TYPE_JUMBO_ACOUSTIC, "Jumbo Acoustic"}, + {AMP_TYPE_DIRECT, "Direct"}, +}; + +static XmlLabel xml_amp_cab_labels[] = { + {AMP_CAB_DIRECT, "Direct"}, + {AMP_CAB_CHAMP, "Champ\xc2\xae 1x8"}, + {AMP_CAB_DELUXE, "Deluxe\xc2\xae 1x12"}, + {AMP_CAB_DELUXE_REVERB, "Deluxe Reverb 1x12"}, + {AMP_CAB_BRITISH1_12, "British 1x12"}, + {AMP_CAB_GA1_12, "GA 1x12"}, + {AMP_CAB_BLONDE2_12, "Blonde 2x12"}, + {AMP_CAB_TWIN, "Twin 2x12"}, + {AMP_CAB_BRITISH2_12, "British 2x12"}, + {AMP_CAB_JAZZ2_12, "Jazz 2x12"}, + {AMP_CAB_JBL_215, "JBL/Lansing Enclosure"}, + {AMP_CAB_BASSMAN, "Bassman 4x10"}, + {AMP_CAB_BRITISH4_12, "British 4x12"}, + {AMP_CAB_BRITISH_GREEN, "British Green 4x12"}, + {AMP_CAB_FANE4_12, "Fane 4x12"}, + {AMP_CAB_BOUTIQUE4_12, "Boutique 4x12"}, + {AMP_CAB_VINTAGE, "Vintage 4x12"}, + {AMP_CAB_RECTO4_12, "Recto 4x12"}, + {AMP_CAB_DIGI_SOLO, "DigiTech\xc2\xae Solo 4x12"}, + {AMP_CAB_DIGI_BRIGHT, "DigiTech\xc2\xae Bright 2x12"}, + {AMP_CAB_DIGI_METAL, "DigiTech\xc2\xae Metal 4x12"}, + {AMP_CAB_DIGI_ROCK, "DigiTech\xc2\xae Rock 4x12"}, + {AMP_CAB_DIGI_ALT, "DigiTech\xc2\xae Alt 4x12"}, + {AMP_CAB_DIGI_VNTG, "DigiTech\xc2\xae Vintage 4x12"}, + {AMP_CAB_DIGI_CHUNK, "DigiTech\xc2\xae Chunk 4x12"}, + {AMP_CAB_DIGI_SPANK2_12, "DigiTech\xc2\xae Spank 2x12"}, + {AMP_CAB_DIGI_SPKR_COMP, "DigiTech\xc2\xae Spkr Comp"}, + + {GNX_AMP_CAB_DIRECT, "Direct"}, + {GNX_AMP_CAB_TWEED1_8, "Tweed 1x8"}, + {GNX_AMP_CAB_TWEED1_12, "Tweed 1x12"}, + {GNX_AMP_CAB_BLACKFACE1_12, "Blackface 1x12"}, + {GNX_AMP_CAB_BRITISH1_12, "British 1x12"}, + {GNX_AMP_CAB_BLACKFACE2_12, "Blackface 2x12"}, + {GNX_AMP_CAB_BLONDE2_12, "Blonde 2x12"}, + {GNX_AMP_CAB_BRITISH2_12, "British 2x12"}, + {GNX_AMP_CAB_TWEED4_10, "Tweed 4x10"}, + {GNX_AMP_CAB_BRITISH_70_4_12, "British 70 4x12"}, + {GNX_AMP_CAB_BRITISH_GREEN4_12, "British Green 4x12"}, + {GNX_AMP_CAB_STRAIGHT_V30_4_12, "Straight V30 4x12"}, + {GNX_AMP_CAB_SLANT_V30_4_12, "Slant V30 4x12"}, + {GNX_AMP_CAB_FANE4_12, "Fane 4x12"}, + {GNX_AMP_CAB_2101_SPKR_COMP, "2101 Spkr Comp"}, + {GNX_AMP_CAB_DIGI_SPANK, "Digitech Spank 4x12"}, + {GNX_AMP_CAB_DIGI_SOLO, "Digitech Solo 4x12"}, + {GNX_AMP_CAB_DIGI_METAL, "Digitech Metal 4x12"}, + {GNX_AMP_CAB_DIGI_BRIGHT, "Digitech Bright 4x12"}, + {GNX_AMP_CAB_DIGI_CHUNK, "Digitech Chunk 4x12"}, + {GNX_AMP_CAB_JUMBO_ACOUSTIC, "Jumbo Acoustic"}, + {GNX_AMP_CAB_DREAD_ACOUSTIC, "Dread Acoustic"}, + {GNX_AMP_CAB_HART_BASS1_15, "Hart Bass 1x15"}, + {GNX_AMP_CAB_BASIC_BASS1_15, "Basic Bass 1x15"}, + {GNX_AMP_CAB_PORTA_BASS1_15, "Porta Bass 1x15"}, + {GNX_AMP_CAB_REFLEX1_18, "Reflex 1x18"}, + {GNX_AMP_CAB_SOLAR_BASS2_15, "Solar Bass 2x15"}, + {GNX_AMP_CAB_DE_BASS4_10, "DE Bass 4x10"}, + {GNX_AMP_CAB_ASH_BASS4_10, "Ash Bass 4x10"}, + {GNX_AMP_CAB_GOLIATH_BASS4_10, "Goliath Bass 4x10"}, + {GNX_AMP_CAB_HART_BASS4_10, "Hart Bass 4x10"}, + {GNX_AMP_CAB_SVT_BASS8_10, "SVT Bass 8x10"}, +}; + +static XmlLabel xml_noisegate_labels[] = { + {NOISEGATE_GATE, "Gate"}, + {NOISEGATE_SWELL, "Swell"}, +}; + +static XmlLabel xml_chorus_pre_post_labels[] = { + {CHORUSFX_PRE, "Pre"}, + {CHORUSFX_POST, "Post"}, +}; + +static XmlLabel xml_chorusfx_labels[] = { + {CHORUS_TYPE_CE, "CE Chorus"}, + {CHORUS_TYPE_TC, "TC Chorus"}, + {CHORUS_TYPE_DUAL, "Dual Chorus"}, + {CHORUS_TYPE_GLISTEN, "Glisten Chorus"}, + {CHORUS_TYPE_MULTI, "Multi Chorus"}, + {CHORUS_TYPE_VOO_DOO, "Analog Chorus"}, + {CHORUS_TYPE_CLONE, "Small Clone"}, + {CHORUS_TYPE_FLANGER, "Flanger"}, + {CHORUS_TYPE_TRIGGERED_FLANGER, "Triggered Flanger"}, + {CHORUS_TYPE_FLTFLANGER, "Filter Flanger"}, + {CHORUS_TYPE_MXR_FLANGER, "MXR FLANGER"}, + {CHORUS_TYPE_EH_FLANGER, "EH Flanger"}, + {CHORUS_TYPE_AD_FLANGER, "AD Flanger"}, + {CHORUS_TYPE_PHASER, "Phaser"}, + {CHORUS_TYPE_TRIGGERED_PHASER, "Triggered Phaser"}, + {CHORUS_TYPE_MX_PHASER, "MX Phaser"}, + {CHORUS_TYPE_EH_PHASER, "EH Phaser"}, + {CHORUS_TYPE_VIBRATO, "Vibrato"}, + {CHORUS_TYPE_ROTARY, "Rotary"}, + {CHORUS_TYPE_VIBROPAN, "Vibropan"}, + {CHORUS_TYPE_UNOVIBE, "Unovibe"}, + {CHORUS_TYPE_TREMOLO, "Tremolo"}, + {CHORUS_TYPE_SCATTER_TREM, "ScatterTrem"}, + {CHORUS_TYPE_OPTO_TREMOLO, "Opto Tremolo"}, + {CHORUS_TYPE_BIAS_TREMOLO, "Bias Tremolo"}, + {CHORUS_TYPE_PANNER, "Panner"}, + {CHORUS_TYPE_ENVELOPE, "Envelope"}, + {CHORUS_TYPE_FX25, "FX25"}, + {CHORUS_TYPE_AUTOYA, "AutoYa"}, + {CHORUS_TYPE_YAYA, "YaYa"}, + {CHORUS_TYPE_SYNTH_TALK, "Synth Talk"}, + {CHORUS_TYPE_STEP_FILTER, "Step Filter"}, + {CHORUS_TYPE_SAMPLE_HOLD, "Sample/Hold"}, + {CHORUS_TYPE_WHAMMY, "Whammy"}, + {CHORUS_TYPE_PITCH_SHIFT, "Pitch"}, + {CHORUS_TYPE_DETUNE, "Detune"}, + {CHORUS_TYPE_IPS, "Harmony Pitch"}, + {CHORUS_TYPE_OCTAVER, "Octaver"}, +}; + +static XmlLabel xml_waveform_labels[] = { + {CHORUS_WAVEFORM_TRI, "Tri"}, + {CHORUS_WAVEFORM_SINE, "Sine"}, + {CHORUS_WAVEFORM_SQUARE, "Square"}, +}; + +static XmlLabel xml_whammy_amount_labels[] = { + {WHAMMY_TYPE_OCT_UP, "OctUp"}, + {WHAMMY_TYPE_2OCT_UP, "2OctUp"}, + {WHAMMY_TYPE_2ND_DN, "2ndDn"}, + {WHAMMY_TYPE_RV2ND_DN, "Rv2nc"}, + {WHAMMY_TYPE_4TH_DN, "4thDn"}, + {WHAMMY_TYPE_OCT_DN, "OctDn"}, + {WHAMMY_TYPE_2OCT_DN, "2OctDn"}, + {WHAMMY_TYPE_DIV_BMB, "DivBmb"}, + {WHAMMY_TYPE_M3_GT_MA3, "M3>Ma3"}, + {WHAMMY_TYPE_2ND_MA3, "2ndMa3"}, + {WHAMMY_TYPE_3RD_4TH, "3rd4th"}, + {WHAMMY_TYPE_4TH_5TH, "5thOct"}, + {WHAMMY_TYPE_5TH_OCT, "5thOct"}, + {WHAMMY_TYPE_HOCT_UP, "HOctUp"}, + {WHAMMY_TYPE_HOCT_DN, "HOctDn"}, + {WHAMMY_TYPE_OCT_GT_D, "OctU>D"}, +}; + +static XmlLabel xml_ips_shift_labels[] = { + {IPS_SHIFT_OCT_DN, "Oct Dn"}, + {IPS_SHIFT_7TH_DN, "7th Dn"}, + {IPS_SHIFT_6TH_DN, "6th Dn"}, + {IPS_SHIFT_5TH_DN, "5th Dn"}, + {IPS_SHIFT_4TH_DN, "4th Dn"}, + {IPS_SHIFT_3RD_DN, "3rd Dn"}, + {IPS_SHIFT_2ND_DN, "2nd Dn"}, + {IPS_SHIFT_2ND_UP, "2nd Up"}, + {IPS_SHIFT_3RD_UP, "3rd Up"}, + {IPS_SHIFT_4TH_UP, "4th Up"}, + {IPS_SHIFT_5TH_UP, "5th Up"}, + {IPS_SHIFT_6TH_UP, "6th Up"}, + {IPS_SHIFT_7TH_UP, "7th Up"}, + {IPS_SHIFT_OCT_UP, "Oct Up"}, +}; + +static XmlLabel xml_ips_key_labels[] = { + {IPS_KEY_E, "E"}, + {IPS_KEY_F, "F"}, + {IPS_KEY_Gb, "Gb"}, + {IPS_KEY_G, "G"}, + {IPS_KEY_Ab, "Ab"}, + {IPS_KEY_A, "A"}, + {IPS_KEY_Bb, "Bb"}, + {IPS_KEY_B, "B"}, + {IPS_KEY_C, "C"}, + {IPS_KEY_Db, "Db"}, + {IPS_KEY_D, "D"}, + {IPS_KEY_Eb, "Eb"}, +}; + +static XmlLabel xml_ips_scale_labels[] = { + {IPS_SCALE_MAJOR, "Major"}, + {IPS_SCALE_MINOR, "Minor"}, + {IPS_SCALE_DORIAN, "Dorian"}, + {IPS_SCALE_MIXOLYDIAN, "Mixolydian"}, + {IPS_SCALE_LYDIAN, "Lydian"}, + {IPS_SCALE_HMINOR, "HMinor"}, +}; + +static XmlLabel xml_delay_labels[] = { + + {DELAY_TYPE_ANALOG, "Analog"}, + {DELAY_TYPE_DM, "DM Delay"}, + {DELAY_TYPE_DIGITAL, "Digital"}, + {DELAY_TYPE_MODULATED, "Modulated"}, + {DELAY_TYPE_PONG, "Pong"}, + {DELAY_TYPE_TAPE, "Tape"}, + {DELAY_TYPE_ECHOPLEX, "Echo Plex"}, + + {DELAY_RP500_TYPE_DIGITAL, "Digital"}, + {DELAY_RP500_TYPE_ANALOG, "Analog"}, + {DELAY_RP500_TYPE_DM, "DM Delay"}, + {DELAY_RP500_TYPE_ECHOPLEX, "Echo Plex"}, + {DELAY_RP500_TYPE_MODULATED, "Modulated"}, + {DELAY_RP500_TYPE_PONG, "Pong"}, + {DELAY_RP500_TYPE_REVERSE, "Reverse"}, + {DELAY_RP500_TYPE_TAPE, "Tape"}, + {DELAY_RP1000_TYPE_LO_FI, "Lo Fidelity"}, + {DELAY_RP1000_TYPE_2_TAP, "2-tap"}, + + {DELAY_GNX3K_TYPE_MONO, "Mono"}, + {DELAY_GNX3K_TYPE_PINGPONG, "Ping-Pong"}, + {DELAY_GNX3K_TYPE_ANALOG, "Analog"}, + {DELAY_GNX3K_TYPE_ANAPONG, "Analog-Pong"}, + {DELAY_GNX3K_TYPE_SPREAD, "Spread"}, +}; + +static XmlLabel xml_reverb_labels[] = { + {REVERB_TYPE_TWIN, "Twin"}, + {REVERB_TYPE_LEX_AMBIENCE, "Lexicon Ambience"}, + {REVERB_TYPE_LEX_STUDIO, "Lexicon Studio"}, + {REVERB_TYPE_LEX_ROOM, "Lexicon Room"}, + {REVERB_TYPE_LEX_HALL, "Lexicon Hall"}, + {REVERB_TYPE_EMT240_PLATE, "EMT240 Plate"}, + + {GNX3K_REVERB_TYPE_STUDIO, "Studio"}, + {GNX3K_REVERB_TYPE_ROOM, "Room"}, + {GNX3K_REVERB_TYPE_CLUB, "Club"}, + {GNX3K_REVERB_TYPE_PLATE, "Plate"}, + {GNX3K_REVERB_TYPE_HALL, "Hall"}, + {GNX3K_REVERB_TYPE_AMPHITHEATER, "Amphitheater"}, + {GNX3K_REVERB_TYPE_CHURCH, "Church"}, + {GNX3K_REVERB_TYPE_GARAGE, "Garage"}, + {GNX3K_REVERB_TYPE_ARENA, "Arena"}, + {GNX3K_REVERB_TYPE_SPRING, "Spring"}, +}; + +static XmlLabel xml_wah_labels[] = { + {WAH_TYPE_CRY, "Cry Wah"}, + {WAH_TYPE_FULLRANGE, "Fullrange Wah"}, + {WAH_TYPE_CLYDE, "Clyde Wah"}, + + {GNX3K_WAH_TYPE_CRY, "Cry"}, + {GNX3K_WAH_TYPE_BOUTIQUE, "Boutique"}, + {GNX3K_WAH_TYPE_FULLRANGE, "Full-Range"}, +}; + +static XmlLabel xml_exp_assign_labels[] = { + {EXP_VOLUME_PRE_FX, "Volume Pre FX"}, + {EXP_VOLUME_POST_FX, "Volume Post FX"}, +}; + +static XmlLabel xml_vswitch_toggle_labels[] = { + {VSWITCH_TYPE_TOGGLE, "Toggle"}, +}; + +static XmlLabel xml_vswitch_pedal_assign_labels[] = { + {VSWITCH_PEDAL_ASSIGN_WAH, "Wah Position"}, +}; + +static XmlLabel xml_vswitch_assign_labels[] = { + {VSWITCH_ASSIGN_WAH_ENABLE, "Wah Enable"}, +}; + +static XmlLabel xml_lfo_assign_labels[] = { + {LFO_ASSIGN_NONE, "None"}, +}; + +static XmlLabel xml_eq_labels[] = { + {EQ_TYPE_BRIGHT, "Bright"}, + {EQ_TYPE_MIDBOOST, "Mid Boost"}, + {EQ_TYPE_SCOOP, "Scoop"}, + {EQ_TYPE_WARM, "Warm"}, +}; + +static XmlLabel xml_tone_lib_labels[] = { + {TONE_LIB_OVERDRIVE, "Overdrive"}, + {TONE_LIB_ROCK1, "Rock 1"}, + {TONE_LIB_ROCK2, "Rock 2"}, + {TONE_LIB_BLUES1, "Blues 1"}, + {TONE_LIB_BLUES2, "Blues 2"}, + {TONE_LIB_METAL1, "Metal 1"}, + {TONE_LIB_METAL2, "Metal 2"}, + {TONE_LIB_COUNTRY1, "Country 1"}, + {TONE_LIB_COUNTRY2, "Country 2"}, + {TONE_LIB_WARM_DRIVE, "Warm Drive"}, + {TONE_LIB_CRUNCH, "Crunch"}, + {TONE_LIB_TEXAS_TONE, "Texas Tone"}, + {TONE_LIB_ROCKABILLY, "Rockabilly"}, + {TONE_LIB_SOLO1, "Solo 1"}, + {TONE_LIB_SOLO2, "Solo 2"}, + {TONE_LIB_ROCKWAH, "Rock Wah"}, + {TONE_LIB_CHUNKY, "Chunky"}, + {TONE_LIB_SMOOTH, "Smooth"}, + {TONE_LIB_HEAVY, "Heavy"}, + {TONE_LIB_CLEAN1, "Clean 1"}, + {TONE_LIB_CLEAN2, "Clean 2"}, + {TONE_LIB_BRITISH1, "British 1"}, + {TONE_LIB_BRITISH2, "British 2"}, + {TONE_LIB_AMERICAN1, "American 1"}, + {TONE_LIB_AMERICAN2, "American 2"}, + {TONE_LIB_TUBE_DRIVE, "Tube Drive"}, + {TONE_LIB_DISTORTION, "Distortion"}, + {TONE_LIB_SCOOPED, "Scooped"}, + {TONE_LIB_PUNCHY, "Punchy"}, + {TONE_LIB_BRIGHT_CLEAN, "Bright Clean"}, + {TONE_LIB_CUSTOM, "Custom"}, +}; + +static XmlLabel xml_fx_lib_labels[] = { + {EFFECTS_LIB_CUSTOM, "Custom"}, + {EFFECTS_LIB_CHORUS, "Chorus"}, + {EFFECTS_LIB_PHASER, "Phaser"}, + {EFFECTS_LIB_FLANGER, "Flanger"}, + {EFFECTS_LIB_PITCH, "Pitch"}, + {EFFECTS_LIB_TREMOLO, "Tremolo"}, + {EFFECTS_LIB_ROTARY, "Rotary"}, + {EFFECTS_LIB_ENVELOPE, "Envelope Filter"}, + {EFFECTS_LIB_DIGITAL, "Digital Delay"}, + {EFFECTS_LIB_ANALOG, "Analog Delay"}, + {EFFECTS_LIB_PONG, "Pong Delay"}, + {EFFECTS_LIB_MOD, "Mod Delay"}, + {EFFECTS_LIB_TAPE, "Tape Delay"}, + {EFFECTS_LIB_HALL, "Hall Reverb"}, + {EFFECTS_LIB_PLATE, "Plate Reverb"}, + {EFFECTS_LIB_SPRING, "Spring Reverb"}, + {EFFECTS_LIB_CHORUS_DIGITAL, "Chorus + Digital Delay"}, + {EFFECTS_LIB_CHORUS_DELAY_REVERB, "Chorus + Delay + Reverb"}, + {EFFECTS_LIB_FLANGER_ANALOG, "Flanger + Analog Delay"}, + {EFFECTS_LIB_PHASER_TAPE, "Phaser + Tape Delay"}, + {EFFECTS_LIB_PHASER_MOD, "Phaser + Mod Delay"}, + {EFFECTS_LIB_PHASER_ROOM, "Phaser + Room Reverb"}, + {EFFECTS_LIB_DIGITAL_HALL, "Digital Delay + Hall Reverb"}, + {EFFECTS_LIB_ANALOG_SPRING, "Analog Delay + Spring Reverb"}, + {EFFECTS_LIB_CHORUS_HALL, "Chorus + Hall Reverb"}, + {EFFECTS_LIB_PONG_HALL, "Pong Delay + Hall Reverb"}, + {EFFECTS_LIB_TAPE_SPRING, "Tape Delay + Spring Reverb"}, + {EFFECTS_LIB_TREMOLO_TAPE, "Tremolo + Tape Delay"}, + {EFFECTS_LIB_PITCH_DIGITAL, "Pitch + Digital Delay"}, + {EFFECTS_LIB_MOD_PLATE, "Mod Delay + Plate Reverb"}, + {EFFECTS_LIB_ROTARY_TAPE, "Rotary + Tape Delay"}, +}; + +/* Array to map id/position pairs to labels and settings. */ +XmlSettings xml_settings[] = { + {0, 0, "None", NULL,}, + + {PICKUP_ON_OFF, PICKUP_POSITION, "Pickup Enable", &values_on_off, xml_on_off_labels, G_N_ELEMENTS(xml_on_off_labels)}, + {PICKUP_TYPE, PICKUP_POSITION, "EQ Type", &values_pickup_type, xml_pickup_labels, G_N_ELEMENTS(xml_pickup_labels)}, + + {COMP_ON_OFF, COMP_POSITION, "Compressor Enable", &values_on_off, xml_on_off_labels, G_N_ELEMENTS(xml_on_off_labels)}, + {COMP_TYPE, COMP_POSITION, "Comp Type", &values_comp_type, xml_comp_labels, G_N_ELEMENTS(xml_comp_labels)}, + {COMP_SUSTAIN, COMP_POSITION, "Compressor Sustain", &values_0_to_99,}, + {COMP_TONE, COMP_POSITION, "Compressor Tone", &values_0_to_99,}, + {COMP_LEVEL, COMP_POSITION, "Compressor Level", &values_0_to_99,}, + {COMP_ATTACK, COMP_POSITION, "Compressor Attack", &values_0_to_99,}, + {COMP_OUTPUT, COMP_POSITION, "Compressor Output", &values_0_to_99,}, + {COMP_SENSITIVITY, COMP_POSITION, "Compressor Sensitivity", &values_0_to_99,}, + + {DIST_TYPE, DIST_POSITION, "Dist Type", &values_dist_type, xml_dist_labels, G_N_ELEMENTS(xml_dist_labels)}, + {DIST_ON_OFF, DIST_POSITION, "Dist Enable", &values_on_off, xml_on_off_labels, G_N_ELEMENTS(xml_on_off_labels)}, + {DIST_SCREAMER_DRIVE, DIST_POSITION, "Dist Drive", &values_0_to_99,}, + {DIST_SCREAMER_TONE, DIST_POSITION, "Dist Tone", &values_0_to_99,}, + {DIST_SCREAMER_LVL, DIST_POSITION, "Dist Level", &values_0_to_99,}, + {DIST_808_OVERDRIVE, DIST_POSITION, "Dist Overdrive", &values_0_to_99,}, + {DIST_808_TONE, DIST_POSITION, "Dist Tone", &values_0_to_99,}, + {DIST_808_LVL, DIST_POSITION, "Dist Level", &values_0_to_99,}, + {DIST_GUYOD_DRIVE, DIST_POSITION, "Dist Drive", &values_0_to_99,}, + {DIST_GUYOD_LVL, DIST_POSITION, "Dist Level", &values_0_to_99,}, + {DIST_DOD250_GAIN, DIST_POSITION, "Dist Gain", &values_0_to_99,}, + {DIST_DOD250_LVL, DIST_POSITION, "Dist Level", &values_0_to_99,}, + {DIST_RODENT_DIST, DIST_POSITION, "Dist Distortion", &values_0_to_99,}, + {DIST_RODENT_FILTER, DIST_POSITION, "Dist Filter", &values_0_to_99,}, + {DIST_RODENT_LVL, DIST_POSITION, "Dist Volume", &values_0_to_99,}, + {DIST_MX_DIST, DIST_POSITION, "Dist Distortion", &values_0_to_99,}, + {DIST_MX_OUTPUT, DIST_POSITION, "Dist Output", &values_0_to_99,}, + {DIST_DS_GAIN, DIST_POSITION, "Dist Distortion", &values_0_to_99,}, + {DIST_DS_TONE, DIST_POSITION, "Dist Tone", &values_0_to_99,}, + {DIST_DS_LVL, DIST_POSITION, "Dist Level", &values_0_to_99,}, + {DIST_GRUNGE_GRUNGE, DIST_POSITION, "Dist Gain", &values_0_to_99,}, + {DIST_GRUNGE_FACE, DIST_POSITION, "Dist Face", &values_0_to_99,}, + {DIST_GRUNGE_LOUD, DIST_POSITION, "Dist Loud", &values_0_to_99,}, + {DIST_GRUNGE_BUTT, DIST_POSITION, "Dist Butt", &values_0_to_99,}, + {DIST_ZONE_GAIN, DIST_POSITION, "Dist Gain", &values_0_to_99,}, + {DIST_ZONE_MID_LVL, DIST_POSITION, "Dist Mid Level", &values_0_to_99,}, + {DIST_ZONE_LEVEL, DIST_POSITION, "Dist Level", &values_0_to_99,}, + {DIST_ZONE_LOW, DIST_POSITION, "Dist Low", &values_0_to_99,}, + {DIST_ZONE_MID_FREQ, DIST_POSITION, "Dist Mid Freq", &values_0_to_99,}, + {DIST_ZONE_HIGH, DIST_POSITION, "Dist High", &values_0_to_99,}, + {DIST_DEATH_LOW, DIST_POSITION, "Dist Low", &values_0_to_99,}, + {DIST_DEATH_MID, DIST_POSITION, "Dist Mid", &values_0_to_99,}, + {DIST_DEATH_LVL, DIST_POSITION, "Dist Level", &values_0_to_99,}, + {DIST_DEATH_HIGH, DIST_POSITION, "Dist High", &values_0_to_99,}, + {DIST_GONK_GONK, DIST_POSITION, "Dist Gunk", &values_0_to_99,}, + {DIST_GONK_SMEAR, DIST_POSITION, "Dist Smear", &values_0_to_99,}, + {DIST_GONK_SUCK, DIST_POSITION, "Dist Suck", &values_0_to_99,}, + {DIST_GONK_HEAVE, DIST_POSITION, "Dist Heave", &values_0_to_99,}, + {DIST_FUZZY_FUZZ, DIST_POSITION, "Dist Fuzz", &values_0_to_99,}, + {DIST_FUZZY_VOLUME, DIST_POSITION, "Dist Volume", &values_0_to_99,}, + {DIST_MP_SUSTAIN, DIST_POSITION, "Dist Sustain", &values_0_to_99,}, + {DIST_MP_TONE, DIST_POSITION, "Dist Tone", &values_0_to_99,}, + {DIST_MP_VOLUME, DIST_POSITION, "Dist Volume", &values_0_to_99,}, + + {AMP_CHANNEL, AMP_CHANNEL_POSITION, "Amp Channel", &values_a_b, xml_amp_channel_labels, G_N_ELEMENTS(xml_amp_channel_labels)}, + + {AMP_TYPE, AMP_POSITION, "Amp A Type", &values_amp_type, xml_amp_labels, G_N_ELEMENTS(xml_amp_labels)}, + {AMP_ON_OFF, AMP_POSITION, "Amp A Enable", &values_on_off, xml_on_off_labels, G_N_ELEMENTS(xml_on_off_labels)}, + {AMP_GAIN, AMP_POSITION, "Amp A Gain", &values_0_to_99,}, + {AMP_LEVEL, AMP_POSITION, "Amp A Level", &values_0_to_99,}, + + {AMP_TYPE, AMP_B_POSITION, "Amp B Type", &values_amp_type, xml_amp_labels, G_N_ELEMENTS(xml_amp_labels)}, + {AMP_ON_OFF, AMP_B_POSITION, "Amp B Enable", &values_on_off, xml_on_off_labels, G_N_ELEMENTS(xml_on_off_labels)}, + {AMP_GAIN, AMP_B_POSITION, "Amp B Gain", &values_0_to_99,}, + {AMP_LEVEL, AMP_B_POSITION, "Amp B Level", &values_0_to_99,}, + + {AMP_CAB_TYPE, AMP_CAB_POSITION, "Cab A Type", &values_cab_type, xml_amp_cab_labels, G_N_ELEMENTS(xml_amp_cab_labels)}, + {AMP_CAB_TYPE, AMP_CAB_B_POSITION, "Cab B Type", &values_cab_type, xml_amp_cab_labels, G_N_ELEMENTS(xml_amp_cab_labels)}, + + {NOISEGATE_TYPE, NOISEGATE_POSITION, "Gate Type", &values_gate_type, xml_noisegate_labels, G_N_ELEMENTS(xml_noisegate_labels)}, + {NOISEGATE_ON_OFF, NOISEGATE_POSITION, "Gate Enable", &values_on_off, xml_on_off_labels, G_N_ELEMENTS(xml_on_off_labels)}, + {NOISEGATE_SWELL_SENS, NOISEGATE_POSITION, "Gate Pluck Sens", &values_0_to_99,}, + {NOISEGATE_GATE_TRESHOLD, NOISEGATE_POSITION, "Gate Threshold", &values_0_to_99,}, + {NOISEGATE_ATTACK, NOISEGATE_POSITION, "Gate Attack", &values_0_to_99,}, + {NOISEGATE_RELEASE, NOISEGATE_POSITION, "Gate Release", &values_0_to_99,}, + {NOISEGATE_ATTN, NOISEGATE_POSITION, "Gate Attenuation", &values_0_to_99,}, + + + {MOD_PRE_POST, CHORUSFX_POSITION, "Mod Pre/Post", &values_pre_post, xml_chorus_pre_post_labels, G_N_ELEMENTS(xml_chorus_pre_post_labels)}, + + {CHORUSFX_ON_OFF, CHORUSFX_POSITION, "Chorus/FX Enable", &values_on_off, xml_on_off_labels, G_N_ELEMENTS(xml_on_off_labels)}, + {CHORUSFX_PRE_POST, CHORUSFX_POSITION, "Mod Pre/Post", &values_pre_post, xml_chorus_pre_post_labels, G_N_ELEMENTS(xml_chorus_pre_post_labels)}, + {CHORUSFX_TYPE, CHORUSFX_POSITION, "Mod Type", &values_mod_type, xml_chorusfx_labels, G_N_ELEMENTS(xml_chorusfx_labels)}, + {PHASER_SPEED, CHORUSFX_POSITION, "Phaser Speed", &values_0_to_99,}, + {PHASER_DEPTH, CHORUSFX_POSITION, "Phaser Depth", &values_0_to_99,}, + {PHASER_REGEN, CHORUSFX_POSITION, "Phaser Regen", &values_0_to_99,}, + {PHASER_WAVE, CHORUSFX_POSITION, "Phaser Waveform", &values_waveform, xml_waveform_labels, G_N_ELEMENTS(xml_waveform_labels)}, + {PHASER_LEVEL, CHORUSFX_POSITION, "Phaser Level", &values_0_to_99,}, + {CHORUS_SPEED, CHORUSFX_POSITION, "Chorus Speed", &values_0_to_99,}, + {CHORUS_DEPTH, CHORUSFX_POSITION, "Chorus Depth", &values_0_to_99,}, + {CHORUS_LEVEL, CHORUSFX_POSITION, "Chorus Level", &values_0_to_99,}, + {CHORUS_WAVE, CHORUSFX_POSITION, "Chorus Waveform", &values_waveform, xml_waveform_labels, G_N_ELEMENTS(xml_waveform_labels)}, + {FLANGER_SPEED, CHORUSFX_POSITION, "Flanger Speed", &values_0_to_99,}, + {FLANGER_DEPTH, CHORUSFX_POSITION, "Flanger Depth", &values_0_to_99,}, + {FLANGER_REGEN, CHORUSFX_POSITION, "Flanger Regen", &values_0_to_99,}, + {FLANGER_WAVE, CHORUSFX_POSITION, "Flanger Waveform", &values_waveform, xml_waveform_labels, G_N_ELEMENTS(xml_waveform_labels)}, + {FLANGER_LEVEL, CHORUSFX_POSITION, "Flanger Level", &values_0_to_99,}, + {MXR_FLANGER_WIDTH, CHORUSFX_POSITION, "Flanger Width", &values_0_to_99,}, + {MXR_FLANGER_MANUAL, CHORUSFX_POSITION, "Flanger Manual", &values_0_to_99,}, + {VIBRATO_SPEED, CHORUSFX_POSITION, "Vibrato Speed", &values_0_to_99,}, + {VIBRATO_DEPTH, CHORUSFX_POSITION, "Vibrato Depth", &values_0_to_99,}, + {ROTARY_SPEED, CHORUSFX_POSITION, "Rotary Speed", &values_0_to_99,}, + {ROTARY_INTENSITY, CHORUSFX_POSITION, "Rotary Intensity", &values_0_to_99,}, + {ROTARY_DOPPLER, CHORUSFX_POSITION, "Rotary Doppler", &values_0_to_99,}, + {ROTARY_CROSSOVER, CHORUSFX_POSITION, "Rotary Crossover", &values_0_to_99,}, + {VIBROPAN_SPEED, CHORUSFX_POSITION, "VibroPan Speed", &values_0_to_99,}, + {VIBROPAN_DEPTH, CHORUSFX_POSITION, "VibroPan Depth", &values_0_to_99,}, + {VIBROPAN_VIBRA, CHORUSFX_POSITION, "VibroPan VibratoPan", &values_0_to_99,}, + {VIBROPAN_WAVE, CHORUSFX_POSITION, "VibroPan Waveform", &values_waveform, xml_waveform_labels, G_N_ELEMENTS(xml_waveform_labels)}, + {TREMOLO_SPEED, CHORUSFX_POSITION, "Tremolo Speed", &values_0_to_99,}, + {TREMOLO_DEPTH, CHORUSFX_POSITION, "Tremolo Depth", &values_0_to_99,}, + {TREMOLO_WAVE, CHORUSFX_POSITION, "Tremolo Waveform", &values_waveform, xml_waveform_labels, G_N_ELEMENTS(xml_waveform_labels)}, + {PANNER_SPEED, CHORUSFX_POSITION, "Panner Speed", &values_0_to_99,}, + {PANNER_DEPTH, CHORUSFX_POSITION, "Panner Depth", &values_0_to_99,}, + {PANNER_WAVE, CHORUSFX_POSITION, "Panner Waveform", &values_waveform, xml_waveform_labels, G_N_ELEMENTS(xml_waveform_labels)}, + {ENVELOPE_SENSITIVITY, CHORUSFX_POSITION, "Envelope Sens.", &values_0_to_99,}, + {ENVELOPE_RANGE, CHORUSFX_POSITION, "Envelope Range", &values_0_to_99,}, + {AUTOYA_SPEED, CHORUSFX_POSITION, "AutoYa Speed", &values_0_to_99,}, + {AUTOYA_INTENSITY, CHORUSFX_POSITION, "AutoYa Intensity", &values_0_to_99,}, + {AUTOYA_RANGE, CHORUSFX_POSITION, "AutoYa Range", &values_0_to_49,}, + {YAYA_PEDAL, CHORUSFX_POSITION, "YaYa Pedal", &values_0_to_99,}, + {YAYA_INTENSITY, CHORUSFX_POSITION, "YaYa Intensity", &values_0_to_99,}, + {YAYA_RANGE, CHORUSFX_POSITION, "YaYa Range", &values_0_to_49,}, + {STEP_FILTER_SPEED, CHORUSFX_POSITION, "Step Filter Speed", &values_0_to_99,}, + {STEP_FILTER_INTENSITY, CHORUSFX_POSITION, "Step Filter Intensity", &values_0_to_99,}, + {WHAMMY_AMOUNT, CHORUSFX_POSITION, "Whammy Amount", &values_whammy_amount, xml_whammy_amount_labels, G_N_ELEMENTS(xml_whammy_amount_labels)}, + {WHAMMY_PEDAL, CHORUSFX_POSITION, "Whammy Pedal", &values_0_to_99,}, + {WHAMMY_MIX, CHORUSFX_POSITION, "Whammy Mix", &values_0_to_99,}, + + {CHORUSFX_PRE_POST, CHORUSFX_POSITION, "Mod Pre/Post", &values_pre_post, xml_chorus_pre_post_labels, G_N_ELEMENTS(xml_chorus_pre_post_labels)}, + {PITCH_AMOUNT, CHORUSFX_POSITION, "Pitch Shift Amount", &values_m24_to_24,}, + {PITCH_MIX, CHORUSFX_POSITION, "Pitch Shift Mix", &values_0_to_99,}, + {DETUNE_AMOUNT, CHORUSFX_POSITION, "Detune Amount", &values_m24_to_24,}, + {DETUNE_LEVEL, CHORUSFX_POSITION, "Detune Level", &values_0_to_99,}, + {IPS_SHIFT_AMOUNT, CHORUSFX_POSITION, "IPS Amount", &values_ips_shift, xml_ips_shift_labels, G_N_ELEMENTS(xml_ips_shift_labels)}, + {IPS_KEY, CHORUSFX_POSITION, "IPS Key", &values_ips_key, xml_ips_key_labels, G_N_ELEMENTS(xml_ips_key_labels)}, + {IPS_SCALE, CHORUSFX_POSITION, "IPS Scale", &values_ips_scale, xml_ips_scale_labels, G_N_ELEMENTS(xml_ips_scale_labels)}, + {IPS_LEVEL, CHORUSFX_POSITION, "IPS Level", &values_0_to_99,}, + + {DELAY_TYPE, DELAY_POSITION, "Delay Type", &values_delay_type, xml_delay_labels, G_N_ELEMENTS(xml_delay_labels)}, + {DELAY_ON_OFF, DELAY_POSITION, "Delay Enable", &values_on_off, xml_on_off_labels, G_N_ELEMENTS(xml_on_off_labels)}, + {DELAY_TIME, DELAY_POSITION, "Delay Time", &values_delay_time,}, + {DELAY_REPEATS, DELAY_POSITION, "Delay Repeats", &values_delay_repeats,}, + {DELAY_LEVEL, DELAY_POSITION, "Delay Level", &values_0_to_99,}, + {DELAY_DUCK_THRESH, DELAY_POSITION, "Delay Duck Thresh", &values_0_to_99,}, + {DELAY_DUCK_LEVEL, DELAY_POSITION, "Delay Duck Level", &values_0_to_99,}, + {DELAY_DEPTH, DELAY_POSITION, "Delay Mod Depth", &values_0_to_99,}, + {DELAY_TAPE_WOW, DELAY_POSITION, "Delay Tape Wow", &values_0_to_99,}, + {DELAY_TAPE_FLUTTER, DELAY_POSITION, "Delay Tape Flut", &values_0_to_99,}, + + {REVERB_TYPE, REVERB_POSITION, "Reverb Type", &values_reverb_type, xml_reverb_labels, G_N_ELEMENTS(xml_reverb_labels)}, + {REVERB_ON_OFF, REVERB_POSITION, "Reverb Enable", &values_on_off, xml_on_off_labels, G_N_ELEMENTS(xml_on_off_labels)}, + {REVERB_DECAY, REVERB_POSITION, "Reverb Decay", &values_0_to_99,}, + {REVERB_LIVELINESS, REVERB_POSITION, "Reverb Liveliness", &values_0_to_99,}, + {REVERB_LEVEL, REVERB_POSITION, "Reverb Level", &values_0_to_99,}, + {REVERB_PREDELAY, REVERB_POSITION, "Reverb Predelay", &values_0_to_15,}, + + {PRESET_LEVEL, VOLUME_PRE_FX_POSITION, "Volume Pre FX", &values_0_to_99,}, + {PRESET_LEVEL, VOLUME_POST_FX_POSITION, "Volume Post FX", &values_0_to_99,}, + + {WAH_TYPE, WAH_POSITION, "Wah Type", &values_wah_type, xml_wah_labels, G_N_ELEMENTS(xml_wah_labels)}, + {WAH_ON_OFF, WAH_POSITION, "Wah Enable", &values_on_off, xml_on_off_labels, G_N_ELEMENTS(xml_on_off_labels)}, + {WAH_PEDAL_POSITION, WAH_POSITION, "Wah Position", &values_0_to_99,}, + {WAH_VOLUME_BOOST, WAH_POSITION, "Wah Vol. Boost", &values_db_boost,}, + {MOD_TYPE, MOD_POSITION, "Mod Type", &values_0_to_99,}, // ??? + + {PRESET_LEVEL, PRESET_POSITION, "Preset Level", &values_0_to_99,}, + + {EXP_ASSIGN1, EXP_POSITION, "Pedal Assign 1", &values_exp_assign, xml_exp_assign_labels, G_N_ELEMENTS(xml_exp_assign_labels)}, + {EXP_MIN, EXP_POSITION, "Pedal Min 1", &values_0_to_99,}, + {EXP_MAX, EXP_POSITION, "Pedal Max 1", &values_0_to_99,}, + + {EXP_TYPE, WAH_POSITION_MIN_MAX, "V-Switch Pedal Assign", &values_vswitch_pedal_assign, xml_vswitch_pedal_assign_labels, G_N_ELEMENTS(xml_vswitch_assign_labels)}, + {EXP_MIN, WAH_POSITION_MIN_MAX, "Wah Min", &values_0_to_99,}, + {EXP_MAX, WAH_POSITION_MIN_MAX, "Wah Min", &values_0_to_99,}, + + {VSWITCH_ASSIGN, VSWITCH_ASSIGN_POSITION, "V-Switch Assign", &values_vswitch_assign, xml_vswitch_assign_labels, G_N_ELEMENTS(xml_vswitch_assign_labels)}, + {VSWITCH_MIN, VSWITCH_ASSIGN_POSITION, "V-Switch Min", &values_on_off, xml_on_off_labels, G_N_ELEMENTS(xml_on_off_labels)}, + {VSWITCH_MAX, VSWITCH_ASSIGN_POSITION, "V-Switch Max", &values_on_off, xml_on_off_labels, G_N_ELEMENTS(xml_on_off_labels)}, + {VSWITCH_TYPE, VSWITCH_ASSIGN_POSITION, "V-Switch Type", &values_vswitch_type, xml_vswitch_toggle_labels, G_N_ELEMENTS(xml_vswitch_toggle_labels)}, + {VSWITCH_ENABLE, VSWITCH_ASSIGN_POSITION, "V-Switch Enable", &values_on_off, xml_on_off_labels, G_N_ELEMENTS(xml_on_off_labels)}, + + {LFO_TYPE, LFO1_POSITION, "LFO1 Assign", &values_lfo_assign, xml_lfo_assign_labels, G_N_ELEMENTS(xml_lfo_assign_labels)}, + {LFO_MIN, LFO1_POSITION, "LFO1 Min", &values_lfo_none,}, + {LFO_MAX, LFO1_POSITION, "LFO1 Max", &values_lfo_none,}, + {LFO_SPEED, LFO1_POSITION, "LFO1 Speed", &values_lfo_speed,}, + {LFO_WAVEFORM, LFO1_POSITION, "LFO1 Waveform", &values_lfo_waveform, xml_waveform_labels, G_N_ELEMENTS(xml_waveform_labels)}, + + {LFO_TYPE, LFO2_POSITION, "LFO2 Assign", &values_lfo_assign, xml_lfo_assign_labels, G_N_ELEMENTS(xml_lfo_assign_labels)}, + {LFO_MIN, LFO2_POSITION, "LFO2 Min", &values_lfo_none,}, + {LFO_MAX, LFO2_POSITION, "LFO2 Max", &values_lfo_none,}, + {LFO_SPEED, LFO2_POSITION, "LFO2 Speed", &values_lfo_speed,}, + {LFO_WAVEFORM, LFO2_POSITION, "LFO2 Waveform", &values_lfo_waveform, xml_waveform_labels, G_N_ELEMENTS(xml_waveform_labels)}, + + {EQ_ENABLE, EQ_A_POSITION, "EQ A Enable", &values_on_off, xml_on_off_labels, G_N_ELEMENTS(xml_on_off_labels)}, + {EQ_TYPE, EQ_A_POSITION, "EQ A Type", &values_eq_type, xml_eq_labels, G_N_ELEMENTS(xml_eq_labels)}, + {EQ_BASS, EQ_A_POSITION, "EQ A Bass", &values_eq_db,}, + {EQ_MID, EQ_A_POSITION, "EQ A Mid", &values_eq_db,}, + {EQ_TREB, EQ_A_POSITION, "EQ A Treb", &values_eq_db,}, + {EQ_MID_FREQ, EQ_A_POSITION, "EQ A Mid Freq", &values_eq_mid_hz,}, + {EQ_PRESENCE, EQ_A_POSITION, "EQ A Presence", &values_eq_db,}, + {EQ_TREB_FREQ, EQ_A_POSITION, "EQ A Treb Freq", &values_eq_treb_hz,}, + + {EQ_ENABLE, EQ_B_POSITION, "EQ B Enable", &values_on_off, xml_on_off_labels, G_N_ELEMENTS(xml_on_off_labels)}, + {EQ_TYPE, EQ_B_POSITION, "EQ B Type", &values_eq_type, xml_eq_labels, G_N_ELEMENTS(xml_eq_labels)}, + {EQ_BASS, EQ_B_POSITION, "EQ B Bass", &values_eq_db,}, + {EQ_MID, EQ_B_POSITION, "EQ B Mid", &values_eq_db,}, + {EQ_TREB, EQ_B_POSITION, "EQ B Treb", &values_eq_db,}, + {EQ_MID_FREQ, EQ_B_POSITION, "EQ B Mid Freq", &values_eq_mid_hz,}, + {EQ_PRESENCE, EQ_B_POSITION, "EQ B Presence", &values_eq_db,}, + {EQ_TREB_FREQ, EQ_B_POSITION, "EQ B Treb Freq", &values_eq_treb_hz,}, + + {TONE_LIB_TYPE, LIB_POSITION, "Tone Lib Type", &values_tone_lib_type, xml_tone_lib_labels, G_N_ELEMENTS(xml_tone_lib_labels)}, + {FX_LIB_TYPE, LIB_POSITION, "FX Lib Type", &values_fx_lib_type, xml_fx_lib_labels, G_N_ELEMENTS(xml_fx_lib_labels)}, + {FX_LIB_LEVEL, LIB_POSITION, "FxLiblvl", &values_0_to_99,}, + {FX_LIB_LEVEL_MAX1, LIB_POSITION, "FxLibLvlMax1", &values_0_to_99,}, + {FX_LIB_LEVEL_MAX2, LIB_POSITION, "FxLibLvlMax2", &values_0_to_99,}, + {FX_LIB_LEVEL_MAX3, LIB_POSITION, "FxLibLvlMax3", &values_0_to_99,}, +}; + + +guint n_xml_settings = G_N_ELEMENTS(xml_settings); #endif /* DOXYGEN_SHOULD_SKIP_THIS */ /** @@ -3266,7 +4078,7 @@ static void effect_settings_free(EffectSettings *settings) } /** - * Retrieves modifier linkable gruop from device. + * Retrieves modifier linkable group from device. * * \return ModifierGroup which must be freed using modifier_group_free. **/ diff --git a/effects.h b/effects.h index 40e95f7..3ffddce 100644 --- a/effects.h +++ b/effects.h @@ -19,7 +19,7 @@ #include -enum { +typedef enum { VALUE_TYPE_PLAIN = 0, /**< value displayed directly */ VALUE_TYPE_SUFFIX = 1 << 0, /**< use suffix for displaying */ VALUE_TYPE_OFFSET = 1 << 1, /**< use value offset */ @@ -27,6 +27,7 @@ enum { VALUE_TYPE_LABEL = 1 << 3, /**< use value labels (overrides any other option) */ VALUE_TYPE_EXTRA = 1 << 4, /**< use extra values */ VALUE_TYPE_DECIMAL= 1 << 5, /**< display decimal places */ + VALUE_TYPE_NONE = 1 << 6, /**< no value displayed */ } ValueType; typedef struct _EffectValues { @@ -93,6 +94,18 @@ typedef struct { PresetBank bank; } Banks; +enum product_id { + RP150 = 1, + RP250 = 2, + GNX4 = 3, + GNX3000 = 4, + RP500 = 5, + RP1000 = 6, + RP155 = 7, + RP255 = 8, + RP355 = 9, +}; + typedef struct { gchar *name; unsigned char family_id; diff --git a/gdigi.c b/gdigi.c index 6ea6ec4..7fa2647 100644 --- a/gdigi.c +++ b/gdigi.c @@ -25,7 +25,7 @@ static unsigned char device_id = 0x7F; static unsigned char family_id = 0x7F; -static unsigned char product_id = 0x7F; +unsigned char product_id = 0x7F; static snd_rawmidi_t *output = NULL; static snd_rawmidi_t *input = NULL; @@ -265,10 +265,12 @@ void push_message(GString *msg) GDK_THREADS_ENTER(); g_timeout_add(0, apply_current_preset_to_gui, NULL); GDK_THREADS_LEAVE(); - } else + } else { g_message("%d %d moved to %d %d", str[9], str[10], str[11], str[12]); + } + break; default: - g_message("Received unhandled device notification"); + g_message("Received unhandled device notification 0x%x", str[11]); } g_string_free(msg, TRUE); return; @@ -300,7 +302,7 @@ gpointer read_data_thread(gboolean *stop) /* SysEx messages can't contain bytes with 8th bit set. memset our buffer to 0xFF, so if for some reason we'll get out of reply bounds, we'll catch it */ - memset(buf, sizeof(buf), 0xFF); + memset(buf, '\0', sizeof(buf)); err = poll(pfds, npfds, 200); if (err < 0 && errno == EINTR) diff --git a/gdigi.h b/gdigi.h index 0fc0ace..1e43042 100644 --- a/gdigi.h +++ b/gdigi.h @@ -29,6 +29,8 @@ #define GNX_CABINET_WARP 263 #define GNX_CHANNEL_FS_MODE 264 +unsigned char product_id; + enum { GNX3K_WAH_TYPE_CRY = 129, GNX3K_WAH_TYPE_BOUTIQUE = 130, @@ -48,6 +50,9 @@ enum { #define WAH_ON_OFF 129 #define WAH_POSITION 3 +#define WAH_PEDAL_POSITION 132 +#define WAH_VOLUME_BOOST 133 + #define WAH_LEVEL 133 enum { @@ -93,8 +98,8 @@ enum { #define COMP_OUTPUT 212 enum { + PICKUP_TYPE_SC_HB = 65, PICKUP_TYPE_HB_SC = 66, - PICKUP_TYPE_SC_HB = 65 }; #define PICKUP_TYPE 64 @@ -227,6 +232,9 @@ enum { #define DIST_MP_TONE 2446 #define DIST_MP_VOLUME 2447 +#define VOLUME_PRE_FX_POSITION 13 +#define VOLUME_POST_FX_POSITION 17 + #define PRESET_POSITION 18 #define PRESET_LEVEL 2626 @@ -239,7 +247,7 @@ enum { AMP_TYPE_BLACKFACE_DELUXE = 312, AMP_TYPE_PLEXI_JTM_45 = 313, AMP_TYPE_SUPER_LEAD_PLEXI = 314, - AMP_TYPE_PLEXI_JUMP_PANEL = 315, + AMP_TYPE_68_MARSHALL_JUMP = 315, AMP_TYPE_MASTER_VOLUME = 316, AMP_TYPE_JCM800 = 317, AMP_TYPE_JCM900 = 318, @@ -267,7 +275,7 @@ enum { AMP_TYPE_METAL = 332, AMP_TYPE_BRIGHT = 333, AMP_TYPE_CHUNK = 334, - AMP_TYPE_CLEAN = 335, + AMP_TYPE_DIGITECH_CLEAN = 335, AMP_TYPE_HIGH_GAIN = 337, AMP_TYPE_BLUES = 338, AMP_TYPE_FUZZ = 339, @@ -308,7 +316,7 @@ enum { #define AMP_TYPE 2496 #define AMP_ON_OFF 265 #define AMP_POSITION 8 -#define CH2_AMP_POSITION 10 +#define AMP_B_POSITION 10 #define AMP_LOOP_ON_OFF 3649 #define AMP_LOOP_POSITION 33 @@ -316,11 +324,12 @@ enum { #define AMP_BYPASS_ON_OFF 12361 #define AMP_BYPASS_POSITION 0 -#define AMP_SELECT 256 -#define AMP_SELECT_POSITION 7 +#define AMP_CHANNEL 256 +#define AMP_CHANNEL_POSITION 7 #define AMP_CHANNEL_A 0 #define AMP_CHANNEL_B 1 +#define AMP_CHANNEL_WARP 2 #define AMP_GAIN 2497 #define AMP_LEVEL 2498 @@ -339,7 +348,7 @@ enum { #define AMP_CAB_TYPE 2560 #define AMP_CAB_TUNING 2561 #define AMP_CAB_POSITION 9 -#define CH2_AMP_CAB_POSITION 11 +#define AMP_CAB_B_POSITION 11 enum { AMP_CAB_DIRECT = 570, @@ -406,23 +415,24 @@ enum { GNX_AMP_CAB_SVT_BASS8_10 = 595, }; -#define EQ_TYPE 3202 -#define EQ_ON_OFF 3212 -#define EQ_POSITION 24 -#define EQ_POSITION_B 25 +#define EQ_A_POSITION 24 +#define EQ_B_POSITION 25 +#define EQ_TYPE 3202 #define EQ_BASS 3203 #define EQ_MID 3204 -#define EQ_MID_HZ 3206 -#define EQ_TREBLE 3205 +#define EQ_TREB 3205 +#define EQ_MID_FREQ 3206 #define EQ_PRESENCE 3207 -#define EQ_TREBLE_HZ 3211 -#define EQ_LOW_LEVEL 3203 -#define EQ_MID_LEVEL 3204 -#define EQ_HIGH_LEVEL 3205 +#define EQ_TREB_FREQ 3211 +#define EQ_ENABLE 3212 + + #define EQ_LOW_FREQ 3213 -#define EQ_MID_FREQ 3214 +#define EQ_MID_FREQ_XXX 3214 #define EQ_HIGH_FREQ 3215 + +#define EQ_TREBLE_FREQ 3215 #define EQ_LOW_BANDWIDTH 3216 #define EQ_MID_BANDWIDTH 3217 #define EQ_HIGH_BANDWIDTH 3218 @@ -467,49 +477,54 @@ enum { }; enum { - CHORUS_TYPE_CE = 0x37B, - CHORUS_TYPE_TC = 0x37C, - CHORUS_TYPE_DUAL = 0x379, - CHORUS_TYPE_GLISTEN = 0x392, - CHORUS_TYPE_MULTI = 0x37a, - CHORUS_TYPE_VOO_DOO = 0x396, - CHORUS_TYPE_CLONE = 0x397, - CHORUS_TYPE_FLANGER = 0x37d, - CHORUS_TYPE_TRIGGERED_FLANGER = 0x37e, - CHORUS_TYPE_FLTFLANGER = 0x398, - CHORUS_TYPE_MXR_FLANGER = 0x37f, - CHORUS_TYPE_EH_FLANGER = 0x380, - CHORUS_TYPE_AD_FLANGER = 0x393, - CHORUS_TYPE_PHASER = 0x381, - CHORUS_TYPE_TRIGGERED_PHASER = 0x382, - CHORUS_TYPE_MX_PHASER = 0x383, - CHORUS_TYPE_EH_PHASER = 0x384, - CHORUS_TYPE_VIBRATO = 0x360, - CHORUS_TYPE_ROTARY = 0x361, - CHORUS_TYPE_VIBROPAN = 0x38f, - CHORUS_TYPE_UNOVIBE = 0x390, - CHORUS_TYPE_TREMOLO = 0x35e, - CHORUS_TYPE_SCATTER_TREM = 0x394, - CHORUS_TYPE_OPTO_TREMOLO = 0x388, - CHORUS_TYPE_BIAS_TREMOLO = 0x389, - CHORUS_TYPE_PANNER = 0x35f, - CHORUS_TYPE_ENVELOPE = 0x38a, - CHORUS_TYPE_FX25 = 0x38e, - CHORUS_TYPE_AUTOYA = 0x38b, - CHORUS_TYPE_YAYA = 0x38c, - CHORUS_TYPE_SYNTH_TALK = 0x391, - CHORUS_TYPE_STEP_FILTER = 0x38d, - CHORUS_TYPE_SAMPLE_HOLD = 0x395, - CHORUS_TYPE_WHAMMY = 0x540, - CHORUS_TYPE_PITCH_SHIFT = 0x543, - CHORUS_TYPE_DETUNE = 0x542, - CHORUS_TYPE_IPS = 0x541, - CHORUS_TYPE_OCTAVER = 0x385, + CHORUS_TYPE_CE = 891, + CHORUS_TYPE_TC = 892, + CHORUS_TYPE_DUAL = 889, + CHORUS_TYPE_GLISTEN = 914, + CHORUS_TYPE_MULTI = 890, + CHORUS_TYPE_VOO_DOO = 918, + CHORUS_TYPE_CLONE = 919, + CHORUS_TYPE_FLANGER = 893, + CHORUS_TYPE_TRIGGERED_FLANGER = 894, + CHORUS_TYPE_FLTFLANGER = 920, + CHORUS_TYPE_MXR_FLANGER = 895, + CHORUS_TYPE_EH_FLANGER = 896, + CHORUS_TYPE_AD_FLANGER = 915, + CHORUS_TYPE_PHASER = 897, + CHORUS_TYPE_TRIGGERED_PHASER = 898, + CHORUS_TYPE_MX_PHASER = 899, + CHORUS_TYPE_EH_PHASER = 900, + CHORUS_TYPE_VIBRATO = 864, + CHORUS_TYPE_ROTARY = 865, + CHORUS_TYPE_VIBROPAN = 911, + CHORUS_TYPE_UNOVIBE = 912, + CHORUS_TYPE_TREMOLO = 862, + CHORUS_TYPE_SCATTER_TREM = 916, + CHORUS_TYPE_OPTO_TREMOLO = 904, + CHORUS_TYPE_BIAS_TREMOLO = 905, + CHORUS_TYPE_PANNER = 863, + CHORUS_TYPE_ENVELOPE = 906, + CHORUS_TYPE_FX25 = 910, + CHORUS_TYPE_AUTOYA = 907, + CHORUS_TYPE_YAYA = 908, + CHORUS_TYPE_SYNTH_TALK = 913, + CHORUS_TYPE_STEP_FILTER = 909, + CHORUS_TYPE_SAMPLE_HOLD = 917, + CHORUS_TYPE_WHAMMY = 1344, + CHORUS_TYPE_PITCH_SHIFT = 1347, + CHORUS_TYPE_DETUNE = 1346, + CHORUS_TYPE_IPS = 1345, // Also known as Harmony + CHORUS_TYPE_OCTAVER = 901, }; +#define MOD_TYPE 768 +#define MOD_POSITION 768 +#define MOD_PRE_POST 1798 + #define CHORUSFX_TYPE 768 #define CHORUSFX_ON_OFF 769 #define CHORUSFX_PRE_POST 770 + #define CHORUSFX_POSITION 14 #define CHORUSFX_PRE 1543 #define CHORUSFX_POST 1544 @@ -521,6 +536,12 @@ enum { #define CHORUS_WIDTH 848 #define CHORUS_INTENSITY 849 +enum { + CHORUS_WAVEFORM_TRI = 0, + CHORUS_WAVEFORM_SINE = 1, + CHORUS_WAVEFORM_SQUARE = 2, +}; + #define CHORUS_LEVEL 836 #define CHORUS_WAVE 840 #define CHORUS_BALANCE 841 @@ -638,6 +659,25 @@ enum { #define WHAMMY_PEDAL 1795 #define WHAMMY_MIX 1796 +enum whammy_amt { + WHAMMY_TYPE_OCT_UP = 0, + WHAMMY_TYPE_2OCT_UP = 1, + WHAMMY_TYPE_2ND_DN = 2, + WHAMMY_TYPE_RV2ND_DN = 3, + WHAMMY_TYPE_4TH_DN = 4, + WHAMMY_TYPE_OCT_DN = 5, + WHAMMY_TYPE_2OCT_DN = 6, + WHAMMY_TYPE_DIV_BMB = 7, + WHAMMY_TYPE_M3_GT_MA3 = 8, + WHAMMY_TYPE_2ND_MA3 = 9, + WHAMMY_TYPE_3RD_4TH = 10, + WHAMMY_TYPE_4TH_5TH = 11, + WHAMMY_TYPE_5TH_OCT = 12, + WHAMMY_TYPE_HOCT_UP = 13, + WHAMMY_TYPE_HOCT_DN = 14, + WHAMMY_TYPE_OCT_GT_D = 15, +}; + #define PITCH_AMOUNT 1730 #define PITCH_BALANCE 1733 #define PITCH_MIX 1745 @@ -651,6 +691,47 @@ enum { #define IPS_SCALE 2755 #define IPS_LEVEL 2757 +enum { + IPS_KEY_E = 0, + IPS_KEY_F = 1, + IPS_KEY_Gb = 2, + IPS_KEY_G = 3, + IPS_KEY_Ab = 4, + IPS_KEY_A = 5, + IPS_KEY_Bb = 6, + IPS_KEY_B = 7, + IPS_KEY_C = 8, + IPS_KEY_Db = 9, + IPS_KEY_D = 10, + IPS_KEY_Eb = 11, +}; + +enum { + IPS_SHIFT_OCT_DN = 0, + IPS_SHIFT_7TH_DN = 1, + IPS_SHIFT_6TH_DN = 2, + IPS_SHIFT_5TH_DN = 3, + IPS_SHIFT_4TH_DN = 4, + IPS_SHIFT_3RD_DN = 5, + IPS_SHIFT_2ND_DN = 6, + IPS_SHIFT_2ND_UP = 7, + IPS_SHIFT_3RD_UP = 8, + IPS_SHIFT_4TH_UP = 9, + IPS_SHIFT_5TH_UP = 10, + IPS_SHIFT_6TH_UP = 11, + IPS_SHIFT_7TH_UP = 12, + IPS_SHIFT_OCT_UP = 13, +}; + +enum { + IPS_SCALE_MAJOR = 0, + IPS_SCALE_MINOR = 1, + IPS_SCALE_DORIAN = 2, + IPS_SCALE_MIXOLYDIAN = 3, + IPS_SCALE_LYDIAN = 4, + IPS_SCALE_HMINOR = 5, +}; + #define OCTAVER_OCTAVE1 1746 #define OCTAVER_OCTAVE2 1747 #define OCTAVER_DRY_LEVEL 1748 @@ -757,19 +838,58 @@ enum { #define REVERB_LEVEL 1925 #define EXP_TYPE 8194 +#define EXP_ASSIGN1 8194 #define EXP_POSITION 19 +#define EXP_VOLUME_PRE_FX 854594 +#define EXP_VOLUME_POST_FX 1116738 + #define EXP_MIN 8195 #define EXP_MAX 8196 + #define LFO_TYPE 8258 +#define LFO_MIN 8259 +#define LFO_MAX 8260 +#define LFO_SPEED 8262 +#define LFO_WAVEFORM 8263 + +#define LFO_WAVEFORM_TRI 0 +#define LFO_WAVEFORM_SINE 1 +#define LFO_WAVEFORM_SQUARE 2 + #define LFO1_POSITION 22 #define LFO2_POSITION 23 +// The LFO and VSWITCH defines are temporary. +#define LFO_ASSIGN_NONE 0 +#define LFO_ASSIGN_PICKUP_ON 131137 +#define LFO_ASSIGN_COMP_ON 262337 +#define LFO_ASSIGN_SUSTAN 262352 + +#define VSWITCH_ASSIGN 8384 +#define VSWITCH_MIN 8385 +#define VSWITCH_MAX 8386 +#define VSWITCH_TYPE 8393 +#define VSWITCH_ENABLE 8449 +#define VSWITCH_ASSIGN_POSITION 21 + +#define VSWITCH_TYPE_TOGGLE 0 +#define VSWITCH_PEDAL_ASSIGN_WAH 196740 +#define VSWITCH_ASSIGN_WAH_ENABLE 196737 + #define LIBRARY_TONE 8704 #define LIBRARY_EFFECTS 8705 #define EFFECTS_LEVEL 8706 #define LIBRARY_POSITION 25 +#define LIB_POSITION 26 + +#define TONE_LIB_TYPE 8704 +#define FX_LIB_TYPE 8705 +#define FX_LIB_LEVEL 8706 +#define FX_LIB_LEVEL_MAX1 8708 +#define FX_LIB_LEVEL_MAX2 8710 +#define FX_LIB_LEVEL_MAX3 8712 enum { TONE_LIB_OVERDRIVE = 1793, diff --git a/gdigi_xml.h b/gdigi_xml.h new file mode 100644 index 0000000..56db6c3 --- /dev/null +++ b/gdigi_xml.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2009 Tomasz Moń + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; under version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef GDIGI_XML_H +#define GDIGI_XML_H + +#include +#include "effects.h" +typedef struct { + guint type; + gchar *label; +} XmlLabel; + +typedef struct { + guint id; + guint position; + gchar *label; + EffectValues *values; + XmlLabel *xml_labels; /* 'type' id's have a label group. */ + guint xml_labels_amt; +} XmlSettings; + +// XmlSettings *get_xml_settings(guint id, guint position); +// gchar *get_xml_label(guint id, guint position, gint type); + +#endif /* GDIGI_XML_H */ diff --git a/gui.c b/gui.c index 11ac104..923f2c1 100644 --- a/gui.c +++ b/gui.c @@ -51,7 +51,7 @@ void show_error_message(GtkWidget *parent, gchar *message) GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, - message); + "%s", message); gtk_dialog_run(GTK_DIALOG(msg)); gtk_widget_destroy(msg); @@ -861,20 +861,25 @@ typedef struct { gchar *suffix; } SupportedFileTypes; -static SupportedFileTypes file_types[] = { - {"RP150Preset", "*.rp150p"}, - {"RP155Preset", "*.rp155p"}, - {"RP250Preset", "*.rp250p"}, - {"RP255Preset", "*.rp255p"}, - {"RP355Preset", "*.rp355p"}, - {"RP500Preset", "*.rp500p"}, - {"RP1000Preset", "*.rp1000p"}, - {"GNX4 Preset", "*.g4p"}, - {"GNX3kPreset", "*.g3kp"}, +SupportedFileTypes file_types[] = { + [ RP150] = {"RP150Preset", "*.rp150p"}, + [ RP155 ] = {"RP155Preset", "*.rp155p"}, + [ RP250 ] = {"RP250Preset", "*.rp250p"}, + [ RP255 ] = {"RP255Preset", "*.rp255p"}, + [ RP355 ] = {"RP355Preset", "*.rp355p"}, + [ RP500 ] = {"RP500Preset", "*.rp500p"}, + [ RP1000 ] = {"RP1000Preset", "*.rp1000p"}, + [ GNX4 ] = {"GNX4 Preset", "*.g4p"}, + [ GNX3000 ] = {"GNX3kPreset", "*.g3kp"}, }; static guint n_file_types = G_N_ELEMENTS(file_types); +gchar * +get_preset_filename (int prod_id) +{ + return file_types[prod_id].name; +} #endif /* DOXYGEN_SHOULD_SKIP_THIS */ /** @@ -906,12 +911,21 @@ static void action_open_preset_cb(GtkAction *action) int x; for (x=0; xmessage); + g_error_free(error); + error = NULL; + } else { + gchar real_filename[256]; + GList *list = get_current_preset(); + Preset *preset = create_preset_from_data(list); + + snprintf(real_filename, 256, "%s.%s", + filename, file_types[product_id].suffix + 2); + + gtk_widget_hide(dialog); + write_preset_to_xml(preset, real_filename); + + preset_free(preset); + } + g_free(filename); + } + + gtk_widget_destroy(dialog); + dialog = NULL; +} + /** * \param list widget tree list to be freed * @@ -1040,11 +1105,12 @@ static void action_quit_cb(GtkAction *action) static GtkActionEntry entries[] = { {"File", NULL, "_File"}, - {"Preset", NULL, "_Preset"}, - {"Help", NULL, "_Help"}, - {"Open", GTK_STOCK_OPEN, "_Open", "O", "Open preset file", G_CALLBACK(action_open_preset_cb)}, {"Quit", GTK_STOCK_QUIT, "_Quit", "Q", "Quit", G_CALLBACK(action_quit_cb)}, - {"Store", NULL, "_Store", "S", "Store", G_CALLBACK(action_store_cb)}, + {"Preset", NULL, "_Preset"}, + {"Store", NULL, "_Store Preset to Device", "D", "Store Preset to Device", G_CALLBACK(action_store_cb)}, + {"Load", GTK_STOCK_OPEN, "_Load Preset from File", "O", "Load Preset from File", G_CALLBACK(action_open_preset_cb)}, + {"Save", GTK_STOCK_SAVE, "_Save Preset to File", "S", "Save Preset to File", G_CALLBACK(action_save_preset_cb)}, + {"Help", NULL, "_Help"}, {"About", GTK_STOCK_ABOUT, "_About", "A", "About", G_CALLBACK(action_show_about_dialog_cb)}, }; static guint n_entries = G_N_ELEMENTS(entries); @@ -1053,12 +1119,14 @@ static const gchar *menu_info = "" " " " " -" " " " " " " " " " " " +" " +" " +" " " " " " " " @@ -1115,8 +1183,9 @@ static void add_menubar(GtkWidget *window, GtkWidget *vbox) FALSE, FALSE, 0); add_action_data(ui, "/MenuBar/File/Quit", window); - add_action_data(ui, "/MenuBar/File/Open", window); add_action_data(ui, "/MenuBar/Preset/Store", window); + add_action_data(ui, "/MenuBar/Preset/Save", window); + add_action_data(ui, "/MenuBar/Preset/Load", window); add_action_data(ui, "/MenuBar/Help/About", window); g_object_unref(ui); diff --git a/gui.h b/gui.h index 42538fb..99e95f7 100644 --- a/gui.h +++ b/gui.h @@ -17,9 +17,11 @@ #ifndef GDIGI_GUI_H #define GDIGI_GUI_H +#include #include #include "effects.h" +gchar * get_preset_filename(int prod_id); void show_error_message(GtkWidget *parent, gchar *message); void apply_setting_param_to_gui(SettingParam *param); gboolean apply_current_preset_to_gui(gpointer data); diff --git a/preset.c b/preset.c index 839f635..21ed711 100644 --- a/preset.c +++ b/preset.c @@ -260,6 +260,21 @@ Preset *create_preset_from_xml_file(gchar *filename, GError **error) return preset; } +gint params_cmp(gconstpointer a, gconstpointer b) +{ + const SettingParam *param_a = a; + const SettingParam *param_b = b; + + if (param_a->position != param_b->position) { + return (param_a->position > param_b->position) ? 1 : -1; + } + if (param_a->id != param_b->id) { + return (param_a->id > param_b->id) ? 1 : -1; + } + + return 0; +} + /** * \param list list containing unpacked preset SysEx messages. * @@ -314,7 +329,7 @@ Preset *create_preset_from_data(GList *list) g_message("%d ID %d Position %d Value %d", n, param->id, param->position, param->value); } while ((x < data->len) && nparams = g_list_reverse(preset->params); + preset->params = g_list_sort(preset->params, params_cmp); break; case RECEIVE_PRESET_END: break; diff --git a/preset.h b/preset.h index 95d92d7..359d075 100644 --- a/preset.h +++ b/preset.h @@ -28,5 +28,5 @@ typedef struct { Preset *create_preset_from_xml_file(gchar *filename, GError **error); Preset *create_preset_from_data(GList *list); void preset_free(Preset *preset); - +void write_preset_to_xml(Preset *preset, gchar *filename); #endif /* GDIGI_PRESET_H */ diff --git a/preset_xml.c b/preset_xml.c new file mode 100644 index 0000000..a5bd749 --- /dev/null +++ b/preset_xml.c @@ -0,0 +1,262 @@ +/* + * Copyright (c) 2009 Tomasz Moń + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; under version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include +#include +#include +#include +#include "preset.h" +#include "gdigi.h" +#include "gui.h" +#include "gdigi_xml.h" + +#ifndef DOXYGEN_SHOULD_SKIP_THIS +// FIXME: Bring the xml settings into this module? +extern XmlSettings xml_settings[]; +extern guint n_xml_settings; +extern EffectValues values_on_off; +/** + * \param id modifier ID + * \param position modifier position + * + * Gets modifier info. + * + * \return Modifier which must not be freed, or NULL if no matching Modifier has been found. +*/ +XmlSettings *get_xml_settings (guint id, guint position) +{ + gint x; + + for (x=0; x< n_xml_settings; x++) { + if ((xml_settings[x].id == id) && (xml_settings[x].position == position)) { + return xml_settings + x; + } + } + + return NULL; +} + +gchar * +map_xml_value(XmlSettings *xml, gint value) +{ + switch (xml->values->type) { + case VALUE_TYPE_LABEL: + if ((xml->values == &values_on_off) && (value > 1)) { + g_message("Skipping modifier->label %s\n", xml->label); + return NULL; + } + if (value > xml->values->max || value < xml->values->min) { + g_message("%s value %d out of range %0.1f %0.1f", xml->label, value, xml->values->min, xml->values->max); + } + { + XmlLabel *labels = xml->xml_labels; + guint labels_amt = xml->xml_labels_amt; + gint i; + + // Maybe this can be a computation: i = xml->values->min + val + for (i = 0; i < labels_amt; i++) { + if (labels[i].type == value) { + return (labels[i].label); + } + } + } + break; + + default: + break; + } + return NULL; +} + + +gboolean value_is_extra (EffectValues *val, SettingParam *param) +{ + if ((param->value < val->min) || (param->value > val->max)) { + return TRUE; + } + return FALSE; +} + +#define GDIGI_ENCODING "utf-8" +void +write_preset_to_xml(Preset *preset, gchar *filename) +{ + + int rc; + xmlTextWriterPtr writer; + GList *iter_params = preset->params; + guint last_id = 0; + guint last_position = 0; + + printf("Creating a new xml doc\n"); + /* Create a new XmlWriter for uri, with no compression. */ + writer = xmlNewTextWriterFilename(filename, 0); + if (writer == NULL) { + printf("testXmlwriterFilename: Error creating the xml writer\n"); + return; + } + + /* + * Start the document with the xml default for the version, + * encoding and the default for the standalone declaration. + */ + rc = xmlTextWriterStartDocument(writer, NULL, GDIGI_ENCODING, NULL); + if (rc < 0) { + printf + ("testXmlwriterFilename: Error at xmlTextWriterStartDocument\n"); + return; + } + + rc = xmlTextWriterSetIndent(writer, 1); + rc = xmlTextWriterSetIndentString(writer, BAD_CAST " "); + /* Write the tag identifying type of prefix, schema version and ns. */ + rc = xmlTextWriterStartElement(writer, BAD_CAST get_preset_filename(product_id)); + + rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "SchemaVersion", + BAD_CAST "1.2"); + + + rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "xmlns", + BAD_CAST "http://www.digitech.com/xml/preset"); + + /* Write the Name tag. */ + rc = xmlTextWriterWriteElement(writer, BAD_CAST "Name", BAD_CAST preset->name); + + rc = xmlTextWriterStartElement(writer, BAD_CAST "Params"); + + while (iter_params) { + XmlSettings *xml; + SettingParam *param = (SettingParam *) iter_params->data; + + if (param->id == last_id && param->position == last_position) { + g_message("Skipping duplicate parameter id %d position %d", + last_id, last_position); + iter_params = iter_params->next; + continue; + } + + rc = xmlTextWriterStartElement(writer, BAD_CAST "Param"); + + rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ID", + "%d", param->id); + rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "Position", + "%d", param->position); + rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "Value", + "%d", param->value); + + last_id = param->id; + last_position = param->position; + xml = get_xml_settings(param->id, param->position); + if (!xml) { + printf("Failed to get xml settings for id %d position %d\n", + param->id, param->position); + } else { + ValueType type; + gchar *suffix = ""; + gdouble step = 1.0; + gint offset = 0; + gboolean decimal = FALSE; + EffectValues *values = NULL; + + rc = xmlTextWriterWriteElement(writer, BAD_CAST "Name", + BAD_CAST xml->label); + values = xml->values; + type = values->type; + while ((type & VALUE_TYPE_EXTRA) && value_is_extra(values, param)) { + values = values->extra; + type = values->type; + } + type &= ~VALUE_TYPE_EXTRA; + + if (type & VALUE_TYPE_OFFSET) { + offset = values->offset; + type &= ~VALUE_TYPE_OFFSET; + } + + if (type & VALUE_TYPE_STEP) { + step = values->step; + type &= ~VALUE_TYPE_STEP; + } + + if (type & VALUE_TYPE_SUFFIX) { + suffix = values->suffix; + type &= ~VALUE_TYPE_SUFFIX; + } + + if (type & VALUE_TYPE_DECIMAL) { + decimal = TRUE; + type &= ~VALUE_TYPE_DECIMAL; + } + + switch (type) { + case VALUE_TYPE_LABEL: + { + char *textp = map_xml_value(xml, param->value); + if (!textp) { + g_message("Unable to map %s value %d for id %d position %d", + xml->label, param->value, param->id, param->position); + textp = ""; + } + rc = xmlTextWriterWriteElement(writer, BAD_CAST "Text", + BAD_CAST textp); + break; + } + + case VALUE_TYPE_PLAIN: + { + if (decimal) { + double value = (param->value + offset) * step; + rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "Text", + "%0.2f%s", value, suffix); + } else { + gint value = (param->value + offset) * step; + rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "Text", + "%d%s", value, suffix); + } + break; + + } + case VALUE_TYPE_NONE: + rc = xmlTextWriterStartElement(writer, BAD_CAST "Text"); + rc = xmlTextWriterEndElement(writer); + break; + + default: + g_message("Unhandled value type %d", type); + break; + } + } + + rc = xmlTextWriterEndElement(writer); + + iter_params = iter_params->next; + } + + /* Here we could close the elements ORDER and EXAMPLE using the + * function xmlTextWriterEndElement, but since we do not want to + * write any other elements, we simply call xmlTextWriterEndDocument, + * which will do all the work. */ + rc = xmlTextWriterEndDocument(writer); + if (rc < 0) { + printf("testXmlwriterFilename: Error at xmlTextWriterEndDocument\n"); + return; + } + + xmlFreeTextWriter(writer); +} +#endif /* DOXYGEN_SHOULD_SKIP_THIS */ From dd1f4408c913ee68cc2e5da9bcefcb768010a78d Mon Sep 17 00:00:00 2001 From: Tim LaBerge Date: Sat, 31 Mar 2012 18:18:00 -0700 Subject: [PATCH 02/12] Better message tracking. --- gdigi.c | 36 +++++++++++++++++++++++++----- gdigi.h | 1 + gui.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ gui.h | 1 + 4 files changed, 101 insertions(+), 6 deletions(-) diff --git a/gdigi.c b/gdigi.c index 0275adc..4044796 100644 --- a/gdigi.c +++ b/gdigi.c @@ -220,31 +220,37 @@ MessageID get_message_id(GString *msg) void push_message(GString *msg) { + MessageID msgid = get_message_id(msg); if (((unsigned char)msg->str[0] == 0xF0) && ((unsigned char)msg->str[msg->len-1] == 0xF7)) g_message("Pushing correct message!"); else g_warning("Pushing incorrect message!"); int x; - for (x = 0; xlen; x++) + for (x = 0; xlen; x++) { + if (x && (x % 26) == 0) { + printf("\n"); + } printf("%02x ", (unsigned char)msg->str[x]); - printf("\n"); + } + if (x % 26) { + printf("\n"); + } + g_message("Received %s", get_message_name(msgid)); - switch (get_message_id(msg)) { + switch (msgid) { case ACK: - g_message("Received ACK"); g_string_free(msg, TRUE); return; case NACK: - g_message("Received NACK"); g_string_free(msg, TRUE); return; case RECEIVE_PARAMETER_VALUE: unpack_message(msg); SettingParam *param = setting_param_new_from_data(&msg->str[8], NULL); - g_message("Received parameter change ID: %d Position: %d Value: %d", param->id, param->position, param->value); + g_message("ID: %d Position: %d Value: %d", param->id, param->position, param->value); GDK_THREADS_ENTER(); apply_setting_param_to_gui(param); @@ -400,6 +406,7 @@ void send_message(gint procedure, gchar *data, gint len) g_string_append_printf(msg, "%c\xF7", calculate_checksum(&msg->str[1], msg->len - 1)); + g_message("Sending message %s len %d", get_message_name(procedure), len); send_data(msg->str, msg->len); g_string_free(msg, TRUE); @@ -626,6 +633,23 @@ SectionID get_genetx_section_id(gint version, gint type) return -1; } +/** + * \param id Parameter ID + * \param position Parameter position + * \param value Parameter value + * + * Forms SysEx message to request parameter then sends it to device. + **/ +void get_option(guint id, guint position) +{ + GString *msg = g_string_sized_new(9); + g_message("Requesting parameter id %d position %d", id, position); + g_string_append_printf(msg, "%c%c%c", + ((id & 0xFF00) >> 8), (id & 0xFF), + position); + send_message(REQUEST_PARAMETER_VALUE, msg->str, msg->len); + g_string_free(msg, TRUE); +} /** * \param id Parameter ID * \param position Parameter position diff --git a/gdigi.h b/gdigi.h index 1e43042..1a46e4b 100644 --- a/gdigi.h +++ b/gdigi.h @@ -1114,6 +1114,7 @@ void setting_genetx_free(SettingGenetx *genetx); void setting_param_free(SettingParam *param); SectionID get_genetx_section_id(gint version, gint type); void set_option(guint id, guint position, guint value); +void get_option(guint id, guint position); void send_object(SectionID section, guint bank, guint index, gchar *name, GString *data); void send_preset_parameters(GList *params); diff --git a/gui.c b/gui.c index 002954d..8843f09 100644 --- a/gui.c +++ b/gui.c @@ -24,6 +24,71 @@ #include "preset.h" #include "gtkknob.h" + +static gchar* MessageID_names[] = { + [REQUEST_WHO_AM_I] = "REQUEST_WHO_AM_I", + [RECEIVE_WHO_AM_I] = "RECEIVE_WHO_AM_I", + + [REQUEST_DEVICE_CONFIGURATION] = "REQUEST_DEVICE_CONFIGURATION", + [RECEIVE_DEVICE_CONFIGURATION] = "RECEIVE_DEVICE_CONFIGURATION", + + [REQUEST_GLOBAL_PARAMETERS] = "REQUEST_GLOBAL_PARAMETERS", + [RECEIVE_GLOBAL_PARAMETERS] = "RECEIVE_GLOBAL_PARAMETERS", + + [REQUEST_BULK_DUMP] = "REQUEST_BULK_DUMP", + [RECEIVE_BULK_DUMP_START] = "RECEIVE_BULK_DUMP_START", + [RECEIVE_BULK_DUMP_END] = "RECEIVE_BULK_DUMP_END", + + [REQUEST_PRESET_NAMES] = "REQUEST_PRESET_NAMES", + [RECEIVE_PRESET_NAMES] = "RECEIVE_PRESET_NAMES", + + [REQUEST_PRESET_NAME] = "REQUEST_PRESET_NAME", + [RECEIVE_PRESET_NAME] = "RECEIVE_PRESET_NAME", + + [REQUEST_PRESET] = "REQUEST_PRESET", + [RECEIVE_PRESET_START] = "RECEIVE_PRESET_START", + [RECEIVE_PRESET_END] = "RECEIVE_PRESET_END", + [RECEIVE_PRESET_PARAMETERS] = "RECEIVE_PRESET_PARAMETERS", + + [LOAD_EDIT_BUFFER_PRESET] = "LOAD_EDIT_BUFFER_PRESET", + + [MOVE_PRESET] = "MOVE_PRESET", + + [REQUEST_MODIFIER_LINKABLE_LIST] = "REQUEST_MODIFIER_LINKABLE_LIST", + [RECEIVE_MODIFIER_LINKABLE_LIST] = "RECEIVE_MODIFIER_LINKABLE_LIST", + + [REQUEST_PARAMETER_VALUE] = "REQUEST_PARAMETER_VALUE", + [RECEIVE_PARAMETER_VALUE] = "RECEIVE_PARAMETER_VALUE", + + /* version 1 and later */ + [REQUEST_OBJECT_NAMES] = "REQUEST_OBJECT_NAMES", + [RECEIVE_OBJECT_NAMES] = "RECEIVE_OBJECT_NAMES", + [REQUEST_OBJECT_NAME] = "REQUEST_OBJECT_NAME", + [RECEIVE_OBJECT_NAME] = "RECEIVE_OBJECT_NAME", + [REQUEST_OBJECT] = "REQUEST_OBJECT", + [RECEIVE_OBJECT] = "RECEIVE_OBJECT", + [MOVE_OBJECT] = "MOVE_OBJECT", + [DELETE_OBJECT] = "DELETE_OBJECT", + [REQUEST_TABLE] = "REQUEST_TABLE", + [RECEIVE_TABLE] = "RECEIVE_TABLE", + + [RECEIVE_DEVICE_NOTIFICATION] = "RECEIVE_DEVICE_NOTIFICATION", + + [ACK] = "ACK", + [NACK] = "NACK", +}; + +const gchar* +get_message_name(MessageID msgid) +{ + if (MessageID_names[msgid]) { + return MessageID_names[msgid]; + } + + return "Unknown"; + +} + typedef struct { GObject *widget; @@ -1287,6 +1352,10 @@ void gui_create(Device *device) gtk_widget_show_all(window); g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_main_quit), NULL); + + /* Not part of the preset, but update from the device. */ + get_option(USB_AUDIO_LEVEL, USB_POSITION); + get_option(USB_AUDIO_PLAYBACK_MIX, USB_POSITION); } /** diff --git a/gui.h b/gui.h index 5555227..0c2ad5a 100644 --- a/gui.h +++ b/gui.h @@ -29,5 +29,6 @@ void gui_create(Device *device); void gui_free(); gboolean unsupported_device_dialog(Device **device); gint select_device_dialog (GList *devices); +const gchar* get_message_name(MessageID msgid); #endif /* GDIGI_GUI_H */ From e56884ecd95493f6559a2cb21977a88a941a2a2c Mon Sep 17 00:00:00 2001 From: Tim LaBerge Date: Sat, 31 Mar 2012 18:24:29 -0700 Subject: [PATCH 03/12] Add missing effects to modifier array. Change AMP_POSITION to AMP_A_POSITION. Add AMP_B_POSITION to the modifier array. Add AMP_PRESENCE to the modifier array and move it to follow Treble in the Equalizer effect. Add EQ_B_POSITION settings to the modifier array. Change the formatting of the debug messages to print more readable columns. Conflicts: gdigi.c --- effects.c | 101 +++++++++++++++++++++++++++++------------------------- gdigi.c | 52 ++++++++++++++++++++++++++-- gdigi.h | 3 +- preset.c | 3 +- 4 files changed, 107 insertions(+), 52 deletions(-) diff --git a/effects.c b/effects.c index 8dccedf..2bb0c58 100644 --- a/effects.c +++ b/effects.c @@ -942,17 +942,17 @@ static EffectSettings dist_mp_settings[] = { }; static EffectSettings rp250_amp_settings[] = { - {"Gain", AMP_GAIN, AMP_POSITION, &values_0_to_99}, - {"Level", AMP_LEVEL, AMP_POSITION, &values_0_to_99}, + {"Gain", AMP_GAIN, AMP_A_POSITION, &values_0_to_99}, + {"Level", AMP_LEVEL, AMP_A_POSITION, &values_0_to_99}, }; static EffectSettings rp250_amp_settings2[] = { - {"Level", AMP_LEVEL, AMP_POSITION, &values_0_to_99}, + {"Level", AMP_LEVEL, AMP_A_POSITION, &values_0_to_99}, }; static EffectSettings rp355_amp_settings_A[] = { - {"Gain", AMP_GAIN, AMP_POSITION, &values_0_to_99}, - {"Level", AMP_LEVEL, AMP_POSITION, &values_0_to_99}, + {"Gain", AMP_GAIN, AMP_A_POSITION, &values_0_to_99}, + {"Level", AMP_LEVEL, AMP_A_POSITION, &values_0_to_99}, }; static EffectSettings rp355_amp_settings_B[] = { @@ -961,7 +961,7 @@ static EffectSettings rp355_amp_settings_B[] = { }; static EffectSettings rp355_amp_settings2_A[] = { - {"Level", AMP_LEVEL, AMP_POSITION, &values_0_to_99}, + {"Level", AMP_LEVEL, AMP_A_POSITION, &values_0_to_99}, }; static EffectSettings rp355_amp_settings2_B[] = { @@ -969,22 +969,22 @@ static EffectSettings rp355_amp_settings2_B[] = { }; static EffectSettings rp500_amp_settings[] = { - {"Gain", AMP_GAIN, AMP_POSITION, &values_0_to_99}, - {"Level", AMP_LEVEL, AMP_POSITION, &values_0_to_99}, - {"Bass", AMP_BASS, AMP_POSITION, &values_1_to_10_step_0p1}, - {"Mid", AMP_MID, AMP_POSITION, &values_1_to_10_step_0p1}, - {"Treble", AMP_TREBLE, AMP_POSITION, &values_1_to_10_step_0p1}, + {"Gain", AMP_GAIN, AMP_A_POSITION, &values_0_to_99}, + {"Level", AMP_LEVEL, AMP_A_POSITION, &values_0_to_99}, + {"Bass", AMP_BASS, AMP_A_POSITION, &values_1_to_10_step_0p1}, + {"Mid", AMP_MID, AMP_A_POSITION, &values_1_to_10_step_0p1}, + {"Treble", AMP_TREBLE, AMP_A_POSITION, &values_1_to_10_step_0p1}, }; static EffectSettings rp500_amp_settings2[] = { - {"Level", AMP_LEVEL, AMP_POSITION, &values_0_to_99}, - {"Bass", AMP_BASS, AMP_POSITION, &values_1_to_10_step_0p1}, - {"Mid", AMP_MID, AMP_POSITION, &values_1_to_10_step_0p1}, - {"Treble", AMP_TREBLE, AMP_POSITION, &values_1_to_10_step_0p1}, + {"Level", AMP_LEVEL, AMP_A_POSITION, &values_0_to_99}, + {"Bass", AMP_BASS, AMP_A_POSITION, &values_1_to_10_step_0p1}, + {"Mid", AMP_MID, AMP_A_POSITION, &values_1_to_10_step_0p1}, + {"Treble", AMP_TREBLE, AMP_A_POSITION, &values_1_to_10_step_0p1}, }; static EffectSettings rp500_amp_settings3[] = { - {"Level", AMP_LEVEL, AMP_POSITION, &values_0_to_99}, + {"Level", AMP_LEVEL, AMP_A_POSITION, &values_0_to_99}, }; static EffectSettings gnx3k_ch1_cab_tuning_settings[] = { @@ -996,15 +996,15 @@ static EffectSettings gnx3k_ch2_cab_tuning_settings[] = { }; static EffectSettings gnx3k_ch1_amp_eq_settings[] = { - {"Gain", AMP_GAIN, AMP_POSITION, &values_0_to_99}, - {"Bass Freq", AMP_BASS_FREQ, AMP_POSITION, &values_eq_bass_hz}, - {"Bass Level", AMP_BASS_LEVEL, AMP_POSITION, &values_eq_db}, - {"Mid Freq", AMP_MID_FREQ, AMP_POSITION, &values_eq_mid_hz}, - {"Mid Level", AMP_MID_LEVEL, AMP_POSITION, &values_eq_db}, - {"Treb Freq", AMP_TREBLE_FREQ, AMP_POSITION, &values_eq_treb_hz}, - {"Treb Level", AMP_TREBLE_LEVEL, AMP_POSITION, &values_eq_db}, - {"Presence", AMP_PRESENCE, AMP_POSITION, &values_eq_db}, - {"Level", AMP_LEVEL, AMP_POSITION, &values_0_to_99}, + {"Gain", AMP_GAIN, AMP_A_POSITION, &values_0_to_99}, + {"Bass Freq", AMP_BASS_FREQ, AMP_A_POSITION, &values_eq_bass_hz}, + {"Bass Level", AMP_BASS_LEVEL, AMP_A_POSITION, &values_eq_db}, + {"Mid Freq", AMP_MID_FREQ, AMP_A_POSITION, &values_eq_mid_hz}, + {"Mid Level", AMP_MID_LEVEL, AMP_A_POSITION, &values_eq_db}, + {"Presence", AMP_PRESENCE, AMP_A_POSITION, &values_eq_db}, + {"Treb Freq", AMP_TREBLE_FREQ, AMP_A_POSITION, &values_eq_treb_hz}, + {"Treb Level", AMP_TREBLE_LEVEL, AMP_A_POSITION, &values_eq_db}, + {"Level", AMP_LEVEL, AMP_A_POSITION, &values_0_to_99}, }; static EffectSettings gnx3k_ch2_amp_eq_settings[] = { @@ -1013,9 +1013,9 @@ static EffectSettings gnx3k_ch2_amp_eq_settings[] = { {"Bass Level", AMP_BASS_LEVEL, AMP_B_POSITION, &values_eq_db}, {"Mid Freq", AMP_MID_FREQ, AMP_B_POSITION, &values_eq_mid_hz}, {"Mid Level", AMP_MID_LEVEL, AMP_B_POSITION, &values_eq_db}, + {"Presence", AMP_PRESENCE, AMP_B_POSITION, &values_eq_db}, {"Treb Freq", AMP_TREBLE_FREQ, AMP_B_POSITION, &values_eq_treb_hz}, {"Treb Level", AMP_TREBLE_LEVEL, AMP_B_POSITION, &values_eq_db}, - {"Presence", AMP_PRESENCE, AMP_B_POSITION, &values_eq_db}, {"Level", AMP_LEVEL, AMP_B_POSITION, &values_0_to_99}, }; @@ -1031,18 +1031,18 @@ static EffectSettings rp355_eq_settings_A[] = { {"Bass", EQ_BASS, EQ_A_POSITION, &values_eq_db}, {"Mid", EQ_MID, EQ_A_POSITION, &values_eq_db}, {"Treble", EQ_TREB, EQ_A_POSITION, &values_eq_db}, + {"Presence", EQ_PRESENCE, EQ_A_POSITION, &values_eq_db}, {"Mid Hz", EQ_MID_FREQ, EQ_A_POSITION, &values_eq_mid_hz}, {"Treb Hz", EQ_TREB_FREQ, EQ_A_POSITION, &values_eq_treb_hz}, - {"Presence", EQ_PRESENCE, EQ_A_POSITION, &values_eq_db}, }; static EffectSettings rp355_eq_settings_B[] = { {"Bass", EQ_BASS, EQ_B_POSITION, &values_eq_db}, {"Mid", EQ_MID, EQ_B_POSITION, &values_eq_db}, {"Treble", EQ_TREB, EQ_B_POSITION, &values_eq_db}, + {"Presence", EQ_PRESENCE, EQ_B_POSITION, &values_eq_db}, {"Mid Hz", EQ_MID_FREQ, EQ_B_POSITION, &values_eq_mid_hz}, {"Treb Hz", EQ_TREB_FREQ, EQ_B_POSITION, &values_eq_treb_hz}, - {"Presence", EQ_PRESENCE, EQ_B_POSITION, &values_eq_db}, }; static EffectSettings rp500_eq_settings[] = { @@ -2823,23 +2823,23 @@ static Effect reverb_effect[] = { }; static Effect rp150_amp_effect[] = { - {NULL, AMP_ON_OFF, AMP_TYPE, AMP_POSITION, rp150_amp_group, G_N_ELEMENTS(rp150_amp_group)}, + {NULL, AMP_ON_OFF, AMP_TYPE, AMP_A_POSITION, rp150_amp_group, G_N_ELEMENTS(rp150_amp_group)}, {"Cabinet", -1, AMP_CAB_TYPE, AMP_CAB_POSITION, rp150_amp_cab_group, G_N_ELEMENTS(rp150_amp_cab_group)}, }; static Effect rp155_amp_effect[] = { - {NULL, AMP_ON_OFF, AMP_TYPE, AMP_POSITION, rp155_amp_group, G_N_ELEMENTS(rp155_amp_group)}, + {NULL, AMP_ON_OFF, AMP_TYPE, AMP_A_POSITION, rp155_amp_group, G_N_ELEMENTS(rp155_amp_group)}, {"Cabinet", -1, AMP_CAB_TYPE, AMP_CAB_POSITION, rp150_amp_cab_group, G_N_ELEMENTS(rp150_amp_cab_group)}, }; static Effect rp250_amp_effect[] = { - {NULL, AMP_ON_OFF, AMP_TYPE, AMP_POSITION, rp250_amp_group, G_N_ELEMENTS(rp250_amp_group)}, + {NULL, AMP_ON_OFF, AMP_TYPE, AMP_A_POSITION, rp250_amp_group, G_N_ELEMENTS(rp250_amp_group)}, {"Cabinet", -1, AMP_CAB_TYPE, AMP_CAB_POSITION, rp250_amp_cab_group, G_N_ELEMENTS(rp250_amp_cab_group)}, }; /* same cabs as rp250, but 3 new amp models */ static Effect rp255_amp_effect[] = { - {NULL, AMP_ON_OFF, AMP_TYPE, AMP_POSITION, rp255_amp_group, G_N_ELEMENTS(rp255_amp_group)}, + {NULL, AMP_ON_OFF, AMP_TYPE, AMP_A_POSITION, rp255_amp_group, G_N_ELEMENTS(rp255_amp_group)}, {"Cabinet", -1, AMP_CAB_TYPE, AMP_CAB_POSITION, rp250_amp_cab_group, G_N_ELEMENTS(rp250_amp_cab_group)}, }; @@ -2848,7 +2848,7 @@ static Effect rp355_select_amp_effect[] = { }; static Effect rp355_amp_effect_A[] = { - {NULL, AMP_ON_OFF, AMP_TYPE, AMP_POSITION, rp355_amp_group_A, G_N_ELEMENTS(rp355_amp_group_A)}, + {NULL, AMP_ON_OFF, AMP_TYPE, AMP_A_POSITION, rp355_amp_group_A, G_N_ELEMENTS(rp355_amp_group_A)}, {"Cabinet", -1, AMP_CAB_TYPE, AMP_CAB_POSITION, rp355_amp_cab_group, G_N_ELEMENTS(rp355_amp_cab_group)}, }; @@ -2858,19 +2858,19 @@ static Effect rp355_amp_effect_B[] = { }; static Effect rp500_amp_effect[] = { - {NULL, AMP_ON_OFF, AMP_TYPE, AMP_POSITION, rp500_amp_group, G_N_ELEMENTS(rp500_amp_group)}, + {NULL, AMP_ON_OFF, AMP_TYPE, AMP_A_POSITION, rp500_amp_group, G_N_ELEMENTS(rp500_amp_group)}, {"Cabinet", -1, AMP_CAB_TYPE, AMP_CAB_POSITION, rp500_amp_cab_group, G_N_ELEMENTS(rp500_amp_cab_group)}, }; static Effect rp1000_amp_effect[] = { {"Amp Loop", AMP_LOOP_ON_OFF, -1, AMP_LOOP_POSITION, NULL, -1}, {"Amp/Cab Bypass", AMP_BYPASS_ON_OFF, -1, AMP_BYPASS_POSITION, NULL, -1}, - {NULL, -1, AMP_TYPE, AMP_POSITION, rp1000_amp_group, G_N_ELEMENTS(rp1000_amp_group)}, + {NULL, -1, AMP_TYPE, AMP_A_POSITION, rp1000_amp_group, G_N_ELEMENTS(rp1000_amp_group)}, {NULL, -1, AMP_CAB_TYPE, AMP_CAB_POSITION, rp1000_amp_cab_group, G_N_ELEMENTS(rp1000_amp_cab_group)}, }; static Effect gnx3k_channel_1_effect[] = { - {"EQ Enable", AMP_EQ_ON_OFF, AMP_TYPE, AMP_POSITION, gnx3k_amp_group, G_N_ELEMENTS(gnx3k_amp_group)}, + {"EQ Enable", AMP_EQ_ON_OFF, AMP_TYPE, AMP_A_POSITION, gnx3k_amp_group, G_N_ELEMENTS(gnx3k_amp_group)}, {NULL, -1, AMP_CAB_TYPE, AMP_CAB_POSITION, gnx3k_amp_cab_group, G_N_ELEMENTS(gnx3k_amp_cab_group)}, {NULL, -1, -1, -1, gnx3k_ch1_cab_tuning_group, G_N_ELEMENTS(gnx3k_ch1_cab_tuning_group)}, {NULL, -1, -1, -1, gnx3k_ch1_amp_eq_group, G_N_ELEMENTS(gnx3k_ch1_amp_eq_group)}, @@ -3259,13 +3259,22 @@ static Modifier modifiers[] = { {"Dist Sustain", DIST_MP_SUSTAIN, DIST_POSITION, &values_0_to_99}, {"Dist Tone", DIST_MP_TONE, DIST_POSITION, &values_0_to_99}, {"Dist Volume", DIST_MP_VOLUME, DIST_POSITION, &values_0_to_99}, - {"Amp Channel Enable", AMP_ON_OFF, AMP_POSITION, &values_on_off}, - {"Amp Gain", AMP_GAIN, AMP_POSITION, &values_0_to_99}, - {"Amp Level", AMP_LEVEL, AMP_POSITION, &values_0_to_99}, + {"Amp Channel Enable", AMP_ON_OFF, AMP_A_POSITION, &values_on_off}, + {"Amp Gain", AMP_GAIN, AMP_A_POSITION, &values_0_to_99}, + {"Amp Level", AMP_LEVEL, AMP_A_POSITION, &values_0_to_99}, + {"Amp Channel Enable", AMP_ON_OFF, AMP_B_POSITION, &values_on_off}, + {"Amp Gain", AMP_GAIN, AMP_B_POSITION, &values_0_to_99}, + {"Amp Level", AMP_LEVEL, AMP_B_POSITION, &values_0_to_99}, {"EQ Enable", EQ_ENABLE, EQ_A_POSITION, &values_on_off}, {"EQ Bass", EQ_BASS, EQ_A_POSITION, &values_eq_db}, {"EQ Mid", EQ_MID, EQ_A_POSITION, &values_eq_db}, {"EQ Treb", EQ_TREB, EQ_A_POSITION, &values_eq_db}, + {"EQ Treb", EQ_PRESENCE, EQ_A_POSITION, &values_eq_db}, + {"EQ Enable", EQ_ENABLE, EQ_B_POSITION, &values_on_off}, + {"EQ Bass", EQ_BASS, EQ_B_POSITION, &values_eq_db}, + {"EQ Mid", EQ_MID, EQ_B_POSITION, &values_eq_db}, + {"EQ Treb", EQ_TREB, EQ_B_POSITION, &values_eq_db}, + {"EQ Treb", EQ_PRESENCE, EQ_B_POSITION, &values_eq_db}, {"Gate Enable", NOISEGATE_ON_OFF, NOISEGATE_POSITION, &values_on_off}, {"Gate Pluck Sens", NOISEGATE_SWELL_SENS, NOISEGATE_POSITION, &values_0_to_99}, {"Gate Threshold", NOISEGATE_GATE_TRESHOLD, NOISEGATE_POSITION, &values_0_to_99}, @@ -3853,10 +3862,10 @@ XmlSettings xml_settings[] = { {AMP_CHANNEL, AMP_CHANNEL_POSITION, "Amp Channel", &values_a_b, xml_amp_channel_labels, G_N_ELEMENTS(xml_amp_channel_labels)}, - {AMP_TYPE, AMP_POSITION, "Amp A Type", &values_amp_type, xml_amp_labels, G_N_ELEMENTS(xml_amp_labels)}, - {AMP_ON_OFF, AMP_POSITION, "Amp A Enable", &values_on_off, xml_on_off_labels, G_N_ELEMENTS(xml_on_off_labels)}, - {AMP_GAIN, AMP_POSITION, "Amp A Gain", &values_0_to_99,}, - {AMP_LEVEL, AMP_POSITION, "Amp A Level", &values_0_to_99,}, + {AMP_TYPE, AMP_A_POSITION, "Amp A Type", &values_amp_type, xml_amp_labels, G_N_ELEMENTS(xml_amp_labels)}, + {AMP_ON_OFF, AMP_A_POSITION, "Amp A Enable", &values_on_off, xml_on_off_labels, G_N_ELEMENTS(xml_on_off_labels)}, + {AMP_GAIN, AMP_A_POSITION, "Amp A Gain", &values_0_to_99,}, + {AMP_LEVEL, AMP_A_POSITION, "Amp A Level", &values_0_to_99,}, {AMP_TYPE, AMP_B_POSITION, "Amp B Type", &values_amp_type, xml_amp_labels, G_N_ELEMENTS(xml_amp_labels)}, {AMP_ON_OFF, AMP_B_POSITION, "Amp B Enable", &values_on_off, xml_on_off_labels, G_N_ELEMENTS(xml_on_off_labels)}, @@ -3996,8 +4005,8 @@ XmlSettings xml_settings[] = { {EQ_BASS, EQ_A_POSITION, "EQ A Bass", &values_eq_db,}, {EQ_MID, EQ_A_POSITION, "EQ A Mid", &values_eq_db,}, {EQ_TREB, EQ_A_POSITION, "EQ A Treb", &values_eq_db,}, - {EQ_MID_FREQ, EQ_A_POSITION, "EQ A Mid Freq", &values_eq_mid_hz,}, {EQ_PRESENCE, EQ_A_POSITION, "EQ A Presence", &values_eq_db,}, + {EQ_MID_FREQ, EQ_A_POSITION, "EQ A Mid Freq", &values_eq_mid_hz,}, {EQ_TREB_FREQ, EQ_A_POSITION, "EQ A Treb Freq", &values_eq_treb_hz,}, {EQ_ENABLE, EQ_B_POSITION, "EQ B Enable", &values_on_off, xml_on_off_labels, G_N_ELEMENTS(xml_on_off_labels)}, @@ -4005,8 +4014,8 @@ XmlSettings xml_settings[] = { {EQ_BASS, EQ_B_POSITION, "EQ B Bass", &values_eq_db,}, {EQ_MID, EQ_B_POSITION, "EQ B Mid", &values_eq_db,}, {EQ_TREB, EQ_B_POSITION, "EQ B Treb", &values_eq_db,}, - {EQ_MID_FREQ, EQ_B_POSITION, "EQ B Mid Freq", &values_eq_mid_hz,}, {EQ_PRESENCE, EQ_B_POSITION, "EQ B Presence", &values_eq_db,}, + {EQ_MID_FREQ, EQ_B_POSITION, "EQ B Mid Freq", &values_eq_mid_hz,}, {EQ_TREB_FREQ, EQ_B_POSITION, "EQ B Treb Freq", &values_eq_treb_hz,}, {TONE_LIB_TYPE, LIB_POSITION, "Tone Lib Type", &values_tone_lib_type, xml_tone_lib_labels, G_N_ELEMENTS(xml_tone_lib_labels)}, @@ -4124,7 +4133,7 @@ ModifierGroup *modifier_linkable_list() if (group[i].settings == NULL) group[i].settings_amt = 0; - g_message("ID: %d Position: %d Label: %s", id, position, modifier ? modifier->label : NULL); + g_message("ID: %4d Position: %2d Label: %s", id, position, modifier ? modifier->label : NULL); } modifier_group->group = group; diff --git a/gdigi.c b/gdigi.c index 4044796..2995bb6 100644 --- a/gdigi.c +++ b/gdigi.c @@ -250,7 +250,7 @@ void push_message(GString *msg) case RECEIVE_PARAMETER_VALUE: unpack_message(msg); SettingParam *param = setting_param_new_from_data(&msg->str[8], NULL); - g_message("ID: %d Position: %d Value: %d", param->id, param->position, param->value); + g_message("ID: %5d Position: %2d Value: %.1d", param->id, param->position, param->value); GDK_THREADS_ENTER(); apply_setting_param_to_gui(param); @@ -274,12 +274,59 @@ void push_message(GString *msg) } else { g_message("%d %d moved to %d %d", str[9], str[10], str[11], str[12]); } + case NOTIFY_MODIFIER_GROUP_CHANGED: + { + int i; + printf("\n"); + for (i = 0; i < msg->len; i++) { + printf(" %02x", (unsigned char) str[i]); + } + printf("\n"); + g_message("Modifier group id %d changed", + (str[9] << 8) | (str[10])); break; + } default: g_message("Received unhandled device notification 0x%x", str[11]); } g_string_free(msg, TRUE); return; + case RECEIVE_GLOBAL_PARAMETERS: + unpack_message(msg); + gint tot, n, x; + tot = (unsigned char)msg->str[9]; + for (n = 0; n < msg->len; n++) { + printf("%02x ",(unsigned char) msg->str[n]); + } + printf("\n"); + + n = 0; + x = 10; + do { + param = setting_param_new_from_data(&msg->str[x], &x); + g_message("Received global param ID: %5d Position: %2.1d Value: %6.1d", + param->id, param->position, param->value); + setting_param_free(param); + } while ( (x < msg->len) && n < tot); + + g_string_free(msg, TRUE); + return; + + + case RECEIVE_MODIFIER_LINKABLE_LIST: + unpack_message(msg); + tot = (unsigned char)msg->str[9]; + for (n = 0; n < msg->len; n++) { + printf("%02x ",(unsigned char) msg->str[n]); + } + printf("\n"); + + modifier_linkable_list(msg); + + g_string_free(msg, TRUE); + return; + + default: g_mutex_lock(message_queue_mutex); g_queue_push_tail(message_queue, msg); @@ -664,6 +711,7 @@ void set_option(guint id, guint position, guint value) ((id & 0xFF00) >> 8), (id & 0xFF), position); append_value(msg, value); + g_message("Sending id %d position %d value %d", id, position, value); send_message(RECEIVE_PARAMETER_VALUE, msg->str, msg->len); g_string_free(msg, TRUE); } @@ -1082,8 +1130,6 @@ static gboolean request_who_am_i(unsigned char *device_id, unsigned char *family *device_id = data->str[8]; *family_id = data->str[9]; *product_id = data->str[10]; - g_message("I am device id %d family %d product id %d.", - *device_id, *family_id, *product_id); g_string_free(data, TRUE); return TRUE; } diff --git a/gdigi.h b/gdigi.h index 1a46e4b..669e77b 100644 --- a/gdigi.h +++ b/gdigi.h @@ -315,7 +315,7 @@ enum { #define AMP_TYPE 2496 #define AMP_ON_OFF 265 -#define AMP_POSITION 8 +#define AMP_A_POSITION 8 #define AMP_B_POSITION 10 #define AMP_LOOP_ON_OFF 3649 @@ -427,7 +427,6 @@ enum { #define EQ_TREB_FREQ 3211 #define EQ_ENABLE 3212 - #define EQ_LOW_FREQ 3213 #define EQ_MID_FREQ_XXX 3214 #define EQ_HIGH_FREQ 3215 diff --git a/preset.c b/preset.c index 21ed711..bb26903 100644 --- a/preset.c +++ b/preset.c @@ -326,7 +326,8 @@ Preset *create_preset_from_data(GList *list) SettingParam *param = setting_param_new_from_data(&data->str[x], &x); n++; preset->params = g_list_prepend(preset->params, param); - g_message("%d ID %d Position %d Value %d", n, param->id, param->position, param->value); + g_message("%3d ID %4d Position %2d Value %6.1d", + n, param->id, param->position, param->value); } while ((x < data->len) && nparams = g_list_sort(preset->params, params_cmp); From 7781063407854761ee62ec2fe00f10461409f122 Mon Sep 17 00:00:00 2001 From: Tim LaBerge Date: Sun, 26 Feb 2012 21:27:54 -0800 Subject: [PATCH 04/12] Presence effect in wrong place for some devices. --- effects.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/effects.c b/effects.c index 2bb0c58..e8666f3 100644 --- a/effects.c +++ b/effects.c @@ -1001,9 +1001,9 @@ static EffectSettings gnx3k_ch1_amp_eq_settings[] = { {"Bass Level", AMP_BASS_LEVEL, AMP_A_POSITION, &values_eq_db}, {"Mid Freq", AMP_MID_FREQ, AMP_A_POSITION, &values_eq_mid_hz}, {"Mid Level", AMP_MID_LEVEL, AMP_A_POSITION, &values_eq_db}, - {"Presence", AMP_PRESENCE, AMP_A_POSITION, &values_eq_db}, {"Treb Freq", AMP_TREBLE_FREQ, AMP_A_POSITION, &values_eq_treb_hz}, {"Treb Level", AMP_TREBLE_LEVEL, AMP_A_POSITION, &values_eq_db}, + {"Presence", AMP_PRESENCE, AMP_A_POSITION, &values_eq_db}, {"Level", AMP_LEVEL, AMP_A_POSITION, &values_0_to_99}, }; @@ -1013,9 +1013,9 @@ static EffectSettings gnx3k_ch2_amp_eq_settings[] = { {"Bass Level", AMP_BASS_LEVEL, AMP_B_POSITION, &values_eq_db}, {"Mid Freq", AMP_MID_FREQ, AMP_B_POSITION, &values_eq_mid_hz}, {"Mid Level", AMP_MID_LEVEL, AMP_B_POSITION, &values_eq_db}, - {"Presence", AMP_PRESENCE, AMP_B_POSITION, &values_eq_db}, {"Treb Freq", AMP_TREBLE_FREQ, AMP_B_POSITION, &values_eq_treb_hz}, {"Treb Level", AMP_TREBLE_LEVEL, AMP_B_POSITION, &values_eq_db}, + {"Presence", AMP_PRESENCE, AMP_B_POSITION, &values_eq_db}, {"Level", AMP_LEVEL, AMP_B_POSITION, &values_0_to_99}, }; From 5c42cad5e72cb99c3ce63dc6078b15464cf5a03a Mon Sep 17 00:00:00 2001 From: Tim LaBerge Date: Sun, 26 Feb 2012 21:52:27 -0800 Subject: [PATCH 05/12] Add labels to debug messages. Add a global settings settings to the xml settings array. Start adding label strings to the debug messages. This needs cleaning up, but it should help. --- effects.c | 8 ++++++++ gdigi.c | 14 +++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/effects.c b/effects.c index e8666f3..2e86d6b 100644 --- a/effects.c +++ b/effects.c @@ -4024,6 +4024,14 @@ XmlSettings xml_settings[] = { {FX_LIB_LEVEL_MAX1, LIB_POSITION, "FxLibLvlMax1", &values_0_to_99,}, {FX_LIB_LEVEL_MAX2, LIB_POSITION, "FxLibLvlMax2", &values_0_to_99,}, {FX_LIB_LEVEL_MAX3, LIB_POSITION, "FxLibLvlMax3", &values_0_to_99,}, + + // Global settings, not part of presets or standard XML. + {TUNING_REFERENCE, GLOBAL_POSITION, "Tuning Reference", &values_0_to_99,}, + {USB_AUDIO_PLAYBACK_MIX, GLOBAL_POSITION, "USB Audio Playback Mix", &values_0_to_99,}, + {USB_AUDIO_LEVEL, GLOBAL_POSITION, "USB Audio Level", &values_0_to_99,}, + {GUI_MODE_ON_OFF, GLOBAL_POSITION, "GUI Mode", &values_0_to_99,}, + {EXP_PEDAL_LEVEL, GLOBAL_POSITION, "EXP Pedal Level", &values_0_to_99,}, + {STOMP_MODE, GLOBAL_POSITION, "Stomp Mode", &values_0_to_99,}, }; diff --git a/gdigi.c b/gdigi.c index 2995bb6..c7c12c3 100644 --- a/gdigi.c +++ b/gdigi.c @@ -218,6 +218,9 @@ MessageID get_message_id(GString *msg) return -1; } +#include "gdigi_xml.h" +extern XmlSettings *get_xml_settings (guint id, guint position); + void push_message(GString *msg) { MessageID msgid = get_message_id(msg); @@ -238,6 +241,7 @@ void push_message(GString *msg) } g_message("Received %s", get_message_name(msgid)); + SettingParam *param; switch (msgid) { case ACK: g_string_free(msg, TRUE); @@ -248,9 +252,12 @@ void push_message(GString *msg) return; case RECEIVE_PARAMETER_VALUE: + { unpack_message(msg); - SettingParam *param = setting_param_new_from_data(&msg->str[8], NULL); - g_message("ID: %5d Position: %2d Value: %.1d", param->id, param->position, param->value); + param = setting_param_new_from_data(&msg->str[8], NULL); + XmlSettings *xml = get_xml_settings(param->id, param->position); + char *label = xml ? xml->label : "NULL"; + g_message("ID: %5d Position: %2d Value: %.1d: %s", param->id, param->position, param->value, label); GDK_THREADS_ENTER(); apply_setting_param_to_gui(param); @@ -259,6 +266,7 @@ void push_message(GString *msg) setting_param_free(param); g_string_free(msg, TRUE); return; + } case RECEIVE_DEVICE_NOTIFICATION: unpack_message(msg); @@ -304,7 +312,7 @@ void push_message(GString *msg) x = 10; do { param = setting_param_new_from_data(&msg->str[x], &x); - g_message("Received global param ID: %5d Position: %2.1d Value: %6.1d", + g_message("Received global param ID: %5d Position: %2.1d Value: %6.1d: %s", param->id, param->position, param->value); setting_param_free(param); } while ( (x < msg->len) && n < tot); From 122bbcd82324f9de9b82c3f853b2ee4897808d03 Mon Sep 17 00:00:00 2001 From: Tim LaBerge Date: Sat, 31 Mar 2012 18:48:22 -0700 Subject: [PATCH 06/12] More logging changes. --- effects.c | 13 ++-- gdigi.c | 164 +++++++++++++++++++++++++++++++++++++++------------ gdigi.h | 26 +++++++- gui.c | 12 ++-- preset.c | 33 +++++++---- preset_xml.c | 14 +++-- 6 files changed, 193 insertions(+), 69 deletions(-) diff --git a/effects.c b/effects.c index 2e86d6b..94c7d8d 100644 --- a/effects.c +++ b/effects.c @@ -709,8 +709,8 @@ static EffectValues values_rp_mix = { }; static EffectSettings usb_settings[] = { - {"USB/RP Mix", USB_AUDIO_PLAYBACK_MIX, USB_POSITION, &values_rp_mix}, - {"USB Level", USB_AUDIO_LEVEL, USB_POSITION, &values_m12_to_24}, + {"USB/RP Mix", USB_AUDIO_PLAYBACK_MIX, GLOBAL_POSITION, &values_rp_mix}, + {"USB Level", USB_AUDIO_LEVEL, GLOBAL_POSITION, &values_m12_to_24}, }; static EffectSettings misc_settings[] = { @@ -4119,7 +4119,10 @@ ModifierGroup *modifier_linkable_list() modifier_group->type = EXP_TYPE; modifier_group->position = EXP_POSITION; - g_message("Group %d count %d", group_id, count); + debug_msg(DEBUG_MSG2HOST|DEBUG_GROUP, + "RECEIVE_MODIFIER_LINKABLE_LIST: Group %d count %d", + group_id, count); + EffectGroup *group = g_slice_alloc(count * sizeof(EffectGroup)); for (i=0; ilabel : NULL); + debug_msg(DEBUG_MSG2HOST|DEBUG_GROUP, + "ID: %4d Position: %2d Label: %s", + id, position, modifier ? modifier->label : NULL); } modifier_group->group = group; diff --git a/gdigi.c b/gdigi.c index c7c12c3..dbcfc05 100644 --- a/gdigi.c +++ b/gdigi.c @@ -35,6 +35,63 @@ static GQueue *message_queue = NULL; static GMutex *message_queue_mutex = NULL; static GCond *message_queue_cond = NULL; +static guint DebugFlags; + +gboolean +debug_flag_is_set (debug_flags_t flags) +{ + if (DebugFlags & flags) { + return TRUE; + } + return FALSE; +} + +gboolean set_debug_flags (const gchar *option_name, const gchar *value, + gpointer data, GError **error) +{ + if (strchr(value, 'd')) { + DebugFlags |= DEBUG_MSG2DEV; + } + if (strchr(value, 'h')) { + DebugFlags |= DEBUG_MSG2HOST; + } + if (strchr(value, 's')) { + DebugFlags |= DEBUG_STARTUP; + } + if (strchr(value, 'H')) { + DebugFlags |= DEBUG_HEX; + } + if (strchr(value, 'g')) { + DebugFlags |= DEBUG_GROUP; + } + if (strchr(value, 'x')) { + DebugFlags |= DEBUG_XML; + } + if (strchr(value, 'v')) { + DebugFlags |= DEBUG_VERBOSE; + } + if (strchr(value, 'a')) { + DebugFlags = -1; + } + + return TRUE; +} + +void +debug_msg (debug_flags_t flags, char *fmt, ...) +{ + char buf[1024]; + if (flags & DebugFlags) { + va_list ap; + + va_start(ap, fmt); + vsnprintf(buf, 1024, fmt, ap); + va_end(ap); + + g_message("%s", buf); + } +} + /** * Registers an error quark for gdigi if necessary. * @@ -225,21 +282,23 @@ void push_message(GString *msg) { MessageID msgid = get_message_id(msg); if (((unsigned char)msg->str[0] == 0xF0) && ((unsigned char)msg->str[msg->len-1] == 0xF7)) - g_message("Pushing correct message!"); + debug_msg(DEBUG_VERBOSE, "Pushing correct message!"); else g_warning("Pushing incorrect message!"); int x; - for (x = 0; xlen; x++) { - if (x && (x % 26) == 0) { + if (debug_flag_is_set(DEBUG_HEX)) { + for (x = 0; xlen; x++) { + if (x && (x % 26) == 0) { + printf("\n"); + } + printf("%02x ", (unsigned char)msg->str[x]); + } + if (x % 26) { printf("\n"); } - printf("%02x ", (unsigned char)msg->str[x]); } - if (x % 26) { - printf("\n"); - } - g_message("Received %s", get_message_name(msgid)); + debug_msg(DEBUG_VERBOSE, "Received %s", get_message_name(msgid)); SettingParam *param; switch (msgid) { @@ -248,6 +307,7 @@ void push_message(GString *msg) return; case NACK: + g_warning("Received NACK!"); g_string_free(msg, TRUE); return; @@ -257,7 +317,11 @@ void push_message(GString *msg) param = setting_param_new_from_data(&msg->str[8], NULL); XmlSettings *xml = get_xml_settings(param->id, param->position); char *label = xml ? xml->label : "NULL"; - g_message("ID: %5d Position: %2d Value: %.1d: %s", param->id, param->position, param->value, label); + debug_msg(DEBUG_MSG2HOST, + "RECEIVE_PARAMETER_VALUE: ID: %5d Position: %2d " + "Value: %6.1d: %s", + param->id, param->position, + param->value, label); GDK_THREADS_ENTER(); apply_setting_param_to_gui(param); @@ -274,28 +338,40 @@ void push_message(GString *msg) switch (str[8]) { case NOTIFY_PRESET_MOVED: if (str[11] == PRESETS_EDIT_BUFFER && str[12] == 0) { - g_message("Loaded preset %d from bank %d", str[10], str[9]); GDK_THREADS_ENTER(); g_timeout_add(0, apply_current_preset_to_gui, NULL); GDK_THREADS_LEAVE(); + debug_msg(DEBUG_MSG2HOST, + "RECEIVE_DEVICE_NOTIFICATION: Loaded preset " + "%d from bank %d", + str[10], str[9]); } else { - g_message("%d %d moved to %d %d", str[9], str[10], str[11], str[12]); + debug_msg(DEBUG_MSG2HOST, + "RECEIVE_DEVICE_NOTIFICATION: %d %d moved to " + "%d %d", + str[9], str[10], + str[11], str[12]); } case NOTIFY_MODIFIER_GROUP_CHANGED: { int i; - printf("\n"); - for (i = 0; i < msg->len; i++) { - printf(" %02x", (unsigned char) str[i]); + if (debug_flag_is_set(DEBUG_HEX)) { + printf("\n"); + for (i = 0; i < msg->len; i++) { + printf(" %02x", (unsigned char) str[i]); + } + printf("\n"); } - printf("\n"); - g_message("Modifier group id %d changed", - (str[9] << 8) | (str[10])); + debug_msg(DEBUG_MSG2HOST, + "NOTIFY_MODIFIER_GROUP_CHANGED: Modifier group " + "id %d changed", + (str[9] << 8) | (str[10])); break; } default: - g_message("Received unhandled device notification 0x%x", str[11]); + g_warning("Received unhandled device notification 0x%x", + str[11]); } g_string_free(msg, TRUE); return; @@ -303,17 +379,22 @@ void push_message(GString *msg) unpack_message(msg); gint tot, n, x; tot = (unsigned char)msg->str[9]; - for (n = 0; n < msg->len; n++) { - printf("%02x ",(unsigned char) msg->str[n]); + if (debug_flag_is_set(DEBUG_HEX)) { + for (n = 0; n < msg->len; n++) { + printf("%02x ",(unsigned char) msg->str[n]); + } + printf("\n"); } - printf("\n"); n = 0; x = 10; do { param = setting_param_new_from_data(&msg->str[x], &x); - g_message("Received global param ID: %5d Position: %2.1d Value: %6.1d: %s", - param->id, param->position, param->value); + debug_msg(DEBUG_MSG2HOST, + "RECEIVE_GLOBAL_PARAMETERS ID: %5d " + "Position: %2.1d Value: %6.1d: %s", + param->id, + param->position, param->value, "XXX"); setting_param_free(param); } while ( (x < msg->len) && n < tot); @@ -324,10 +405,13 @@ void push_message(GString *msg) case RECEIVE_MODIFIER_LINKABLE_LIST: unpack_message(msg); tot = (unsigned char)msg->str[9]; - for (n = 0; n < msg->len; n++) { - printf("%02x ",(unsigned char) msg->str[n]); + + if (debug_flag_is_set(DEBUG_HEX)) { + for (n = 0; n < msg->len; n++) { + printf("%02x ",(unsigned char) msg->str[n]); + } + printf("\n"); } - printf("\n"); modifier_linkable_list(msg); @@ -461,7 +545,8 @@ void send_message(gint procedure, gchar *data, gint len) g_string_append_printf(msg, "%c\xF7", calculate_checksum(&msg->str[1], msg->len - 1)); - g_message("Sending message %s len %d", get_message_name(procedure), len); + debug_msg(DEBUG_VERBOSE, "Sending message %s len %d", + get_message_name(procedure), len); send_data(msg->str, msg->len); g_string_free(msg, TRUE); @@ -682,7 +767,7 @@ SectionID get_genetx_section_id(gint version, gint type) } } - g_message("This version of gdigi don't know what to do with this " + g_warning("This version of gdigi don't know what to do with this " "GeNetX version (%d) and type (%d)", version, type); return -1; @@ -698,7 +783,8 @@ SectionID get_genetx_section_id(gint version, gint type) void get_option(guint id, guint position) { GString *msg = g_string_sized_new(9); - g_message("Requesting parameter id %d position %d", id, position); + debug_msg(DEBUG_MSG2DEV, "REQUEST_PARAMETER_VALUE: id %d position %d", + id, position); g_string_append_printf(msg, "%c%c%c", ((id & 0xFF00) >> 8), (id & 0xFF), position); @@ -719,7 +805,8 @@ void set_option(guint id, guint position, guint value) ((id & 0xFF00) >> 8), (id & 0xFF), position); append_value(msg, value); - g_message("Sending id %d position %d value %d", id, position, value); + debug_msg(DEBUG_MSG2DEV, "Sending id %d position %d value %d", + id, position, value); send_message(RECEIVE_PARAMETER_VALUE, msg->str, msg->len); g_string_free(msg, TRUE); } @@ -930,7 +1017,7 @@ GList *get_message_list(MessageID id) } while (amt) { - g_message("%d messages left", amt); + debug_msg(DEBUG_VERBOSE, "%d messages left", amt); data = g_queue_pop_nth(message_queue, x); if (data == NULL) { g_cond_wait(message_queue_cond, message_queue_mutex); @@ -1185,6 +1272,9 @@ static void request_device_configuration() static GOptionEntry options[] = { {"device", 'd', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_STRING, &device_port, "MIDI device port to use", NULL}, + {"debug-flags", 'D', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_CALLBACK, set_debug_flags, + "Set debug flags: any combination of a, d, h, s:\n", + NULL}, {NULL} }; @@ -1229,7 +1319,7 @@ int main(int argc, char *argv[]) { g_option_context_add_group(context, gtk_get_option_group(TRUE)); if (!g_option_context_parse(context, &argc, &argv, &error)) { - g_message("option parsing failed: %s\n", error->message); + g_warning("option parsing failed: %s\n", error->message); g_error_free(error); g_option_context_free(context); exit(EXIT_FAILURE); @@ -1256,9 +1346,9 @@ int main(int argc, char *argv[]) { device_port = g_strdup_printf("hw:%d,0,0", GPOINTER_TO_INT(device->data)); g_list_free(devices); - g_message("Found device %s", device_port); + debug_msg(DEBUG_STARTUP, "Found device %s\n", device_port); } else { - g_message("Using device %s", device_port); + debug_msg(DEBUG_STARTUP, "Using device %s\n", device_port); } g_option_context_free(context); @@ -1286,14 +1376,14 @@ int main(int argc, char *argv[]) { if (device != NULL) { /* enable GUI mode */ - set_option(GUI_MODE_ON_OFF, USB_POSITION, 1); + set_option(GUI_MODE_ON_OFF, GLOBAL_POSITION, 1); gui_create(device); gtk_main(); gui_free(); /* disable GUI mode */ - set_option(GUI_MODE_ON_OFF, USB_POSITION, 0); + set_option(GUI_MODE_ON_OFF, GLOBAL_POSITION, 0); } } } @@ -1308,7 +1398,7 @@ int main(int argc, char *argv[]) { } if (message_queue != NULL) { - g_message("%d unread messages in queue", + g_warning("%d unread messages in queue", g_queue_get_length(message_queue)); g_queue_foreach(message_queue, (GFunc) message_free_func, NULL); g_queue_free(message_queue); diff --git a/gdigi.h b/gdigi.h index 669e77b..10032a6 100644 --- a/gdigi.h +++ b/gdigi.h @@ -22,6 +22,19 @@ #ifndef DOXYGEN_SHOULD_SKIP_THIS +typedef enum { + DEBUG_MSG2DEV = (1 << 0), // Device bound messages. + DEBUG_MSG2HOST = (1 << 1), // Host bound messages. + DEBUG_STARTUP = (1 << 2), + DEBUG_GROUP = (1 << 3), // Modifier group + DEBUG_HEX = (1 << 4), // Dump message contents in hex. + DEBUG_XML = (1 << 5), + DEBUG_VERBOSE = (1 << 6), +} debug_flags_t; + +void debug_msg (debug_flags_t, char *fmt, ...); +gboolean debug_flag_is_set (debug_flags_t flag); + #define GNX_CHANNEL_POSITION 7 #define GNX_CHANNEL_AMP 260 #define GNX_WARP 261 @@ -885,7 +898,10 @@ enum { #define TONE_LIB_TYPE 8704 #define FX_LIB_TYPE 8705 -#define FX_LIB_LEVEL 8706 +#define FX_LIB_LEVEL 8706 // This influences pitch shift mix, delay level, + // and reverb level, in proportion, as + // specified by FX_LIB_LEVEL_MAX1,2,3. + // #define FX_LIB_LEVEL_MAX1 8708 #define FX_LIB_LEVEL_MAX2 8710 #define FX_LIB_LEVEL_MAX3 8712 @@ -962,12 +978,18 @@ enum { EFFECTS_LIB_CUSTOM = 1856 }; -#define USB_POSITION 0 +#define GLOBAL_POSITION 0 + +#define TUNING_REFERENCE 12288 + #define USB_AUDIO_PLAYBACK_MIX 12297 #define USB_AUDIO_LEVEL 12307 #define GUI_MODE_ON_OFF 12298 +#define EXP_PEDAL_LEVEL 12300 +#define STOMP_MODE 12370 + #endif /* DOXYGEN_SHOULD_SKIP_THIS */ typedef enum { diff --git a/gui.c b/gui.c index 8843f09..f0bc7e9 100644 --- a/gui.c +++ b/gui.c @@ -249,7 +249,7 @@ static gboolean custom_value_output_cb(GtkSpinButton *spin, EffectValues *values if (values->type & VALUE_TYPE_EXTRA) { values = values->extra; } else { - g_message("custom_value_output_cb called with out of bounds value"); + g_warning("custom_value_output_cb called with out of bounds value"); return FALSE; } } @@ -993,7 +993,7 @@ static void action_open_preset_cb(GtkAction *action) for (x=0; xmessage); + g_warning("building menus failed: %s", error->message); g_error_free(error); error = NULL; } @@ -1353,9 +1353,6 @@ void gui_create(Device *device) g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_main_quit), NULL); - /* Not part of the preset, but update from the device. */ - get_option(USB_AUDIO_LEVEL, USB_POSITION); - get_option(USB_AUDIO_PLAYBACK_MIX, USB_POSITION); } /** @@ -1414,7 +1411,8 @@ gboolean unsupported_device_dialog(Device **device) if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { gint number = gtk_combo_box_get_active(GTK_COMBO_BOX(combo_box)); if (number != -1 && number name); + g_message("Starting %s compability mode", + supported_devices[number]->name); *device = supported_devices[number]; gtk_widget_destroy(dialog); return TRUE; diff --git a/preset.c b/preset.c index bb26903..f5e056d 100644 --- a/preset.c +++ b/preset.c @@ -69,7 +69,7 @@ static void XMLCALL start(void *data, const char *el, const char **attr) { if (g_strcmp0(el, "Params") == 0) { ad->section = SECTION_PARAMS; if (ad->preset->params != NULL) - g_message("Params aleady exists!"); + g_warning("Params aleady exists!"); } else if (g_strcmp0(el, "Param") == 0) { SettingParam *param = setting_param_new(); ad->preset->params = g_list_prepend(ad->preset->params, param); @@ -84,7 +84,7 @@ static void XMLCALL start(void *data, const char *el, const char **attr) { } else if (g_strcmp0(el, "Genetx") == 0) { ad->section = SECTION_GENETX; if (ad->preset->genetxs != NULL) - g_message("Genetx already exists!"); + g_warning("Genetx already exists!"); } else if (g_strcmp0(el, "GenetxModel") == 0) { SettingGenetx *genetx = setting_genetx_new(); ad->preset->genetxs = g_list_prepend(ad->preset->genetxs, genetx); @@ -160,7 +160,7 @@ static void XMLCALL text_cb(void *data, const char* text, int len) } else if (g_strcmp0(value, "Version2") == 0) { genetx->version = GENETX_VERSION_2; } else { - g_message("Unknown GeNetX version: %s", value); + g_warning("Unknown GeNetX version: %s", value); } break; case PARSER_TYPE_GENETX_TYPE: @@ -169,7 +169,7 @@ static void XMLCALL text_cb(void *data, const char* text, int len) } else if (g_strcmp0(value, "Cabinet") == 0) { genetx->type = GENETX_TYPE_CABINET; } else { - g_message("Unknown GeNetX type: %s", value); + g_warning("Unknown GeNetX type: %s", value); } break; case PARSER_TYPE_GENETX_CHANNEL: @@ -178,7 +178,7 @@ static void XMLCALL text_cb(void *data, const char* text, int len) } else if (g_strcmp0(value, "Channel2") == 0) { genetx->channel = GENETX_CHANNEL2; } else { - g_message("Unknown GeNetX channel: %s", value); + g_warning("Unknown GeNetX channel: %s", value); } break; case PARSER_TYPE_GENETX_NAME: @@ -219,7 +219,7 @@ Preset *create_preset_from_xml_file(gchar *filename, GError **error) gchar *contents; if (g_file_get_contents(filename, &contents, NULL, &err) == FALSE) { - g_message("Failed to get %s contents: %s", filename, err->message); + g_warning("Failed to get %s contents: %s", filename, err->message); *error = g_error_copy(err); g_error_free(err); return NULL; @@ -308,12 +308,16 @@ Preset *create_preset_from_data(GList *list) modified = (unsigned char)data->str[11+strlen(name)]; if ((bank == PRESETS_EDIT_BUFFER) && (number == 0)) { - g_message("Received current edit buffer"); + debug_msg(DEBUG_MSG2HOST, + "RECEIVE_PRESET_START: current edit buffer"); } else { - g_message("Received preset %d from bank %d", number, bank); + debug_msg(DEBUG_MSG2HOST, + "RECEIVE_PRESET_START: preset %d from bank %d", + number, bank); } - g_message("Modified flag: %d Name: %s", modified, name); + debug_msg(DEBUG_MSG2HOST, "Name: %s, %sodified", + name, modified ? "M" : "Not m"); preset->name = name; break; case RECEIVE_PRESET_PARAMETERS: @@ -326,16 +330,19 @@ Preset *create_preset_from_data(GList *list) SettingParam *param = setting_param_new_from_data(&data->str[x], &x); n++; preset->params = g_list_prepend(preset->params, param); - g_message("%3d ID %4d Position %2d Value %6.1d", - n, param->id, param->position, param->value); + debug_msg(DEBUG_MSG2HOST, "%3d ID %4d Position %2d " + "Value %6.1d", + n, param->id, param->position, + param->value); } while ((x < data->len) && nparams = g_list_sort(preset->params, params_cmp); break; case RECEIVE_PRESET_END: break; default: - g_message("Unhandled message in preset messages list"); + g_warning("Unhandled message 0x%x in preset messages list", + get_message_id(data)); } } diff --git a/preset_xml.c b/preset_xml.c index a5bd749..69b9d07 100644 --- a/preset_xml.c +++ b/preset_xml.c @@ -57,11 +57,12 @@ map_xml_value(XmlSettings *xml, gint value) switch (xml->values->type) { case VALUE_TYPE_LABEL: if ((xml->values == &values_on_off) && (value > 1)) { - g_message("Skipping modifier->label %s\n", xml->label); + g_warning("Skipping modifier->label %s\n", xml->label); return NULL; } if (value > xml->values->max || value < xml->values->min) { - g_message("%s value %d out of range %0.1f %0.1f", xml->label, value, xml->values->min, xml->values->max); + g_warning("%s value %d out of range %0.1f %0.1f", + xml->label, value, xml->values->min, xml->values->max); } { XmlLabel *labels = xml->xml_labels; @@ -144,7 +145,7 @@ write_preset_to_xml(Preset *preset, gchar *filename) SettingParam *param = (SettingParam *) iter_params->data; if (param->id == last_id && param->position == last_position) { - g_message("Skipping duplicate parameter id %d position %d", + g_warning("Skipping duplicate parameter id %d position %d", last_id, last_position); iter_params = iter_params->next; continue; @@ -208,8 +209,9 @@ write_preset_to_xml(Preset *preset, gchar *filename) { char *textp = map_xml_value(xml, param->value); if (!textp) { - g_message("Unable to map %s value %d for id %d position %d", - xml->label, param->value, param->id, param->position); + g_warning("Unable to map %s value %d for id %d position %d", + xml->label, param->value, param->id, + param->position); textp = ""; } rc = xmlTextWriterWriteElement(writer, BAD_CAST "Text", @@ -237,7 +239,7 @@ write_preset_to_xml(Preset *preset, gchar *filename) break; default: - g_message("Unhandled value type %d", type); + g_warning("Unhandled value type %d", type); break; } } From 1205a1639d4e6f40e3be7b55bc20d2330a9ba735 Mon Sep 17 00:00:00 2001 From: Tim LaBerge Date: Sat, 31 Mar 2012 17:45:12 -0700 Subject: [PATCH 07/12] Add 'Label' to modifier group log message. --- effects.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/effects.c b/effects.c index 94c7d8d..4da604a 100644 --- a/effects.c +++ b/effects.c @@ -4145,7 +4145,7 @@ ModifierGroup *modifier_linkable_list() group[i].settings_amt = 0; debug_msg(DEBUG_MSG2HOST|DEBUG_GROUP, - "ID: %4d Position: %2d Label: %s", + "ID: %4d Position: %2d: %s", id, position, modifier ? modifier->label : NULL); } From ea803205317a8e34f77482c65174328ea19ede4d Mon Sep 17 00:00:00 2001 From: Tim LaBerge Date: Fri, 6 Apr 2012 08:57:08 -0700 Subject: [PATCH 08/12] Human readable debug Leverage the code that writes a preset to XML so that messages can be displayed in a human readable format. E.g., (6, 2432, 1280) Distortion: Dist Type: Screamer The 3-tuple is position, id, value, which is followed by the colon separated decode of the position, id, and the mapped value. --- effects.c | 47 +++++++++++++++++- effects.h | 1 + gdigi.c | 133 ++++++++++++++++++++++++++++++++++++++++++++------- gdigi.h | 3 +- gdigi_xml.h | 4 +- preset.c | 9 ++-- preset_xml.c | 16 ++----- 7 files changed, 177 insertions(+), 36 deletions(-) diff --git a/effects.c b/effects.c index 4da604a..89ca4e5 100644 --- a/effects.c +++ b/effects.c @@ -3970,7 +3970,7 @@ XmlSettings xml_settings[] = { {WAH_ON_OFF, WAH_POSITION, "Wah Enable", &values_on_off, xml_on_off_labels, G_N_ELEMENTS(xml_on_off_labels)}, {WAH_PEDAL_POSITION, WAH_POSITION, "Wah Position", &values_0_to_99,}, {WAH_VOLUME_BOOST, WAH_POSITION, "Wah Vol. Boost", &values_db_boost,}, - {MOD_TYPE, MOD_POSITION, "Mod Type", &values_0_to_99,}, // ??? + //{MOD_TYPE, MOD_POSITION, "Mod Type", &values_0_to_99,}, // ??? {PRESET_LEVEL, PRESET_POSITION, "Preset Level", &values_0_to_99,}, @@ -4034,8 +4034,51 @@ XmlSettings xml_settings[] = { {STOMP_MODE, GLOBAL_POSITION, "Stomp Mode", &values_0_to_99,}, }; - guint n_xml_settings = G_N_ELEMENTS(xml_settings); + +gchar *Positions[] = { + [ GLOBAL_POSITION ] = "Global", + [ PICKUP_POSITION ] = "Pickup", + [ WAH_POSITION ] = "Wah", + [ COMP_POSITION ] = "Compressor", + [ GNX3K_WHAM_POSITION ] = "Gnx3K Wham", + [ DIST_POSITION ] = "Distortion", + [ AMP_CHANNEL_POSITION ] = "Amp Channel", + [ GNX_CHANNEL_POSITION ] = "Gnx Channel", + [ AMP_A_POSITION ] = "Amp A", + [ AMP_CAB_POSITION ] = "Amp Cab A", + [ AMP_B_POSITION ] = "Amp B", + [ AMP_CAB_B_POSITION ] = "Amp Cab B", + [ NOISEGATE_POSITION ] = "Noise Gate", + [ VOLUME_PRE_FX_POSITION ] = "Volume Pre Fx", + [ CHORUSFX_POSITION ] = "Chorus Fx", + [ DELAY_POSITION ] = "Delay", + [ REVERB_POSITION ] = "Reverb", + [ VOLUME_POST_FX_POSITION ] = "Volume Post Fx", + [ PRESET_POSITION ] = "Preset", + [ EXP_POSITION ] = "Expression", + [ WAH_POSITION_MIN_MAX ] = "Wah Min Max", + [ VSWITCH_ASSIGN_POSITION ] = "Vswitch", + [ LFO1_POSITION ] = "LFO 1", + [ LFO2_POSITION ] = "LFO 2", + [ EQ_A_POSITION ] = "EQ A", + [ EQ_B_POSITION ] = "EQ B", + [ LIB_POSITION ] = "Library", + [ AMP_LOOP_POSITION ] = "Amp Loop", +}; + +guint max_position = G_N_ELEMENTS(Positions); + +gchar * +get_position (guint position) +{ + if (position > max_position) { + return ""; + } + + return Positions[position]; +} + #endif /* DOXYGEN_SHOULD_SKIP_THIS */ /** diff --git a/effects.h b/effects.h index 3ffddce..9f7860c 100644 --- a/effects.h +++ b/effects.h @@ -116,6 +116,7 @@ typedef struct { gint n_banks; } Device; +gchar *get_position(guint position); ModifierGroup *modifier_linkable_list(); void modifier_group_free(ModifierGroup *modifier_group); void get_values_info(EffectValues *values, diff --git a/gdigi.c b/gdigi.c index dbcfc05..61b9357 100644 --- a/gdigi.c +++ b/gdigi.c @@ -21,6 +21,7 @@ #include #include #include "gdigi.h" +#include "gdigi_xml.h" #include "gui.h" static unsigned char device_id = 0x7F; @@ -55,6 +56,9 @@ gboolean set_debug_flags (const gchar *option_name, const gchar *value, if (strchr(value, 'h')) { DebugFlags |= DEBUG_MSG2HOST; } + if (strchr(value, 'm')) { + DebugFlags |= DEBUG_MSG2DEV|DEBUG_MSG2HOST|DEBUG_GROUP; + } if (strchr(value, 's')) { DebugFlags |= DEBUG_STARTUP; } @@ -88,10 +92,105 @@ debug_msg (debug_flags_t flags, char *fmt, ...) vsnprintf(buf, 1024, fmt, ap); va_end(ap); - g_message("%s", buf); + fprintf(stderr, "%s\n", buf); } } +/* + * Format a value according to the xml setting. + * Returns an allocated buffer that must be freed by the caller. + */ +GString * +format_value (XmlSettings *xml, guint value) +{ + GString *buf = g_string_sized_new(1); + EffectValues *values = NULL; + ValueType vtype; + gchar *suffix = ""; + gdouble step = 1.0; + gint offset = 0; + gboolean decimal = FALSE; + + values = xml->values; + vtype = values->type; + while ((vtype & VALUE_TYPE_EXTRA) && value_is_extra(values, value)) { + values = values->extra; + vtype = values->type; + } + vtype &= ~VALUE_TYPE_EXTRA; + + if (vtype & VALUE_TYPE_OFFSET) { + offset = values->offset; + vtype &= ~VALUE_TYPE_OFFSET; + } + + if (vtype & VALUE_TYPE_STEP) { + step = values->step; + vtype &= ~VALUE_TYPE_STEP; + } + + if (vtype & VALUE_TYPE_SUFFIX) { + suffix = values->suffix; + vtype &= ~VALUE_TYPE_SUFFIX; + } + + if (vtype & VALUE_TYPE_DECIMAL) { + decimal = TRUE; + vtype &= ~VALUE_TYPE_DECIMAL; + } + + switch (vtype) { + case VALUE_TYPE_LABEL: + { + char *textp = map_xml_value(xml, value); + if (!textp) { + g_warning("Unable to map %s value %d for id %d position %d", + xml->label, value, xml->id, xml->position); + textp = ""; + } + g_string_printf(buf, "%s", textp); + break; + } + case VALUE_TYPE_PLAIN: + { + if (decimal) { + double dvalue = (value + offset) * step; + g_string_printf(buf, "%0.2f%s", dvalue, suffix); + } else { + gint ivalue = (value + offset) * step; + g_string_printf(buf, "%d%s", ivalue, suffix); + } + break; + } + case VALUE_TYPE_NONE: + g_string_printf(buf, "%s", ""); + break; + + default: + g_warning("Unhandled value type %d", vtype); + break; + } + + return buf; +} + +GString * +format_ipv (guint id, guint pos, guint val) +{ + GString *buf = g_string_sized_new(1); + GString *vec_buf = g_string_sized_new(1); + XmlSettings *xml = get_xml_settings(id, pos); + GString *val_buf = format_value(xml, val); + + g_string_printf(vec_buf, "(%d, %d, %d)", pos, id, val); + g_string_printf(buf, "%-16s %s: %s: %s", + vec_buf->str, + get_position(pos), xml->label, val_buf->str); + g_string_free(vec_buf, TRUE); + g_string_free(val_buf, TRUE); + return buf; +} + /** * Registers an error quark for gdigi if necessary. * @@ -275,10 +374,7 @@ MessageID get_message_id(GString *msg) return -1; } -#include "gdigi_xml.h" -extern XmlSettings *get_xml_settings (guint id, guint position); - -void push_message(GString *msg) +void push_message (GString *msg) { MessageID msgid = get_message_id(msg); if (((unsigned char)msg->str[0] == 0xF0) && ((unsigned char)msg->str[msg->len-1] == 0xF7)) @@ -315,13 +411,14 @@ void push_message(GString *msg) { unpack_message(msg); param = setting_param_new_from_data(&msg->str[8], NULL); - XmlSettings *xml = get_xml_settings(param->id, param->position); - char *label = xml ? xml->label : "NULL"; - debug_msg(DEBUG_MSG2HOST, - "RECEIVE_PARAMETER_VALUE: ID: %5d Position: %2d " - "Value: %6.1d: %s", - param->id, param->position, - param->value, label); + if (debug_flag_is_set(DEBUG_MSG2HOST)) { + GString *ipv = format_ipv(param->id, + param->position, + param->value); + debug_msg(DEBUG_MSG2HOST, "RECEIVE_PARAMETER_VALUE\n%s", + ipv->str); + g_string_free(ipv, TRUE); + } GDK_THREADS_ENTER(); apply_setting_param_to_gui(param); @@ -545,8 +642,9 @@ void send_message(gint procedure, gchar *data, gint len) g_string_append_printf(msg, "%c\xF7", calculate_checksum(&msg->str[1], msg->len - 1)); - debug_msg(DEBUG_VERBOSE, "Sending message %s len %d", - get_message_name(procedure), len); + debug_msg(DEBUG_VERBOSE, "Sending %s len %d", + get_message_name(procedure), len); + send_data(msg->str, msg->len); g_string_free(msg, TRUE); @@ -805,8 +903,11 @@ void set_option(guint id, guint position, guint value) ((id & 0xFF00) >> 8), (id & 0xFF), position); append_value(msg, value); - debug_msg(DEBUG_MSG2DEV, "Sending id %d position %d value %d", - id, position, value); + if (debug_flag_is_set(DEBUG_MSG2DEV)) { + GString *ipv = format_ipv(id, position, value); + debug_msg(DEBUG_MSG2DEV, "RECEIVE_PARAMETER_VALUE\n%s", ipv->str); + g_string_free(ipv, TRUE); + } send_message(RECEIVE_PARAMETER_VALUE, msg->str, msg->len); g_string_free(msg, TRUE); } diff --git a/gdigi.h b/gdigi.h index 10032a6..9d279c5 100644 --- a/gdigi.h +++ b/gdigi.h @@ -530,7 +530,6 @@ enum { }; #define MOD_TYPE 768 -#define MOD_POSITION 768 #define MOD_PRE_POST 1798 #define CHORUSFX_TYPE 768 @@ -893,7 +892,6 @@ enum { #define LIBRARY_EFFECTS 8705 #define EFFECTS_LEVEL 8706 -#define LIBRARY_POSITION 25 #define LIB_POSITION 26 #define TONE_LIB_TYPE 8704 @@ -1145,5 +1143,6 @@ void set_preset_level(int level); GStrv query_preset_names(gchar bank); void message_list_free(GList *list); GList *get_current_preset(); +GString *format_ipv(guint id, guint pos, guint val); #endif /* GDIGI_H */ diff --git a/gdigi_xml.h b/gdigi_xml.h index 56db6c3..8a60b80 100644 --- a/gdigi_xml.h +++ b/gdigi_xml.h @@ -33,7 +33,9 @@ typedef struct { guint xml_labels_amt; } XmlSettings; -// XmlSettings *get_xml_settings(guint id, guint position); +XmlSettings *get_xml_settings(guint id, guint position); +gboolean value_is_extra(EffectValues *val, int value); +gchar * map_xml_value(XmlSettings *xml, gint value); // gchar *get_xml_label(guint id, guint position, gint type); #endif /* GDIGI_XML_H */ diff --git a/preset.c b/preset.c index f5e056d..dfd56e4 100644 --- a/preset.c +++ b/preset.c @@ -330,10 +330,11 @@ Preset *create_preset_from_data(GList *list) SettingParam *param = setting_param_new_from_data(&data->str[x], &x); n++; preset->params = g_list_prepend(preset->params, param); - debug_msg(DEBUG_MSG2HOST, "%3d ID %4d Position %2d " - "Value %6.1d", - n, param->id, param->position, - param->value); + if (debug_flag_is_set(DEBUG_MSG2HOST)) { + GString *ipv = format_ipv(param->id, param->position, param->value); + debug_msg(DEBUG_MSG2HOST, "%3d %s", n, ipv->str); + g_string_free(ipv, TRUE); + } } while ((x < data->len) && nparams = g_list_sort(preset->params, params_cmp); diff --git a/preset_xml.c b/preset_xml.c index 69b9d07..cb873e1 100644 --- a/preset_xml.c +++ b/preset_xml.c @@ -52,7 +52,7 @@ XmlSettings *get_xml_settings (guint id, guint position) } gchar * -map_xml_value(XmlSettings *xml, gint value) +map_xml_value (XmlSettings *xml, gint value) { switch (xml->values->type) { case VALUE_TYPE_LABEL: @@ -84,10 +84,9 @@ map_xml_value(XmlSettings *xml, gint value) return NULL; } - -gboolean value_is_extra (EffectValues *val, SettingParam *param) +gboolean value_is_extra (EffectValues *val, int value) { - if ((param->value < val->min) || (param->value > val->max)) { + if ((value < val->min) || (value > val->max)) { return TRUE; } return FALSE; @@ -97,7 +96,6 @@ gboolean value_is_extra (EffectValues *val, SettingParam *param) void write_preset_to_xml(Preset *preset, gchar *filename) { - int rc; xmlTextWriterPtr writer; GList *iter_params = preset->params; @@ -178,7 +176,7 @@ write_preset_to_xml(Preset *preset, gchar *filename) BAD_CAST xml->label); values = xml->values; type = values->type; - while ((type & VALUE_TYPE_EXTRA) && value_is_extra(values, param)) { + while ((type & VALUE_TYPE_EXTRA) && value_is_extra(values, param->value)) { values = values->extra; type = values->type; } @@ -248,11 +246,7 @@ write_preset_to_xml(Preset *preset, gchar *filename) iter_params = iter_params->next; } - - /* Here we could close the elements ORDER and EXAMPLE using the - * function xmlTextWriterEndElement, but since we do not want to - * write any other elements, we simply call xmlTextWriterEndDocument, - * which will do all the work. */ + rc = xmlTextWriterEndDocument(writer); if (rc < 0) { printf("testXmlwriterFilename: Error at xmlTextWriterEndDocument\n"); From 4291fa71b25650d77a540b61d042d47eab6f66c2 Mon Sep 17 00:00:00 2001 From: Tim LaBerge Date: Fri, 6 Apr 2012 10:06:12 -0700 Subject: [PATCH 09/12] Fixup label range values. A number of EffectValues of type label had invalid ranges. Make them less invalid. Also add SYNTH_TALK id's to xml settings. Make format_ipv warn instead of crashing if an xml setting is not found. --- effects.c | 38 +++++++++++++++++++++++--------------- gdigi.c | 10 +++++++++- 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/effects.c b/effects.c index 89ca4e5..d4e040f 100644 --- a/effects.c +++ b/effects.c @@ -579,58 +579,58 @@ static EffectValues values_loose_tight = { }; static EffectValues values_pickup_type = { - .min = 0.0, .max = 1.0, + .min = 65.0, .max = 66.0, .type = VALUE_TYPE_LABEL, .labels = pickup_type_labels, }; static EffectValues values_comp_type = { - .min = 0.0, .max = 1.0, + .min = 195.0, .max = 197.0, .type = VALUE_TYPE_LABEL, }; static EffectValues values_dist_type = { - .min = 0.0, .max = 24.0, + .min = 1280.0, .max = 1302.0, .type = VALUE_TYPE_LABEL, }; static EffectValues values_amp_type = { - .min = 0.0, .max = 1.0, + .min = 307.0, .max = 351.0, .type = VALUE_TYPE_LABEL, }; static EffectValues values_cab_type = { - .min = 0.0, .max = 19.0, + .min = 570.0, .max = 627.0, .type = VALUE_TYPE_LABEL, }; static EffectValues values_gate_type = { - .min = 0.0, .max = 1.0, + .min = 768.0, .max = 769.0, .type = VALUE_TYPE_LABEL, }; static EffectValues values_mod_type = { - .min = 0.0, .max = 19.0, + .min = 862.0, .max = 1347.0, .type = VALUE_TYPE_LABEL, }; static EffectValues values_pre_post = { - .min = 0.0, .max = 15.0, + .min = 1543.0, .max = 1544.0, .type = VALUE_TYPE_LABEL, }; static EffectValues values_delay_type = { - .min = 0.0, .max = 15.0, + .min = 1027.0, .max = 1066.0, .type = VALUE_TYPE_LABEL, }; static EffectValues values_reverb_type = { - .min = 0.0, .max = 14.0, + .min = 1107.0, .max = 1151.0, .type = VALUE_TYPE_LABEL, }; static EffectValues values_wah_type = { - .min = 0.0, .max = 1.0, + .min = 129.0, .max = 134.0, .type = VALUE_TYPE_LABEL, }; @@ -678,7 +678,7 @@ static EffectValues values_lfo_speed = { }; static EffectValues values_eq_type = { - .min = 0.0, .max = 3.0, + .min = 1472.0, .max = 1475.0, .type = VALUE_TYPE_LABEL, }; @@ -688,12 +688,12 @@ static EffectValues values_lfo_waveform = { }; static EffectValues values_tone_lib_type= { - .min = 0.0, .max = 31.0, + .min = 1792.0, .max = 1822.0, .type = VALUE_TYPE_LABEL, }; static EffectValues values_fx_lib_type= { - .min = 0.0, .max = 31.0, + .min = 1856.0, .max = 1866.0, .type = VALUE_TYPE_LABEL, }; @@ -3945,6 +3945,15 @@ XmlSettings xml_settings[] = { {IPS_SCALE, CHORUSFX_POSITION, "IPS Scale", &values_ips_scale, xml_ips_scale_labels, G_N_ELEMENTS(xml_ips_scale_labels)}, {IPS_LEVEL, CHORUSFX_POSITION, "IPS Level", &values_0_to_99,}, + {SYNTH_TALK_ATTACK, CHORUSFX_POSITION, "Synth Talk Attack", &values_0_to_99,}, + {GNX3K_SYNTH_TALK_RELEASE, CHORUSFX_POSITION, "Synth Talk Release", &values_0_to_99,}, + {SYNTH_TALK_RELEASE, CHORUSFX_POSITION, "Synth Talk Release", &values_0_to_99,}, + {SYNTH_TALK_SENS, CHORUSFX_POSITION, "Synth Talk Sens", &values_0_to_99,}, + {SYNTH_TALK_VOX, CHORUSFX_POSITION, "Synth Talk Vox", &values_0_to_99,}, + {SYNTH_TALK_BALANCE, CHORUSFX_POSITION, "Synth Talk Balance", &values_0_to_99,}, + + + {DELAY_TYPE, DELAY_POSITION, "Delay Type", &values_delay_type, xml_delay_labels, G_N_ELEMENTS(xml_delay_labels)}, {DELAY_ON_OFF, DELAY_POSITION, "Delay Enable", &values_on_off, xml_on_off_labels, G_N_ELEMENTS(xml_on_off_labels)}, {DELAY_TIME, DELAY_POSITION, "Delay Time", &values_delay_time,}, @@ -3970,7 +3979,6 @@ XmlSettings xml_settings[] = { {WAH_ON_OFF, WAH_POSITION, "Wah Enable", &values_on_off, xml_on_off_labels, G_N_ELEMENTS(xml_on_off_labels)}, {WAH_PEDAL_POSITION, WAH_POSITION, "Wah Position", &values_0_to_99,}, {WAH_VOLUME_BOOST, WAH_POSITION, "Wah Vol. Boost", &values_db_boost,}, - //{MOD_TYPE, MOD_POSITION, "Mod Type", &values_0_to_99,}, // ??? {PRESET_LEVEL, PRESET_POSITION, "Preset Level", &values_0_to_99,}, diff --git a/gdigi.c b/gdigi.c index 61b9357..ba69861 100644 --- a/gdigi.c +++ b/gdigi.c @@ -180,7 +180,15 @@ format_ipv (guint id, guint pos, guint val) GString *buf = g_string_sized_new(1); GString *vec_buf = g_string_sized_new(1); XmlSettings *xml = get_xml_settings(id, pos); - GString *val_buf = format_value(xml, val); + GString *val_buf; + + if (!xml) { + g_warning("Failed to find xml settings for position %d id %d.", + id, pos); + g_string_printf(buf, "%s", "error"); + return buf; + } + val_buf = format_value(xml, val); g_string_printf(vec_buf, "(%d, %d, %d)", pos, id, val); g_string_printf(buf, "%-16s %s: %s: %s", From d139a3d89a3f40a0b0f2b82f26a5f3a00fde60e6 Mon Sep 17 00:00:00 2001 From: Tim LaBerge Date: Sun, 26 Feb 2012 20:45:26 -0800 Subject: [PATCH 10/12] Add a .gitignore file. --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6502396 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +*.[om] +*.rp355p +cscope.* +tags +gdigi From baa5fdff857841d9c8597f6168918df502cc099f Mon Sep 17 00:00:00 2001 From: Tim LaBerge Date: Sat, 7 Apr 2012 20:05:04 -0700 Subject: [PATCH 11/12] Fix display of signed/unsigned debug msg. Also twiddle the .gitignore file. --- .gitignore | 2 ++ gdigi.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 6502396..6cf9966 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ cscope.* tags gdigi +*.orig +*.swp diff --git a/gdigi.c b/gdigi.c index ba69861..fc2e52c 100644 --- a/gdigi.c +++ b/gdigi.c @@ -101,7 +101,7 @@ debug_msg (debug_flags_t flags, char *fmt, ...) * Returns an allocated buffer that must be freed by the caller. */ GString * -format_value (XmlSettings *xml, guint value) +format_value (XmlSettings *xml, gint value) { GString *buf = g_string_sized_new(1); EffectValues *values = NULL; From 2b1c74ac3018a33bd4b6c51a05c853f8d2ce8f02 Mon Sep 17 00:00:00 2001 From: Tim LaBerge Date: Sun, 8 Apr 2012 09:41:04 -0700 Subject: [PATCH 12/12] Cleanups on the Logging branch. 1) Add a more reasonable max value for the the pedal/vswitch assign values. 2) Minor format change in format_ipv(). 3) Formatting cleanup in push_message(). Also change debug messages to emphasize message direction. 4) Cleanup startup messages and add one that emits device name. 5) Cleanup the option message so that it's complete and readable. --- effects.c | 10 ++-- gdigi.c | 140 +++++++++++++++++++++++++++++++++------------------- gdigi.h | 2 +- gdigi_xml.h | 1 - 4 files changed, 95 insertions(+), 58 deletions(-) diff --git a/effects.c b/effects.c index d4e040f..79fbe4a 100644 --- a/effects.c +++ b/effects.c @@ -634,18 +634,19 @@ static EffectValues values_wah_type = { .type = VALUE_TYPE_LABEL, }; +// 4259839 is 0x40 FFFF, i.e. 0x . static EffectValues values_exp_assign = { - .min = 0.0, .max = 1.0, + .min = 0.0, .max = 4259839.0, .type = VALUE_TYPE_LABEL, }; static EffectValues values_vswitch_pedal_assign = { - .min = 0.0, .max = 1.0, + .min = 0.0, .max = 4259839.0, .type = VALUE_TYPE_LABEL, }; static EffectValues values_vswitch_assign = { - .min = 0.0, .max = 1.0, + .min = 0.0, .max = 4259839.0, .type = VALUE_TYPE_LABEL, }; @@ -3952,8 +3953,6 @@ XmlSettings xml_settings[] = { {SYNTH_TALK_VOX, CHORUSFX_POSITION, "Synth Talk Vox", &values_0_to_99,}, {SYNTH_TALK_BALANCE, CHORUSFX_POSITION, "Synth Talk Balance", &values_0_to_99,}, - - {DELAY_TYPE, DELAY_POSITION, "Delay Type", &values_delay_type, xml_delay_labels, G_N_ELEMENTS(xml_delay_labels)}, {DELAY_ON_OFF, DELAY_POSITION, "Delay Enable", &values_on_off, xml_on_off_labels, G_N_ELEMENTS(xml_on_off_labels)}, {DELAY_TIME, DELAY_POSITION, "Delay Time", &values_delay_time,}, @@ -4265,6 +4264,7 @@ gboolean get_device_info(unsigned char device_id, unsigned char family_id, for (x = 0; x < G_N_ELEMENTS(supported_devices); x++) { if (supported_devices[x]->product_id == product_id && supported_devices[x]->family_id == family_id) { *device = supported_devices[x]; + debug_msg(DEBUG_STARTUP, "Device name %s.", (*device)->name); return TRUE; } } diff --git a/gdigi.c b/gdigi.c index fc2e52c..9408fe7 100644 --- a/gdigi.c +++ b/gdigi.c @@ -190,7 +190,7 @@ format_ipv (guint id, guint pos, guint val) } val_buf = format_value(xml, val); - g_string_printf(vec_buf, "(%d, %d, %d)", pos, id, val); + g_string_printf(vec_buf, "(%2d, %4d, %d)", pos, id, val); g_string_printf(buf, "%-16s %s: %s: %s", vec_buf->str, get_position(pos), xml->label, val_buf->str); @@ -382,23 +382,27 @@ MessageID get_message_id(GString *msg) return -1; } -void push_message (GString *msg) +#define HEX_WIDTH 26 + +void push_message(GString *msg) { MessageID msgid = get_message_id(msg); - if (((unsigned char)msg->str[0] == 0xF0) && ((unsigned char)msg->str[msg->len-1] == 0xF7)) + if (((unsigned char)msg->str[0] == 0xF0) && + ((unsigned char)msg->str[msg->len-1] == 0xF7)) { debug_msg(DEBUG_VERBOSE, "Pushing correct message!"); - else + } else { g_warning("Pushing incorrect message!"); + } int x; if (debug_flag_is_set(DEBUG_HEX)) { for (x = 0; xlen; x++) { - if (x && (x % 26) == 0) { + if (x && (x % HEX_WIDTH) == 0) { printf("\n"); } printf("%02x ", (unsigned char)msg->str[x]); } - if (x % 26) { + if (x % HEX_WIDTH) { printf("\n"); } } @@ -423,7 +427,7 @@ void push_message (GString *msg) GString *ipv = format_ipv(param->id, param->position, param->value); - debug_msg(DEBUG_MSG2HOST, "RECEIVE_PARAMETER_VALUE\n%s", + debug_msg(DEBUG_MSG2HOST, "Receive RECEIVE_PARAMETER_VALUE: %s", ipv->str); g_string_free(ipv, TRUE); } @@ -438,51 +442,60 @@ void push_message (GString *msg) } case RECEIVE_DEVICE_NOTIFICATION: - unpack_message(msg); + { unsigned char *str = (unsigned char*)msg->str; - switch (str[8]) { - case NOTIFY_PRESET_MOVED: - if (str[11] == PRESETS_EDIT_BUFFER && str[12] == 0) { - GDK_THREADS_ENTER(); - g_timeout_add(0, apply_current_preset_to_gui, NULL); - GDK_THREADS_LEAVE(); - debug_msg(DEBUG_MSG2HOST, - "RECEIVE_DEVICE_NOTIFICATION: Loaded preset " - "%d from bank %d", + unpack_message(msg); + switch (str[8]) { + case NOTIFY_PRESET_MOVED: + if (str[11] == PRESETS_EDIT_BUFFER && str[12] == 0) { + + GDK_THREADS_ENTER(); + g_timeout_add(0, apply_current_preset_to_gui, NULL); + GDK_THREADS_LEAVE(); + debug_msg(DEBUG_MSG2HOST, + "Receive RECEIVE_DEVICE_NOTIFICATION: Loaded preset " + "%d from bank %d", str[10], str[9]); - } else { - debug_msg(DEBUG_MSG2HOST, - "RECEIVE_DEVICE_NOTIFICATION: %d %d moved to " - "%d %d", - str[9], str[10], - str[11], str[12]); - } - case NOTIFY_MODIFIER_GROUP_CHANGED: - { - int i; - if (debug_flag_is_set(DEBUG_HEX)) { - printf("\n"); - for (i = 0; i < msg->len; i++) { - printf(" %02x", (unsigned char) str[i]); - } - printf("\n"); - } + } else { debug_msg(DEBUG_MSG2HOST, - "NOTIFY_MODIFIER_GROUP_CHANGED: Modifier group " - "id %d changed", - (str[9] << 8) | (str[10])); - break; + "Receive RECEIVE_DEVICE_NOTIFICATION: %d %d moved to " + "%d %d", + str[9], str[10], + str[11], str[12]); } - default: - g_warning("Received unhandled device notification 0x%x", - str[11]); + break; + + case NOTIFY_MODIFIER_GROUP_CHANGED: + { + int i; + if (debug_flag_is_set(DEBUG_HEX)) { + printf("\n"); + for (i = 0; i < msg->len; i++) { + printf(" %02x", (unsigned char) str[i]); + } + printf("\n"); + } + debug_msg(DEBUG_MSG2HOST, + "Receive NOTIFY_MODIFIER_GROUP_CHANGED: Modifier group " + "id %d changed", + (str[9] << 8) | (str[10])); + break; + } + + default: + g_warning("Received unhandled device notification 0x%x", str[11]); + break; } g_string_free(msg, TRUE); return; + } + case RECEIVE_GLOBAL_PARAMETERS: - unpack_message(msg); + { gint tot, n, x; + + unpack_message(msg); tot = (unsigned char)msg->str[9]; if (debug_flag_is_set(DEBUG_HEX)) { for (n = 0; n < msg->len; n++) { @@ -496,7 +509,7 @@ void push_message (GString *msg) do { param = setting_param_new_from_data(&msg->str[x], &x); debug_msg(DEBUG_MSG2HOST, - "RECEIVE_GLOBAL_PARAMETERS ID: %5d " + "Receive RECEIVE_GLOBAL_PARAMETERS ID: %5d " "Position: %2.1d Value: %6.1d: %s", param->id, param->position, param->value, "XXX"); @@ -505,9 +518,12 @@ void push_message (GString *msg) g_string_free(msg, TRUE); return; - + } case RECEIVE_MODIFIER_LINKABLE_LIST: + { + gint tot, n; + unpack_message(msg); tot = (unsigned char)msg->str[9]; @@ -522,13 +538,14 @@ void push_message (GString *msg) g_string_free(msg, TRUE); return; - + } default: g_mutex_lock(message_queue_mutex); g_queue_push_tail(message_queue, msg); g_cond_signal(message_queue_cond); g_mutex_unlock(message_queue_mutex); + break; } } @@ -551,7 +568,8 @@ gpointer read_data_thread(gboolean *stop) unsigned short revents; /* SysEx messages can't contain bytes with 8th bit set. - memset our buffer to 0xFF, so if for some reason we'll get out of reply bounds, we'll catch it */ + memset our buffer to 0xFF, so if for some reason we'll + get out of reply bounds, we'll catch it */ memset(buf, '\0', sizeof(buf)); err = poll(pfds, npfds, 200); @@ -913,7 +931,7 @@ void set_option(guint id, guint position, guint value) append_value(msg, value); if (debug_flag_is_set(DEBUG_MSG2DEV)) { GString *ipv = format_ipv(id, position, value); - debug_msg(DEBUG_MSG2DEV, "RECEIVE_PARAMETER_VALUE\n%s", ipv->str); + debug_msg(DEBUG_MSG2DEV, "Send RECEIVE_PARAMETER_VALUE: %s", ipv->str); g_string_free(ipv, TRUE); } send_message(RECEIVE_PARAMETER_VALUE, msg->str, msg->len); @@ -1334,6 +1352,10 @@ static gboolean request_who_am_i(unsigned char *device_id, unsigned char *family *device_id = data->str[8]; *family_id = data->str[9]; *product_id = data->str[10]; + debug_msg(DEBUG_STARTUP, "Found device id %d family %d product id %d.", + *device_id, + *family_id, + *product_id); g_string_free(data, TRUE); return TRUE; } @@ -1381,8 +1403,24 @@ static void request_device_configuration() static GOptionEntry options[] = { {"device", 'd', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_STRING, &device_port, "MIDI device port to use", NULL}, - {"debug-flags", 'D', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_CALLBACK, set_debug_flags, - "Set debug flags: any combination of a, d, h, s:\n", + {"debug-flags ", 'D', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_CALLBACK, set_debug_flags, + " any of a, d, g, h, m, s, x, v:\n" + " " + "a: Everything.\n" + " " + "d: Messages to the device.\n" + " " + "g: Group messages.\n" + " " + "h: Dump message contents in hex.\n" + " " + "m: All messages.\n" + " " + "s: Startup.\n" + " " + "x: Debug xml parsing/writing.\n" + " " + "v: Additional verbosity.\n" , NULL}, {NULL} }; @@ -1455,9 +1493,9 @@ int main(int argc, char *argv[]) { device_port = g_strdup_printf("hw:%d,0,0", GPOINTER_TO_INT(device->data)); g_list_free(devices); - debug_msg(DEBUG_STARTUP, "Found device %s\n", device_port); + debug_msg(DEBUG_STARTUP, "Found device %s.", device_port); } else { - debug_msg(DEBUG_STARTUP, "Using device %s\n", device_port); + debug_msg(DEBUG_STARTUP, "Using device %s.", device_port); } g_option_context_free(context); diff --git a/gdigi.h b/gdigi.h index 9d279c5..90c7351 100644 --- a/gdigi.h +++ b/gdigi.h @@ -29,7 +29,7 @@ typedef enum { DEBUG_GROUP = (1 << 3), // Modifier group DEBUG_HEX = (1 << 4), // Dump message contents in hex. DEBUG_XML = (1 << 5), - DEBUG_VERBOSE = (1 << 6), + DEBUG_VERBOSE = (1 << 6), } debug_flags_t; void debug_msg (debug_flags_t, char *fmt, ...); diff --git a/gdigi_xml.h b/gdigi_xml.h index 8a60b80..3d4a792 100644 --- a/gdigi_xml.h +++ b/gdigi_xml.h @@ -36,6 +36,5 @@ typedef struct { XmlSettings *get_xml_settings(guint id, guint position); gboolean value_is_extra(EffectValues *val, int value); gchar * map_xml_value(XmlSettings *xml, gint value); -// gchar *get_xml_label(guint id, guint position, gint type); #endif /* GDIGI_XML_H */