112 Commits
0.1.2 ... 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
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
17 changed files with 5908 additions and 1642 deletions

View File

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

12
HACKING
View File

@@ -3,7 +3,7 @@ In general everything brings down to figure out:
-Position -Position
-Possible value range -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 1) Use USB sniffer together with X-Edit
Once you set up X-Edit and usb sniffer, set some option. Once you set up X-Edit and usb sniffer, set some option.
USB sniffer should report something like this being sent to device: 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 save new patch
check patch file and note the change check patch file and note the change
while you don't have all possible values 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,26 +1,43 @@
CC = gcc CC = gcc
CFLAGS = `pkg-config --cflags glib-2.0 gtk+-2.0` -Wall -g EXTRA_CFLAGS ?=
OFLAG = -o EXTRA_LDFLAGS ?=
LIBS = `pkg-config --libs glib-2.0 gtk+-2.0 alsa` 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 .PHONY : clean distclean all
.c.o : %.o : %.c
$(CC) $(CFLAGS) -c $< $(CC) $(CFLAGS) -c $<
.%.m : %.c
$(CC) $(CFLAGS) -M -MF $@ -MG $<
all: gdigi all: gdigi
gdigi: gdigi.o tests.o gui.o effects.o gdigi: $(OBJECTS)
$(CC) $(LIBS) $(OFLAG) gdigi gdigi.o tests.o gui.o effects.o $(CC) $(LDFLAGS) -o $@ $+
gdigi.o: gdigi.c knob.h: knob.png
gdk-pixbuf-csource --name=knob_pixbuf knob.png > $@
tests.o: tests.c
gui.o: gui.c
effects.o: effects.c
clean: 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

2
README
View File

@@ -1,4 +1,4 @@
Requirments: alsa, gtk+, glib Requirments: alsa, gtk+, glib, expat
Getting started guide: Getting started guide:
-to compile: make -to compile: make

16
TODO
View File

@@ -1,10 +1,6 @@
-figure out all magic commands -make complete gui (expression pedal settings, usb settings, effect level, preset level)
-make complete gui -handling presets (saving, exporting to xml patches)
-amp/cabinet models -buildsystem (install knob.png to share dir, don't use inline knob pixbuf)
-tone library -various fixes to MIDI IN messages handling
-effects library -guess device port when user doesn't explicitly provide it (don't use hardcoded "hw:1,0,0")
-effects level -optimizations
-handling presets (loading, saving, exporting/importing to/from xml patches)
-buildsystem
-figure out how to get current device settings, start gui with proper values
-fix expression pedal settings (possible types depend on active preset)

2452
effects.c

File diff suppressed because it is too large Load Diff

View File

@@ -14,34 +14,79 @@
* along with this program. If not, see <http://www.gnu.org/licenses>. * along with this program. If not, see <http://www.gnu.org/licenses>.
*/ */
#include <glib/gtypes.h> #ifndef GDIGI_EFFECTS_H
#define GDIGI_EFFECTS_H
#include <glib.h>
typedef struct { typedef struct {
char *label; /* Parameter name */ gdouble min; /**< Minumum value */
gdouble min; /* Parameter minumum value */ gdouble max; /**< Maximum value */
gdouble max; /* Parameter maximum value */ GStrv labels; /**< value labels */
guint option; /* ID (to set parameter) */ } EffectValues;
guint position; /* position */
typedef struct {
gchar *label; /**< Parameter name */
guint id; /**< ID (to set parameter) */
guint position; /**< position */
EffectValues *values; /**< valid parameter values */
} EffectSettings; } EffectSettings;
typedef struct { typedef struct {
guint id; /* value (type) */ guint type; /**< value (type) */
gchar *label; /* Effect name */ gchar *label; /**< Effect name */
guint option; /* ID (to set effect type) */ EffectSettings *settings; /**< possible parameters */
guint position; /* position */ gint settings_amt; /**< possible parameters length */
EffectSettings *settings; /* possible parameters */
gint settings_amt; /* possible parameters length */
} EffectGroup; } EffectGroup;
typedef struct { typedef struct {
char *label; /* Base effect name */ gchar *label; /**< Group label */
guint option; /* ID (to set effect on/off) */ guint id; /**< ID to set effect on/off, or if it isn't on/off group then -1 */
guint position; /* position */ guint type; /**< ID to set effect type */
EffectGroup *group; /* possible effect types */ guint position; /**< position */
gint group_amt; /* possible effect types length */ EffectGroup *group; /**< possible effect types */
gint group_amt; /**< possible effect types length */
} Effect; } Effect;
typedef struct { typedef struct {
Effect *effect; /* list of supported effects */ gchar *label; /**< base effect name */
gint amt; /* list of supported effects length */ Effect *effect; /**< list of supported effects */
gint amt; /**< list of supported effects length */
} EffectList; } EffectList;
typedef struct {
guint type; /**< ID to set effect type */
guint position;
EffectGroup *group;
gint group_amt;
} ModifierGroup;
typedef struct {
gchar *name;
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_device_info(unsigned char device_id, unsigned char family_id,
unsigned char product_id,
Device **device);
#endif /* GDIGI_EFFECTS_H */

970
gdigi.c

File diff suppressed because it is too large Load Diff

759
gdigi.h
View File

@@ -14,9 +14,26 @@
* along with this program. If not, see <http://www.gnu.org/licenses>. * along with this program. If not, see <http://www.gnu.org/licenses>.
*/ */
#ifndef GDIGI_H
#define GDIGI_H
#include <glib.h> #include <glib.h>
#include <glib-object.h>
#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 { enum {
GNX3K_WAH_TYPE_CRY = 129,
GNX3K_WAH_TYPE_BOUTIQUE = 130,
GNX3K_WAH_TYPE_FULLRANGE = 131,
WAH_TYPE_CRY = 132, WAH_TYPE_CRY = 132,
WAH_TYPE_FULLRANGE = 133, WAH_TYPE_FULLRANGE = 133,
WAH_TYPE_CLYDE = 134 WAH_TYPE_CLYDE = 134
@@ -35,17 +52,45 @@ enum {
enum { enum {
COMP_TYPE_DIGI = 195, COMP_TYPE_DIGI = 195,
COMP_TYPE_CS = 196 COMP_TYPE_CS = 196,
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_TYPE 207
#define COMP_ON_OFF 193 #define COMP_ON_OFF 193
#define COMP_POSITION 4 #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_SUSTAIN 208
#define COMP_TONE 209 #define COMP_TONE 209
#define COMP_ATTACK 211 #define COMP_ATTACK 211
#define COMP_LEVEL 210 #define COMP_LEVEL 210
#define COMP_SENSITIVITY 213
#define COMP_OUTPUT 212
enum { enum {
PICKUP_TYPE_HB_SC = 66, PICKUP_TYPE_HB_SC = 66,
@@ -59,8 +104,10 @@ enum {
enum { enum {
DIST_TYPE_SCREAMER = 1280, DIST_TYPE_SCREAMER = 1280,
DIST_TYPE_808 = 1292, DIST_TYPE_808 = 1292,
DIST_TYPE_SPARKDRIVE = 1286,
DIST_TYPE_GUYOD = 1285, DIST_TYPE_GUYOD = 1285,
DIST_TYPE_DOD250 = 1283, DIST_TYPE_DOD250 = 1283,
DIST_TYPE_REDLINE = 1297,
DIST_TYPE_RODENT = 1281, DIST_TYPE_RODENT = 1281,
DIST_TYPE_MX = 1291, DIST_TYPE_MX = 1291,
DIST_TYPE_DS = 1282, DIST_TYPE_DS = 1282,
@@ -68,6 +115,9 @@ enum {
DIST_TYPE_ZONE = 1289, DIST_TYPE_ZONE = 1289,
DIST_TYPE_DEATH = 1294, DIST_TYPE_DEATH = 1294,
DIST_TYPE_GONK = 1293, DIST_TYPE_GONK = 1293,
DIST_TYPE_8TAVIA = 1290,
DIST_TYPE_FUZZLATOR = 1295,
DIST_TYPE_CLASSIC_FUZZ = 1296,
DIST_TYPE_FUZZY = 1288, DIST_TYPE_FUZZY = 1288,
DIST_TYPE_MP = 1284 DIST_TYPE_MP = 1284
}; };
@@ -79,41 +129,74 @@ enum {
#define DIST_SCREAMER_DRIVE 2434 #define DIST_SCREAMER_DRIVE 2434
#define DIST_SCREAMER_TONE 2435 #define DIST_SCREAMER_TONE 2435
#define DIST_SCREAMER_LVL 2436 #define DIST_SCREAMER_LVL 2436
#define DIST_808_OVERDRIVE 2473 #define DIST_808_OVERDRIVE 2473
#define DIST_808_TONE 2474 #define DIST_808_TONE 2474
#define DIST_808_LVL 2475 #define DIST_808_LVL 2475
#define DIST_SPARKDRIVE_GAIN 2450
#define DIST_SPARKDRIVE_TONE 2451
#define DIST_SPARKDRIVE_CLEAN 2452
#define DIST_SPARKDRIVE_VOLUME 2453
#define DIST_GUYOD_DRIVE 2448 #define DIST_GUYOD_DRIVE 2448
#define DIST_GUYOD_LVL 2449 #define DIST_GUYOD_LVL 2449
#define DIST_DOD250_GAIN 2443 #define DIST_DOD250_GAIN 2443
#define DIST_DOD250_LVL 2444 #define DIST_DOD250_LVL 2444
#define DIST_REDLINE_GAIN 2488
#define DIST_REDLINE_LOW 2489
#define DIST_REDLINE_HIGH 2490
#define DIST_REDLINE_LEVEL 2491
#define DIST_RODENT_DIST 2437 #define DIST_RODENT_DIST 2437
#define DIST_RODENT_FILTER 2438 #define DIST_RODENT_FILTER 2438
#define DIST_RODENT_LVL 2439 #define DIST_RODENT_LVL 2439
#define DIST_MX_DIST 2468 #define DIST_MX_DIST 2468
#define DIST_MX_OUTPUT 2469 #define DIST_MX_OUTPUT 2469
#define DIST_DS_GAIN 2440 #define DIST_DS_GAIN 2440
#define DIST_DS_TONE 2441 #define DIST_DS_TONE 2441
#define DIST_DS_LVL 2442 #define DIST_DS_LVL 2442
#define DIST_GRUNGE_GRUNGE 2454 #define DIST_GRUNGE_GRUNGE 2454
#define DIST_GRUNGE_FACE 2456 #define DIST_GRUNGE_FACE 2456
#define DIST_GRUNGE_LOUD 2457 #define DIST_GRUNGE_LOUD 2457
#define DIST_GRUNGE_BUTT 2455 #define DIST_GRUNGE_BUTT 2455
#define DIST_ZONE_GAIN 2460 #define DIST_ZONE_GAIN 2460
#define DIST_ZONE_LOW 2463 #define DIST_ZONE_LOW 2463
#define DIST_ZONE_MID_LVL 2462 #define DIST_ZONE_MID_LVL 2462
#define DIST_ZONE_MID_FREQ 2461 #define DIST_ZONE_MID_FREQ 2461
#define DIST_ZONE_HIGH 2464 #define DIST_ZONE_HIGH 2464
#define DIST_ZONE_LEVEL 2465 #define DIST_ZONE_LEVEL 2465
#define DIST_DEATH_LOW 2477 #define DIST_DEATH_LOW 2477
#define DIST_DEATH_MID 2476 #define DIST_DEATH_MID 2476
#define DIST_DEATH_HIGH 2479 #define DIST_DEATH_HIGH 2479
#define DIST_DEATH_LVL 2478 #define DIST_DEATH_LVL 2478
#define DIST_GONK_GONK 2480 #define DIST_GONK_GONK 2480
#define DIST_GONK_SMEAR 2471 #define DIST_GONK_SMEAR 2471
#define DIST_GONK_SUCK 2470 #define DIST_GONK_SUCK 2470
#define DIST_GONK_HEAVE 2472 #define DIST_GONK_HEAVE 2472
#define DIST_8TAVIA_DRIVE 2466
#define DIST_8TAVIA_VOLUME 2467
#define DIST_FUZZLATOR_FUZZ 2481
#define DIST_FUZZLATOR_TONE 2482
#define DIST_FUZZLATOR_LOOSETIGHT 2483
#define DIST_FUZZLATOR_VOLUME 2484
#define DIST_CLASSIC_FUZZ_FUZZ 2485
#define DIST_CLASSIC_FUZZ_TONE 2486
#define DIST_CLASSIC_FUZZ_VOLUME 2487
#define DIST_FUZZY_FUZZ 2458 #define DIST_FUZZY_FUZZ 2458
#define DIST_FUZZY_VOLUME 2459 #define DIST_FUZZY_VOLUME 2459
#define DIST_MP_SUSTAIN 2445 #define DIST_MP_SUSTAIN 2445
#define DIST_MP_TONE 2446 #define DIST_MP_TONE 2446
#define DIST_MP_VOLUME 2447 #define DIST_MP_VOLUME 2447
@@ -121,6 +204,72 @@ enum {
#define PRESET_POSITION 18 #define PRESET_POSITION 18
#define PRESET_LEVEL 2626 #define PRESET_LEVEL 2626
enum {
AMP_TYPE_TWEED_CHAMP = 307,
AMP_TYPE_TWEED_DELUXE = 308,
AMP_TYPE_TWEED_BASSMAN = 309,
AMP_TYPE_BROWN_BASSMAN = 310,
AMP_TYPE_BLACKFACE_TWIN = 311,
AMP_TYPE_BLACKFACE_DELUXE = 312,
AMP_TYPE_PLEXI_JTM_45 = 313,
AMP_TYPE_SUPER_LEAD_PLEXI = 314,
AMP_TYPE_PLEXI_JUMP_PANEL = 315,
AMP_TYPE_MASTER_VOLUME = 316,
AMP_TYPE_JCM800 = 317,
AMP_TYPE_JCM900 = 318,
AMP_TYPE_JCM2000 = 319,
AMP_TYPE_AC15 = 322,
AMP_TYPE_AC30TB = 323,
AMP_TYPE_HIWATT_100 = 324,
AMP_TYPE_BOOGIE_MARK_II = 320,
AMP_TYPE_BOOGIE_MARK_IV = 371,
AMP_TYPE_DUAL_RECTIFIER = 321,
AMP_TYPE_TRIPLE_RECTIFIER = 370,
AMP_TYPE_LEGACY_VL100 = 327,
AMP_TYPE_MATCHLESS_HC30 = 326,
AMP_TYPE_SOLDANO_100 = 325,
AMP_TYPE_SUPERGROUP = 381,
AMP_TYPE_GA40 = 380,
AMP_TYPE_OR120 = 372,
AMP_TYPE_PV5150II = 373,
AMP_TYPE_RG100 = 374,
AMP_TYPE_JC120_JAZZ = 375,
AMP_TYPE_SOLAR100 = 376,
AMP_TYPE_SOLO = 331,
AMP_TYPE_METAL = 332,
AMP_TYPE_BRIGHT = 333,
AMP_TYPE_CHUNK = 334,
AMP_TYPE_CLEAN = 335,
AMP_TYPE_HIGH_GAIN = 337,
AMP_TYPE_BLUES = 338,
AMP_TYPE_FUZZ = 339,
AMP_TYPE_SPANK = 330,
AMP_TYPE_GSP2101_CLEAN_TUBE = 328,
AMP_TYPE_GSP2101_SAT_TUBE = 329,
AMP_TYPE_CRUNCH = 336,
AMP_TYPE_MONSTER = 377,
AMP_TYPE_TWEEDFACE = 378,
AMP_TYPE_BLACKBASS = 379,
AMP_TYPE_STONER_ROCK = 368,
AMP_TYPE_DARK_METAL = 369,
AMP_TYPE_TRANSISTOR = 382,
AMP_TYPE_BROWN_SOUND = 383,
AMP_TYPE_MOSH = 384,
AMP_TYPE_ACOUSTIC = 341,
AMP_TYPE_JUMBO_ACOUSTIC = 340,
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 { enum {
EQ_TYPE_BRIGHT = 1474, EQ_TYPE_BRIGHT = 1474,
EQ_TYPE_MIDBOOST = 1472, EQ_TYPE_MIDBOOST = 1472,
@@ -128,10 +277,93 @@ enum {
EQ_TYPE_WARM = 1475 EQ_TYPE_WARM = 1475
}; };
#define AMP_TYPE 2496
#define AMP_ON_OFF 265
#define AMP_POSITION 8 #define AMP_POSITION 8
#define CH2_AMP_POSITION 10
#define AMP_GAIN 2497 #define AMP_GAIN 2497
#define AMP_LEVEL 2498 #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
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_TYPE 3202
#define EQ_ON_OFF 3212 #define EQ_ON_OFF 3212
@@ -142,6 +374,15 @@ enum {
#define EQ_MID_HZ 3206 #define EQ_MID_HZ 3206
#define EQ_TREBLE 3205 #define EQ_TREBLE 3205
#define EQ_TREBLE_HZ 3211 #define EQ_TREBLE_HZ 3211
#define EQ_LOW_LEVEL 3203
#define EQ_MID_LEVEL 3204
#define EQ_HIGH_LEVEL 3205
#define EQ_LOW_FREQ 3213
#define EQ_MID_FREQ 3214
#define EQ_HIGH_FREQ 3215
#define EQ_LOW_BANDWIDTH 3216
#define EQ_MID_BANDWIDTH 3217
#define EQ_HIGH_BANDWIDTH 3218
enum { enum {
NOISEGATE_GATE = 768, NOISEGATE_GATE = 768,
@@ -152,6 +393,8 @@ enum {
#define NOISEGATE_ON_OFF 705 #define NOISEGATE_ON_OFF 705
#define NOISEGATE_POSITION 12 #define NOISEGATE_POSITION 12
#define GNX3K_GATE_ATTACK 706
/* available only in Gate mode */ /* available only in Gate mode */
#define NOISEGATE_GATE_TRESHOLD 710 #define NOISEGATE_GATE_TRESHOLD 710
/* available only in Swell mode */ /* available only in Swell mode */
@@ -161,75 +404,140 @@ enum {
#define NOISEGATE_RELEASE 713 #define NOISEGATE_RELEASE 713
#define NOISEGATE_ATTN 714 #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 { enum {
CHORUS_TYPE_CE = 0x37B, CHORUS_TYPE_CE = 0x37B,
CHORUS_TYPE_TC = 0x37C,
CHORUS_TYPE_DUAL = 0x379, CHORUS_TYPE_DUAL = 0x379,
CHORUS_TYPE_GLISTEN = 0x392,
CHORUS_TYPE_MULTI = 0x37a, CHORUS_TYPE_MULTI = 0x37a,
CHORUS_TYPE_FLANGER = 0x37d, CHORUS_TYPE_FLANGER = 0x37d,
CHORUS_TYPE_TRIGGERED_FLANGER = 0x37e,
CHORUS_TYPE_MXR_FLANGER = 0x37f, CHORUS_TYPE_MXR_FLANGER = 0x37f,
CHORUS_TYPE_EH_FLANGER = 0x380,
CHORUS_TYPE_AD_FLANGER = 0x393,
CHORUS_TYPE_PHASER = 0x381, CHORUS_TYPE_PHASER = 0x381,
CHORUS_TYPE_TRIGGERED_PHASER = 0x382,
CHORUS_TYPE_MX_PHASER = 0x383,
CHORUS_TYPE_EH_PHASER = 0x384,
CHORUS_TYPE_VIBRATO = 0x360, CHORUS_TYPE_VIBRATO = 0x360,
CHORUS_TYPE_ROTARY = 0x361, CHORUS_TYPE_ROTARY = 0x361,
CHORUS_TYPE_VIBROPAN = 0x38f, CHORUS_TYPE_VIBROPAN = 0x38f,
CHORUS_TYPE_UNOVIBE = 0x390,
CHORUS_TYPE_TREMOLO = 0x35e, CHORUS_TYPE_TREMOLO = 0x35e,
CHORUS_TYPE_SCATTER_TREM = 0x394,
CHORUS_TYPE_OPTO_TREMOLO = 0x388,
CHORUS_TYPE_BIAS_TREMOLO = 0x389,
CHORUS_TYPE_PANNER = 0x35f, CHORUS_TYPE_PANNER = 0x35f,
CHORUS_TYPE_ENVELOPE = 0x38a, CHORUS_TYPE_ENVELOPE = 0x38a,
CHORUS_TYPE_FX25 = 0x38e,
CHORUS_TYPE_AUTOYA = 0x38b, CHORUS_TYPE_AUTOYA = 0x38b,
CHORUS_TYPE_YAYA = 0x38c, CHORUS_TYPE_YAYA = 0x38c,
CHORUS_TYPE_SYNTH_TALK = 0x391,
CHORUS_TYPE_STEP_FILTER = 0x38d, CHORUS_TYPE_STEP_FILTER = 0x38d,
CHORUS_TYPE_SAMPLE_HOLD = 0x395,
CHORUS_TYPE_WHAMMY = 0x540, CHORUS_TYPE_WHAMMY = 0x540,
CHORUS_TYPE_PITCH_SHIFT = 0x543, CHORUS_TYPE_PITCH_SHIFT = 0x543,
CHORUS_TYPE_DETUNE = 0x542, CHORUS_TYPE_DETUNE = 0x542,
CHORUS_TYPE_IPS = 0x541 CHORUS_TYPE_IPS = 0x541,
CHORUS_TYPE_OCTAVER = 0x385,
}; };
#define CHORUSFX_TYPE 768 #define CHORUSFX_TYPE 768
#define CHORUSFX_ON_OFF 769 #define CHORUSFX_ON_OFF 769
#define CHORUSFX_POSITION 14 #define CHORUSFX_POSITION 14
#define CE_CHORUS_SPEED 837 #define CHORUS_SPEED 837
#define CE_CHORUS_DEPTH 838 #define CHORUS_DEPTH 838
#define CHORUS_PREDELAY 839
#define DUAL_CHORUS_SPEED 837 #define CHORUS_WIDTH 848
#define DUAL_CHORUS_DEPTH 838 #define CHORUS_INTENSITY 849
#define DUAL_CHORUS_LEVEL 836
#define DUAL_CHORUS_WAVE 840
#define MULTI_CHORUS_SPEED 837 #define CHORUS_LEVEL 836
#define MULTI_CHORUS_DEPTH 838 #define CHORUS_WAVE 840
#define MULTI_CHORUS_WAVE 840 #define CHORUS_BALANCE 841
#define MULTI_CHORUS_LEVEL 836
#define FLANGER_SPEED 902 #define FLANGER_SPEED 902
#define FLANGER_DEPTH 903 #define FLANGER_DEPTH 903
#define FLANGER_REGEN 904 #define FLANGER_REGEN 904
#define FLANGER_LEVEL 901 #define FLANGER_LEVEL 901
#define FLANGER_WAVE 905 #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_WIDTH 914
#define MXR_FLANGER_REGEN 904
#define MXR_FLANGER_MANUAL 917 #define MXR_FLANGER_MANUAL 917
#define EH_FLANGER_RATE 918
#define EH_FLANGER_RANGE 919
#define EH_FLANGER_COLOR 916
#define AD_FLANGER_ENHANCE 920
#define AD_FLANGER_HARMONICS 921
#define PHASER_SPEED 962 #define PHASER_SPEED 962
#define PHASER_DEPTH 963 #define PHASER_DEPTH 963
#define PHASER_REGEN 966 #define PHASER_REGEN 966
#define PHASER_LEVEL 965 #define PHASER_LEVEL 965
#define PHASER_WAVE 967 #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
#define EH_PHASER_RATE 979
#define EH_PHASER_COLOR 977
#define VIBRATO_SPEED 1284 #define VIBRATO_SPEED 1284
#define VIBRATO_DEPTH 1285 #define VIBRATO_DEPTH 1285
#define VIBRATO_WAVEFORM 1286
#define ROTARY_SPEED 1346 #define ROTARY_SPEED 1346
#define ROTARY_INTENSITY 1348 #define ROTARY_INTENSITY 1348
#define ROTARY_MIX 1349
#define ROTARY_DOPPLER 1350 #define ROTARY_DOPPLER 1350
#define ROTARY_CROSSOVER 1351 #define ROTARY_CROSSOVER 1351
#define ROTARY_BALANCE 1352
#define VIBROPAN_SPEED 1314 #define VIBROPAN_SPEED 1314
#define VIBROPAN_DEPTH 1315 #define VIBROPAN_DEPTH 1315
#define VIBROPAN_VIBRA 1316 #define VIBROPAN_VIBRA 1316
#define VIBROPAN_WAVE 1317 #define VIBROPAN_WAVE 1317
#define UNOVIBE_PEDAL_SPEED 2884
#define UNOVIBE_INTENSITY 2883
#define UNOVIBE_CHORUS_VIBRATO 2882
#define UNOVIBE_VOLUME 2885
#define TREMOLO_SPEED 1156 #define TREMOLO_SPEED 1156
#define TREMOLO_DEPTH 1155 #define TREMOLO_DEPTH 1155
#define TREMOLO_WAVE 1157 #define TREMOLO_WAVE 1157
@@ -238,103 +546,83 @@ enum {
#define PANNER_DEPTH 1219 #define PANNER_DEPTH 1219
#define PANNER_WAVE 1221 #define PANNER_WAVE 1221
#define ENVELOPE_MIX 1604
#define ENVELOPE_SENSITIVITY 1606 #define ENVELOPE_SENSITIVITY 1606
#define ENVELOPE_RANGE 1605 #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_SPEED 1478
#define AUTOYA_DEPTH 1479
#define AUTOYA_BALANCE 1481
#define AUTOYA_INTENSITY 1482 #define AUTOYA_INTENSITY 1482
#define AUTOYA_RANGE 1483 #define AUTOYA_RANGE 1483
#define YAYA_PEDAL 1410 #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_INTENSITY 1417
#define YAYA_RANGE 1418 #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
#define SYNTH_TALK_BALANCE 1545
#define STEP_FILTER_SPEED 3010 #define STEP_FILTER_SPEED 3010
#define STEP_FILTER_INTENSITY 3011 #define STEP_FILTER_INTENSITY 3011
#define SAMPLE_HOLD_SPEED 3012
#define SAMPLE_HOLD_INTENSITY 3013
#define WHAMMY_AMOUNT 1797 #define WHAMMY_AMOUNT 1797
#define WHAMMY_PEDAL 1795 #define WHAMMY_PEDAL 1795
#define WHAMMY_MIX 1796 #define WHAMMY_MIX 1796
#define PITCH_AMOUNT 1730 #define PITCH_AMOUNT 1730
#define PITCH_BALANCE 1733
#define PITCH_MIX 1745 #define PITCH_MIX 1745
#define DETUNE_AMOUNT 1668
#define DETUNE_LEVEL 1667 #define DETUNE_LEVEL 1667
#define DETUNE_AMOUNT 1668
#define DETUNE_BALANCE 1669
#define IPS_SHIFT_AMOUNT 2754 #define IPS_SHIFT_AMOUNT 2754
#define IPS_KEY 2756 #define IPS_KEY 2756
#define IPS_SCALE 2755 #define IPS_SCALE 2755
#define IPS_LEVEL 2757 #define IPS_LEVEL 2757
/* DUAL_CHORUS_WAVE, MULTI_CHORUS_WAVE, FLANGER_WAVE, PHASER_WAVE, #define OCTAVER_OCTAVE1 1746
VIBROPAN_WAVE, TREMOLO_WAVE, PANNER_WAVE valid values */ #define OCTAVER_OCTAVE2 1747
#define WAVE_TRI 0x00 #define OCTAVER_DRY_LEVEL 1748
#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_DD 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 { enum {
DELAY_TYPE_ANALOG = 1046, DELAY_TYPE_ANALOG = 1046,
DELAY_TYPE_DIGITAL = 1045, DELAY_TYPE_DIGITAL = 1045,
DELAY_TYPE_MODULATED = 1047, DELAY_TYPE_MODULATED = 1047,
DELAY_TYPE_PONG = 1048, DELAY_TYPE_PONG = 1048,
DELAY_TYPE_TAPE = 1049 DELAY_TYPE_TAPE = 1049,
DELAY_RP500_TYPE_DIGITAL = 1052,
DELAY_RP500_TYPE_ANALOG = 1053,
DELAY_RP500_TYPE_DM = 1058,
DELAY_RP500_TYPE_ECHOPLEX = 1057,
DELAY_RP500_TYPE_MODULATED = 1054,
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 #define DELAY_TYPE 1856
@@ -343,29 +631,44 @@ enum {
#define DELAY_TIME 1888 #define DELAY_TIME 1888
#define ANALOG_LEVEL 1860 #define DELAY_TAPE_WOW 1891
#define ANALOG_REPEATS 1863 #define DELAY_TAPE_FLUTTER 1892
#define DIGITAL_LEVEL 1860 #define DELAY_LEVEL 1860
#define DIGITAL_REPEATS 1863 #define DELAY_REPEATS 1863
#define DIGITAL_DUCKER_THRESH 1889 #define DELAY_TAP_TIME 1868
#define DIGITAL_DUCKER_LEVEL 1890 #define DELAY_DUCK_THRESH 1889
#define DELAY_DUCK_LEVEL 1890
#define DELAY_REPEAT_RATE 1898
#define DELAY_ECHO 1895
#define DELAY_INTENSITY 1896
#define DELAY_TIME_0_760 1899
#define DELAY_VOLUME 1893
#define DELAY_REPEATS_0_99 1874
#define DELAY_DEPTH 1873
#define DELAY_TAP_TIME_0_4990 1900
#define DELAY_MIX 1902
#define DELAY_TIME_0_4650 1901
#define MODULATED_LEVEL 1860 #define GNX3K_DELAY_TIME 1862
#define MODULATED_REPEATS 1863 #define GNX3K_DELAY_FEEDBACK 1863
#define MODULATED_DEPTH 1873 #define GNX3K_DELAY_DUCK_THRESH 1864
#define GNX3K_DELAY_DUCK_ATTEN 1865
#define PONG_LEVEL 1860 #define GNX3K_DELAY_BALANCE 1866
#define PONG_REPEATS 1863 #define GNX3K_DELAY_SPREAD 1867
#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
enum { 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_TWIN = 1146,
REVERB_TYPE_LEX_AMBIENCE = 1150, REVERB_TYPE_LEX_AMBIENCE = 1150,
REVERB_TYPE_LEX_STUDIO = 1149, REVERB_TYPE_LEX_STUDIO = 1149,
@@ -378,75 +681,12 @@ enum {
#define REVERB_ON_OFF 1921 #define REVERB_ON_OFF 1921
#define REVERB_POSITION 16 #define REVERB_POSITION 16
#define TWIN_REVERB 1925 #define REVERB_PREDELAY 1922
#define REVERB_DAMPING 1924
#define LEX_AMBIENCE_PREDELAY 1922 #define REVERB_DECAY 1927
#define LEX_AMBIENCE_DECAY 1927 #define REVERB_BALANCE 1928
#define LEX_AMBIENCE_LIVELINESS 1933 #define REVERB_LIVELINESS 1933
#define LEX_AMBIENCE_LEVEL 1925 #define REVERB_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
enum {
EXP_TYPE_NONE = 0,
EXP_TYPE_PICKUP_ENABLE = 131137,
EXP_TYPE_PIKCUP_TYPE = 131136,
EXP_TYPE_COMP_ENABLE = 262337,
EXP_TYPE_COMP_SUST = 262352,
EXP_TYPE_COMP_TONE = 262353,
EXP_TYPE_COMP_LEVEL = 262354,
EXP_TYPE_COMP_ATTACK = 262355,
EXP_TYPE_DIST_ENABLE = 395649,
EXP_TYPE_DIST_DISTORTION = 395653,
EXP_TYPE_DIST_FILTER = 395654,
EXP_TYPE_DIST_VOLUME = 395655,
EXP_TYPE_AMP_ENABLE = 524553,
EXP_TYPE_AMP_GAIN = 526785,
EXP_TYPE_AMP_LEVEL = 526786,
EXP_TYPE_EQ_ENABLE = 1576076,
EXP_TYPE_EQ_BASS = 1576067,
EXP_TYPE_EQ_MID = 1576068,
EXP_TYPE_EQ_TREB = 1576069,
EXP_TYPE_GATE_ENABLE = 787137,
EXP_TYPE_GATE_THRESHOLD = 787142,
EXP_TYPE_GATE_ATTACK = 787144,
EXP_TYPE_GATE_RELEASE = 787145,
EXP_TYPE_GATE_ATTN = 787146,
EXP_TYPE_CHORUSFX_ENABLE = 918273,
EXP_TYPE_PHASER_SPEED = 918466,
EXP_TYPE_PHASER_DEPTH = 918467,
EXP_TYPE_PHASER_REGEN = 918470,
EXP_TYPE_PHASER_WAVEFORM = 918471,
EXP_TYPE_PHASER_LEVEL = 918469,
EXP_TYPE_DELAY_ENABLE = 984897,
EXP_TYPE_DELAY_TIME = 984928,
EXP_TYPE_DELAY_REPEATS = 984903,
EXP_TYPE_DELAY_LEVEL = 984900,
EXP_TYPE_DELAY_DUCK_THRESH = 984929,
EXP_TYPE_DELAY_DUCK_LEVEL = 984930,
EXP_TYPE_REVERB_ENABLE = 1050497,
EXP_TYPE_REVERB_LEVEL = 1050501,
EXP_TYPE_VOLUME_PRE_FX = 854594,
EXP_TYPE_VOLUME_POST_FX = 1116738
};
#define EXP_TYPE 8194 #define EXP_TYPE 8194
#define EXP_POSITION 19 #define EXP_POSITION 19
@@ -454,11 +694,196 @@ enum {
#define EXP_MIN 8195 #define EXP_MIN 8195
#define EXP_MAX 8196 #define EXP_MAX 8196
#define LIBRARY_TONE 8704
#define LIBRARY_EFFECTS 8705
#define EFFECTS_LEVEL 8706
#define LIBRARY_POSITION 25
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,
/* setting EFFECTS_LIBRARY to this option seems to crash device */
EFFECTS_LIB_CUSTOM = 1856
};
#define USB_POSITION 0 #define USB_POSITION 0
#define USB_AUDIO_PLAYBACK_MIX 12297 #define USB_AUDIO_PLAYBACK_MIX 12297
#define USB_AUDIO_LEVEL 12307 #define USB_AUDIO_LEVEL 12307
#define GUI_MODE_ON_OFF 12298
#endif /* DOXYGEN_SHOULD_SKIP_THIS */
typedef enum {
PRESETS_SYSTEM = 0,
PRESETS_USER = 1,
PRESETS_ARTIST = 2,
/* Version 1 and later */
PRESETS_MEDIA_CARD = 3,
PRESETS_EDIT_BUFFER = 4, /* Current preset edit buffer, index must be 0 */
PRESETS_FACTORY2 = 5,
/* Version 2 and later */
PRESETS_EXTERNAL = 6
} 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,
REQUEST_DEVICE_CONFIGURATION = 0x08,
RECEIVE_DEVICE_CONFIGURATION = 0x09,
REQUEST_GLOBAL_PARAMETERS = 0x10,
RECEIVE_GLOBAL_PARAMETERS = 0x11,
REQUEST_BULK_DUMP = 0x18,
RECEIVE_BULK_DUMP_START = 0x19,
RECEIVE_BULK_DUMP_END = 0x1B,
REQUEST_PRESET_NAMES = 0x21,
RECEIVE_PRESET_NAMES = 0x22,
REQUEST_PRESET_NAME = 0x28,
RECEIVE_PRESET_NAME = 0x29,
REQUEST_PRESET = 0x2A,
RECEIVE_PRESET_START = 0x2B,
RECEIVE_PRESET_END = 0x2C,
RECEIVE_PRESET_PARAMETERS = 0x2D,
LOAD_EDIT_BUFFER_PRESET = 0x38, /* version 0 only
use move preset in later versions */
MOVE_PRESET = 0x39,
REQUEST_MODIFIER_LINKABLE_LIST = 0x3A,
RECEIVE_MODIFIER_LINKABLE_LIST = 0x3B,
REQUEST_PARAMETER_VALUE = 0x40,
RECEIVE_PARAMETER_VALUE = 0x41,
/* version 1 and later */
REQUEST_OBJECT_NAMES = 0x50,
RECEIVE_OBJECT_NAMES = 0x51,
REQUEST_OBJECT_NAME = 0x52,
RECEIVE_OBJECT_NAME = 0x53,
REQUEST_OBJECT = 0x54,
RECEIVE_OBJECT = 0x55,
MOVE_OBJECT = 0x56,
DELETE_OBJECT = 0x57,
REQUEST_TABLE = 0x5A,
RECEIVE_TABLE = 0x5B,
RECEIVE_DEVICE_NOTIFICATION = 0x70,
ACK = 0x7E,
NACK = 0x7F
} 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 set_option(guint id, guint position, guint value);
void switch_user_preset(int x); void switch_preset(guint bank, guint x);
void switch_system_preset(int x); void store_preset_name(int x, const gchar *name);
void set_preset_level(int level); void set_preset_level(int level);
GStrv query_preset_names(gchar bank);
GList *get_current_preset();
void preset_list_free(GList *list);
#endif /* GDIGI_H */

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

991
gui.c

File diff suppressed because it is too large Load Diff

15
gui.h
View File

@@ -14,4 +14,17 @@
* along with this program. If not, see <http://www.gnu.org/licenses>. * 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 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(Device **device);
#endif /* GDIGI_GUI_H */

BIN
knob.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

261
preset.c Normal file
View File

@@ -0,0 +1,261 @@
/*
* 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"
#include "gdigi.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 = 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;
} 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 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(GList *list)
{
GString *data;
GList *iter;
gint total, n, x;
gint bank, number, modified;
gchar *name;
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++;
do {
SettingParam *param = setting_param_new_from_data(&data->str[x], &x);
n++;
preset->params = g_list_prepend(preset->params, param);
g_message("%d ID %d Position %d Value %d", n, param->id, param->position, param->value);
} 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;
}
/**
* \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) {
setting_param_free((SettingParam*)iter->data);
}
g_list_free(preset->params);
}
if (preset->name != NULL)
g_free(preset->name);
g_slice_free(Preset, preset);
}

View File

@@ -14,18 +14,18 @@
* along with this program. If not, see <http://www.gnu.org/licenses>. * along with this program. If not, see <http://www.gnu.org/licenses>.
*/ */
#include "gdigi.h" #ifndef GDIGI_PRESET_H
#define GDIGI_PRESET_H
void test_wah(); #include <glib.h>
void test_compressor();
void test_dist(); typedef struct {
void test_presets(); gchar *name;
void test_pickups(); GList *params;
void test_eq(); } Preset;
void test_noisegate();
void test_chorusfx(); Preset *create_preset_from_xml_file(gchar *filename, GError **error);
void test_delay(); Preset *create_preset_from_data(GList *list);
void test_reverb(); void preset_free(Preset *preset);
void test_exp();
void test_usb(); #endif /* GDIGI_PRESET_H */
void test_all();

889
tests.c
View File

@@ -1,889 +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_user_preset(x);
for (x=0; x<=60; x++)
switch_system_preset(x);
for (x=0; x<=99; x++)
set_preset_level(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_DD);
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_exp()
{
int x;
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_NONE);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_PICKUP_ENABLE);
for (x=0; x<=1; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=1; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_PIKCUP_TYPE);
for (x=0; x<=1; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=1; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_COMP_ENABLE);
for (x=0; x<=1; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=1; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_COMP_SUST);
for (x=0; x<=99; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=99; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_COMP_TONE);
for (x=0; x<=99; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=99; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_COMP_LEVEL);
for (x=0; x<=99; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=99; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_COMP_ATTACK);
for (x=0; x<=99; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=99; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_DIST_ENABLE);
for (x=0; x<=1; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=1; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_DIST_DISTORTION);
for (x=0; x<=99; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=99; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_DIST_FILTER);
for (x=0; x<=99; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=99; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_DIST_VOLUME);
for (x=0; x<=99; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=99; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_AMP_ENABLE);
for (x=0; x<=1; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=1; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_AMP_GAIN);
for (x=0; x<=99; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=99; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_AMP_LEVEL);
for (x=0; x<=99; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=99; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_EQ_ENABLE);
for (x=0; x<=1; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=1; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_EQ_BASS);
for (x=0; x<=24; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=24; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_EQ_MID);
for (x=0; x<=24; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=24; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_EQ_TREB);
for (x=0; x<=24; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=24; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_GATE_ENABLE);
for (x=0; x<=1; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=1; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_GATE_THRESHOLD);
for (x=0; x<=99; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=99; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_GATE_ATTACK);
for (x=0; x<=99; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=99; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_GATE_RELEASE);
for (x=0; x<=99; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=99; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_GATE_ATTN);
for (x=0; x<=99; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=99; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_CHORUSFX_ENABLE);
for (x=0; x<=1; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=1; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_PHASER_SPEED);
for (x=0; x<=99; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=99; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_PHASER_DEPTH);
for (x=0; x<=99; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=99; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_PHASER_REGEN);
for (x=0; x<=99; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=99; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_PHASER_WAVEFORM);
for (x=0; x<=2; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=2; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_PHASER_LEVEL);
for (x=0; x<=99; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=99; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_DELAY_ENABLE);
for (x=0; x<=1; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=1; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_DELAY_TIME);
for (x=0; x<=139; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=139; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_DELAY_REPEATS);
for (x=0; x<=100; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=100; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_DELAY_LEVEL);
for (x=0; x<=99; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=99; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_DELAY_DUCK_THRESH);
for (x=0; x<=99; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=99; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_DELAY_DUCK_LEVEL);
for (x=0; x<=99; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=99; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_REVERB_ENABLE);
for (x=0; x<=1; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=1; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_REVERB_LEVEL);
for (x=0; x<=99; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=99; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_VOLUME_PRE_FX);
for (x=0; x<=99; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=99; x++)
set_option(EXP_MAX, EXP_POSITION, x);
set_option(EXP_TYPE, EXP_POSITION, EXP_TYPE_VOLUME_POST_FX);
for (x=0; x<=99; x++)
set_option(EXP_MIN, EXP_POSITION, x);
for (x=0; x<=99; x++)
set_option(EXP_MAX, EXP_POSITION, x);
}
void test_usb()
{
int x;
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_exp();
test_usb();
}