Alesis QuadraVerb Plus: SysEx Format

Bob Page, October 1, 1990

[This information is presented in the hope that it will be useful, but no warrantees as to its accuracy are given. In fact, let me know if you have changes/additions. Feel free to use this information in any way for any purpose, but please don't pretend you wrote it (leave my name in this document). If you want to send me code you write based on this info, I won't say no...]

Note that Alesis has made the QV SysEx information available through the IMA. This document is not based on the Alesis information, primarily because Alesis hadn't released the information when I needed it.

Contents:

QuadraVerb System Exclusive Data Encoding Format

You first need to understand how the QV encodes its data for MIDI transmission. Although all 8 bits of a byte are used internally, the MIDI specification reserves the highest bit for status messages, so these high bits have to be "removed" from the data stream. In this case, the 8-bit QuadraVerb data is encoded for MIDI transmission into 7-bit data. The encoding looks like this:

Seven QuadraVerb bytes (each line represents one byte):

   Byte 0: a7 a6 a5 a4 a3 a2 a1 a0
        1: b7 b6 b5 b4 b3 b2 b1 b0
        2: c7 c6 c5 c4 c3 c2 c1 c0
        3: d7 d6 d5 d4 d3 d2 d1 d0
        4: e7 e6 e5 e4 e3 e2 e1 e0
        5: f7 f6 f5 f4 f3 f2 f1 f0
        6: g7 g6 g5 g4 g3 g2 g1 g0
are transmitted as eight MIDI bytes:
   Byte 0: 00 a7 a6 a5 a4 a3 a2 a1
        1: 00 a0 b7 b6 b5 b4 b3 b2
        2: 00 b1 b0 c7 c6 c5 c4 c3
        3: 00 c2 c1 c0 d7 d6 d5 d4
        4: 00 d3 d2 d1 d0 e7 e6 e5
        5: 00 e4 e3 e2 e1 e0 f7 f6
        6: 00 f5 f4 f3 f2 f1 f0 g7
        7: 00 g6 g5 g4 g3 g2 g1 g0
Here is a C fragment to decode the dump:
  unsigned char c;

  oc = 0;
  for (i=0; ((c = getc(ifp)) < 0x80); i++) {
     i %= 147;			/* end of program */
     if (shift = i % 8) {
        oc = (oc << shift) + (c >> (7-shift));
        putc(oc, ofp);
     }
     oc = c;
  }
All the info given below assumes the data has been decoded. If you are going to send the data back to the QV after editing it, you have to encode it first. Code fragment left as an exercise for the reader.

QuadraVerb System Exclusive Command Format

Note you have to tell the QuadraVerb to accept MIDI SysEx data before any of this will work. Although it's possible to instruct the QV to disable SysEx via MIDI SysEx; it's not possible to re-enable it; you have to go do it from the front panel.

A QuadraVerb SysEx command string looks like (in hex):

    f0  - SysEx start
    00  \
    00   - Alesis mfr code 
    0e  /
    02  QuadraVerb ID number
    cc  QuadraVerb command code
    pp  QuadraVerb command code parameter
    dd  data stream (variable length)
    ..
    f7  End of SysEx
The command codes are:
    01 Change Parameter
    02 Load Program
    03 Dump Program
The parameters depend on the command and are discussed below.

Dump Program (command code 03)

To have an external device initiate a QuadraVerb program dump, send the following MIDI sequence to the QV:
       f0 00 00 0e 02 03 pp f7
where '03' is the "dump data" command, and 'pp' is the hex parameter:
       00-63  single program, 0-99
       64     edit buffer
       65     all of memory
Keep in mind if you're doing lots of edit/compares on program 27 you probably want to be dumping the edit buffer, not program 27, as #27 is only modified when the STORE is done.

Load Program (command code 02)

The format is similar:
       f0 00 00 0e 02 02 pp (data) f7
where 'pp' is the same as in the above description. The data must be encoded before being sent. If you do it right you should send 155 bytes out the MIDI port (including SysEx etc) for an individual program.

Change Parameter (command code 01)

       f0 00 00 0e 02 01 gg pp dd dd dd f7
where 'gg' is the 'parameter group' you want to change:
       00 - program
       01 - reverb
       02 - delay
       03 - pitch
       04 - eq
       05 - midi
       06 - store
       07 - config
       08 - mix
       09 - mod
       0a - name
and 'pp' is the parameter number within parameter group (for example in 'reverb', parameter number 0 is 'Reverb Type', and the numbers increase the same as if you used the PAGE UP key).

The "dd dd dd" string is the value you want in that parameter. It must be encoded, even if it fits in 7 bits. Sometimes the value takes two bytes; in that case they should be sent MSB (most significant byte) first, then LSB. When one byte is encoded it will become two bytes; likewise two become three. If you're sending two bytes (after encoding) send them first, then 00, then f7.

The QV will also send you these Change Parameter requests every time a parameter is changed using the front panel. If somebody selects the Delay Time parameter and pushes the button to go from 1 to 400ms, you're going to get 399 of these messages. You will get messages every time the VALUE buttons get pushed, even when nothing changes (like being in program mode and pressing the down key when you're already at program zero), so be prepared for them.

You can't send running parameter change requests; each one has to be a separate SysEx message.

QuadraVerb System Exclusive Program Format

A single program has 128 bytes of data. When it's encoded and shipped over MIDI, it's 147 bytes (without SysEx headers). That's why the decode fragment above has that magic number in it.

Unused locations have zeros in them. The EQ bytes change meaning depending on whether or not graphic EQ is being used, so both are given. Everything here is listed in decimal.

Graphic EQ parameters, only used in the Graphic_EQ->Delay configuration:

 Byte   Description            Default  Range
   0     ???                      ??    ?? [usually set to 14]
   1     16Hz                     14    0-28 (14 is center)
   2     32Hz                     14    0-28 (14 is center)
   3     62Hz                     14    0-28 (14 is center)
   4    126Hz                     14    0-28 (14 is center)
   5    250Hz                     14    0-28 (14 is center)
   6    500Hz                     14    0-28 (14 is center)
   7     1kHz                     14    0-28 (14 is center)
   8     2kHz                     14    0-28 (14 is center)
   9     4kHz                     14    0-28 (14 is center)
  10     8kHz                     14    0-28 (14 is center)
  11    16kHz                     14    0-28 (14 is center)
  12     ???                      ??    ?? [usually set to 24]
Graphic EQ also seems to change all modulation targets to 16Hz boost/cut.

Here's the complete list, in byte order. Note that all parameters have a 'default' value you can get by pressing both VALUE buttons at the same time - if you're building a patch editor you might want this info so your user can hit a button to get the default value for some parameter.

Byte  Description            Default  Range
   0  Low EQ Frequency MSB
   1  Low EQ Frequency LSB     200  20-999Hz
   2  Low EQ Amplitude MSB
   3  Low EQ Amplitude LSB     280  0=-14db, 280=0db, 560=14db, 0.05 steps
   4  Low EQ Frequency MSB
   5  Mid EQ Frequency LSB    2000  200-9999Hz
   6  Mid EQ Bandwidth         100  20-255 (0.2-2.55 octaves)
   7  Mid EQ Amplitude MSB
   8  Mid EQ Amplitude LSB     280  0=-14db, 280=0db, 560=14db, 0.05 steps
   9  High EQ Frequency MSB
  10  High EQ Frequency LSB   8000  2000-18000Hz
  11  High EQ Amplitude MSB
  12  High EQ Amplitude LSB    280  0=-14db, 280=0db, 560=14db, 0.05 steps
  13  Leslie High Rotor Level   20  0=-20db, 26=+6db
  14  Low-Mid EQ Freq. MSB
  15  Low-Mid EQ Freq. LSB     100  20-500Hz       (really 100Hz default!)
  16  Low-Mid EQ Bandwidth     100  20-255 (0.2-2.55 octaves)
  17  Low-Mid EQ Ampl. MSB
  18  Low-Mid EQ Ampl. LSB     280  0=-14db, 280=0db, 560=14db, 0.05 steps
  19  High-Mid EQ Freq. MSB
  20  High-Mid EQ Freq. MSB   6000  2000-18000Hz
  21  High-Mid EQ Bandwidth    100  20-255 (0.2-2.55 octaves)
  22  High-Mid EQ Ampl. MSB
  23  High-Mid EQ Ampl. LSB    280  0=-14db, 280=0db, 560=14db, 0.05 steps
  24  Sample Start               0  0-150 (0-1.50 seconds)
  25  Sample Length            155  5-155 (0.05-1.55 seconds)
  26  Pitch Mode                 1  0-5 m/s_chorus, m/s_flange, phase, detune
  27  Pitch Input                1  0=pre-eq, 1=post-eq
  28  LFO Waveshape              0  0=triangle, 1=square
  29  LFO/Phaser Speed          20  0=1, 98=99
  30  LFO/Phaser Depth          50  0=1, 98=99
      Resonator Decay           50  0-99
  31  Sample Playback            1  0=looping, 1=one shot, 2=audio trigger
  32  Pitch Feedback (%)         0  0-99
  33  Detune Amount             99  0=-99, 99=none, 198=+99
  34  Leslie Stereo Separat.    99  0-99
  35  Leslie Motor               1  0=off, 1=on
      Auto Trigger Sampling      0  0=off, 1=on (for Sampling)
  36  Leslie Motor Speed         0  0=slow, 1=fast
      Sampler MIDI Trigger       0  0=off, 1=gated, 2=one shot (Sampling)
  37  Trigger Flange             0  0=off, 1=on
      Resonator Gate Mode        0  0=continuous, 1=MIDI gated
  38  MIDI Trigger Base         60  0-127
  39  Delay Type                 1  0=mono, 1=stereo, 2=ping-pong, 3=m-tap
  40  Delay Input 1              1  0=pre-eq, 1=post-e1
  41  Delay Input Mix           99  0=input1, 99=center, 198=pitch/leslie
  42  Left Delay Time (MSB)         1-400ms (1-800ms mono)
  43  Left Delay Time (LSB)    100  If graphicEQ: 1-750ms (1-1500ms mono)
  44  Left Delay Feedback (%)    0  0-99
  45  Right Delay Time (MSB)        (Right not used in mono)
  46  Right Delay Time (LSB)   100  1-400ms (if graphicEQ: 1-750ms)
  47  Right Delay Feedback (%)   0  0-99
  48  MIDI Trigger Low Limit     0  0-127
  49  MIDI Trigger High Limit   127 0-127
  50  Reverb Type                0  0=plate, 1=room, 2=chamber, 3=hall, 4=rev
  51   [unused except for Multi-Tap; see below]
  52  Reverb Input 1             3  0=pre-eq, 1=post-eq, 2=pitch, 3=delay_mix
                                    (set to 1 by Sampling config)
  53  Reverb Input 2             1  0=pitch out, 1=delay out
  54  Reverb Input Mix           0  0=Input1, 99=center, 198=Input2
  55  Reverb PreDelay           40  1-140ms
  56  PreDelay Mix             198  0=Pre, 99=center, 198=Post
  57  Reverb Decay              50  0-99
  58  Reverb Diffusion Amount    8  0=1, 4=5, 8=9
  59  Low Frequency Decay       60  0=-60, 30=-30, 60=0
  60  High Frequency Decay      40  0=-60, 30=-30, 60=0
  61  Reverb Density             8  0=1, 4=5, 8=9
  62  Reverb Gate                0  0=off, 1=on
  63  Reverb Gate Hold Time      0  0-99
  64  Reverb Gate Rleas. Time   80  0-99
  65  Reverb Gated Level (%)     0  0-99
  66   [unused except for Multi-Tap; see below]
  67  Spectrum Shift           100  1-300 (Hz)
  68  Configuration              0  0-7
  69  Direct Signal Select       0  0=pre-EQ, 1=EQ+, 2=EQ+pan, 3=EQ+tremelo
  70  Direct/EQ Signal Level    99  0-99 (EQ Out if Direct Signal Select = 1)
  71  Master Effects Level      50  0-99
  72  Pitch Output Level        50  0-99 (incl Leslie & Ring Mod)
      Sample Playback Level     99  0-99
  73  Delay Output Level        50  0-99
  74  Reverb Output Level       50  0-99
  75  Resonator 1 Tune          24  0=-24, 24=none, 60=+36 (semitones)
  76  Resonator 2 Tune          24  0=-24, 24=none, 60=+36 (semitones)
  77  Resonator 3 Tune          24  0=-24, 24=none, 60=+36 (semitones)
  78  Resonator 4 Tune          24  0=-24, 24=none, 60=+36 (semitones)
  79  Resonator 5 Tune          24  0=-24, 24=none, 60=+36 (semitones)
  80  Mod 1 Source               0  0-125 (see list below)
  81  Mod 1 Target               0  (see Modulation Targets section below)
  82  Mod 1 Amplitude            0  0=-99, 99=0, 198=+99
  83  Mod 2 Source
  84  Mod 2 Target                  Sources: 0=pitch_bend, 1=after_touch,
  85  Mod 2 Amplitude                        2=note_number, 3=note_velocity,
  86  Mod 3 Source                           4-125 correspond to MIDI
  87  Mod 3 Target                           controller numbers 0-121.
  88  Mod 3 Amplitude
  89  Mod 4 Source
  90  Mod 4 Target
  91  Mod 4 Amplitude
  92  Mod 5 Source
  93  Mod 5 Target
  94  Mod 5 Amplitude
  95  Mod 6 Source
  96  Mod 6 Target
  97  Mod 6 Amplitude
  98  Mod 7 Source
  99  Mod 7 Target
 100  Mod 7 Amplitude
 101  Mod 8 Source
 102  Mod 8 Target
 103  Mod 8 Amplitude
 104  Master Feedback (%)        0  0-99
 105  Tap Number (for editing)   0  0-7
 106  Edit Name Character  1    32  The following 96 characters, in order:
 107  Edit Name Character  2         !"#$%&'()*+,-./0123456789:;<=>?
 108  Edit Name Character  3        @ABCDEFGHIJKLMNOPQRSTUVWXYZ[Y]^_
 109  Edit Name Character  4        `abcdefghijklmnopqrstuvwxyz{|}><
 110  Edit Name Character  5
 111  Edit Name Character  6        The second Y is the Japanese 'Yen' or
 112  Edit Name Character  7        Chinese 'Yuan' (monetary) symbol.  The
 113  Edit Name Character  8        last two characters are right and left
 114  Edit Name Character  9        arrows.  The backslash and tilde
 115  Edit Name Character 10        characters are not available.
 116  Edit Name Character 11
 117  Edit Name Character 12        Note this list is in ASCII order, and
 118  Edit Name Character 13        the ASCII equivalent is what's stored.
 119  Edit Name Character 14
 120  Ring Modulator Output Mix 99  0=down 99, 99=none, 198=up 99
 121  Delay/Reverb Input Mix    99  0=down 99, 99=none, 198=up 99
 122  EQ Panning/Tremolo Speed  30  1-99
 123  EQ Panning/Tremolo Depth  99  0-99
 124    [unused]
 125    [unused]
 126    [unused]
 127    [unused]
When Multi-Tap Delay is used, a number of locations take on different meanings:
  13  Tap 1 Delay MSB               (really 13 and 24!)
  24  Tap 1 Delay LSB          150  0-625 (ms)
  25  Tap 1 Volume              50  0-99
  31  Tap 1 Panning             99  0=left 99, 99=center, 198=right 99
  34  Tap 1 Feedback (%)         0  0-99
  35  Tap 2 Delay MSB
  36  Tap 2 Delay LSB
  38  Tap 2 Volume
  42  Tap 2 Panning
  43  Tap 2 Feedback (%)
  44  Tap 3 Delay MSB
  45  Tap 3 Delay LSB
  46  Tap 3 Volume
  47  Tap 3 Panning
  48  Tap 3 Feedback (%)
  49  Tap 4 Delay MSB
  50  Tap 4 Delay LSB
  51  Tap 4 Volume
  52  Tap 4 Panning
  53  Tap 4 Feedback (%)
  54  Tap 5 Delay MSB
  55  Tap 5 Delay LSB
  56  Tap 5 Volume
  57  Tap 5 Panning
  58  Tap 5 Feedback (%)
  59  Tap 6 Delay MSB
  60  Tap 6 Delay LSB
  61  Tap 6 Volume
  62  Tap 6 Panning
  63  Tap 6 Feedback (%)
  64  Tap 7 Delay MSB
  65  Tap 7 Delay LSB
  66  Tap 7 Volume
  67  Tap 7 Panning
  74  Tap 7 Feedback (%)
  75  Tap 8 Delay MSB
  76  Tap 8 Delay LSB
  77  Tap 8 Volume
  78  Tap 8 Panning
  79  Tap 8 Feedback (%)

Modulation Targets

The target numbers are not constant; it depends on what configuration you are using, so you can't always change the target to #48 and know it always means your modulator affects Low EQ Frequency. What a pain.
  0  Reverb Input Mix
  1  Reverb PreDelay
  2  Reverb PreDelay Mix
  3  Reverb Reverse Time	(Reverb Decay?  I think the LCD mislabels this)
  4  Reverb Diffusion
  5  Reverb Density
  6  Reverb Low Decay
  7  Reverb High Decay

 16  Delay Input Mix           (L/Mono Delay Time if GraphicEQ)
 17  L/Mono Delay Time         (L/Mono Delay Feedback if GraphicEQ)
                               (Tap 1 Delay Time)
 18  L/Mono Delay Feedback     (R Delay Time if GraphicEQ)
                               (Tap 2 Delay Time)
 19  R Delay Time              (R Delay Feedback if GraphicEQ)
                               (Tap 3 Delay Time)
 20  R Delay Feedback          (Tap 4 Delay Time)
 21                            (Tap 5 Delay Time)
 22                            (Tap 6 Delay Time)
 23                            (Tap 7 Delay Time)
 24                            (Tap 8 Delay Time)

 32  LFO/Phaser Speed	(Leslie Stereo)         (Spectrum Shift) (Resonator Decay)
 33  LFO/Phaser Depth	(Leslie Motor)          (Ring Output Mix)
 34  Pitch Feedback		(Leslie Speed)          (Delay/Reverb Input Mix if Ring Mod)

 48  Low EQ Frequency	(16Hz boost/cut)	(Leslie High Level)
 49  Low EQ Amplitude	(32Hz boost/cut)
 50  Mid EQ Frequency	(62Hz boost/cut)	(Low-Mid EQ Frequency)
 51  Mid EQ Bandwidth	(126Hz boost/cut)	(Low-Mid EQ Width)
 52  Mid EQ Amplitude	(250Hz boost/cut)	(Low-Mid EQ Amplitude)
 53  High EQ Frequency	(500Hz boost/cut)	(Mid EQ Frequency)
 54  High EQ Amplitude	(1kHz boost/cut)	(Mid EQ Bandwidth)
 55				(2kHz boost/cut)	(Mid EQ Amplitude)
 56				(4kHz boost/cut)	(High-Mid EQ Frequency)
 57				(8kHz boost/cut)	(High-Mid EQ Bandwidth)
 58				(16kHz boost/cut)	(High-Mid EQ Amplitude)
 59							(High EQ Frequency)
 60							(High EQ Amplitude)

 64  Direct/EQ Mix Level	(Effect Mix Level if GraphicEQ)
 65  Effect Mix Level	(EQ Mix Level if GraphicEQ)
 66  Pitch/Leslie/Ring/Resonator Mix Level	(Delay Mix if GraphicEQ, Reverb Mix if conf 5)
 67  Delay Mix Level
 68  Reverb Mix Level

 80  Tap 1 Volume
 81  Tap 2 Volume
 82  Tap 3 Volume
 83  Tap 4 Volume
 84  Tap 5 Volume
 85  Tap 6 Volume
 86  Tap 7 Volume
 87  Tap 8 Volume
 88  Tap 1 Panning
 89  Tap 2 Panning
 90  Tap 3 Panning
 91  Tap 4 Panning
 92  Tap 5 Panning
 93  Tap 6 Panning
 94  Tap 7 Panning
 95  Tap 8 Panning
 96  Tap 1 Feedback
 97  Tap 2 Feedback
 98  Tap 3 Feedback
 99  Tap 4 Feedback
100  Tap 5 Feedback
101  Tap 6 Feedback
102  Tap 7 Feedback
103  Tap 8 Feedback
104  Master Feedback

Conf 0 (EQ->PCH->DL->REVERB)
Conf 1 (LEZLIE->DL->REVERB)
Conf 2 (GRAPHIC EQ->DELAY)
Conf 3 (5BAND EQ->PCH->DLY)
Conf 4 (3 BAND EQ->REVERB) sets all 8 targets to 32 (LFO Speed).
Conf 5 (RING->DL->REVERB)
Conf 6 (RESONATOR->DL->REV)
Conf 7 (SAMPLING) doesn't use modulators.

Full Program Dump Format

A full dump is all 100 programs, end to end. HOWEVER, the MIDI encoding starts over at each program (that's why you see the i %= 147 statement in the decoding fragment above). The edit buffer is not dumped on a full dump, so after decoding your data should have 12800 bytes.

No MIDI parameters are ever dumped, and there is no checksum information. I don't know how to get the version of the ROM (without opening the case).

To the QuadraVerb main page


page@neato.org