USBUA100 Installation and Operation

Author: Michael Minn <michael@michaelminn.com>

July 1, 2001


Describes installation and operation of USBUA100, a Linux kernel module device driver and console program for the Roland UA-100 USB MIDI/Audio desktop music production device. USBUA100 also supports MIDI input/output for the Roland UM-1 USB MIDI adapter and the Roland SC-8850 MIDI Sound Module.

1. Introduction

1.1 Capabilities and Deficiencies

1.2 Version History

2. Installation

2.1 USB-MIDI

2.2 Module Compilation & Installation

2.3 Boot-time Load

2.4 Testing

3. Using the USBUA100 Device Files

3.1 Dynamic Name Assignment
3.2 /dev/midi
3.3 /dev/dsp

4. Included Programs

4.1 usbua100mix
4.2 usbua100sysex
4.3 lsndlist
4.4 lsndplaymidi

5. Implementation and Protocol

5.1 MIDI Protocol
5.2 Audio Protocol

6. UA-100 System Exclusive MIDI Messages


1. Introduction

USBUA100 is a Linux kernel module device driver for the Roland UA-100 USB MIDI/Audio desktop music production device. The Roland UA-100 is a USB desktop music production tool providing MIDI input/output and high-quality 16-bit digital output. A QT-based X-Windows mixer console is also provided for controlling the UA-100's internal mixer and extensive array of effects.

Because the Roland desktop music products seem to use similar USB/MIDI protocols, USBUA100 also supports MIDI input/output via the Roland UM-1 MIDI adapter and the Roland SC-8850 MIDI Sound Module. Support for other Roland desktop MIDI products is not provided but can probably be added with relative programming ease.

Edirol, Roland's desktop music hardware distributor in the United States, has declined either to develop Linux drivers or provide specs so the open source community could develop a driver. Therefore, USBUA100 was developed based on work done by other Linux devlopers as well as USB traces on MS Windows(tm) and extensive experimentation. As such, it cannot guarantee full-featured and problem-free operation.

I wish to acknowledge a huge debt of gratitude to Daisuke Nagano for developing the USB-MIDI kernel module that supports MIDI on the Roland desktop music products. Thanks also go out to Roland and Tom for writing USB Snoopy/SniffUSB the MS-Windows software USB packet sniffer used to investigate the UA-100 USB protocol.

1.1 Capabilities and Deficiencies

USBUA100 IS ALPHA-LEVEL CODE: While it does appear functional within the limited range of use that it has been subjected to, it has not been tested on different systems or different Linux distributions. It has been released at this stage in the hopes that other UA-100 owners will give it a try and provide feedback needed to work all the bugs out.

Linux Distributions: USBUA100 has only been tested on a stock Red Hat 7.1 distribution (with a 2.4 kernel). I got it to compile on my Red Hat 7.0 (2.2 kernel) machine but did not do more than cursory run.

MIDI Device Files: MIDI input and output is relatively simple and seems pretty solid through the /dev/midi device files. The exact file names (i.e. /dev/midi00, /dev/midi01) are assigned dynamically and therefore system dependent. Name assignments are discussed later.

/dev/sequencer and /dev/mixer: Despite an extraordinary effort, I was unable to get USBUA100 to work with /dev/sequencer due to the arcane complexity of the OSS interface. Therefore, USBUA100 MIDI devices will not be visible under /dev/sequencer and any program (such as playmidi or kmid) that uses /dev/sequencer will not work with USBUA100. Similarly, there is no ALSA (Advanced Linux Sound System) support for USBUA100 and no /dev/mixer support. A graphical mixer program is provided and discussed later.

Audio Sample Formats: USBUA100 currently has no sample rate or resolution conversion capability and only provides capability for handling 44.1Khz 1, 2 and 4 channel 16-bit PCM sample formats (i.e. the native format of the UA-100).

Audio Quality: Audio input and output is relatively clean on my 600Mhz laptop, although there are occasional timing glitches that result in sporadic tics and dropouts.

Channels: Although the UA-100 has two audio output channels (i.e. two stereo D/A convertors), the USB protocol requires sending data for both channels simultaneously. To simplify implementation, only one audio device file (i.e. /dev/dsp or /dev/dsp1) is provided. While it writes stereo output to the first output channel, it supports quadraphonic (4-channel) writes which write to both.

Mixer: The USBUA100MIX console program for controlling the UA-100's internal mixer and effects is functional far from complete. There are still some quirks to the order of SYSEX messages that the UA-100 needs and you may need to click on selection boxes more than once to get the commands to work. The UA-100 has an extensive collection of audio effects and while capability for turning them on has been provided, only a handful of the dialogs needed to adjust the parameters for each effect have been written. I have always disliked the layout of the UA-100 mixer that is provided for Windows/Mac and I am striving to eliminate some unnecessary features (such as sub-masters).

1.2 Version History & Downloads

Version 2001.07.01: Documentation corrections, corrected bug handling sysex input and output, release to Source Forge.

Version 2001.06.24: Initial public release


2. Installation

2.1 USB-MIDI

There is an existing GPL project for a USB MIDI class driver, appropriately enough named USB-MIDI. The code is seems to work fine, but if you don't install this module, USBUA100 has MIDI handling for the UA-100 and you can move on to the Module Compilation and Installation section. Ultimately, MIDI handling will be removed from USBUA100 once USB-MIDI is stable, so you might as well give this a try.

Download the most recent USB-MIDI tarball listed on the USB-MIDI kernel module page. Uncompress and make, but DO NOT make install.

	$ tar -zxvf usb*.tar.gz
	$ cd usbmidi*
	$ make

You should verify that your USB-MIDI has the most current hardcoded descriptors for the UA-100. Open the usb-midi.h file and verify that EXACTLY the following lines exist somewhere in the code:

	{ /* Roland UA-100 */
	"Roland UA-100",
	USB_VENDOR_ID_ROLAND, USBMIDI_ROLAND_UA100G, 2, -1,
	{ { 0x82, 7 }, {-1, -1} }, /** cables 0,1 and 2 for SYSEX **/
	{ { 0x02, 7 }, {-1, -1} },
	},

The make install option is broken, so you will need to manually copy the module into the module directory and load it.

	$ cp usb-midi.o /lib/modules/*/kernel/drivers/usb
	$ /sbin/modprobe usb-midi

Verification of correct loading is given in the Testing section following the USBUA100 installation process.

2.2 Module Compilation & Installation

Download the USBUA100 source tarball from the link in Version History and untar/unzip it. This will copy the source and precompiled module into a "usbua100" directory:

	$ tar -zxvf usbua100-2001.06.24.tar.gz
	$ cd usbua100

USBUA100 is available as source code only and compilation is not slow or difficult. USBUA100 should compile with no problem on Red Hat 7.0 and 7.1 standard installations and probably will compile on other distributions with little or no tweaking of the makefile. Kernels before 2.2 do not have USB support and hence, USBUA100 will not compile or work on earlier kernels. Compilation of USBUA100MIX will require a version of QT compatible with QT version 2.3 - again, usually shipped with most distributions.

AS SUPERUSER, perform a simple make and make install:

	$ make
	$ make install

USBUA100 requires registration functions that are in the standard kernel sound modules. Unfortunately, these modules are loaded on demand and you will have to manually load them before loading the USBUA100 module:

	$ /sbin/insmod soundcore
	$ /sbin/insmod usbua100

2.3 Boot-time Load

To get these modules to load at boot time, you will need to manually edit your "/etc/rc.d/rc.local" boot script and add the two insmod lines (without the dollar sign, of course) at the end of the script.

No changes to modules.conf are suggested. Normally, sound cards are configured to load their modules on demand when the device is accessed. Therefore, if you have a native soundcard or internal sound chip that you want to take precedence over USBUA100 (e.g. soundcard uses /dev/dsp and USBUA100 uses /dev/dsp1), you must explicitly load that module BEFORE loading USBUA100. For example: in my laptop, the maestro module handles the Maestro sound chip. Therefore, the end of my rc.local file looks like this:

/sbin/insmod soundcore
/sbin/insmod maestro
/sbin/modprobe usb-midi
/sbin/insmod usbua100

2.4 Testing

If you haven't already, you should plug your UA-100 (or UM-1 or SC-8850) into the USB port of your computer and turn it on. You can verify that the USB subsystem has successfully recognized both USBUA100 and your hardware by typing:

	$ cat /proc/bus/usb/devices

You will get some rather cryptic output giving information about the USB devices connected to your computer. At the end of the list should be something that looks like this

	C:* #Ifs= 3 Cfg#= 1 Atr=40 MxPwr=  0mA
	I:  If#= 0 Alt= 0 #EPs= 1 Cls=ff(vend.) Sub=ff Prot=00 Driver=usbua100
	E:  Ad=01(O) Atr=01(Isoc) MxPS=   0 Ivl=  1ms
	I:  If#= 0 Alt= 1 #EPs= 1 Cls=ff(vend.) Sub=ff Prot=00 Driver=usbua100
	E:  Ad=01(O) Atr=01(Isoc) MxPS= 360 Ivl=  1ms
	I:  If#= 1 Alt= 0 #EPs= 1 Cls=ff(vend.) Sub=ff Prot=00 Driver=usbua100
	E:  Ad=81(I) Atr=01(Isoc) MxPS=   0 Ivl=  1ms
	I:  If#= 1 Alt= 1 #EPs= 1 Cls=ff(vend.) Sub=ff Prot=00 Driver=usbua100
	E:  Ad=81(I) Atr=01(Isoc) MxPS= 184 Ivl=  1ms
	I:  If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=00 Driver=usbua100
	E:  Ad=02(O) Atr=02(Bulk) MxPS=  32 Ivl=  1ms
	E:  Ad=82(I) Atr=02(Bulk) MxPS=  32 Ivl=  1ms
	I:  If#= 2 Alt= 1 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=00 Driver=usbua100
	E:  Ad=02(O) Atr=02(Bulk) MxPS=  32 Ivl=  1ms
	E:  Ad=82(I) Atr=03(Int.) MxPS=  32 Ivl=  2ms

This is a listing of the "endpoints" used for reading and writing to the USBUA100. The important part is "Driver=usbua100". If it reads "Driver=(none)", the USB subsystem has not recognized USBUA100. If it reads "Driver=midi", that is fine because it is connected to the USB-MIDI class driver. If you can't find anything like these lines in the listing, the USB subsystem has not detected your hardware and you should verify that your cable is connected correctly and the device is on.

Assuming that this listing is good, you can move on to trying some output.


3. Using the USBUA100 Device Files

3.1Dynamic Name Assignment

USBUA100 uses the OSS module registration functions which dynamically assign device files at the time the USB device is connected to the computer. As such, the exact name of the device files used to access your UA-100 will vary depending on the number of devices already connected at the time you connect and turn on your USB device.

Unfortunately, since the Linux sound system is in flux, /dev/sndconfig is apparently no longer a part of the standard Linux distribution. lsndlist is a simple command line program included as part of USBUA100 installation that lists current Linux sound device files. Type "lsndlist" at a command line prompt and you should get a listing of all sound devices on your system.

Alternatively, USBUA100 lists it's operational and error messages to the /var/log/messages system file. AS SUPERUSER, you can open this file and somewhere near the end should be messages from USBUA100 indicating which device files are being used. The listings should look something like this:

	Jun 23 16:43:10: USBUA100: Linux USB Driver for Roland MIDI interfaces v2001.06.23
	Jun 23 16:43:10: USBA100: Registered UA-100 Out as /dev/dsp1 - interface 0, endpoint 1
	Jun 23 16:43:10: USBA100: Registered UA-100 In as /dev/dsp1 - interface 1, endpoint 129
	Jun 23 16:43:10: USBA100: Registered UA-100 A as /dev/midi00
	Jun 23 16:43:10: USBA100: Registered UA-100 B as /dev/midi01
	Jun 23 16:43:10: USBA100: Registered UA-100 CTRL as /dev/midi02

This indicates that the audio device is /dev/dsp1 and the three MIDI ports (two in/out ports and one port for UA-100 control messages) are /dev/midi00, /dev/midi01 and /dev/midi02.

3.2/dev/midi

MIDI input and output is supported through the standard Linux /dev/midi files. As discussed above, the exact names (e.g. /dev/midi02, /dev/midi01) are dynamically assigned and system dependent.

To use MIDI output, you must, of course, have some kind of MIDI sound device connected to the MIDI output ports of the UA-100 or UM-1. The SC-8850 is a MIDI sound module that generates it's own sound.

The easiest program to test MIDI with is the lsndplaymidi program that is installed as part of the USBUA100 installation. You can use any MIDI file (.mid) on your system, or use the the aquarium.mid (from Saint-Saens Carnival of the Animals) included in the USBUA100 tarball. As detailed above, if you have existing MIDI devices on your system, /dev/midi00 may be /dev/midi01 or higher:

	$ lsndplaymidi aquarium.mid /dev/midi00

Note that lsndplaymidi is an extremely simple player that only supports type 0 MIDI files (which have a constant stream of MIDI messages in one "track"). Attempts to play type 1 or type 2 files will result in meaningful but fatal error messages.

3.3/dev/dsp

Digital audio input and output is supported through a standard Linux /dev/dsp files. As discussed above, the exact name (e.g. /dev/dsp, /dev/dsp1) is dynamically assigned and system dependent.

To test audio output, you need a .wav file. If you do not have one under Linux or on your Windows partition, you can "rip" one from a CD using the cdda2wav program that ships with most Linux distributions. Insert a CD in your computer's CD-ROM drive and type the following. If you want to use something other than track #1, change the number after the -t option. You can also change "audio" to any file name you want.

	$ cdda2wav -D /dev/cdrom -t 1 audio

Linux has a very flexible command line sound program called SOX. It has a rather cumbersome syntax, so there is a "play" script that can be invoked from the command line:

	$ play -d /dev/dsp1 audio.wav

/dev/dsp1 is an alternate sound device file. The main digital audio device is /dev/dsp. If you have no sound card on your computer, USBUA100 may attach to /dev/dsp instead of dsp1. If you have multiple sound devices, it may attach to /dev.dsp2 or higher.


4. Included Programs

4.1 usbua100mix

The USBUA100 tarball contains a QT-based graphical mixer interface for controlling the internal mixer and effects of the UA-100. This will not, of course, work with the UM-1 or SC-8850.

The executable is called "usbua100mix" and can be started by typing that on an X-Windows console.

The mixer assumes some familiarity with the audio paths of the UA-100. There are five channels:

Note that there is no recording level control. I have found that in practice, recording level should be set by the analog controls to maximize digital headroom on recorded tracks.

For each channel:

The UA-100 has the capability for either ONE very complex effect (FULL EFFECT) that can be applied to any input or assigned to one of the two system effects busses, OR THREE "compact" effects: an insertion effect that can be applied to one input and two system effects (a chorus and a reverb or delay) that are applied to the system effects busses. These are selected with the four buttons on the right of the USBUA100MIX dialog. Note that if a FULL effect is selected, the INSERTION and SYSTEM effects are turned off...and vice-versa.

The type of effect is selected in a combo box at the top of the appropriate dialog. THE PARAMETERS FOR MOST EFFECTS HAVE NOT BEEN IMPLEMENTED YET. When you select an effect, the default settings are applied for now. For the few effects with parameters, the meaning of a slider can be discerned by holding the mouse pointer over a slider...a tooltip bubble will pop up describing the purpose of the slider. This was chosen over short cryptic names to preserve space.

FULL effects can be applied to any input or to one of the two system effects busses. INSERTION effects can be applied to any input. The selection of where the effect is placed is a combo box next to the effect type combo box.

USBUA100MIX has the capability to save and load settings to/from the same .uax files that the MS-Windows version of the the mixer uses. This capability has not been tested extensively and is probably buggy.

USBUA100MIX works by sending system exclusive (SYSEX) messages to the UA-100 control port. The code (around line 302) contains a hard-coded string that defines this device as /dev/midi02 - which will be the device name if USBUA100 is used on a system where the UA-100 is the only MIDI device. You can change the MIDI device in the File->Midi Port dropdown menu when the program is running, although this change does not persist between invocations of the program. For a permanent change, you must alter the line in the source code

The UA-100 ships with a CD containing some awkwardly written HTML reference materials that are installed with the MS-Windows software in "/Program Files/Roland". If you have the UA-100 software installed on your Windows partition, you may want to consult this material for further details. You can also copy it off of the CD-ROM into a Linux directory.

4.2 usbua100sysex

During testing, I wrote a very simple command line program for sending SYSEX messages to the UA-100. Although it is superceded by the vastly superior USBUA100MIX graphical mixer, it is included in case you want to write scripts to control the UA-100. The syntax:

	usbua100sysex <midi device name> <address> <data bytes>...

For example:

	usbua100sysex /dev/midi02  00405003  64

This changes parameter address 00405003 (master volume level) to 64 (50%)

4.3 lsndlist

Unfortunately, since the old Linux sound system (OSS) interface is being superceded by a new one, the standard technique for listing sound capability (cat /dev/sndstat) no longer works. lsndlist is a command-line utility for listing the status of standard Linux audio device files.

To permit query of the names of USBUA100 MIDI devices, USBUA100 and lsndlist implement the SNDCTL_MIDI_INFO ioctl which is normally only used with /dev/sequencer.

lsndlist is also part of the LSND suite of simple command line programs.

4.4 lsndplaymidi

I was surprised to find that there is no commonly available Linux command line MIDI player available other than PLAYMIDI. PLAYMIDI cannot be used with USBUA100 because it requires a /dev/sequencer implementation to find device files. Therefore, lsndplaymidi is provided as a simple command line MIDI player. To ease implementation, only Type 0 MIDI files are supported. I assume that most sequencers have the capability for export in this format.

lsndplaymidi is also part of the LSND suite of simple command line programs.


5. Implementation and Protocol

Although the device descriptor for the UA-100 indicates that it is vendor specific, the MIDI implementation appears to comply with the official MIDI Device Class Definition. The MIDI endpoints of the UA-100 as well as the UM-1 and SC-8850 can also be accessed with USB-MIDI, the semi-official Linux USB MIDI class driver. However, I am not sure if you can use the class driver (yet) to access more than one of the MIDI ports (called Cable ID in the class driver), thus making it impossible to use both a MIDI output port and the UA-100 system control port for mixer control sysex MIDI messages. For that reason (and for convenience) MIDI endpoint handling is provided in USBUA100.

I am not quite as certain about whether the audio implementation complies with the audio class specification. I am new to USB programming and I basically figured out how to make this work with trial and error (and perhaps some divine intervention).

I did make a request to the people at Edirol (the American distributor of Roland's desktop music products) for specs. Their response was that no Linux drivers were currently planned and that it would be difficult for them to provide me with enough complete information to develop a driver.

5.1 MIDI Protocol

MIDI data is sent and received to/from the bulk transfer endpoints (interface #2, alternate 0, endpoints 0x02 and 0x82) in 4-byte chunks with a preceeding "burst" byte that indicates the destination/source port for following 3 bytes of data. All MIDI messages under status 0xf0 (SYSEX) are two or three bytes long and fit in a single 4-byte chunk. Messages over status byte 0xf0 are split into multiple consecutive chunks with the appropriate burst bytes specified below.

For MIDI sends, the upper 4 bits of the "burst" byte are the source/destination port (described below). The lower 4 bits are either the upper 4 bits of the MIDI message status byte, 4 for the beginning or middle of a SYSEX message, 6 if there are two bytes in the last SYSEX chunk, and 5 if there is one byte in the last chunk of a SYSEX message. For MIDI receives the protocol is basically the same with the upper four bits representing the input port.

	Example: 19 90 30 70 is a note on message sent to port 2.

For UA-100 sends, the "burst byte" is 0x00 for MIDI OUT 1, 0x10 for MIDI OUT 2 and 0x20 for the UA-100 control port which receives SYSEX messages to change the internal mixer and effect settings. MIDI receives are basically the same: 0x00 for MIDI IN 1 and 0x00 for MIDI IN 2.

For the UM-1, there is only one input and output port, so the upper 4 bits of the "burst byte" are always 0x00.

For the SC-8850, the "burst byte" indicates which of the four "parts" (i.e. 16-channel banks) should receive the MIDI output: 0x00 for Part A, 0x10 for Part B, 0x20 for Part C and 0x30 for Part D. However, unlike the other devices, for MIDI input: 0x40 for MIDI IN 1 and 0x50 for MIDI IN 2

Chunks smaller than 4 bytes (such as two-byte program change messages) are padded with trailing NULLs to a 4-byte length.

I desperately attempted to find a way to provide a way of registering the MIDI ports so they could be used by /dev/sequencer, but there are apparently some interrupts used by /dev/sequencer that caused the USB subsystem to issue some cryptic interrupt messages.

5.2 Audio Protocol

Audio protocol is a bit more difficult. I suspect that there are control/sync endpoints for changing the input format, but given my limited time and knowledge I simply figured out how to make the default (and possibly only) mode of operation work.

Audio data is written using a isosynchronous transfers to interface #0, address #1, alternate #1 for output and interface #1, address #81, alternate #1 for input. I initially attempted to use ASAP URB timing (e.g. urb->transfer_flags = USB_ISO_ASAP) therefore requiring no tracking of frame times, but the input had dropouts approximately every two seconds. Therefore, I had to implement start_frame handling using the usb_get_current_frame_number() function. USB_ISO_ASAP transfer handling is used for audio input. There are still sporadic output dropouts and more work on timing may be in order by someone more adept at USB handling than me.

To time isosynchronous writes correctly, each URB contain 10 isosynchronous packets totaling 441 samples apiece, i.e. 10ms per URB at 44.1Khz sample rate. This works out to 3528 bytes for write URBs with 8 byte samples (two 16-bit stereo channels) as nine packets of 352 bytes and one packet of 360 bytes. For Reads, however, each packet must be sent at full length (184 bytes) or you will get a nasty kernel message in /var/log/messages: "usb-uhci.c: interrupt, status 2, frame# xxx". The "actual_length" field of each packets indicates the (variable) number of bytes returned in each packet.

UA-100 interleaves 16-bit/44Khz PCM samples for the two output devices: L1, R1, L2, R2. If input is stereo, USBUA100 sends the data only to output device WAVE 1. If input is mono, USBUA100 sends the data to both channels of WAVE 1. Since USBUA100 sends URBs on demand, rather than continuously with a circular buffer as in the Linux audio class driver, it was not possible to create two separate Linux devices for wave 1 and wave 2.

References:

Audio Device Class Definition
Audio Data Formats Definition
MIDI Device Class Definition
Intel USB Documentation Page


6. UA-100 System Exclusive MIDI Messages

A listing of the UA-100 SYSEX messages (derived from Roland's documentation) is given below:

Data Transmission

	F0: Start SysEx
	41: Manufacturer (Roland)
	10: Device ID
	00: Model ID 1
	11: Model ID 2
	12: Command (Transmit data)
	aa: Address
	aa
    aa:
    aa:
	dd: Data
	dd:
    ck: checksum = 128 - ((sum of address & data bytes) & 0x3f);
	f7: end of SysEx

    Examples: F0 41 10 00 11 12   00 40 02 00   01 00  3D F7
              (select Stereo-EQ as Mic2 insertion effect)

              f0 41 10 00 11 12   00 40 50 03   64     09 f7
              (master level of 64)

In URB buffer, the message is split into 3 byte chunks with
a 24h is placed before every chunk except for a  25h before the
final chunk.

    24 f0 41 10    24 00 11 12   24 00 40 02   24 00 01 00   25 f7

Note that for messages with multiple data bytes (length > 1),
the first data byte (usually the significant one) comes first.


------------------------------------------------------------------------
00 40 00 00  01      PC Mode (VT Effect Mode) - sent by UA-100?
00 40 00 00  03      PC Mode (Compact Effect Mode)
00 40 00 00  04      PC Mode (Full Effect Mode)
00 40 00 00  05      VT Mode
00 40 00 00  06      Vocal Mode
00 40 00 00  07      Guitar Mode
00 40 00 00  08      GAME Mode
00 40 00 00  09      BYPASS Mode

00 40 00 01  0x      Copyright (0 off, 1 on)

    n = 1 (line, mic1, mic1+2), 2 (mic2), 3 (wave1), 4 (wave2), 5 (sys effect 1), 6 (sys effect 2)

00 40 0n 00  xx 00   Effect type (listed below)
00 40 0n 03  xx      Effect parameter 1
00 40 0n 04  xx      Effect parameter 2
00 40 0n 05  xx      Effect parameter 3
00 40 0n 06  xx      Effect parameter 4
00 40 0n 07  xx      Effect parameter 5
00 40 0n 08  xx      Effect parameter 6
00 40 0n 09  xx      Effect parameter 7
00 40 0n 0A  xx      Effect parameter 8
00 40 0n 0B  xx      Effect parameter 9
00 40 0n 0C  xx      Effect parameter 10
00 40 0n 0D  xx      Effect parameter 11
00 40 0n 0E  xx      Effect parameter 12
00 40 0n 0F  xx      Effect parameter 13
00 40 0n 10  xx      Effect parameter 14
00 40 0n 11  xx      Effect parameter 15
00 40 0n 12  xx      Effect parameter 16
00 40 0n 13  xx      Effect parameter 17
00 40 0n 14  xx      Effect parameter 18
00 40 0n 15  xx      Effect parameter 19
00 40 0n 16  xx      Effect parameter 20
00 40 0n 17  xx      Effect parameter 21
00 40 0n 18  xx      Effect parameter 22
00 40 0n 19  xx      Effect parameter 23
00 40 0n 1A  xx      Effect parameter 24
00 40 0n 1B  xx      Effect parameter 25
00 40 0n 1C  xx      Effect parameter 26
00 40 0n 1D  xx      Effect parameter 27
00 40 0n 1E  xx      Effect parameter 28
00 40 0n 1F  xx      Effect parameter 29
00 40 0n 20  xx      Effect parameter 30
00 40 0n 21  xx      Effect parameter 31
00 40 0n 22  xx      Effect parameter 32
00 40 0n 23  xx      Effect parameter 33
00 40 0n 24  xx      Effect parameter 34
00 40 0n 25  xx      Effect parameter 35
00 40 0n 26  xx      Effect parameter 36
00 40 0n 27  xx      Effect parameter 37
00 40 0n 28  xx      Effect parameter 38
00 40 0n 29  xx      Effect parameter 39
00 40 0n 2A  xx      Effect parameter 40

00 40 10 00  00      Mic input mode
00 40 10 00  01      Line input mode
00 40 10 00  02      MIC1+MIC2 Mode (not in VT mode)

00 40 10 01  xx      Input pan 1 (0 - 40 - 7f)
00 40 10 02  xx      Input pan 2 (0 - 40 - 7f)
00 40 10 03  0x      Monitor (0 off, 1 on)

    n = 1 (line, mic1, mic1+2), 2 (mic2), 3 (wave1), 4 (wave2), 5 (sys effect 1), 6 (sys effect 2)

00 40 1n 00  xx      Effect 1 send level (full/compact effect mode)
00 40 1n 02  xx      Effect 2 send level (full/compact effect mode)
00 40 1n 04  xx      Submaster send level (not in VT mode)
00 40 1n 05  xx      Fader level (not in VT mode)
00 40 1n 06  0x      Mute (0 off, 1 on)
00 40 1n 07  0x      Solo (0 off, 1 on)

00 40 40 00  01      VT effect mode
00 40 40 00  03      Compact effect mode (1 insertion + 2 system effects)
00 40 40 00  04      Full effect mode (1 effect)
00 40 40 01  0x      Line/Mic1/Mic1+2 insertion effect on/off (0 off, 1 on)
00 40 40 02  0x      Mic2 insertion effect on/off (0 off, 1 on)
00 40 40 03  0x      Wave1 insertion effect on/off (0 off, 1 on)
00 40 40 04  0x      Wave2 insertion effect on/off (0 off, 1 on)
00 40 40 05  0x      System effect 1 on/off (0 off, 1 on)
00 40 40 06  0x      System effect 2 on/off (0 off, 1 on)

00 40 40 07  xx      Effect 1 master return
00 40 40 08  xx      Effect 1 submaster return
00 40 40 09  xx      Effect 2 master return
00 40 40 0A  xx      Effect 2 submaster return

00 40 40 0B  0x      Vocal Transform 1 receive channel (0 - F)
00 40 40 0C  0x      Vocal Transform 1 note enabled (0 off, 1 on)
00 40 40 0D  0x      Vocal Transform 1 bend enabled (0 off, 1 on)
00 40 40 0E  0x      Vocal Transform 2 receive channel (0 - F)
00 40 40 0F  0x      Vocal Transform 2 note enabled (0 off, 1 on)
00 40 40 10  0x      Vocal Transform 2 bend enabled (0 off, 1 on)

00 40 50 00  0x      Record source (Mixer: 0 line/mic, 1 mic2, 2 wave1, 3 wave2, 4-7 ch 1-4, 8 submaster, 9 master)
                                   (VT: 0 line/mic, 1 mic3, 2 wave1, 3 wave2, 4 VT-out, 5 master)
00 40 50 01  0x      Output (see record source)
00 40 50 02  xx      Recording level
00 40 50 03  xx      Master level


      n  = 0 (Voice Transformer), 1 (Vocal), 2 (Guitar), 3 (Game) (NOT FOR PC MODE)

00 40 6n 00  xx      Preset effect parameter 1 (0 - 39)
00 40 6n 01  xx      Preset effect parameter 2 (0 - 39)
00 40 6n 02  xx      Preset effect parameter 3 (0 - 39)
00 40 6n 03  xx      Preset effect parameter 4 (0 - 39)

00 40 6n 04  xx      Preset effect default Value 1 (0 - 127)
00 40 6n 05  xx      Preset effect default Value 2 (0 - 127)
00 40 6n 06  xx      Preset effect default Value 3 (0 - 127)
00 40 6n 07  xx      Preset effect default Value 4 (0 - 127)
00 40 6n 08  xx      Preset effect default Value 5 (0 - 127)
00 40 6n 09  xx      Preset effect default Value 6 (0 - 127)
00 40 6n 0A  xx      Preset effect default Value 7 (0 - 127)
00 40 6n 0B  xx      Preset effect default Value 8 (0 - 127)
00 40 6n 0C  xx      Preset effect default Value 9 (0 - 127)
00 40 6n 0D  xx      Preset effect default Value 10 (0 - 127)
00 40 6n 0E  xx      Preset effect default Value 11 (0 - 127)
00 40 6n 0F  xx      Preset effect default Value 12 (0 - 127)

00 40 6n 10  xx      Preset effect default Value 13 (0 - 127)
00 40 6n 11  xx      Preset effect default Value 14 (0 - 127)
00 40 6n 12  xx      Preset effect default Value 15 (0 - 127)
00 40 6n 13  xx      Preset effect default Value 16 (0 - 127)
00 40 6n 14  xx      Preset effect default Value 17 (0 - 127)
00 40 6n 15  xx      Preset effect default Value 18 (0 - 127)
00 40 6n 16  xx      Preset effect default Value 19 (0 - 127)
00 40 6n 17  xx      Preset effect default Value 20 (0 - 127)
00 40 6n 18  xx      Preset effect default Value 21 (0 - 127)
00 40 6n 19  xx      Preset effect default Value 22 (0 - 127)
00 40 6n 1A  xx      Preset effect default Value 23 (0 - 127)
00 40 6n 1B  xx      Preset effect default Value 24 (0 - 127)
00 40 6n 1C  xx      Preset effect default Value 25 (0 - 127)
00 40 6n 1D  xx      Preset effect default Value 26 (0 - 127)
00 40 6n 1E  xx      Preset effect default Value 27 (0 - 127)
00 40 6n 1F  xx      Preset effect default Value 28 (0 - 127)
00 40 6n 20  xx      Preset effect default Value 29 (0 - 127)
00 40 6n 21  xx      Preset effect default Value 30 (0 - 127)
00 40 6n 22  xx      Preset effect default Value 31 (0 - 127)
00 40 6n 23  xx      Preset effect default Value 32 (0 - 127)
00 40 6n 24  xx      Preset effect default Value 33 (0 - 127)
00 40 6n 25  xx      Preset effect default Value 34 (0 - 127)
00 40 6n 26  xx      Preset effect default Value 35 (0 - 127)
00 40 6n 27  xx      Preset effect default Value 36 (0 - 127)
00 40 6n 28  xx      Preset effect default Value 37 (0 - 127)
00 40 6n 29  xx      Preset effect default Value 38 (0 - 127)
00 40 6n 2A  xx      Preset effect default Value 39 (0 - 127)
00 40 6n 2B  xx      Preset effect default Value 40 (0 - 127)

00 40 60 7F  00      Preset effect parameter write


---------------------------------------------------------

System Effect 1

	0021: Delay
	0022: Chorus

System Effect 2

	0031: Delay
	0032: Reverb

Full Effects
	0011: High Quality Reverb
	0012: Mic Simulator
	0013: Vocoder
	0014: Vocal Multi
	0016: Game with 3D Reverb
	0300: Rotary Multi (same parameters as insertion #47)
	0400: Guitar Multi 1 (same parameters as insertion #48)
	0401: Guitar Multi 2 (same parameters as insertion #49)
	0402: Guitar Multi 3 (same parameters as insertion #50)
	0403: Clean Guitar Multi 1 (same parameters as insertion #51)
	0404: Clean Guitar Multi 2 (same parameters as insertion #52)
	0405: Bass Multi (same parameters as insertion #53)
	0406: Electric Piano Multi (same parameters as insertion #54)
	0500: Keyboard Multi ( (same parameters as insertion #55)

Insertion Effects
	0000: (00) Noise Suppressor
	0100: (01) Stereo Equalizer
	0101: (02) Spectrum
	0102: (03) Enhancer
	0103: (04) Humanizer
	0110: (05) Overdrive
	0111: (06) Distortion
	0120: (07) Phaser
	0121: (08) Auto Wah
	0122: (09) Rotary
	0123: (10) Stereo Flanger
	0124: (11) Step Flanger
	0125: (12) Tremolo
	0126: (13) Auto Pan
	0130: (14) Compressor
	0131: (15) Limiter
	0140: (16) Hexa Chorus
	0141: (17) Tremolo Chorus
	0142: (18) Stereo Chorus
	0143: (19) Space D
	0144: (20) 3D Chorus
	0150: (21) Stereo Delay
	0151: (22) Modulation Delay
	0152: (23) 3 Tap Delay
	0153: (24) 4 Tap Delay
	0154: (25) Time Control Delay
	0155: (26) Reverb
	0156: (27) Gate Reverb
	0157: (28) 3D Delay
	0160: (29) 2-voice Pitch Shifter
	0161: (30) Feedback Pitch Shifter
	0170: (31) 3D Auto
	0171: (32) 3D Manual
	0172: (33) Lo-Fi 1
	0173: (34) Lo-Fi 2
	0200: (35) Overdrive/Chorus
	0201: (36) Overdrive/Flanger
	0202: (37) Overdrive/Delay
	0203: (38) Distortion/Chorus
	0204: (39) Distortion/Flanger
	0205: (40) Distortion/Delay
	0206: (41) Enhancer/Chorus
	0207: (42) Enhancer/Flanger
	0208: (43) Enhancer/Delay
	0209: (44) Chorus/Delay
	020a: (45) Flanger/Delay
	020b: (46) Chorus/Flanger
	0300: (47) Rotary Multi
	0400: (48) Guitar Multi1
	0401: (49) Guitar Multi2
	0402: (50) Guitar Multi3
	0403: (51) Clean Guitar Multi1
	0404: (52) Clean Guitar Multi2
	0405: (53) Bass Multi
	0406: (54) E.Piano Multi
	0500: (55) Keyboard Multi
	1100: (56) Chorus/Delay
	1101: (57) Flanger/Delay
	1102: (58) Chorus/Flanger
	1103: (59) Overdrive/Distortion1,2
	1104: (60) Overdrive/Distortion/Rotary
	1105: (61) Overdrive/Distortion/Phaser
	1106: (62) Overdrive/Distortion/Auto-wah
	1107: (63) Phaser/Rotary
	1108: (64) Phaser/Auto-wah