Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c61c2372ae | ||
|
|
49b7f42012 | ||
|
|
157fba0380 | ||
|
|
904a30bb38 | ||
|
|
8e445bb408 | ||
|
|
eb48d0b9d2 | ||
|
|
baa3829263 | ||
|
|
79554a99ce |
2
Makefile
2
Makefile
@@ -1,5 +1,5 @@
|
||||
CC = gcc
|
||||
CFLAGS = `pkg-config --cflags glib-2.0 gio-2.0 gtk+-2.0` -Wall -g
|
||||
CFLAGS = `pkg-config --cflags glib-2.0 gio-2.0 gtk+-2.0` -Wall -g -ansi
|
||||
OFLAG = -o
|
||||
LIBS = `pkg-config --libs glib-2.0 gio-2.0 gtk+-2.0 alsa` -lexpat
|
||||
|
||||
|
||||
22
TODO
22
TODO
@@ -1,26 +1,8 @@
|
||||
-figure out all magic commands
|
||||
-make complete gui
|
||||
-cabinet models
|
||||
-tone library
|
||||
-effects library
|
||||
-effects level
|
||||
-handling presets (loading, saving, exporting to xml patches)
|
||||
-handling presets (saving, exporting to xml patches)
|
||||
-buildsystem
|
||||
-start gui with proper values
|
||||
To do so we need to figure out reply formatting of command querying preset.
|
||||
amidi --port=hw:1,0,0 --send-hex F0 00 00 10 00 5E 02 2a 00 04 00 62 F7 --receive=preset
|
||||
will create file named preset (give a while for it, and then hit ctrl+c)
|
||||
this file should have around 440 bytes (depends on actual preset)
|
||||
0x21 byte holds amount of options
|
||||
from 0x22 byte starts effects configuration which is:
|
||||
-2 bytes for ID
|
||||
-1 byte for position
|
||||
-1 to 3 bytes for value
|
||||
Each 8th byte (beginning from 0x27) seems to be status byte which describes
|
||||
whether or not we shall add 0x80 to ID or value and whether or not value
|
||||
will be multibyte. So far I couldn't figure the exact meaning of those bytes.
|
||||
To check you can download some patch from DigiTech Sound Community, apply
|
||||
it to your device, and then do this amidi command.
|
||||
Open resulting file in hex editor, and open patch file in text editor.
|
||||
Every ID, position and value found in patch will appear in the binary file.
|
||||
-fix expression pedal settings (possible types depend on active effects)
|
||||
-expression pedal settings
|
||||
|
||||
74
effects.c
74
effects.c
@@ -126,13 +126,13 @@ static EffectSettings amp_settings2[] = {
|
||||
};
|
||||
|
||||
static EffectSettings eq_settings[] = {
|
||||
// TODO: make those display propertly (display range -12 to 12)
|
||||
/* TODO: make those display propertly (display range -12 to 12) */
|
||||
{"EQ bass", 0.0, 24.0, EQ_BASS, EQ_POSITION},
|
||||
{"EQ mid", 0.0, 24.0, EQ_MID, EQ_POSITION},
|
||||
{"EQ treble", 0.0, 24.0, EQ_TREBLE, EQ_POSITION},
|
||||
// TODO: make this display propertly (display range 300 to 5000)
|
||||
/* TODO: make this display propertly (display range 300 to 5000) */
|
||||
{"EQ mid Hz", 0.0, 4700.0, EQ_MID_HZ, EQ_POSITION},
|
||||
// TODO: make this display propertly (display range 500 to 8000)
|
||||
/* TODO: make this display propertly (display range 500 to 8000) */
|
||||
{"EQ treb Hz", 0.0, 7500.0, EQ_TREBLE_HZ, EQ_POSITION},
|
||||
};
|
||||
|
||||
@@ -159,14 +159,14 @@ static EffectSettings chorusfx_dual_settings[] = {
|
||||
{"Dual chorus speed", 0.0, 99.0, DUAL_CHORUS_SPEED, CHORUSFX_POSITION},
|
||||
{"Dual chorus depth", 0.0, 99.0, DUAL_CHORUS_DEPTH, CHORUSFX_POSITION},
|
||||
{"Dual chorus level", 0.0, 99.0, DUAL_CHORUS_LEVEL, CHORUSFX_POSITION},
|
||||
// TODO: DUAL_CHORUS_WAVE with valid options WAVE_TRI, WAVE_SINE, WAVE_SQUARE
|
||||
/* TODO: DUAL_CHORUS_WAVE with valid options WAVE_TRI, WAVE_SINE, WAVE_SQUARE */
|
||||
};
|
||||
|
||||
static EffectSettings chorusfx_multi_settings[] = {
|
||||
{"Multi chorus speed", 0.0, 99.0, MULTI_CHORUS_SPEED, CHORUSFX_POSITION},
|
||||
{"Multi chorus depth", 0.0, 99.0, MULTI_CHORUS_DEPTH, CHORUSFX_POSITION},
|
||||
{"Multi chorus level", 0.0, 99.0, MULTI_CHORUS_LEVEL, CHORUSFX_POSITION},
|
||||
// TODO: MULTI_CHORUS_WAVE with valid options WAVE_TRI, WAVE_SINE, WAVE_SQUARE
|
||||
/* TODO: MULTI_CHORUS_WAVE with valid options WAVE_TRI, WAVE_SINE, WAVE_SQUARE */
|
||||
};
|
||||
|
||||
static EffectSettings chorusfx_flanger_settings[] = {
|
||||
@@ -174,7 +174,7 @@ static EffectSettings chorusfx_flanger_settings[] = {
|
||||
{"Flanger depth", 0.0, 99.0, FLANGER_DEPTH, CHORUSFX_POSITION},
|
||||
{"Flanger regen", 0.0, 99.0, FLANGER_REGEN, CHORUSFX_POSITION},
|
||||
{"Flanger level", 0.0, 99.0, FLANGER_LEVEL, CHORUSFX_POSITION},
|
||||
// TODO: FLANGER_WAVE with valid options WAVE_TRI, WAVE_SINE, WAVE_SQUARE
|
||||
/* TODO: FLANGER_WAVE with valid options WAVE_TRI, WAVE_SINE, WAVE_SQUARE */
|
||||
};
|
||||
|
||||
static EffectSettings chorusfx_mxr_flanger_settings[] = {
|
||||
@@ -189,7 +189,7 @@ static EffectSettings chorusfx_phaser_settings[] = {
|
||||
{"Phaser depth", 0.0, 99.0, PHASER_DEPTH, CHORUSFX_POSITION},
|
||||
{"Phaser regen", 0.0, 99.0, PHASER_REGEN, CHORUSFX_POSITION},
|
||||
{"Phaser level", 0.0, 99.0, PHASER_LEVEL, CHORUSFX_POSITION},
|
||||
// TODO: PHASER_WAVE with valid options WAVE_TRI, WAVE_SINE, WAVE_SQUARE
|
||||
/* TODO: PHASER_WAVE with valid options WAVE_TRI, WAVE_SINE, WAVE_SQUARE */
|
||||
};
|
||||
|
||||
static EffectSettings chorusfx_vibrato_settings[] = {
|
||||
@@ -208,19 +208,19 @@ static EffectSettings chorusfx_vibropan_settings[] = {
|
||||
{"Vibropan speed", 0.0, 99.0, VIBROPAN_SPEED, CHORUSFX_POSITION},
|
||||
{"Vibropan depth", 0.0, 99.0, VIBROPAN_DEPTH, CHORUSFX_POSITION},
|
||||
{"Vibropan vibra", 0.0, 99.0, VIBROPAN_VIBRA, CHORUSFX_POSITION},
|
||||
// TODO: VIBROPAN_WAVE with valid options WAVE_TRI, WAVE_SINE, WAVE_SQUARE
|
||||
/* TODO: VIBROPAN_WAVE with valid options WAVE_TRI, WAVE_SINE, WAVE_SQUARE */
|
||||
};
|
||||
|
||||
static EffectSettings chorusfx_tremolo_settings[] = {
|
||||
{"Tremolo speed", 0.0, 99.0, TREMOLO_SPEED, CHORUSFX_POSITION},
|
||||
{"Tremolo depth", 0.0, 99.0, TREMOLO_DEPTH, CHORUSFX_POSITION},
|
||||
// TODO: TREMOLO_WAVE with valid options WAVE_TRI, WAVE_SINE, WAVE_SQUARE
|
||||
/* TODO: TREMOLO_WAVE with valid options WAVE_TRI, WAVE_SINE, WAVE_SQUARE */
|
||||
};
|
||||
|
||||
static EffectSettings chorusfx_panner_settings[] = {
|
||||
{"Panner speed", 0.0, 99.0, PANNER_SPEED, CHORUSFX_POSITION},
|
||||
{"Panner depth", 0.0, 99.0, PANNER_DEPTH, CHORUSFX_POSITION},
|
||||
// TODO: PANNER_WAVE with valid options WAVE_TRI, WAVE_SINE, WAVE_SQUARE
|
||||
/* TODO: PANNER_WAVE with valid options WAVE_TRI, WAVE_SINE, WAVE_SQUARE */
|
||||
};
|
||||
|
||||
static EffectSettings chorusfx_envelope_settings[] = {
|
||||
@@ -248,15 +248,17 @@ static EffectSettings chorusfx_step_filter_settings[] = {
|
||||
static EffectSettings chorusfx_whammy_settings[] = {
|
||||
{"Whammy pedal", 0.0, 99.0, WHAMMY_PEDAL, CHORUSFX_POSITION},
|
||||
{"Whammy mix", 0.0, 99.0, WHAMMY_MIX, CHORUSFX_POSITION},
|
||||
//TODO: WHAMMY_AMOUNT with valid options:
|
||||
// WHAMMY_OCT_UP, WHAMMY_2OCT_UP, WHAMMY_2ND_DN, WHAMMY_RV_2ND,
|
||||
// WHAMMY_4TH_DN, WHAMMY_OCT_DN, WHAMMY_2OCT_DN, WHAMMY_DIV_BMB,
|
||||
// WHAMMY_M3_MA, WHAMMY_2ND_MA3, WHAMMY_3RD_4TH, WHAMMY_4TH_5TH,
|
||||
// WHAMMY_5TH_OCT, WHAMMY_HOCT_UP, WHAMMY_HOCT_DN, WHAMMY_OCT_UD
|
||||
/*
|
||||
TODO: WHAMMY_AMOUNT with valid options:
|
||||
WHAMMY_OCT_UP, WHAMMY_2OCT_UP, WHAMMY_2ND_DN, WHAMMY_RV_2ND,
|
||||
WHAMMY_4TH_DN, WHAMMY_OCT_DN, WHAMMY_2OCT_DN, WHAMMY_DIV_BMB,
|
||||
WHAMMY_M3_MA, WHAMMY_2ND_MA3, WHAMMY_3RD_4TH, WHAMMY_4TH_5TH,
|
||||
WHAMMY_5TH_OCT, WHAMMY_HOCT_UP, WHAMMY_HOCT_DN, WHAMMY_OCT_UD
|
||||
*/
|
||||
};
|
||||
|
||||
static EffectSettings chorusfx_pitch_shift_settings[] = {
|
||||
// TODO: make this display propertly (display range -24 to 24)
|
||||
/* TODO: make this display propertly (display range -24 to 24) */
|
||||
{"Pitch amount", 0.0, 48.0, PITCH_AMOUNT, CHORUSFX_POSITION},
|
||||
{"Pitch mix", 0.0, 99.0, PITCH_MIX, CHORUSFX_POSITION},
|
||||
};
|
||||
@@ -267,63 +269,65 @@ static EffectSettings chorusfx_detune_settings[] = {
|
||||
};
|
||||
|
||||
static EffectSettings chorusfx_ips_settings[] = {
|
||||
// TODO: IPS_SHIFT_AMOUNT with valid options:
|
||||
// IPS_7TH_DN, IPS_6TH_DN, IPS_5TH_DN, IPS_4TH_DN, IPS_3RD_DN,
|
||||
// IPS_2ND_DN, IPS_2ND_UP, IPS_3RD_UP, IPS_4TH_UP, IPS_5TH_UP,
|
||||
// IPS_6TH_UP, IPS_7TH_UP, IPS_OCT_U
|
||||
/*
|
||||
TODO: IPS_SHIFT_AMOUNT with valid options:
|
||||
IPS_7TH_DN, IPS_6TH_DN, IPS_5TH_DN, IPS_4TH_DN, IPS_3RD_DN,
|
||||
IPS_2ND_DN, IPS_2ND_UP, IPS_3RD_UP, IPS_4TH_UP, IPS_5TH_UP,
|
||||
IPS_6TH_UP, IPS_7TH_UP, IPS_OCT_U
|
||||
|
||||
// TODO: IPS_KEY with valid options:
|
||||
// IPS_E, IPS_F, IPS_GB, IPS_G, IPS_AB, IPS_A, IPS_BB, IPS_B,
|
||||
// IPS_C, IPS_DD, IPS_D, IPS_EB
|
||||
TODO: IPS_KEY with valid options:
|
||||
IPS_E, IPS_F, IPS_GB, IPS_G, IPS_AB, IPS_A, IPS_BB, IPS_B,
|
||||
IPS_C, IPS_DD, IPS_D, IPS_EB
|
||||
|
||||
// TODO: IPS_SCALE with valid options:
|
||||
// IPS_MAJOR, IPS_MINOR, IPS_DORIA, IPS_MIXLYD, IPS_LYDIAN, IPS_HMINO
|
||||
TODO: IPS_SCALE with valid options:
|
||||
IPS_MAJOR, IPS_MINOR, IPS_DORIA, IPS_MIXLYD, IPS_LYDIAN, IPS_HMINO
|
||||
*/
|
||||
|
||||
{"IPS level", 0.0, 99.0, IPS_LEVEL, CHORUSFX_POSITION},
|
||||
};
|
||||
|
||||
static EffectSettings delay_analog_settings[] = {
|
||||
// TODO: make this display propertly (10 msec to 5 sec)
|
||||
/* TODO: make this display propertly (10 msec to 5 sec) */
|
||||
{"Delay time", 0.0, 139.0, DELAY_TIME, DELAY_POSITION},
|
||||
{"Delay analog level", 0.0, 99.0, ANALOG_LEVEL, DELAY_POSITION},
|
||||
// TODO: make last value display propertly
|
||||
/* TODO: make last value display propertly */
|
||||
{"Delay analog repeats", 0.0, 100.0, ANALOG_REPEATS, DELAY_POSITION},
|
||||
};
|
||||
|
||||
static EffectSettings delay_digital_settings[] = {
|
||||
// TODO: make this display propertly (10 msec to 5 sec)
|
||||
/* TODO: make this display propertly (10 msec to 5 sec) */
|
||||
{"Delay time", 0.0, 139.0, DELAY_TIME, DELAY_POSITION},
|
||||
{"Delay digital level", 0.0, 99.0, DIGITAL_LEVEL, DELAY_POSITION},
|
||||
// TODO: make last value display propertly
|
||||
/* TODO: make last value display propertly */
|
||||
{"Delay digital repeats", 0.0, 100.0, DIGITAL_REPEATS, DELAY_POSITION},
|
||||
{"Delay digital ducker thresh", 0.0, 99.0, DIGITAL_DUCKER_THRESH, DELAY_POSITION},
|
||||
{"Delay digital ducker level", 0.0, 99.0, DIGITAL_DUCKER_LEVEL, DELAY_POSITION},
|
||||
};
|
||||
|
||||
static EffectSettings delay_modulated_settings[] = {
|
||||
// TODO: make this display propertly (10 msec to 5 sec)
|
||||
/* TODO: make this display propertly (10 msec to 5 sec) */
|
||||
{"Delay time", 0.0, 139.0, DELAY_TIME, DELAY_POSITION},
|
||||
{"Delay modulated level", 0.0, 99.0, MODULATED_LEVEL, DELAY_POSITION},
|
||||
// TODO: make last value display propertly
|
||||
/* TODO: make last value display propertly */
|
||||
{"Delay modulated repeats", 0.0, 100.0, MODULATED_REPEATS, DELAY_POSITION},
|
||||
{"Delay modulated depth", 0.0, 99.0, MODULATED_DEPTH, DELAY_POSITION},
|
||||
};
|
||||
|
||||
static EffectSettings delay_pong_settings[] = {
|
||||
// TODO: make this display propertly (10 msec to 5 sec)
|
||||
/* TODO: make this display propertly (10 msec to 5 sec) */
|
||||
{"Delay time", 0.0, 139.0, DELAY_TIME, DELAY_POSITION},
|
||||
{"Delay pong level", 0.0, 99.0, PONG_LEVEL, DELAY_POSITION},
|
||||
// TODO: make last value display propertly
|
||||
/* TODO: make last value display propertly */
|
||||
{"Delay pong repeats", 0.0, 100.0, PONG_REPEATS, DELAY_POSITION},
|
||||
{"Delay pong ducker thresh", 0.0, 99.0, PONG_DUCKER_THRESH, DELAY_POSITION},
|
||||
{"Delay pong ducker level", 0.0, 99.0, PONG_DUCKER_LEVEL, DELAY_POSITION},
|
||||
};
|
||||
|
||||
static EffectSettings delay_tape_settings[] = {
|
||||
// TODO: make this display propertly (10 msec to 5 sec)
|
||||
/* TODO: make this display propertly (10 msec to 5 sec) */
|
||||
{"Delay time", 0.0, 139.0, DELAY_TIME, DELAY_POSITION},
|
||||
{"Delay tape level", 0.0, 99.0, TAPE_LEVEL, DELAY_POSITION},
|
||||
// TODO: make last value display propertly
|
||||
/* TODO: make last value display propertly */
|
||||
{"Delay tape repeats", 0.0, 100.0, TAPE_REPEATS, DELAY_POSITION},
|
||||
{"Delay tape wow", 0.0, 99.0, TAPE_WOW, DELAY_POSITION},
|
||||
{"Delay tape flutter", 0.0, 99.0, TAPE_FLUTTER, DELAY_POSITION},
|
||||
|
||||
390
gdigi.c
390
gdigi.c
@@ -22,6 +22,10 @@
|
||||
#include "gdigi.h"
|
||||
#include "gui.h"
|
||||
|
||||
static unsigned char device_id = 0x7F;
|
||||
static unsigned char family_id = 0x7F;
|
||||
static unsigned char product_id = 0x7F;
|
||||
|
||||
static snd_rawmidi_t *output = NULL;
|
||||
static snd_rawmidi_t *input = NULL;
|
||||
static char *device = "hw:1,0,0";
|
||||
@@ -47,6 +51,18 @@ char calculate_checksum(gchar *array, int length, int check)
|
||||
return checksum;
|
||||
}
|
||||
|
||||
static char calc_checksum(gchar *array, gint length)
|
||||
{
|
||||
int x;
|
||||
int checksum = 0;
|
||||
|
||||
for (x = 0; x<length; x++) {
|
||||
checksum ^= array[x];
|
||||
}
|
||||
|
||||
return checksum;
|
||||
}
|
||||
|
||||
/*
|
||||
opens MIDI device
|
||||
Returns TRUE on error
|
||||
@@ -91,6 +107,7 @@ GString* read_data()
|
||||
by Clemens Ladisch <clemens@ladisch.de> */
|
||||
int err;
|
||||
int npfds;
|
||||
gboolean stop = FALSE;
|
||||
struct pollfd *pfds;
|
||||
GString *string = NULL;
|
||||
|
||||
@@ -118,6 +135,7 @@ GString* read_data()
|
||||
break;
|
||||
if (!(revents & POLLIN))
|
||||
continue;
|
||||
|
||||
err = snd_rawmidi_read(input, buf, sizeof(buf));
|
||||
if (err == -EAGAIN)
|
||||
continue;
|
||||
@@ -125,11 +143,15 @@ GString* read_data()
|
||||
g_error("cannot read: %s", snd_strerror(err));
|
||||
break;
|
||||
}
|
||||
|
||||
length = 0;
|
||||
for (i = 0; i < err; ++i)
|
||||
if (buf[i] != 0xFE) // ignore active sensing
|
||||
if (buf[i] != 0xFE) /* ignore active sensing */
|
||||
buf[length++] = buf[i];
|
||||
|
||||
if ((unsigned char)buf[length-1] == 0xF7)
|
||||
stop = TRUE;
|
||||
|
||||
if (length != 0) {
|
||||
if (string == NULL) {
|
||||
string = g_string_new_len(buf, length);
|
||||
@@ -137,9 +159,112 @@ GString* read_data()
|
||||
string = g_string_append_len(string, buf, length);
|
||||
}
|
||||
}
|
||||
} while (err != 0);
|
||||
} while ((err != 0) && (stop == FALSE));
|
||||
|
||||
return string;
|
||||
return string;
|
||||
}
|
||||
|
||||
static void clear_midi_in_buffer()
|
||||
{
|
||||
GString *str;
|
||||
|
||||
do {
|
||||
str = read_data();
|
||||
} while (str != NULL);
|
||||
}
|
||||
|
||||
GString *pack_data(gchar *data, gint len)
|
||||
{
|
||||
GString *packed;
|
||||
gint i;
|
||||
gint new_len;
|
||||
unsigned char status;
|
||||
gint offset;
|
||||
gint status_byte;
|
||||
|
||||
new_len = len + (len/7);
|
||||
packed = g_string_sized_new(new_len);
|
||||
status = 0;
|
||||
offset = -1;
|
||||
status_byte = 0;
|
||||
|
||||
for (i=0; i<len; i++) {
|
||||
if ((i % 7) == 0) {
|
||||
packed->str[status_byte] = status;
|
||||
status = 0;
|
||||
status_byte = packed->len;
|
||||
g_string_append_c(packed, '\0');
|
||||
}
|
||||
g_string_append_c(packed, (data[i] & 0x7F));
|
||||
status |= (data[i] & 0x80) >> ((i%7) + 1);
|
||||
}
|
||||
packed->str[status_byte] = status;
|
||||
|
||||
return packed;
|
||||
}
|
||||
|
||||
/*
|
||||
data - unpacked data to send
|
||||
len - data length
|
||||
*/
|
||||
void send_message(gint procedure, gchar *data, gint len)
|
||||
{
|
||||
GString *msg = g_string_new_len("\xF0" /* SysEx status byte */
|
||||
"\x00\x00\x10", /* Manufacturer ID */
|
||||
4);
|
||||
g_string_append_printf(msg,
|
||||
"%c%c%c" /* device, family, product ID */
|
||||
"%c", /* procedure */
|
||||
device_id, family_id, product_id,
|
||||
procedure);
|
||||
|
||||
if (len > 0) {
|
||||
GString *tmp = pack_data(data, len);
|
||||
g_string_append_len(msg, tmp->str, tmp->len);
|
||||
g_string_free(tmp, TRUE);
|
||||
}
|
||||
|
||||
g_string_append_printf(msg, "%c\xF7",
|
||||
calc_checksum(&msg->str[1], msg->len - 1));
|
||||
|
||||
send_data(msg->str, msg->len);
|
||||
|
||||
g_string_free(msg, TRUE);
|
||||
}
|
||||
|
||||
static gint get_message_id(GString *msg)
|
||||
{
|
||||
if (msg->len > 7) {
|
||||
return (unsigned char)msg->str[7];
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void append_value(GString *msg, guint value)
|
||||
{
|
||||
/* check how many bytes long the value is */
|
||||
guint temp = value;
|
||||
gint n = 0;
|
||||
do {
|
||||
n++;
|
||||
temp = temp >> 8;
|
||||
} while (temp);
|
||||
|
||||
if (n == 1) {
|
||||
if (value & 0x80)
|
||||
n = 2;
|
||||
else
|
||||
g_string_append_printf(msg, "%c", value);
|
||||
}
|
||||
|
||||
if (n > 1) {
|
||||
gint x;
|
||||
g_string_append_printf(msg, "%c", (n | 0x80));
|
||||
for (x=0; x<n; x++) {
|
||||
g_string_append_printf(msg, "%c",
|
||||
((value >> (8*(n-x-1))) & 0xFF));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -149,83 +274,26 @@ GString* read_data()
|
||||
*/
|
||||
void set_option(guint id, guint position, guint value)
|
||||
{
|
||||
static char option[] = {0xF0, 0x00, 0x00, 0x10, 0x00, 0x5E, 0x02, 0x41,
|
||||
0x00, 0x00, 0x00, /* ID */
|
||||
0x00, /* position */
|
||||
0x00, /* value length (not necesarry) */
|
||||
0x00, 0x00, 0x00, /* value (can be either 1, 2 or 3 bytes) */
|
||||
0x00, /* checksum */ 0xF7};
|
||||
|
||||
option[8] = ((id & 0x80) >> 2);
|
||||
|
||||
option[9] = ((id & 0xFF00) >> 8);
|
||||
option[10] = ((id & 0x007F));
|
||||
|
||||
option[11] = position;
|
||||
|
||||
if (value < 0x80) {
|
||||
// [12] = value, [13] - checksum, [14] = 0xF7
|
||||
option[12] = value;
|
||||
|
||||
option[14] = 0xF7;
|
||||
option[13] = calculate_checksum(option, 15, 13);
|
||||
|
||||
send_data(option, 15);
|
||||
} else if (value <= 0xFF) {
|
||||
option[8] |= 0x08; // there'll be length before value
|
||||
if (((value & 0x80) >> 7) == 1)
|
||||
option[8] |= 0x04;
|
||||
|
||||
option[12] = 0x01;
|
||||
// [13] = value, [14] - checksum, [15] = 0xF7
|
||||
option[13] = (value & 0x007F);
|
||||
|
||||
option[15] = 0xF7;
|
||||
option[14] = calculate_checksum(option, 16, 14);
|
||||
|
||||
send_data(option, 16);
|
||||
} else if (value <= 0xFFFF) {
|
||||
option[8] |= 0x08; // there'll be length before value
|
||||
if (((value & 0x80) >> 7) == 1)
|
||||
option[8] |= 0x02;
|
||||
|
||||
option[12] = 0x02;
|
||||
|
||||
option[13] = ((value & 0xFF00) >> 8);
|
||||
option[14] = ((value & 0x007F));
|
||||
|
||||
option[16] = 0xF7;
|
||||
option[15] = calculate_checksum(option, 17, 15);
|
||||
|
||||
send_data(option, 17);
|
||||
} else if (value <= 0xFFFFFF) {
|
||||
option[8] |= 0x08; // there'll be length before value
|
||||
if (((value & 0x80) >> 7) == 1)
|
||||
option[8] |= 0x01;
|
||||
|
||||
option[12] = 0x03;
|
||||
|
||||
option[13] = ((value & 0xFF0000) >> 16);
|
||||
option[14] = ((value & 0x00FF00) >> 8);
|
||||
option[15] = ((value & 0x00007F));
|
||||
|
||||
option[17] = 0xF7;
|
||||
option[16] = calculate_checksum(option, 18, 16);
|
||||
|
||||
send_data(option, 18);
|
||||
}
|
||||
GString *msg = g_string_sized_new(9);
|
||||
g_string_append_printf(msg, "%c%c%c",
|
||||
((id & 0xFF00) >> 8), (id & 0xFF),
|
||||
position);
|
||||
append_value(msg, value);
|
||||
send_message(RECEIVE_PARAMETER_VALUE, msg->str, msg->len);
|
||||
g_string_free(msg, TRUE);
|
||||
}
|
||||
|
||||
/* x = 0 to 60 */
|
||||
void switch_preset(guint bank, guint x)
|
||||
{
|
||||
static char switch_preset[] = {0x00, 0xF0, 0x00, 0x00, 0x10, 0x00, 0x5E, 0x02, 0x39, 0x00, 0x00 /* bank */, 0x00 /* no */, 0x04, 0x00, 0x00, 0x01, 0x00 /* confirm */, 0xF7};
|
||||
|
||||
switch_preset[10] = bank;
|
||||
switch_preset[11] = x;
|
||||
switch_preset[16] = calculate_checksum(switch_preset, sizeof(switch_preset), 16);
|
||||
|
||||
send_data(switch_preset, sizeof(switch_preset));
|
||||
GString *msg = g_string_sized_new(6);
|
||||
g_string_append_printf(msg, "%c%c%c%c%c%c",
|
||||
bank, x, /* source */
|
||||
PRESETS_EDIT_BUFFER, 0, /* destination */
|
||||
0, /* keep existing name */
|
||||
1); /* load */
|
||||
send_message(MOVE_PRESET, msg->str, msg->len);
|
||||
g_string_free(msg, TRUE);
|
||||
}
|
||||
|
||||
/* level = 0 to 99 */
|
||||
@@ -236,63 +304,26 @@ void set_preset_level(int level)
|
||||
|
||||
void store_preset_name(int x, const gchar *name)
|
||||
{
|
||||
static char set_name[] = {0xF0, 0x00, 0x00, 0x10, 0x00, 0x5e, 0x02, 0x39, 0x00, 0x04, 0x00, 0x01, 0x00 /* preset number */, 0x00 /* name starts here */, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||
|
||||
set_name[12] = x;
|
||||
|
||||
int a;
|
||||
int b;
|
||||
b = 0;
|
||||
for (a=0; (name != NULL && a<strlen(name)) && a<10 ; a++) {
|
||||
if (a == 3) {
|
||||
set_name[13+a] = 0x00;
|
||||
b++;
|
||||
}
|
||||
set_name[13+a+b] = name[a];
|
||||
}
|
||||
|
||||
if (a == 3) {
|
||||
set_name[13+a+1+b] = 0x00;
|
||||
a++;
|
||||
} else
|
||||
set_name[13+a+b] = 0x00;
|
||||
|
||||
set_name[13+a+1+b] = 0x00;
|
||||
set_name[13+a+3+b] = 0xF7;
|
||||
set_name[13+a+2+b] = calculate_checksum(set_name, 13+a+4+b, 13+a+2+b);
|
||||
|
||||
send_data(set_name, 14+a+3+b);
|
||||
|
||||
switch_preset(PRESETS_USER, x);
|
||||
GString *msg = g_string_sized_new(6);
|
||||
g_string_append_printf(msg, "%c%c%c%c%s%c%c",
|
||||
PRESETS_EDIT_BUFFER, 0, /* source */
|
||||
PRESETS_USER, x, /* destination */
|
||||
name, 0, /* name */
|
||||
1); /* load */
|
||||
send_message(MOVE_PRESET, msg->str, msg->len);
|
||||
g_string_free(msg, TRUE);
|
||||
}
|
||||
|
||||
/* x = 0 to 59 (preset number) */
|
||||
void set_preset_name(int x, gchar *name)
|
||||
{
|
||||
static char set_name[] = {0x00, 0xF0, 0x00, 0x00, 0x10, 0x00, 0x5E, 0x02, 0x29, 0x00, 0x01, 0x00 /* preset no */, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||
|
||||
set_name[11] = x;
|
||||
|
||||
int a;
|
||||
int b;
|
||||
b = 0;
|
||||
for (a=0; (name != NULL && a<strlen(name)) && a<10 ; a++) {
|
||||
if (a == 5) {
|
||||
set_name[12+a] = 0x00;
|
||||
b++;
|
||||
}
|
||||
set_name[12+a+b] = name[a];
|
||||
}
|
||||
|
||||
if (a == 5)
|
||||
a = 4;
|
||||
else
|
||||
set_name[12+a+b] = 0x00;
|
||||
|
||||
set_name[12+a+2+b] = 0xF7;
|
||||
set_name[12+a+1+b] = calculate_checksum(set_name, 12+a+3+b, 12+a+1+b);
|
||||
|
||||
send_data(set_name, 13+a+3+b);
|
||||
GString *msg = g_string_sized_new(12);
|
||||
g_string_append_printf(msg, "%c%c%s%c",
|
||||
PRESETS_USER, /* preset bank */
|
||||
x, /* preset index */
|
||||
name, 0); /* name */
|
||||
send_message(RECEIVE_PRESET_NAME, msg->str, msg->len);
|
||||
g_string_free(msg, TRUE);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -301,7 +332,7 @@ void set_preset_name(int x, gchar *name)
|
||||
Returns GStrv which must be freed with g_strfreev
|
||||
Returns NULL on error
|
||||
*/
|
||||
GStrv query_preset_names(guint bank)
|
||||
GStrv query_preset_names(gchar bank)
|
||||
{
|
||||
GString *data = NULL;
|
||||
int x; /* used to iterate over whole reply */
|
||||
@@ -310,18 +341,17 @@ GStrv query_preset_names(guint bank)
|
||||
gchar **str_array = NULL;
|
||||
|
||||
/* clear MIDI IN buffer */
|
||||
data = read_data();
|
||||
if (data != NULL)
|
||||
g_string_free(data, TRUE);
|
||||
clear_midi_in_buffer();
|
||||
|
||||
/* query user preset names */
|
||||
char command[] = {0xF0, 0x00, 0x00, 0x10, 0x00, 0x5E, 0x02, 0x21, 0x00, 0x00 /* bank */, 0x00 /* checksum */, 0xF7};
|
||||
command[9] = bank;
|
||||
command[10] = calculate_checksum(command, sizeof(command), 10);
|
||||
send_data(command, sizeof(command));
|
||||
send_message(REQUEST_PRESET_NAMES, &bank, 1);
|
||||
|
||||
/* read reply */
|
||||
data = read_data();
|
||||
do {
|
||||
if (data)
|
||||
g_string_free(data, TRUE);
|
||||
data = read_data();
|
||||
} while (get_message_id(data) != RECEIVE_PRESET_NAMES);
|
||||
|
||||
if (data != NULL) {
|
||||
char preset_reply_magic[] = {0xF0, 0x00, 0x00, 0x10, 0x00, 0x5E, 0x02, 0x22, 0x00, 0x01};
|
||||
@@ -336,13 +366,13 @@ GStrv query_preset_names(guint bank)
|
||||
}
|
||||
|
||||
for (x=11; ((x<data->len) && (n<n_total)); x++) {
|
||||
if ((x % 8) == 0) // every 8th byte is 0x00
|
||||
if ((x % 8) == 0) /* every 8th byte is 0x00 */
|
||||
continue;
|
||||
|
||||
if (data->str[x] == 0xF7) // every message ends with 0xF7
|
||||
if (data->str[x] == 0xF7) /* every message ends with 0xF7 */
|
||||
break;
|
||||
|
||||
if (data->str[x] == 0) { // presets are splitted with 0x00
|
||||
if (data->str[x] == 0) { /* presets are splitted with 0x00 */
|
||||
gchar *name;
|
||||
|
||||
name = g_new(gchar, b+1);
|
||||
@@ -368,6 +398,72 @@ GStrv query_preset_names(guint bank)
|
||||
return str_array;
|
||||
}
|
||||
|
||||
static void unpack_message(GString *msg)
|
||||
{
|
||||
int offset;
|
||||
int x;
|
||||
int i;
|
||||
unsigned char status;
|
||||
gboolean finish = FALSE;
|
||||
|
||||
offset = 9;
|
||||
x = 0;
|
||||
i = 8;
|
||||
|
||||
do {
|
||||
status = (unsigned char)msg->str[offset-1];
|
||||
for (x=0; x<7; x++) {
|
||||
if ((unsigned char)msg->str[offset+x] == 0xF7) {
|
||||
msg->str[i] = 0xF7;
|
||||
finish = TRUE;
|
||||
}
|
||||
|
||||
msg->str[i] = (((status << (x+1)) & 0x80) | (unsigned char)msg->str[x+offset]);
|
||||
i++;
|
||||
}
|
||||
offset += 8;
|
||||
} while (finish == FALSE && offset < msg->len);
|
||||
}
|
||||
|
||||
GString *get_current_preset()
|
||||
{
|
||||
GString *data = NULL;
|
||||
|
||||
/* clear MIDI IN buffer */
|
||||
clear_midi_in_buffer();
|
||||
|
||||
send_message(REQUEST_PRESET, "\x04\x00", 3);
|
||||
|
||||
/* read reply */
|
||||
data = read_data();
|
||||
g_string_free(data, TRUE);
|
||||
|
||||
data = read_data();
|
||||
|
||||
unpack_message(data);
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
static gboolean request_who_am_i(unsigned char *device_id, unsigned char *family_id,
|
||||
unsigned char *product_id)
|
||||
{
|
||||
send_message(REQUEST_WHO_AM_I, NULL, 0);
|
||||
|
||||
GString *data = read_data();
|
||||
if (data != NULL) {
|
||||
if ((data->len == 15) && (data->str[7] == RECEIVE_WHO_AM_I)) {
|
||||
*device_id = data->str[9];
|
||||
*family_id = data->str[10];
|
||||
*product_id = data->str[11];
|
||||
g_string_free(data, TRUE);
|
||||
return TRUE;
|
||||
}
|
||||
g_string_free(data, TRUE);
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static GOptionEntry options[] = {
|
||||
{"device", 'd', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_STRING, &device, "MIDI device port to use", NULL},
|
||||
{NULL}
|
||||
@@ -390,16 +486,14 @@ int main(int argc, char *argv[]) {
|
||||
g_option_context_free(context);
|
||||
|
||||
if (open_device() == TRUE) {
|
||||
GtkWidget *msg = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL,
|
||||
GTK_MESSAGE_ERROR,
|
||||
GTK_BUTTONS_OK,
|
||||
"Failed to open MIDI device");
|
||||
|
||||
gtk_dialog_run(GTK_DIALOG(msg));
|
||||
gtk_widget_destroy(msg);
|
||||
show_error_message(NULL, "Failed to open MIDI device");
|
||||
} else {
|
||||
create_window();
|
||||
gtk_main();
|
||||
if (request_who_am_i(&device_id, &family_id, &product_id) == FALSE) {
|
||||
show_error_message(NULL, "No suitable reply from device - is it connected?");
|
||||
} else {
|
||||
create_window();
|
||||
gtk_main();
|
||||
}
|
||||
}
|
||||
|
||||
if (output != NULL)
|
||||
|
||||
119
gdigi.h
119
gdigi.h
@@ -436,49 +436,6 @@ enum {
|
||||
#define EMT240_PLATE_LIVELINESS 1933
|
||||
#define EMT240_PLATE_LEVEL 1925
|
||||
|
||||
enum {
|
||||
EXP_TYPE_NONE = 0,
|
||||
EXP_TYPE_PICKUP_ENABLE = 131137,
|
||||
EXP_TYPE_PIKCUP_TYPE = 131136,
|
||||
EXP_TYPE_COMP_ENABLE = 262337,
|
||||
EXP_TYPE_COMP_SUST = 262352,
|
||||
EXP_TYPE_COMP_TONE = 262353,
|
||||
EXP_TYPE_COMP_LEVEL = 262354,
|
||||
EXP_TYPE_COMP_ATTACK = 262355,
|
||||
EXP_TYPE_DIST_ENABLE = 395649,
|
||||
EXP_TYPE_DIST_DISTORTION = 395653,
|
||||
EXP_TYPE_DIST_FILTER = 395654,
|
||||
EXP_TYPE_DIST_VOLUME = 395655,
|
||||
EXP_TYPE_AMP_ENABLE = 524553,
|
||||
EXP_TYPE_AMP_GAIN = 526785,
|
||||
EXP_TYPE_AMP_LEVEL = 526786,
|
||||
EXP_TYPE_EQ_ENABLE = 1576076,
|
||||
EXP_TYPE_EQ_BASS = 1576067,
|
||||
EXP_TYPE_EQ_MID = 1576068,
|
||||
EXP_TYPE_EQ_TREB = 1576069,
|
||||
EXP_TYPE_GATE_ENABLE = 787137,
|
||||
EXP_TYPE_GATE_THRESHOLD = 787142,
|
||||
EXP_TYPE_GATE_ATTACK = 787144,
|
||||
EXP_TYPE_GATE_RELEASE = 787145,
|
||||
EXP_TYPE_GATE_ATTN = 787146,
|
||||
EXP_TYPE_CHORUSFX_ENABLE = 918273,
|
||||
EXP_TYPE_PHASER_SPEED = 918466,
|
||||
EXP_TYPE_PHASER_DEPTH = 918467,
|
||||
EXP_TYPE_PHASER_REGEN = 918470,
|
||||
EXP_TYPE_PHASER_WAVEFORM = 918471,
|
||||
EXP_TYPE_PHASER_LEVEL = 918469,
|
||||
EXP_TYPE_DELAY_ENABLE = 984897,
|
||||
EXP_TYPE_DELAY_TIME = 984928,
|
||||
EXP_TYPE_DELAY_REPEATS = 984903,
|
||||
EXP_TYPE_DELAY_LEVEL = 984900,
|
||||
EXP_TYPE_DELAY_DUCK_THRESH = 984929,
|
||||
EXP_TYPE_DELAY_DUCK_LEVEL = 984930,
|
||||
EXP_TYPE_REVERB_ENABLE = 1050497,
|
||||
EXP_TYPE_REVERB_LEVEL = 1050501,
|
||||
EXP_TYPE_VOLUME_PRE_FX = 854594,
|
||||
EXP_TYPE_VOLUME_POST_FX = 1116738
|
||||
};
|
||||
|
||||
#define EXP_TYPE 8194
|
||||
#define EXP_POSITION 19
|
||||
|
||||
@@ -489,15 +446,81 @@ enum {
|
||||
#define USB_AUDIO_PLAYBACK_MIX 12297
|
||||
#define USB_AUDIO_LEVEL 12307
|
||||
|
||||
typedef enum {
|
||||
PRESETS_SYSTEM = 0,
|
||||
PRESETS_USER = 1
|
||||
} PresetBank;
|
||||
enum {
|
||||
PRESETS_SYSTEM = 0,
|
||||
PRESETS_USER = 1,
|
||||
PRESETS_ARTIST = 2,
|
||||
|
||||
/* Version 1 and later */
|
||||
PRESETS_MEDIA_CARD = 3,
|
||||
PRESETS_EDIT_BUFFER = 4, /* Current preset edit buffer, index must be 0 */
|
||||
PRESETS_FACTORY2 = 5,
|
||||
|
||||
/* Version 2 and later */
|
||||
PRESETS_EXTERNAL = 6
|
||||
};
|
||||
|
||||
enum {
|
||||
REQUEST_WHO_AM_I = 0x01,
|
||||
RECEIVE_WHO_AM_I = 0x02,
|
||||
|
||||
REQUEST_DEVICE_CONFIGURATION = 0x08,
|
||||
RECEIVE_DEVICE_CONFIGURATION = 0x09,
|
||||
|
||||
REQUEST_GLOBAL_PARAMETERS = 0x10,
|
||||
RECEIVE_GLOBAL_PARAMETERS = 0x11,
|
||||
|
||||
REQUEST_BULK_DUMP = 0x18,
|
||||
RECEIVE_BULK_DUMP_START = 0x19,
|
||||
RECEIVE_BULK_DUMP_END = 0x1B,
|
||||
|
||||
REQUEST_PRESET_NAMES = 0x21,
|
||||
RECEIVE_PRESET_NAMES = 0x22,
|
||||
|
||||
REQUEST_PRESET_NAME = 0x28,
|
||||
RECEIVE_PRESET_NAME = 0x29,
|
||||
|
||||
REQUEST_PRESET = 0x2A,
|
||||
RECEIVE_PRESET_START = 0x2B,
|
||||
RECEIVE_PRESET_END = 0x2C,
|
||||
RECEIVE_PRESET_PARAMETERS = 0x2D,
|
||||
|
||||
LOAD_EDIT_BUFFER_PRESET = 0x38, /* version 0 only
|
||||
use move preset in later versions */
|
||||
|
||||
MOVE_PRESET = 0x39,
|
||||
|
||||
REQUEST_MODIFIER_LINKABLE_LIST = 0x3A,
|
||||
RECEIVE_MOFIFIER_LINKABLE_LIST = 0x3B,
|
||||
|
||||
REQUEST_PARAMETER_VALUE = 0x40,
|
||||
RECEIVE_PARAMETER_VALUE = 0x41,
|
||||
|
||||
/* version 1 and later */
|
||||
REQUEST_OBJECT_NAMES = 0x50,
|
||||
RECEIVE_OBJECT_NAMES = 0x51,
|
||||
REQUEST_OBJECT_NAME = 0x52,
|
||||
RECEIVE_OBJECT_NAME = 0x53,
|
||||
REQUEST_OBJECT = 0x54,
|
||||
RECEIVE_OBJECT = 0x55,
|
||||
MOVE_OBJECT = 0x56,
|
||||
DELETE_OBJECT = 0x57,
|
||||
REQUEST_TABLE = 0x5A,
|
||||
RECEIVE_TABLE = 0x5B,
|
||||
|
||||
RECEIVE_DEVICE_NOTIFICATION = 0x70,
|
||||
|
||||
ACK = 0x7E,
|
||||
NACK = 0x7F
|
||||
};
|
||||
|
||||
void send_message(gint procedure, gchar *data, gint len);
|
||||
void append_value(GString *msg, guint value);
|
||||
void set_option(guint id, guint position, guint value);
|
||||
void switch_preset(guint bank, guint x);
|
||||
void store_preset_name(int x, const gchar *name);
|
||||
void set_preset_level(int level);
|
||||
GStrv query_preset_names(PresetBank bank);
|
||||
GStrv query_preset_names(gchar bank);
|
||||
GString *get_current_preset();
|
||||
|
||||
#endif /* GDIGI_H */
|
||||
|
||||
141
gui.c
141
gui.c
@@ -23,6 +23,21 @@
|
||||
extern EffectList effects[];
|
||||
extern int n_effects;
|
||||
|
||||
static gboolean allow_send = FALSE;
|
||||
|
||||
void show_error_message(GtkWidget *parent, gchar *message)
|
||||
{
|
||||
g_return_if_fail(message != NULL);
|
||||
|
||||
GtkWidget *msg = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL,
|
||||
GTK_MESSAGE_ERROR,
|
||||
GTK_BUTTONS_OK,
|
||||
message);
|
||||
|
||||
gtk_dialog_run(GTK_DIALOG(msg));
|
||||
gtk_widget_destroy(msg);
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
GtkWidget *widget;
|
||||
gint id;
|
||||
@@ -37,16 +52,20 @@ void value_changed_option_cb(GtkSpinButton *spinbutton, EffectSettings *setting)
|
||||
{
|
||||
g_return_if_fail(setting != NULL);
|
||||
|
||||
int val = gtk_spin_button_get_value_as_int(spinbutton);
|
||||
set_option(setting->option, setting->position, val);
|
||||
if (allow_send) {
|
||||
gint val = gtk_spin_button_get_value_as_int(spinbutton);
|
||||
set_option(setting->option, setting->position, val);
|
||||
}
|
||||
}
|
||||
|
||||
void toggled_cb(GtkToggleButton *button, Effect *effect)
|
||||
{
|
||||
g_return_if_fail(effect != NULL);
|
||||
|
||||
guint val = gtk_toggle_button_get_active(button);
|
||||
set_option(effect->option, effect->position, val);
|
||||
if (allow_send) {
|
||||
guint val = gtk_toggle_button_get_active(button);
|
||||
set_option(effect->option, effect->position, val);
|
||||
}
|
||||
}
|
||||
|
||||
static void widget_list_add(GList **list, GtkWidget *widget, gint id, gint position, gint value, gint x)
|
||||
@@ -63,6 +82,46 @@ static void widget_list_add(GList **list, GtkWidget *widget, gint id, gint posit
|
||||
*list = g_list_prepend(*list, el);
|
||||
}
|
||||
|
||||
static void apply_widget_setting(WidgetListElem *el, SettingParam *param)
|
||||
{
|
||||
if ((el->id == param->id) && (el->position == param->position)) {
|
||||
if (el->value == -1) {
|
||||
if (GTK_IS_TOGGLE_BUTTON(el->widget))
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(el->widget), (param->value == 0) ? FALSE : TRUE);
|
||||
else if (GTK_IS_SPIN_BUTTON(el->widget))
|
||||
gtk_spin_button_set_value(GTK_SPIN_BUTTON(el->widget), param->value);
|
||||
} else { /* combo box */
|
||||
if (el->value == param->value)
|
||||
gtk_combo_box_set_active(GTK_COMBO_BOX(el->widget), el->x);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void apply_preset_to_gui(GList *list, Preset *preset)
|
||||
{
|
||||
allow_send = FALSE;
|
||||
|
||||
GList *iter = preset->params;
|
||||
while (iter) {
|
||||
SettingParam *param = iter->data;
|
||||
iter = iter->next;
|
||||
|
||||
if (param != NULL)
|
||||
g_list_foreach(list, (GFunc)apply_widget_setting, param);
|
||||
}
|
||||
|
||||
allow_send = TRUE;
|
||||
}
|
||||
|
||||
static void apply_current_preset(GList *list)
|
||||
{
|
||||
GString *msg = get_current_preset();
|
||||
Preset *preset = create_preset_from_data(msg);
|
||||
g_string_free(msg, TRUE);
|
||||
apply_preset_to_gui(list, preset);
|
||||
preset_free(preset);
|
||||
}
|
||||
|
||||
GtkWidget *create_table(GList **list, EffectSettings *settings, gint amt)
|
||||
{
|
||||
GtkWidget *table, *label, *widget;
|
||||
@@ -73,7 +132,7 @@ GtkWidget *create_table(GList **list, EffectSettings *settings, gint amt)
|
||||
|
||||
for (x = 0; x<amt; x++) {
|
||||
label = gtk_label_new(settings[x].label);
|
||||
adj = gtk_adjustment_new(0.0, settings[x].min, settings[x].max, 1.0, 1.0, 1.0);
|
||||
adj = gtk_adjustment_new(0.0, settings[x].min, settings[x].max, 1.0, 1.0, 0.0);
|
||||
widget = gtk_spin_button_new(GTK_ADJUSTMENT(adj), 1.0, 0);
|
||||
g_signal_connect(G_OBJECT(widget), "value-changed", G_CALLBACK(value_changed_option_cb), &settings[x]);
|
||||
widget_list_add(list, widget, settings[x].option, settings[x].position, -1, -1);
|
||||
@@ -126,7 +185,7 @@ void combo_box_changed_cb(GtkComboBox *widget, gpointer data)
|
||||
settings = g_object_get_data(G_OBJECT(widget), name);
|
||||
g_free(name);
|
||||
|
||||
if (settings != NULL)
|
||||
if (settings != NULL && allow_send)
|
||||
set_option(settings->option, settings->position, settings->id);
|
||||
|
||||
child = g_object_get_data(G_OBJECT(widget), "active_child");
|
||||
@@ -224,8 +283,12 @@ void row_activate_cb(GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn
|
||||
gtk_tree_model_get_iter(model, &iter, path);
|
||||
gtk_tree_model_get(model, &iter, PRESET_NUMBER_COLUMN, &id, PRESET_BANK_COLUMN, &bank, -1);
|
||||
|
||||
if ((bank != -1) && (id != -1))
|
||||
if ((bank != -1) && (id != -1)) {
|
||||
GList **list = g_object_get_data(G_OBJECT(treeview), "widgets-list");
|
||||
switch_preset(bank, id);
|
||||
if (*list != NULL)
|
||||
apply_current_preset(*list);
|
||||
}
|
||||
}
|
||||
|
||||
static void fill_store_with_presets(GtkTreeStore *model, guint bank, gchar *name)
|
||||
@@ -259,7 +322,7 @@ static void fill_store(GtkTreeStore *model)
|
||||
fill_store_with_presets(model, PRESETS_SYSTEM, "System Presets");
|
||||
}
|
||||
|
||||
GtkWidget *create_preset_tree()
|
||||
GtkWidget *create_preset_tree(GList **list)
|
||||
{
|
||||
GtkWidget *treeview;
|
||||
GtkTreeStore *store;
|
||||
@@ -281,6 +344,8 @@ GtkWidget *create_preset_tree()
|
||||
g_signal_connect(G_OBJECT(treeview), "realize", G_CALLBACK(gtk_tree_view_expand_all), NULL);
|
||||
g_signal_connect(G_OBJECT(treeview), "row-activated", G_CALLBACK(row_activate_cb), GTK_TREE_MODEL(store));
|
||||
|
||||
g_object_set_data(G_OBJECT(treeview), "widgets-list", list);
|
||||
|
||||
return treeview;
|
||||
}
|
||||
|
||||
@@ -332,33 +397,6 @@ static void show_store_preset_window(GtkWidget *window, gchar *default_name)
|
||||
gtk_widget_destroy(dialog);
|
||||
}
|
||||
|
||||
static void apply_widget_setting(WidgetListElem *el, SettingParam *param)
|
||||
{
|
||||
if ((el->id == param->id) && (el->position == param->position)) {
|
||||
if (el->value == -1) {
|
||||
if (GTK_IS_TOGGLE_BUTTON(el->widget))
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(el->widget), (param->value == 0) ? FALSE : TRUE);
|
||||
else if (GTK_IS_SPIN_BUTTON(el->widget))
|
||||
gtk_spin_button_set_value(GTK_SPIN_BUTTON(el->widget), param->value);
|
||||
} else { /* combo box */
|
||||
if (el->value == param->value)
|
||||
gtk_combo_box_set_active(GTK_COMBO_BOX(el->widget), el->x);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void apply_preset_to_gui(GList *list, Preset *preset)
|
||||
{
|
||||
GList *iter = preset->params;
|
||||
while (iter) {
|
||||
SettingParam *param = iter->data;
|
||||
iter = iter->next;
|
||||
|
||||
if (param != NULL)
|
||||
g_list_foreach(list, (GFunc)apply_widget_setting, param);
|
||||
}
|
||||
}
|
||||
|
||||
static void action_store_cb(GtkAction *action)
|
||||
{
|
||||
GtkWidget *window = g_object_get_data(G_OBJECT(action), "window");
|
||||
@@ -435,19 +473,41 @@ static void action_open_preset_cb(GtkAction *action)
|
||||
|
||||
gtk_widget_hide(dialog);
|
||||
|
||||
GString *msg = g_string_sized_new(500);
|
||||
GList *iter = preset->params;
|
||||
gint len = g_list_length(iter);
|
||||
|
||||
g_string_append_printf(msg, "%c%c",
|
||||
((len & 0xFF00) >> 8),
|
||||
(len & 0xFF));
|
||||
|
||||
while (iter) {
|
||||
SettingParam *param = iter->data;
|
||||
iter = iter->next;
|
||||
|
||||
/* sending those is likely to freeze/reboot device */
|
||||
if ((param->id == 8704) || (param->id == 8705))
|
||||
continue;
|
||||
g_string_append_printf(msg, "%c%c%c",
|
||||
((param->id & 0xFF00) >> 8),
|
||||
(param->id & 0xFF),
|
||||
param->position);
|
||||
|
||||
set_option(param->id, param->position, param->value);
|
||||
append_value(msg, param->value);
|
||||
};
|
||||
|
||||
GString *start = g_string_new(NULL);
|
||||
g_string_append_printf(start,
|
||||
"%c%c%s%c%c%c",
|
||||
PRESETS_EDIT_BUFFER, 0,
|
||||
preset->name, 0 /* NULL terminated string */,
|
||||
0 /* modified */, 2 /* messages to follow */);
|
||||
|
||||
send_message(RECEIVE_PRESET_START, start->str, start->len);
|
||||
send_message(RECEIVE_PRESET_PARAMETERS, msg->str, msg->len);
|
||||
send_message(RECEIVE_PRESET_END, NULL, 0);
|
||||
|
||||
show_store_preset_window(window, preset->name);
|
||||
|
||||
g_string_free(start, TRUE);
|
||||
g_string_free(msg, TRUE);
|
||||
preset_free(preset);
|
||||
loaded = TRUE;
|
||||
}
|
||||
@@ -572,7 +632,7 @@ void create_window()
|
||||
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
|
||||
gtk_box_pack_start(GTK_BOX(hbox), sw, FALSE, FALSE, 0);
|
||||
|
||||
widget = create_preset_tree();
|
||||
widget = create_preset_tree(&list);
|
||||
gtk_container_add(GTK_CONTAINER(sw), widget);
|
||||
|
||||
vbox = gtk_vbox_new(FALSE, 0);
|
||||
@@ -587,6 +647,7 @@ void create_window()
|
||||
gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 2);
|
||||
}
|
||||
|
||||
apply_current_preset(list);
|
||||
gtk_widget_show_all(window);
|
||||
|
||||
g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_main_quit), NULL);
|
||||
|
||||
1
gui.h
1
gui.h
@@ -17,6 +17,7 @@
|
||||
#ifndef GDIGI_GUI_H
|
||||
#define GDIGI_GUI_H
|
||||
|
||||
void show_error_message(GtkWidget *parent, gchar *message);
|
||||
void create_window();
|
||||
|
||||
#endif /* GDIGI_GUI_H */
|
||||
|
||||
48
preset.c
48
preset.c
@@ -165,6 +165,54 @@ Preset *create_preset_from_xml_file(gchar *filename)
|
||||
return preset;
|
||||
}
|
||||
|
||||
Preset *create_preset_from_data(GString *data)
|
||||
{
|
||||
gint total;
|
||||
gint n;
|
||||
gint id;
|
||||
gint position;
|
||||
guint value;
|
||||
gint x;
|
||||
gint tmp;
|
||||
|
||||
x = 0x09;
|
||||
n = 0;
|
||||
total = (unsigned char)data->str[x];
|
||||
x++;
|
||||
|
||||
Preset *preset = g_malloc(sizeof(Preset));
|
||||
preset->name = NULL; /* TODO */
|
||||
preset->params = NULL;
|
||||
|
||||
do {
|
||||
id = ((unsigned char)data->str[x] << 8) | (unsigned char)data->str[x+1];
|
||||
position = (unsigned char)data->str[x+2];
|
||||
x+=3;
|
||||
value = data->str[x];
|
||||
x++;
|
||||
if (value > 0x80) {
|
||||
tmp = value & 0x7F;
|
||||
value = 0;
|
||||
gint i;
|
||||
for (i=0; i<tmp; i++) {
|
||||
value |= ((unsigned char)data->str[x+i] << (8*(tmp-i-1)));
|
||||
}
|
||||
x+=tmp;
|
||||
}
|
||||
n++;
|
||||
SettingParam *param = (SettingParam *)g_malloc(sizeof(SettingParam));
|
||||
param->id = id;
|
||||
param->position = position;
|
||||
param->value = value;
|
||||
preset->params = g_list_prepend(preset->params, param);
|
||||
g_message("%d ID %d Position %d Value %d", n, id, position, value);
|
||||
} while ((x < data->len) && n<total);
|
||||
g_message("TOTAL %d", total);
|
||||
preset->params = g_list_reverse(preset->params);
|
||||
|
||||
return preset;
|
||||
}
|
||||
|
||||
void preset_free(Preset *preset)
|
||||
{
|
||||
g_return_if_fail(preset != NULL);
|
||||
|
||||
1
preset.h
1
preset.h
@@ -31,6 +31,7 @@ typedef struct {
|
||||
} Preset;
|
||||
|
||||
Preset *create_preset_from_xml_file(gchar *filename);
|
||||
Preset *create_preset_from_data(GString *data);
|
||||
void preset_free(Preset *preset);
|
||||
|
||||
#endif /* GDIGI_PRESET_H */
|
||||
|
||||
242
tests.c
242
tests.c
@@ -620,247 +620,6 @@ void test_reverb()
|
||||
set_option(REVERB_ON_OFF, REVERB_POSITION, 0);
|
||||
}
|
||||
|
||||
void test_exp()
|
||||
{
|
||||
int x;
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_NONE);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_PICKUP_ENABLE);
|
||||
for (x=0; x<=1; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=1; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_PIKCUP_TYPE);
|
||||
for (x=0; x<=1; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=1; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_COMP_ENABLE);
|
||||
for (x=0; x<=1; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=1; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_COMP_SUST);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_COMP_TONE);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_COMP_LEVEL);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_COMP_ATTACK);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_DIST_ENABLE);
|
||||
for (x=0; x<=1; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=1; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_DIST_DISTORTION);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_DIST_FILTER);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_DIST_VOLUME);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_AMP_ENABLE);
|
||||
for (x=0; x<=1; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=1; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_AMP_GAIN);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_AMP_LEVEL);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_EQ_ENABLE);
|
||||
for (x=0; x<=1; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=1; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_EQ_BASS);
|
||||
for (x=0; x<=24; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=24; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_EQ_MID);
|
||||
for (x=0; x<=24; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=24; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_EQ_TREB);
|
||||
for (x=0; x<=24; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=24; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_GATE_ENABLE);
|
||||
for (x=0; x<=1; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=1; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_GATE_THRESHOLD);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_GATE_ATTACK);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_GATE_RELEASE);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_GATE_ATTN);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_CHORUSFX_ENABLE);
|
||||
for (x=0; x<=1; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=1; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_PHASER_SPEED);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_PHASER_DEPTH);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_PHASER_REGEN);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_PHASER_WAVEFORM);
|
||||
for (x=0; x<=2; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=2; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_PHASER_LEVEL);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_DELAY_ENABLE);
|
||||
for (x=0; x<=1; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=1; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_DELAY_TIME);
|
||||
for (x=0; x<=139; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=139; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_DELAY_REPEATS);
|
||||
for (x=0; x<=100; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=100; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_DELAY_LEVEL);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_DELAY_DUCK_THRESH);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_DELAY_DUCK_LEVEL);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_REVERB_ENABLE);
|
||||
for (x=0; x<=1; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=1; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_REVERB_LEVEL);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_VOLUME_PRE_FX);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
|
||||
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_VOLUME_POST_FX);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MIN, EXP_POSITION, x);
|
||||
for (x=0; x<=99; x++)
|
||||
set_option(EXP_MAX, EXP_POSITION, x);
|
||||
}
|
||||
|
||||
void test_usb()
|
||||
{
|
||||
int x;
|
||||
@@ -884,6 +643,5 @@ void test_all()
|
||||
test_chorusfx();
|
||||
test_delay();
|
||||
test_reverb();
|
||||
test_exp();
|
||||
test_usb();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user