From 216245970f4774a77cb634521e041f1d5b288f6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Mo=C5=84?= Date: Mon, 2 Feb 2009 11:34:08 +0100 Subject: [PATCH] add set_eq_mid_hz and set_eq_treb_hz --- TODO | 1 - gdigi.c | 146 ++++++++++++++++++++++++++++++++++++++++++++++++++++---- gdigi.h | 10 ++++ gui.c | 13 ++++- tests.c | 9 ++++ 5 files changed, 168 insertions(+), 11 deletions(-) diff --git a/TODO b/TODO index df39cc9..b622a9c 100644 --- a/TODO +++ b/TODO @@ -1,7 +1,6 @@ -figure out all magic commands -fix usb handling code -make complete gui --figure out setting EQ mid Hz and EQ treb Hz -amp/cabinet models -expression pedal options -audio setup options diff --git a/gdigi.c b/gdigi.c index 39847ce..bb78b81 100644 --- a/gdigi.c +++ b/gdigi.c @@ -26,27 +26,28 @@ char buf[255]; struct usb_device *dev; struct usb_dev_handle *handle; -static char magic[] = {0x04, 0xF0, 0x00, 0x00, 0x04, 0x10, 0x7F, 0x7F, 0x04, 0x7F, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0x6E, 0xF7, 0x00}; /* causes COMAND to be displayed on device? */ -static char presets_user[] = {0x04, 0xF0, 0x00, 0x00, 0x04, 0x10, 0x00, 0x5E, 0x04, 0x02, 0x21, 0x00, 0x07, 0x01, 0x6C, 0xF7}; /* this command seems to query user presets? */ -static char presets_system[] = {0x04, 0xF0, 0x00, 0x00, 0x04, 0x10, 0x00, 0x5E, 0x04, 0x02, 0x21, 0x00, 0x07, 0x00, 0x6D, 0xF7}; /* this command seems to query system presets? */ +/* +static char magic[] = {0x04, 0xF0, 0x00, 0x00, 0x04, 0x10, 0x7F, 0x7F, 0x04, 0x7F, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0x6E, 0xF7, 0x00}; // causes COMAND to be displayed on device? +static char presets_user[] = {0x04, 0xF0, 0x00, 0x00, 0x04, 0x10, 0x00, 0x5E, 0x04, 0x02, 0x21, 0x00, 0x07, 0x01, 0x6C, 0xF7}; // this command seems to query user presets? +static char presets_system[] = {0x04, 0xF0, 0x00, 0x00, 0x04, 0x10, 0x00, 0x5E, 0x04, 0x02, 0x21, 0x00, 0x07, 0x00, 0x6D, 0xF7}; // this command seems to query system presets? -static char magic3[] = {0x04, 0xF0, 0x00, 0x00, 0x04, 0x10, 0x00, 0x5E, 0x04, 0x02, 0x2A, 0x00, 0x04, 0x04, 0x00, 0x62, 0x05, 0xF7, 0x00, 0x00}; /* seems to query active preset name */ static char magic4[] = {0x04, 0xF0, 0x00, 0x00, 0x04, 0x10, 0x00, 0x5E, 0x04, 0x02, 0x2B, 0x00, 0x04, 0x00, 0x01, 0x77, 0x05, 0xF7, 0x00, 0x00}; static char magic5[] = {0x04, 0xF0, 0x00, 0x00, 0x04, 0x10, 0x00, 0x5E, 0x04, 0x02, 0x3A, 0x00, 0x04, 0x00, 0x01, 0x77, 0x05, 0xF7, 0x00, 0x00}; -/* xedit calls those after calling hbsc pickup change */ +// xedit calls those after calling hbsc pickup change static char magic12[] = {0x04, 0xF0, 0x00, 0x00, 0x04, 0x10, 0x00, 0x5E, 0x04, 0x02, 0x3A, 0x00, 0x04, 0x00, 0x01, 0x77, 0x05, 0xF7, 0x00, 0x00}; static char magic13[] = {0x07, 0x41, 0x73, 0xF7, 0x04, 0x10, 0x00, 0x5E, 0x04, 0x02, 0x7E, 0x00, 0x04, 0x00, 0x01, 0x77, 0x05, 0xF7, 0x00, 0x00}; -/* xedit calls those after calling schb pickup change */ +// xedit calls those after calling schb pickup change static char magic22[] = {0x04, 0xF0, 0x00, 0x00, 0x04, 0x10, 0x00, 0x5E, 0x04, 0x02, 0x41, 0x00, 0x04, 0x00, 0x01, 0x77, 0x05, 0xF7, 0x00, 0x00}; static char magic23[] = {0x04, 0xF0, 0x00, 0x00, 0x04, 0x10, 0x00, 0x5E, 0x04, 0x02, 0x3A, 0x00, 0x04, 0x00, 0x01, 0x77, 0x05, 0xF7, 0x00, 0x00}; static char magic24[] = {0x04, 0xF0, 0x00, 0x00, 0x04, 0x10, 0x00, 0x5E, 0x04, 0x02, 0x3B, 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0x6E, 0xF7, 0x00}; -/* seems to be called after changing dist type */ +// seems to be called after changing dist type static char magic8[] = {0x04, 0xF0, 0x00, 0x00, 0x04, 0x10, 0x00, 0x5E, 0x04, 0x02, 0x3A, 0x00, 0x04, 0x00, 0x01, 0x77, 0x05, 0xF7, 0x00, 0x00}; -/* X-edit also calls 2 different commands, but those seems to vary each time */ +// X-edit also calls 2 different commands, but those seems to vary each time +*/ /* calculate checksum @@ -82,6 +83,8 @@ int read_device(struct usb_dev_handle *handle, int bytes) void check_preset(struct usb_dev_handle *handle) { + static char magic3[] = {0x04, 0xF0, 0x00, 0x00, 0x04, 0x10, 0x00, 0x5E, 0x04, 0x02, 0x2A, 0x00, 0x04, 0x04, 0x00, 0x62, 0x05, 0xF7, 0x00, 0x00}; // seems to query active preset + int i; i = usb_bulk_write(handle, 4, magic3, sizeof(magic3), TIMEOUT); @@ -413,6 +416,25 @@ void set_preset_level(struct usb_dev_handle *handle, int level) printf("wrote: %d\n", i); } +void set_eq_type(struct usb_dev_handle *handle, int type) +{ + static char set_eq[] = {0x04, 0xF0, 0x00, 0x00, 0x04, 0x10, 0x00, 0x5E, 0x04, 0x02, 0x41, 0x2A, 0x04, 0x0C, 0x02, 0x18, 0x04, 0x02, 0x05, 0x00 /* type1 */, 0x06, 0x00 /* checksum */, 0xF7, 0x00}; + + switch (type) { + case EQ_TYPE_BRIGHT: set_eq[19] = 0x42; break; + case EQ_TYPE_MIDBOOST: set_eq[19] = 0x40; break; + case EQ_TYPE_SCOOP: set_eq[19] = 0x41; break; + case EQ_TYPE_WARM: set_eq[19] = 0x43; break; + default: break; + } + + set_eq[21] = calculate_checksum(set_eq, sizeof(set_eq), 21) ^ 0x05; + + int i; + i = usb_bulk_write(handle, 4, set_eq, sizeof(set_eq), TIMEOUT); + printf("wrote: %d\n", i); +} + /* x = 0 to 99 */ void set_eq_gain(struct usb_dev_handle *handle, int x) { @@ -465,6 +487,60 @@ void set_eq_mid(struct usb_dev_handle *handle, int x) printf("wrote: %d\n", i); } +/* + x = 0 to 4700 (which transforms into 300-5000 Hz) + device itself will accept higher value, but X-Edit allows only 300-5000Hz +*/ +void set_eq_mid_hz(struct usb_dev_handle *handle, int x) +{ + int i; + + if (x <= 0x7F) { + static char set_hz[] = {0x04, 0xF0, 0x00, 0x00, 0x04, 0x10, 0x00, 0x5E, 0x04, 0x02, 0x41, 0x20, 0x04, 0x0C, 0x06, 0x18, 0x07, 0x00 /* value */, 0x00 /* checksum */, 0xF7}; + + set_hz[17] = x; + set_hz[18] = calculate_checksum(set_hz, sizeof(set_hz), 18); + + i = usb_bulk_write(handle, 4, set_hz, sizeof(set_hz), TIMEOUT); + } else { + x -= 0x80; + if (x <= 0x7F) { + static char set_hz[] = {0x04, 0xF0, 0x00, 0x00, 0x04, 0x10, 0x00, 0x5E, 0x04, 0x02, 0x41, 0x2C, 0x04, 0x0C, 0x06, 0x18, 0x04, 0x01, 0x00 /* value */, 0x00 /* checksum */, 0x05, 0xF7, 0x00, 0x00}; + + set_hz[18] = x; + set_hz[19] = x^0x32; + + i = usb_bulk_write(handle, 4, set_hz, sizeof(set_hz), TIMEOUT); + } else { + x -= 0x80; + int a, b, c; + a = 0x28; + b = 0x01; + c = 0; + while (x > 0x7F) { + c++; + if ((c % 2) == 0) { + a ^= 0x02; b++; + } else { + a ^= 0x02; + } + + x -= 0x80; + } + + static char set_hz[] = {0x04, 0xF0, 0x00, 0x00, 0x04, 0x10, 0x00, 0x5E, 0x04, 0x02, 0x41, 0x00 /* a */, 0x04, 0x0C, 0x06, 0x18, 0x04, 0x02, 0x00 /* b */, 0x00 /* value */, 0x06, 0x00 /* checksum */, 0xF7, 0x00}; + + set_hz[11] = a; + set_hz[18] = b; + set_hz[19] = x; + set_hz[21] = a^b^x^0x1B^set_hz[14]; + + i = usb_bulk_write(handle, 4, set_hz, sizeof(set_hz), TIMEOUT); + } + } + printf("wrote: %d\n", i); +} + /* x = 0x00 (-12dB) to 0x18 (12dB) */ void set_eq_treble(struct usb_dev_handle *handle, int x) { @@ -478,6 +554,60 @@ void set_eq_treble(struct usb_dev_handle *handle, int x) printf("wrote: %d\n", i); } +/* + x = 0 to 7500 (which transforms into 500-8000 Hz) + device itself will accept higher value, but X-Edit allows only 500-8000Hz +*/ +void set_eq_treb_hz(struct usb_dev_handle *handle, int x) +{ + int i; + + if (x <= 0x7F) { + static char set_hz[] = {0x04, 0xF0, 0x00, 0x00, 0x04, 0x10, 0x00, 0x5E, 0x04, 0x02, 0x41, 0x20, 0x04, 0x0C, 0x0B, 0x18, 0x07, 0x00 /* value */, 0x00 /* checksum */, 0xF7}; + + set_hz[17] = x; + set_hz[18] = calculate_checksum(set_hz, sizeof(set_hz), 18); + + i = usb_bulk_write(handle, 4, set_hz, sizeof(set_hz), TIMEOUT); + } else { + x -= 0x80; + if (x <= 0x7F) { + static char set_hz[] = {0x04, 0xF0, 0x00, 0x00, 0x04, 0x10, 0x00, 0x5E, 0x04, 0x02, 0x41, 0x2C, 0x04, 0x0C, 0x0B, 0x18, 0x04, 0x01, 0x00 /* value */, 0x00 /* checksum */, 0x05, 0xF7, 0x00, 0x00}; + + set_hz[18] = x; + set_hz[19] = x^0x3F; + + i = usb_bulk_write(handle, 4, set_hz, sizeof(set_hz), TIMEOUT); + } else { + x -= 0x80; + int a, b, c; + a = 0x28; + b = 0x01; + c = 0; + while (x > 0x7F) { + c++; + if ((c % 2) == 0) { + a ^= 0x02; b++; + } else { + a ^= 0x02; + } + + x -= 0x80; + } + + static char set_hz[] = {0x04, 0xF0, 0x00, 0x00, 0x04, 0x10, 0x00, 0x5E, 0x04, 0x02, 0x41, 0x00 /* a */, 0x04, 0x0C, 0x0B, 0x18, 0x04, 0x02, 0x00 /* b */, 0x00 /* value */, 0x06, 0x00 /* checksum */, 0xF7, 0x00}; + + set_hz[11] = a; + set_hz[18] = b; + set_hz[19] = x; + set_hz[21] = a^b^x^0x1B^set_hz[14]; + + i = usb_bulk_write(handle, 4, set_hz, sizeof(set_hz), TIMEOUT); + } + } + printf("wrote: %d\n", i); +} + void set_eq_on_off(struct usb_dev_handle *handle, gboolean val) { static char set_eq[] = {0x04, 0xF0, 0x00, 0x00, 0x04, 0x10, 0x00, 0x5E, 0x04, 0x02, 0x41, 0x20, 0x04, 0x0C, 0x0C, 0x18, 0x07, 0x00 /* on/off */, 0x00 /* checksum */, 0xF7}; diff --git a/gdigi.h b/gdigi.h index 5df56f9..b7b1c4d 100644 --- a/gdigi.h +++ b/gdigi.h @@ -93,6 +93,13 @@ enum { #define DIST_MP_TONE 0x0E #define DIST_MP_VOLUME 0x0F +enum { + EQ_TYPE_BRIGHT = 0, + EQ_TYPE_MIDBOOST, + EQ_TYPE_SCOOP, + EQ_TYPE_WARM +}; + enum { NOISEGATE_GATE = 0, NOISEGATE_SWELL @@ -356,11 +363,14 @@ void set_dist_type(struct usb_dev_handle *handle, int type); void set_dist_option(struct usb_dev_handle *handle, char option, int value); void set_dist_on_off(struct usb_dev_handle *handle, gboolean val); void set_preset_level(struct usb_dev_handle *handle, int level); +void set_eq_type(struct usb_dev_handle *handle, int type); void set_eq_gain(struct usb_dev_handle *handle, int x); void set_eq_level(struct usb_dev_handle *handle, int x); void set_eq_bass(struct usb_dev_handle *handle, int x); void set_eq_mid(struct usb_dev_handle *handle, int x); +void set_eq_mid_hz(struct usb_dev_handle *handle, int x); void set_eq_treble(struct usb_dev_handle *handle, int x); +void set_eq_treb_hz(struct usb_dev_handle *handle, int x); void set_eq_on_off(struct usb_dev_handle *handle, gboolean val); void set_noisegate_type(struct usb_dev_handle *handle, int type); void set_gate_option(struct usb_dev_handle *handle, char option, int x); diff --git a/gui.c b/gui.c index 8066d21..dc2e53b 100644 --- a/gui.c +++ b/gui.c @@ -151,6 +151,10 @@ static SettingsWidget eq_widgets[] = { {"EQ bass", set_eq_bass, NULL, 0.0, 24.0}, {"EQ mid", set_eq_mid, NULL, 0.0, 24.0}, {"EQ treble", set_eq_treble, NULL, 0.0, 24.0}, + // TODO: make this display propertly (display range 300 to 5000) + {"EQ mid Hz", set_eq_mid_hz, NULL, 0.0, 4700.0}, + // TODO: make this display propertly (display range 500 to 8000) + {"EQ treb Hz", set_eq_treb_hz, NULL, 0.0, 7500.0}, }; static SettingsWidget noisegate_gate_widgets[] = { @@ -430,7 +434,9 @@ typedef struct { } WidgetContainer; static WidgetContainer wah_container[] = { - {-1, NULL, NULL, wah_widgets, G_N_ELEMENTS(wah_widgets), NULL}, + {WAH_TYPE_CRY, "Cry wah", set_wah_type, wah_widgets, G_N_ELEMENTS(wah_widgets), NULL}, + {WAH_TYPE_FULLRANGE, "Fullrange wah", set_wah_type, wah_widgets, G_N_ELEMENTS(wah_widgets), NULL}, + {WAH_TYPE_CLYDE, "Clyde wah", set_wah_type, wah_widgets, G_N_ELEMENTS(wah_widgets), NULL}, }; static WidgetContainer comp_container[] = { @@ -499,7 +505,10 @@ static WidgetContainer reverb_container[] = { }; static WidgetContainer eq_container[] = { - {-1, NULL, NULL, eq_widgets, G_N_ELEMENTS(eq_widgets), NULL}, + {EQ_TYPE_BRIGHT, "Bright", set_eq_type, eq_widgets, G_N_ELEMENTS(eq_widgets), NULL}, + {EQ_TYPE_MIDBOOST, "Mid Boost", set_eq_type, eq_widgets, G_N_ELEMENTS(eq_widgets), NULL}, + {EQ_TYPE_SCOOP, "Scoop", set_eq_type, eq_widgets, G_N_ELEMENTS(eq_widgets), NULL}, + {EQ_TYPE_WARM, "Warm", set_eq_type, eq_widgets, G_N_ELEMENTS(eq_widgets), NULL}, }; void combo_box_changed_cb(GtkComboBox *widget, WidgetContainer *widgets) diff --git a/tests.c b/tests.c index a264bf0..e8750b5 100644 --- a/tests.c +++ b/tests.c @@ -228,6 +228,11 @@ void test_eq(struct usb_dev_handle *handle) { int x; + set_eq_type(handle, EQ_TYPE_BRIGHT); + set_eq_type(handle, EQ_TYPE_MIDBOOST); + set_eq_type(handle, EQ_TYPE_SCOOP); + set_eq_type(handle, EQ_TYPE_WARM); + for (x=0; x<=99; x++) set_eq_gain(handle, x); for (x=0; x<=99; x++) @@ -237,8 +242,12 @@ void test_eq(struct usb_dev_handle *handle) set_eq_bass(handle, x); for (x=0; x<=0x18; x++) set_eq_mid(handle, x); + for (x=0; x<=4700; x++) + set_eq_mid_hz(handle, x); for (x=0; x<=0x18; x++) set_eq_treble(handle, x); + for (x=0; x<=7500; x++) + set_eq_treb_hz(handle, x); set_eq_on_off(handle, TRUE); set_eq_on_off(handle, FALSE);