95 Commits
0.1 ... 0.1.7

Author SHA1 Message Date
Tomasz Moń
29124043ba add RP500 distortion settings 2009-04-14 23:23:41 +02:00
Tomasz Moń
e93e6bd16b add compability mode dialog 2009-04-14 21:00:10 +02:00
Tomasz Moń
f7ddd5e0d6 add RP500 chorusfx settings 2009-04-14 18:22:32 +02:00
Tomasz Moń
6a082acc53 add RP500 delay settings 2009-04-13 11:42:15 +02:00
Tomasz Moń
1abcc82829 add RP500 equalizer settings 2009-04-12 20:55:17 +02:00
Tomasz Moń
c964d38c17 add RP500 compressor and amp settings 2009-04-12 18:36:41 +02:00
Tomasz Moń
12c2ccc87f Use single header includes 2009-04-11 22:32:21 +02:00
Tomasz Moń
a6d07fd802 disconnect adjustment signals on gtk_knob_destroy 2009-04-10 14:23:23 +02:00
Tomasz Moń
215683b167 actually g_type_class_peek_parent makes more sense 2009-04-10 13:32:03 +02:00
Tomasz Moń
741482afd4 Added tag 0.1.6 for changeset 80e56807413b 2009-03-26 15:21:18 +01:00
Tomasz Moń
991527418a Don't use deprecated functions in GtkKnob; optipng knob.png 2009-03-24 22:21:01 +01:00
Tomasz Moń
96317d5ac5 actually 'is it connected' doesn't make sense here 2009-03-17 15:36:16 +01:00
Tomasz Moń
d24cc97f5d add error reporting to create_preset_from_xml_file 2009-03-17 12:54:46 +01:00
Tomasz Moń
cac7e74d71 display preset number in preset list 2009-03-15 20:12:58 +01:00
Tomasz Moń
74583e9a7c make GUI more compact 2009-03-15 20:06:18 +01:00
Tomasz Moń
03c3c48ecf remove reduntant text 2009-03-15 18:52:14 +01:00
Tomasz Moń
aa2cc7bbb1 some Doxygen work 2009-03-14 18:51:08 +01:00
Tomasz Moń
ec14a41869 Added tag 0.1.5 for changeset 45f897c02e72 2009-03-14 14:27:12 +01:00
Tomasz Moń
9778dc47c3 add comments 2009-03-14 14:23:18 +01:00
Tomasz Moń
71c3a1e66f use g_slice 2009-03-14 12:58:11 +01:00
Tomasz Moń
bdb35ddf54 finish modifier_linkable_list(), add modifier_group_free() 2009-03-14 12:39:45 +01:00
Tomasz Moń
4ca140ab48 rename get_modifier_label to get_modifier 2009-03-14 10:31:40 +01:00
Tomasz Moń
d2f821eee1 add EffectValues to Modifiers 2009-03-14 10:24:58 +01:00
Tomasz Moń
e607c6cf37 move modifier_linkable_list to effects.c 2009-03-14 10:07:00 +01:00
Tomasz Moń
dc66db841a introduce get_message_by_id 2009-03-14 10:04:56 +01:00
Tomasz Moń
e80683aea2 add cabinet models 2009-03-14 08:38:28 +01:00
Tomasz Moń
b7d2d7d1c5 introduce EffectValues 2009-03-13 22:42:46 +01:00
Tomasz Moń
cd5d7387f3 remove obsolete function 2009-03-13 20:33:24 +01:00
Tomasz Moń
8a39a178c6 add tone library and effects library 2009-03-13 19:46:02 +01:00
Tomasz Moń
40ebcfaf16 make modifiers[] complete 2009-03-13 18:00:41 +01:00
Tomasz Moń
de68d0449f some renames, no functional changes 2009-03-10 20:57:34 +01:00
Tomasz Moń
d280bf1ca6 add some comments 2009-03-10 19:45:16 +01:00
Tomasz Moń
b245e1bac6 add gtk_knob_key_press 2009-03-09 22:51:38 +01:00
Tomasz Moń
8d7fffb6d1 atan2f requires C99 2009-03-09 20:58:03 +01:00
Tomasz Moń
f8e35ff685 let GtkKnob grab focus 2009-03-09 19:57:13 +01:00
Tomasz Moń
3f717a51cd add gui_free 2009-03-09 18:49:29 +01:00
Tomasz Moń
90df427200 add knobs 2009-03-09 18:22:20 +01:00
Tomasz Moń
322c59032e tweak GtkKnob a bit 2009-03-08 13:46:14 +01:00
Tomasz Moń
1b1919649e add GtkKnob from phasex-0.11.1 2009-03-08 13:31:43 +01:00
Tomasz Moń
e7c7efe857 expression pedal settings work-in-progress 2009-03-08 13:25:37 +01:00
Tomasz Moń
17b067f853 don't crash if query preset names fail 2009-03-04 19:00:32 +01:00
Tomasz Moń
8ec3d6579c change query_preset_names 2009-03-04 18:26:22 +01:00
Tomasz Moń
5bd6f8fc2c Added tag 0.1.4 for changeset 78367821f4f4 2009-03-04 08:14:21 +01:00
Tomasz Moń
c61c2372ae cleaning 2009-03-03 23:06:03 +01:00
Tomasz Moń
49b7f42012 compile with -ansi 2009-03-03 22:39:55 +01:00
Tomasz Moń
157fba0380 make set_option wrapper to send_message 2009-03-03 22:31:25 +01:00
Tomasz Moń
904a30bb38 propertly apply xml patch 2009-03-03 21:57:47 +01:00
Tomasz Moń
8e445bb408 update gui on preset switch 2009-03-03 13:42:15 +01:00
Tomasz Moń
eb48d0b9d2 add get_message_id stub 2009-03-03 11:46:28 +01:00
Tomasz Moń
baa3829263 start gui with proper values 2009-03-03 11:39:25 +01:00
Tomasz Moń
79554a99ce Added tag 0.1.3 for changeset 5cc97dba5d41 2009-03-01 20:24:06 +01:00
Tomasz Moń
4740bef10f update TODO 2009-03-01 20:23:01 +01:00
Tomasz Moń
968d2947a7 set gui widgets to proper values after loading xml file 2009-03-01 19:00:35 +01:00
Tomasz Moń
e2cb03ab32 add store preset window 2009-03-01 13:31:15 +01:00
Tomasz Moń
ce5fe3fe0c add menubar 2009-03-01 11:57:27 +01:00
Tomasz Moń
966fc748af add store_preset_name 2009-03-01 10:05:24 +01:00
Tomasz Moń
709406f3ef add preset.c and preset.h 2009-03-01 09:52:31 +01:00
Tomasz Moń
ce522227c7 add amp types 2009-02-28 00:17:54 +01:00
Tomasz Moń
7d13b2a7ea add preset treeview 2009-02-27 23:28:34 +01:00
Tomasz Moń
d4c86b3a60 use GOptionContext instead of getopt 2009-02-27 12:57:52 +01:00
Tomasz Moń
ca23f2c94c rename query_user_presets to query_preset_names, make it return GStrv 2009-02-26 22:57:08 +01:00
Tomasz Moń
bfc285ad0f add some defines 2009-02-26 20:32:35 +01:00
Tomasz Moń
4e5f2438d3 add query user presets 2009-02-26 18:21:01 +01:00
Tomasz Moń
10aac46dde Added tag 0.1.2 for changeset 7a31bc520752 2009-02-25 22:25:57 +01:00
Tomasz Moń
e802d05ad3 remove redundant function 2009-02-25 22:24:10 +01:00
Tomasz Moń
95f4ad698a renames, some comments, no functional changes 2009-02-25 22:19:01 +01:00
Tomasz Moń
9f3bdd002d revise VBoxWidget 2009-02-25 21:46:41 +01:00
Tomasz Moń
0cfcd806b1 revise WidgetContainer 2009-02-25 21:31:06 +01:00
Tomasz Moń
c0ac97d4e2 revise calculate_checksum 2009-02-25 20:19:21 +01:00
Tomasz Moń
84e9ab0e01 revise SettingsWidget 2009-02-25 19:59:52 +01:00
Tomasz Moń
2c6afe730d add audio setup options 2009-02-25 19:10:52 +01:00
Tomasz Moń
79912510b4 add tests for exp pedal 2009-02-25 18:57:59 +01:00
Tomasz Moń
8bdeea7728 add HACKING file 2009-02-24 23:03:28 +01:00
Tomasz Moń
22de8a00ab add expression pedal types 2009-02-24 22:26:18 +01:00
Tomasz Moń
5cf9c021d8 revise set_eq_mid_hz, set_eq_treb_hz and set_delay_time 2009-02-23 18:02:19 +01:00
Tomasz Moń
2d4798abf7 more work-in-progress on setting effects type 2009-02-23 17:43:14 +01:00
Tomasz Moń
e427e6f4d3 wip on setting type 2009-02-23 16:16:50 +01:00
Tomasz Moń
886f01c1e4 revise set_wah_type, set_comp_type, set_pickup_type and set_eq_type 2009-02-22 22:37:29 +01:00
Tomasz Moń
1c4ff62baa revise set_dist_type, set_noisegate_type, set_chorusfx_type, set_delay_type and set_reverb_type 2009-02-22 21:26:47 +01:00
Tomasz Moń
edbea6ff43 more wrapping 2009-02-22 19:36:17 +01:00
Tomasz Moń
c4b1fbff77 make set_wah_min, set_wah_max, set_wah_level, set_wah_on_off, set_pickup_on_off and set_preset_level wrappers to set_option 2009-02-22 19:11:42 +01:00
Tomasz Moń
68d05bd1db make set_comp_sustain, set_comp_tone, set_comp_attack, set_comp_level and set_comp_on_off wrappers to set_option 2009-02-22 18:16:27 +01:00
Tomasz Moń
73f9a21a02 make set_dist_option, set_dist_on_off, set_gate_option, set_noisegate_on_off, set_chorusfx_option, set_reverb_on_off wrappers to set_option 2009-02-22 17:54:44 +01:00
Tomasz Moń
66c5a966a6 make set_chorusfx_on_off, set_delay_option and set_delay_on_off wrappers to set_option 2009-02-22 16:40:24 +01:00
Tomasz Moń
e7ce11164b introduce set_option 2009-02-22 16:06:30 +01:00
Tomasz Moń
f95804026c code splitting 2009-02-21 17:48:49 +01:00
Tomasz Moń
5c5d0b3709 introduce EffectSettingsGroup 2009-02-21 15:50:36 +01:00
Tomasz Moń
146745829f code reordering, no functional changes 2009-02-21 14:12:08 +01:00
Tomasz Moń
a207b8ec62 merge all functions to set chorusfx parameters into one 2009-02-20 22:08:02 +01:00
Tomasz Moń
a38ab64870 Added tag 0.1.1 for changeset 2a58e6a93179 2009-02-06 21:23:38 +01:00
Tomasz Moń
93ebb6b65c add commandline option to set alsa midi device 2009-02-06 21:23:01 +01:00
Tomasz Moń
87908f7c9f fix set_preset_name 2009-02-06 20:46:55 +01:00
Tomasz Moń
f9d24bc6b9 actually it uses MIDI SysEx... 2009-02-06 18:50:09 +01:00
Tomasz Moń
48100b42e1 add set_preset_name 2009-02-03 22:47:24 +01:00
Tomasz Moń
0816a4d0ce Added tag 0.1 for changeset 6defd1a8b4b4 2009-02-02 11:36:48 +01:00
17 changed files with 5563 additions and 2130 deletions

68
HACKING Normal file
View File

@@ -0,0 +1,68 @@
In general everything brings down to figure out:
-ID
-Position
-Possible value range
There seems to be two 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:
(all numbers here are hex)
04 F0 00 00 04 10 00 5E 04 02 41 00 04 30 09 00 07 00 34 F7
To get SysEx command out of it, remove every 4th byte, so we have:
F0 00 00 10 00 5E 02 41 00 30 09 00 00 34 F7
SysEx message format seems to be formed like this:
magic bytes - F0 00 00 10 00 5E 02 41
status byte - in this example 00
ID - in this example 30 09
Position - in this example 00
Value - in this example 00 (can be more bytes long, see below)
Checksum - to calculate it, XOR all bytes, and then XOR it with 07
Every message ends with F7
Status byte bits explained:
7th - ???
6th - if active add 80 to ID
5th - ???
4th - is active when value will start with length
In such case value can be something like:
01 12 or 02 12 34 or 03 12 34 56
and proper values are:
01 - 12
02 - 1234
03 - 123456
3rd - when 4th bit is also active, and first value byte is 01
then add 80 to value
2nd - when 4th bit is also active, and first value byte is 02
then add 80 to value
1st - when 4th bit is also active, and first value byte is 03
then add 80 to value
So for above example:
ID = 3009 (hex) = 12297 (decimal)
Position = 0
One of possible values is 0. Usually value range is 0 to 99,
albeit in some cases it's different - you have to check what values can
X-Edit assign (there doesn't seem to be any sanity check in firmware)
This is especially needed for IDs that set some effect type.
2) Save preset patch
Patches seem to be simple XML files.
Every parameter is written like this:
<Param>
<ID>65</ID>
<Position>2</Position>
<Value>0</Value>
<Name>Pickup Enable</Name>
<Text>Off</Text>
</Param>
ID is ID, Position is Position and Value is one of possible values.
To get all possible values you can:
do
change value to next one possible in X-Edit
(for example next effect type)
save new patch
check patch file and note the change
while you don't have all possible values

View File

@@ -1,7 +1,7 @@
CC = gcc
CFLAGS = `pkg-config --cflags glib-2.0 gtk+-2.0` -Wall -g
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 gtk+-2.0 libusb`
LIBS = `pkg-config --libs glib-2.0 gio-2.0 gtk+-2.0 alsa` -lexpat
.SUFFIXES : .o .c
.c.o :
@@ -9,8 +9,8 @@ LIBS = `pkg-config --libs glib-2.0 gtk+-2.0 libusb`
all: gdigi
gdigi: gdigi.o tests.o gui.o
$(CC) $(LIBS) $(OFLAG) gdigi gdigi.o tests.o gui.o
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.o: gdigi.c
@@ -18,6 +18,17 @@ 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:
gdk-pixbuf-csource --name=knob_pixbuf knob.png > $@
clean:
rm *.o

13
README
View File

@@ -1,5 +1,12 @@
Requirments: libusb, gtk+, glib
Requirments: alsa, gtk+, glib, expat
Getting started guide:
-disable snd_usb_audio (when it's loaded gdigi can't claim interface)
-make && ./gdigi
-to compile: make
-to run: ./gdigi
Commandline options:
--device (-d)
Example:
gdigi -d hw:1,0,0
gdigi --device=hw:1,0,0

15
TODO
View File

@@ -1,12 +1,7 @@
-figure out all magic commands
-fix usb handling code
-make complete gui
-amp/cabinet models
-expression pedal options
-audio setup options
-tone library
-effects library
-effects level
-handling presets (loading, saving, exporting/importing to/from xml patches)
-buildsystem
-figure out how to get current device settings, start gui with proper values
-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
-guess device port when user doesn't explicitly provide it (don't use hardcoded "hw:1,0,0")

1682
effects.c Normal file

File diff suppressed because it is too large Load Diff

75
effects.h Normal file
View File

@@ -0,0 +1,75 @@
/*
* 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_EFFECTS_H
#define GDIGI_EFFECTS_H
#include <glib.h>
typedef struct {
gdouble min; /**< Minumum value */
gdouble max; /**< Maximum value */
GStrv labels; /**< value labels */
} EffectValues;
typedef struct {
gchar *label; /**< Parameter name */
guint id; /**< ID (to set parameter) */
guint position; /**< position */
EffectValues *values; /**< valid parameter values */
} EffectSettings;
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;
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 position; /**< position */
EffectGroup *group; /**< possible effect types */
gint group_amt; /**< possible effect types length */
} Effect;
typedef struct {
gchar *label; /**< base effect name */
Effect *effect; /**< list of supported effects */
gint amt; /**< list of supported effects length */
} EffectList;
typedef struct {
EffectGroup *group;
gint group_amt;
} ModifierGroup;
typedef struct {
gchar *name;
EffectList *list;
int n_list;
} SupportedDevices;
ModifierGroup *modifier_linkable_list();
void modifier_group_free(ModifierGroup *modifier_group);
gboolean get_effect_list(unsigned char device_id, unsigned char family_id,
unsigned char product_id,
EffectList **list, int *n_list);
#endif /* GDIGI_EFFECTS_H */

1441
gdigi.c

File diff suppressed because it is too large Load Diff

934
gdigi.h

File diff suppressed because it is too large Load Diff

919
gtkknob.c Normal file
View File

@@ -0,0 +1,919 @@
/*****************************************************************************
*
* Most of this code comes from gAlan 0.2.0, copyright (C) 1999
* Tony Garnock-Jones, with modifications from Sean Bolton,
* copyright (C) 2004, William Weston copyright (C) 2007,
* Pete Shorthose copyright (C) 2007, and Tomasz Moń,
* copyright (C) 2009
*
* 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; either version 2
* of the License, or (at your option) any later version.
*
* 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, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*****************************************************************************/
#include <math.h>
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
#include "gtkknob.h"
#ifndef M_PI
# define M_PI 3.14159265358979323846 /* pi */
#endif
#ifndef M_1_PI
# define M_1_PI 0.31830988618379067154 /* 1/pi */
#endif
#define SCROLL_DELAY_LENGTH 250
#define KNOB_SIZE 32 /* this should really be read from the knob image */
#define STATE_IDLE 0
#define STATE_PRESSED 1
#define STATE_DRAGGING 2
static void gtk_knob_class_init(GtkKnobClass *klass);
static void gtk_knob_init(GtkKnob *knob);
static void gtk_knob_destroy(GtkObject *object);
static void gtk_knob_realize(GtkWidget *widget);
static void gtk_knob_size_request(GtkWidget *widget, GtkRequisition *requisition);
static void gtk_knob_size_allocate(GtkWidget *widget, GtkAllocation *allocation);
static gint gtk_knob_expose(GtkWidget *widget, GdkEventExpose *event);
static gint gtk_knob_scroll(GtkWidget *widget, GdkEventScroll *event);
static gint gtk_knob_button_press(GtkWidget *widget, GdkEventButton *event);
static gint gtk_knob_button_release(GtkWidget *widget, GdkEventButton *event);
static gint gtk_knob_key_press(GtkWidget *widget, GdkEventKey *event);
static gint gtk_knob_motion_notify(GtkWidget *widget, GdkEventMotion *event);
static gint gtk_knob_timer(GtkKnob *knob);
static void gtk_knob_update_mouse_update(GtkKnob *knob);
static void gtk_knob_update_mouse(GtkKnob *knob, gint x, gint y, gboolean step);
static void gtk_knob_update(GtkKnob *knob);
static void gtk_knob_adjustment_changed(GtkAdjustment *adjustment, gpointer data);
static void gtk_knob_adjustment_value_changed(GtkAdjustment *adjustment, gpointer data);
/* Local data */
static GtkWidgetClass *parent_class = NULL;
/*****************************************************************************
*
* gtk_knob_get_type()
*
*****************************************************************************/
GType
gtk_knob_get_type(void) {
static GType knob_type = 0;
if (!knob_type) {
static const GTypeInfo knob_info = {
sizeof (GtkKnobClass),
NULL,
NULL,
(GClassInitFunc) gtk_knob_class_init,
NULL,
NULL,
sizeof (GtkKnob),
0,
(GInstanceInitFunc) gtk_knob_init,
};
knob_type = g_type_register_static (GTK_TYPE_WIDGET, "GtkKnob", &knob_info, 0);
}
return knob_type;
}
/*****************************************************************************
*
* gtk_knob_class_init()
*
*****************************************************************************/
static void
gtk_knob_class_init (GtkKnobClass *klass) {
GtkObjectClass *object_class;
GtkWidgetClass *widget_class;
object_class = (GtkObjectClass*) klass;
widget_class = (GtkWidgetClass*) klass;
parent_class = g_type_class_peek_parent(klass);
object_class->destroy = gtk_knob_destroy;
widget_class->realize = gtk_knob_realize;
widget_class->expose_event = gtk_knob_expose;
widget_class->size_request = gtk_knob_size_request;
widget_class->size_allocate = gtk_knob_size_allocate;
widget_class->scroll_event = gtk_knob_scroll;
widget_class->button_press_event = gtk_knob_button_press;
widget_class->button_release_event = gtk_knob_button_release;
widget_class->key_press_event = gtk_knob_key_press;
widget_class->motion_notify_event = gtk_knob_motion_notify;
}
/*****************************************************************************
*
* gtk_knob_init()
*
*****************************************************************************/
static void
gtk_knob_init (GtkKnob *knob) {
knob->policy = GTK_UPDATE_CONTINUOUS;
knob->state = STATE_IDLE;
knob->saved_x = 0;
knob->saved_y = 0;
knob->timer = 0;
knob->anim = NULL;
knob->mask = NULL;
knob->mask_gc = NULL;
knob->red_gc = NULL;
knob->old_value = 0.0;
knob->old_lower = 0.0;
knob->old_upper = 0.0;
knob->adjustment = NULL;
}
/*****************************************************************************
*
* gtk_knob_new()
*
*****************************************************************************/
GtkWidget *
gtk_knob_new(GtkAdjustment *adjustment, GtkKnobAnim *anim) {
GtkKnob *knob;
g_return_val_if_fail (anim != NULL, NULL);
g_return_val_if_fail (GDK_IS_PIXBUF (anim->pixbuf), NULL);
knob = g_object_new (gtk_knob_get_type (), NULL);
gtk_knob_set_animation (knob, anim);
if (!adjustment) {
adjustment = (GtkAdjustment*) gtk_adjustment_new (0.0, 0.0, 0.0,
0.0, 0.0, 0.0);
}
gtk_knob_set_adjustment (knob, adjustment);
return GTK_WIDGET (knob);
}
/*****************************************************************************
*
* gtk_knob_destroy()
*
*****************************************************************************/
static void
gtk_knob_destroy(GtkObject *object) {
GtkKnob *knob;
g_return_if_fail (object != NULL);
g_return_if_fail (GTK_IS_KNOB (object));
knob = GTK_KNOB (object);
gtk_knob_set_adjustment (knob, NULL);
/* FIXME: needs ref counting for automatic GtkKnobAnim cleanup
if (knob->anim) {
gtk_knob_anim_unref (knob->anim);
knob->anim = NULL;
}
*/
if (knob->mask) {
g_object_unref (knob->mask);
knob->mask = NULL;
}
if (knob->mask_gc) {
g_object_unref (knob->mask_gc);
knob->mask_gc = NULL;
}
if (knob->red_gc) {
g_object_unref (knob->red_gc);
knob->red_gc = NULL;
}
if (GTK_OBJECT_CLASS (parent_class)->destroy) {
(*GTK_OBJECT_CLASS (parent_class)->destroy) (object);
}
}
/*****************************************************************************
*
* gtk_knob_get_adjustment()
*
*****************************************************************************/
GtkAdjustment*
gtk_knob_get_adjustment(GtkKnob *knob) {
g_return_val_if_fail (knob != NULL, NULL);
g_return_val_if_fail (GTK_IS_KNOB (knob), NULL);
return knob->adjustment;
}
/*****************************************************************************
*
* gtk_knob_set_update_policy()
*
*****************************************************************************/
void
gtk_knob_set_update_policy(GtkKnob *knob, GtkUpdateType policy) {
g_return_if_fail (knob != NULL);
g_return_if_fail (GTK_IS_KNOB (knob));
knob->policy = policy;
}
/*****************************************************************************
*
* gtk_knob_set_adjustment()
*
*****************************************************************************/
void
gtk_knob_set_adjustment(GtkKnob *knob, GtkAdjustment *adjustment) {
g_return_if_fail (knob != NULL);
g_return_if_fail (GTK_IS_KNOB (knob));
if (knob->adjustment) {
g_signal_handlers_disconnect_matched(knob->adjustment,
G_SIGNAL_MATCH_DATA,
0, 0, NULL, NULL,
knob);
g_object_unref (knob->adjustment);
}
knob->adjustment = adjustment;
if (adjustment) {
g_object_ref_sink (adjustment);
g_signal_connect (adjustment, "changed",
G_CALLBACK(gtk_knob_adjustment_changed),
knob);
g_signal_connect (adjustment, "value_changed",
G_CALLBACK(gtk_knob_adjustment_value_changed),
knob);
knob->old_value = adjustment->value;
knob->old_lower = adjustment->lower;
knob->old_upper = adjustment->upper;
gtk_knob_update (knob);
}
}
/*****************************************************************************
*
* gtk_knob_realize()
*
*****************************************************************************/
static void
gtk_knob_realize(GtkWidget *widget) {
GtkKnob *knob;
GdkWindowAttr attributes;
gint attributes_mask;
GdkColor color = { 0, 0xffff, 0, 0 };
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_KNOB (widget));
GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS);
knob = GTK_KNOB (widget);
attributes.x = widget->allocation.x;
attributes.y = widget->allocation.y;
attributes.width = widget->allocation.width;
attributes.height = widget->allocation.height;
attributes.wclass = GDK_INPUT_OUTPUT;
attributes.window_type = GDK_WINDOW_CHILD;
attributes.event_mask =
gtk_widget_get_events (widget) |
GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK |
GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK |
GDK_POINTER_MOTION_HINT_MASK;
attributes.visual = gtk_widget_get_visual (widget);
attributes.colormap = gtk_widget_get_colormap (widget);
attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
widget->window = gdk_window_new (widget->parent->window,
&attributes, attributes_mask);
widget->style = gtk_style_attach (widget->style, widget->window);
gdk_window_set_user_data (widget->window, widget);
gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL);
knob->mask_gc = gdk_gc_new (widget->window);
gdk_gc_copy (knob->mask_gc, widget->style->bg_gc[GTK_STATE_NORMAL]);
gdk_gc_set_clip_mask (knob->mask_gc, knob->mask);
knob->red_gc = gdk_gc_new (widget->window);
gdk_gc_copy (knob->red_gc, widget->style->bg_gc[GTK_STATE_NORMAL]);
gdk_colormap_alloc_color (attributes.colormap, &color, FALSE, TRUE);
gdk_gc_set_foreground (knob->red_gc, &color);
}
/*****************************************************************************
*
* gtk_knob_size_request()
*
*****************************************************************************/
static void
gtk_knob_size_request (GtkWidget *widget, GtkRequisition *requisition) {
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_KNOB (widget));
requisition->width = GTK_KNOB (widget)->width;
requisition->height = GTK_KNOB (widget)->height;
}
/*****************************************************************************
*
* gtk_knob_size_allocate()
*
*****************************************************************************/
static void
gtk_knob_size_allocate (GtkWidget *widget, GtkAllocation *allocation) {
GtkKnob *knob;
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_KNOB (widget));
g_return_if_fail (allocation != NULL);
widget->allocation = *allocation;
knob = GTK_KNOB (widget);
if (GTK_WIDGET_REALIZED (widget)) {
gdk_window_move_resize (widget->window,
allocation->x, allocation->y,
allocation->width, allocation->height);
}
}
/*****************************************************************************
*
* gtk_knob_expose()
*
*****************************************************************************/
static gint
gtk_knob_expose(GtkWidget *widget, GdkEventExpose *event) {
GtkKnob *knob;
gfloat dx, dy;
gint frames;
g_return_val_if_fail (widget != NULL, FALSE);
g_return_val_if_fail (GTK_IS_KNOB (widget), FALSE);
g_return_val_if_fail (event != NULL, FALSE);
g_return_val_if_fail (GTK_IS_ADJUSTMENT (GTK_KNOB (widget)->adjustment), FALSE);
if (event->count > 0)
return FALSE;
knob = GTK_KNOB (widget);
frames = ((knob->anim->width / knob->anim->frame_width) - 1);
dx = knob->adjustment->value - knob->adjustment->lower; /* value, from 0 */
dy = knob->adjustment->upper - knob->adjustment->lower; /* range */
dx = (int)(frames * dx / dy) * knob->width; /* check this for height != width */
gdk_draw_pixbuf (widget->window, knob->mask_gc, knob->anim->pixbuf,
dx, 0, 0, 0, knob->width, knob->height,
GDK_RGB_DITHER_NONE, 0, 0);
if (GTK_WIDGET_HAS_FOCUS(widget)) {
gtk_paint_focus (widget->style, widget->window, widget->state,
NULL, widget, NULL, 0, 0,
widget->allocation.width, widget->allocation.height);
}
return FALSE;
}
/*****************************************************************************
*
* gtk_knob_scroll()
*
*****************************************************************************/
static gint
gtk_knob_scroll(GtkWidget *widget, GdkEventScroll *event) {
GtkKnob *knob;
g_return_val_if_fail (widget != NULL, FALSE);
g_return_val_if_fail (GTK_IS_KNOB (widget), FALSE);
g_return_val_if_fail (event != NULL, FALSE);
g_return_val_if_fail (GTK_IS_ADJUSTMENT (GTK_KNOB (widget)->adjustment), FALSE);
knob = GTK_KNOB (widget);
switch (event->direction) {
case GDK_SCROLL_UP:
knob->adjustment->value += knob->adjustment->step_increment;
g_signal_emit_by_name (knob->adjustment, "value_changed");
break;
case GDK_SCROLL_DOWN:
knob->adjustment->value -= knob->adjustment->step_increment;
g_signal_emit_by_name (knob->adjustment, "value_changed");
break;
default:
break;
}
return FALSE;
}
/*****************************************************************************
*
* gtk_knob_button_press()
*
*****************************************************************************/
static gint
gtk_knob_button_press(GtkWidget *widget, GdkEventButton *event) {
GtkKnob *knob;
g_return_val_if_fail (widget != NULL, FALSE);
g_return_val_if_fail (GTK_IS_KNOB (widget), FALSE);
g_return_val_if_fail (event != NULL, FALSE);
g_return_val_if_fail (GTK_IS_ADJUSTMENT (GTK_KNOB (widget)->adjustment), FALSE);
knob = GTK_KNOB (widget);
switch (knob->state) {
case STATE_IDLE:
switch (event->button) {
case 1:
case 3:
if (!GTK_WIDGET_HAS_FOCUS(widget))
gtk_widget_grab_focus(widget);
knob->state = STATE_PRESSED;
knob->saved_x = event->x;
knob->saved_y = event->y;
break;
case 2:
knob->adjustment->value = floor ((knob->adjustment->lower +
knob->adjustment->upper + 1.0)
* 0.5);
g_signal_emit_by_name (knob->adjustment, "value_changed");
break;
}
break;
}
return FALSE;
}
/*****************************************************************************
*
* gtk_knob_button_release()
*
*****************************************************************************/
static gint
gtk_knob_button_release(GtkWidget *widget, GdkEventButton *event) {
GtkKnob *knob;
g_return_val_if_fail (widget != NULL, FALSE);
g_return_val_if_fail (GTK_IS_KNOB (widget), FALSE);
g_return_val_if_fail (event != NULL, FALSE);
g_return_val_if_fail (GTK_IS_ADJUSTMENT (GTK_KNOB (widget)->adjustment), FALSE);
knob = GTK_KNOB (widget);
switch (knob->state) {
case STATE_PRESSED:
knob->state = STATE_IDLE;
break;
case STATE_DRAGGING:
knob->state = STATE_IDLE;
switch (event->button) {
case 1:
case 3:
if (knob->policy != GTK_UPDATE_CONTINUOUS
&& knob->old_value != knob->adjustment->value)
{
g_signal_emit_by_name (knob->adjustment, "value_changed");
}
break;
}
break;
}
return FALSE;
}
static gint gtk_knob_key_press(GtkWidget *widget, GdkEventKey *event)
{
GtkKnob *knob;
g_return_val_if_fail (widget != NULL, FALSE);
g_return_val_if_fail (GTK_IS_KNOB (widget), FALSE);
g_return_val_if_fail (event != NULL, FALSE);
g_return_val_if_fail (GTK_IS_ADJUSTMENT (GTK_KNOB (widget)->adjustment), FALSE);
knob = GTK_KNOB (widget);
switch (event->keyval) {
case GDK_Up:
if (GTK_WIDGET_HAS_FOCUS (widget))
{
gtk_adjustment_set_value (knob->adjustment,
knob->old_value + knob->adjustment->step_increment);
return TRUE;
}
return FALSE;
case GDK_Down:
if (GTK_WIDGET_HAS_FOCUS (widget))
{
gtk_adjustment_set_value (knob->adjustment,
knob->old_value - knob->adjustment->step_increment);
return TRUE;
}
return FALSE;
default:
break;
}
return GTK_WIDGET_CLASS (parent_class)->key_press_event (widget, event);
}
/*****************************************************************************
*
* gtk_knob_motion_notify()
*
*****************************************************************************/
static gint
gtk_knob_motion_notify(GtkWidget *widget, GdkEventMotion *event) {
GtkKnob *knob;
GdkModifierType mods;
gint x, y;
g_return_val_if_fail (widget != NULL, FALSE);
g_return_val_if_fail (GTK_IS_KNOB (widget), FALSE);
g_return_val_if_fail (event != NULL, FALSE);
knob = GTK_KNOB (widget);
x = event->x;
y = event->y;
if (event->is_hint || (event->window != widget->window)) {
gdk_window_get_pointer (widget->window, &x, &y, &mods);
}
switch (knob->state) {
case STATE_PRESSED:
knob->state = STATE_DRAGGING;
/* fall through */
case STATE_DRAGGING:
if (mods & GDK_BUTTON1_MASK) {
gtk_knob_update_mouse (knob, x, y, TRUE);
return TRUE;
}
else if (mods & GDK_BUTTON3_MASK) {
gtk_knob_update_mouse (knob, x, y, FALSE);
return TRUE;
}
break;
}
return FALSE;
}
/*****************************************************************************
*
* gtk_knob_timer()
*
*****************************************************************************/
static gint
gtk_knob_timer(GtkKnob *knob) {
g_return_val_if_fail (knob != NULL, FALSE);
g_return_val_if_fail (GTK_IS_KNOB (knob), FALSE);
g_return_val_if_fail (GTK_IS_ADJUSTMENT (knob->adjustment), FALSE);
if (knob->policy == GTK_UPDATE_DELAYED) {
g_signal_emit_by_name (knob->adjustment, "value_changed");
}
/* don't keep running this timer */
return FALSE;
}
/*****************************************************************************
*
* gtk_knob_update_mouse_update()
*
*****************************************************************************/
static void
gtk_knob_update_mouse_update(GtkKnob *knob) {
g_return_if_fail(GTK_IS_ADJUSTMENT (knob->adjustment));
if (knob->policy == GTK_UPDATE_CONTINUOUS) {
g_signal_emit_by_name (knob->adjustment, "value_changed");
}
else {
gtk_widget_queue_draw (GTK_WIDGET (knob));
if (knob->policy == GTK_UPDATE_DELAYED) {
if (knob->timer) {
g_source_remove (knob->timer);
}
knob->timer = g_timeout_add (SCROLL_DELAY_LENGTH,
(GSourceFunc) gtk_knob_timer,
(gpointer) knob);
}
}
}
/*****************************************************************************
*
* gtk_knob_update_mouse()
*
*****************************************************************************/
static void
gtk_knob_update_mouse(GtkKnob *knob, gint x, gint y, gboolean step) {
gfloat old_value, new_value, dv, dh;
gfloat angle;
g_return_if_fail (knob != NULL);
g_return_if_fail (GTK_IS_KNOB (knob));
g_return_if_fail (GTK_IS_ADJUSTMENT (knob->adjustment));
old_value = knob->adjustment->value;
angle = atan2f (-y + (knob->height >> 1), x - (knob->width >> 1));
/* inverted cartesian graphics coordinate system */
dv = knob->saved_y - y;
dh = x - knob->saved_x;
knob->saved_x = x;
knob->saved_y = y;
if ((x >= 0) && (x <= knob->width)) {
dh = 0; /* dead zone */
} else {
angle = cosf (angle);
dh *= angle * angle;
}
new_value = knob->adjustment->value +
dv * (step ? knob->adjustment->step_increment : knob->adjustment->page_increment) +
dh * (knob->adjustment->upper -
knob->adjustment->lower) * 0.005; /* 0.005 == (1 / 200) */
new_value = MAX (MIN (new_value, knob->adjustment->upper),
knob->adjustment->lower);
knob->adjustment->value = new_value;
if (knob->adjustment->value != old_value) {
gtk_knob_update_mouse_update (knob);
}
}
/*****************************************************************************
*
* gtk_knob_update()
*
*****************************************************************************/
static void
gtk_knob_update(GtkKnob *knob) {
gfloat new_value;
g_return_if_fail (knob != NULL);
g_return_if_fail (GTK_IS_KNOB (knob));
g_return_if_fail (GTK_IS_ADJUSTMENT (knob->adjustment));
if (knob->adjustment->step_increment == 1) {
new_value = floor (knob->adjustment->value + 0.5);
}
else {
new_value = knob->adjustment->value;
}
if (new_value < knob->adjustment->lower) {
new_value = knob->adjustment->lower;
}
if (new_value > knob->adjustment->upper) {
new_value = knob->adjustment->upper;
}
if (new_value != knob->adjustment->value) {
knob->adjustment->value = new_value;
g_signal_emit_by_name (knob->adjustment, "value_changed");
}
gtk_widget_queue_draw (GTK_WIDGET (knob));
}
/*****************************************************************************
*
* gtk_knob_adjustment_changed()
*
*****************************************************************************/
static void
gtk_knob_adjustment_changed(GtkAdjustment *adjustment, gpointer data) {
GtkKnob *knob;
g_return_if_fail (adjustment != NULL);
g_return_if_fail (data != NULL);
knob = GTK_KNOB (data);
if ((knob->old_value != adjustment->value) ||
(knob->old_lower != adjustment->lower) ||
(knob->old_upper != adjustment->upper))
{
gtk_knob_update (knob);
knob->old_value = adjustment->value;
knob->old_lower = adjustment->lower;
knob->old_upper = adjustment->upper;
}
}
/*****************************************************************************
*
* gtk_knob_adjustment_value_changed()
*
*****************************************************************************/
static void
gtk_knob_adjustment_value_changed (GtkAdjustment *adjustment, gpointer data) {
GtkKnob *knob;
g_return_if_fail (adjustment != NULL);
g_return_if_fail (data != NULL);
knob = GTK_KNOB (data);
if (knob->old_value != adjustment->value) {
gtk_knob_update (knob);
knob->old_value = adjustment->value;
}
}
/*****************************************************************************
*
* gtk_knob_set_animation()
*
*****************************************************************************/
void
gtk_knob_set_animation (GtkKnob *knob, GtkKnobAnim *anim) {
g_return_if_fail (knob != NULL);
g_return_if_fail (anim != NULL);
g_return_if_fail (GTK_IS_KNOB (knob));
g_return_if_fail (GDK_IS_PIXBUF (anim->pixbuf));
knob->anim = (GtkKnobAnim *)anim;
knob->width = anim->frame_width;
knob->height = anim->height;
if (GTK_WIDGET_REALIZED (knob)) {
gtk_widget_queue_resize (GTK_WIDGET (knob));
}
}
/*****************************************************************************
*
* gtk_knob_animation_new_from_file()
*
*****************************************************************************/
GtkKnobAnim *
gtk_knob_animation_new_from_file(gchar *filename) {
GtkKnobAnim *anim;
anim = gtk_knob_animation_new_from_file_full (filename, -1, -1, KNOB_SIZE);
return anim;
}
/*****************************************************************************
*
* gtk_knob_animation_new_from_inline()
*
*****************************************************************************/
GtkKnobAnim *
gtk_knob_animation_new_from_inline(const guint8 *pixbuf) {
GtkKnobAnim *anim = g_new0 (GtkKnobAnim, 1);
g_return_val_if_fail((pixbuf != NULL), NULL);
anim->pixbuf = gdk_pixbuf_new_from_inline(-1, pixbuf, FALSE, NULL);
if (anim->pixbuf == NULL) {
g_free(anim);
return NULL;
}
anim->height = gdk_pixbuf_get_height (anim->pixbuf);
anim->width = gdk_pixbuf_get_width (anim->pixbuf);
anim->frame_width = anim->height;
return anim;
}
/*****************************************************************************
*
* gtk_knob_new_from_file_full()
*
* frame_width: overrides the frame width (to make rectangular frames)
* but doesn't affect the image size width and height cause optional
* scaling if not set to -1 when they are derived from the native
* image size.
*
* FIXME: account for any problems where (width % frame_width != 0)
*
*****************************************************************************/
GtkKnobAnim *
gtk_knob_animation_new_from_file_full(gchar *filename, gint frame_width,
gint width, gint height) {
GtkKnobAnim *anim = g_new0 (GtkKnobAnim, 1);
g_return_val_if_fail ((filename != NULL), NULL);
GError *gerror = NULL;
#if GTK_MINOR_VERSION < 10
if (!(anim->pixbuf = gdk_pixbuf_new_from_file (filename, &gerror))) {
g_error_free(gerror);
gerror = NULL;
return NULL;
}
#else /* GTK_MINOR_VERSION >= 10 */
if (!(anim->pixbuf = gdk_pixbuf_new_from_file_at_size (filename, width,
height, &gerror))) {
g_error_free(gerror);
gerror = NULL;
return NULL;
}
#endif /* GTK_MINOR_VERSION < 10 */
else {
anim->height = gdk_pixbuf_get_height (anim->pixbuf);
anim->width = gdk_pixbuf_get_width (anim->pixbuf);
anim->frame_width = (frame_width != -1) ? frame_width : anim->height;
}
return anim;
}
/*****************************************************************************
*
* gtk_knob_animation_free()
*
*****************************************************************************/
void
gtk_knob_animation_free(GtkKnobAnim *anim) {
g_return_if_fail (anim != NULL);
if (anim->pixbuf)
g_object_unref (anim->pixbuf);
g_free (anim);
}

102
gtkknob.h Normal file
View File

@@ -0,0 +1,102 @@
/*****************************************************************************
*
* Most of this code comes from gAlan 0.2.0, copyright (C) 1999
* Tony Garnock-Jones, with modifications by Sean Bolton,
* copyright (C) 2004, and minor modifications by William Weston,
* copyright (C) 2007, Tomasz Moń, copyright (C) 2009
*
* 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; either version 2
* of the License, or (at your option) any later version.
*
* 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, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*****************************************************************************/
#ifndef __GTK_KNOB_H__
#define __GTK_KNOB_H__
#include <gtk/gtk.h>
#ifdef __cplusplus
extern "C" {
#endif
#define GTK_KNOB(obj) G_TYPE_CHECK_INSTANCE_CAST(obj, gtk_knob_get_type(), GtkKnob)
#define GTK_KNOB_CLASS(klass) G_TYPE_CHECK_CLASS_CAST(klass, gtk_knob_get_type(), GtkKnobClass)
#define GTK_IS_KNOB(obj) G_TYPE_CHECK_INSTANCE_TYPE(obj, gtk_knob_get_type())
typedef struct _GtkKnob GtkKnob;
typedef struct _GtkKnobClass GtkKnobClass;
typedef struct _GtkKnobAnim GtkKnobAnim;
/* better to make this an object and let widgets ref/deref it perhaps */
struct _GtkKnobAnim {
GdkPixbuf *pixbuf;
gint width; /* derived from image width */
gint height; /* derived from image height. */
gint frame_width; /* derived from pixbuf (width / height) or provided override for rectangular frames */
};
struct _GtkKnob {
GtkWidget widget;
/* update policy (GTK_UPDATE_[CONTINUOUS/DELAYED/DISCONTINUOUS]) */
guint policy : 2;
/* State of widget (to do with user interaction) */
guint8 state;
gint saved_x, saved_y;
/* ID of update timer, or 0 if none */
guint32 timer;
/* knob animation */
GtkKnobAnim *anim;
gint width, height;
GdkBitmap *mask;
GdkGC *mask_gc;
GdkGC *red_gc;
/* Old values from adjustment stored so we know when something changes */
gfloat old_value;
gfloat old_lower;
gfloat old_upper;
/* The adjustment object that stores the data for this knob */
GtkAdjustment *adjustment;
};
struct _GtkKnobClass {
GtkWidgetClass parent_class;
};
extern GtkWidget *gtk_knob_new(GtkAdjustment *adjustment, GtkKnobAnim *anim);
extern GType gtk_knob_get_type(void);
extern GtkAdjustment *gtk_knob_get_adjustment(GtkKnob *knob);
extern void gtk_knob_set_update_policy(GtkKnob *knob, GtkUpdateType policy);
extern void gtk_knob_set_adjustment(GtkKnob *knob, GtkAdjustment *adjustment);
GtkKnobAnim *gtk_knob_animation_new_from_inline(const guint8 *pixbuf);
GtkKnobAnim *gtk_knob_animation_new_from_file_full(gchar *filename,
gint frame_width,
gint width,
gint height);
GtkKnobAnim *gtk_knob_animation_new_from_file(gchar *filename);
void gtk_knob_set_animation (GtkKnob *knob, GtkKnobAnim *anim);
void gtk_knob_animation_free(GtkKnobAnim *anim);
#ifdef __cplusplus
}
#endif
#endif

1415
gui.c

File diff suppressed because it is too large Load Diff

13
gui.h
View File

@@ -14,4 +14,15 @@
* along with this program. If not, see <http://www.gnu.org/licenses>.
*/
void create_window();
#ifndef GDIGI_GUI_H
#define GDIGI_GUI_H
#include <glib.h>
#include "effects.h"
void show_error_message(GtkWidget *parent, gchar *message);
void gui_create(EffectList *list, int n_list);
void gui_free();
gboolean unsupported_device_dialog(EffectList **list, int *n_list);
#endif /* GDIGI_GUI_H */

BIN
knob.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

255
preset.c Normal file
View File

@@ -0,0 +1,255 @@
/*
* 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 <gio/gio.h>
#include <expat.h>
#include <string.h>
#include "preset.h"
#ifndef DOXYGEN_SHOULD_SKIP_THIS
enum {
PARSER_TYPE_NOT_SET = -1,
PARSER_TYPE_PRESET_NAME = 0,
PARSER_TYPE_PARAM_ID,
PARSER_TYPE_PARAM_POSITION,
PARSER_TYPE_PARAM_VALUE,
PARSER_TYPE_PARAM_NAME,
PARSER_TYPE_PARAM_TEXT
};
typedef struct {
int depth;
int id;
Preset *preset;
} AppData;
static void XMLCALL start(void *data, const char *el, const char **attr) {
AppData *ad = (AppData *) data;
ad->id = PARSER_TYPE_NOT_SET;
if (g_strcmp0(el, "Name") == 0) {
if (ad->depth == 1) {
ad->id = PARSER_TYPE_PRESET_NAME;
} else if (ad->depth == 3) {
ad->id = PARSER_TYPE_PARAM_NAME;
}
}
if (g_strcmp0(el, "Params") == 0) {
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;
ad->preset->params = g_list_prepend(ad->preset->params, param);
} else if (g_strcmp0(el, "ID") == 0) {
ad->id = PARSER_TYPE_PARAM_ID;
} else if (g_strcmp0(el, "Position") == 0) {
ad->id = PARSER_TYPE_PARAM_POSITION;
} else if (g_strcmp0(el, "Value") == 0) {
ad->id = PARSER_TYPE_PARAM_VALUE;
} else if (g_strcmp0(el, "Text") == 0) {
ad->id = PARSER_TYPE_PARAM_TEXT;
}
ad->depth++;
}
static void XMLCALL end(void *data, const char *el) {
AppData *ad = (AppData *) data;
ad->depth--;
ad->id = PARSER_TYPE_NOT_SET;
}
static void XMLCALL text_cb(void *data, const char* text, int len)
{
AppData *ad = (AppData *) data;
if ((ad == NULL) || (ad->preset == NULL))
return;
if (ad->id == PARSER_TYPE_PRESET_NAME) {
if (ad->preset->name != NULL)
g_free(ad->preset->name);
ad->preset->name = g_strndup(text, len);
}
if (ad->preset->params == NULL)
return;
SettingParam *param = (SettingParam *) ad->preset->params->data;
if (param == NULL)
return;
gchar *value = g_strndup(text, len);
switch (ad->id) {
case PARSER_TYPE_PARAM_ID:
param->id = atoi(value);
break;
case PARSER_TYPE_PARAM_POSITION:
param->position = atoi(value);
break;
case PARSER_TYPE_PARAM_VALUE:
param->value = atoi(value);
break;
}
g_free(value);
}
#endif /* DOXYGEN_SHOULD_SKIP_THIS */
/**
* \param filename valid path to file
* \param error return location for an error
*
* Tries to open file pointed by path, then parses it.
*
* \return Preset which must be freed using preset_free, or NULL on error.
**/
Preset *create_preset_from_xml_file(gchar *filename, GError **error)
{
GFile *file;
GError *err = NULL;
gchar *contents;
file = g_file_new_for_path(filename);
if (g_file_get_contents(filename, &contents, NULL, &err) == FALSE) {
g_message("Failed to get %s contents: %s", filename, err->message);
*error = g_error_copy(err);
g_error_free(err);
g_object_unref(file);
return NULL;
}
AppData *ad = g_slice_new(AppData);
ad->depth = 0;
ad->preset = g_slice_new(Preset);
ad->preset->name = NULL;
ad->preset->params = NULL;
ad->id = PARSER_TYPE_NOT_SET;
XML_Parser p;
p = XML_ParserCreate(NULL);
XML_SetUserData(p, (void *) ad);
XML_SetElementHandler(p, start, end);
XML_SetCharacterDataHandler(p, text_cb);
if (XML_Parse(p, contents, strlen(contents), XML_TRUE) != XML_STATUS_OK) {
g_set_error(error, 0, 0, "Parse error at line %d:\n%s",
(int)XML_GetCurrentLineNumber(p),
XML_ErrorString(XML_GetErrorCode(p)));
preset_free(ad->preset);
g_slice_free(AppData, ad);
g_free(contents);
g_object_unref(file);
return NULL;
}
Preset *preset = ad->preset;
preset->params = g_list_reverse(preset->params);
XML_ParserFree(p);
g_slice_free(AppData, ad);
g_free(contents);
g_object_unref(file);
return preset;
}
/**
* \param data unpacked RECEIVE_PRESET_PARAMETERS message
*
* Parses message
*
* \return Preset which must be freed using preset_free, or NULL on error.
**/
Preset *create_preset_from_data(GString *data)
{
gint total;
gint n;
gint id;
gint position;
guint value;
gint x;
gint tmp;
g_return_val_if_fail(data != NULL, NULL);
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;
}
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);
} while ((x < data->len) && n<total);
g_message("TOTAL %d", total);
preset->params = g_list_reverse(preset->params);
return preset;
}
/**
* \param preset preset to be freed
*
* Frees all memory used by preset.
**/
void preset_free(Preset *preset)
{
g_return_if_fail(preset != NULL);
if (preset->params != NULL) {
GList *iter;
for (iter = preset->params; iter; iter = iter->next) {
g_slice_free(SettingParam, iter->data);
}
g_list_free(preset->params);
}
if (preset->name != NULL)
g_free(preset->name);
g_slice_free(Preset, preset);
}

37
preset.h Normal file
View File

@@ -0,0 +1,37 @@
/*
* 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_PRESET_H
#define GDIGI_PRESET_H
#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);
void preset_free(Preset *preset);
#endif /* GDIGI_PRESET_H */

677
tests.c
View File

@@ -16,620 +16,629 @@
#include "gdigi.h"
void test_wah(struct usb_dev_handle *handle)
void test_wah()
{
int x;
set_wah_type(handle, WAH_TYPE_CRY);
set_option(WAH_TYPE, WAH_POSITION, WAH_TYPE_CRY);
for (x=0; x<=99; x++)
set_wah_min(handle, x);
set_option(WAH_MIN, WAH_POSITION_MIN_MAX, x);
for (x=0; x<=99; x++)
set_wah_max(handle, x);
set_option(WAH_MAX, WAH_POSITION_MIN_MAX, x);
for (x=0; x<=12; x++)
set_wah_level(handle, x);
set_option(WAH_LEVEL, WAH_POSITION, x);
set_wah_type(handle, WAH_TYPE_FULLRANGE);
set_option(WAH_TYPE, WAH_POSITION, WAH_TYPE_FULLRANGE);
for (x=0; x<=99; x++)
set_wah_min(handle, x);
set_option(WAH_MIN, WAH_POSITION_MIN_MAX, x);
for (x=0; x<=99; x++)
set_wah_max(handle, x);
set_option(WAH_MAX, WAH_POSITION_MIN_MAX, x);
for (x=0; x<=12; x++)
set_wah_level(handle, x);
set_option(WAH_LEVEL, WAH_POSITION, x);
set_wah_type(handle, WAH_TYPE_CLYDE);
set_option(WAH_TYPE, WAH_POSITION, WAH_TYPE_CLYDE);
for (x=0; x<=99; x++)
set_wah_min(handle, x);
set_option(WAH_MIN, WAH_POSITION_MIN_MAX, x);
for (x=0; x<=99; x++)
set_wah_max(handle, x);
set_option(WAH_MAX, WAH_POSITION_MIN_MAX, x);
for (x=0; x<=12; x++)
set_wah_level(handle, x);
set_option(WAH_LEVEL, WAH_POSITION, x);
set_wah_on_off(handle, TRUE);
set_wah_on_off(handle, FALSE);
set_option(WAH_ON_OFF, WAH_POSITION, 1);
set_option(WAH_ON_OFF, WAH_POSITION, 0);
}
void test_compressor(struct usb_dev_handle *handle)
void test_compressor()
{
int x;
set_comp_type(handle, COMP_TYPE_DIGI);
set_option(COMP_TYPE, COMP_POSITION, COMP_TYPE_DIGI);
for (x=0; x<=99; x++)
set_comp_sustain(handle, x);
set_option(COMP_SUSTAIN, COMP_POSITION, x);
for (x=0; x<=99; x++)
set_comp_tone(handle, x);
set_option(COMP_TONE, COMP_POSITION, x);
for (x=0; x<=99; x++)
set_comp_attack(handle, x);
set_option(COMP_ATTACK, COMP_POSITION, x);
for (x=0; x<=99; x++)
set_comp_level(handle, x);
set_option(COMP_LEVEL, COMP_POSITION, x);
set_comp_type(handle, COMP_TYPE_CS);
set_option(COMP_TYPE, COMP_POSITION, COMP_TYPE_CS);
for (x=0; x<=99; x++)
set_comp_sustain(handle, x);
set_option(COMP_SUSTAIN, COMP_POSITION, x);
for (x=0; x<=99; x++)
set_comp_attack(handle, x);
set_option(COMP_ATTACK, COMP_POSITION, x);
for (x=0; x<=99; x++)
set_comp_level(handle, x);
set_option(COMP_LEVEL, COMP_POSITION, x);
set_comp_on_off(handle, TRUE);
set_comp_on_off(handle, FALSE);
set_option(COMP_ON_OFF, COMP_POSITION, 1);
set_option(COMP_ON_OFF, COMP_POSITION, 0);
}
void test_dist(struct usb_dev_handle *handle)
void test_dist()
{
int x;
set_dist_type(handle, DIST_TYPE_SCREAMER);
set_option(DIST_TYPE, DIST_POSITION, DIST_TYPE_SCREAMER);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_SCREAMER_DRIVE, x);
set_option(DIST_SCREAMER_DRIVE, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_SCREAMER_TONE, x);
set_option(DIST_SCREAMER_TONE, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_SCREAMER_LVL, x);
set_option(DIST_SCREAMER_LVL, DIST_POSITION, x);
set_dist_type(handle, DIST_TYPE_808);
set_option(DIST_TYPE, DIST_POSITION, DIST_TYPE_808);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_808_OVERDRIVE, x);
set_option(DIST_808_OVERDRIVE, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_808_TONE, x);
set_option(DIST_808_TONE, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_808_LVL, x);
set_option(DIST_808_LVL, DIST_POSITION, x);
set_dist_type(handle, DIST_TYPE_GUYOD);
set_option(DIST_TYPE, DIST_POSITION, DIST_TYPE_GUYOD);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_GUYOD_DRIVE, x);
set_option(DIST_GUYOD_DRIVE, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_GUYOD_LVL, x);
set_option(DIST_GUYOD_LVL, DIST_POSITION, x);
set_dist_type(handle, DIST_TYPE_DOD250);
set_option(DIST_TYPE, DIST_POSITION, DIST_TYPE_DOD250);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_DOD250_GAIN, x);
set_option(DIST_DOD250_GAIN, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_DOD250_LVL, x);
set_option(DIST_DOD250_LVL, DIST_POSITION, x);
set_dist_type(handle, DIST_TYPE_RODENT);
set_option(DIST_TYPE, DIST_POSITION, DIST_TYPE_RODENT);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_RODENT_DIST, x);
set_option(DIST_RODENT_DIST, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_RODENT_FILTER, x);
set_option(DIST_RODENT_FILTER, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_RODENT_LVL, x);
set_option(DIST_RODENT_LVL, DIST_POSITION, x);
set_dist_type(handle, DIST_TYPE_MX);
set_option(DIST_TYPE, DIST_POSITION, DIST_TYPE_MX);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_MX_DIST, x);
set_option(DIST_MX_DIST, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_MX_OUTPUT, x);
set_option(DIST_MX_OUTPUT, DIST_POSITION, x);
set_dist_type(handle, DIST_TYPE_DS);
set_option(DIST_TYPE, DIST_POSITION, DIST_TYPE_DS);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_DS_GAIN, x);
set_option(DIST_DS_GAIN, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_DS_TONE, x);
set_option(DIST_DS_TONE, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_DS_LVL, x);
set_option(DIST_DS_LVL, DIST_POSITION, x);
set_dist_type(handle, DIST_TYPE_GRUNGE);
set_option(DIST_TYPE, DIST_POSITION, DIST_TYPE_GRUNGE);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_GRUNGE_GRUNGE, x);
set_option(DIST_GRUNGE_GRUNGE, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_GRUNGE_FACE, x);
set_option(DIST_GRUNGE_FACE, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_GRUNGE_LOUD, x);
set_option(DIST_GRUNGE_LOUD, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_GRUNGE_BUTT, x);
set_option(DIST_GRUNGE_BUTT, DIST_POSITION, x);
set_dist_type(handle, DIST_TYPE_ZONE);
set_option(DIST_TYPE, DIST_POSITION, DIST_TYPE_ZONE);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_ZONE_GAIN, x);
set_option(DIST_ZONE_GAIN, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_ZONE_LOW, x);
set_option(DIST_ZONE_LOW, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_ZONE_MID_LVL, x);
set_option(DIST_ZONE_MID_LVL, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_ZONE_MID_FREQ, x);
set_option(DIST_ZONE_MID_FREQ, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_ZONE_HIGH, x);
set_option(DIST_ZONE_HIGH, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_ZONE_LEVEL, x);
set_option(DIST_ZONE_LEVEL, DIST_POSITION, x);
set_dist_type(handle, DIST_TYPE_DEATH);
set_option(DIST_TYPE, DIST_POSITION, DIST_TYPE_DEATH);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_DEATH_LOW, x);
set_option(DIST_DEATH_LOW, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_DEATH_MID, x);
set_option(DIST_DEATH_MID, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_DEATH_HIGH, x);
set_option(DIST_DEATH_HIGH, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_DEATH_LVL, x);
set_option(DIST_DEATH_LVL, DIST_POSITION, x);
set_dist_type(handle, DIST_TYPE_GONK);
set_option(DIST_TYPE, DIST_POSITION, DIST_TYPE_GONK);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_GONK_GONK, x);
set_option(DIST_GONK_GONK, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_GONK_SMEAR, x);
set_option(DIST_GONK_SMEAR, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_GONK_SUCK, x);
set_option(DIST_GONK_SUCK, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_GONK_HEAVE, x);
set_option(DIST_GONK_HEAVE, DIST_POSITION, x);
set_dist_type(handle, DIST_TYPE_FUZZY);
set_option(DIST_TYPE, DIST_POSITION, DIST_TYPE_FUZZY);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_FUZZY_FUZZ, x);
set_option(DIST_FUZZY_FUZZ, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_FUZZY_VOLUME, x);
set_option(DIST_FUZZY_VOLUME, DIST_POSITION, x);
set_dist_type(handle, DIST_TYPE_MP);
set_option(DIST_TYPE, DIST_POSITION, DIST_TYPE_MP);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_MP_SUSTAIN, x);
set_option(DIST_MP_SUSTAIN, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_MP_TONE, x);
set_option(DIST_MP_TONE, DIST_POSITION, x);
for (x=0; x<=99; x++)
set_dist_option(handle, DIST_MP_VOLUME, x);
set_option(DIST_MP_VOLUME, DIST_POSITION, x);
set_dist_on_off(handle, TRUE);
set_dist_on_off(handle, FALSE);
set_option(DIST_ON_OFF, DIST_POSITION, 1);
set_option(DIST_ON_OFF, DIST_POSITION, 0);
}
void test_presets(struct usb_dev_handle *handle)
void test_presets()
{
int x;
for (x=0; x<=60; x++)
switch_user_preset(handle, x);
switch_preset(PRESETS_USER, x);
for (x=0; x<=60; x++)
switch_system_preset(handle, x);
for (x=0; x<=99; x++)
set_preset_level(handle, x);
switch_preset(PRESETS_SYSTEM, x);
}
void test_pickups(struct usb_dev_handle *handle)
void test_pickups()
{
set_pickup_type(handle, PICKUP_TYPE_HB_SC);
set_pickup_type(handle, PICKUP_TYPE_SC_HB);
set_option(PICKUP_TYPE, PICKUP_POSITION, PICKUP_TYPE_HB_SC);
set_option(PICKUP_TYPE, PICKUP_POSITION, PICKUP_TYPE_SC_HB);
set_pickup_on_off(handle, TRUE);
set_pickup_on_off(handle, FALSE);
set_option(PICKUP_ON_OFF, PICKUP_POSITION, 1);
set_option(PICKUP_ON_OFF, PICKUP_POSITION, 0);
}
void test_eq(struct usb_dev_handle *handle)
void test_eq()
{
int x;
set_eq_type(handle, EQ_TYPE_BRIGHT);
set_eq_type(handle, EQ_TYPE_MIDBOOST);
set_eq_type(handle, EQ_TYPE_SCOOP);
set_eq_type(handle, EQ_TYPE_WARM);
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_eq_gain(handle, x);
set_option(AMP_GAIN, AMP_POSITION, x);
for (x=0; x<=99; x++)
set_eq_level(handle, x);
set_option(AMP_LEVEL, AMP_POSITION, x);
for (x=0; x<=0x18; x++)
set_eq_bass(handle, x);
set_option(EQ_BASS, EQ_POSITION, x);
for (x=0; x<=0x18; x++)
set_eq_mid(handle, x);
set_option(EQ_MID, EQ_POSITION, x);
for (x=0; x<=4700; x++)
set_eq_mid_hz(handle, x);
set_option(EQ_MID_HZ, EQ_POSITION, x);
for (x=0; x<=0x18; x++)
set_eq_treble(handle, x);
set_option(EQ_TREBLE, EQ_POSITION, x);
for (x=0; x<=7500; x++)
set_eq_treb_hz(handle, x);
set_option(EQ_TREBLE_HZ, EQ_POSITION, x);
set_eq_on_off(handle, TRUE);
set_eq_on_off(handle, FALSE);
set_option(EQ_ON_OFF, EQ_POSITION, 1);
set_option(EQ_ON_OFF, EQ_POSITION, 0);
}
void test_noisegate(struct usb_dev_handle *handle)
void test_noisegate()
{
int x;
set_noisegate_type(handle, NOISEGATE_GATE);
set_option(NOISEGATE_TYPE, NOISEGATE_POSITION, NOISEGATE_GATE);
for (x=0; x<=99; x++)
set_gate_option(handle, NOISEGATE_GATE_TRESHOLD, x);
set_option(NOISEGATE_GATE_TRESHOLD, NOISEGATE_POSITION, x);
for (x=0; x<=99; x++)
set_gate_option(handle, NOISEGATE_ATTACK, x);
set_option(NOISEGATE_ATTACK, NOISEGATE_POSITION, x);
for (x=0; x<=99; x++)
set_gate_option(handle, NOISEGATE_RELEASE, x);
set_option(NOISEGATE_RELEASE, NOISEGATE_POSITION, x);
for (x=0; x<=99; x++)
set_gate_option(handle, NOISEGATE_ATTN, x);
set_option(NOISEGATE_ATTN, NOISEGATE_POSITION, x);
set_noisegate_type(handle, NOISEGATE_SWELL);
set_option(NOISEGATE_TYPE, NOISEGATE_POSITION, NOISEGATE_SWELL);
for (x=0; x<=99; x++)
set_gate_option(handle, NOISEGATE_SWELL_SENS, x);
set_option(NOISEGATE_SWELL_SENS, NOISEGATE_POSITION, x);
for (x=0; x<=99; x++)
set_gate_option(handle, NOISEGATE_ATTACK, x);
set_option(NOISEGATE_ATTACK, NOISEGATE_POSITION, x);
for (x=0; x<=99; x++)
set_gate_option(handle, NOISEGATE_RELEASE, x);
set_option(NOISEGATE_RELEASE, NOISEGATE_POSITION, x);
for (x=0; x<=99; x++)
set_gate_option(handle, NOISEGATE_ATTN, x);
set_option(NOISEGATE_ATTN, NOISEGATE_POSITION, x);
set_noisegate_on_off(handle, TRUE);
set_noisegate_on_off(handle, FALSE);
set_option(NOISEGATE_ON_OFF, NOISEGATE_POSITION, 1);
set_option(NOISEGATE_ON_OFF, NOISEGATE_POSITION, 0);
}
void test_chorusfx(struct usb_dev_handle *handle)
void test_chorusfx()
{
int x;
set_chorusfx_type(handle, CHORUS_TYPE_CE);
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_CE);
for (x=0; x<=99; x++)
set_chorusfx_option(handle, CE_CHORUS_SPEED, x);
set_option(CE_CHORUS_SPEED, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_chorusfx_option(handle, CE_CHORUS_DEPTH, x);
set_option(CE_CHORUS_DEPTH, CHORUSFX_POSITION, x);
set_chorusfx_type(handle, CHORUS_TYPE_DUAL);
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_DUAL);
for (x=0; x<=99; x++)
set_chorusfx_option(handle, DUAL_CHORUS_SPEED, x);
set_option(DUAL_CHORUS_SPEED, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_chorusfx_option(handle, DUAL_CHORUS_DEPTH, x);
set_option(DUAL_CHORUS_DEPTH, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_chorusfx_option(handle, DUAL_CHORUS_LEVEL, x);
set_chorusfx_option(handle, DUAL_CHORUS_WAVE, WAVE_TRI);
set_chorusfx_option(handle, DUAL_CHORUS_WAVE, WAVE_SINE);
set_chorusfx_option(handle, DUAL_CHORUS_WAVE, WAVE_SQUARE);
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_chorusfx_type(handle, CHORUS_TYPE_MULTI);
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_MULTI);
for (x=0; x<=99; x++)
set_chorusfx_option(handle, MULTI_CHORUS_SPEED, x);
set_option(MULTI_CHORUS_SPEED, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_chorusfx_option(handle, MULTI_CHORUS_DEPTH, x);
set_option(MULTI_CHORUS_DEPTH, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_chorusfx_option(handle, MULTI_CHORUS_LEVEL, x);
set_chorusfx_option(handle, MULTI_CHORUS_WAVE, WAVE_TRI);
set_chorusfx_option(handle, MULTI_CHORUS_WAVE, WAVE_SINE);
set_chorusfx_option(handle, MULTI_CHORUS_WAVE, WAVE_SQUARE);
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_chorusfx_type(handle, CHORUS_TYPE_FLANGER);
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_FLANGER);
for (x=0; x<=99; x++)
set_flanger_option(handle, FLANGER_SPEED, x);
set_option(FLANGER_SPEED, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_flanger_option(handle, FLANGER_DEPTH, x);
set_option(FLANGER_DEPTH, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_flanger_option(handle, FLANGER_REGEN, x);
set_option(FLANGER_REGEN, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_flanger_option(handle, FLANGER_LEVEL, x);
set_flanger_option(handle, FLANGER_WAVE, WAVE_TRI);
set_flanger_option(handle, FLANGER_WAVE, WAVE_SINE);
set_flanger_option(handle, FLANGER_WAVE, WAVE_SQUARE);
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_chorusfx_type(handle, CHORUS_TYPE_MXR_FLANGER);
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_MXR_FLANGER);
for (x=0; x<=99; x++)
set_flanger_option(handle, MXR_FLANGER_SPEED, x);
set_option(MXR_FLANGER_SPEED, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_flanger_option(handle, MXR_FLANGER_WIDTH, x);
set_option(MXR_FLANGER_WIDTH, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_flanger_option(handle, MXR_FLANGER_REGEN, x);
set_option(MXR_FLANGER_REGEN, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_flanger_option(handle, MXR_FLANGER_MANUAL, x);
set_option(MXR_FLANGER_MANUAL, CHORUSFX_POSITION, x);
set_chorusfx_type(handle, CHORUS_TYPE_PHASER);
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_PHASER);
for (x=0; x<=99; x++)
set_flanger_option(handle, PHASER_SPEED, x);
set_option(PHASER_SPEED, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_flanger_option(handle, PHASER_DEPTH, x);
set_option(PHASER_DEPTH, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_flanger_option(handle, PHASER_REGEN, x);
set_option(PHASER_REGEN, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_flanger_option(handle, PHASER_LEVEL, x);
set_flanger_option(handle, PHASER_WAVE, WAVE_TRI);
set_flanger_option(handle, PHASER_WAVE, WAVE_SINE);
set_flanger_option(handle, PHASER_WAVE, WAVE_SQUARE);
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_chorusfx_type(handle, CHORUS_TYPE_VIBRATO);
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_VIBRATO);
for (x=0; x<=99; x++)
set_vibrato_option(handle, VIBRATO_SPEED, x);
set_option(VIBRATO_SPEED, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_vibrato_option(handle, VIBRATO_DEPTH, x);
set_option(VIBRATO_DEPTH, CHORUSFX_POSITION, x);
set_chorusfx_type(handle, CHORUS_TYPE_ROTARY);
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_ROTARY);
for (x=0; x<=99; x++)
set_vibrato_option(handle, ROTARY_SPEED, x);
set_option(ROTARY_SPEED, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_vibrato_option(handle, ROTARY_INTENSITY, x);
set_option(ROTARY_INTENSITY, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_vibrato_option(handle, ROTARY_DOPPLER, x);
set_option(ROTARY_DOPPLER, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_vibrato_option(handle, ROTARY_CROSSOVER, x);
set_option(ROTARY_CROSSOVER, CHORUSFX_POSITION, x);
set_chorusfx_type(handle, CHORUS_TYPE_VIBROPAN);
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_VIBROPAN);
for (x=0; x<=99; x++)
set_vibrato_option(handle, VIBROPAN_SPEED, x);
set_option(VIBROPAN_SPEED, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_vibrato_option(handle, VIBROPAN_DEPTH, x);
set_option(VIBROPAN_DEPTH, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_vibrato_option(handle, VIBROPAN_VIBRA, x);
set_vibrato_option(handle, VIBROPAN_WAVE, WAVE_TRI);
set_vibrato_option(handle, VIBROPAN_WAVE, WAVE_SINE);
set_vibrato_option(handle, VIBROPAN_WAVE, WAVE_SQUARE);
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_chorusfx_type(handle, CHORUS_TYPE_TREMOLO);
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_TREMOLO);
for (x=0; x<=99; x++)
set_tremolo_option(handle, TREMOLO_SPEED, x);
set_option(TREMOLO_SPEED, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_tremolo_option(handle, TREMOLO_DEPTH, x);
set_tremolo_option(handle, TREMOLO_WAVE, WAVE_TRI);
set_tremolo_option(handle, TREMOLO_WAVE, WAVE_SINE);
set_tremolo_option(handle, TREMOLO_WAVE, WAVE_SQUARE);
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_chorusfx_type(handle, CHORUS_TYPE_PANNER);
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_PANNER);
for (x=0; x<=99; x++)
set_tremolo_option(handle, PANNER_SPEED, x);
set_option(PANNER_SPEED, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_tremolo_option(handle, PANNER_DEPTH, x);
set_tremolo_option(handle, PANNER_WAVE, WAVE_TRI);
set_tremolo_option(handle, PANNER_WAVE, WAVE_SINE);
set_tremolo_option(handle, PANNER_WAVE, WAVE_SQUARE);
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_chorusfx_type(handle, CHORUS_TYPE_ENVELOPE);
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_ENVELOPE);
for (x=0; x<=99; x++)
set_envelope_option(handle, ENVELOPE_SENSITIVITY, x);
set_option(ENVELOPE_SENSITIVITY, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_envelope_option(handle, ENVELOPE_RANGE, x);
set_option(ENVELOPE_RANGE, CHORUSFX_POSITION, x);
set_chorusfx_type(handle, CHORUS_TYPE_AUTOYA);
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_AUTOYA);
for (x=0; x<=99; x++)
set_ya_option(handle, AUTOYA_SPEED, x);
set_option(AUTOYA_SPEED, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_ya_option(handle, AUTOYA_INTENSITY, x);
set_option(AUTOYA_INTENSITY, CHORUSFX_POSITION, x);
for (x=0; x<=0x31; x++)
set_ya_option(handle, AUTOYA_RANGE, x);
set_option(AUTOYA_RANGE, CHORUSFX_POSITION, x);
set_chorusfx_type(handle, CHORUS_TYPE_YAYA);
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_YAYA);
for (x=0; x<=99; x++)
set_ya_option(handle, YAYA_PEDAL, x);
set_option(YAYA_PEDAL, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_ya_option(handle, YAYA_INTENSITY, x);
set_option(YAYA_INTENSITY, CHORUSFX_POSITION, x);
for (x=0; x<=0x31; x++)
set_ya_option(handle, YAYA_RANGE, x);
set_option(YAYA_RANGE, CHORUSFX_POSITION, x);
set_chorusfx_type(handle, CHORUS_TYPE_STEP_FILTER);
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_STEP_FILTER);
for (x=0; x<=99; x++)
set_filter_option(handle, STEP_FILTER_SPEED, x);
set_option(STEP_FILTER_SPEED, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_filter_option(handle, STEP_FILTER_INTENSITY, x);
set_option(STEP_FILTER_INTENSITY, CHORUSFX_POSITION, x);
set_chorusfx_type(handle, CHORUS_TYPE_WHAMMY);
set_whammy_option(handle, WHAMMY_AMOUNT, WHAMMY_OCT_UP);
set_whammy_option(handle, WHAMMY_AMOUNT, WHAMMY_2OCT_UP);
set_whammy_option(handle, WHAMMY_AMOUNT, WHAMMY_2ND_DN);
set_whammy_option(handle, WHAMMY_AMOUNT, WHAMMY_RV_2ND);
set_whammy_option(handle, WHAMMY_AMOUNT, WHAMMY_4TH_DN);
set_whammy_option(handle, WHAMMY_AMOUNT, WHAMMY_OCT_DN);
set_whammy_option(handle, WHAMMY_AMOUNT, WHAMMY_2OCT_DN);
set_whammy_option(handle, WHAMMY_AMOUNT, WHAMMY_DIV_BMB);
set_whammy_option(handle, WHAMMY_AMOUNT, WHAMMY_M3_MA);
set_whammy_option(handle, WHAMMY_AMOUNT, WHAMMY_2ND_MA3);
set_whammy_option(handle, WHAMMY_AMOUNT, WHAMMY_3RD_4TH);
set_whammy_option(handle, WHAMMY_AMOUNT, WHAMMY_4TH_5TH);
set_whammy_option(handle, WHAMMY_AMOUNT, WHAMMY_5TH_OCT);
set_whammy_option(handle, WHAMMY_AMOUNT, WHAMMY_HOCT_UP);
set_whammy_option(handle, WHAMMY_AMOUNT, WHAMMY_HOCT_DN);
set_whammy_option(handle, WHAMMY_AMOUNT, WHAMMY_OCT_UD);
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_whammy_option(handle, WHAMMY_PEDAL, x);
set_option(WHAMMY_PEDAL, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_whammy_option(handle, WHAMMY_MIX, x);
set_option(WHAMMY_MIX, CHORUSFX_POSITION, x);
set_chorusfx_type(handle, CHORUS_TYPE_PITCH_SHIFT);
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_PITCH_SHIFT);
for (x=0; x<=0x30; x++)
set_pitch_option(handle, PITCH_AMOUNT, x);
set_option(PITCH_AMOUNT, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_pitch_option(handle, PITCH_MIX, x);
set_option(PITCH_MIX, CHORUSFX_POSITION, x);
set_chorusfx_type(handle, CHORUS_TYPE_DETUNE);
set_option(CHORUSFX_TYPE, CHORUSFX_POSITION, CHORUS_TYPE_DETUNE);
for (x=0; x<=0x30; x++)
set_pitch_option(handle, DETUNE_AMOUNT, x);
set_option(DETUNE_AMOUNT, CHORUSFX_POSITION, x);
for (x=0; x<=99; x++)
set_pitch_option(handle, DETUNE_LEVEL, x);
set_option(DETUNE_LEVEL, CHORUSFX_POSITION, x);
set_chorusfx_type(handle, CHORUS_TYPE_IPS);
set_ips_option(handle, IPS_SHIFT_AMOUNT, IPS_OCT_D);
set_ips_option(handle, IPS_SHIFT_AMOUNT, IPS_7TH_DN);
set_ips_option(handle, IPS_SHIFT_AMOUNT, IPS_6TH_DN);
set_ips_option(handle, IPS_SHIFT_AMOUNT, IPS_5TH_DN);
set_ips_option(handle, IPS_SHIFT_AMOUNT, IPS_4TH_DN);
set_ips_option(handle, IPS_SHIFT_AMOUNT, IPS_3RD_DN);
set_ips_option(handle, IPS_SHIFT_AMOUNT, IPS_2ND_DN);
set_ips_option(handle, IPS_SHIFT_AMOUNT, IPS_2ND_UP);
set_ips_option(handle, IPS_SHIFT_AMOUNT, IPS_3RD_UP);
set_ips_option(handle, IPS_SHIFT_AMOUNT, IPS_4TH_UP);
set_ips_option(handle, IPS_SHIFT_AMOUNT, IPS_5TH_UP);
set_ips_option(handle, IPS_SHIFT_AMOUNT, IPS_6TH_UP);
set_ips_option(handle, IPS_SHIFT_AMOUNT, IPS_7TH_UP);
set_ips_option(handle, IPS_SHIFT_AMOUNT, IPS_OCT_U);
set_ips_option(handle, IPS_KEY, IPS_E);
set_ips_option(handle, IPS_KEY, IPS_F);
set_ips_option(handle, IPS_KEY, IPS_GB);
set_ips_option(handle, IPS_KEY, IPS_G);
set_ips_option(handle, IPS_KEY, IPS_AB);
set_ips_option(handle, IPS_KEY, IPS_A);
set_ips_option(handle, IPS_KEY, IPS_BB);
set_ips_option(handle, IPS_KEY, IPS_B);
set_ips_option(handle, IPS_KEY, IPS_C);
set_ips_option(handle, IPS_KEY, IPS_DD);
set_ips_option(handle, IPS_KEY, IPS_D);
set_ips_option(handle, IPS_KEY, IPS_EB);
set_ips_option(handle, IPS_SCALE, IPS_MAJOR);
set_ips_option(handle, IPS_SCALE, IPS_MINOR);
set_ips_option(handle, IPS_SCALE, IPS_DORIA);
set_ips_option(handle, IPS_SCALE, IPS_MIXLYD);
set_ips_option(handle, IPS_SCALE, IPS_LYDIAN);
set_ips_option(handle, IPS_SCALE, IPS_HMINO);
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_ips_option(handle, IPS_LEVEL, x);
set_option(IPS_LEVEL, CHORUSFX_POSITION, x);
set_chorusfx_on_off(handle, TRUE);
set_chorusfx_on_off(handle, FALSE);
set_option(CHORUSFX_ON_OFF, CHORUSFX_POSITION, 1);
set_option(CHORUSFX_ON_OFF, CHORUSFX_POSITION, 0);
}
void test_delay(struct usb_dev_handle *handle)
void test_delay()
{
int x;
set_delay_type(handle, DELAY_TYPE_ANALOG);
set_option(DELAY_TYPE, DELAY_POSITION, DELAY_TYPE_ANALOG);
for (x=0; x<=139; x++)
set_delay_time(handle, x);
set_option(DELAY_TIME, DELAY_POSITION, x);
for (x=0; x<=99; x++)
set_delay_option(handle, ANALOG_LEVEL, x);
set_option(ANALOG_LEVEL, DELAY_POSITION, x);
for (x=0; x<=100; x++)
set_delay_option(handle, ANALOG_REPEATS, x);
set_option(ANALOG_REPEATS, DELAY_POSITION, x);
set_delay_type(handle, DELAY_TYPE_DIGITAL);
set_option(DELAY_TYPE, DELAY_POSITION, DELAY_TYPE_DIGITAL);
for (x=0; x<=139; x++)
set_delay_time(handle, x);
set_option(DELAY_TIME, DELAY_POSITION, x);
for (x=0; x<=99; x++)
set_delay_option(handle, DIGITAL_LEVEL, x);
set_option(DIGITAL_LEVEL, DELAY_POSITION, x);
for (x=0; x<=100; x++)
set_delay_option(handle, DIGITAL_REPEATS, x);
set_option(DIGITAL_REPEATS, DELAY_POSITION, x);
for (x=0; x<=99; x++)
set_delay_option(handle, DIGITAL_DUCKER_THRESH, x);
set_option(DIGITAL_DUCKER_THRESH, DELAY_POSITION, x);
for (x=0; x<=99; x++)
set_delay_option(handle, DIGITAL_DUCKER_LEVEL, x);
set_option(DIGITAL_DUCKER_LEVEL, DELAY_POSITION, x);
set_delay_type(handle, DELAY_TYPE_MODULATED);
set_option(DELAY_TYPE, DELAY_POSITION, DELAY_TYPE_MODULATED);
for (x=0; x<=139; x++)
set_delay_time(handle, x);
set_option(DELAY_TIME, DELAY_POSITION, x);
for (x=0; x<=99; x++)
set_delay_option(handle, MODULATED_LEVEL, x);
set_option(MODULATED_LEVEL, DELAY_POSITION, x);
for (x=0; x<=100; x++)
set_delay_option(handle, MODULATED_REPEATS, x);
set_option(MODULATED_REPEATS, DELAY_POSITION, x);
for (x=0; x<=99; x++)
set_delay_option(handle, MODULATED_DEPTH, x);
set_option(MODULATED_DEPTH, DELAY_POSITION, x);
set_delay_type(handle, DELAY_TYPE_PONG);
set_option(DELAY_TYPE, DELAY_POSITION, DELAY_TYPE_PONG);
for (x=0; x<=139; x++)
set_delay_time(handle, x);
set_option(DELAY_TIME, DELAY_POSITION, x);
for (x=0; x<=99; x++)
set_delay_option(handle, PONG_LEVEL, x);
set_option(PONG_LEVEL, DELAY_POSITION, x);
for (x=0; x<=100; x++)
set_delay_option(handle, PONG_REPEATS, x);
set_option(PONG_REPEATS, DELAY_POSITION, x);
for (x=0; x<=99; x++)
set_delay_option(handle, PONG_DUCKER_THRESH, x);
set_option(PONG_DUCKER_THRESH, DELAY_POSITION, x);
for (x=0; x<=99; x++)
set_delay_option(handle, PONG_DUCKER_LEVEL, x);
set_option(PONG_DUCKER_LEVEL, DELAY_POSITION, x);
set_delay_type(handle, DELAY_TYPE_TAPE);
set_option(DELAY_TYPE, DELAY_POSITION, DELAY_TYPE_TAPE);
for (x=0; x<=139; x++)
set_delay_time(handle, x);
set_option(DELAY_TIME, DELAY_POSITION, x);
for (x=0; x<=99; x++)
set_delay_option(handle, TAPE_LEVEL, x);
set_option(TAPE_LEVEL, DELAY_POSITION, x);
for (x=0; x<=100; x++)
set_delay_option(handle, TAPE_REPEATS, x);
set_option(TAPE_REPEATS, DELAY_POSITION, x);
for (x=0; x<=99; x++)
set_delay_option(handle, TAPE_WOW, x);
set_option(TAPE_WOW, DELAY_POSITION, x);
for (x=0; x<=99; x++)
set_delay_option(handle, TAPE_FLUTTER, x);
set_option(TAPE_FLUTTER, DELAY_POSITION, x);
set_delay_on_off(handle, TRUE);
set_delay_on_off(handle, FALSE);
set_option(DELAY_ON_OFF, DELAY_POSITION, 1);
set_option(DELAY_ON_OFF, DELAY_POSITION, 0);
}
void test_reverb(struct usb_dev_handle *handle)
void test_reverb()
{
int x;
set_reverb_type(handle, REVERB_TYPE_TWIN);
set_option(REVERB_TYPE, REVERB_POSITION, REVERB_TYPE_TWIN);
for (x=0; x<=99; x++)
set_reverb_option(handle, TWIN_REVERB, x);
set_option(TWIN_REVERB, REVERB_POSITION, x);
set_reverb_type(handle, REVERB_TYPE_LEX_AMBIENCE);
set_option(REVERB_TYPE, REVERB_POSITION, REVERB_TYPE_LEX_AMBIENCE);
for (x=0; x<=15; x++)
set_reverb_option(handle, LEX_AMBIENCE_PREDELAY, x);
set_option(LEX_AMBIENCE_PREDELAY, REVERB_POSITION, x);
for (x=0; x<=99; x++)
set_reverb_option(handle, LEX_AMBIENCE_DECAY, x);
set_option(LEX_AMBIENCE_DECAY, REVERB_POSITION, x);
for (x=0; x<=99; x++)
set_reverb_option(handle, LEX_AMBIENCE_LIVELINESS, x);
set_option(LEX_AMBIENCE_LIVELINESS, REVERB_POSITION, x);
for (x=0; x<=99; x++)
set_reverb_option(handle, LEX_AMBIENCE_LEVEL, x);
set_option(LEX_AMBIENCE_LEVEL, REVERB_POSITION, x);
set_reverb_type(handle, REVERB_TYPE_LEX_STUDIO);
set_option(REVERB_TYPE, REVERB_POSITION, REVERB_TYPE_LEX_STUDIO);
for (x=0; x<=15; x++)
set_reverb_option(handle, LEX_STUDIO_PREDELAY, x);
set_option(LEX_STUDIO_PREDELAY, REVERB_POSITION, x);
for (x=0; x<=99; x++)
set_reverb_option(handle, LEX_STUDIO_DECAY, x);
set_option(LEX_STUDIO_DECAY, REVERB_POSITION, x);
for (x=0; x<=99; x++)
set_reverb_option(handle, LEX_STUDIO_LIVELINESS, x);
set_option(LEX_STUDIO_LIVELINESS, REVERB_POSITION, x);
for (x=0; x<=99; x++)
set_reverb_option(handle, LEX_STUDIO_LEVEL, x);
set_option(LEX_STUDIO_LEVEL, REVERB_POSITION, x);
set_reverb_type(handle, REVERB_TYPE_LEX_ROOM);
set_option(REVERB_TYPE, REVERB_POSITION, REVERB_TYPE_LEX_ROOM);
for (x=0; x<=15; x++)
set_reverb_option(handle, LEX_ROOM_PREDELAY, x);
set_option(LEX_ROOM_PREDELAY, REVERB_POSITION, x);
for (x=0; x<=99; x++)
set_reverb_option(handle, LEX_ROOM_DECAY, x);
set_option(LEX_ROOM_DECAY, REVERB_POSITION, x);
for (x=0; x<=99; x++)
set_reverb_option(handle, LEX_ROOM_LIVELINESS, x);
set_option(LEX_ROOM_LIVELINESS, REVERB_POSITION, x);
for (x=0; x<=99; x++)
set_reverb_option(handle, LEX_ROOM_LEVEL, x);
set_option(LEX_ROOM_LEVEL, REVERB_POSITION, x);
set_reverb_type(handle, REVERB_TYPE_LEX_HALL);
set_option(REVERB_TYPE, REVERB_POSITION, REVERB_TYPE_LEX_HALL);
for (x=0; x<=15; x++)
set_reverb_option(handle, LEX_HALL_PREDELAY, x);
set_option(LEX_HALL_PREDELAY, REVERB_POSITION, x);
for (x=0; x<=99; x++)
set_reverb_option(handle, LEX_HALL_DECAY, x);
set_option(LEX_HALL_DECAY, REVERB_POSITION, x);
for (x=0; x<=99; x++)
set_reverb_option(handle, LEX_HALL_LIVELINESS, x);
set_option(LEX_HALL_LIVELINESS, REVERB_POSITION, x);
for (x=0; x<=99; x++)
set_reverb_option(handle, LEX_HALL_LEVEL, x);
set_option(LEX_HALL_LEVEL, REVERB_POSITION, x);
set_reverb_type(handle, REVERB_TYPE_EMT240_PLATE);
set_option(REVERB_TYPE, REVERB_POSITION, REVERB_TYPE_EMT240_PLATE);
for (x=0; x<=15; x++)
set_reverb_option(handle, EMT240_PLATE_PREDELAY, x);
set_option(EMT240_PLATE_PREDELAY, REVERB_POSITION, x);
for (x=0; x<=99; x++)
set_reverb_option(handle, EMT240_PLATE_DECAY, x);
set_option(EMT240_PLATE_DECAY, REVERB_POSITION, x);
for (x=0; x<=99; x++)
set_reverb_option(handle, EMT240_PLATE_LIVELINESS, x);
set_option(EMT240_PLATE_LIVELINESS, REVERB_POSITION, x);
for (x=0; x<=99; x++)
set_reverb_option(handle, EMT240_PLATE_LEVEL, x);
set_option(EMT240_PLATE_LEVEL, REVERB_POSITION, x);
set_reverb_on_off(handle, TRUE);
set_reverb_on_off(handle, FALSE);
set_option(REVERB_ON_OFF, REVERB_POSITION, 1);
set_option(REVERB_ON_OFF, REVERB_POSITION, 0);
}
void test_all(struct usb_dev_handle *handle)
void test_usb()
{
test_wah(handle);
test_compressor(handle);
test_dist(handle);
test_presets(handle);
test_pickups(handle);
test_eq(handle);
test_noisegate(handle);
test_chorusfx(handle);
test_delay(handle);
test_reverb(handle);
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();
}

28
tests.h
View File

@@ -14,16 +14,22 @@
* 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(struct usb_dev_handle *handle);
void test_compressor(struct usb_dev_handle *handle);
void test_dist(struct usb_dev_handle *handle);
void test_presets(struct usb_dev_handle *handle);
void test_pickups(struct usb_dev_handle *handle);
void test_eq(struct usb_dev_handle *handle);
void test_noisegate(struct usb_dev_handle *handle);
void test_chorusfx(struct usb_dev_handle *handle);
void test_delay(struct usb_dev_handle *handle);
void test_reverb(struct usb_dev_handle *handle);
void test_all(struct usb_dev_handle *handle);
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 */