From d92489348dd12213181a9e871e36ed5d55b64edf Mon Sep 17 00:00:00 2001 From: Tim LaBerge Date: Sat, 25 Feb 2012 18:10:58 -0800 Subject: [PATCH 01/18] Add the USB (global) effects. --- effects.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/effects.c b/effects.c index 8dccedf..8a4be38 100644 --- a/effects.c +++ b/effects.c @@ -2899,6 +2899,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 usb_effect[] = { + {NULL, -1, USB_AUDIO_LEVEL, USB_POSITION, usb_group, G_N_ELEMENTS(usb_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)}, @@ -2982,6 +2986,7 @@ 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)}, + {"USB settings", usb_effect, G_N_ELEMENTS(usb_effect)}, }; static EffectList rp500_effects[] = { From 87e6dcbb9cc9bb748e075c1bd3307cdd2edeed22 Mon Sep 17 00:00:00 2001 From: Tim LaBerge Date: Sun, 26 Feb 2012 08:29:43 -0800 Subject: [PATCH 02/18] Better message tracking and retrieve usb settings. --- gdigi.c | 36 +++++++++++++++++++++++++----- gdigi.h | 1 + gui.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ gui.h | 1 + 4 files changed, 101 insertions(+), 6 deletions(-) diff --git a/gdigi.c b/gdigi.c index 7fa2647..9b2e1c2 100644 --- a/gdigi.c +++ b/gdigi.c @@ -220,31 +220,37 @@ MessageID get_message_id(GString *msg) void push_message(GString *msg) { + MessageID msgid = get_message_id(msg); if (((unsigned char)msg->str[0] == 0xF0) && ((unsigned char)msg->str[msg->len-1] == 0xF7)) g_message("Pushing correct message!"); else g_warning("Pushing incorrect message!"); int x; - for (x = 0; xlen; x++) + for (x = 0; xlen; x++) { + if (x && (x % 26) == 0) { + printf("\n"); + } printf("%02x ", (unsigned char)msg->str[x]); - printf("\n"); + } + if (x % 26) { + printf("\n"); + } + g_message("Received %s", get_message_name(msgid)); - switch (get_message_id(msg)) { + switch (msgid) { case ACK: - g_message("Received ACK"); g_string_free(msg, TRUE); return; case NACK: - g_message("Received NACK"); g_string_free(msg, TRUE); return; case RECEIVE_PARAMETER_VALUE: unpack_message(msg); SettingParam *param = setting_param_new_from_data(&msg->str[8], NULL); - g_message("Received parameter change ID: %d Position: %d Value: %d", param->id, param->position, param->value); + g_message("ID: %d Position: %d Value: %d", param->id, param->position, param->value); GDK_THREADS_ENTER(); apply_setting_param_to_gui(param); @@ -400,6 +406,7 @@ void send_message(gint procedure, gchar *data, gint len) g_string_append_printf(msg, "%c\xF7", calculate_checksum(&msg->str[1], msg->len - 1)); + g_message("Sending message %s len %d", get_message_name(procedure), len); send_data(msg->str, msg->len); g_string_free(msg, TRUE); @@ -626,6 +633,23 @@ SectionID get_genetx_section_id(gint version, gint type) return -1; } +/** + * \param id Parameter ID + * \param position Parameter position + * \param value Parameter value + * + * Forms SysEx message to request parameter then sends it to device. + **/ +void get_option(guint id, guint position) +{ + GString *msg = g_string_sized_new(9); + g_message("Requesting parameter id %d position %d", id, position); + g_string_append_printf(msg, "%c%c%c", + ((id & 0xFF00) >> 8), (id & 0xFF), + position); + send_message(REQUEST_PARAMETER_VALUE, msg->str, msg->len); + g_string_free(msg, TRUE); +} /** * \param id Parameter ID * \param position Parameter position diff --git a/gdigi.h b/gdigi.h index 1e43042..1a46e4b 100644 --- a/gdigi.h +++ b/gdigi.h @@ -1114,6 +1114,7 @@ void setting_genetx_free(SettingGenetx *genetx); void setting_param_free(SettingParam *param); SectionID get_genetx_section_id(gint version, gint type); void set_option(guint id, guint position, guint value); +void get_option(guint id, guint position); void send_object(SectionID section, guint bank, guint index, gchar *name, GString *data); void send_preset_parameters(GList *params); diff --git a/gui.c b/gui.c index 923f2c1..2179207 100644 --- a/gui.c +++ b/gui.c @@ -23,6 +23,71 @@ #include "preset.h" #include "gtkknob.h" + +static gchar* MessageID_names[] = { + [REQUEST_WHO_AM_I] = "REQUEST_WHO_AM_I", + [RECEIVE_WHO_AM_I] = "RECEIVE_WHO_AM_I", + + [REQUEST_DEVICE_CONFIGURATION] = "REQUEST_DEVICE_CONFIGURATION", + [RECEIVE_DEVICE_CONFIGURATION] = "RECEIVE_DEVICE_CONFIGURATION", + + [REQUEST_GLOBAL_PARAMETERS] = "REQUEST_GLOBAL_PARAMETERS", + [RECEIVE_GLOBAL_PARAMETERS] = "RECEIVE_GLOBAL_PARAMETERS", + + [REQUEST_BULK_DUMP] = "REQUEST_BULK_DUMP", + [RECEIVE_BULK_DUMP_START] = "RECEIVE_BULK_DUMP_START", + [RECEIVE_BULK_DUMP_END] = "RECEIVE_BULK_DUMP_END", + + [REQUEST_PRESET_NAMES] = "REQUEST_PRESET_NAMES", + [RECEIVE_PRESET_NAMES] = "RECEIVE_PRESET_NAMES", + + [REQUEST_PRESET_NAME] = "REQUEST_PRESET_NAME", + [RECEIVE_PRESET_NAME] = "RECEIVE_PRESET_NAME", + + [REQUEST_PRESET] = "REQUEST_PRESET", + [RECEIVE_PRESET_START] = "RECEIVE_PRESET_START", + [RECEIVE_PRESET_END] = "RECEIVE_PRESET_END", + [RECEIVE_PRESET_PARAMETERS] = "RECEIVE_PRESET_PARAMETERS", + + [LOAD_EDIT_BUFFER_PRESET] = "LOAD_EDIT_BUFFER_PRESET", + + [MOVE_PRESET] = "MOVE_PRESET", + + [REQUEST_MODIFIER_LINKABLE_LIST] = "REQUEST_MODIFIER_LINKABLE_LIST", + [RECEIVE_MODIFIER_LINKABLE_LIST] = "RECEIVE_MODIFIER_LINKABLE_LIST", + + [REQUEST_PARAMETER_VALUE] = "REQUEST_PARAMETER_VALUE", + [RECEIVE_PARAMETER_VALUE] = "RECEIVE_PARAMETER_VALUE", + + /* version 1 and later */ + [REQUEST_OBJECT_NAMES] = "REQUEST_OBJECT_NAMES", + [RECEIVE_OBJECT_NAMES] = "RECEIVE_OBJECT_NAMES", + [REQUEST_OBJECT_NAME] = "REQUEST_OBJECT_NAME", + [RECEIVE_OBJECT_NAME] = "RECEIVE_OBJECT_NAME", + [REQUEST_OBJECT] = "REQUEST_OBJECT", + [RECEIVE_OBJECT] = "RECEIVE_OBJECT", + [MOVE_OBJECT] = "MOVE_OBJECT", + [DELETE_OBJECT] = "DELETE_OBJECT", + [REQUEST_TABLE] = "REQUEST_TABLE", + [RECEIVE_TABLE] = "RECEIVE_TABLE", + + [RECEIVE_DEVICE_NOTIFICATION] = "RECEIVE_DEVICE_NOTIFICATION", + + [ACK] = "ACK", + [NACK] = "NACK", +}; + +const gchar* +get_message_name(MessageID msgid) +{ + if (MessageID_names[msgid]) { + return MessageID_names[msgid]; + } + + return "Unknown"; + +} + typedef struct { GObject *widget; @@ -1271,6 +1336,10 @@ void gui_create(Device *device) gtk_widget_show_all(window); g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_main_quit), NULL); + + /* Not part of the preset, but update from the device. */ + get_option(USB_AUDIO_LEVEL, USB_POSITION); + get_option(USB_AUDIO_PLAYBACK_MIX, USB_POSITION); } /** diff --git a/gui.h b/gui.h index 99e95f7..45f7659 100644 --- a/gui.h +++ b/gui.h @@ -28,5 +28,6 @@ gboolean apply_current_preset_to_gui(gpointer data); void gui_create(Device *device); void gui_free(); gboolean unsupported_device_dialog(Device **device); +const gchar* get_message_name(MessageID msgid); #endif /* GDIGI_GUI_H */ From 225383310502e2c2a601a0801a29bf40eb9efab1 Mon Sep 17 00:00:00 2001 From: Tim LaBerge Date: Sun, 26 Feb 2012 08:37:51 -0800 Subject: [PATCH 03/18] Add retrieval of global settings. Start LFO. --- effects.c | 72 ++++++++++++++++++++++++++++++++++++++++++---------- gdigi.c | 48 +++++++++++++++++++++++++++++++++++ gdigi.h | 6 ++++- gui.c | 11 ++++++-- preset_xml.c | 8 +----- 5 files changed, 121 insertions(+), 24 deletions(-) diff --git a/effects.c b/effects.c index 8a4be38..50ffd13 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, @@ -708,9 +716,14 @@ static EffectValues values_rp_mix = { .min = 0.0, .max = 100.0, .type = VALUE_TYPE_PLAIN, }; -static EffectSettings usb_settings[] = { - {"USB/RP Mix", USB_AUDIO_PLAYBACK_MIX, USB_POSITION, &values_rp_mix}, - {"USB Level", USB_AUDIO_LEVEL, USB_POSITION, &values_m12_to_24}, +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[] = { @@ -1556,6 +1569,20 @@ static EffectSettings gnx3k_reverb_settings[] = { {"Level", REVERB_LEVEL, REVERB_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, REVERB_POSITION, &values_0_to_99}, + {"Toe", LFO_MAX, REVERB_POSITION, &values_0_to_99}, + {"Waveform", LFO_WAVEFORM, REVERB_POSITION, &values_waveform}, + {"Speed(HZ)", LFO_SPEED, REVERB_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}, @@ -1592,8 +1619,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[] = { @@ -1915,6 +1942,19 @@ static EffectGroup rp355_chorusfx_group[] = { {CHORUS_TYPE_OCTAVER, "Octaver", chorusfx_octaver_settings, G_N_ELEMENTS(chorusfx_octaver_settings)}, }; +#define LFO_POSID_TO_TYPE(_a, _b) ((_a << 16) | (_b)) +static EffectGroup rp355_lfo1_group[] = { + {LFO_POSID_TO_TYPE(CHORUSFX_POSITION, CHORUS_LEVEL), "Chorus Level", lfo1_settings, G_N_ELEMENTS(lfo1_settings)}, + {LFO_POSID_TO_TYPE(DIST_POSITION, DIST_ON_OFF), "Distortion On/Off", lfo1_settings, G_N_ELEMENTS(lfo1_settings)}, + {LFO_POSID_TO_TYPE(DIST_POSITION, DIST_SCREAMER_DRIVE), "Distortion Screamer Drive", lfo1_settings, G_N_ELEMENTS(lfo1_settings)}, + {LFO_POSID_TO_TYPE(DIST_POSITION, DIST_SCREAMER_TONE), "Distortion Screamer Tone", lfo1_settings, G_N_ELEMENTS(lfo1_settings)}, + {LFO_POSID_TO_TYPE(DIST_POSITION, DIST_SCREAMER_LVL), "Distortion Screamer Level", lfo1_settings, G_N_ELEMENTS(lfo1_settings)}, + {LFO_POSID_TO_TYPE(DIST_POSITION, DIST_808_OVERDRIVE), "Distortion 808 Overdrive", lfo1_settings, G_N_ELEMENTS(lfo1_settings)}, + {LFO_POSID_TO_TYPE(DIST_POSITION, DIST_808_TONE), "Distortion 808 Tone", lfo1_settings, G_N_ELEMENTS(lfo1_settings)}, + {LFO_POSID_TO_TYPE(DIST_POSITION, DIST_808_LVL), "Distortion 808 Level", lfo1_settings, G_N_ELEMENTS(lfo1_settings)}, + }; + + 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)}, @@ -2784,6 +2824,10 @@ static Effect rp355_chorusfx_effect[] = { {NULL, CHORUSFX_ON_OFF,CHORUSFX_TYPE, CHORUSFX_POSITION, rp355_chorusfx_group, G_N_ELEMENTS(rp355_chorusfx_group)}, }; +static Effect rp355_lfo1_effect[] = { + {NULL, -1, LFO_TYPE, LFO1_POSITION, rp355_lfo1_group, G_N_ELEMENTS(rp355_lfo1_group)}, +}; + static Effect rp500_chorusfx_effect[] = { {NULL, CHORUSFX_ON_OFF, CHORUSFX_TYPE, CHORUSFX_POSITION, rp500_chorusfx_group, G_N_ELEMENTS(rp500_chorusfx_group)}, }; @@ -2899,8 +2943,8 @@ static Effect rp500_eq_effect[] = { {"Enable Equalizer", EQ_ENABLE, -1, EQ_A_POSITION, rp500_eq_group, G_N_ELEMENTS(rp500_eq_group)}, }; -static Effect usb_effect[] = { - {NULL, -1, USB_AUDIO_LEVEL, USB_POSITION, usb_group, G_N_ELEMENTS(usb_group)}, +static Effect global_effect[] = { + {NULL, -1, USB_AUDIO_LEVEL, USB_POSITION, global_group, G_N_ELEMENTS(global_group)}, }; static Effect pickup_misc_effect[] = { @@ -2986,7 +3030,8 @@ 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)}, - {"USB settings", usb_effect, G_N_ELEMENTS(usb_effect)}, + {"Global Settings", global_effect, G_N_ELEMENTS(global_effect)}, + {"LFO1", rp355_lfo1_effect, G_N_ELEMENTS(rp355_lfo1_effect)}, }; static EffectList rp500_effects[] = { @@ -3078,7 +3123,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[] = { @@ -4087,17 +4132,15 @@ static void effect_settings_free(EffectSettings *settings) * * \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]; @@ -4135,6 +4178,7 @@ ModifierGroup *modifier_linkable_list() modifier_group->group = group; modifier_group->group_amt = count; + return modifier_group; } diff --git a/gdigi.c b/gdigi.c index 9b2e1c2..76fd240 100644 --- a/gdigi.c +++ b/gdigi.c @@ -274,12 +274,59 @@ void push_message(GString *msg) } else { g_message("%d %d moved to %d %d", str[9], str[10], str[11], str[12]); } + case NOTIFY_MODIFIER_GROUP_CHANGED: + { + int i; + printf("\n"); + for (i = 0; i < msg->len; i++) { + printf(" %02x", (unsigned char) str[i]); + } + printf("\n"); + g_message("Modifier group id %d changed", + (str[9] << 8) | (str[10])); break; + } default: g_message("Received unhandled device notification 0x%x", str[11]); } g_string_free(msg, TRUE); return; + case RECEIVE_GLOBAL_PARAMETERS: + unpack_message(msg); + gint tot, n, x; + tot = (unsigned char)msg->str[9]; + for (n = 0; n < msg->len; n++) { + printf("%02x ",(unsigned char) msg->str[n]); + } + printf("\n"); + + n = 0; + x = 10; + do { + param = setting_param_new_from_data(&msg->str[x], &x); + g_message("Received global param ID: %d Position: %d Value: %d", + param->id, param->position, param->value); + setting_param_free(param); + } while ( (x < msg->len) && n < tot); + + g_string_free(msg, TRUE); + return; + + + case RECEIVE_MODIFIER_LINKABLE_LIST: + unpack_message(msg); + tot = (unsigned char)msg->str[9]; + for (n = 0; n < msg->len; n++) { + printf("%02x ",(unsigned char) msg->str[n]); + } + printf("\n"); + + modifier_linkable_list(msg); + + g_string_free(msg, TRUE); + return; + + default: g_mutex_lock(message_queue_mutex); g_queue_push_tail(message_queue, msg); @@ -664,6 +711,7 @@ void set_option(guint id, guint position, guint value) ((id & 0xFF00) >> 8), (id & 0xFF), position); append_value(msg, value); + g_message("Sending id %d position %d value %d", id, position, value); send_message(RECEIVE_PARAMETER_VALUE, msg->str, msg->len); g_string_free(msg, TRUE); } diff --git a/gdigi.h b/gdigi.h index 1a46e4b..45aece8 100644 --- a/gdigi.h +++ b/gdigi.h @@ -964,10 +964,14 @@ enum { }; #define USB_POSITION 0 +#define GLOBAL_POSITION 0 + +#define TUNING_REFERENCE 12288 #define USB_AUDIO_PLAYBACK_MIX 12297 #define USB_AUDIO_LEVEL 12307 - #define GUI_MODE_ON_OFF 12298 +#define EXP_PEDAL_LEVEL 12300 +#define STOMP_MODE 12370 #endif /* DOXYGEN_SHOULD_SKIP_THIS */ diff --git a/gui.c b/gui.c index 2179207..c3048c8 100644 --- a/gui.c +++ b/gui.c @@ -1338,8 +1338,15 @@ void gui_create(Device *device) g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_main_quit), NULL); /* Not part of the preset, but update from the device. */ - get_option(USB_AUDIO_LEVEL, USB_POSITION); - get_option(USB_AUDIO_PLAYBACK_MIX, USB_POSITION); + 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/preset_xml.c b/preset_xml.c index a5bd749..f2f246c 100644 --- a/preset_xml.c +++ b/preset_xml.c @@ -83,7 +83,6 @@ map_xml_value(XmlSettings *xml, gint value) return NULL; } - gboolean value_is_extra (EffectValues *val, SettingParam *param) { if ((param->value < val->min) || (param->value > val->max)) { @@ -96,7 +95,6 @@ gboolean value_is_extra (EffectValues *val, SettingParam *param) void write_preset_to_xml(Preset *preset, gchar *filename) { - int rc; xmlTextWriterPtr writer; GList *iter_params = preset->params; @@ -246,11 +244,7 @@ write_preset_to_xml(Preset *preset, gchar *filename) iter_params = iter_params->next; } - - /* Here we could close the elements ORDER and EXAMPLE using the - * function xmlTextWriterEndElement, but since we do not want to - * write any other elements, we simply call xmlTextWriterEndDocument, - * which will do all the work. */ + rc = xmlTextWriterEndDocument(writer); if (rc < 0) { printf("testXmlwriterFilename: Error at xmlTextWriterEndDocument\n"); From 4351613e7293912a6c52a2a7fb223513604c0439 Mon Sep 17 00:00:00 2001 From: Tim LaBerge Date: Sun, 26 Feb 2012 20:45:26 -0800 Subject: [PATCH 04/18] Add a .gitignore file. --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6502396 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +*.[om] +*.rp355p +cscope.* +tags +gdigi From 6a16e66cbd61dac95793aaa5da60200934b33659 Mon Sep 17 00:00:00 2001 From: Tim LaBerge Date: Sun, 26 Feb 2012 21:21:27 -0800 Subject: [PATCH 05/18] Add missing effects to modifier array. Change AMP_POSITION to AMP_A_POSITION. Add AMP_B_POSITION to the modifier array. Add AMP_PRESENCE to the modifier array and move it to follow Treble in the Equalizer effect. Add EQ_B_POSITION settings to the modifier array. Change the formatting of the debug messages to print more readable columns. --- effects.c | 101 +++++++++++++++++++++++++++++------------------------- gdigi.c | 4 +-- gdigi.h | 3 +- preset.c | 3 +- 4 files changed, 60 insertions(+), 51 deletions(-) diff --git a/effects.c b/effects.c index 50ffd13..9e798e1 100644 --- a/effects.c +++ b/effects.c @@ -955,17 +955,17 @@ static EffectSettings dist_mp_settings[] = { }; static EffectSettings rp250_amp_settings[] = { - {"Gain", AMP_GAIN, AMP_POSITION, &values_0_to_99}, - {"Level", AMP_LEVEL, AMP_POSITION, &values_0_to_99}, + {"Gain", AMP_GAIN, AMP_A_POSITION, &values_0_to_99}, + {"Level", AMP_LEVEL, AMP_A_POSITION, &values_0_to_99}, }; static EffectSettings rp250_amp_settings2[] = { - {"Level", AMP_LEVEL, AMP_POSITION, &values_0_to_99}, + {"Level", AMP_LEVEL, AMP_A_POSITION, &values_0_to_99}, }; static EffectSettings rp355_amp_settings_A[] = { - {"Gain", AMP_GAIN, AMP_POSITION, &values_0_to_99}, - {"Level", AMP_LEVEL, AMP_POSITION, &values_0_to_99}, + {"Gain", AMP_GAIN, AMP_A_POSITION, &values_0_to_99}, + {"Level", AMP_LEVEL, AMP_A_POSITION, &values_0_to_99}, }; static EffectSettings rp355_amp_settings_B[] = { @@ -974,7 +974,7 @@ static EffectSettings rp355_amp_settings_B[] = { }; static EffectSettings rp355_amp_settings2_A[] = { - {"Level", AMP_LEVEL, AMP_POSITION, &values_0_to_99}, + {"Level", AMP_LEVEL, AMP_A_POSITION, &values_0_to_99}, }; static EffectSettings rp355_amp_settings2_B[] = { @@ -982,22 +982,22 @@ static EffectSettings rp355_amp_settings2_B[] = { }; static EffectSettings rp500_amp_settings[] = { - {"Gain", AMP_GAIN, AMP_POSITION, &values_0_to_99}, - {"Level", AMP_LEVEL, AMP_POSITION, &values_0_to_99}, - {"Bass", AMP_BASS, AMP_POSITION, &values_1_to_10_step_0p1}, - {"Mid", AMP_MID, AMP_POSITION, &values_1_to_10_step_0p1}, - {"Treble", AMP_TREBLE, AMP_POSITION, &values_1_to_10_step_0p1}, + {"Gain", AMP_GAIN, AMP_A_POSITION, &values_0_to_99}, + {"Level", AMP_LEVEL, AMP_A_POSITION, &values_0_to_99}, + {"Bass", AMP_BASS, AMP_A_POSITION, &values_1_to_10_step_0p1}, + {"Mid", AMP_MID, AMP_A_POSITION, &values_1_to_10_step_0p1}, + {"Treble", AMP_TREBLE, AMP_A_POSITION, &values_1_to_10_step_0p1}, }; static EffectSettings rp500_amp_settings2[] = { - {"Level", AMP_LEVEL, AMP_POSITION, &values_0_to_99}, - {"Bass", AMP_BASS, AMP_POSITION, &values_1_to_10_step_0p1}, - {"Mid", AMP_MID, AMP_POSITION, &values_1_to_10_step_0p1}, - {"Treble", AMP_TREBLE, AMP_POSITION, &values_1_to_10_step_0p1}, + {"Level", AMP_LEVEL, AMP_A_POSITION, &values_0_to_99}, + {"Bass", AMP_BASS, AMP_A_POSITION, &values_1_to_10_step_0p1}, + {"Mid", AMP_MID, AMP_A_POSITION, &values_1_to_10_step_0p1}, + {"Treble", AMP_TREBLE, AMP_A_POSITION, &values_1_to_10_step_0p1}, }; static EffectSettings rp500_amp_settings3[] = { - {"Level", AMP_LEVEL, AMP_POSITION, &values_0_to_99}, + {"Level", AMP_LEVEL, AMP_A_POSITION, &values_0_to_99}, }; static EffectSettings gnx3k_ch1_cab_tuning_settings[] = { @@ -1009,15 +1009,15 @@ static EffectSettings gnx3k_ch2_cab_tuning_settings[] = { }; static EffectSettings gnx3k_ch1_amp_eq_settings[] = { - {"Gain", AMP_GAIN, AMP_POSITION, &values_0_to_99}, - {"Bass Freq", AMP_BASS_FREQ, AMP_POSITION, &values_eq_bass_hz}, - {"Bass Level", AMP_BASS_LEVEL, AMP_POSITION, &values_eq_db}, - {"Mid Freq", AMP_MID_FREQ, AMP_POSITION, &values_eq_mid_hz}, - {"Mid Level", AMP_MID_LEVEL, AMP_POSITION, &values_eq_db}, - {"Treb Freq", AMP_TREBLE_FREQ, AMP_POSITION, &values_eq_treb_hz}, - {"Treb Level", AMP_TREBLE_LEVEL, AMP_POSITION, &values_eq_db}, - {"Presence", AMP_PRESENCE, AMP_POSITION, &values_eq_db}, - {"Level", AMP_LEVEL, AMP_POSITION, &values_0_to_99}, + {"Gain", AMP_GAIN, AMP_A_POSITION, &values_0_to_99}, + {"Bass Freq", AMP_BASS_FREQ, AMP_A_POSITION, &values_eq_bass_hz}, + {"Bass Level", AMP_BASS_LEVEL, AMP_A_POSITION, &values_eq_db}, + {"Mid Freq", AMP_MID_FREQ, AMP_A_POSITION, &values_eq_mid_hz}, + {"Mid Level", AMP_MID_LEVEL, AMP_A_POSITION, &values_eq_db}, + {"Presence", AMP_PRESENCE, AMP_A_POSITION, &values_eq_db}, + {"Treb Freq", AMP_TREBLE_FREQ, AMP_A_POSITION, &values_eq_treb_hz}, + {"Treb Level", AMP_TREBLE_LEVEL, AMP_A_POSITION, &values_eq_db}, + {"Level", AMP_LEVEL, AMP_A_POSITION, &values_0_to_99}, }; static EffectSettings gnx3k_ch2_amp_eq_settings[] = { @@ -1026,9 +1026,9 @@ static EffectSettings gnx3k_ch2_amp_eq_settings[] = { {"Bass Level", AMP_BASS_LEVEL, AMP_B_POSITION, &values_eq_db}, {"Mid Freq", AMP_MID_FREQ, AMP_B_POSITION, &values_eq_mid_hz}, {"Mid Level", AMP_MID_LEVEL, AMP_B_POSITION, &values_eq_db}, + {"Presence", AMP_PRESENCE, AMP_B_POSITION, &values_eq_db}, {"Treb Freq", AMP_TREBLE_FREQ, AMP_B_POSITION, &values_eq_treb_hz}, {"Treb Level", AMP_TREBLE_LEVEL, AMP_B_POSITION, &values_eq_db}, - {"Presence", AMP_PRESENCE, AMP_B_POSITION, &values_eq_db}, {"Level", AMP_LEVEL, AMP_B_POSITION, &values_0_to_99}, }; @@ -1044,18 +1044,18 @@ static EffectSettings rp355_eq_settings_A[] = { {"Bass", EQ_BASS, EQ_A_POSITION, &values_eq_db}, {"Mid", EQ_MID, EQ_A_POSITION, &values_eq_db}, {"Treble", EQ_TREB, EQ_A_POSITION, &values_eq_db}, + {"Presence", EQ_PRESENCE, EQ_A_POSITION, &values_eq_db}, {"Mid Hz", EQ_MID_FREQ, EQ_A_POSITION, &values_eq_mid_hz}, {"Treb Hz", EQ_TREB_FREQ, EQ_A_POSITION, &values_eq_treb_hz}, - {"Presence", EQ_PRESENCE, EQ_A_POSITION, &values_eq_db}, }; static EffectSettings rp355_eq_settings_B[] = { {"Bass", EQ_BASS, EQ_B_POSITION, &values_eq_db}, {"Mid", EQ_MID, EQ_B_POSITION, &values_eq_db}, {"Treble", EQ_TREB, EQ_B_POSITION, &values_eq_db}, + {"Presence", EQ_PRESENCE, EQ_B_POSITION, &values_eq_db}, {"Mid Hz", EQ_MID_FREQ, EQ_B_POSITION, &values_eq_mid_hz}, {"Treb Hz", EQ_TREB_FREQ, EQ_B_POSITION, &values_eq_treb_hz}, - {"Presence", EQ_PRESENCE, EQ_B_POSITION, &values_eq_db}, }; static EffectSettings rp500_eq_settings[] = { @@ -2867,23 +2867,23 @@ static Effect reverb_effect[] = { }; static Effect rp150_amp_effect[] = { - {NULL, AMP_ON_OFF, AMP_TYPE, AMP_POSITION, rp150_amp_group, G_N_ELEMENTS(rp150_amp_group)}, + {NULL, AMP_ON_OFF, AMP_TYPE, AMP_A_POSITION, rp150_amp_group, G_N_ELEMENTS(rp150_amp_group)}, {"Cabinet", -1, AMP_CAB_TYPE, AMP_CAB_POSITION, rp150_amp_cab_group, G_N_ELEMENTS(rp150_amp_cab_group)}, }; static Effect rp155_amp_effect[] = { - {NULL, AMP_ON_OFF, AMP_TYPE, AMP_POSITION, rp155_amp_group, G_N_ELEMENTS(rp155_amp_group)}, + {NULL, AMP_ON_OFF, AMP_TYPE, AMP_A_POSITION, rp155_amp_group, G_N_ELEMENTS(rp155_amp_group)}, {"Cabinet", -1, AMP_CAB_TYPE, AMP_CAB_POSITION, rp150_amp_cab_group, G_N_ELEMENTS(rp150_amp_cab_group)}, }; static Effect rp250_amp_effect[] = { - {NULL, AMP_ON_OFF, AMP_TYPE, AMP_POSITION, rp250_amp_group, G_N_ELEMENTS(rp250_amp_group)}, + {NULL, AMP_ON_OFF, AMP_TYPE, AMP_A_POSITION, rp250_amp_group, G_N_ELEMENTS(rp250_amp_group)}, {"Cabinet", -1, AMP_CAB_TYPE, AMP_CAB_POSITION, rp250_amp_cab_group, G_N_ELEMENTS(rp250_amp_cab_group)}, }; /* same cabs as rp250, but 3 new amp models */ static Effect rp255_amp_effect[] = { - {NULL, AMP_ON_OFF, AMP_TYPE, AMP_POSITION, rp255_amp_group, G_N_ELEMENTS(rp255_amp_group)}, + {NULL, AMP_ON_OFF, AMP_TYPE, AMP_A_POSITION, rp255_amp_group, G_N_ELEMENTS(rp255_amp_group)}, {"Cabinet", -1, AMP_CAB_TYPE, AMP_CAB_POSITION, rp250_amp_cab_group, G_N_ELEMENTS(rp250_amp_cab_group)}, }; @@ -2892,7 +2892,7 @@ static Effect rp355_select_amp_effect[] = { }; static Effect rp355_amp_effect_A[] = { - {NULL, AMP_ON_OFF, AMP_TYPE, AMP_POSITION, rp355_amp_group_A, G_N_ELEMENTS(rp355_amp_group_A)}, + {NULL, AMP_ON_OFF, AMP_TYPE, AMP_A_POSITION, rp355_amp_group_A, G_N_ELEMENTS(rp355_amp_group_A)}, {"Cabinet", -1, AMP_CAB_TYPE, AMP_CAB_POSITION, rp355_amp_cab_group, G_N_ELEMENTS(rp355_amp_cab_group)}, }; @@ -2902,19 +2902,19 @@ static Effect rp355_amp_effect_B[] = { }; static Effect rp500_amp_effect[] = { - {NULL, AMP_ON_OFF, AMP_TYPE, AMP_POSITION, rp500_amp_group, G_N_ELEMENTS(rp500_amp_group)}, + {NULL, AMP_ON_OFF, AMP_TYPE, AMP_A_POSITION, rp500_amp_group, G_N_ELEMENTS(rp500_amp_group)}, {"Cabinet", -1, AMP_CAB_TYPE, AMP_CAB_POSITION, rp500_amp_cab_group, G_N_ELEMENTS(rp500_amp_cab_group)}, }; static Effect rp1000_amp_effect[] = { {"Amp Loop", AMP_LOOP_ON_OFF, -1, AMP_LOOP_POSITION, NULL, -1}, {"Amp/Cab Bypass", AMP_BYPASS_ON_OFF, -1, AMP_BYPASS_POSITION, NULL, -1}, - {NULL, -1, AMP_TYPE, AMP_POSITION, rp1000_amp_group, G_N_ELEMENTS(rp1000_amp_group)}, + {NULL, -1, AMP_TYPE, AMP_A_POSITION, rp1000_amp_group, G_N_ELEMENTS(rp1000_amp_group)}, {NULL, -1, AMP_CAB_TYPE, AMP_CAB_POSITION, rp1000_amp_cab_group, G_N_ELEMENTS(rp1000_amp_cab_group)}, }; static Effect gnx3k_channel_1_effect[] = { - {"EQ Enable", AMP_EQ_ON_OFF, AMP_TYPE, AMP_POSITION, gnx3k_amp_group, G_N_ELEMENTS(gnx3k_amp_group)}, + {"EQ Enable", AMP_EQ_ON_OFF, AMP_TYPE, AMP_A_POSITION, gnx3k_amp_group, G_N_ELEMENTS(gnx3k_amp_group)}, {NULL, -1, AMP_CAB_TYPE, AMP_CAB_POSITION, gnx3k_amp_cab_group, G_N_ELEMENTS(gnx3k_amp_cab_group)}, {NULL, -1, -1, -1, gnx3k_ch1_cab_tuning_group, G_N_ELEMENTS(gnx3k_ch1_cab_tuning_group)}, {NULL, -1, -1, -1, gnx3k_ch1_amp_eq_group, G_N_ELEMENTS(gnx3k_ch1_amp_eq_group)}, @@ -3309,13 +3309,22 @@ static Modifier modifiers[] = { {"Dist Sustain", DIST_MP_SUSTAIN, DIST_POSITION, &values_0_to_99}, {"Dist Tone", DIST_MP_TONE, DIST_POSITION, &values_0_to_99}, {"Dist Volume", DIST_MP_VOLUME, DIST_POSITION, &values_0_to_99}, - {"Amp Channel Enable", AMP_ON_OFF, AMP_POSITION, &values_on_off}, - {"Amp Gain", AMP_GAIN, AMP_POSITION, &values_0_to_99}, - {"Amp Level", AMP_LEVEL, AMP_POSITION, &values_0_to_99}, + {"Amp Channel Enable", AMP_ON_OFF, AMP_A_POSITION, &values_on_off}, + {"Amp Gain", AMP_GAIN, AMP_A_POSITION, &values_0_to_99}, + {"Amp Level", AMP_LEVEL, AMP_A_POSITION, &values_0_to_99}, + {"Amp Channel Enable", AMP_ON_OFF, AMP_B_POSITION, &values_on_off}, + {"Amp Gain", AMP_GAIN, AMP_B_POSITION, &values_0_to_99}, + {"Amp Level", AMP_LEVEL, AMP_B_POSITION, &values_0_to_99}, {"EQ Enable", EQ_ENABLE, EQ_A_POSITION, &values_on_off}, {"EQ Bass", EQ_BASS, EQ_A_POSITION, &values_eq_db}, {"EQ Mid", EQ_MID, EQ_A_POSITION, &values_eq_db}, {"EQ Treb", EQ_TREB, EQ_A_POSITION, &values_eq_db}, + {"EQ Treb", EQ_PRESENCE, EQ_A_POSITION, &values_eq_db}, + {"EQ Enable", EQ_ENABLE, EQ_B_POSITION, &values_on_off}, + {"EQ Bass", EQ_BASS, EQ_B_POSITION, &values_eq_db}, + {"EQ Mid", EQ_MID, EQ_B_POSITION, &values_eq_db}, + {"EQ Treb", EQ_TREB, EQ_B_POSITION, &values_eq_db}, + {"EQ Treb", EQ_PRESENCE, EQ_B_POSITION, &values_eq_db}, {"Gate Enable", NOISEGATE_ON_OFF, NOISEGATE_POSITION, &values_on_off}, {"Gate Pluck Sens", NOISEGATE_SWELL_SENS, NOISEGATE_POSITION, &values_0_to_99}, {"Gate Threshold", NOISEGATE_GATE_TRESHOLD, NOISEGATE_POSITION, &values_0_to_99}, @@ -3903,10 +3912,10 @@ XmlSettings xml_settings[] = { {AMP_CHANNEL, AMP_CHANNEL_POSITION, "Amp Channel", &values_a_b, xml_amp_channel_labels, G_N_ELEMENTS(xml_amp_channel_labels)}, - {AMP_TYPE, AMP_POSITION, "Amp A Type", &values_amp_type, xml_amp_labels, G_N_ELEMENTS(xml_amp_labels)}, - {AMP_ON_OFF, AMP_POSITION, "Amp A Enable", &values_on_off, xml_on_off_labels, G_N_ELEMENTS(xml_on_off_labels)}, - {AMP_GAIN, AMP_POSITION, "Amp A Gain", &values_0_to_99,}, - {AMP_LEVEL, AMP_POSITION, "Amp A Level", &values_0_to_99,}, + {AMP_TYPE, AMP_A_POSITION, "Amp A Type", &values_amp_type, xml_amp_labels, G_N_ELEMENTS(xml_amp_labels)}, + {AMP_ON_OFF, AMP_A_POSITION, "Amp A Enable", &values_on_off, xml_on_off_labels, G_N_ELEMENTS(xml_on_off_labels)}, + {AMP_GAIN, AMP_A_POSITION, "Amp A Gain", &values_0_to_99,}, + {AMP_LEVEL, AMP_A_POSITION, "Amp A Level", &values_0_to_99,}, {AMP_TYPE, AMP_B_POSITION, "Amp B Type", &values_amp_type, xml_amp_labels, G_N_ELEMENTS(xml_amp_labels)}, {AMP_ON_OFF, AMP_B_POSITION, "Amp B Enable", &values_on_off, xml_on_off_labels, G_N_ELEMENTS(xml_on_off_labels)}, @@ -4046,8 +4055,8 @@ XmlSettings xml_settings[] = { {EQ_BASS, EQ_A_POSITION, "EQ A Bass", &values_eq_db,}, {EQ_MID, EQ_A_POSITION, "EQ A Mid", &values_eq_db,}, {EQ_TREB, EQ_A_POSITION, "EQ A Treb", &values_eq_db,}, - {EQ_MID_FREQ, EQ_A_POSITION, "EQ A Mid Freq", &values_eq_mid_hz,}, {EQ_PRESENCE, EQ_A_POSITION, "EQ A Presence", &values_eq_db,}, + {EQ_MID_FREQ, EQ_A_POSITION, "EQ A Mid Freq", &values_eq_mid_hz,}, {EQ_TREB_FREQ, EQ_A_POSITION, "EQ A Treb Freq", &values_eq_treb_hz,}, {EQ_ENABLE, EQ_B_POSITION, "EQ B Enable", &values_on_off, xml_on_off_labels, G_N_ELEMENTS(xml_on_off_labels)}, @@ -4055,8 +4064,8 @@ XmlSettings xml_settings[] = { {EQ_BASS, EQ_B_POSITION, "EQ B Bass", &values_eq_db,}, {EQ_MID, EQ_B_POSITION, "EQ B Mid", &values_eq_db,}, {EQ_TREB, EQ_B_POSITION, "EQ B Treb", &values_eq_db,}, - {EQ_MID_FREQ, EQ_B_POSITION, "EQ B Mid Freq", &values_eq_mid_hz,}, {EQ_PRESENCE, EQ_B_POSITION, "EQ B Presence", &values_eq_db,}, + {EQ_MID_FREQ, EQ_B_POSITION, "EQ B Mid Freq", &values_eq_mid_hz,}, {EQ_TREB_FREQ, EQ_B_POSITION, "EQ B Treb Freq", &values_eq_treb_hz,}, {TONE_LIB_TYPE, LIB_POSITION, "Tone Lib Type", &values_tone_lib_type, xml_tone_lib_labels, G_N_ELEMENTS(xml_tone_lib_labels)}, @@ -4172,7 +4181,7 @@ ModifierGroup *modifier_linkable_list(GString *msg) if (group[i].settings == NULL) group[i].settings_amt = 0; - g_message("ID: %d Position: %d Label: %s", id, position, modifier ? modifier->label : NULL); + g_message("ID: %4d Position: %2d Label: %s", id, position, modifier ? modifier->label : NULL); } modifier_group->group = group; diff --git a/gdigi.c b/gdigi.c index 76fd240..1d691fc 100644 --- a/gdigi.c +++ b/gdigi.c @@ -250,7 +250,7 @@ void push_message(GString *msg) case RECEIVE_PARAMETER_VALUE: unpack_message(msg); SettingParam *param = setting_param_new_from_data(&msg->str[8], NULL); - g_message("ID: %d Position: %d Value: %d", param->id, param->position, param->value); + g_message("ID: %5d Position: %2d Value: %.1d", param->id, param->position, param->value); GDK_THREADS_ENTER(); apply_setting_param_to_gui(param); @@ -304,7 +304,7 @@ void push_message(GString *msg) x = 10; do { param = setting_param_new_from_data(&msg->str[x], &x); - g_message("Received global param ID: %d Position: %d Value: %d", + g_message("Received global param ID: %5d Position: %2.1d Value: %6.1d", param->id, param->position, param->value); setting_param_free(param); } while ( (x < msg->len) && n < tot); diff --git a/gdigi.h b/gdigi.h index 45aece8..dfdbcbe 100644 --- a/gdigi.h +++ b/gdigi.h @@ -315,7 +315,7 @@ enum { #define AMP_TYPE 2496 #define AMP_ON_OFF 265 -#define AMP_POSITION 8 +#define AMP_A_POSITION 8 #define AMP_B_POSITION 10 #define AMP_LOOP_ON_OFF 3649 @@ -427,7 +427,6 @@ enum { #define EQ_TREB_FREQ 3211 #define EQ_ENABLE 3212 - #define EQ_LOW_FREQ 3213 #define EQ_MID_FREQ_XXX 3214 #define EQ_HIGH_FREQ 3215 diff --git a/preset.c b/preset.c index 21ed711..bb26903 100644 --- a/preset.c +++ b/preset.c @@ -326,7 +326,8 @@ Preset *create_preset_from_data(GList *list) SettingParam *param = setting_param_new_from_data(&data->str[x], &x); n++; preset->params = g_list_prepend(preset->params, param); - g_message("%d ID %d Position %d Value %d", n, param->id, param->position, param->value); + g_message("%3d ID %4d Position %2d Value %6.1d", + n, param->id, param->position, param->value); } while ((x < data->len) && nparams = g_list_sort(preset->params, params_cmp); From 71e087cfd0f5cf9b66f2eeec096d792a676ef1d8 Mon Sep 17 00:00:00 2001 From: Tim LaBerge Date: Sun, 26 Feb 2012 21:27:54 -0800 Subject: [PATCH 06/18] Presence effect in wrong place for some devices. --- effects.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/effects.c b/effects.c index 9e798e1..24e5666 100644 --- a/effects.c +++ b/effects.c @@ -1014,9 +1014,9 @@ static EffectSettings gnx3k_ch1_amp_eq_settings[] = { {"Bass Level", AMP_BASS_LEVEL, AMP_A_POSITION, &values_eq_db}, {"Mid Freq", AMP_MID_FREQ, AMP_A_POSITION, &values_eq_mid_hz}, {"Mid Level", AMP_MID_LEVEL, AMP_A_POSITION, &values_eq_db}, - {"Presence", AMP_PRESENCE, AMP_A_POSITION, &values_eq_db}, {"Treb Freq", AMP_TREBLE_FREQ, AMP_A_POSITION, &values_eq_treb_hz}, {"Treb Level", AMP_TREBLE_LEVEL, AMP_A_POSITION, &values_eq_db}, + {"Presence", AMP_PRESENCE, AMP_A_POSITION, &values_eq_db}, {"Level", AMP_LEVEL, AMP_A_POSITION, &values_0_to_99}, }; @@ -1026,9 +1026,9 @@ static EffectSettings gnx3k_ch2_amp_eq_settings[] = { {"Bass Level", AMP_BASS_LEVEL, AMP_B_POSITION, &values_eq_db}, {"Mid Freq", AMP_MID_FREQ, AMP_B_POSITION, &values_eq_mid_hz}, {"Mid Level", AMP_MID_LEVEL, AMP_B_POSITION, &values_eq_db}, - {"Presence", AMP_PRESENCE, AMP_B_POSITION, &values_eq_db}, {"Treb Freq", AMP_TREBLE_FREQ, AMP_B_POSITION, &values_eq_treb_hz}, {"Treb Level", AMP_TREBLE_LEVEL, AMP_B_POSITION, &values_eq_db}, + {"Presence", AMP_PRESENCE, AMP_B_POSITION, &values_eq_db}, {"Level", AMP_LEVEL, AMP_B_POSITION, &values_0_to_99}, }; From 9fcf6939d0bebade96a4b0c711ea031276aaa7c0 Mon Sep 17 00:00:00 2001 From: Tim LaBerge Date: Sun, 26 Feb 2012 21:52:27 -0800 Subject: [PATCH 07/18] Add labels to debug messages. Add a global settings settings to the xml settings array. Start adding label strings to the debug messages. This needs cleaning up, but it should help. --- effects.c | 8 ++++++++ gdigi.c | 14 +++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/effects.c b/effects.c index 24e5666..2a61fc0 100644 --- a/effects.c +++ b/effects.c @@ -4074,6 +4074,14 @@ XmlSettings xml_settings[] = { {FX_LIB_LEVEL_MAX1, LIB_POSITION, "FxLibLvlMax1", &values_0_to_99,}, {FX_LIB_LEVEL_MAX2, LIB_POSITION, "FxLibLvlMax2", &values_0_to_99,}, {FX_LIB_LEVEL_MAX3, LIB_POSITION, "FxLibLvlMax3", &values_0_to_99,}, + + // Global settings, not part of presets or standard XML. + {TUNING_REFERENCE, GLOBAL_POSITION, "Tuning Reference", &values_0_to_99,}, + {USB_AUDIO_PLAYBACK_MIX, GLOBAL_POSITION, "USB Audio Playback Mix", &values_0_to_99,}, + {USB_AUDIO_LEVEL, GLOBAL_POSITION, "USB Audio Level", &values_0_to_99,}, + {GUI_MODE_ON_OFF, GLOBAL_POSITION, "GUI Mode", &values_0_to_99,}, + {EXP_PEDAL_LEVEL, GLOBAL_POSITION, "EXP Pedal Level", &values_0_to_99,}, + {STOMP_MODE, GLOBAL_POSITION, "Stomp Mode", &values_0_to_99,}, }; diff --git a/gdigi.c b/gdigi.c index 1d691fc..aa4c53a 100644 --- a/gdigi.c +++ b/gdigi.c @@ -218,6 +218,9 @@ MessageID get_message_id(GString *msg) return -1; } +#include "gdigi_xml.h" +extern XmlSettings *get_xml_settings (guint id, guint position); + void push_message(GString *msg) { MessageID msgid = get_message_id(msg); @@ -238,6 +241,7 @@ void push_message(GString *msg) } g_message("Received %s", get_message_name(msgid)); + SettingParam *param; switch (msgid) { case ACK: g_string_free(msg, TRUE); @@ -248,9 +252,12 @@ void push_message(GString *msg) return; case RECEIVE_PARAMETER_VALUE: + { unpack_message(msg); - SettingParam *param = setting_param_new_from_data(&msg->str[8], NULL); - g_message("ID: %5d Position: %2d Value: %.1d", param->id, param->position, param->value); + param = setting_param_new_from_data(&msg->str[8], NULL); + XmlSettings *xml = get_xml_settings(param->id, param->position); + char *label = xml ? xml->label : "NULL"; + g_message("ID: %5d Position: %2d Value: %.1d: %s", param->id, param->position, param->value, label); GDK_THREADS_ENTER(); apply_setting_param_to_gui(param); @@ -259,6 +266,7 @@ void push_message(GString *msg) setting_param_free(param); g_string_free(msg, TRUE); return; + } case RECEIVE_DEVICE_NOTIFICATION: unpack_message(msg); @@ -304,7 +312,7 @@ void push_message(GString *msg) x = 10; do { param = setting_param_new_from_data(&msg->str[x], &x); - g_message("Received global param ID: %5d Position: %2.1d Value: %6.1d", + g_message("Received global param ID: %5d Position: %2.1d Value: %6.1d: %s", param->id, param->position, param->value); setting_param_free(param); } while ( (x < msg->len) && n < tot); From a073f5cde2fbee953ad2fd3c00aa0b3732291c50 Mon Sep 17 00:00:00 2001 From: Tim LaBerge Date: Mon, 27 Feb 2012 20:26:42 -0800 Subject: [PATCH 08/18] Refine logging infrastructure. 1) Make logging conditional on debug flags. 2) Add command line option for setting these flags. 3) Emit warnings with g_warning() instead of g_message(). 4) Added note about how FX_LIB_LEVEL_MAX[1-3] is used. --- effects.c | 9 ++- gdigi.c | 162 +++++++++++++++++++++++++++++++++++++++------------ gdigi.h | 18 +++++- gui.c | 9 +-- preset.c | 33 ++++++----- preset_xml.c | 14 +++-- 6 files changed, 183 insertions(+), 62 deletions(-) diff --git a/effects.c b/effects.c index 2a61fc0..babd72a 100644 --- a/effects.c +++ b/effects.c @@ -4167,7 +4167,10 @@ ModifierGroup *modifier_linkable_list(GString *msg) modifier_group->type = EXP_TYPE; modifier_group->position = EXP_POSITION; - g_message("Group %d count %d", group_id, count); + debug_msg(DEBUG_MSG2HOST|DEBUG_GROUP, + "RECEIVE_MODIFIER_LINKABLE_LIST: Group %d count %d", + group_id, count); + EffectGroup *group = g_slice_alloc(count * sizeof(EffectGroup)); for (i=0; ilabel : NULL); + debug_msg(DEBUG_MSG2HOST|DEBUG_GROUP, + "ID: %4d Position: %2d Label: %s", + id, position, modifier ? modifier->label : NULL); } modifier_group->group = group; diff --git a/gdigi.c b/gdigi.c index aa4c53a..f047003 100644 --- a/gdigi.c +++ b/gdigi.c @@ -35,6 +35,63 @@ static GQueue *message_queue = NULL; static GMutex *message_queue_mutex = NULL; static GCond *message_queue_cond = NULL; +static guint DebugFlags; + +gboolean +debug_flag_is_set (debug_flags_t flags) +{ + if (DebugFlags & flags) { + return TRUE; + } + return FALSE; +} + +gboolean set_debug_flags (const gchar *option_name, const gchar *value, + gpointer data, GError **error) +{ + if (strchr(value, 'd')) { + DebugFlags |= DEBUG_MSG2DEV; + } + if (strchr(value, 'h')) { + DebugFlags |= DEBUG_MSG2HOST; + } + if (strchr(value, 's')) { + DebugFlags |= DEBUG_STARTUP; + } + if (strchr(value, 'H')) { + DebugFlags |= DEBUG_HEX; + } + if (strchr(value, 'g')) { + DebugFlags |= DEBUG_GROUP; + } + if (strchr(value, 'x')) { + DebugFlags |= DEBUG_XML; + } + if (strchr(value, 'v')) { + DebugFlags |= DEBUG_VERBOSE; + } + if (strchr(value, 'a')) { + DebugFlags = -1; + } + + return TRUE; +} + +void +debug_msg (debug_flags_t flags, char *fmt, ...) +{ + char buf[1024]; + if (flags & DebugFlags) { + va_list ap; + + va_start(ap, fmt); + vsnprintf(buf, 1024, fmt, ap); + va_end(ap); + + g_message("%s", buf); + } +} + /** * Registers an error quark for gdigi if necessary. * @@ -225,21 +282,23 @@ void push_message(GString *msg) { MessageID msgid = get_message_id(msg); if (((unsigned char)msg->str[0] == 0xF0) && ((unsigned char)msg->str[msg->len-1] == 0xF7)) - g_message("Pushing correct message!"); + debug_msg(DEBUG_VERBOSE, "Pushing correct message!"); else g_warning("Pushing incorrect message!"); int x; - for (x = 0; xlen; x++) { - if (x && (x % 26) == 0) { + if (debug_flag_is_set(DEBUG_HEX)) { + for (x = 0; xlen; x++) { + if (x && (x % 26) == 0) { + printf("\n"); + } + printf("%02x ", (unsigned char)msg->str[x]); + } + if (x % 26) { printf("\n"); } - printf("%02x ", (unsigned char)msg->str[x]); } - if (x % 26) { - printf("\n"); - } - g_message("Received %s", get_message_name(msgid)); + debug_msg(DEBUG_VERBOSE, "Received %s", get_message_name(msgid)); SettingParam *param; switch (msgid) { @@ -248,6 +307,7 @@ void push_message(GString *msg) return; case NACK: + g_warning("Received NACK!"); g_string_free(msg, TRUE); return; @@ -257,7 +317,11 @@ void push_message(GString *msg) param = setting_param_new_from_data(&msg->str[8], NULL); XmlSettings *xml = get_xml_settings(param->id, param->position); char *label = xml ? xml->label : "NULL"; - g_message("ID: %5d Position: %2d Value: %.1d: %s", param->id, param->position, param->value, label); + debug_msg(DEBUG_MSG2HOST, + "RECEIVE_PARAMETER_VALUE: ID: %5d Position: %2d " + "Value: %6.1d: %s", + param->id, param->position, + param->value, label); GDK_THREADS_ENTER(); apply_setting_param_to_gui(param); @@ -274,28 +338,40 @@ void push_message(GString *msg) switch (str[8]) { case NOTIFY_PRESET_MOVED: if (str[11] == PRESETS_EDIT_BUFFER && str[12] == 0) { - g_message("Loaded preset %d from bank %d", str[10], str[9]); GDK_THREADS_ENTER(); g_timeout_add(0, apply_current_preset_to_gui, NULL); GDK_THREADS_LEAVE(); + debug_msg(DEBUG_MSG2HOST, + "RECEIVE_DEVICE_NOTIFICATION: Loaded preset " + "%d from bank %d", + str[10], str[9]); } else { - g_message("%d %d moved to %d %d", str[9], str[10], str[11], str[12]); + debug_msg(DEBUG_MSG2HOST, + "RECEIVE_DEVICE_NOTIFICATION: %d %d moved to " + "%d %d", + str[9], str[10], + str[11], str[12]); } case NOTIFY_MODIFIER_GROUP_CHANGED: { int i; - printf("\n"); - for (i = 0; i < msg->len; i++) { - printf(" %02x", (unsigned char) str[i]); + if (debug_flag_is_set(DEBUG_HEX)) { + printf("\n"); + for (i = 0; i < msg->len; i++) { + printf(" %02x", (unsigned char) str[i]); + } + printf("\n"); } - printf("\n"); - g_message("Modifier group id %d changed", - (str[9] << 8) | (str[10])); + debug_msg(DEBUG_MSG2HOST, + "NOTIFY_MODIFIER_GROUP_CHANGED: Modifier group " + "id %d changed", + (str[9] << 8) | (str[10])); break; } default: - g_message("Received unhandled device notification 0x%x", str[11]); + g_warning("Received unhandled device notification 0x%x", + str[11]); } g_string_free(msg, TRUE); return; @@ -303,17 +379,22 @@ void push_message(GString *msg) unpack_message(msg); gint tot, n, x; tot = (unsigned char)msg->str[9]; - for (n = 0; n < msg->len; n++) { - printf("%02x ",(unsigned char) msg->str[n]); + if (debug_flag_is_set(DEBUG_HEX)) { + for (n = 0; n < msg->len; n++) { + printf("%02x ",(unsigned char) msg->str[n]); + } + printf("\n"); } - printf("\n"); n = 0; x = 10; do { param = setting_param_new_from_data(&msg->str[x], &x); - g_message("Received global param ID: %5d Position: %2.1d Value: %6.1d: %s", - param->id, param->position, param->value); + debug_msg(DEBUG_MSG2HOST, + "RECEIVE_GLOBAL_PARAMETERS ID: %5d " + "Position: %2.1d Value: %6.1d: %s", + param->id, + param->position, param->value, "XXX"); setting_param_free(param); } while ( (x < msg->len) && n < tot); @@ -324,10 +405,13 @@ void push_message(GString *msg) case RECEIVE_MODIFIER_LINKABLE_LIST: unpack_message(msg); tot = (unsigned char)msg->str[9]; - for (n = 0; n < msg->len; n++) { - printf("%02x ",(unsigned char) msg->str[n]); + + if (debug_flag_is_set(DEBUG_HEX)) { + for (n = 0; n < msg->len; n++) { + printf("%02x ",(unsigned char) msg->str[n]); + } + printf("\n"); } - printf("\n"); modifier_linkable_list(msg); @@ -461,7 +545,8 @@ void send_message(gint procedure, gchar *data, gint len) g_string_append_printf(msg, "%c\xF7", calculate_checksum(&msg->str[1], msg->len - 1)); - g_message("Sending message %s len %d", get_message_name(procedure), len); + debug_msg(DEBUG_VERBOSE, "Sending message %s len %d", + get_message_name(procedure), len); send_data(msg->str, msg->len); g_string_free(msg, TRUE); @@ -682,7 +767,7 @@ SectionID get_genetx_section_id(gint version, gint type) } } - g_message("This version of gdigi don't know what to do with this " + g_warning("This version of gdigi don't know what to do with this " "GeNetX version (%d) and type (%d)", version, type); return -1; @@ -698,7 +783,8 @@ SectionID get_genetx_section_id(gint version, gint type) void get_option(guint id, guint position) { GString *msg = g_string_sized_new(9); - g_message("Requesting parameter id %d position %d", id, position); + debug_msg(DEBUG_MSG2DEV, "REQUEST_PARAMETER_VALUE: id %d position %d", + id, position); g_string_append_printf(msg, "%c%c%c", ((id & 0xFF00) >> 8), (id & 0xFF), position); @@ -719,7 +805,8 @@ void set_option(guint id, guint position, guint value) ((id & 0xFF00) >> 8), (id & 0xFF), position); append_value(msg, value); - g_message("Sending id %d position %d value %d", id, position, value); + debug_msg(DEBUG_MSG2DEV, "Sending id %d position %d value %d", + id, position, value); send_message(RECEIVE_PARAMETER_VALUE, msg->str, msg->len); g_string_free(msg, TRUE); } @@ -930,7 +1017,7 @@ GList *get_message_list(MessageID id) } while (amt) { - g_message("%d messages left", amt); + debug_msg(DEBUG_VERBOSE, "%d messages left", amt); data = g_queue_pop_nth(message_queue, x); if (data == NULL) { g_cond_wait(message_queue_cond, message_queue_mutex); @@ -1185,6 +1272,9 @@ static void request_device_configuration() static GOptionEntry options[] = { {"device", 'd', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_STRING, &device_port, "MIDI device port to use", NULL}, + {"debug-flags", 'D', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_CALLBACK, set_debug_flags, + "Set debug flags: any combination of a, d, h, s:\n", + NULL}, {NULL} }; @@ -1233,7 +1323,7 @@ int main(int argc, char *argv[]) { g_option_context_add_group(context, gtk_get_option_group(TRUE)); if (!g_option_context_parse(context, &argc, &argv, &error)) { - g_message("option parsing failed: %s\n", error->message); + g_warning("option parsing failed: %s\n", error->message); g_error_free(error); g_option_context_free(context); exit(EXIT_FAILURE); @@ -1243,15 +1333,15 @@ int main(int argc, char *argv[]) { /* port not given explicitly in commandline - search for devices */ GList *devices = NULL; if (get_digitech_devices(&devices) <= 0) { - g_message("Couldn't find DigiTech devices!"); + g_warning("Couldn't find DigiTech devices!"); exit(EXIT_FAILURE); } device_port = g_strdup_printf("hw:%d,0,0", GPOINTER_TO_INT(devices->data)); g_list_free(devices); - g_message("Found device %s", device_port); + debug_msg(DEBUG_STARTUP, "Found device %s\n", device_port); } else { - g_message("Using device %s", device_port); + debug_msg(DEBUG_STARTUP, "Using device %s\n", device_port); } g_option_context_free(context); @@ -1301,7 +1391,7 @@ int main(int argc, char *argv[]) { } if (message_queue != NULL) { - g_message("%d unread messages in queue", + g_warning("%d unread messages in queue", g_queue_get_length(message_queue)); g_queue_foreach(message_queue, (GFunc) message_free_func, NULL); g_queue_free(message_queue); diff --git a/gdigi.h b/gdigi.h index dfdbcbe..0b8d7ae 100644 --- a/gdigi.h +++ b/gdigi.h @@ -22,6 +22,19 @@ #ifndef DOXYGEN_SHOULD_SKIP_THIS +typedef enum { + DEBUG_MSG2DEV = (1 << 0), // Device bound messages. + DEBUG_MSG2HOST = (1 << 1), // Host bound messages. + DEBUG_STARTUP = (1 << 2), + DEBUG_GROUP = (1 << 3), // Modifier group + DEBUG_HEX = (1 << 4), // Dump message contents in hex. + DEBUG_XML = (1 << 5), + DEBUG_VERBOSE = (1 << 6), +} debug_flags_t; + +void debug_msg (debug_flags_t, char *fmt, ...); +gboolean debug_flag_is_set (debug_flags_t flag); + #define GNX_CHANNEL_POSITION 7 #define GNX_CHANNEL_AMP 260 #define GNX_WARP 261 @@ -885,7 +898,10 @@ enum { #define TONE_LIB_TYPE 8704 #define FX_LIB_TYPE 8705 -#define FX_LIB_LEVEL 8706 +#define FX_LIB_LEVEL 8706 // This influences pitch shift mix, delay level, + // and reverb level, in proportion, as + // specified by FX_LIB_LEVEL_MAX1,2,3. + // #define FX_LIB_LEVEL_MAX1 8708 #define FX_LIB_LEVEL_MAX2 8710 #define FX_LIB_LEVEL_MAX3 8712 diff --git a/gui.c b/gui.c index c3048c8..56075c0 100644 --- a/gui.c +++ b/gui.c @@ -248,7 +248,7 @@ static gboolean custom_value_output_cb(GtkSpinButton *spin, EffectValues *values if (values->type & VALUE_TYPE_EXTRA) { values = values->extra; } else { - g_message("custom_value_output_cb called with out of bounds value"); + g_warning("custom_value_output_cb called with out of bounds value"); return FALSE; } } @@ -977,7 +977,7 @@ static void action_open_preset_cb(GtkAction *action) for (x=0; xmessage); + g_warning("building menus failed: %s", error->message); g_error_free(error); error = NULL; } @@ -1405,7 +1405,8 @@ gboolean unsupported_device_dialog(Device **device) if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { gint number = gtk_combo_box_get_active(GTK_COMBO_BOX(combo_box)); if (number != -1 && number name); + g_message("Starting %s compability mode", + supported_devices[number]->name); *device = supported_devices[number]; gtk_widget_destroy(dialog); return TRUE; diff --git a/preset.c b/preset.c index bb26903..f5e056d 100644 --- a/preset.c +++ b/preset.c @@ -69,7 +69,7 @@ static void XMLCALL start(void *data, const char *el, const char **attr) { if (g_strcmp0(el, "Params") == 0) { ad->section = SECTION_PARAMS; if (ad->preset->params != NULL) - g_message("Params aleady exists!"); + g_warning("Params aleady exists!"); } else if (g_strcmp0(el, "Param") == 0) { SettingParam *param = setting_param_new(); ad->preset->params = g_list_prepend(ad->preset->params, param); @@ -84,7 +84,7 @@ static void XMLCALL start(void *data, const char *el, const char **attr) { } else if (g_strcmp0(el, "Genetx") == 0) { ad->section = SECTION_GENETX; if (ad->preset->genetxs != NULL) - g_message("Genetx already exists!"); + g_warning("Genetx already exists!"); } else if (g_strcmp0(el, "GenetxModel") == 0) { SettingGenetx *genetx = setting_genetx_new(); ad->preset->genetxs = g_list_prepend(ad->preset->genetxs, genetx); @@ -160,7 +160,7 @@ static void XMLCALL text_cb(void *data, const char* text, int len) } else if (g_strcmp0(value, "Version2") == 0) { genetx->version = GENETX_VERSION_2; } else { - g_message("Unknown GeNetX version: %s", value); + g_warning("Unknown GeNetX version: %s", value); } break; case PARSER_TYPE_GENETX_TYPE: @@ -169,7 +169,7 @@ static void XMLCALL text_cb(void *data, const char* text, int len) } else if (g_strcmp0(value, "Cabinet") == 0) { genetx->type = GENETX_TYPE_CABINET; } else { - g_message("Unknown GeNetX type: %s", value); + g_warning("Unknown GeNetX type: %s", value); } break; case PARSER_TYPE_GENETX_CHANNEL: @@ -178,7 +178,7 @@ static void XMLCALL text_cb(void *data, const char* text, int len) } else if (g_strcmp0(value, "Channel2") == 0) { genetx->channel = GENETX_CHANNEL2; } else { - g_message("Unknown GeNetX channel: %s", value); + g_warning("Unknown GeNetX channel: %s", value); } break; case PARSER_TYPE_GENETX_NAME: @@ -219,7 +219,7 @@ Preset *create_preset_from_xml_file(gchar *filename, GError **error) gchar *contents; if (g_file_get_contents(filename, &contents, NULL, &err) == FALSE) { - g_message("Failed to get %s contents: %s", filename, err->message); + g_warning("Failed to get %s contents: %s", filename, err->message); *error = g_error_copy(err); g_error_free(err); return NULL; @@ -308,12 +308,16 @@ Preset *create_preset_from_data(GList *list) modified = (unsigned char)data->str[11+strlen(name)]; if ((bank == PRESETS_EDIT_BUFFER) && (number == 0)) { - g_message("Received current edit buffer"); + debug_msg(DEBUG_MSG2HOST, + "RECEIVE_PRESET_START: current edit buffer"); } else { - g_message("Received preset %d from bank %d", number, bank); + debug_msg(DEBUG_MSG2HOST, + "RECEIVE_PRESET_START: preset %d from bank %d", + number, bank); } - g_message("Modified flag: %d Name: %s", modified, name); + debug_msg(DEBUG_MSG2HOST, "Name: %s, %sodified", + name, modified ? "M" : "Not m"); preset->name = name; break; case RECEIVE_PRESET_PARAMETERS: @@ -326,16 +330,19 @@ Preset *create_preset_from_data(GList *list) SettingParam *param = setting_param_new_from_data(&data->str[x], &x); n++; preset->params = g_list_prepend(preset->params, param); - g_message("%3d ID %4d Position %2d Value %6.1d", - n, param->id, param->position, param->value); + debug_msg(DEBUG_MSG2HOST, "%3d ID %4d Position %2d " + "Value %6.1d", + n, param->id, param->position, + param->value); } while ((x < data->len) && nparams = g_list_sort(preset->params, params_cmp); break; case RECEIVE_PRESET_END: break; default: - g_message("Unhandled message in preset messages list"); + g_warning("Unhandled message 0x%x in preset messages list", + get_message_id(data)); } } diff --git a/preset_xml.c b/preset_xml.c index f2f246c..4fd354d 100644 --- a/preset_xml.c +++ b/preset_xml.c @@ -57,11 +57,12 @@ map_xml_value(XmlSettings *xml, gint value) switch (xml->values->type) { case VALUE_TYPE_LABEL: if ((xml->values == &values_on_off) && (value > 1)) { - g_message("Skipping modifier->label %s\n", xml->label); + g_warning("Skipping modifier->label %s\n", xml->label); return NULL; } if (value > xml->values->max || value < xml->values->min) { - g_message("%s value %d out of range %0.1f %0.1f", xml->label, value, xml->values->min, xml->values->max); + g_warning("%s value %d out of range %0.1f %0.1f", + xml->label, value, xml->values->min, xml->values->max); } { XmlLabel *labels = xml->xml_labels; @@ -142,7 +143,7 @@ write_preset_to_xml(Preset *preset, gchar *filename) SettingParam *param = (SettingParam *) iter_params->data; if (param->id == last_id && param->position == last_position) { - g_message("Skipping duplicate parameter id %d position %d", + g_warning("Skipping duplicate parameter id %d position %d", last_id, last_position); iter_params = iter_params->next; continue; @@ -206,8 +207,9 @@ write_preset_to_xml(Preset *preset, gchar *filename) { char *textp = map_xml_value(xml, param->value); if (!textp) { - g_message("Unable to map %s value %d for id %d position %d", - xml->label, param->value, param->id, param->position); + g_warning("Unable to map %s value %d for id %d position %d", + xml->label, param->value, param->id, + param->position); textp = ""; } rc = xmlTextWriterWriteElement(writer, BAD_CAST "Text", @@ -235,7 +237,7 @@ write_preset_to_xml(Preset *preset, gchar *filename) break; default: - g_message("Unhandled value type %d", type); + g_warning("Unhandled value type %d", type); break; } } From 87ae4cd280cda8c81fda070b300107e651fd31b0 Mon Sep 17 00:00:00 2001 From: Tim LaBerge Date: Sat, 31 Mar 2012 17:45:12 -0700 Subject: [PATCH 09/18] Add 'Label' to modifier group log message. --- effects.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/effects.c b/effects.c index babd72a..64f733e 100644 --- a/effects.c +++ b/effects.c @@ -4193,7 +4193,7 @@ ModifierGroup *modifier_linkable_list(GString *msg) group[i].settings_amt = 0; debug_msg(DEBUG_MSG2HOST|DEBUG_GROUP, - "ID: %4d Position: %2d Label: %s", + "ID: %4d Position: %2d: %s", id, position, modifier ? modifier->label : NULL); } From 3002d2256e5f24d69da9707ec2882c5131ca312c Mon Sep 17 00:00:00 2001 From: Tim LaBerge Date: Fri, 6 Apr 2012 08:57:08 -0700 Subject: [PATCH 10/18] Human readable debug Leverage the code that writes a preset to XML so that messages can be displayed in a human readable format. E.g., (6, 2432, 1280) Distortion: Dist Type: Screamer The 3-tuple is position, id, value, which is followed by the colon separated decode of the position, id, and the mapped value. --- effects.c | 47 +++++++++++++++++- effects.h | 1 + gdigi.c | 133 ++++++++++++++++++++++++++++++++++++++++++++------- gdigi.h | 3 +- gdigi_xml.h | 4 +- preset.c | 9 ++-- preset_xml.c | 8 ++-- 7 files changed, 176 insertions(+), 29 deletions(-) diff --git a/effects.c b/effects.c index 64f733e..49dc843 100644 --- a/effects.c +++ b/effects.c @@ -4020,7 +4020,7 @@ XmlSettings xml_settings[] = { {WAH_ON_OFF, WAH_POSITION, "Wah Enable", &values_on_off, xml_on_off_labels, G_N_ELEMENTS(xml_on_off_labels)}, {WAH_PEDAL_POSITION, WAH_POSITION, "Wah Position", &values_0_to_99,}, {WAH_VOLUME_BOOST, WAH_POSITION, "Wah Vol. Boost", &values_db_boost,}, - {MOD_TYPE, MOD_POSITION, "Mod Type", &values_0_to_99,}, // ??? + //{MOD_TYPE, MOD_POSITION, "Mod Type", &values_0_to_99,}, // ??? {PRESET_LEVEL, PRESET_POSITION, "Preset Level", &values_0_to_99,}, @@ -4084,8 +4084,51 @@ XmlSettings xml_settings[] = { {STOMP_MODE, GLOBAL_POSITION, "Stomp Mode", &values_0_to_99,}, }; - guint n_xml_settings = G_N_ELEMENTS(xml_settings); + +gchar *Positions[] = { + [ GLOBAL_POSITION ] = "Global", + [ PICKUP_POSITION ] = "Pickup", + [ WAH_POSITION ] = "Wah", + [ COMP_POSITION ] = "Compressor", + [ GNX3K_WHAM_POSITION ] = "Gnx3K Wham", + [ DIST_POSITION ] = "Distortion", + [ AMP_CHANNEL_POSITION ] = "Amp Channel", + [ GNX_CHANNEL_POSITION ] = "Gnx Channel", + [ AMP_A_POSITION ] = "Amp A", + [ AMP_CAB_POSITION ] = "Amp Cab A", + [ AMP_B_POSITION ] = "Amp B", + [ AMP_CAB_B_POSITION ] = "Amp Cab B", + [ NOISEGATE_POSITION ] = "Noise Gate", + [ VOLUME_PRE_FX_POSITION ] = "Volume Pre Fx", + [ CHORUSFX_POSITION ] = "Chorus Fx", + [ DELAY_POSITION ] = "Delay", + [ REVERB_POSITION ] = "Reverb", + [ VOLUME_POST_FX_POSITION ] = "Volume Post Fx", + [ PRESET_POSITION ] = "Preset", + [ EXP_POSITION ] = "Expression", + [ WAH_POSITION_MIN_MAX ] = "Wah Min Max", + [ VSWITCH_ASSIGN_POSITION ] = "Vswitch", + [ LFO1_POSITION ] = "LFO 1", + [ LFO2_POSITION ] = "LFO 2", + [ EQ_A_POSITION ] = "EQ A", + [ EQ_B_POSITION ] = "EQ B", + [ LIB_POSITION ] = "Library", + [ AMP_LOOP_POSITION ] = "Amp Loop", +}; + +guint max_position = G_N_ELEMENTS(Positions); + +gchar * +get_position (guint position) +{ + if (position > max_position) { + return ""; + } + + return Positions[position]; +} + #endif /* DOXYGEN_SHOULD_SKIP_THIS */ /** diff --git a/effects.h b/effects.h index 3ffddce..9f7860c 100644 --- a/effects.h +++ b/effects.h @@ -116,6 +116,7 @@ typedef struct { gint n_banks; } Device; +gchar *get_position(guint position); ModifierGroup *modifier_linkable_list(); void modifier_group_free(ModifierGroup *modifier_group); void get_values_info(EffectValues *values, diff --git a/gdigi.c b/gdigi.c index f047003..1a0fcb9 100644 --- a/gdigi.c +++ b/gdigi.c @@ -21,6 +21,7 @@ #include #include #include "gdigi.h" +#include "gdigi_xml.h" #include "gui.h" static unsigned char device_id = 0x7F; @@ -55,6 +56,9 @@ gboolean set_debug_flags (const gchar *option_name, const gchar *value, if (strchr(value, 'h')) { DebugFlags |= DEBUG_MSG2HOST; } + if (strchr(value, 'm')) { + DebugFlags |= DEBUG_MSG2DEV|DEBUG_MSG2HOST|DEBUG_GROUP; + } if (strchr(value, 's')) { DebugFlags |= DEBUG_STARTUP; } @@ -88,10 +92,105 @@ debug_msg (debug_flags_t flags, char *fmt, ...) vsnprintf(buf, 1024, fmt, ap); va_end(ap); - g_message("%s", buf); + fprintf(stderr, "%s\n", buf); } } +/* + * Format a value according to the xml setting. + * Returns an allocated buffer that must be freed by the caller. + */ +GString * +format_value (XmlSettings *xml, guint value) +{ + GString *buf = g_string_sized_new(1); + EffectValues *values = NULL; + ValueType vtype; + gchar *suffix = ""; + gdouble step = 1.0; + gint offset = 0; + gboolean decimal = FALSE; + + values = xml->values; + vtype = values->type; + while ((vtype & VALUE_TYPE_EXTRA) && value_is_extra(values, value)) { + values = values->extra; + vtype = values->type; + } + vtype &= ~VALUE_TYPE_EXTRA; + + if (vtype & VALUE_TYPE_OFFSET) { + offset = values->offset; + vtype &= ~VALUE_TYPE_OFFSET; + } + + if (vtype & VALUE_TYPE_STEP) { + step = values->step; + vtype &= ~VALUE_TYPE_STEP; + } + + if (vtype & VALUE_TYPE_SUFFIX) { + suffix = values->suffix; + vtype &= ~VALUE_TYPE_SUFFIX; + } + + if (vtype & VALUE_TYPE_DECIMAL) { + decimal = TRUE; + vtype &= ~VALUE_TYPE_DECIMAL; + } + + switch (vtype) { + case VALUE_TYPE_LABEL: + { + char *textp = map_xml_value(xml, value); + if (!textp) { + g_warning("Unable to map %s value %d for id %d position %d", + xml->label, value, xml->id, xml->position); + textp = ""; + } + g_string_printf(buf, "%s", textp); + break; + } + case VALUE_TYPE_PLAIN: + { + if (decimal) { + double dvalue = (value + offset) * step; + g_string_printf(buf, "%0.2f%s", dvalue, suffix); + } else { + gint ivalue = (value + offset) * step; + g_string_printf(buf, "%d%s", ivalue, suffix); + } + break; + } + case VALUE_TYPE_NONE: + g_string_printf(buf, "%s", ""); + break; + + default: + g_warning("Unhandled value type %d", vtype); + break; + } + + return buf; +} + +GString * +format_ipv (guint id, guint pos, guint val) +{ + GString *buf = g_string_sized_new(1); + GString *vec_buf = g_string_sized_new(1); + XmlSettings *xml = get_xml_settings(id, pos); + GString *val_buf = format_value(xml, val); + + g_string_printf(vec_buf, "(%d, %d, %d)", pos, id, val); + g_string_printf(buf, "%-16s %s: %s: %s", + vec_buf->str, + get_position(pos), xml->label, val_buf->str); + g_string_free(vec_buf, TRUE); + g_string_free(val_buf, TRUE); + return buf; +} + /** * Registers an error quark for gdigi if necessary. * @@ -275,10 +374,7 @@ MessageID get_message_id(GString *msg) return -1; } -#include "gdigi_xml.h" -extern XmlSettings *get_xml_settings (guint id, guint position); - -void push_message(GString *msg) +void push_message (GString *msg) { MessageID msgid = get_message_id(msg); if (((unsigned char)msg->str[0] == 0xF0) && ((unsigned char)msg->str[msg->len-1] == 0xF7)) @@ -315,13 +411,14 @@ void push_message(GString *msg) { unpack_message(msg); param = setting_param_new_from_data(&msg->str[8], NULL); - XmlSettings *xml = get_xml_settings(param->id, param->position); - char *label = xml ? xml->label : "NULL"; - debug_msg(DEBUG_MSG2HOST, - "RECEIVE_PARAMETER_VALUE: ID: %5d Position: %2d " - "Value: %6.1d: %s", - param->id, param->position, - param->value, label); + if (debug_flag_is_set(DEBUG_MSG2HOST)) { + GString *ipv = format_ipv(param->id, + param->position, + param->value); + debug_msg(DEBUG_MSG2HOST, "RECEIVE_PARAMETER_VALUE\n%s", + ipv->str); + g_string_free(ipv, TRUE); + } GDK_THREADS_ENTER(); apply_setting_param_to_gui(param); @@ -545,8 +642,9 @@ void send_message(gint procedure, gchar *data, gint len) g_string_append_printf(msg, "%c\xF7", calculate_checksum(&msg->str[1], msg->len - 1)); - debug_msg(DEBUG_VERBOSE, "Sending message %s len %d", - get_message_name(procedure), len); + debug_msg(DEBUG_VERBOSE, "Sending %s len %d", + get_message_name(procedure), len); + send_data(msg->str, msg->len); g_string_free(msg, TRUE); @@ -805,8 +903,11 @@ void set_option(guint id, guint position, guint value) ((id & 0xFF00) >> 8), (id & 0xFF), position); append_value(msg, value); - debug_msg(DEBUG_MSG2DEV, "Sending id %d position %d value %d", - id, position, value); + if (debug_flag_is_set(DEBUG_MSG2DEV)) { + GString *ipv = format_ipv(id, position, value); + debug_msg(DEBUG_MSG2DEV, "RECEIVE_PARAMETER_VALUE\n%s", ipv->str); + g_string_free(ipv, TRUE); + } send_message(RECEIVE_PARAMETER_VALUE, msg->str, msg->len); g_string_free(msg, TRUE); } diff --git a/gdigi.h b/gdigi.h index 0b8d7ae..9b36f2f 100644 --- a/gdigi.h +++ b/gdigi.h @@ -530,7 +530,6 @@ enum { }; #define MOD_TYPE 768 -#define MOD_POSITION 768 #define MOD_PRE_POST 1798 #define CHORUSFX_TYPE 768 @@ -893,7 +892,6 @@ enum { #define LIBRARY_EFFECTS 8705 #define EFFECTS_LEVEL 8706 -#define LIBRARY_POSITION 25 #define LIB_POSITION 26 #define TONE_LIB_TYPE 8704 @@ -1143,5 +1141,6 @@ void set_preset_level(int level); GStrv query_preset_names(gchar bank); void message_list_free(GList *list); GList *get_current_preset(); +GString *format_ipv(guint id, guint pos, guint val); #endif /* GDIGI_H */ diff --git a/gdigi_xml.h b/gdigi_xml.h index 56db6c3..8a60b80 100644 --- a/gdigi_xml.h +++ b/gdigi_xml.h @@ -33,7 +33,9 @@ typedef struct { guint xml_labels_amt; } XmlSettings; -// XmlSettings *get_xml_settings(guint id, guint position); +XmlSettings *get_xml_settings(guint id, guint position); +gboolean value_is_extra(EffectValues *val, int value); +gchar * map_xml_value(XmlSettings *xml, gint value); // gchar *get_xml_label(guint id, guint position, gint type); #endif /* GDIGI_XML_H */ diff --git a/preset.c b/preset.c index f5e056d..dfd56e4 100644 --- a/preset.c +++ b/preset.c @@ -330,10 +330,11 @@ Preset *create_preset_from_data(GList *list) SettingParam *param = setting_param_new_from_data(&data->str[x], &x); n++; preset->params = g_list_prepend(preset->params, param); - debug_msg(DEBUG_MSG2HOST, "%3d ID %4d Position %2d " - "Value %6.1d", - n, param->id, param->position, - param->value); + if (debug_flag_is_set(DEBUG_MSG2HOST)) { + GString *ipv = format_ipv(param->id, param->position, param->value); + debug_msg(DEBUG_MSG2HOST, "%3d %s", n, ipv->str); + g_string_free(ipv, TRUE); + } } while ((x < data->len) && nparams = g_list_sort(preset->params, params_cmp); diff --git a/preset_xml.c b/preset_xml.c index 4fd354d..cb873e1 100644 --- a/preset_xml.c +++ b/preset_xml.c @@ -52,7 +52,7 @@ XmlSettings *get_xml_settings (guint id, guint position) } gchar * -map_xml_value(XmlSettings *xml, gint value) +map_xml_value (XmlSettings *xml, gint value) { switch (xml->values->type) { case VALUE_TYPE_LABEL: @@ -84,9 +84,9 @@ map_xml_value(XmlSettings *xml, gint value) return NULL; } -gboolean value_is_extra (EffectValues *val, SettingParam *param) +gboolean value_is_extra (EffectValues *val, int value) { - if ((param->value < val->min) || (param->value > val->max)) { + if ((value < val->min) || (value > val->max)) { return TRUE; } return FALSE; @@ -176,7 +176,7 @@ write_preset_to_xml(Preset *preset, gchar *filename) BAD_CAST xml->label); values = xml->values; type = values->type; - while ((type & VALUE_TYPE_EXTRA) && value_is_extra(values, param)) { + while ((type & VALUE_TYPE_EXTRA) && value_is_extra(values, param->value)) { values = values->extra; type = values->type; } From 88819a795b9ee9628b5d844899d053e55f133619 Mon Sep 17 00:00:00 2001 From: Tim LaBerge Date: Fri, 6 Apr 2012 10:06:12 -0700 Subject: [PATCH 11/18] Fixup label range values. A number of EffectValues of type label had invalid ranges. Make them less invalid. Also add SYNTH_TALK id's to xml settings. Make format_ipv warn instead of crashing if an xml setting is not found. --- effects.c | 38 +++++++++++++++++++++++--------------- gdigi.c | 10 +++++++++- 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/effects.c b/effects.c index 49dc843..4423c62 100644 --- a/effects.c +++ b/effects.c @@ -587,58 +587,58 @@ static EffectValues values_loose_tight = { }; static EffectValues values_pickup_type = { - .min = 0.0, .max = 1.0, + .min = 65.0, .max = 66.0, .type = VALUE_TYPE_LABEL, .labels = pickup_type_labels, }; static EffectValues values_comp_type = { - .min = 0.0, .max = 1.0, + .min = 195.0, .max = 197.0, .type = VALUE_TYPE_LABEL, }; static EffectValues values_dist_type = { - .min = 0.0, .max = 24.0, + .min = 1280.0, .max = 1302.0, .type = VALUE_TYPE_LABEL, }; static EffectValues values_amp_type = { - .min = 0.0, .max = 1.0, + .min = 307.0, .max = 351.0, .type = VALUE_TYPE_LABEL, }; static EffectValues values_cab_type = { - .min = 0.0, .max = 19.0, + .min = 570.0, .max = 627.0, .type = VALUE_TYPE_LABEL, }; static EffectValues values_gate_type = { - .min = 0.0, .max = 1.0, + .min = 768.0, .max = 769.0, .type = VALUE_TYPE_LABEL, }; static EffectValues values_mod_type = { - .min = 0.0, .max = 19.0, + .min = 862.0, .max = 1347.0, .type = VALUE_TYPE_LABEL, }; static EffectValues values_pre_post = { - .min = 0.0, .max = 15.0, + .min = 1543.0, .max = 1544.0, .type = VALUE_TYPE_LABEL, }; static EffectValues values_delay_type = { - .min = 0.0, .max = 15.0, + .min = 1027.0, .max = 1066.0, .type = VALUE_TYPE_LABEL, }; static EffectValues values_reverb_type = { - .min = 0.0, .max = 14.0, + .min = 1107.0, .max = 1151.0, .type = VALUE_TYPE_LABEL, }; static EffectValues values_wah_type = { - .min = 0.0, .max = 1.0, + .min = 129.0, .max = 134.0, .type = VALUE_TYPE_LABEL, }; @@ -686,7 +686,7 @@ static EffectValues values_lfo_speed = { }; static EffectValues values_eq_type = { - .min = 0.0, .max = 3.0, + .min = 1472.0, .max = 1475.0, .type = VALUE_TYPE_LABEL, }; @@ -696,12 +696,12 @@ static EffectValues values_lfo_waveform = { }; static EffectValues values_tone_lib_type= { - .min = 0.0, .max = 31.0, + .min = 1792.0, .max = 1822.0, .type = VALUE_TYPE_LABEL, }; static EffectValues values_fx_lib_type= { - .min = 0.0, .max = 31.0, + .min = 1856.0, .max = 1866.0, .type = VALUE_TYPE_LABEL, }; @@ -3995,6 +3995,15 @@ XmlSettings xml_settings[] = { {IPS_SCALE, CHORUSFX_POSITION, "IPS Scale", &values_ips_scale, xml_ips_scale_labels, G_N_ELEMENTS(xml_ips_scale_labels)}, {IPS_LEVEL, CHORUSFX_POSITION, "IPS Level", &values_0_to_99,}, + {SYNTH_TALK_ATTACK, CHORUSFX_POSITION, "Synth Talk Attack", &values_0_to_99,}, + {GNX3K_SYNTH_TALK_RELEASE, CHORUSFX_POSITION, "Synth Talk Release", &values_0_to_99,}, + {SYNTH_TALK_RELEASE, CHORUSFX_POSITION, "Synth Talk Release", &values_0_to_99,}, + {SYNTH_TALK_SENS, CHORUSFX_POSITION, "Synth Talk Sens", &values_0_to_99,}, + {SYNTH_TALK_VOX, CHORUSFX_POSITION, "Synth Talk Vox", &values_0_to_99,}, + {SYNTH_TALK_BALANCE, CHORUSFX_POSITION, "Synth Talk Balance", &values_0_to_99,}, + + + {DELAY_TYPE, DELAY_POSITION, "Delay Type", &values_delay_type, xml_delay_labels, G_N_ELEMENTS(xml_delay_labels)}, {DELAY_ON_OFF, DELAY_POSITION, "Delay Enable", &values_on_off, xml_on_off_labels, G_N_ELEMENTS(xml_on_off_labels)}, {DELAY_TIME, DELAY_POSITION, "Delay Time", &values_delay_time,}, @@ -4020,7 +4029,6 @@ XmlSettings xml_settings[] = { {WAH_ON_OFF, WAH_POSITION, "Wah Enable", &values_on_off, xml_on_off_labels, G_N_ELEMENTS(xml_on_off_labels)}, {WAH_PEDAL_POSITION, WAH_POSITION, "Wah Position", &values_0_to_99,}, {WAH_VOLUME_BOOST, WAH_POSITION, "Wah Vol. Boost", &values_db_boost,}, - //{MOD_TYPE, MOD_POSITION, "Mod Type", &values_0_to_99,}, // ??? {PRESET_LEVEL, PRESET_POSITION, "Preset Level", &values_0_to_99,}, diff --git a/gdigi.c b/gdigi.c index 1a0fcb9..21b94bb 100644 --- a/gdigi.c +++ b/gdigi.c @@ -180,7 +180,15 @@ format_ipv (guint id, guint pos, guint val) GString *buf = g_string_sized_new(1); GString *vec_buf = g_string_sized_new(1); XmlSettings *xml = get_xml_settings(id, pos); - GString *val_buf = format_value(xml, val); + GString *val_buf; + + if (!xml) { + g_warning("Failed to find xml settings for position %d id %d.", + id, pos); + g_string_printf(buf, "%s", "error"); + return buf; + } + val_buf = format_value(xml, val); g_string_printf(vec_buf, "(%d, %d, %d)", pos, id, val); g_string_printf(buf, "%-16s %s: %s: %s", From cf239da94c3d7f029654f5c81196b0973804969b Mon Sep 17 00:00:00 2001 From: Tim LaBerge Date: Sat, 1 Dec 2012 15:30:56 -0800 Subject: [PATCH 12/18] Implement parameter linking to expression pedal. --- effects.c | 57 +++++++++++++++++++++++++++++++++++++++++++------------ effects.h | 5 ++++- gdigi.c | 6 ++++++ gui.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++ gui.h | 1 + 5 files changed, 111 insertions(+), 13 deletions(-) diff --git a/effects.c b/effects.c index 4423c62..817344d 100644 --- a/effects.c +++ b/effects.c @@ -562,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, @@ -643,8 +647,8 @@ static EffectValues values_wah_type = { }; static EffectValues values_exp_assign = { - .min = 0.0, .max = 1.0, - .type = VALUE_TYPE_LABEL, + .min = 0.0, .max = 0x7fffffff, + .type = VALUE_TYPE_POSID, }; static EffectValues values_vswitch_pedal_assign = { @@ -1205,6 +1209,12 @@ static EffectSettings chorusfx_ce_settings[] = { {"Depth", CHORUS_DEPTH, CHORUSFX_POSITION, &values_0_to_99}, }; +#if 0 +static EffectSettings pickup_enable_settings[] = { + {"Pickup", PICKUP_ON_OFF, PICKUP_POSITION, &values_on_off}, +}; +#endif + static EffectSettings chorusfx_tc_settings[] = { {"Speed", CHORUS_SPEED, CHORUSFX_POSITION, &values_0_to_99}, {"Width", CHORUS_WIDTH, CHORUSFX_POSITION, &values_0_to_99}, @@ -1576,12 +1586,14 @@ static EffectSettings lfo1_settings[] = { {"Speed(HZ)", LFO_SPEED, LFO1_POSITION, &values_lfo_speed}, }; +#if 0 static EffectSettings lfo2_settings[] = { {"Heel", LFO_MIN, REVERB_POSITION, &values_0_to_99}, {"Toe", LFO_MAX, REVERB_POSITION, &values_0_to_99}, {"Waveform", LFO_WAVEFORM, REVERB_POSITION, &values_waveform}, {"Speed(HZ)", LFO_SPEED, REVERB_POSITION, &values_lfo_speed}, }; +#endif static EffectSettings reverb_lex_settings[] = { {"Predelay", REVERB_PREDELAY, REVERB_POSITION, &values_0_to_15}, @@ -1942,6 +1954,10 @@ 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, "Placeholder", NULL, 0}, + }; + #define LFO_POSID_TO_TYPE(_a, _b) ((_a << 16) | (_b)) static EffectGroup rp355_lfo1_group[] = { {LFO_POSID_TO_TYPE(CHORUSFX_POSITION, CHORUS_LEVEL), "Chorus Level", lfo1_settings, G_N_ELEMENTS(lfo1_settings)}, @@ -1954,7 +1970,6 @@ static EffectGroup rp355_lfo1_group[] = { {LFO_POSID_TO_TYPE(DIST_POSITION, DIST_808_LVL), "Distortion 808 Level", lfo1_settings, G_N_ELEMENTS(lfo1_settings)}, }; - 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)}, @@ -2820,14 +2835,22 @@ 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)}, }; +/* + * 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[] = { {NULL, CHORUSFX_ON_OFF, CHORUSFX_TYPE, CHORUSFX_POSITION, rp500_chorusfx_group, G_N_ELEMENTS(rp500_chorusfx_group)}, }; @@ -3032,6 +3055,7 @@ static EffectList rp355_effects[] = { {"Reverb", reverb_effect, G_N_ELEMENTS(reverb_effect)}, {"Global Settings", global_effect, G_N_ELEMENTS(global_effect)}, {"LFO1", rp355_lfo1_effect, G_N_ELEMENTS(rp355_lfo1_effect)}, + {"Pedal1 Assign", rp355_pedal1_assign_effect, G_N_ELEMENTS(rp355_pedal1_assign_effect)}, }; static EffectList rp500_effects[] = { @@ -3267,6 +3291,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}, @@ -3309,12 +3335,12 @@ 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}, @@ -3399,8 +3425,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); @@ -4195,6 +4221,12 @@ 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. * @@ -4244,13 +4276,14 @@ ModifierGroup *modifier_linkable_list(GString *msg) 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; } diff --git a/effects.h b/effects.h index 9f7860c..eeb6149 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(); +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 21b94bb..ac7d14f 100644 --- a/gdigi.c +++ b/gdigi.c @@ -166,6 +166,10 @@ format_value (XmlSettings *xml, guint 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; @@ -521,6 +525,8 @@ void push_message (GString *msg) modifier_linkable_list(msg); g_string_free(msg, TRUE); + + create_pedal1_assign(); return; diff --git a/gui.c b/gui.c index 56075c0..0af817f 100644 --- a/gui.c +++ b/gui.c @@ -656,6 +656,61 @@ GtkWidget *create_widget_container(EffectGroup *group, gint amt, gint id, gint p return vbox; } +/* This should take ID and POSITION of Pedal1Assign, LFO1, or LFO2 */ +void +create_pedal1_assign (void) +{ + guint i; + gpointer key; + WidgetTreeElem *el; + GList *list; + EffectSettingsGroup *settings = NULL; + GObject *AssignComboBox; + gchar *name = NULL; + + key = GINT_TO_POINTER(EXP_ASSIGN1| (EXP_POSITION << 16)); + list = g_tree_lookup(widget_tree, key); + if (!list) { + printf("NO PEDAL ASSIGN COMBO BOX!\n"); + return; + } + + /* The only element should be the one with the placeholder. */ + el = g_list_nth_data(list, 0); + if (!el) { + printf("NO LIST\n"); + return; + } + + AssignComboBox = GTK_COMBO_BOX(el->widget); + + /* Remove the placeholder. */ + gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(AssignComboBox), 0); + for (i = 0; i < ModifierLinkableList->group_amt; i++) { + gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(AssignComboBox), + NULL, + ModifierLinkableList->group[i].label); + + printf("Added label %s\n", ModifierLinkableList->group[i].label); + + settings = g_slice_new(EffectSettingsGroup); + settings->id = EXP_ASSIGN1; + settings->type = ModifierLinkableList->group[i].type; + settings->position = EXP_POSITION; + settings->child = NULL; + name = g_strdup_printf("SettingsGroup%d", i); + + widget_tree_add(G_OBJECT(AssignComboBox), EXP_ASSIGN1, EXP_POSITION, + ModifierLinkableList->group[i].type, i); + g_object_set_data_full(G_OBJECT(AssignComboBox), name, settings, + ((GDestroyNotify)effect_settings_group_free)); + } + + // Get the current setting. + get_option(EXP_ASSIGN1,EXP_POSITION); +} + + /** * \param widgets Effect descriptions * \param amt amount of effect descriptions diff --git a/gui.h b/gui.h index 45f7659..0d4d571 100644 --- a/gui.h +++ b/gui.h @@ -29,5 +29,6 @@ void gui_create(Device *device); void gui_free(); gboolean unsupported_device_dialog(Device **device); const gchar* get_message_name(MessageID msgid); +void create_pedal1_assign(void); #endif /* GDIGI_GUI_H */ From 4f40132742fac661f3a9d5df8aa7487ed86ed216 Mon Sep 17 00:00:00 2001 From: Tim LaBerge Date: Sun, 2 Dec 2012 21:59:26 -0800 Subject: [PATCH 13/18] Implement the LFO1 and LFO2 effects. For now, this is just for rp355, though the code should work for other devices with minimal modification. 1) The EffectValues for values_*_assign need to be VALUE_TYPE_POSID. 2) Disabmiguate "Delay Tape" for a couple of EffectSettings. This fixed some bugs in the creation of the global modifier group. 3) Remove #if 0's around the definition of the lfo2_settings. 4) Define proper lfo1 and lfo2 groups arrays. 5) Define the lfo2_effect[] array. 6) Add the lfo1 and lfo2 effects to the rp355_effects array. 7) Disambiguate "EQ B" from "Eq" for some effedts in the modifiers array. 8) In push_message(), after we receive the RECEIVE_MODIFIER_LINKABLE_LIST message, kick off the creation of the EXP, LFO1, and LFO2 effects. 9) Generalize the function used for the pedal1_assign effect and make it work for lfo1 and lfo2 as well. Convert printf's to debug_msg(). 10) Since we're destroying the association of the grid with the placeholder combo box entry, steal the data so the child widget isn't destroyed. 11) Silence warning on exit about 0 unread messages in queue. --- effects.c | 59 ++++++++++++++++++++++++++-------------------------- gdigi.c | 6 ++++-- gui.c | 62 ++++++++++++++++++++++++++++++++++++++++--------------- gui.h | 2 +- 4 files changed, 79 insertions(+), 50 deletions(-) diff --git a/effects.c b/effects.c index 817344d..3631ab0 100644 --- a/effects.c +++ b/effects.c @@ -652,13 +652,13 @@ static EffectValues values_exp_assign = { }; static EffectValues values_vswitch_pedal_assign = { - .min = 0.0, .max = 1.0, - .type = VALUE_TYPE_LABEL, + .min = 0.0, .max = 0x7fffffff, + .type = VALUE_TYPE_POSID, }; static EffectValues values_vswitch_assign = { - .min = 0.0, .max = 1.0, - .type = VALUE_TYPE_LABEL, + .min = 0.0, .max = 0x7fffffff, + .type = VALUE_TYPE_POSID, }; static EffectValues values_vswitch_type = { @@ -667,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 = { @@ -1489,7 +1489,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}, }; @@ -1550,8 +1550,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[] = { @@ -1586,14 +1586,12 @@ static EffectSettings lfo1_settings[] = { {"Speed(HZ)", LFO_SPEED, LFO1_POSITION, &values_lfo_speed}, }; -#if 0 static EffectSettings lfo2_settings[] = { - {"Heel", LFO_MIN, REVERB_POSITION, &values_0_to_99}, - {"Toe", LFO_MAX, REVERB_POSITION, &values_0_to_99}, - {"Waveform", LFO_WAVEFORM, REVERB_POSITION, &values_waveform}, - {"Speed(HZ)", LFO_SPEED, REVERB_POSITION, &values_lfo_speed}, + {"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}, }; -#endif static EffectSettings reverb_lex_settings[] = { {"Predelay", REVERB_PREDELAY, REVERB_POSITION, &values_0_to_15}, @@ -1958,16 +1956,12 @@ static EffectGroup rp355_pedal1_assign_group[] = { { 0, "Placeholder", NULL, 0}, }; -#define LFO_POSID_TO_TYPE(_a, _b) ((_a << 16) | (_b)) +static EffectGroup rp355_lfo2_group[] = { + { 0, "Placeholder", lfo2_settings, G_N_ELEMENTS(lfo2_settings)}, +}; + static EffectGroup rp355_lfo1_group[] = { - {LFO_POSID_TO_TYPE(CHORUSFX_POSITION, CHORUS_LEVEL), "Chorus Level", lfo1_settings, G_N_ELEMENTS(lfo1_settings)}, - {LFO_POSID_TO_TYPE(DIST_POSITION, DIST_ON_OFF), "Distortion On/Off", lfo1_settings, G_N_ELEMENTS(lfo1_settings)}, - {LFO_POSID_TO_TYPE(DIST_POSITION, DIST_SCREAMER_DRIVE), "Distortion Screamer Drive", lfo1_settings, G_N_ELEMENTS(lfo1_settings)}, - {LFO_POSID_TO_TYPE(DIST_POSITION, DIST_SCREAMER_TONE), "Distortion Screamer Tone", lfo1_settings, G_N_ELEMENTS(lfo1_settings)}, - {LFO_POSID_TO_TYPE(DIST_POSITION, DIST_SCREAMER_LVL), "Distortion Screamer Level", lfo1_settings, G_N_ELEMENTS(lfo1_settings)}, - {LFO_POSID_TO_TYPE(DIST_POSITION, DIST_808_OVERDRIVE), "Distortion 808 Overdrive", lfo1_settings, G_N_ELEMENTS(lfo1_settings)}, - {LFO_POSID_TO_TYPE(DIST_POSITION, DIST_808_TONE), "Distortion 808 Tone", lfo1_settings, G_N_ELEMENTS(lfo1_settings)}, - {LFO_POSID_TO_TYPE(DIST_POSITION, DIST_808_LVL), "Distortion 808 Level", lfo1_settings, G_N_ELEMENTS(lfo1_settings)}, + { 0, "Placeholder", lfo1_settings, G_N_ELEMENTS(lfo1_settings)}, }; static EffectGroup rp500_chorusfx_group[] = { @@ -2843,6 +2837,10 @@ 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. @@ -3054,8 +3052,9 @@ static EffectList rp355_effects[] = { {"Delay", rp355_delay_effect, G_N_ELEMENTS(rp355_delay_effect)}, {"Reverb", reverb_effect, G_N_ELEMENTS(reverb_effect)}, {"Global Settings", global_effect, G_N_ELEMENTS(global_effect)}, - {"LFO1", rp355_lfo1_effect, G_N_ELEMENTS(rp355_lfo1_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)}, }; static EffectList rp500_effects[] = { @@ -3346,11 +3345,11 @@ static Modifier modifiers[] = { {"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}, diff --git a/gdigi.c b/gdigi.c index ac7d14f..6dec470 100644 --- a/gdigi.c +++ b/gdigi.c @@ -526,7 +526,9 @@ void push_message (GString *msg) g_string_free(msg, TRUE); - create_pedal1_assign(); + create_modifier_group(EXP_POSITION, EXP_ASSIGN1); + create_modifier_group(LFO1_POSITION, LFO_TYPE); + create_modifier_group(LFO2_POSITION, LFO_TYPE); return; @@ -1505,7 +1507,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/gui.c b/gui.c index 0af817f..455e6ca 100644 --- a/gui.c +++ b/gui.c @@ -22,6 +22,7 @@ #include "effects.h" #include "preset.h" #include "gtkknob.h" +#include "gdigi_xml.h" static gchar* MessageID_names[] = { @@ -370,8 +371,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); + } } } @@ -538,8 +540,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); } @@ -656,58 +659,85 @@ GtkWidget *create_widget_container(EffectGroup *group, gint amt, gint id, gint p return vbox; } -/* This should take ID and POSITION of Pedal1Assign, LFO1, or LFO2 */ +/** + * Given a linkable effect, build the combo box for the linkable parameters. + * + * @param[in] pos Position + * @param[in] id Id + */ void -create_pedal1_assign (void) +create_modifier_group (guint pos, guint id) { guint i; gpointer key; WidgetTreeElem *el; GList *list; - EffectSettingsGroup *settings = NULL; + EffectSettingsGroup *settings = NULL, *orig_settings = NULL; GObject *AssignComboBox; + GtkWidget *child_widget = NULL; gchar *name = NULL; - key = GINT_TO_POINTER(EXP_ASSIGN1| (EXP_POSITION << 16)); + 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); if (!list) { - printf("NO PEDAL ASSIGN COMBO BOX!\n"); + g_warning("No widget tree entry for position %d id %d!\n", + pos, id); return; } /* The only element should be the one with the placeholder. */ el = g_list_nth_data(list, 0); if (!el) { - printf("NO LIST\n"); + g_warning("No effect settings group for position %d id %d!\n", + pos, id); return; } - AssignComboBox = GTK_COMBO_BOX(el->widget); + AssignComboBox = el->widget; + name = g_strdup_printf("SettingsGroup%d", 0); + orig_settings = g_object_get_data(G_OBJECT(AssignComboBox), name); + if (orig_settings) { + child_widget = orig_settings->child; + /* Steal the data so we don't trigger the destroy method on the grid. */ + g_object_steal_data(AssignComboBox, name); + } /* Remove the placeholder. */ gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(AssignComboBox), 0); + + for (i = 0; i < ModifierLinkableList->group_amt; i++) { gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(AssignComboBox), NULL, ModifierLinkableList->group[i].label); - printf("Added label %s\n", ModifierLinkableList->group[i].label); - settings = g_slice_new(EffectSettingsGroup); - settings->id = EXP_ASSIGN1; settings->type = ModifierLinkableList->group[i].type; - settings->position = EXP_POSITION; + settings->id = id; + settings->position = pos; settings->child = NULL; + if (child_widget) { + settings->child = child_widget; + g_object_ref_sink(settings->child); + } + name = g_strdup_printf("SettingsGroup%d", i); - widget_tree_add(G_OBJECT(AssignComboBox), EXP_ASSIGN1, EXP_POSITION, + debug_msg(DEBUG_GROUP, "%d: \"%s\"", + i, + ModifierLinkableList->group[i].label); + + widget_tree_add(G_OBJECT(AssignComboBox), id, pos, ModifierLinkableList->group[i].type, i); g_object_set_data_full(G_OBJECT(AssignComboBox), name, settings, ((GDestroyNotify)effect_settings_group_free)); } // Get the current setting. - get_option(EXP_ASSIGN1,EXP_POSITION); + get_option(id, pos); } @@ -1168,8 +1198,6 @@ static void action_save_preset_cb(GtkAction *action) GError *error = NULL; gchar *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); - - if (error) { show_error_message(window, error->message); g_error_free(error); diff --git a/gui.h b/gui.h index 0d4d571..4c282ec 100644 --- a/gui.h +++ b/gui.h @@ -29,6 +29,6 @@ void gui_create(Device *device); void gui_free(); gboolean unsupported_device_dialog(Device **device); const gchar* get_message_name(MessageID msgid); -void create_pedal1_assign(void); +void create_modifier_group (guint pos, guint id); #endif /* GDIGI_GUI_H */ From b5aa30d59952f2829a6b803e5568c188fb5cea86 Mon Sep 17 00:00:00 2001 From: Tim LaBerge Date: Mon, 3 Dec 2012 12:19:35 -0800 Subject: [PATCH 14/18] Fix up LFO speed EffectValues. --- effects.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/effects.c b/effects.c index 3631ab0..244896e 100644 --- a/effects.c +++ b/effects.c @@ -679,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, }; From f389caffbc7ecf090aba62956e5f8520d9465fd2 Mon Sep 17 00:00:00 2001 From: Tim LaBerge Date: Mon, 3 Dec 2012 19:25:24 -0800 Subject: [PATCH 15/18] Fix RHold display for delay repeats. This involved passing the EffectValue resulting from the resolution of an VALUE_TYPE_EXTRA to map_xml_value() and some more careful range checking. Also, the delay repeats effect needed an xml_label for the special 'repeat forever' value 100, which maps to the string RHold. --- effects.c | 7 ++++--- gdigi.c | 2 +- gdigi_xml.h | 2 +- preset_xml.c | 12 +++++++----- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/effects.c b/effects.c index 244896e..e54b617 100644 --- a/effects.c +++ b/effects.c @@ -3875,6 +3875,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,}, @@ -4027,12 +4030,10 @@ XmlSettings xml_settings[] = { {SYNTH_TALK_VOX, CHORUSFX_POSITION, "Synth Talk Vox", &values_0_to_99,}, {SYNTH_TALK_BALANCE, CHORUSFX_POSITION, "Synth Talk Balance", &values_0_to_99,}, - - {DELAY_TYPE, DELAY_POSITION, "Delay Type", &values_delay_type, xml_delay_labels, G_N_ELEMENTS(xml_delay_labels)}, {DELAY_ON_OFF, DELAY_POSITION, "Delay Enable", &values_on_off, xml_on_off_labels, G_N_ELEMENTS(xml_on_off_labels)}, {DELAY_TIME, DELAY_POSITION, "Delay Time", &values_delay_time,}, - {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,}, diff --git a/gdigi.c b/gdigi.c index 6dec470..dc1ff24 100644 --- a/gdigi.c +++ b/gdigi.c @@ -142,7 +142,7 @@ format_value (XmlSettings *xml, guint 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); diff --git a/gdigi_xml.h b/gdigi_xml.h index 8a60b80..b5f73b9 100644 --- a/gdigi_xml.h +++ b/gdigi_xml.h @@ -35,7 +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/preset_xml.c b/preset_xml.c index cb873e1..1ae4623 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,15 +53,16 @@ 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); } @@ -205,7 +207,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, From 8b998c636f88fc3b546ce01183dfe19fe5545170 Mon Sep 17 00:00:00 2001 From: Tim LaBerge Date: Mon, 3 Dec 2012 19:25:53 -0800 Subject: [PATCH 16/18] Replace deprecated API's gtk_vbox/hbox_new(). The API's gtk_vbox_new() and gtk_hbox_new() are deprecated and result in compilation warnings. Replace these API's with calls to gtk_box_new() with GTK_ORIENTATION_VERTICAL and GTK_ORIENTATION_HORIZONTAL, respectively. --- gui.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/gui.c b/gui.c index 455e6ca..a508599 100644 --- a/gui.c +++ b/gui.c @@ -613,7 +613,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); @@ -762,7 +762,7 @@ 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); @@ -1371,12 +1371,12 @@ void gui_create(Device *device) window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "gdigi"); - vbox = gtk_vbox_new(FALSE, 0); + vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); gtk_container_add(GTK_CONTAINER(window), vbox); add_menubar(window, vbox); - hbox = gtk_hbox_new(FALSE, 0); + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); gtk_container_add(GTK_CONTAINER(vbox), hbox); sw = gtk_scrolled_window_new(NULL, NULL); @@ -1400,14 +1400,14 @@ void gui_create(Device *device) for (i = 0; in_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); From 3a3017b46f227945d0d9328be776c95509e1ffb8 Mon Sep 17 00:00:00 2001 From: Tim LaBerge Date: Sun, 16 Dec 2012 09:29:16 -0800 Subject: [PATCH 17/18] Add support for linkable parameters. These changes allow gdigi to link parameters to the expression pedal, LFO1, and LFO2. The changes have been implemented only for RP355, but should be easily extendible to other devices. The design is as follows: The effect group entries for the linkable effects have only a placeholder entry "None" at startup. During startup, we send an unsolicited REQUEST_MODIFIER_LINKABLE_LIST. When we receive RECEIVE_MODIFIER_LINKABLE_LIST in response, we use it to construct the ModifierLinkableList and update the combo boxes for the Pedal Assign and LFO effects. Whenever the selected chorus/fx effect changes, the list of linkable parameters also changes, so the device will send us a NOTIFY_MODIFIER_GROUP_CHANGED. Again, we send a REQUEST_MODIFIER_LINKABLE_LIST and use the response to rebuild ModifierLinkableList. Then we tear down and rebuild the state associated with the affected combo boxes. The changes made are as follows: 1) Add settings for pedal1_assign. This is the min/max value returned by the pedal. 2) Add separate EffectGroup for both pedal assignment and the LFO's for the non-combo box settings. 3) Fix up a few more missing effects in the xml and modifier lists. There is additional work to do here, but that will be in future commits. 4) Fixed a missing break in the RECEIVE_DEVICE_NOTIFICATION case in push_message(). 5) When we receive a NOTIFY_MODIFIER_GROUP_CHANGED message, free the exisiting modifier group and send a REQUEST_MODIFIER_LINKABLE_LIST so we can rebuild it. 6) When we receive a RECEIVE_MODIFIER_LINKABLE_LIST, protect the calls to create_modifier_group() with GDK_THREADS_ENTER() so we don't crash because of interactions with the event/gui threads. 7) Added a BUG assert to an error leg in get_message_list(). 8) Fix memory leak in get_digitech_devices() found by valgrind. 9) Add a function to tear down the state associated with the entries of a pedal assign or LFO combo box. 10) Add a function to build up the entries of a pedal assign or LFO combo box from the modifier linkable list received from the device. 11) Use gtk_combo_box_text_append_text() throughout. 12) A few whitespace/readability changes and more comments. --- effects.c | 24 +++++++-- gdigi.c | 18 +++++++ gui.c | 157 ++++++++++++++++++++++++++++++++++++------------------ 3 files changed, 143 insertions(+), 56 deletions(-) diff --git a/effects.c b/effects.c index e54b617..c93a0da 100644 --- a/effects.c +++ b/effects.c @@ -1579,6 +1579,11 @@ 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}, @@ -1953,16 +1958,19 @@ static EffectGroup rp355_chorusfx_group[] = { }; static EffectGroup rp355_pedal1_assign_group[] = { - { 0, "Placeholder", NULL, 0}, - }; + { 0, NULL, pedal1_assign_settings, G_N_ELEMENTS(pedal1_assign_settings)}, + { 0, "None", NULL, 0}, +}; static EffectGroup rp355_lfo2_group[] = { - { 0, "Placeholder", lfo2_settings, G_N_ELEMENTS(lfo2_settings)}, + { 0, NULL, lfo2_settings, G_N_ELEMENTS(lfo2_settings)}, + { 0, "None", NULL, 0}, }; static EffectGroup rp355_lfo1_group[] = { - { 0, "Placeholder", lfo1_settings, G_N_ELEMENTS(lfo1_settings)}, - }; + { 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)}, @@ -3362,6 +3370,11 @@ 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}, {"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}, @@ -3972,6 +3985,7 @@ 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,}, + {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,}, diff --git a/gdigi.c b/gdigi.c index dc1ff24..77ac66d 100644 --- a/gdigi.c +++ b/gdigi.c @@ -462,6 +462,8 @@ void push_message (GString *msg) str[9], str[10], str[11], str[12]); } + break; + case NOTIFY_MODIFIER_GROUP_CHANGED: { int i; @@ -472,10 +474,18 @@ void push_message (GString *msg) } printf("\n"); } + 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: @@ -526,9 +536,14 @@ void push_message (GString *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; @@ -1130,6 +1145,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; } @@ -1420,6 +1436,7 @@ static gint get_digitech_devices(GList **devices) number++; *devices = g_list_append(*devices, GINT_TO_POINTER(card_num)); } + free(name); snd_card_next(&card_num); } @@ -1485,6 +1502,7 @@ int main(int argc, char *argv[]) { } if (device != NULL) { + /* enable GUI mode */ set_option(GUI_MODE_ON_OFF, USB_POSITION, 1); diff --git a/gui.c b/gui.c index a508599..a829942 100644 --- a/gui.c +++ b/gui.c @@ -563,6 +563,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"); @@ -625,15 +626,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; @@ -644,11 +652,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); } } @@ -660,7 +672,67 @@ GtkWidget *create_widget_container(EffectGroup *group, gint amt, gint id, gint p } /** - * Given a linkable effect, build the combo box for the linkable parameters. + * 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 @@ -668,27 +740,30 @@ GtkWidget *create_widget_container(EffectGroup *group, gint amt, gint id, gint p void create_modifier_group (guint pos, guint id) { - guint i; + + GtkWidget *vbox; gpointer key; WidgetTreeElem *el; GList *list; - EffectSettingsGroup *settings = NULL, *orig_settings = NULL; GObject *AssignComboBox; - GtkWidget *child_widget = NULL; - gchar *name = NULL; 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; } - /* The only element should be the one with the placeholder. */ el = g_list_nth_data(list, 0); if (!el) { g_warning("No effect settings group for position %d id %d!\n", @@ -697,46 +772,18 @@ create_modifier_group (guint pos, guint id) } AssignComboBox = el->widget; + g_assert(AssignComboBox != NULL); - name = g_strdup_printf("SettingsGroup%d", 0); - orig_settings = g_object_get_data(G_OBJECT(AssignComboBox), name); - if (orig_settings) { - child_widget = orig_settings->child; - /* Steal the data so we don't trigger the destroy method on the grid. */ - g_object_steal_data(AssignComboBox, name); - } - /* Remove the placeholder. */ - gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(AssignComboBox), 0); + vbox = g_object_get_data(AssignComboBox, "vbox"); + g_assert(vbox != NULL); + clean_modifier_combo_box(AssignComboBox, list); - for (i = 0; i < ModifierLinkableList->group_amt; i++) { - gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(AssignComboBox), - NULL, - ModifierLinkableList->group[i].label); + update_modifier_combo_box(AssignComboBox, + ModifierLinkableList->group, + ModifierLinkableList->group_amt, + id, pos); - settings = g_slice_new(EffectSettingsGroup); - settings->type = ModifierLinkableList->group[i].type; - settings->id = id; - settings->position = pos; - settings->child = NULL; - if (child_widget) { - settings->child = child_widget; - g_object_ref_sink(settings->child); - } - - name = g_strdup_printf("SettingsGroup%d", i); - - debug_msg(DEBUG_GROUP, "%d: \"%s\"", - i, - ModifierLinkableList->group[i].label); - - widget_tree_add(G_OBJECT(AssignComboBox), id, pos, - ModifierLinkableList->group[i].type, i); - g_object_set_data_full(G_OBJECT(AssignComboBox), name, settings, - ((GDestroyNotify)effect_settings_group_free)); - } - - // Get the current setting. get_option(id, pos); } @@ -769,6 +816,7 @@ GtkWidget *create_vbox(Effect *widgets, gint amt, gchar *label) for (x = 0; x Date: Sun, 16 Dec 2012 11:12:10 -0800 Subject: [PATCH 18/18] Add remaining rp355 effects to modifiers array. 1) A few rp355 effects were missing from the modifiers array. 2) The EH_PHASER effects were missing from the xml_settings array. 3) Added a disambiguating string to the "Unable to map" warning in gdigi.c. --- effects.c | 29 ++++++++++++++++++++++++++++- gdigi.c | 4 ++-- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/effects.c b/effects.c index c93a0da..a491c5e 100644 --- a/effects.c +++ b/effects.c @@ -3059,10 +3059,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)}, - {"Global Settings", global_effect, G_N_ELEMENTS(global_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[] = { @@ -3375,10 +3375,14 @@ static Modifier modifiers[] = { {"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}, @@ -3386,6 +3390,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}, @@ -3396,6 +3407,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}, @@ -3404,6 +3419,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}, @@ -3412,6 +3428,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}, @@ -3423,6 +3444,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}, @@ -3985,6 +4010,8 @@ 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,}, diff --git a/gdigi.c b/gdigi.c index 77ac66d..1d1ae3c 100644 --- a/gdigi.c +++ b/gdigi.c @@ -144,8 +144,8 @@ format_value (XmlSettings *xml, guint 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);