48 Commits
0.1.7 ... 0.1.8

Author SHA1 Message Date
Tomasz Moń
ba04930133 display GNX3000 settings in tabs 2009-06-21 20:05:42 +02:00
Stephen Rigler
18f137636d add GNX3000 amp channel settings 2009-05-20 20:51:10 +02:00
Jaco Kroon
eba8bbe5aa fix Makefile 2009-05-15 21:54:42 +02:00
Tomasz Moń
7a6e3b159c greatly reduce number of comparisions required to apply parameters to GUI 2009-05-15 20:59:28 +02:00
Tomasz Moń
cc85da9c71 update ignore list 2009-05-15 16:39:31 +02:00
Jaco Kroon
9586f6cd31 make buildsystem aware of header changes 2009-05-15 16:37:55 +02:00
Tomasz Moń
4a7ab848e7 remove id and position fields from EffectGroup 2009-05-15 10:20:42 +02:00
Jaco Kroon
2703e79d39 add GNX4 stompbox, noisegate, chorus, delay and reverb settings 2009-05-15 09:19:23 +02:00
Tomasz Moń
dbab804d52 actually the compressor settings are the same for both GNX3000 and GNX4 2009-05-13 12:19:44 +02:00
Tomasz Moń
c3f82416f5 rename values_synth_talk_balance as it's actually used for more effects 2009-05-13 12:10:40 +02:00
Tomasz Moń
145b41cb6c actually the whammy settings are the same for both GNX3000 and GNX4 2009-05-13 10:41:58 +02:00
Stephen Rigler
26d1db9e4f add GNX3000 amp channel + warping settings 2009-05-13 08:03:29 +02:00
Jaco Kroon
cc311f4f18 add GNX4 pickup, wah, compressor and whammy effect 2009-05-13 07:47:58 +02:00
Jaco Kroon
d85e83c89e make get_device_info interate over list of supported product and family ID 2009-05-13 07:27:11 +02:00
Tomasz Moń
55b9b08230 check RECEIVE_WHO_AM_I reply size 2009-05-12 21:51:43 +02:00
Tomasz Moń
400e221a4f make some devices happy 2009-05-12 21:14:46 +02:00
Jaco Kroon
5b93c91bfe fix unsigned comparisions 2009-05-12 19:43:17 +02:00
Tomasz Moń
cbd07a9709 revise create_preset_from_data 2009-05-11 23:32:17 +02:00
Tomasz Moń
def4917a07 revise mutex logic 2009-05-11 21:17:04 +02:00
Stephen Rigler
e9c0ed8b38 add GNX3000 reverb settings 2009-05-11 07:39:15 +02:00
Tomasz Moń
400a7d41f8 merge GNX3000 delay settings 2009-05-10 15:28:30 +02:00
Stephen Rigler
40a9d06e4c add GNX3000 delay settings 2009-05-10 14:13:40 +02:00
Stephen Rigler
e820ce0cc4 add GNX3000 chorus settings 2009-05-09 07:47:22 +02:00
Tomasz Moń
ebc603143e update TODO 2009-05-08 14:24:01 +02:00
Tomasz Moń
c74290d8e1 use gtk_dialog_get_content_area 2009-05-07 14:17:03 +02:00
Tomasz Moń
295e932bf1 update HACKING file 2009-05-06 17:57:51 +02:00
Tomasz Moń
1a65deb8d5 if get_message_by_id can't find message, wait until new message is pushed before retrying 2009-05-06 13:19:49 +02:00
Tomasz Moń
4509c14bbc make get_current_preset return list of messages describing preset rather than just one message with preset parameters 2009-05-06 13:10:46 +02:00
Stephen Rigler
d7f10eb509 add GNX3000 whammy/ips, preset level and noisegate settings 2009-05-06 08:14:27 +02:00
Tomasz Moń
b1a8d69dba Receive Who Am I can vary in length between versions 2009-05-04 17:39:46 +02:00
Tomasz Moń
20769ace01 Fix memory leak 2009-05-04 17:29:22 +02:00
Tomasz Moń
2633bac5d8 update GUI on remote preset change 2009-05-04 17:04:32 +02:00
Stephen Rigler
af1d3a2906 add GNX3000 pickup, wah and compressor settings 2009-05-04 15:26:15 +02:00
Tomasz Moń
06fd3eee66 apply asynchronous parameters changes to GUI 2009-05-03 22:17:41 +02:00
Tomasz Moń
acb1c1e273 introduce setting_param_new, setting_param_new_from_data and setting_param_free 2009-05-03 21:38:15 +02:00
Tomasz Moń
7bf55352b8 set device into GUI mode 2009-05-03 20:32:13 +02:00
Tomasz Moń
6a1d1de390 fix compiler warning 2009-05-02 14:25:50 +02:00
Tomasz Moń
b798d6ee39 remove reduntant defines 2009-05-01 20:33:09 +02:00
Tomasz Moń
ba810bf4f8 reuse widget table if possible 2009-05-01 16:12:58 +02:00
Tomasz Moń
24a1c2718b remove reduntant defines 2009-05-01 16:06:15 +02:00
Tomasz Moń
31a635839a add GNX3000 distortion settings 2009-05-01 07:53:23 +02:00
Tomasz Moń
d7b3f7a3d6 add Device struct 2009-04-30 17:27:55 +02:00
Tomasz Moń
6512696240 read MIDI IN messages in new thread 2009-04-30 10:32:24 +02:00
Tomasz Moń
f1359d18e4 open device in sync mode 2009-04-27 13:46:27 +02:00
Tomasz Moń
85ce157bb8 remove reduntant defines 2009-04-17 17:45:01 +02:00
Tomasz Moń
6daaf47cd8 remove tests as they are now obsolete 2009-04-17 17:32:55 +02:00
Tomasz Moń
3a849de954 add RP250 pickup settings 2009-04-17 17:30:50 +02:00
Tomasz Moń
a06c5dc07e Added tag 0.1.7 for changeset c622b5d3c3b3 2009-04-15 06:55:22 +02:00
14 changed files with 2076 additions and 1553 deletions

View File

@@ -6,3 +6,7 @@ syntax: glob
*.o
*.patch
*.diff
*.m
*.orig
knob.h
gdigi

12
HACKING
View File

@@ -3,7 +3,7 @@ In general everything brings down to figure out:
-Position
-Possible value range
There seems to be two possible ways to figure that out.
There seems to be three possible ways to figure that out.
1) Use USB sniffer together with X-Edit
Once you set up X-Edit and usb sniffer, set some option.
USB sniffer should report something like this being sent to device:
@@ -66,3 +66,13 @@ There seems to be two possible ways to figure that out.
save new patch
check patch file and note the change
while you don't have all possible values
3) Use gdigi
After starting gdigi turn the knobs on your device.
Check out console output, you should notice something like this:
** Message: Received parameter change ID: 210 Position: 4 Value: 0
ID is ID, Position is Position and Value is one of possible values.
To get all possible values keep turning knobs and watch the output.
If you change effect type usually there's more messages - where,
usually the first one is type change, and rest are default values.
This way you *CANNOT* gather all information (there're X-Edit only
controlled values, check device manual for more information).

View File

@@ -1,35 +1,43 @@
CC = gcc
CFLAGS = `pkg-config --cflags glib-2.0 gio-2.0 gtk+-2.0` -Wall -g -ansi -std=c99
OFLAG = -o
LIBS = `pkg-config --libs glib-2.0 gio-2.0 gtk+-2.0 alsa` -lexpat
EXTRA_CFLAGS ?=
EXTRA_LDFLAGS ?=
CFLAGS := $(shell pkg-config --cflags glib-2.0 gio-2.0 gtk+-2.0) -Wall -g -ansi -std=c99 $(EXTRA_CFLAGS)
LDFLAGS := $(shell pkg-config --libs glib-2.0 gio-2.0 gtk+-2.0 gthread-2.0 alsa) -lexpat $(EXTRA_LDFLAGS)
OBJECTS = gdigi.o gui.o effects.o preset.o gtkknob.o
DEPFILES = $(foreach m,$(OBJECTS:.o=),.$(m).m)
.SUFFIXES : .o .c
.c.o :
.PHONY : clean distclean all
%.o : %.c
$(CC) $(CFLAGS) -c $<
.%.m : %.c
$(CC) $(CFLAGS) -M -MF $@ -MG $<
all: gdigi
gdigi: knob.h gdigi.o tests.o gui.o effects.o preset.o gtkknob.o
$(CC) $(LIBS) $(OFLAG) gdigi gdigi.o tests.o gui.o effects.o preset.o gtkknob.o
gdigi: $(OBJECTS)
$(CC) $(LDFLAGS) -o $@ $+
gdigi.o: gdigi.c
tests.o: tests.c
gui.o: gui.c
effects.o: effects.c
preset.o: preset.c
gtkknob.o: gtkknob.c
gtkknob.o: gtkknob.c
knob.h:
knob.h: knob.png
gdk-pixbuf-csource --name=knob_pixbuf knob.png > $@
clean:
rm *.o
rm -f *.o
rm -f knob.h
distclean : clean
rm -f .*.m
rm -f gdigi
NODEP_TARGETS := clean distclean
depinc := 1
ifneq (,$(filter $(NODEP_TARGETS),$(MAKECMDGOALS)))
depinc := 0
endif
ifneq (,$(fitler-out $(NODEP_TARGETS),$(MAKECMDGOALS)))
depinc := 1
endif
ifeq ($(depinc),1)
-include $(DEPFILES)
endif

7
TODO
View File

@@ -1,7 +1,6 @@
-make complete gui
-effects level
-make complete gui (expression pedal settings, usb settings, effect level, preset level)
-handling presets (saving, exporting to xml patches)
-buildsystem (install knob.png to share dir, don't use inline knob pixbuf)
-add expression pedal settings to gui
-read asynchronously from MIDI IN
-various fixes to MIDI IN messages handling
-guess device port when user doesn't explicitly provide it (don't use hardcoded "hw:1,0,0")
-optimizations

1529
effects.c

File diff suppressed because it is too large Load Diff

View File

@@ -35,8 +35,6 @@ typedef struct {
typedef struct {
guint type; /**< value (type) */
gchar *label; /**< Effect name */
guint id; /**< ID (to set effect type) */
guint position; /**< position */
EffectSettings *settings; /**< possible parameters */
gint settings_amt; /**< possible parameters length */
} EffectGroup;
@@ -44,6 +42,7 @@ typedef struct {
typedef struct {
gchar *label; /**< Group label */
guint id; /**< ID to set effect on/off, or if it isn't on/off group then -1 */
guint type; /**< ID to set effect type */
guint position; /**< position */
EffectGroup *group; /**< possible effect types */
gint group_amt; /**< possible effect types length */
@@ -56,20 +55,38 @@ typedef struct {
} EffectList;
typedef struct {
guint type; /**< ID to set effect type */
guint position;
EffectGroup *group;
gint group_amt;
} ModifierGroup;
typedef struct {
gchar *name;
EffectList *list;
int n_list;
} SupportedDevices;
EffectList *effects;
gint n_effects;
gint n_rows;
} EffectPage;
typedef struct {
gchar *name;
PresetBank bank;
} Banks;
typedef struct {
gchar *name;
unsigned char family_id;
unsigned char product_id;
EffectPage *pages;
gint n_pages;
Banks *banks;
gint n_banks;
} Device;
ModifierGroup *modifier_linkable_list();
void modifier_group_free(ModifierGroup *modifier_group);
gboolean get_effect_list(unsigned char device_id, unsigned char family_id,
gboolean get_device_info(unsigned char device_id, unsigned char family_id,
unsigned char product_id,
EffectList **list, int *n_list);
Device **device);
#endif /* GDIGI_EFFECTS_H */

418
gdigi.c
View File

@@ -28,7 +28,11 @@ 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";
static char *device_port = "hw:1,0,0";
static GQueue *message_queue = NULL;
static GMutex *message_queue_mutex = NULL;
static GCond *message_queue_cond = NULL;
/**
* \param array data to calculate checksum
@@ -59,9 +63,9 @@ gboolean open_device()
{
int err;
err = snd_rawmidi_open(&input, &output, device, SND_RAWMIDI_NONBLOCK);
err = snd_rawmidi_open(&input, &output, device_port, SND_RAWMIDI_SYNC);
if (err) {
fprintf(stderr, "snd_rawmidi_open %s failed: %d\n", device, err);
fprintf(stderr, "snd_rawmidi_open %s failed: %d\n", device_port, err);
return TRUE;
}
@@ -125,6 +129,11 @@ GString *pack_data(gchar *data, gint len)
return packed;
}
static void message_free_func(GString *msg, gpointer user_data)
{
g_string_free(msg, TRUE);
}
/**
* \param msg message to unpack
*
@@ -169,17 +178,92 @@ static void unpack_message(GString *msg)
}
/**
* Reads data from MIDI IN. This function uses global input variable.
* \param msg SysEx message
*
* \return GString containing data, or NULL when no data was read.
* Checks message ID.
*
* \return MessageID, or -1 on error.
**/
GString* read_data()
MessageID get_message_id(GString *msg)
{
/** \todo check if msg is valid SysEx message */
g_return_val_if_fail(msg != NULL, -1);
g_return_val_if_fail(msg->str != NULL, -1);
if (msg->len > 7) {
return (unsigned char)msg->str[7];
}
return -1;
}
void push_message(GString *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; x<msg->len; x++)
printf("%02x ", (unsigned char)msg->str[x]);
printf("\n");
switch (get_message_id(msg)) {
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);
GDK_THREADS_ENTER();
apply_setting_param_to_gui(param);
GDK_THREADS_LEAVE();
setting_param_free(param);
g_string_free(msg, TRUE);
return;
case RECEIVE_DEVICE_NOTIFICATION:
unpack_message(msg);
unsigned char *str = (unsigned char*)msg->str;
switch (str[8]) {
case NOTIFY_PRESET_MOVED:
if (str[11] == PRESETS_EDIT_BUFFER && str[12] == 0) {
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();
} else
g_message("%d %d moved to %d %d", str[9], str[10], str[11], str[12]);
default:
g_message("Received unhandled device notification");
}
g_string_free(msg, TRUE);
return;
default:
g_mutex_lock(message_queue_mutex);
g_queue_push_tail(message_queue, msg);
g_cond_signal(message_queue_cond);
g_mutex_unlock(message_queue_mutex);
}
}
gpointer read_data_thread(gboolean *stop)
{
/* This is mostly taken straight from alsa-utils-1.0.19 amidi/amidi.c
by Clemens Ladisch <clemens@ladisch.de> */
int err;
int npfds;
gboolean stop = FALSE;
struct pollfd *pfds;
GString *string = NULL;
@@ -188,10 +272,14 @@ GString* read_data()
snd_rawmidi_poll_descriptors(input, pfds, npfds);
do {
char buf[20];
unsigned char buf[256];
int i, length;
unsigned short revents;
/* SysEx messages can't contain bytes with 8th bit set.
memset our buffer to 0xFF, so if for some reason we'll get out of reply bounds, we'll catch it */
memset(buf, sizeof(buf), 0xFF);
err = poll(pfds, npfds, 200);
if (err < 0 && errno == EINTR)
break;
@@ -218,22 +306,47 @@ GString* read_data()
length = 0;
for (i = 0; i < err; ++i)
if (buf[i] != 0xFE) /* ignore active sensing */
if ((unsigned char)buf[i] != 0xFE) /* ignore active sensing */
buf[length++] = buf[i];
if ((unsigned char)buf[length-1] == 0xF7)
stop = TRUE;
i = 0;
while (i < length) {
int pos;
int bytes;
if (length != 0) {
if (string == NULL) {
string = g_string_new_len(buf, length);
} else {
string = g_string_append_len(string, buf, length);
while (buf[i] != 0xF0 && i < length)
i++;
}
}
} while ((err != 0) && (stop == FALSE));
return string;
pos = i;
for (bytes = 0; (bytes<length-i) && (buf[i+bytes] != 0xF7); bytes++);
if (buf[i+bytes] == 0xF7) bytes++;
i += bytes;
if (string == NULL)
string = g_string_new_len((gchar*)&buf[pos], bytes);
else
g_string_append_len(string, (gchar*)&buf[pos], bytes);
if ((unsigned char)string->str[string->len-1] == 0xF7) {
/* push message on stack */
push_message(string);
string = NULL;
}
}
} while (*stop == FALSE);
if (string) {
g_string_free(string, TRUE);
string = NULL;
}
return NULL;
}
/**
@@ -268,40 +381,36 @@ void send_message(gint procedure, gchar *data, gint len)
g_string_free(msg, TRUE);
}
/**
* \param msg SysEx message
*
* Checks message ID.
*
* \return MessageID, or -1 on error.
**/
static MessageID get_message_id(GString *msg)
{
/** \todo check if msg is valid SysEx message */
g_return_val_if_fail(msg != NULL, -1);
if (msg->len > 7) {
return (unsigned char)msg->str[7];
}
return -1;
}
/**
* \param id MessageID of requested message
*
* Reads data from MIDI IN until message with matching id is found.
* Reads data from message queue until message with matching id is found.
*
* \return GString containing unpacked message.
**/
GString *get_message_by_id(MessageID id)
{
GString *data = NULL;
guint x, len;
gboolean found = FALSE;
g_mutex_lock(message_queue_mutex);
do {
if (data)
g_string_free(data, TRUE);
data = read_data();
} while (get_message_id(data) != id);
len = g_queue_get_length(message_queue);
for (x = 0; x<len; x++) {
data = g_queue_peek_nth(message_queue, x);
if (get_message_id(data) == id) {
found = TRUE;
g_queue_pop_nth(message_queue, x);
break;
}
}
if (found == FALSE)
g_cond_wait(message_queue_cond, message_queue_mutex);
} while (found == FALSE);
g_mutex_unlock(message_queue_mutex);
unpack_message(data);
@@ -341,6 +450,96 @@ void append_value(GString *msg, guint value)
}
}
/**
* \param str pointer to value to unpack
* \param len return location for how many bytes value is encoded on (length is added to current value)
*
* Unpacks value using scheme used on all newer DigiTech products.
*
* \return unpacked value
**/
guint unpack_value(gchar *str, int *len)
{
guint value;
gint tmp;
value = (unsigned char)str[0];
if (len != NULL)
*len += 1;
if (value > 0x80) {
tmp = value & 0x7F;
value = 0;
gint i;
for (i = 0; i<tmp; i++) {
value |= ((unsigned char)str[1+i] << (8*(tmp-i-1)));
}
if (len != NULL)
*len += tmp;
}
return value;
}
/**
* Allocates memory for SettingParam.
*
* \return SettingParam which must be freed using setting_param_free.
**/
SettingParam *setting_param_new()
{
SettingParam *param = g_slice_new(SettingParam);
param->id = -1;
param->position = -1;
param->value = -1;
return param;
}
/**
* \param str pointer to setting param in message
* \param len return location for how many bytes value is encoded on (length is added to current value)
*
* Creates SettingParam basing on data.
* This function expects str to point on:
* -Parameter ID - 2 bytes
* -Parameter position - 1 byte
* -Parameter value - var
*
* \return newly created SettingParam which must be freed using setting_param_free.
**/
SettingParam *setting_param_new_from_data(gchar *str, gint *len)
{
gint id;
gint position;
guint value;
id = ((unsigned char)str[0] << 8) | (unsigned char)str[1];
position = (unsigned char)str[2];
if (len != NULL)
*len += 3;
value = unpack_value(&str[3], len);
SettingParam *param = g_slice_new(SettingParam);
param->id = id;
param->position = position;
param->value = value;
return param;
}
/**
* \param param SettingParam to be freed
*
* Frees all memory used by SettingParam.
**/
void setting_param_free(SettingParam *param)
{
g_slice_free(SettingParam, param);
}
/**
* \param id Parameter ID
* \param position Parameter position
@@ -441,7 +640,7 @@ GStrv query_preset_names(gchar bank)
}
for (x=10; ((x<data->len) && (n<n_total)); x++) {
if (data->str[x] == 0xF7) /* every message ends with 0xF7 */
if ((unsigned char)data->str[x] == 0xF7) /* every message ends with 0xF7 */
break;
str_array[n] = g_strdup(&data->str[x]);
@@ -456,18 +655,69 @@ GStrv query_preset_names(gchar bank)
/**
* Queries current edit buffer.
*
* \return GString containing RECEIVE_PRESET_PARAMETERS SysEx message.
* \return GList with preset SysEx messages, which must be freed using preset_list_free.
**/
GString *get_current_preset()
GList *get_current_preset()
{
GString *data = NULL;
GList *list = NULL;
guint x, len;
gboolean found = FALSE;
gboolean done = FALSE;
send_message(REQUEST_PRESET, "\x04\x00", 3);
send_message(REQUEST_PRESET, "\x04\x00", 2);
/* read reply */
data = get_message_by_id(RECEIVE_PRESET_PARAMETERS);
g_mutex_lock(message_queue_mutex);
do {
len = g_queue_get_length(message_queue);
return data;
for (x = 0; x<len && (found == FALSE); x++) {
data = g_queue_peek_nth(message_queue, x);
if (get_message_id(data) == RECEIVE_PRESET_START) {
found = TRUE;
g_queue_pop_nth(message_queue, x);
unpack_message(data);
list = g_list_append(list, data);
break;
}
}
if (found == TRUE) {
int i;
int amt;
for (i = 10; (i < data->len) && data->str[i]; i++);
amt = (unsigned char)data->str[i+2];
while (amt) {
data = g_queue_pop_nth(message_queue, x);
if (data == NULL) {
g_cond_wait(message_queue_cond, message_queue_mutex);
} else {
unpack_message(data);
list = g_list_append(list, data);
amt--;
}
}
done = TRUE;
} else {
/* Receive Preset Start not found in message queue */
g_cond_wait(message_queue_cond, message_queue_mutex);
}
} while (done == FALSE);
g_mutex_unlock(message_queue_mutex);
return list;
}
void preset_list_free(GList *list)
{
g_return_if_fail(list != NULL);
g_list_foreach(list, (GFunc) message_free_func, NULL);
g_list_free(list);
}
/**
@@ -482,19 +732,16 @@ GString *get_current_preset()
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);
send_message(REQUEST_WHO_AM_I, "\x7F\x7F\x7F", 3);
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];
GString *data = get_message_by_id(RECEIVE_WHO_AM_I);
if ((data != NULL) && (data->len > 11)) {
*device_id = data->str[8];
*family_id = data->str[9];
*product_id = data->str[10];
g_string_free(data, TRUE);
return TRUE;
}
g_string_free(data, TRUE);
}
return FALSE;
}
@@ -538,7 +785,7 @@ static void request_device_configuration()
#ifndef DOXYGEN_SHOULD_SKIP_THIS
static GOptionEntry options[] = {
{"device", 'd', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_STRING, &device, "MIDI device port to use", NULL},
{"device", 'd', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_STRING, &device_port, "MIDI device port to use", NULL},
{NULL}
};
@@ -547,6 +794,12 @@ static GOptionEntry options[] = {
int main(int argc, char *argv[]) {
GError *error = NULL;
GOptionContext *context;
static gboolean stop_read_thread = FALSE;
GThread *read_thread = NULL;
g_thread_init(NULL);
gdk_threads_init();
context = g_option_context_new(NULL);
g_option_context_add_main_entries(context, options, NULL);
g_option_context_add_group(context, gtk_get_option_group(TRUE));
@@ -563,30 +816,63 @@ int main(int argc, char *argv[]) {
if (open_device() == TRUE) {
show_error_message(NULL, "Failed to open MIDI device");
} else {
message_queue = g_queue_new();
message_queue_mutex = g_mutex_new();
message_queue_cond = g_cond_new();
read_thread = g_thread_create((GThreadFunc)read_data_thread,
&stop_read_thread,
TRUE, NULL);
if (request_who_am_i(&device_id, &family_id, &product_id) == FALSE) {
show_error_message(NULL, "No suitable reply from device");
} else {
EffectList *list = NULL;
int n_list = -1;
Device *device = NULL;
if (get_effect_list(device_id, family_id, product_id, &list, &n_list) == FALSE) {
if (unsupported_device_dialog(&list, &n_list) == FALSE) {
if (get_device_info(device_id, family_id, product_id, &device) == FALSE) {
if (unsupported_device_dialog(&device) == FALSE) {
g_message("Shutting down");
}
}
if (list != NULL && n_list != -1) {
gui_create(list, n_list);
if (device != NULL) {
/* enable GUI mode */
set_option(GUI_MODE_ON_OFF, USB_POSITION, 1);
gui_create(device);
gtk_main();
gui_free();
/* disable GUI mode */
set_option(GUI_MODE_ON_OFF, USB_POSITION, 0);
}
}
}
if (output != NULL)
if (read_thread != NULL) {
stop_read_thread = TRUE;
g_thread_join(read_thread);
}
if (message_queue_mutex != NULL) {
g_mutex_free(message_queue_mutex);
}
if (message_queue != NULL) {
g_message("%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);
}
if (output != NULL) {
snd_rawmidi_drain(output);
snd_rawmidi_close(output);
if (input != NULL)
}
if (input != NULL) {
snd_rawmidi_drain(input);
snd_rawmidi_close(input);
}
return EXIT_SUCCESS;
}

519
gdigi.h
View File

@@ -22,7 +22,18 @@
#ifndef DOXYGEN_SHOULD_SKIP_THIS
#define GNX_CHANNEL_POSITION 7
#define GNX_CHANNEL_AMP 260
#define GNX_WARP 261
#define GNX_AMP_WARP 262
#define GNX_CABINET_WARP 263
#define GNX_CHANNEL_FS_MODE 264
enum {
GNX3K_WAH_TYPE_CRY = 129,
GNX3K_WAH_TYPE_BOUTIQUE = 130,
GNX3K_WAH_TYPE_FULLRANGE = 131,
WAH_TYPE_CRY = 132,
WAH_TYPE_FULLRANGE = 133,
WAH_TYPE_CLYDE = 134
@@ -45,10 +56,35 @@ enum {
COMP_TYPE_DYNA = 197
};
#define GNX3K_WHAM_TYPE 768
#define GNX3K_WHAM_ENABLE 769
#define GNX3K_WHAM_POSITION 5
#define GNX3K_DETUNE_AMOUNT 1670
#define GNX3K_PITCH_AMOUNT 1732
#define GNX3K_PITCH_LEVEL 1731
#define GNX3K_TALK_LEVEL 2818
enum {
GNX3K_WHAM_TYPE_WHAMMY = 1344,
GNX3K_WHAM_TYPE_IPS = 1345,
GNX3K_WHAM_TYPE_DETUNE = 1346,
GNX3K_WHAM_TYPE_PITCH = 1347,
GNX3K_WHAM_TYPE_TALK1 = 1348,
GNX3K_WHAM_TYPE_TALK2 = 1349,
GNX3K_WHAM_TYPE_TALK3 = 1350,
GNX3K_WHAM_TYPE_TALK4 = 1351,
GNX3K_WHAM_TYPE_TALK5 = 1352
};
#define COMP_TYPE 207
#define COMP_ON_OFF 193
#define COMP_POSITION 4
#define GNX3K_COMP_ATTACK 194
#define GNX3K_COMP_RATIO 195
#define GNX3K_COMP_THRESHOLD 200
#define GNX3K_COMP_GAIN 201
#define COMP_SUSTAIN 208
#define COMP_TONE 209
#define COMP_ATTACK 211
@@ -221,7 +257,17 @@ enum {
AMP_TYPE_MOSH = 384,
AMP_TYPE_ACOUSTIC = 341,
AMP_TYPE_JUMBO_ACOUSTIC = 340,
AMP_TYPE_DIRECT = 306
AMP_TYPE_DIRECT = 306,
AMP_TYPE_SVT_ROCK_BASS = 342,
AMP_TYPE_SVT_CLASSIC_BASS = 343,
AMP_TYPE_PEG_B15_BASS = 344,
AMP_TYPE_BASIC_BASS = 345,
AMP_TYPE_SHOWMAN_BASS = 346,
AMP_TYPE_ASH_MODERN_BASS = 347,
AMP_TYPE_BRIT_BASS = 348,
AMP_TYPE_SOLAR_BASS = 349,
AMP_TYPE_BOOGIE_BASS = 350,
AMP_TYPE_HART_BASS = 351,
};
enum {
@@ -234,43 +280,90 @@ enum {
#define AMP_TYPE 2496
#define AMP_ON_OFF 265
#define AMP_POSITION 8
#define CH2_AMP_POSITION 10
#define AMP_GAIN 2497
#define AMP_LEVEL 2498
#define AMP_BASS_FREQ 2499
#define AMP_BASS_LEVEL 2500
#define AMP_MID_FREQ 2501
#define AMP_MID_LEVEL 2502
#define AMP_TREBLE_FREQ 2503
#define AMP_TREBLE_LEVEL 2504
#define AMP_EQ_ON_OFF 2505
#define AMP_PRESENCE 2506
#define AMP_BASS 2507
#define AMP_MID 2508
#define AMP_TREBLE 2509
#define AMP_CAB_TYPE 2560
#define AMP_CAB_TUNING 2561
#define AMP_CAB_POSITION 9
#define CH2_AMP_CAB_POSITION 11
/* valid AMP_CAB_TYPE values */
#define AMP_CAB_DIRECT 570
#define AMP_CAB_CHAMP 571
#define AMP_CAB_DELUXE 572
#define AMP_CAB_DELUXE_REVERB 573
#define AMP_CAB_BRITISH1_12 623
#define AMP_CAB_GA1_12 624
#define AMP_CAB_BLONDE2_12 577
#define AMP_CAB_TWIN 576
#define AMP_CAB_BRITISH2_12 613
#define AMP_CAB_JAZZ2_12 626
#define AMP_CAB_BASSMAN 579
#define AMP_CAB_BRITISH4_12 614
#define AMP_CAB_BRITISH_GREEN 616
#define AMP_CAB_FANE4_12 584
#define AMP_CAB_BOUTIQUE4_12 583
#define AMP_CAB_VINTAGE 622
#define AMP_CAB_RECTO4_12 625
#define AMP_CAB_DIGI_SOLO 609
#define AMP_CAB_DIGI_BRIGHT 611
#define AMP_CAB_DIGI_METAL 618
#define AMP_CAB_DIGI_ROCK 619
#define AMP_CAB_DIGI_ALT 620
#define AMP_CAB_DIGI_VNTG 621
#define AMP_CAB_DIGI_CHUNK 612
#define AMP_CAB_DIGI_SPANK2_12 608
#define AMP_CAB_DIGI_SPKR_COMP 585
enum {
AMP_CAB_DIRECT = 570,
AMP_CAB_CHAMP = 571,
AMP_CAB_DELUXE = 572,
AMP_CAB_DELUXE_REVERB = 573,
AMP_CAB_BRITISH1_12 = 623,
AMP_CAB_GA1_12 = 624,
AMP_CAB_BLONDE2_12 = 577,
AMP_CAB_TWIN = 576,
AMP_CAB_BRITISH2_12 = 613,
AMP_CAB_JAZZ2_12 = 626,
AMP_CAB_BASSMAN = 579,
AMP_CAB_BRITISH4_12 = 614,
AMP_CAB_BRITISH_GREEN = 616,
AMP_CAB_FANE4_12 = 584,
AMP_CAB_BOUTIQUE4_12 = 583,
AMP_CAB_VINTAGE = 622,
AMP_CAB_RECTO4_12 = 625,
AMP_CAB_DIGI_SOLO = 609,
AMP_CAB_DIGI_BRIGHT = 611,
AMP_CAB_DIGI_METAL = 618,
AMP_CAB_DIGI_ROCK = 619,
AMP_CAB_DIGI_ALT = 620,
AMP_CAB_DIGI_VNTG = 621,
AMP_CAB_DIGI_CHUNK = 612,
AMP_CAB_DIGI_SPANK2_12 = 608,
AMP_CAB_DIGI_SPKR_COMP = 585
};
enum {
GNX_AMP_CAB_DIRECT = 570,
GNX_AMP_CAB_TWEED1_8 = 571,
GNX_AMP_CAB_TWEED1_12 = 572,
GNX_AMP_CAB_BLACKFACE1_12 = 573,
GNX_AMP_CAB_BRITISH1_12 = 574,
GNX_AMP_CAB_BLACKFACE2_12 = 576,
GNX_AMP_CAB_BLONDE2_12 = 577,
GNX_AMP_CAB_BRITISH2_12 = 578,
GNX_AMP_CAB_TWEED4_10 = 579,
GNX_AMP_CAB_BRITISH_70_4_12 = 580,
GNX_AMP_CAB_BRITISH_GREEN4_12 = 581,
GNX_AMP_CAB_STRAIGHT_V30_4_12 = 582,
GNX_AMP_CAB_SLANT_V30_4_12 = 583,
GNX_AMP_CAB_FANE4_12 = 584,
GNX_AMP_CAB_2101_SPKR_COMP = 585,
GNX_AMP_CAB_JUMBO_ACOUSTIC = 606,
GNX_AMP_CAB_DREAD_ACOUSTIC = 607,
GNX_AMP_CAB_DIGI_SPANK = 608,
GNX_AMP_CAB_DIGI_SOLO = 609,
GNX_AMP_CAB_DIGI_METAL = 610,
GNX_AMP_CAB_DIGI_BRIGHT = 611,
GNX_AMP_CAB_DIGI_CHUNK = 612,
GNX_AMP_CAB_HART_BASS1_15 = 586,
GNX_AMP_CAB_BASIC_BASS1_15 = 587,
GNX_AMP_CAB_PORTA_BASS1_15 = 588,
GNX_AMP_CAB_REFLEX1_18 = 589,
GNX_AMP_CAB_SOLAR_BASS2_15 = 590,
GNX_AMP_CAB_DE_BASS4_10 = 591,
GNX_AMP_CAB_ASH_BASS4_10 = 592,
GNX_AMP_CAB_GOLIATH_BASS4_10 = 593,
GNX_AMP_CAB_HART_BASS4_10 = 594,
GNX_AMP_CAB_SVT_BASS8_10 = 595,
};
#define EQ_TYPE 3202
#define EQ_ON_OFF 3212
@@ -300,6 +393,8 @@ enum {
#define NOISEGATE_ON_OFF 705
#define NOISEGATE_POSITION 12
#define GNX3K_GATE_ATTACK 706
/* available only in Gate mode */
#define NOISEGATE_GATE_TRESHOLD 710
/* available only in Swell mode */
@@ -309,6 +404,25 @@ enum {
#define NOISEGATE_RELEASE 713
#define NOISEGATE_ATTN 714
enum {
GNX3K_MOD_TYPE_CHORUS = 857,
GNX3K_MOD_TYPE_FLANGER = 858,
GNX3K_MOD_TYPE_TRIGFLANGER = 859,
GNX3K_MOD_TYPE_PHASER = 860,
GNX3K_MOD_TYPE_TRIGPHASER = 861,
GNX3K_MOD_TYPE_TREMOLO = 862,
GNX3K_MOD_TYPE_PANNER = 863,
GNX3K_MOD_TYPE_VIBRATO = 864,
GNX3K_MOD_TYPE_ROTARY = 865,
GNX3K_MOD_TYPE_AUTOYA = 866,
GNX3K_MOD_TYPE_YAYA = 867,
GNX3K_MOD_TYPE_SYNTHTALK = 868,
GNX3K_MOD_TYPE_ENVELOPE = 869,
GNX3K_MOD_TYPE_DETUNE = 870,
GNX3K_MOD_TYPE_PITCH = 871,
GNX3K_MOD_TYPE_UNOVIBE = 880,
};
enum {
CHORUS_TYPE_CE = 0x37B,
CHORUS_TYPE_TC = 0x37C,
@@ -351,36 +465,31 @@ enum {
#define CHORUSFX_ON_OFF 769
#define CHORUSFX_POSITION 14
#define CE_CHORUS_SPEED 837
#define CE_CHORUS_DEPTH 838
#define CHORUS_SPEED 837
#define CHORUS_DEPTH 838
#define CHORUS_PREDELAY 839
#define CHORUS_WIDTH 848
#define CHORUS_INTENSITY 849
#define DUAL_CHORUS_SPEED 837
#define DUAL_CHORUS_DEPTH 838
#define DUAL_CHORUS_LEVEL 836
#define DUAL_CHORUS_WAVE 840
#define MULTI_CHORUS_SPEED 837
#define MULTI_CHORUS_DEPTH 838
#define MULTI_CHORUS_WAVE 840
#define MULTI_CHORUS_LEVEL 836
#define CHORUS_LEVEL 836
#define CHORUS_WAVE 840
#define CHORUS_BALANCE 841
#define FLANGER_SPEED 902
#define FLANGER_DEPTH 903
#define FLANGER_REGEN 904
#define FLANGER_LEVEL 901
#define FLANGER_WAVE 905
#define FLANGER_BALANCE 906
#define TRIG_FLANGER_SPEED 1030
#define TRIG_FLANGER_SENS 1031
#define TRIG_FLANGER_LFO_START 1028
#define TRIG_FLANGER_MIX 1029
#define TRIG_FLANGER_LEVEL 1032
#define MXR_FLANGER_SPEED 902
#define MXR_FLANGER_WIDTH 914
#define MXR_FLANGER_REGEN 904
#define MXR_FLANGER_MANUAL 917
#define EH_FLANGER_RATE 918
@@ -395,10 +504,12 @@ enum {
#define PHASER_REGEN 966
#define PHASER_LEVEL 965
#define PHASER_WAVE 967
#define PHASER_BALANCE 968
#define TRIG_PHASER_SPEED 1094
#define TRIG_PHASER_SENS 1095
#define TRIG_PHASER_LFO_START 1092
#define TRIG_PHASER_MIX 1093
#define TRIG_PHASER_LEVEL 1096
#define MX_PHASER_INTENSITY 976
@@ -408,11 +519,14 @@ enum {
#define VIBRATO_SPEED 1284
#define VIBRATO_DEPTH 1285
#define VIBRATO_WAVEFORM 1286
#define ROTARY_SPEED 1346
#define ROTARY_INTENSITY 1348
#define ROTARY_MIX 1349
#define ROTARY_DOPPLER 1350
#define ROTARY_CROSSOVER 1351
#define ROTARY_BALANCE 1352
#define VIBROPAN_SPEED 1314
#define VIBROPAN_DEPTH 1315
@@ -432,19 +546,30 @@ enum {
#define PANNER_DEPTH 1219
#define PANNER_WAVE 1221
#define ENVELOPE_MIX 1604
#define ENVELOPE_SENSITIVITY 1606
#define ENVELOPE_RANGE 1605
#define ENVELOPE_BALANCE 1607
#define ENVELOPE_BLEND 1608
#define GNX3K_AUTOYA_RANGE 1476
#define AUTOYA_MIX 1477
#define AUTOYA_SPEED 1478
#define AUTOYA_DEPTH 1479
#define AUTOYA_BALANCE 1481
#define AUTOYA_INTENSITY 1482
#define AUTOYA_RANGE 1483
#define YAYA_PEDAL 1410
#define GNX3K_YAYA_RANGE 1412
#define YAYA_MIX 1413
#define YAYA_DEPTH 1414
#define YAYA_BALANCE 1416
#define YAYA_INTENSITY 1417
#define YAYA_RANGE 1418
#define SYNTH_TALK_ATTACK 1542
#define GNX3K_SYNTH_TALK_RELEASE 1543
#define SYNTH_TALK_RELEASE 1547
#define SYNTH_TALK_SENS 1544
#define SYNTH_TALK_VOX 1540
@@ -461,10 +586,12 @@ enum {
#define WHAMMY_MIX 1796
#define PITCH_AMOUNT 1730
#define PITCH_BALANCE 1733
#define PITCH_MIX 1745
#define DETUNE_AMOUNT 1668
#define DETUNE_LEVEL 1667
#define DETUNE_AMOUNT 1668
#define DETUNE_BALANCE 1669
#define IPS_SHIFT_AMOUNT 2754
#define IPS_KEY 2756
@@ -475,68 +602,6 @@ enum {
#define OCTAVER_OCTAVE2 1747
#define OCTAVER_DRY_LEVEL 1748
/* DUAL_CHORUS_WAVE, MULTI_CHORUS_WAVE, FLANGER_WAVE, PHASER_WAVE,
VIBROPAN_WAVE, TREMOLO_WAVE, PANNER_WAVE valid values */
#define WAVE_TRI 0x00
#define WAVE_SINE 0x01
#define WAVE_SQUARE 0x02
/* WHAMMY_AMOUNT valid values */
#define WHAMMY_OCT_UP 0x00
#define WHAMMY_2OCT_UP 0x01
#define WHAMMY_2ND_DN 0x02
#define WHAMMY_RV_2ND 0x03
#define WHAMMY_4TH_DN 0x04
#define WHAMMY_OCT_DN 0x05
#define WHAMMY_2OCT_DN 0x06
#define WHAMMY_DIV_BMB 0x07
#define WHAMMY_M3_MA 0x08
#define WHAMMY_2ND_MA3 0x09
#define WHAMMY_3RD_4TH 0x0A
#define WHAMMY_4TH_5TH 0x0B
#define WHAMMY_5TH_OCT 0x0C
#define WHAMMY_HOCT_UP 0x0D
#define WHAMMY_HOCT_DN 0x0E
#define WHAMMY_OCT_UD 0x0F
/* IPS_SHIFT_AMOUNT valid values */
#define IPS_OCT_D 0x00
#define IPS_7TH_DN 0x01
#define IPS_6TH_DN 0x02
#define IPS_5TH_DN 0x03
#define IPS_4TH_DN 0x04
#define IPS_3RD_DN 0x05
#define IPS_2ND_DN 0x06
#define IPS_2ND_UP 0x07
#define IPS_3RD_UP 0x08
#define IPS_4TH_UP 0x09
#define IPS_5TH_UP 0x0A
#define IPS_6TH_UP 0x0B
#define IPS_7TH_UP 0x0C
#define IPS_OCT_U 0x0D
/* IPS_KEY valid values */
#define IPS_E 0x00
#define IPS_F 0x01
#define IPS_GB 0x02
#define IPS_G 0x03
#define IPS_AB 0x04
#define IPS_A 0x05
#define IPS_BB 0x06
#define IPS_B 0x07
#define IPS_C 0x08
#define IPS_DB 0x09
#define IPS_D 0x0A
#define IPS_EB 0x0B
/* IPS_SCALE valid values */
#define IPS_MAJOR 0x00
#define IPS_MINOR 0x01
#define IPS_DORIA 0x02
#define IPS_MIXLYD 0x03
#define IPS_LYDIAN 0x04
#define IPS_HMINO 0x05
enum {
DELAY_TYPE_ANALOG = 1046,
DELAY_TYPE_DIGITAL = 1045,
@@ -552,6 +617,12 @@ enum {
DELAY_RP500_TYPE_PONG = 1055,
DELAY_RP500_TYPE_REVERSE = 1064,
DELAY_RP500_TYPE_TAPE = 1056,
DELAY_GNX3K_TYPE_MONO = 1027,
DELAY_GNX3K_TYPE_PINGPONG = 1028,
DELAY_GNX3K_TYPE_ANALOG = 1029,
DELAY_GNX3K_TYPE_ANAPONG = 1030,
DELAY_GNX3K_TYPE_SPREAD = 1031,
};
#define DELAY_TYPE 1856
@@ -560,27 +631,8 @@ enum {
#define DELAY_TIME 1888
#define ANALOG_LEVEL 1860
#define ANALOG_REPEATS 1863
#define DIGITAL_LEVEL 1860
#define DIGITAL_REPEATS 1863
#define DIGITAL_DUCKER_THRESH 1889
#define DIGITAL_DUCKER_LEVEL 1890
#define MODULATED_LEVEL 1860
#define MODULATED_REPEATS 1863
#define MODULATED_DEPTH 1873
#define PONG_LEVEL 1860
#define PONG_REPEATS 1863
#define PONG_DUCKER_THRESH 1889
#define PONG_DUCKER_LEVEL 1890
#define TAPE_LEVEL 1860
#define TAPE_REPEATS 1863
#define TAPE_WOW 1891
#define TAPE_FLUTTER 1892
#define DELAY_TAPE_WOW 1891
#define DELAY_TAPE_FLUTTER 1892
#define DELAY_LEVEL 1860
#define DELAY_REPEATS 1863
@@ -598,7 +650,25 @@ enum {
#define DELAY_MIX 1902
#define DELAY_TIME_0_4650 1901
#define GNX3K_DELAY_TIME 1862
#define GNX3K_DELAY_FEEDBACK 1863
#define GNX3K_DELAY_DUCK_THRESH 1864
#define GNX3K_DELAY_DUCK_ATTEN 1865
#define GNX3K_DELAY_BALANCE 1866
#define GNX3K_DELAY_SPREAD 1867
enum {
GNX3K_REVERB_TYPE_STUDIO = 1107,
GNX3K_REVERB_TYPE_ROOM = 1108,
GNX3K_REVERB_TYPE_CLUB = 1109,
GNX3K_REVERB_TYPE_PLATE = 1110,
GNX3K_REVERB_TYPE_HALL = 1111,
GNX3K_REVERB_TYPE_AMPHITHEATER = 1112,
GNX3K_REVERB_TYPE_CHURCH = 1113,
GNX3K_REVERB_TYPE_GARAGE = 1114,
GNX3K_REVERB_TYPE_ARENA = 1115,
GNX3K_REVERB_TYPE_SPRING = 1116,
REVERB_TYPE_TWIN = 1146,
REVERB_TYPE_LEX_AMBIENCE = 1150,
REVERB_TYPE_LEX_STUDIO = 1149,
@@ -611,32 +681,12 @@ enum {
#define REVERB_ON_OFF 1921
#define REVERB_POSITION 16
#define TWIN_REVERB 1925
#define LEX_AMBIENCE_PREDELAY 1922
#define LEX_AMBIENCE_DECAY 1927
#define LEX_AMBIENCE_LIVELINESS 1933
#define LEX_AMBIENCE_LEVEL 1925
#define LEX_STUDIO_PREDELAY 1922
#define LEX_STUDIO_DECAY 1927
#define LEX_STUDIO_LIVELINESS 1933
#define LEX_STUDIO_LEVEL 1925
#define LEX_ROOM_PREDELAY 1922
#define LEX_ROOM_DECAY 1927
#define LEX_ROOM_LIVELINESS 1933
#define LEX_ROOM_LEVEL 1925
#define LEX_HALL_PREDELAY 1922
#define LEX_HALL_DECAY 1927
#define LEX_HALL_LIVELINESS 1933
#define LEX_HALL_LEVEL 1925
#define EMT240_PLATE_PREDELAY 1922
#define EMT240_PLATE_DECAY 1927
#define EMT240_PLATE_LIVELINESS 1933
#define EMT240_PLATE_LEVEL 1925
#define REVERB_PREDELAY 1922
#define REVERB_DAMPING 1924
#define REVERB_DECAY 1927
#define REVERB_BALANCE 1928
#define REVERB_LIVELINESS 1933
#define REVERB_LEVEL 1925
#define EXP_TYPE 8194
#define EXP_POSITION 19
@@ -646,81 +696,88 @@ enum {
#define LIBRARY_TONE 8704
#define LIBRARY_EFFECTS 8705
#define EFFECTS_LEVEL 8706
#define LIBRARY_POSITION 25
/* LIBRARY_TONE valid options */
#define TONE_LIB_OVERDRIVE 1793
#define TONE_LIB_ROCK1 1794
#define TONE_LIB_ROCK2 1795
#define TONE_LIB_BLUES1 1796
#define TONE_LIB_BLUES2 1797
#define TONE_LIB_METAL1 1798
#define TONE_LIB_METAL2 1799
#define TONE_LIB_COUNTRY1 1800
#define TONE_LIB_COUNTRY2 1801
#define TONE_LIB_WARM_DRIVE 1802
#define TONE_LIB_CRUNCH 1803
#define TONE_LIB_TEXAS_TONE 1804
#define TONE_LIB_ROCKABILLY 1805
#define TONE_LIB_SOLO1 1806
#define TONE_LIB_SOLO2 1807
#define TONE_LIB_ROCKWAH 1808
#define TONE_LIB_CHUNKY 1809
#define TONE_LIB_SMOOTH 1810
#define TONE_LIB_HEAVY 1811
#define TONE_LIB_CLEAN1 1812
#define TONE_LIB_CLEAN2 1813
#define TONE_LIB_BRITISH1 1814
#define TONE_LIB_BRITISH2 1815
#define TONE_LIB_AMERICAN1 1816
#define TONE_LIB_AMERICAN2 1817
#define TONE_LIB_TUBE_DRIVE 1818
#define TONE_LIB_DISTORTION 1819
#define TONE_LIB_SCOOPED 1820
#define TONE_LIB_PUNCHY 1821
#define TONE_LIB_BRIGHT_CLEAN 1822
/* setting LIBRARY_TONE to this option seems to crash device */
#define TONE_LIB_CUSTOM 1792
enum {
TONE_LIB_OVERDRIVE = 1793,
TONE_LIB_ROCK1 = 1794,
TONE_LIB_ROCK2 = 1795,
TONE_LIB_BLUES1 = 1796,
TONE_LIB_BLUES2 = 1797,
TONE_LIB_METAL1 = 1798,
TONE_LIB_METAL2 = 1799,
TONE_LIB_COUNTRY1 = 1800,
TONE_LIB_COUNTRY2 = 1801,
TONE_LIB_WARM_DRIVE = 1802,
TONE_LIB_CRUNCH = 1803,
TONE_LIB_TEXAS_TONE = 1804,
TONE_LIB_ROCKABILLY = 1805,
TONE_LIB_SOLO1 = 1806,
TONE_LIB_SOLO2 = 1807,
TONE_LIB_ROCKWAH = 1808,
TONE_LIB_CHUNKY = 1809,
TONE_LIB_SMOOTH = 1810,
TONE_LIB_HEAVY = 1811,
TONE_LIB_CLEAN1 = 1812,
TONE_LIB_CLEAN2 = 1813,
TONE_LIB_BRITISH1 = 1814,
TONE_LIB_BRITISH2 = 1815,
TONE_LIB_AMERICAN1 = 1816,
TONE_LIB_AMERICAN2 = 1817,
TONE_LIB_TUBE_DRIVE = 1818,
TONE_LIB_DISTORTION = 1819,
TONE_LIB_SCOOPED = 1820,
TONE_LIB_PUNCHY = 1821,
TONE_LIB_BRIGHT_CLEAN = 1822,
/* setting LIBRARY_TONE to this option seems to crash device */
TONE_LIB_CUSTOM = 1792
};
enum {
EFFECTS_LIB_CHORUS = 1857,
EFFECTS_LIB_PHASER = 1858,
EFFECTS_LIB_FLANGER = 1859,
EFFECTS_LIB_PITCH = 1860,
EFFECTS_LIB_TREMOLO = 1861,
EFFECTS_LIB_ROTARY = 1862,
EFFECTS_LIB_ENVELOPE = 1863,
EFFECTS_LIB_DIGITAL = 1864,
EFFECTS_LIB_ANALOG = 1865,
EFFECTS_LIB_PONG = 1866,
EFFECTS_LIB_MOD = 1867,
EFFECTS_LIB_TAPE = 1868,
EFFECTS_LIB_HALL = 1869,
EFFECTS_LIB_PLATE = 1870,
EFFECTS_LIB_SPRING = 1871,
EFFECTS_LIB_CHORUS_DIGITAL = 1872,
EFFECTS_LIB_CHORUS_DELAY_REVERB = 1873,
EFFECTS_LIB_FLANGER_ANALOG = 1874,
EFFECTS_LIB_PHASER_TAPE = 1875,
EFFECTS_LIB_PHASER_MOD = 1876,
EFFECTS_LIB_PHASER_ROOM = 1877,
EFFECTS_LIB_DIGITAL_HALL = 1878,
EFFECTS_LIB_ANALOG_SPRING = 1879,
EFFECTS_LIB_CHORUS_HALL = 1880,
EFFECTS_LIB_PONG_HALL = 1881,
EFFECTS_LIB_TAPE_SPRING = 1882,
EFFECTS_LIB_TREMOLO_TAPE = 1883,
EFFECTS_LIB_PITCH_DIGITAL = 1884,
EFFECTS_LIB_MOD_PLATE = 1885,
EFFECTS_LIB_ROTARY_TAPE = 1886,
/* LIBRARY_EFFECTS valid options */
#define EFFECTS_LIB_CHORUS 1857
#define EFFECTS_LIB_PHASER 1858
#define EFFECTS_LIB_FLANGER 1859
#define EFFECTS_LIB_PITCH 1860
#define EFFECTS_LIB_TREMOLO 1861
#define EFFECTS_LIB_ROTARY 1862
#define EFFECTS_LIB_ENVELOPE 1863
#define EFFECTS_LIB_DIGITAL 1864
#define EFFECTS_LIB_ANALOG 1865
#define EFFECTS_LIB_PONG 1866
#define EFFECTS_LIB_MOD 1867
#define EFFECTS_LIB_TAPE 1868
#define EFFECTS_LIB_HALL 1869
#define EFFECTS_LIB_PLATE 1870
#define EFFECTS_LIB_SPRING 1871
#define EFFECTS_LIB_CHORUS_DIGITAL 1872
#define EFFECTS_LIB_CHORUS_DELAY_REVERB 1873
#define EFFECTS_LIB_FLANGER_ANALOG 1874
#define EFFECTS_LIB_PHASER_TAPE 1875
#define EFFECTS_LIB_PHASER_MOD 1876
#define EFFECTS_LIB_PHASER_ROOM 1877
#define EFFECTS_LIB_DIGITAL_HALL 1878
#define EFFECTS_LIB_ANALOG_SPRING 1879
#define EFFECTS_LIB_CHORUS_HALL 1880
#define EFFECTS_LIB_PONG_HALL 1881
#define EFFECTS_LIB_TAPE_SPRING 1882
#define EFFECTS_LIB_TREMOLO_TAPE 1883
#define EFFECTS_LIB_PITCH_DIGITAL 1884
#define EFFECTS_LIB_MOD_PLATE 1885
#define EFFECTS_LIB_ROTARY_TAPE 1886
/* setting EFFECTS_LIBRARY to this option seems to crash device */
#define EFFECTS_LIB_CUSTOM 1856
EFFECTS_LIB_CUSTOM = 1856
};
#define USB_POSITION 0
#define USB_AUDIO_PLAYBACK_MIX 12297
#define USB_AUDIO_LEVEL 12307
#define GUI_MODE_ON_OFF 12298
#endif /* DOXYGEN_SHOULD_SKIP_THIS */
typedef enum {
@@ -737,6 +794,23 @@ typedef enum {
PRESETS_EXTERNAL = 6
} PresetBank;
typedef enum {
/* Version 0 only */
NOTIFY_PRESET_LOADED = 0,
NOTIFY_PRESET_STORED = 1,
NOTIFY_MODIFIER_GROUP_CHANGED = 2,
/* Version 1 */
NOTIFY_PRESET_MOVED = 3,
NOTIFY_OBJECT_MOVED = 4,
NOTIFY_OBJECT_RENAMED = 5,
NOTIFY_MEDIA_CARD_PRESENT_CHANGED = 6,
NOTIFY_ALL_GLOBALS_CHANGED = 7,
NOTIFY_PRESET_INDEX_TABLE_CHANGED = 8,
NOTIFY_PRESET_RENAMED = 9
} NotifyCode;
typedef enum {
REQUEST_WHO_AM_I = 0x01,
RECEIVE_WHO_AM_I = 0x02,
@@ -791,14 +865,25 @@ typedef enum {
NACK = 0x7F
} MessageID;
typedef struct {
int id;
int position;
int value;
} SettingParam;
void send_message(gint procedure, gchar *data, gint len);
MessageID get_message_id(GString *msg);
void append_value(GString *msg, guint value);
GString *get_message_by_id(MessageID id);
SettingParam *setting_param_new();
SettingParam *setting_param_new_from_data(gchar *str, gint *len);
void setting_param_free(SettingParam *param);
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(gchar bank);
GString *get_current_preset();
GList *get_current_preset();
void preset_list_free(GList *list);
#endif /* GDIGI_H */

234
gui.c
View File

@@ -24,18 +24,16 @@
typedef struct {
GtkObject *widget;
gint id;
gint position;
/* used for combo boxes, if widget isn't combo box, then both value and x are -1 */
gint value; /**< effect type value */
gint x; /**< combo box item number */
} WidgetListElem;
} WidgetTreeElem;
#ifndef DOXYGEN_SHOULD_SKIP_THIS
static GtkKnobAnim *knob_anim = NULL; /* animation used by knobs */
#endif /* DOXYGEN_SHOULD_SKIP_THIS */
static GList *widget_list = NULL; /**< this list contains WidgetListElem data elements */
static GTree *widget_tree = NULL; /**< this tree contains lists containing WidgetTreeElem data elements */
static gboolean allow_send = FALSE; /**< if FALSE GUI parameter changes won't be sent to device */
/**
@@ -106,37 +104,51 @@ void toggled_cb(GtkToggleButton *button, Effect *effect)
}
/**
* \param widget GtkObject to add to widget list
* \param widget GtkObject to add to widget tree
* \param id object controlled ID
* \param position object controlled position
* \param value effect value type (if widget is GtkComboBox, otherwise -1)
* \param x combo box item number (if widget is GtkComboBox, otherwise -1)
*
* Adds widget to widget list.
* Adds widget to widget tree.
**/
static void widget_list_add(GtkObject *widget, gint id, gint position, gint value, gint x)
static WidgetTreeElem *widget_tree_add(GtkObject *widget, gint id, gint position, gint value, gint x)
{
WidgetListElem *el;
GList *list;
WidgetTreeElem *el;
gpointer key;
el = g_slice_new(WidgetListElem);
el = g_slice_new(WidgetTreeElem);
el->widget = widget;
el->id = id;
el->position = position;
el->value = value;
el->x = x;
widget_list = g_list_prepend(widget_list, el);
key = GINT_TO_POINTER((position << 16) | id);
list = g_tree_lookup(widget_tree, key);
if (list == NULL) {
list = g_list_append(list, el);
g_tree_insert(widget_tree, key, list);
} else {
list = g_list_append(list, el);
/* replace the list pointer */
g_tree_steal(widget_tree, key);
g_tree_insert(widget_tree, key, list);
}
return el;
}
/**
* \param el widget list element
* \param el widget tree element
* \param param parameter to set
*
* Sets widget list element value to param value.
* Sets widget tree element value to param value.
**/
static void apply_widget_setting(WidgetListElem *el, SettingParam *param)
static void apply_widget_setting(WidgetTreeElem *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);
@@ -147,6 +159,22 @@ static void apply_widget_setting(WidgetListElem *el, SettingParam *param)
gtk_combo_box_set_active(GTK_COMBO_BOX(el->widget), el->x);
}
}
/**
* \param param SettingParam to apply to GUI
*
* Applies SettingParam to GUI
**/
void apply_setting_param_to_gui(SettingParam *param)
{
gpointer key;
g_return_if_fail(param != NULL);
allow_send = FALSE;
key = GINT_TO_POINTER((param->position << 16) | param->id);
GList *list = g_tree_lookup(widget_tree, key);
g_list_foreach(list, (GFunc)apply_widget_setting, param);
allow_send = TRUE;
}
/**
@@ -157,17 +185,22 @@ static void apply_widget_setting(WidgetListElem *el, SettingParam *param)
static void apply_preset_to_gui(Preset *preset)
{
g_return_if_fail(preset != NULL);
g_return_if_fail(widget_list != NULL);
g_return_if_fail(widget_tree != NULL);
allow_send = FALSE;
GList *iter = preset->params;
while (iter) {
gpointer key;
SettingParam *param = iter->data;
iter = iter->next;
if (param != NULL)
g_list_foreach(widget_list, (GFunc)apply_widget_setting, param);
if (param != NULL) {
key = GINT_TO_POINTER((param->position << 16) | param->id);
GList *list = g_tree_lookup(widget_tree, key);
g_list_foreach(list, (GFunc)apply_widget_setting, param);
}
}
allow_send = TRUE;
@@ -178,27 +211,40 @@ static void apply_preset_to_gui(Preset *preset)
**/
static void apply_current_preset()
{
GString *msg = get_current_preset();
Preset *preset = create_preset_from_data(msg);
g_string_free(msg, TRUE);
GList *list = get_current_preset();
Preset *preset = create_preset_from_data(list);
preset_list_free(list);
apply_preset_to_gui(preset);
preset_free(preset);
}
gboolean apply_current_preset_to_gui(gpointer data)
{
apply_current_preset();
return FALSE;
}
/**
* \param settings effect parameters
* \param amt amount of effect parameters
* \param widget_table hash table matching settings pointer with created table (may be NULL)
*
* Creates knobs that allow user to set effect parameters.
*
* \return GtkTable containing necessary widgets to set effect parameters.
**/
GtkWidget *create_table(EffectSettings *settings, gint amt)
GtkWidget *create_table(EffectSettings *settings, gint amt, GHashTable *widget_table)
{
GtkWidget *table, *label, *widget, *knob;
GtkObject *adj;
int x;
if (widget_table != NULL) {
table = g_hash_table_lookup(widget_table, settings);
if (table != NULL)
return table;
}
table = gtk_table_new(3, amt, FALSE);
for (x = 0; x<amt; x++) {
@@ -218,12 +264,16 @@ GtkWidget *create_table(EffectSettings *settings, gint amt)
g_object_set_data(G_OBJECT(adj), "label", widget);
}
widget_list_add(adj, settings[x].id, settings[x].position, -1, -1);
widget_tree_add(adj, settings[x].id, settings[x].position, -1, -1);
gtk_table_attach(GTK_TABLE(table), label, 0, 1, x, x+1, GTK_SHRINK, GTK_SHRINK, 2, 2);
gtk_table_attach(GTK_TABLE(table), knob, 1, 2, x, x+1, GTK_SHRINK, GTK_SHRINK, 2, 2);
gtk_table_attach(GTK_TABLE(table), widget, 2, 3, x, x+1, GTK_SHRINK, GTK_SHRINK, 2, 2);
g_signal_connect(G_OBJECT(adj), "value-changed", G_CALLBACK(value_changed_option_cb), &settings[x]);
if (widget_table != NULL) {
g_hash_table_insert(widget_table, settings, table);
}
}
return table;
@@ -245,7 +295,7 @@ GtkWidget *create_on_off_button(Effect *effect)
button = gtk_check_button_new_with_label(effect->label);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE);
g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(toggled_cb), effect);
widget_list_add(GTK_OBJECT(button), effect->id, effect->position, -1, -1);
widget_tree_add(GTK_OBJECT(button), effect->id, effect->position, -1, -1);
return button;
}
@@ -300,6 +350,10 @@ void combo_box_changed_cb(GtkComboBox *widget, gpointer data)
set_option(settings->id, settings->position, settings->type);
child = g_object_get_data(G_OBJECT(widget), "active_child");
if (child == settings->child) {
return;
}
if (child != NULL) {
gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(gtk_widget_get_parent(vbox))), child);
}
@@ -315,16 +369,19 @@ void combo_box_changed_cb(GtkComboBox *widget, gpointer data)
/**
* \param group Effect type groups
* \param amt amount of effect groups
* \param id ID to set effect type
* \param position position
*
* Creates widget allowing user to choose effect type.
*
* \return widget that allow user to set effect type.
**/
GtkWidget *create_widget_container(EffectGroup *group, gint amt)
GtkWidget *create_widget_container(EffectGroup *group, gint amt, gint id, gint position)
{
GtkWidget *vbox;
GtkWidget *widget;
GtkWidget *combo_box = NULL;
GHashTable *widget_table;
EffectSettingsGroup *settings = NULL;
gchar *name = NULL;
gint x;
@@ -332,6 +389,8 @@ GtkWidget *create_widget_container(EffectGroup *group, gint amt)
vbox = gtk_vbox_new(FALSE, 0);
widget_table = g_hash_table_new(g_direct_hash, g_direct_equal);
for (x = 0; x<amt; x++) {
if (group[x].label) {
if (combo_box == NULL) {
@@ -343,28 +402,32 @@ GtkWidget *create_widget_container(EffectGroup *group, gint amt)
gtk_combo_box_append_text(GTK_COMBO_BOX(combo_box), group[x].label);
cmbox_no++;
if ((group[x].settings != NULL) && (group[x].settings > 0)) {
widget = create_table(group[x].settings, group[x].settings_amt);
if ((group[x].settings != NULL) && (group[x].settings_amt > 0)) {
widget = create_table(group[x].settings, group[x].settings_amt, widget_table);
g_object_ref_sink(widget);
} else
widget = NULL;
settings = g_slice_new(EffectSettingsGroup);
settings->id = group[x].id;
settings->id = id;
settings->type = group[x].type;
settings->position = group[x].position;
settings->position = position;
settings->child = widget;
widget_list_add(GTK_OBJECT(combo_box), group[x].id, group[x].position, group[x].type, x);
widget_tree_add(GTK_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_free(name);
} else {
widget = create_table(group[x].settings, group[x].settings_amt);
if ((group[x].settings != NULL) && (group[x].settings_amt > 0)) {
widget = create_table(group[x].settings, group[x].settings_amt, widget_table);
gtk_container_add(GTK_CONTAINER(vbox), widget);
}
}
}
g_hash_table_destroy(widget_table);
return vbox;
}
@@ -408,9 +471,10 @@ GtkWidget *create_vbox(Effect *widgets, gint amt, gchar *label)
} else if (widgets[x].label) {
widget = gtk_label_new(widgets[x].label);
gtk_table_attach_defaults(GTK_TABLE(table), widget, 0, 1, x, x+1);
y = 0;
}
container = create_widget_container(widgets[x].group, widgets[x].group_amt);
container = create_widget_container(widgets[x].group, widgets[x].group_amt, widgets[x].type, widgets[x].position);
gtk_table_attach_defaults(GTK_TABLE(table), container, 1-y, 2-y, x+y, x+y+1);
}
gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 2);
@@ -493,22 +557,32 @@ static void fill_store_with_presets(GtkTreeStore *model, guint bank, gchar *name
**/
static void fill_store(GtkTreeStore *model)
{
fill_store_with_presets(model, PRESETS_USER, "User Presets");
fill_store_with_presets(model, PRESETS_SYSTEM, "System Presets");
Device *device = g_object_get_data(G_OBJECT(model), "device");
g_return_if_fail(device != NULL);
gint i;
for (i=0; i<device->n_banks; i++)
fill_store_with_presets(model,
device->banks[i].bank,
device->banks[i].name);
}
/**
* \param device device information
*
* Creates treeview showing list of presets available on device.
*
* \return treeview containing all preset names found on device.
**/
GtkWidget *create_preset_tree()
GtkWidget *create_preset_tree(Device *device)
{
GtkWidget *treeview;
GtkTreeStore *store;
GtkCellRenderer *renderer;
store = gtk_tree_store_new(NUM_COLUMNS, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT);
g_object_set_data(G_OBJECT(store), "device", device);
fill_store(store);
treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
@@ -535,7 +609,7 @@ GtkWidget *create_preset_tree()
**/
static void show_store_preset_window(GtkWidget *window, gchar *default_name)
{
GtkWidget *dialog, *cmbox, *entry, *table, *label;
GtkWidget *dialog, *cmbox, *entry, *table, *label, *vbox;
GStrv names;
int x;
@@ -546,8 +620,10 @@ static void show_store_preset_window(GtkWidget *window, gchar *default_name)
GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
NULL);
vbox = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
table = gtk_table_new(2, 2, FALSE);
gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), table);
gtk_container_add(GTK_CONTAINER(vbox), table);
cmbox = gtk_combo_box_new_text();
names = query_preset_names(PRESETS_USER);
@@ -570,7 +646,7 @@ static void show_store_preset_window(GtkWidget *window, gchar *default_name)
label = gtk_label_new("Preset name:");
gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1, 2);
gtk_widget_show_all(GTK_DIALOG(dialog)->vbox);
gtk_widget_show_all(vbox);
if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
gint number = gtk_combo_box_get_active(GTK_COMBO_BOX(cmbox));
if (number != -1) {
@@ -728,15 +804,15 @@ static void action_open_preset_cb(GtkAction *action)
}
/**
* \param list widget list to be freed
* \param list widget tree list to be freed
*
* Frees all memory used by widget list.
* Frees all memory used by widget tree list.
*/
static void widget_list_free(GList *list)
static void widget_tree_elem_free(GList *list)
{
GList *iter;
for (iter = list; iter; iter = iter->next) {
g_slice_free(WidgetListElem, iter->data);
g_slice_free(WidgetTreeElem, iter->data);
}
g_list_free(list);
}
@@ -840,17 +916,34 @@ static void add_menubar(GtkWidget *window, GtkWidget *vbox)
g_object_unref(ui);
}
static gint widget_tree_key_compare_func(gconstpointer a, gconstpointer b, gpointer data)
{
gint position_a = GPOINTER_TO_INT(a) & 0xFF0000;
gint position_b = GPOINTER_TO_INT(b) & 0xFF0000;
if (position_a > position_b) {
return 1;
} else if (position_a == position_b) {
gint val_a = GPOINTER_TO_INT(a) & 0xFFFF;
gint val_b = GPOINTER_TO_INT(b) & 0xFFFF;
return val_a - val_b;
} else
return -1;
}
/**
* Creates main window.
**/
void gui_create(EffectList *effects, int n_effects)
void gui_create(Device *device)
{
GtkWidget *window;
GtkWidget *vbox;
GtkWidget *hbox;
GtkWidget *widget;
GtkWidget *notebook;
GtkWidget *sw; /* scrolled window to carry preset treeview */
gint x;
gint i;
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "gdigi");
@@ -867,22 +960,37 @@ void gui_create(EffectList *effects, int n_effects)
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(device);
gtk_container_add(GTK_CONTAINER(sw), widget);
vbox = gtk_vbox_new(FALSE, 0);
gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 2);
notebook = gtk_notebook_new();
gtk_box_pack_start(GTK_BOX(hbox), notebook, TRUE, TRUE, 2);
knob_anim = gtk_knob_animation_new_from_inline(knob_pixbuf);
for (x = 0; x<n_effects; x++) {
if ((x % ((n_effects+1)/2)) == 0) {
widget_tree = g_tree_new_full(widget_tree_key_compare_func,
NULL, /* key compare data */
NULL, /* key destroy func */
(GDestroyNotify) widget_tree_elem_free);
gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), device->n_pages > 1 ? TRUE : FALSE);
for (i = 0; i<device->n_pages; i++) {
GtkWidget *label = NULL;
vbox = gtk_vbox_new(FALSE, 0);
label = gtk_label_new(device->pages[i].name);
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
for (x = 0; x<device->pages[i].n_effects; x++) {
if ((x % ((device->pages[i].n_effects+1)/device->pages[i].n_rows)) == 0) {
hbox = gtk_hbox_new(FALSE, 0);
gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 2);
}
widget = create_vbox(effects[x].effect, effects[x].amt, effects[x].label);
widget = create_vbox(device->pages[i].effects[x].effect, device->pages[i].effects[x].amt, device->pages[i].effects[x].label);
gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 2);
}
}
apply_current_preset();
gtk_widget_show_all(window);
@@ -895,29 +1003,29 @@ void gui_create(EffectList *effects, int n_effects)
**/
void gui_free()
{
widget_list_free(widget_list);
widget_list = NULL;
g_tree_destroy(widget_tree);
widget_tree = NULL;
gtk_knob_animation_free(knob_anim);
knob_anim = NULL;
}
/**
* \param list Variable to hold effect list
* \param n_list Variable to hold length of effect list
* \param device Variable to hold device information
*
* Displays dialogbox stating that device is unsupported.
*
* \return TRUE if user selects "compability mode", otherwise FALSE.
**/
gboolean unsupported_device_dialog(EffectList **list, int *n_list)
gboolean unsupported_device_dialog(Device **device)
{
extern SupportedDevices supported_devices[];
extern Device* supported_devices[];
extern int n_supported_devices;
GtkWidget *dialog;
GtkWidget *label;
GtkWidget *combo_box;
GtkWidget *vbox;
int x;
dialog = gtk_dialog_new_with_buttons("Unsupported device",
@@ -926,27 +1034,27 @@ gboolean unsupported_device_dialog(EffectList **list, int *n_list)
GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
NULL);
vbox = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
label = gtk_label_new("Your device appears to be unsupported by gdigi.\n"
"As some of the settings may be common between different devices,\n"
"you can now select compability mode with one of the supported devices.\n"
"Please take a look at gdigi's HACKING file.");
gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), label);
gtk_container_add(GTK_CONTAINER(vbox), label);
combo_box = gtk_combo_box_new_text();
for (x=0; x<n_supported_devices; x++) {
gtk_combo_box_append_text(GTK_COMBO_BOX(combo_box), supported_devices[x].name);
gtk_combo_box_append_text(GTK_COMBO_BOX(combo_box), supported_devices[x]->name);
}
gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), combo_box);
gtk_container_add(GTK_CONTAINER(vbox), combo_box);
gtk_widget_show_all(GTK_DIALOG(dialog)->vbox);
gtk_widget_show_all(vbox);
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 <n_supported_devices) {
g_message("Starting %s compability mode", supported_devices[number].name);
*list = supported_devices[number].list;
*n_list = supported_devices[number].n_list;
g_message("Starting %s compability mode", supported_devices[number]->name);
*device = supported_devices[number];
gtk_widget_destroy(dialog);
return TRUE;
}

6
gui.h
View File

@@ -21,8 +21,10 @@
#include "effects.h"
void show_error_message(GtkWidget *parent, gchar *message);
void gui_create(EffectList *list, int n_list);
void apply_setting_param_to_gui(SettingParam *param);
gboolean apply_current_preset_to_gui(gpointer data);
void gui_create(Device *device);
void gui_free();
gboolean unsupported_device_dialog(EffectList **list, int *n_list);
gboolean unsupported_device_dialog(Device **device);
#endif /* GDIGI_GUI_H */

View File

@@ -18,6 +18,7 @@
#include <expat.h>
#include <string.h>
#include "preset.h"
#include "gdigi.h"
#ifndef DOXYGEN_SHOULD_SKIP_THIS
@@ -53,10 +54,7 @@ static void XMLCALL start(void *data, const char *el, const char **attr) {
if (ad->preset->params != NULL)
g_message("Params aleady exists!");
} else if (g_strcmp0(el, "Param") == 0) {
SettingParam *param = g_slice_new(SettingParam);
param->id = -1;
param->position = -1;
param->value = -1;
SettingParam *param = setting_param_new();
ad->preset->params = g_list_prepend(ad->preset->params, param);
} else if (g_strcmp0(el, "ID") == 0) {
ad->id = PARSER_TYPE_PARAM_ID;
@@ -175,58 +173,66 @@ Preset *create_preset_from_xml_file(gchar *filename, GError **error)
}
/**
* \param data unpacked RECEIVE_PRESET_PARAMETERS message
* \param list list containing unpacked preset SysEx messages.
*
* Parses message
*
* \return Preset which must be freed using preset_free, or NULL on error.
**/
Preset *create_preset_from_data(GString *data)
Preset *create_preset_from_data(GList *list)
{
gint total;
gint n;
gint id;
gint position;
guint value;
gint x;
gint tmp;
GString *data;
GList *iter;
gint total, n, x;
gint bank, number, modified;
gchar *name;
g_return_val_if_fail(data != NULL, NULL);
g_return_val_if_fail(list != NULL, NULL);
Preset *preset = g_slice_new(Preset);
preset->name = NULL;
preset->params = NULL;
iter = list;
for (iter = list; iter; iter = g_list_next(iter)) {
data = (GString*) iter->data;
switch (get_message_id(data)) {
case RECEIVE_PRESET_START:
bank = (unsigned char)data->str[8];
number = (unsigned char)data->str[9];
name = g_strdup(&data->str[10]);
modified = (unsigned char)data->str[11+strlen(name)];
if ((bank == PRESETS_EDIT_BUFFER) && (number == 0)) {
g_message("Received current edit buffer");
} else {
g_message("Received preset %d from bank %d", number, bank);
}
g_message("Modified flag: %d Name: %s", modified, name);
preset->name = name;
break;
case RECEIVE_PRESET_PARAMETERS:
x = 0x09;
n = 0;
total = (unsigned char)data->str[x];
x++;
Preset *preset = g_slice_new(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;
}
SettingParam *param = setting_param_new_from_data(&data->str[x], &x);
n++;
SettingParam *param = g_slice_new(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);
g_message("%d ID %d Position %d Value %d", n, param->id, param->position, param->value);
} while ((x < data->len) && n<total);
g_message("TOTAL %d", total);
preset->params = g_list_reverse(preset->params);
break;
case RECEIVE_PRESET_END:
break;
default:
g_message("Unhandled message in preset messages list");
}
}
return preset;
}
@@ -243,7 +249,7 @@ void preset_free(Preset *preset)
if (preset->params != NULL) {
GList *iter;
for (iter = preset->params; iter; iter = iter->next) {
g_slice_free(SettingParam, iter->data);
setting_param_free((SettingParam*)iter->data);
}
g_list_free(preset->params);
}

View File

@@ -19,19 +19,13 @@
#include <glib.h>
typedef struct {
int id;
int position;
int value;
} SettingParam;
typedef struct {
gchar *name;
GList *params;
} Preset;
Preset *create_preset_from_xml_file(gchar *filename, GError **error);
Preset *create_preset_from_data(GString *data);
Preset *create_preset_from_data(GList *list);
void preset_free(Preset *preset);
#endif /* GDIGI_PRESET_H */

644
tests.c
View File

@@ -1,644 +0,0 @@
/*
* Copyright (c) 2009 Tomasz Moń <desowin@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; under version 3 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses>.
*/
#include "gdigi.h"
void test_wah()
{
int x;
set_option(WAH_TYPE, WAH_POSITION, WAH_TYPE_CRY);
for (x=0; x<=99; x++)
set_option(WAH_MIN, WAH_POSITION_MIN_MAX, x);
for (x=0; x<=99; x++)
set_option(WAH_MAX, WAH_POSITION_MIN_MAX, x);
for (x=0; x<=12; x++)
set_option(WAH_LEVEL, WAH_POSITION, x);
set_option(WAH_TYPE, WAH_POSITION, WAH_TYPE_FULLRANGE);
for (x=0; x<=99; x++)
set_option(WAH_MIN, WAH_POSITION_MIN_MAX, x);
for (x=0; x<=99; x++)
set_option(WAH_MAX, WAH_POSITION_MIN_MAX, x);
for (x=0; x<=12; x++)
set_option(WAH_LEVEL, WAH_POSITION, x);
set_option(WAH_TYPE, WAH_POSITION, WAH_TYPE_CLYDE);
for (x=0; x<=99; x++)
set_option(WAH_MIN, WAH_POSITION_MIN_MAX, x);
for (x=0; x<=99; x++)
set_option(WAH_MAX, WAH_POSITION_MIN_MAX, x);
for (x=0; x<=12; x++)
set_option(WAH_LEVEL, WAH_POSITION, x);
set_option(WAH_ON_OFF, WAH_POSITION, 1);
set_option(WAH_ON_OFF, WAH_POSITION, 0);
}
void test_compressor()
{
int x;
set_option(COMP_TYPE, COMP_POSITION, COMP_TYPE_DIGI);
for (x=0; x<=99; x++)
set_option(COMP_SUSTAIN, COMP_POSITION, x);
for (x=0; x<=99; x++)
set_option(COMP_TONE, COMP_POSITION, x);
for (x=0; x<=99; x++)
set_option(COMP_ATTACK, COMP_POSITION, x);
for (x=0; x<=99; x++)
set_option(COMP_LEVEL, COMP_POSITION, x);
set_option(COMP_TYPE, COMP_POSITION, COMP_TYPE_CS);
for (x=0; x<=99; x++)
set_option(COMP_SUSTAIN, COMP_POSITION, x);
for (x=0; x<=99; x++)
set_option(COMP_ATTACK, COMP_POSITION, x);
for (x=0; x<=99; x++)
set_option(COMP_LEVEL, COMP_POSITION, x);
set_option(COMP_ON_OFF, COMP_POSITION, 1);
set_option(COMP_ON_OFF, COMP_POSITION, 0);
}
void test_dist()
{
int x;
set_option(DIST_TYPE, DIST_POSITION, DIST_TYPE_SCREAMER);
for (x=0; x<=99; x++)
set_option(DIST_SCREAMER_DRIVE, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_option(DIST_SCREAMER_TONE, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_option(DIST_SCREAMER_LVL, DIST_POSITION, x);
set_option(DIST_TYPE, DIST_POSITION, DIST_TYPE_808);
for (x=0; x<=99; x++)
set_option(DIST_808_OVERDRIVE, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_option(DIST_808_TONE, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_option(DIST_808_LVL, DIST_POSITION, x);
set_option(DIST_TYPE, DIST_POSITION, DIST_TYPE_GUYOD);
for (x=0; x<=99; x++)
set_option(DIST_GUYOD_DRIVE, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_option(DIST_GUYOD_LVL, DIST_POSITION, x);
set_option(DIST_TYPE, DIST_POSITION, DIST_TYPE_DOD250);
for (x=0; x<=99; x++)
set_option(DIST_DOD250_GAIN, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_option(DIST_DOD250_LVL, DIST_POSITION, x);
set_option(DIST_TYPE, DIST_POSITION, DIST_TYPE_RODENT);
for (x=0; x<=99; x++)
set_option(DIST_RODENT_DIST, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_option(DIST_RODENT_FILTER, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_option(DIST_RODENT_LVL, DIST_POSITION, x);
set_option(DIST_TYPE, DIST_POSITION, DIST_TYPE_MX);
for (x=0; x<=99; x++)
set_option(DIST_MX_DIST, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_option(DIST_MX_OUTPUT, DIST_POSITION, x);
set_option(DIST_TYPE, DIST_POSITION, DIST_TYPE_DS);
for (x=0; x<=99; x++)
set_option(DIST_DS_GAIN, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_option(DIST_DS_TONE, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_option(DIST_DS_LVL, DIST_POSITION, x);
set_option(DIST_TYPE, DIST_POSITION, DIST_TYPE_GRUNGE);
for (x=0; x<=99; x++)
set_option(DIST_GRUNGE_GRUNGE, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_option(DIST_GRUNGE_FACE, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_option(DIST_GRUNGE_LOUD, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_option(DIST_GRUNGE_BUTT, DIST_POSITION, x);
set_option(DIST_TYPE, DIST_POSITION, DIST_TYPE_ZONE);
for (x=0; x<=99; x++)
set_option(DIST_ZONE_GAIN, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_option(DIST_ZONE_LOW, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_option(DIST_ZONE_MID_LVL, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_option(DIST_ZONE_MID_FREQ, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_option(DIST_ZONE_HIGH, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_option(DIST_ZONE_LEVEL, DIST_POSITION, x);
set_option(DIST_TYPE, DIST_POSITION, DIST_TYPE_DEATH);
for (x=0; x<=99; x++)
set_option(DIST_DEATH_LOW, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_option(DIST_DEATH_MID, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_option(DIST_DEATH_HIGH, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_option(DIST_DEATH_LVL, DIST_POSITION, x);
set_option(DIST_TYPE, DIST_POSITION, DIST_TYPE_GONK);
for (x=0; x<=99; x++)
set_option(DIST_GONK_GONK, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_option(DIST_GONK_SMEAR, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_option(DIST_GONK_SUCK, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_option(DIST_GONK_HEAVE, DIST_POSITION, x);
set_option(DIST_TYPE, DIST_POSITION, DIST_TYPE_FUZZY);
for (x=0; x<=99; x++)
set_option(DIST_FUZZY_FUZZ, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_option(DIST_FUZZY_VOLUME, DIST_POSITION, x);
set_option(DIST_TYPE, DIST_POSITION, DIST_TYPE_MP);
for (x=0; x<=99; x++)
set_option(DIST_MP_SUSTAIN, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_option(DIST_MP_TONE, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_option(DIST_MP_VOLUME, DIST_POSITION, x);
set_option(DIST_ON_OFF, DIST_POSITION, 1);
set_option(DIST_ON_OFF, DIST_POSITION, 0);
}
void test_presets()
{
int x;
for (x=0; x<=60; x++)
switch_preset(PRESETS_USER, x);
for (x=0; x<=60; x++)
switch_preset(PRESETS_SYSTEM, x);
}
void test_pickups()
{
set_option(PICKUP_TYPE, PICKUP_POSITION, PICKUP_TYPE_HB_SC);
set_option(PICKUP_TYPE, PICKUP_POSITION, PICKUP_TYPE_SC_HB);
set_option(PICKUP_ON_OFF, PICKUP_POSITION, 1);
set_option(PICKUP_ON_OFF, PICKUP_POSITION, 0);
}
void test_eq()
{
int x;
set_option(EQ_TYPE, EQ_POSITION, EQ_TYPE_BRIGHT);
set_option(EQ_TYPE, EQ_POSITION, EQ_TYPE_MIDBOOST);
set_option(EQ_TYPE, EQ_POSITION, EQ_TYPE_SCOOP);
set_option(EQ_TYPE, EQ_POSITION, EQ_TYPE_WARM);
for (x=0; x<=99; x++)
set_option(AMP_GAIN, AMP_POSITION, x);
for (x=0; x<=99; x++)
set_option(AMP_LEVEL, AMP_POSITION, x);
for (x=0; x<=0x18; x++)
set_option(EQ_BASS, EQ_POSITION, x);
for (x=0; x<=0x18; x++)
set_option(EQ_MID, EQ_POSITION, x);
for (x=0; x<=4700; x++)
set_option(EQ_MID_HZ, EQ_POSITION, x);
for (x=0; x<=0x18; x++)
set_option(EQ_TREBLE, EQ_POSITION, x);
for (x=0; x<=7500; x++)
set_option(EQ_TREBLE_HZ, EQ_POSITION, x);
set_option(EQ_ON_OFF, EQ_POSITION, 1);
set_option(EQ_ON_OFF, EQ_POSITION, 0);
}
void test_noisegate()
{
int x;
set_option(NOISEGATE_TYPE, NOISEGATE_POSITION, NOISEGATE_GATE);
for (x=0; x<=99; x++)
set_option(NOISEGATE_GATE_TRESHOLD, NOISEGATE_POSITION, x);
for (x=0; x<=99; x++)
set_option(NOISEGATE_ATTACK, NOISEGATE_POSITION, x);
for (x=0; x<=99; x++)
set_option(NOISEGATE_RELEASE, NOISEGATE_POSITION, x);
for (x=0; x<=99; x++)
set_option(NOISEGATE_ATTN, NOISEGATE_POSITION, x);
set_option(NOISEGATE_TYPE, NOISEGATE_POSITION, NOISEGATE_SWELL);
for (x=0; x<=99; x++)
set_option(NOISEGATE_SWELL_SENS, NOISEGATE_POSITION, x);
for (x=0; x<=99; x++)
set_option(NOISEGATE_ATTACK, NOISEGATE_POSITION, x);
for (x=0; x<=99; x++)
set_option(NOISEGATE_RELEASE, NOISEGATE_POSITION, x);
for (x=0; x<=99; x++)
set_option(NOISEGATE_ATTN, NOISEGATE_POSITION, x);
set_option(NOISEGATE_ON_OFF, NOISEGATE_POSITION, 1);
set_option(NOISEGATE_ON_OFF, NOISEGATE_POSITION, 0);
}
void test_chorusfx()
{
int x;
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_CE);
for (x=0; x<=99; x++)
set_option(CE_CHORUS_SPEED, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_option(CE_CHORUS_DEPTH, CHORUSFX_POSITION, x);
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_DUAL);
for (x=0; x<=99; x++)
set_option(DUAL_CHORUS_SPEED, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_option(DUAL_CHORUS_DEPTH, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_option(DUAL_CHORUS_LEVEL, CHORUSFX_POSITION, x);
set_option(DUAL_CHORUS_WAVE, CHORUSFX_POSITION, WAVE_TRI);
set_option(DUAL_CHORUS_WAVE, CHORUSFX_POSITION, WAVE_SINE);
set_option(DUAL_CHORUS_WAVE, CHORUSFX_POSITION, WAVE_SQUARE);
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_MULTI);
for (x=0; x<=99; x++)
set_option(MULTI_CHORUS_SPEED, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_option(MULTI_CHORUS_DEPTH, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_option(MULTI_CHORUS_LEVEL, CHORUSFX_POSITION, x);
set_option(MULTI_CHORUS_WAVE, CHORUSFX_POSITION, WAVE_TRI);
set_option(MULTI_CHORUS_WAVE, CHORUSFX_POSITION, WAVE_SINE);
set_option(MULTI_CHORUS_WAVE, CHORUSFX_POSITION, WAVE_SQUARE);
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_FLANGER);
for (x=0; x<=99; x++)
set_option(FLANGER_SPEED, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_option(FLANGER_DEPTH, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_option(FLANGER_REGEN, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_option(FLANGER_LEVEL, CHORUSFX_POSITION, x);
set_option(FLANGER_WAVE, CHORUSFX_POSITION, WAVE_TRI);
set_option(FLANGER_WAVE, CHORUSFX_POSITION, WAVE_SINE);
set_option(FLANGER_WAVE, CHORUSFX_POSITION, WAVE_SQUARE);
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_MXR_FLANGER);
for (x=0; x<=99; x++)
set_option(MXR_FLANGER_SPEED, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_option(MXR_FLANGER_WIDTH, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_option(MXR_FLANGER_REGEN, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_option(MXR_FLANGER_MANUAL, CHORUSFX_POSITION, x);
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_PHASER);
for (x=0; x<=99; x++)
set_option(PHASER_SPEED, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_option(PHASER_DEPTH, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_option(PHASER_REGEN, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_option(PHASER_LEVEL, CHORUSFX_POSITION, x);
set_option(PHASER_WAVE, CHORUSFX_POSITION, WAVE_TRI);
set_option(PHASER_WAVE, CHORUSFX_POSITION, WAVE_SINE);
set_option(PHASER_WAVE, CHORUSFX_POSITION, WAVE_SQUARE);
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_VIBRATO);
for (x=0; x<=99; x++)
set_option(VIBRATO_SPEED, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_option(VIBRATO_DEPTH, CHORUSFX_POSITION, x);
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_ROTARY);
for (x=0; x<=99; x++)
set_option(ROTARY_SPEED, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_option(ROTARY_INTENSITY, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_option(ROTARY_DOPPLER, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_option(ROTARY_CROSSOVER, CHORUSFX_POSITION, x);
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_VIBROPAN);
for (x=0; x<=99; x++)
set_option(VIBROPAN_SPEED, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_option(VIBROPAN_DEPTH, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_option(VIBROPAN_VIBRA, CHORUSFX_POSITION, x);
set_option(VIBROPAN_WAVE, CHORUSFX_POSITION, WAVE_TRI);
set_option(VIBROPAN_WAVE, CHORUSFX_POSITION, WAVE_SINE);
set_option(VIBROPAN_WAVE, CHORUSFX_POSITION, WAVE_SQUARE);
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_TREMOLO);
for (x=0; x<=99; x++)
set_option(TREMOLO_SPEED, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_option(TREMOLO_DEPTH, CHORUSFX_POSITION, x);
set_option(TREMOLO_WAVE, CHORUSFX_POSITION, WAVE_TRI);
set_option(TREMOLO_WAVE, CHORUSFX_POSITION, WAVE_SINE);
set_option(TREMOLO_WAVE, CHORUSFX_POSITION, WAVE_SQUARE);
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_PANNER);
for (x=0; x<=99; x++)
set_option(PANNER_SPEED, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_option(PANNER_DEPTH, CHORUSFX_POSITION, x);
set_option(PANNER_WAVE, CHORUSFX_POSITION, WAVE_TRI);
set_option(PANNER_WAVE, CHORUSFX_POSITION, WAVE_SINE);
set_option(PANNER_WAVE, CHORUSFX_POSITION, WAVE_SQUARE);
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_ENVELOPE);
for (x=0; x<=99; x++)
set_option(ENVELOPE_SENSITIVITY, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_option(ENVELOPE_RANGE, CHORUSFX_POSITION, x);
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_AUTOYA);
for (x=0; x<=99; x++)
set_option(AUTOYA_SPEED, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_option(AUTOYA_INTENSITY, CHORUSFX_POSITION, x);
for (x=0; x<=0x31; x++)
set_option(AUTOYA_RANGE, CHORUSFX_POSITION, x);
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_YAYA);
for (x=0; x<=99; x++)
set_option(YAYA_PEDAL, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_option(YAYA_INTENSITY, CHORUSFX_POSITION, x);
for (x=0; x<=0x31; x++)
set_option(YAYA_RANGE, CHORUSFX_POSITION, x);
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_STEP_FILTER);
for (x=0; x<=99; x++)
set_option(STEP_FILTER_SPEED, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_option(STEP_FILTER_INTENSITY, CHORUSFX_POSITION, x);
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_WHAMMY);
set_option(WHAMMY_AMOUNT, CHORUSFX_POSITION, WHAMMY_OCT_UP);
set_option(WHAMMY_AMOUNT, CHORUSFX_POSITION, WHAMMY_2OCT_UP);
set_option(WHAMMY_AMOUNT, CHORUSFX_POSITION, WHAMMY_2ND_DN);
set_option(WHAMMY_AMOUNT, CHORUSFX_POSITION, WHAMMY_RV_2ND);
set_option(WHAMMY_AMOUNT, CHORUSFX_POSITION, WHAMMY_4TH_DN);
set_option(WHAMMY_AMOUNT, CHORUSFX_POSITION, WHAMMY_OCT_DN);
set_option(WHAMMY_AMOUNT, CHORUSFX_POSITION, WHAMMY_2OCT_DN);
set_option(WHAMMY_AMOUNT, CHORUSFX_POSITION, WHAMMY_DIV_BMB);
set_option(WHAMMY_AMOUNT, CHORUSFX_POSITION, WHAMMY_M3_MA);
set_option(WHAMMY_AMOUNT, CHORUSFX_POSITION, WHAMMY_2ND_MA3);
set_option(WHAMMY_AMOUNT, CHORUSFX_POSITION, WHAMMY_3RD_4TH);
set_option(WHAMMY_AMOUNT, CHORUSFX_POSITION, WHAMMY_4TH_5TH);
set_option(WHAMMY_AMOUNT, CHORUSFX_POSITION, WHAMMY_5TH_OCT);
set_option(WHAMMY_AMOUNT, CHORUSFX_POSITION, WHAMMY_HOCT_UP);
set_option(WHAMMY_AMOUNT, CHORUSFX_POSITION, WHAMMY_HOCT_DN);
set_option(WHAMMY_AMOUNT, CHORUSFX_POSITION, WHAMMY_OCT_UD);
for (x=0; x<=99; x++)
set_option(WHAMMY_PEDAL, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_option(WHAMMY_MIX, CHORUSFX_POSITION, x);
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_PITCH_SHIFT);
for (x=0; x<=0x30; x++)
set_option(PITCH_AMOUNT, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_option(PITCH_MIX, CHORUSFX_POSITION, x);
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_DETUNE);
for (x=0; x<=0x30; x++)
set_option(DETUNE_AMOUNT, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_option(DETUNE_LEVEL, CHORUSFX_POSITION, x);
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_IPS);
set_option(IPS_SHIFT_AMOUNT, CHORUSFX_POSITION, IPS_OCT_D);
set_option(IPS_SHIFT_AMOUNT, CHORUSFX_POSITION, IPS_7TH_DN);
set_option(IPS_SHIFT_AMOUNT, CHORUSFX_POSITION, IPS_6TH_DN);
set_option(IPS_SHIFT_AMOUNT, CHORUSFX_POSITION, IPS_5TH_DN);
set_option(IPS_SHIFT_AMOUNT, CHORUSFX_POSITION, IPS_4TH_DN);
set_option(IPS_SHIFT_AMOUNT, CHORUSFX_POSITION, IPS_3RD_DN);
set_option(IPS_SHIFT_AMOUNT, CHORUSFX_POSITION, IPS_2ND_DN);
set_option(IPS_SHIFT_AMOUNT, CHORUSFX_POSITION, IPS_2ND_UP);
set_option(IPS_SHIFT_AMOUNT, CHORUSFX_POSITION, IPS_3RD_UP);
set_option(IPS_SHIFT_AMOUNT, CHORUSFX_POSITION, IPS_4TH_UP);
set_option(IPS_SHIFT_AMOUNT, CHORUSFX_POSITION, IPS_5TH_UP);
set_option(IPS_SHIFT_AMOUNT, CHORUSFX_POSITION, IPS_6TH_UP);
set_option(IPS_SHIFT_AMOUNT, CHORUSFX_POSITION, IPS_7TH_UP);
set_option(IPS_SHIFT_AMOUNT, CHORUSFX_POSITION, IPS_OCT_U);
set_option(IPS_KEY, CHORUSFX_POSITION, IPS_E);
set_option(IPS_KEY, CHORUSFX_POSITION, IPS_F);
set_option(IPS_KEY, CHORUSFX_POSITION, IPS_GB);
set_option(IPS_KEY, CHORUSFX_POSITION, IPS_G);
set_option(IPS_KEY, CHORUSFX_POSITION, IPS_AB);
set_option(IPS_KEY, CHORUSFX_POSITION, IPS_A);
set_option(IPS_KEY, CHORUSFX_POSITION, IPS_BB);
set_option(IPS_KEY, CHORUSFX_POSITION, IPS_B);
set_option(IPS_KEY, CHORUSFX_POSITION, IPS_C);
set_option(IPS_KEY, CHORUSFX_POSITION, IPS_DB);
set_option(IPS_KEY, CHORUSFX_POSITION, IPS_D);
set_option(IPS_KEY, CHORUSFX_POSITION, IPS_EB);
set_option(IPS_SCALE, CHORUSFX_POSITION, IPS_MAJOR);
set_option(IPS_SCALE, CHORUSFX_POSITION, IPS_MINOR);
set_option(IPS_SCALE, CHORUSFX_POSITION, IPS_DORIA);
set_option(IPS_SCALE, CHORUSFX_POSITION, IPS_MIXLYD);
set_option(IPS_SCALE, CHORUSFX_POSITION, IPS_LYDIAN);
set_option(IPS_SCALE, CHORUSFX_POSITION, IPS_HMINO);
for (x=0; x<=99; x++)
set_option(IPS_LEVEL, CHORUSFX_POSITION, x);
set_option(CHORUSFX_ON_OFF, CHORUSFX_POSITION, 1);
set_option(CHORUSFX_ON_OFF, CHORUSFX_POSITION, 0);
}
void test_delay()
{
int x;
set_option(DELAY_TYPE, DELAY_POSITION, DELAY_TYPE_ANALOG);
for (x=0; x<=139; x++)
set_option(DELAY_TIME, DELAY_POSITION, x);
for (x=0; x<=99; x++)
set_option(ANALOG_LEVEL, DELAY_POSITION, x);
for (x=0; x<=100; x++)
set_option(ANALOG_REPEATS, DELAY_POSITION, x);
set_option(DELAY_TYPE, DELAY_POSITION, DELAY_TYPE_DIGITAL);
for (x=0; x<=139; x++)
set_option(DELAY_TIME, DELAY_POSITION, x);
for (x=0; x<=99; x++)
set_option(DIGITAL_LEVEL, DELAY_POSITION, x);
for (x=0; x<=100; x++)
set_option(DIGITAL_REPEATS, DELAY_POSITION, x);
for (x=0; x<=99; x++)
set_option(DIGITAL_DUCKER_THRESH, DELAY_POSITION, x);
for (x=0; x<=99; x++)
set_option(DIGITAL_DUCKER_LEVEL, DELAY_POSITION, x);
set_option(DELAY_TYPE, DELAY_POSITION, DELAY_TYPE_MODULATED);
for (x=0; x<=139; x++)
set_option(DELAY_TIME, DELAY_POSITION, x);
for (x=0; x<=99; x++)
set_option(MODULATED_LEVEL, DELAY_POSITION, x);
for (x=0; x<=100; x++)
set_option(MODULATED_REPEATS, DELAY_POSITION, x);
for (x=0; x<=99; x++)
set_option(MODULATED_DEPTH, DELAY_POSITION, x);
set_option(DELAY_TYPE, DELAY_POSITION, DELAY_TYPE_PONG);
for (x=0; x<=139; x++)
set_option(DELAY_TIME, DELAY_POSITION, x);
for (x=0; x<=99; x++)
set_option(PONG_LEVEL, DELAY_POSITION, x);
for (x=0; x<=100; x++)
set_option(PONG_REPEATS, DELAY_POSITION, x);
for (x=0; x<=99; x++)
set_option(PONG_DUCKER_THRESH, DELAY_POSITION, x);
for (x=0; x<=99; x++)
set_option(PONG_DUCKER_LEVEL, DELAY_POSITION, x);
set_option(DELAY_TYPE, DELAY_POSITION, DELAY_TYPE_TAPE);
for (x=0; x<=139; x++)
set_option(DELAY_TIME, DELAY_POSITION, x);
for (x=0; x<=99; x++)
set_option(TAPE_LEVEL, DELAY_POSITION, x);
for (x=0; x<=100; x++)
set_option(TAPE_REPEATS, DELAY_POSITION, x);
for (x=0; x<=99; x++)
set_option(TAPE_WOW, DELAY_POSITION, x);
for (x=0; x<=99; x++)
set_option(TAPE_FLUTTER, DELAY_POSITION, x);
set_option(DELAY_ON_OFF, DELAY_POSITION, 1);
set_option(DELAY_ON_OFF, DELAY_POSITION, 0);
}
void test_reverb()
{
int x;
set_option(REVERB_TYPE, REVERB_POSITION, REVERB_TYPE_TWIN);
for (x=0; x<=99; x++)
set_option(TWIN_REVERB, REVERB_POSITION, x);
set_option(REVERB_TYPE, REVERB_POSITION, REVERB_TYPE_LEX_AMBIENCE);
for (x=0; x<=15; x++)
set_option(LEX_AMBIENCE_PREDELAY, REVERB_POSITION, x);
for (x=0; x<=99; x++)
set_option(LEX_AMBIENCE_DECAY, REVERB_POSITION, x);
for (x=0; x<=99; x++)
set_option(LEX_AMBIENCE_LIVELINESS, REVERB_POSITION, x);
for (x=0; x<=99; x++)
set_option(LEX_AMBIENCE_LEVEL, REVERB_POSITION, x);
set_option(REVERB_TYPE, REVERB_POSITION, REVERB_TYPE_LEX_STUDIO);
for (x=0; x<=15; x++)
set_option(LEX_STUDIO_PREDELAY, REVERB_POSITION, x);
for (x=0; x<=99; x++)
set_option(LEX_STUDIO_DECAY, REVERB_POSITION, x);
for (x=0; x<=99; x++)
set_option(LEX_STUDIO_LIVELINESS, REVERB_POSITION, x);
for (x=0; x<=99; x++)
set_option(LEX_STUDIO_LEVEL, REVERB_POSITION, x);
set_option(REVERB_TYPE, REVERB_POSITION, REVERB_TYPE_LEX_ROOM);
for (x=0; x<=15; x++)
set_option(LEX_ROOM_PREDELAY, REVERB_POSITION, x);
for (x=0; x<=99; x++)
set_option(LEX_ROOM_DECAY, REVERB_POSITION, x);
for (x=0; x<=99; x++)
set_option(LEX_ROOM_LIVELINESS, REVERB_POSITION, x);
for (x=0; x<=99; x++)
set_option(LEX_ROOM_LEVEL, REVERB_POSITION, x);
set_option(REVERB_TYPE, REVERB_POSITION, REVERB_TYPE_LEX_HALL);
for (x=0; x<=15; x++)
set_option(LEX_HALL_PREDELAY, REVERB_POSITION, x);
for (x=0; x<=99; x++)
set_option(LEX_HALL_DECAY, REVERB_POSITION, x);
for (x=0; x<=99; x++)
set_option(LEX_HALL_LIVELINESS, REVERB_POSITION, x);
for (x=0; x<=99; x++)
set_option(LEX_HALL_LEVEL, REVERB_POSITION, x);
set_option(REVERB_TYPE, REVERB_POSITION, REVERB_TYPE_EMT240_PLATE);
for (x=0; x<=15; x++)
set_option(EMT240_PLATE_PREDELAY, REVERB_POSITION, x);
for (x=0; x<=99; x++)
set_option(EMT240_PLATE_DECAY, REVERB_POSITION, x);
for (x=0; x<=99; x++)
set_option(EMT240_PLATE_LIVELINESS, REVERB_POSITION, x);
for (x=0; x<=99; x++)
set_option(EMT240_PLATE_LEVEL, REVERB_POSITION, x);
set_option(REVERB_ON_OFF, REVERB_POSITION, 1);
set_option(REVERB_ON_OFF, REVERB_POSITION, 0);
}
void test_usb()
{
int x;
for (x=0; x<=100; x++)
set_option(USB_AUDIO_PLAYBACK_MIX, USB_POSITION, x);
for (x=0; x<=36; x++)
set_option(USB_AUDIO_LEVEL, USB_POSITION, x);
}
void test_all()
{
test_wah();
test_compressor();
test_dist();
test_presets();
test_pickups();
test_eq();
test_noisegate();
test_chorusfx();
test_delay();
test_reverb();
test_usb();
}

35
tests.h
View File

@@ -1,35 +0,0 @@
/*
* Copyright (c) 2009 Tomasz Moń <desowin@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; under version 3 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses>.
*/
#ifndef GDIGI_TESTS_H
#define GDIGI_TESTS_H
#include "gdigi.h"
void test_wah();
void test_compressor();
void test_dist();
void test_presets();
void test_pickups();
void test_eq();
void test_noisegate();
void test_chorusfx();
void test_delay();
void test_reverb();
void test_usb();
void test_all();
#endif /* GDIGI_TESTS_H */