diff --git a/effects.c b/effects.c index 911bcf0..872898c 100644 --- a/effects.c +++ b/effects.c @@ -305,6 +305,14 @@ static EffectValues values_0_to_99 = { .min = 0.0, .max = 99.0, .type = VALUE_TYPE_PLAIN, }; +static EffectValues values_0_to_255 = { + .min = 0.0, .max = 255.0, .type = VALUE_TYPE_PLAIN, +}; + +static EffectValues values_0_to_29 = { + .min = 0.0, .max = 29.0, .type = VALUE_TYPE_PLAIN, +}; + static EffectValues values_1_to_4 = { .min = 0.0, .max = 3.0, .type = VALUE_TYPE_OFFSET, @@ -554,6 +562,10 @@ EffectValues values_on_off = { .labels = on_off_labels, }; +EffectValues values_posid = { + .type = VALUE_TYPE_POSID, +}; + static EffectValues values_odd_even = { .min = 0.0, .max = 1.0, .type = VALUE_TYPE_LABEL, @@ -634,20 +646,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 = 4259839.0, - .type = VALUE_TYPE_LABEL, + .min = 0.0, .max = 0x7fffffff, + .type = VALUE_TYPE_POSID, }; static EffectValues values_vswitch_pedal_assign = { - .min = 0.0, .max = 4259839.0, - .type = VALUE_TYPE_LABEL, + .min = 0.0, .max = 0x7fffffff, + .type = VALUE_TYPE_POSID, }; static EffectValues values_vswitch_assign = { - .min = 0.0, .max = 4259839.0, - .type = VALUE_TYPE_LABEL, + .min = 0.0, .max = 0x7fffffff, + .type = VALUE_TYPE_POSID, }; static EffectValues values_vswitch_type = { @@ -656,8 +667,8 @@ static EffectValues values_vswitch_type = { }; static EffectValues values_lfo_assign = { - .min = 0.0, .max = 1.0, - .type = VALUE_TYPE_LABEL, + .min = 0.0, .max = 0x7fffffff, + .type = VALUE_TYPE_POSID, }; static EffectValues values_lfo_none = { @@ -668,13 +679,13 @@ static EffectValues values_lfo_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", + .offset = -85.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", + .offset = 5, .step = 0.01, .decimal = 2, .suffix = "Hz", .extra = &values_lfo_speed_extra, }; @@ -709,9 +720,14 @@ static EffectValues values_rp_mix = { .min = 0.0, .max = 100.0, .type = VALUE_TYPE_PLAIN, }; -static EffectSettings usb_settings[] = { +static EffectSettings global_settings[] = { {"USB/RP Mix", USB_AUDIO_PLAYBACK_MIX, GLOBAL_POSITION, &values_rp_mix}, {"USB Level", USB_AUDIO_LEVEL, GLOBAL_POSITION, &values_m12_to_24}, + {"GUI Mode", GUI_MODE_ON_OFF, GLOBAL_POSITION, &values_on_off}, + {"Tuning Reference", TUNING_REFERENCE, GLOBAL_POSITION, &values_0_to_29}, + {"Pedal Position", EXP_PEDAL_LEVEL, USB_POSITION, &values_0_to_255}, + {"Stomp", STOMP_MODE, GLOBAL_POSITION, &values_on_off}, + {"Wah Pedal Position", WAH_PEDAL_POSITION, WAH_POSITION, &values_0_to_99}, }; static EffectSettings misc_settings[] = { @@ -1467,7 +1483,7 @@ static EffectSettings delay_tape_settings[] = { {"Time", DELAY_TIME, DELAY_POSITION, &values_delay_time}, {"Level", DELAY_LEVEL, DELAY_POSITION, &values_0_to_99}, {"Repeats", DELAY_REPEATS, DELAY_POSITION, &values_delay_repeats}, - {"Wow", DELAY_TAPE_WOW, DELAY_POSITION, &values_0_to_99}, + {"Delay Tape Wow", DELAY_TAPE_WOW, DELAY_POSITION, &values_0_to_99}, {"Flutter", DELAY_TAPE_FLUTTER, DELAY_POSITION, &values_0_to_99}, }; @@ -1528,8 +1544,8 @@ static EffectSettings rp500_delay_tape_settings[] = { {"Tap Time", DELAY_TAP_TIME_0_4990, DELAY_POSITION, &values_delay_time_0_4990}, {"Repeats", DELAY_REPEATS, DELAY_POSITION, &values_delay_repeats}, {"Level", DELAY_LEVEL, DELAY_POSITION, &values_0_to_99}, - {"Tape Wow", DELAY_TAPE_WOW, DELAY_POSITION, &values_0_to_99}, - {"Tape Flutter", DELAY_TAPE_FLUTTER, DELAY_POSITION, &values_0_to_99}, + {"Delay Tape Wow", DELAY_TAPE_WOW, DELAY_POSITION, &values_0_to_99}, + {"Delay Tape Flutter", DELAY_TAPE_FLUTTER, DELAY_POSITION, &values_0_to_99}, }; static EffectSettings rp1000_delay_lo_fi_settings[] = { @@ -1557,6 +1573,25 @@ static EffectSettings gnx3k_reverb_settings[] = { {"Level", REVERB_LEVEL, REVERB_POSITION, &values_0_to_99}, }; +static EffectSettings pedal1_assign_settings[] = { + {"Pedal Min 1", EXP_MIN, EXP_POSITION, &values_0_to_99,}, + {"Pedal Max 1", EXP_MAX, EXP_POSITION, &values_0_to_99,}, +}; + +static EffectSettings lfo1_settings[] = { + {"Heel", LFO_MIN, LFO1_POSITION, &values_0_to_99}, + {"Toe", LFO_MAX, LFO1_POSITION, &values_0_to_99}, + {"Waveform", LFO_WAVEFORM, LFO1_POSITION, &values_waveform}, + {"Speed(HZ)", LFO_SPEED, LFO1_POSITION, &values_lfo_speed}, +}; + +static EffectSettings lfo2_settings[] = { + {"Heel", LFO_MIN, LFO2_POSITION, &values_0_to_99}, + {"Toe", LFO_MAX, LFO2_POSITION, &values_0_to_99}, + {"Waveform", LFO_WAVEFORM, LFO2_POSITION, &values_waveform}, + {"Speed(HZ)", LFO_SPEED, LFO2_POSITION, &values_lfo_speed}, +}; + static EffectSettings reverb_lex_settings[] = { {"Predelay", REVERB_PREDELAY, REVERB_POSITION, &values_0_to_15}, {"Decay", REVERB_DECAY, REVERB_POSITION, &values_0_to_99}, @@ -1600,8 +1635,8 @@ static EffectGroup gnx3k_amp_channel_group[] = { }; /** \todo it's not part of Preset, but should appear in GUI */ -static EffectGroup usb_group[] = { - {-1, NULL, usb_settings, G_N_ELEMENTS(usb_settings)}, +static EffectGroup global_group[] = { + {-1, NULL, global_settings, G_N_ELEMENTS(global_settings)}, }; static EffectGroup misc_group[] = { @@ -1923,6 +1958,21 @@ static EffectGroup rp355_chorusfx_group[] = { {CHORUS_TYPE_OCTAVER, "Octaver", chorusfx_octaver_settings, G_N_ELEMENTS(chorusfx_octaver_settings)}, }; +static EffectGroup rp355_pedal1_assign_group[] = { + { 0, NULL, pedal1_assign_settings, G_N_ELEMENTS(pedal1_assign_settings)}, + { 0, "None", NULL, 0}, +}; + +static EffectGroup rp355_lfo2_group[] = { + { 0, NULL, lfo2_settings, G_N_ELEMENTS(lfo2_settings)}, + { 0, "None", NULL, 0}, +}; + +static EffectGroup rp355_lfo1_group[] = { + { 0, NULL, lfo1_settings, G_N_ELEMENTS(lfo1_settings)}, + { 0, "None", NULL, 0}, +}; + static EffectGroup rp500_chorusfx_group[] = { {CHORUS_TYPE_CE, "CE Chorus", chorusfx_ce_settings, G_N_ELEMENTS(chorusfx_ce_settings)}, {CHORUS_TYPE_TC, "TC Chorus", chorusfx_tc_settings, G_N_ELEMENTS(chorusfx_tc_settings)}, @@ -2793,8 +2843,24 @@ static Effect rp255_chorusfx_effect[] = { }; static Effect rp355_chorusfx_effect[] = { - {"Position",-1, CHORUSFX_PRE_POST,CHORUSFX_POSITION, pre_post_group,G_N_ELEMENTS(pre_post_group)}, {NULL, CHORUSFX_ON_OFF,CHORUSFX_TYPE, CHORUSFX_POSITION, rp355_chorusfx_group, G_N_ELEMENTS(rp355_chorusfx_group)}, + {"Position",-1, CHORUSFX_PRE_POST,CHORUSFX_POSITION, pre_post_group,G_N_ELEMENTS(pre_post_group)}, +}; + +static Effect rp355_lfo1_effect[] = { + {NULL, -1, LFO_TYPE, LFO1_POSITION, rp355_lfo1_group, G_N_ELEMENTS(rp355_lfo1_group)}, +}; + +static Effect rp355_lfo2_effect[] = { + {NULL, -1, LFO_TYPE, LFO2_POSITION, rp355_lfo2_group, G_N_ELEMENTS(rp355_lfo2_group)}, +}; + +/* + * The elements of this group are discovered dynamically from the + * MODIFIER_LINKABLE_LIST message. + */ +static Effect rp355_pedal1_assign_effect[] = { + {NULL, -1, EXP_TYPE, EXP_POSITION, rp355_pedal1_assign_group, G_N_ELEMENTS(rp355_pedal1_assign_group)}, }; static Effect rp500_chorusfx_effect[] = { @@ -2912,6 +2978,10 @@ static Effect rp500_eq_effect[] = { {"Enable Equalizer", EQ_ENABLE, -1, EQ_A_POSITION, rp500_eq_group, G_N_ELEMENTS(rp500_eq_group)}, }; +static Effect global_effect[] = { + {NULL, -1, USB_AUDIO_LEVEL, USB_POSITION, global_group, G_N_ELEMENTS(global_group)}, +}; + static Effect pickup_misc_effect[] = { {NULL, PICKUP_ON_OFF, PICKUP_TYPE, PICKUP_POSITION, pickup_group, G_N_ELEMENTS(pickup_group)}, {NULL, -1, PRESET_LEVEL, PRESET_POSITION, misc_group, G_N_ELEMENTS(misc_group)}, @@ -3002,6 +3072,10 @@ static EffectList rp355_effects[] = { {"Chorus/FX", rp355_chorusfx_effect, G_N_ELEMENTS(rp355_chorusfx_effect)}, {"Delay", rp355_delay_effect, G_N_ELEMENTS(rp355_delay_effect)}, {"Reverb", reverb_effect, G_N_ELEMENTS(reverb_effect)}, + {"Pedal1 Assign", rp355_pedal1_assign_effect, G_N_ELEMENTS(rp355_pedal1_assign_effect)}, + {"LFO1", rp355_lfo1_effect, G_N_ELEMENTS(rp355_lfo1_effect)}, + {"LFO2", rp355_lfo2_effect, G_N_ELEMENTS(rp355_lfo2_effect)}, + {"Global Settings", global_effect, G_N_ELEMENTS(global_effect)}, }; static EffectList rp500_effects[] = { @@ -3093,7 +3167,7 @@ static EffectPage rp255_pages[] = { }; static EffectPage rp355_pages[] = { - {"Effects", rp355_effects, G_N_ELEMENTS(rp355_effects), 2}, + {"Effects", rp355_effects, G_N_ELEMENTS(rp355_effects), 3}, }; static EffectPage rp500_pages[] = { @@ -3237,6 +3311,8 @@ static Modifier modifiers[] = { {"Compressor Tone", COMP_TONE, COMP_POSITION, &values_0_to_99}, {"Compressor Level", COMP_LEVEL, COMP_POSITION, &values_0_to_99}, {"Compressor Attack", COMP_ATTACK, COMP_POSITION, &values_0_to_99}, + {"Compressor Sensitivity", COMP_SENSITIVITY, COMP_POSITION, &values_0_to_99}, + {"Compressor Output", COMP_OUTPUT, COMP_POSITION, &values_0_to_99}, {"Dist Enable", DIST_ON_OFF, DIST_POSITION, &values_on_off}, {"Dist Drive", DIST_SCREAMER_DRIVE, DIST_POSITION, &values_0_to_99}, {"Dist Tone", DIST_SCREAMER_TONE, DIST_POSITION, &values_0_to_99}, @@ -3279,22 +3355,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_A_POSITION, &values_on_off}, + {"Amp 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}, + {"Amp B Enable", AMP_ON_OFF, AMP_B_POSITION, &values_on_off}, + {"Amp B Gain", AMP_GAIN, AMP_B_POSITION, &values_0_to_99}, + {"Amp B 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}, + {"EQ B Enable", EQ_ENABLE, EQ_B_POSITION, &values_on_off}, + {"EQ B Bass", EQ_BASS, EQ_B_POSITION, &values_eq_db}, + {"EQ B Mid", EQ_MID, EQ_B_POSITION, &values_eq_db}, + {"EQ B Treb", EQ_TREB, EQ_B_POSITION, &values_eq_db}, + {"EQ B 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}, @@ -3307,10 +3383,19 @@ static Modifier modifiers[] = { {"Phaser Regen", PHASER_REGEN, CHORUSFX_POSITION, &values_0_to_99}, {"Phaser Waveform", PHASER_WAVE, CHORUSFX_POSITION, &values_waveform}, {"Phaser Level", PHASER_LEVEL, CHORUSFX_POSITION, &values_0_to_99}, + {"Phaser Intensity", MX_PHASER_INTENSITY, CHORUSFX_POSITION, &values_0_to_99}, + {"Trig Phaser Speed", TRIG_PHASER_SPEED, CHORUSFX_POSITION, &values_0_to_99}, + {"Trig Phaser Sens", TRIG_PHASER_SENS, CHORUSFX_POSITION, &values_0_to_99}, + {"Trig Phaser LFO", TRIG_PHASER_LFO_START, CHORUSFX_POSITION, &values_0_to_99}, + {"Trig Phaser Level", TRIG_PHASER_LEVEL, CHORUSFX_POSITION, &values_0_to_99}, + {"EH Phaser Rate", EH_PHASER_RATE, CHORUSFX_POSITION, &values_0_to_99}, + {"EH Phaser Color", EH_PHASER_COLOR, CHORUSFX_POSITION, &values_on_off}, {"Chorus Speed", CHORUS_SPEED, CHORUSFX_POSITION, &values_0_to_99}, {"Chorus Depth", CHORUS_DEPTH, CHORUSFX_POSITION, &values_0_to_99}, {"Chorus Level", CHORUS_LEVEL, CHORUSFX_POSITION, &values_0_to_99}, {"Chorus Waveform", CHORUS_WAVE, CHORUSFX_POSITION, &values_waveform}, + {"Chorus Width", CHORUS_WIDTH, CHORUSFX_POSITION, &values_0_to_99}, + {"Chorus Intensity", CHORUS_INTENSITY, CHORUSFX_POSITION, &values_0_to_99}, {"Flanger Speed", FLANGER_SPEED, CHORUSFX_POSITION, &values_0_to_99}, {"Flanger Depth", FLANGER_DEPTH, CHORUSFX_POSITION, &values_0_to_99}, {"Flanger Regen", FLANGER_REGEN, CHORUSFX_POSITION, &values_0_to_99}, @@ -3318,6 +3403,13 @@ static Modifier modifiers[] = { {"Flanger Level", FLANGER_LEVEL, CHORUSFX_POSITION, &values_0_to_99}, {"Flanger Width", MXR_FLANGER_WIDTH, CHORUSFX_POSITION, &values_0_to_99}, {"Flanger Manual", MXR_FLANGER_MANUAL, CHORUSFX_POSITION, &values_0_to_99}, + {"Flanger Level", TRIG_FLANGER_LEVEL, CHORUSFX_POSITION, &values_0_to_99}, + {"Flanger Sens", TRIG_FLANGER_SENS, CHORUSFX_POSITION, &values_0_to_99}, + {"Flanger LFO Start", TRIG_FLANGER_LFO_START, CHORUSFX_POSITION, &values_0_to_99}, + {"Flanger Speed", TRIG_FLANGER_SPEED, CHORUSFX_POSITION, &values_0_to_99}, + {"Flanger Range", EH_FLANGER_RANGE, CHORUSFX_POSITION, &values_0_to_99}, + {"Flanger Rate", EH_FLANGER_RATE, CHORUSFX_POSITION, &values_0_to_99}, + {"Flanger Color", EH_FLANGER_COLOR, CHORUSFX_POSITION, &values_0_to_99}, {"Vibrato Speed", VIBRATO_SPEED, CHORUSFX_POSITION, &values_0_to_99}, {"Vibrato Depth", VIBRATO_DEPTH, CHORUSFX_POSITION, &values_0_to_99}, {"Rotary Speed", ROTARY_SPEED, CHORUSFX_POSITION, &values_0_to_99}, @@ -3328,6 +3420,10 @@ static Modifier modifiers[] = { {"VibroPan Depth", VIBROPAN_DEPTH, CHORUSFX_POSITION, &values_0_to_99}, {"VibroPan VibratoPan", VIBROPAN_VIBRA, CHORUSFX_POSITION, &values_0_to_99}, {"VibroPan Waveform", VIBROPAN_WAVE, CHORUSFX_POSITION, &values_waveform}, + {"Unovibe Speed", UNOVIBE_PEDAL_SPEED, CHORUSFX_POSITION, &values_0_to_99}, + {"Unovibe Intensity", UNOVIBE_INTENSITY, CHORUSFX_POSITION, &values_0_to_99}, + {"Unovibe Volume", UNOVIBE_VOLUME, CHORUSFX_POSITION, &values_0_to_99}, + {"Unovibe Chorus/Vibrato", UNOVIBE_CHORUS_VIBRATO, CHORUSFX_POSITION, &values_chorus_vibrato}, {"Tremolo Speed", TREMOLO_SPEED, CHORUSFX_POSITION, &values_0_to_99}, {"Tremolo Depth", TREMOLO_DEPTH, CHORUSFX_POSITION, &values_0_to_99}, {"Tremolo Waveform", TREMOLO_WAVE, CHORUSFX_POSITION, &values_waveform}, @@ -3336,6 +3432,7 @@ static Modifier modifiers[] = { {"Panner Waveform", PANNER_WAVE, CHORUSFX_POSITION, &values_waveform}, {"Envelope Sens.", ENVELOPE_SENSITIVITY, CHORUSFX_POSITION, &values_0_to_99}, {"Envelope Range", ENVELOPE_RANGE, CHORUSFX_POSITION, &values_0_to_99}, + {"Envelope Blend", ENVELOPE_BLEND, CHORUSFX_POSITION, &values_0_to_99}, {"AutoYa Speed", AUTOYA_SPEED, CHORUSFX_POSITION, &values_0_to_99}, {"AutoYa Intensity", AUTOYA_INTENSITY, CHORUSFX_POSITION, &values_0_to_99}, {"AutoYa Range", AUTOYA_RANGE, CHORUSFX_POSITION, &values_0_to_49}, @@ -3344,6 +3441,11 @@ static Modifier modifiers[] = { {"YaYa Range", YAYA_RANGE, CHORUSFX_POSITION, &values_0_to_49}, {"Step Filter Speed", STEP_FILTER_SPEED, CHORUSFX_POSITION, &values_0_to_99}, {"Step Filter Intensity", STEP_FILTER_INTENSITY, CHORUSFX_POSITION, &values_0_to_99}, + {"Synth Talk Attack", SYNTH_TALK_ATTACK, CHORUSFX_POSITION, &values_0_to_99}, + {"Synth Talk Release", SYNTH_TALK_RELEASE, CHORUSFX_POSITION, &values_0_to_99}, + {"Synth Talk Sens", SYNTH_TALK_SENS, CHORUSFX_POSITION, &values_0_to_99}, + {"Synth Talk Vox", SYNTH_TALK_VOX, CHORUSFX_POSITION, &values_0_to_99}, + {"Synth Talk Balance", SYNTH_TALK_BALANCE, CHORUSFX_POSITION, &values_balance}, {"Whammy Amount", WHAMMY_AMOUNT, CHORUSFX_POSITION, &values_whammy_amount}, {"Whammy Pedal", WHAMMY_PEDAL, CHORUSFX_POSITION, &values_0_to_99}, {"Whammy Mix", WHAMMY_MIX, CHORUSFX_POSITION, &values_0_to_99}, @@ -3355,6 +3457,10 @@ static Modifier modifiers[] = { {"IPS Key", IPS_KEY, CHORUSFX_POSITION, &values_ips_key}, {"IPS Scale", IPS_SCALE, CHORUSFX_POSITION, &values_ips_scale}, {"IPS Level", IPS_LEVEL, CHORUSFX_POSITION, &values_0_to_99}, + {"Octaver Octave 1", OCTAVER_OCTAVE1, CHORUSFX_POSITION, &values_0_to_99}, + {"Octaver Octave 2", OCTAVER_OCTAVE2, CHORUSFX_POSITION, &values_0_to_99}, + {"Octaver Dry Level", OCTAVER_DRY_LEVEL, CHORUSFX_POSITION, &values_0_to_99}, + {"Delay Enable", DELAY_ON_OFF, DELAY_POSITION, &values_on_off}, {"Delay Time", DELAY_TIME, DELAY_POSITION, &values_delay_time}, {"Delay Repeats", DELAY_REPEATS, DELAY_POSITION, &values_delay_repeats}, @@ -3369,8 +3475,8 @@ static Modifier modifiers[] = { {"Reverb Liveliness", REVERB_LIVELINESS, REVERB_POSITION, &values_0_to_99}, {"Reverb Level", REVERB_LEVEL, REVERB_POSITION, &values_0_to_99}, {"Reverb Predelay", REVERB_PREDELAY, REVERB_POSITION, &values_0_to_15}, - {"Volume Pre FX", 2626, 13, &values_0_to_99}, - {"Volume Post FX", 2626, 17, &values_0_to_99}, + {"Volume Pre FX", PRESET_LEVEL, VOLUME_PRE_FX_POSITION, &values_0_to_99}, + {"Volume Post FX", PRESET_LEVEL, VOLUME_POST_FX_POSITION, &values_0_to_99}, }; int n_modifiers = G_N_ELEMENTS(modifiers); @@ -3820,6 +3926,9 @@ static XmlLabel xml_fx_lib_labels[] = { {EFFECTS_LIB_ROTARY_TAPE, "Rotary + Tape Delay"}, }; +static XmlLabel xml_rhold_labels[] = { + {100, "RHold"}, +}; /* Array to map id/position pairs to labels and settings. */ XmlSettings xml_settings[] = { {0, 0, "None", NULL,}, @@ -3914,6 +4023,9 @@ XmlSettings xml_settings[] = { {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,}, + {EH_PHASER_RATE, CHORUSFX_POSITION, "Phaser Rate", &values_0_to_99,}, + {EH_PHASER_COLOR, CHORUSFX_POSITION, "Phaser xml Color", &values_on_off, xml_on_off_labels,G_N_ELEMENTS(xml_on_off_labels)}, + {MX_PHASER_INTENSITY, CHORUSFX_POSITION, "Intensity", &values_1_to_4,}, {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,}, @@ -3975,7 +4087,7 @@ XmlSettings xml_settings[] = { {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_REPEATS, DELAY_POSITION, "Delay Repeats", &values_delay_repeats, xml_rhold_labels, G_N_ELEMENTS(xml_rhold_labels)}, {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,}, @@ -3991,7 +4103,7 @@ XmlSettings xml_settings[] = { {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,}, + {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)}, @@ -4171,22 +4283,26 @@ static void effect_settings_free(EffectSettings *settings) g_slice_free1(2 * sizeof(EffectSettings), settings); } +/** + * Global holding the list of linkable parameters. + * + * Used for Pedal Assignment and the LFO's. + */ +ModifierGroup *ModifierLinkableList; /** * Retrieves modifier linkable group from device. * * \return ModifierGroup which must be freed using modifier_group_free. **/ -ModifierGroup *modifier_linkable_list() +ModifierGroup *modifier_linkable_list(GString *msg) { guint group_id; guint count; guint i; - send_message(REQUEST_MODIFIER_LINKABLE_LIST, "\x00\x01", 2); + //send_message(REQUEST_MODIFIER_LINKABLE_LIST, "\x00\x01", 2); - GString *data = get_message_by_id(RECEIVE_MODIFIER_LINKABLE_LIST); - - unsigned char *str = (unsigned char*)data->str; + unsigned char *str = (unsigned char*)msg->str; group_id = (str[8] << 8) | str[9]; count = (str[10] << 8) | str[11]; @@ -4222,13 +4338,15 @@ ModifierGroup *modifier_linkable_list() group[i].settings_amt = 0; debug_msg(DEBUG_MSG2HOST|DEBUG_GROUP, - "ID: %4d Position: %2d: %s", - id, position, modifier ? modifier->label : NULL); + "Position : %d\nID : %d\nName : %s\n", + position, id, modifier ? modifier->label : NULL); } modifier_group->group = group; modifier_group->group_amt = count; + ModifierLinkableList = modifier_group; + return modifier_group; } @@ -4291,7 +4409,6 @@ 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/effects.h b/effects.h index 22309cf..16fa0e1 100644 --- a/effects.h +++ b/effects.h @@ -27,7 +27,8 @@ typedef 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 */ + VALUE_TYPE_POSID = 1 << 6, /**< Packed Position/ID: (pos << 16) | id */ + VALUE_TYPE_NONE = 1 << 7, /**< no value displayed */ } ValueType; typedef struct _EffectValues { @@ -118,6 +119,7 @@ typedef struct { gchar *get_position(guint position); ModifierGroup *modifier_linkable_list(); +extern ModifierGroup *ModifierLinkableList; void modifier_group_free(ModifierGroup *modifier_group); void get_values_info(EffectValues *values, gdouble *min, gdouble *max, gboolean *custom); @@ -125,4 +127,5 @@ gboolean get_device_info(unsigned char device_id, unsigned char family_id, unsigned char product_id, Device **device); + #endif /* GDIGI_EFFECTS_H */ diff --git a/gdigi.c b/gdigi.c index 7182c9d..800e9d2 100644 --- a/gdigi.c +++ b/gdigi.c @@ -52,7 +52,7 @@ gboolean set_debug_flags (const gchar *option_name, const gchar *value, { if (strchr(value, 'd')) { DebugFlags |= DEBUG_MSG2DEV; - } + } if (strchr(value, 'h')) { DebugFlags |= DEBUG_MSG2HOST; } @@ -91,7 +91,7 @@ debug_msg (debug_flags_t flags, char *fmt, ...) va_start(ap, fmt); vsnprintf(buf, 1024, fmt, ap); va_end(ap); - + fprintf(stderr, "%s\n", buf); } } @@ -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, gint value) +format_value (XmlSettings *xml, guint value) { GString *buf = g_string_sized_new(1); EffectValues *values = NULL; @@ -142,10 +142,10 @@ format_value (XmlSettings *xml, gint value) switch (vtype) { case VALUE_TYPE_LABEL: { - char *textp = map_xml_value(xml, value); + char *textp = map_xml_value(xml, values, value); if (!textp) { - g_warning("Unable to map %s value %d for id %d position %d", - xml->label, value, xml->id, xml->position); + g_warning("%s: Unable to map %s value %d for id %d position %d", + __FUNCTION__, xml->label, value, xml->id, xml->position); textp = ""; } g_string_printf(buf, "%s", textp); @@ -166,6 +166,10 @@ format_value (XmlSettings *xml, gint value) g_string_printf(buf, "%s", ""); break; + case VALUE_TYPE_POSID: + g_string_printf(buf, "%d", value); + break; + default: g_warning("Unhandled value type %d", vtype); break; @@ -190,7 +194,7 @@ format_ipv (guint id, guint pos, guint val) } val_buf = format_value(xml, val); - g_string_printf(vec_buf, "(%2d, %4d, %d)", pos, id, 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); @@ -427,7 +431,7 @@ void push_message(GString *msg) GString *ipv = format_ipv(param->id, param->position, param->value); - debug_msg(DEBUG_MSG2HOST, "Receive RECEIVE_PARAMETER_VALUE: %s", + debug_msg(DEBUG_MSG2HOST, "RECEIVE_PARAMETER_VALUE\n%s", ipv->str); g_string_free(ipv, TRUE); } @@ -442,10 +446,8 @@ void push_message(GString *msg) } case RECEIVE_DEVICE_NOTIFICATION: - { - unsigned char *str = (unsigned char*)msg->str; - 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) { @@ -454,12 +456,12 @@ void push_message(GString *msg) g_timeout_add(0, apply_current_preset_to_gui, NULL); GDK_THREADS_LEAVE(); debug_msg(DEBUG_MSG2HOST, - "Receive RECEIVE_DEVICE_NOTIFICATION: Loaded preset " + "RECEIVE_DEVICE_NOTIFICATION: Loaded preset " "%d from bank %d", - str[10], str[9]); + str[10], str[9]); } else { - debug_msg(DEBUG_MSG2HOST, - "Receive RECEIVE_DEVICE_NOTIFICATION: %d %d moved to " + debug_msg(DEBUG_MSG2HOST, + "RECEIVE_DEVICE_NOTIFICATION: %d %d moved to " "%d %d", str[9], str[10], str[11], str[12]); @@ -476,26 +478,29 @@ void push_message(GString *msg) } printf("\n"); } - debug_msg(DEBUG_MSG2HOST, - "Receive NOTIFY_MODIFIER_GROUP_CHANGED: Modifier group " + + debug_msg(DEBUG_MSG2HOST, + "NOTIFY_MODIFIER_GROUP_CHANGED: Modifier group " "id %d changed", (str[9] << 8) | (str[10])); + + if (ModifierLinkableList) { + modifier_group_free(ModifierLinkableList); + ModifierLinkableList = NULL; + } + + send_message(REQUEST_MODIFIER_LINKABLE_LIST, "\x00\x01", 2); break; } - default: - g_warning("Received unhandled device notification 0x%x", str[11]); - break; + g_warning("Received unhandled device notification 0x%x", + str[11]); } g_string_free(msg, TRUE); return; - } - case RECEIVE_GLOBAL_PARAMETERS: - { - gint tot, n, x; - unpack_message(msg); + gint tot, n, x; tot = (unsigned char)msg->str[9]; if (debug_flag_is_set(DEBUG_HEX)) { for (n = 0; n < msg->len; n++) { @@ -509,21 +514,18 @@ void push_message(GString *msg) do { param = setting_param_new_from_data(&msg->str[x], &x); debug_msg(DEBUG_MSG2HOST, - "Receive RECEIVE_GLOBAL_PARAMETERS ID: %5d " + "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); - + g_string_free(msg, TRUE); return; - } + case RECEIVE_MODIFIER_LINKABLE_LIST: - { - gint tot, n; - unpack_message(msg); tot = (unsigned char)msg->str[9]; @@ -535,10 +537,19 @@ void push_message(GString *msg) } modifier_linkable_list(msg); - + g_string_free(msg, TRUE); + + GDK_THREADS_ENTER(); + + create_modifier_group(EXP_POSITION, EXP_ASSIGN1); + create_modifier_group(LFO1_POSITION, LFO_TYPE); + create_modifier_group(LFO2_POSITION, LFO_TYPE); + + GDK_THREADS_LEAVE(); + return; - } + default: g_mutex_lock(message_queue_mutex); @@ -931,7 +942,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, "Send RECEIVE_PARAMETER_VALUE: %s", ipv->str); + 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); @@ -1140,6 +1151,7 @@ GList *get_message_list(MessageID id) g_error("get_message_list() doesn't support followning id: %d", id); g_string_free(data, TRUE); g_list_free(list); + g_assert(!"BUG"); return NULL; } @@ -1352,10 +1364,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]; - 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; } @@ -1447,6 +1455,7 @@ static gint get_digitech_devices(GList **devices) number++; *devices = g_list_append(*devices, GINT_TO_POINTER(card_num)); } + free(name); } return number; @@ -1474,12 +1483,12 @@ int main(int argc, char *argv[]) { if (device_port == NULL) { /* port not given explicitly in commandline - search for devices */ - GList *devices = NULL; - GList *device = NULL; - int num_devices = 0; - int chosen_device = 0; - if ((num_devices = get_digitech_devices(&devices)) <= 0) { - g_message("Couldn't find any DigiTech devices!"); + GList *devices = NULL; + GList *device = NULL; + int num_devices = 0; + int chosen_device = 0; + if (get_digitech_devices(&devices) <= 0) { + g_warning("Couldn't find DigiTech devices!"); exit(EXIT_FAILURE); } if (num_devices > 1) { @@ -1544,7 +1553,7 @@ int main(int argc, char *argv[]) { g_mutex_free(message_queue_mutex); } - if (message_queue != NULL) { + if (message_queue != NULL && g_queue_get_length(message_queue)) { g_warning("%d unread messages in queue", g_queue_get_length(message_queue)); g_queue_foreach(message_queue, (GFunc) message_free_func, NULL); diff --git a/gdigi.h b/gdigi.h index ee3af33..3b9257a 100644 --- a/gdigi.h +++ b/gdigi.h @@ -976,10 +976,10 @@ enum { EFFECTS_LIB_CUSTOM = 1856 }; -#define GLOBAL_POSITION 0 +#define USB_POSITION 0 +#define GLOBAL_POSITION 0 #define TUNING_REFERENCE 12288 - #define USB_AUDIO_PLAYBACK_MIX 12297 #define USB_AUDIO_LEVEL 12307 diff --git a/gdigi_xml.h b/gdigi_xml.h index 3d4a792..b5f73b9 100644 --- a/gdigi_xml.h +++ b/gdigi_xml.h @@ -35,6 +35,7 @@ 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 * map_xml_value(XmlSettings *xml, EffectValues *values, gint value); +// gchar *get_xml_label(guint id, guint position, gint type); #endif /* GDIGI_XML_H */ diff --git a/gui.c b/gui.c index de0b590..85c622b 100644 --- a/gui.c +++ b/gui.c @@ -24,6 +24,7 @@ #include "preset.h" #include "gtkknob.h" #include "images/gdigi_icon.h" +#include "gdigi_xml.h" static gchar* MessageID_names[] = { @@ -372,8 +373,9 @@ static void apply_widget_setting(WidgetTreeElem *el, SettingParam *param) else if (GTK_IS_ADJUSTMENT(el->widget)) gtk_adjustment_set_value(GTK_ADJUSTMENT(el->widget), (gdouble)param->value); } else { /* combo box */ - if (el->value == param->value) + if (el->value == param->value) { gtk_combo_box_set_active(GTK_COMBO_BOX(el->widget), el->x); + } } } @@ -540,8 +542,9 @@ void effect_settings_group_free(EffectSettingsGroup *group) { if (group->child != NULL) { /* destroy widget without parent */ - if (gtk_widget_get_parent(group->child) == NULL) + if (gtk_widget_get_parent(group->child) == NULL) { gtk_widget_destroy(group->child); + } g_object_unref(group->child); } @@ -562,6 +565,7 @@ void combo_box_changed_cb(GtkComboBox *widget, gpointer data) EffectSettingsGroup *settings = NULL; gchar *name = NULL; gint x; + g_object_get(G_OBJECT(widget), "active", &x, NULL); vbox = g_object_get_data(G_OBJECT(widget), "vbox"); @@ -619,7 +623,7 @@ GtkWidget *create_widget_container(EffectGroup *group, gint amt, gint id, gint p gint x; gint cmbox_no = -1; - vbox = gtk_vbox_new(FALSE, 0); + vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); widget_table = g_hash_table_new(g_direct_hash, g_direct_equal); @@ -631,15 +635,22 @@ GtkWidget *create_widget_container(EffectGroup *group, gint amt, gint id, gint p g_signal_connect(G_OBJECT(combo_box), "changed", G_CALLBACK(combo_box_changed_cb), group); g_object_set_data(G_OBJECT(combo_box), "vbox", vbox); } - gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combo_box), - NULL, group[x].label); + + gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo_box), group[x].label); cmbox_no++; if ((group[x].settings != NULL) && (group[x].settings_amt > 0)) { - widget = create_grid(group[x].settings, group[x].settings_amt, widget_table); + /* + * Create a grid for each combo box entry to contain per + * combo box entry settings. + */ + widget = create_grid(group[x].settings, + group[x].settings_amt, + widget_table); g_object_ref_sink(widget); - } else + } else { widget = NULL; + } settings = g_slice_new(EffectSettingsGroup); settings->id = id; @@ -650,11 +661,15 @@ GtkWidget *create_widget_container(EffectGroup *group, gint amt, gint id, gint p widget_tree_add(G_OBJECT(combo_box), id, position, group[x].type, x); name = g_strdup_printf("SettingsGroup%d", cmbox_no); - g_object_set_data_full(G_OBJECT(combo_box), name, settings, ((GDestroyNotify)effect_settings_group_free)); + g_object_set_data_full(G_OBJECT(combo_box), + name, settings, + ((GDestroyNotify)effect_settings_group_free)); g_free(name); } else { if ((group[x].settings != NULL) && (group[x].settings_amt > 0)) { - widget = create_grid(group[x].settings, group[x].settings_amt, widget_table); + widget = create_grid(group[x].settings, + group[x].settings_amt, + widget_table); gtk_box_pack_end(GTK_BOX(vbox), widget, FALSE, TRUE, 0); } } @@ -665,6 +680,123 @@ GtkWidget *create_widget_container(EffectGroup *group, gint amt, gint id, gint p return vbox; } +/** + * Populate a combo box with text entries from the modifier group. + */ +void update_modifier_combo_box(GObject *combo_box, EffectGroup *group, gint amt, gint id, gint position) +{ + gint x; + EffectSettingsGroup *settings = NULL; + + for (x = 0; xid = id; + settings->type = group[x].type; + settings->position = position; + settings->child = NULL; + + name = g_strdup_printf("SettingsGroup%d", x); + g_object_set_data(G_OBJECT(combo_box), name, settings); + g_free(name); + + gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo_box), group[x].label); + widget_tree_add(combo_box, id, position, group[x].type, x); + } + + return; +} + +static void widget_tree_elem_free(GList *); + +static void clean_modifier_combo_box (GObject *ComboBox, GList *list) +{ + EffectSettingsGroup *settings = NULL; + WidgetTreeElem *el; + gchar *name; + GList *link, *next; + + link = g_list_first(list); + + while (link != NULL) { + next = link->next; + el = link->data; + if (el->value != -1) { + /* Useless assignment, but silences compiler warning. */ + link = g_list_remove_link(list, link); + + g_assert(ComboBox == el->widget); + name = g_strdup_printf("SettingsGroup%d", el->x); + settings = g_object_steal_data(G_OBJECT(ComboBox), name); + + g_free(name); + g_slice_free(EffectSettingsGroup, settings); + g_slice_free(WidgetTreeElem, el); + } + link = next; + } + gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(ComboBox)); +} + +/** + * Given a linkable effect, update the combo box for the linkable parameters. + * + * @param[in] pos Position + * @param[in] id Id + */ +void +create_modifier_group (guint pos, guint id) +{ + + GtkWidget *vbox; + gpointer key; + WidgetTreeElem *el; + GList *list; + GObject *AssignComboBox; + + debug_msg(DEBUG_GROUP, "Building modifier group for position %d id %d \"%s\"", + pos, id, get_xml_settings(id, pos)->label); + + key = GINT_TO_POINTER((pos << 16) | id); + list = g_tree_lookup(widget_tree, key); + + /* + * The list will be destroyed and recreated, but we don't want to + * handle the teardown ourselves. So steal it from the tree. + */ + g_tree_steal(widget_tree, key); + if (!list) { + g_warning("No widget tree entry for position %d id %d!\n", + pos, id); + return; + } + + el = g_list_nth_data(list, 0); + if (!el) { + g_warning("No effect settings group for position %d id %d!\n", + pos, id); + return; + } + + AssignComboBox = el->widget; + g_assert(AssignComboBox != NULL); + + vbox = g_object_get_data(AssignComboBox, "vbox"); + g_assert(vbox != NULL); + + clean_modifier_combo_box(AssignComboBox, list); + + update_modifier_combo_box(AssignComboBox, + ModifierLinkableList->group, + ModifierLinkableList->group_amt, + id, pos); + + get_option(id, pos); +} + + /** * \param widgets Effect descriptions * \param amt amount of effect descriptions @@ -686,13 +818,14 @@ GtkWidget *create_vbox(Effect *widgets, gint amt, gchar *label) frame = gtk_frame_new(label); - vbox = gtk_vbox_new(FALSE, 0); + vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); grid = gtk_grid_new(); gtk_grid_set_column_spacing(GTK_GRID(grid), 2); for (x = 0; xn_pages; i++) { GtkWidget *label = NULL; - vbox = gtk_vbox_new(FALSE, 0); + vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); label = gtk_label_new(device->pages[i].name); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label); for (x = 0; xpages[i].n_effects; x++) { if ((x % ((device->pages[i].n_effects+1)/device->pages[i].n_rows)) == 0) { - hbox = gtk_hbox_new(FALSE, 0); + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 2); } widget = create_vbox(device->pages[i].effects[x].effect, device->pages[i].effects[x].amt, device->pages[i].effects[x].label); @@ -1366,6 +1507,16 @@ 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(TUNING_REFERENCE, GLOBAL_POSITION); + get_option(USB_AUDIO_PLAYBACK_MIX, GLOBAL_POSITION); + get_option(GUI_MODE_ON_OFF, GLOBAL_POSITION); + get_option(USB_AUDIO_LEVEL, GLOBAL_POSITION); + get_option(EXP_PEDAL_LEVEL, GLOBAL_POSITION); + get_option(STOMP_MODE, GLOBAL_POSITION); + + send_message(REQUEST_MODIFIER_LINKABLE_LIST, "\x00\x01", 2); } /** diff --git a/gui.h b/gui.h index 0c2ad5a..1c9297d 100644 --- a/gui.h +++ b/gui.h @@ -30,5 +30,6 @@ void gui_free(); gboolean unsupported_device_dialog(Device **device); gint select_device_dialog (GList *devices); const gchar* get_message_name(MessageID msgid); +void create_modifier_group (guint pos, guint id); #endif /* GDIGI_GUI_H */ diff --git a/preset_xml.c b/preset_xml.c index 6914ce5..991d8d5 100644 --- a/preset_xml.c +++ b/preset_xml.c @@ -30,6 +30,7 @@ extern XmlSettings xml_settings[]; extern guint n_xml_settings; extern EffectValues values_on_off; + /** * \param id modifier ID * \param position modifier position @@ -52,18 +53,19 @@ XmlSettings *get_xml_settings (guint id, guint position) } gchar * -map_xml_value (XmlSettings *xml, gint value) +map_xml_value (XmlSettings *xml, EffectValues *values, gint value) { - switch (xml->values->type) { + switch (values->type) { case VALUE_TYPE_LABEL: - if ((xml->values == &values_on_off) && (value > 1)) { + if ((values == &values_on_off) && (value > 1)) { g_warning("Skipping modifier->label %s\n", xml->label); return NULL; - } - if (value > xml->values->max || value < xml->values->min) { + } + + if (value > values->max || value < values->min) { 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; guint labels_amt = xml->xml_labels_amt; @@ -96,6 +98,7 @@ gboolean value_is_extra (EffectValues *val, int value) void write_preset_to_xml(Preset *preset, gchar *filename) { + int rc; xmlTextWriterPtr writer; GList *iter_params = preset->params; @@ -205,7 +208,7 @@ write_preset_to_xml(Preset *preset, gchar *filename) switch (type) { case VALUE_TYPE_LABEL: { - char *textp = map_xml_value(xml, param->value); + char *textp = map_xml_value(xml, values, param->value); if (!textp) { g_warning("Unable to map %s value %d for id %d position %d", xml->label, param->value, param->id,