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 */