1 | MOD |
11 | EXPRESSION PEDAL |
64 | HOLD |
However, Boutique modules of the same kind can be chained in order to increase polyphony. To accomplish this, it is necessary that the master module (the first in the chain) is able to control parameters of the slave modules. It does so by transmitting system exclusive ("sysex") messages whenever the master's state is changed.
- If the master is switched to a different patch, a dump of all its parameters is transmitted via several system exclusive messages. A dump of the current patch is also sent, when the master is switched to chain mode.
- If voice parameters are changed via panel controls, appropriate system exclusive messages are sent.
So, while a module that is not in chain mode will not send parameters or dumps on its own, you can still request that it sends these parameter values by sending it parameter request messages.
A parameter request message has the following form:
f0 41 10 00 00 00 1d 11 [address] [length] xx f7
| | | | | | | | | |
| | | ? ? ? | Request parameter | End of Exclusive
| | | Product code for JU-06 Checksum
| | Device ID
| Roland
Begin System Exclusive
Address and length fields are 4 bytes each, highest byte first. Because parameter values are sent half-byte wise (4 bits per sysex byte, higher bits first), lengths and addresses are multiples of two. Note that with the Boutiques you cannot request multiple values at once (by specifying an appropriate length), therefore the length field is usually 2 (most parameter values are 8-bit values = 2 times 4bits). The checksum covers only the address and length (or data, see below) fields.
The response sent by a module looks as follows:
f0 41 10 00 00 00 1d 12 [address] [data] xx f7
| | | | | | |
| | | | Parameter value | End of Exclusive
| | | Product code for JU-06 Checksum
| | Device ID
| Roland
Begin System Exclusive
Because data bytes in a MIDI message must have their highest bit=0, a data byte can contain only values from 0 to127. A 8-bit parameter value is therefore split into two half-bytes, each containing 4 bits of parameter value data, and sent as two MIDI data bytes, with the highest 4 bits in the first byte.
aaaabbbb -> 0000aaaa 0000bbbb d[i]=(v>>4)&0x0f; d[i+1]=v&0x0f;
In a response, two such successive MIDI bytes are combined in the following manner to reconstruct a parameter value byte.
0000xxxx 0000yyyy -> xxxxyyyy (d[i]<<4)|(d[i+1]&0x0f)
The following table shows all known parameters of the JU-06. The top 2 bytes of the address field are always 03 00 , so the table lists only the high (columns) and low (rows) bytes of the remaining 2 address bytes. The address ranges (indicated by the high byte, i.e. columns) appear to relate to a particular function (LFO, DCO, ...).
06 | 07 | 08 | 09 | 0A | 10 | 11 | |
00 | Rate | Range | HPF | Mode | Attack | Chorus Switch | Porta Switch |
02 | Delay Time | LFO Mod | Cutoff | Level | Decay | Delay Level | Porta Time |
04 | PWM | Reso | Sustain | Delay Time | Assign Mode | ||
06 | PWM Source | Env Polarity | Release | Delay Feedb | ??? | ||
08 | Square Switch | Env Mod | Bend Range | ||||
0A | Saw Switch | LFO Mod | |||||
0C | Sub Level | Key Follow | |||||
0E | Noise Level | ||||||
LFO | DCO | VCF | VCA | ENV | Effect | Controller |
Example: VCF Cutoff has address [03 00] 08 02
The patch dump that you get when you change voices or switch to chain mode is split by function. So you get a separate sysex message for each of the address ranges starting with 06 00 (LFO), 07 00 (DCO), and so on. What's interesting, is that each message contains more entries than there are parameters in the JU-06. So while the LFO has two parameters, the corresponding sysex message has 7 entries! I wonder what they are for...
Address | 06 | 07 | 08 | 09 | 0A | 10 | 11 |
Function | LFO | DCO | VCF | VCA | ENV | Effect | Controller |
Parameters | 2 | 8 | 7 | 2 | 4 | 4 | 4 (5) |
Sysex entries | 7 | 13 | 12 | 7 | 9 | 10 | 11 |
When you supply the wrong number of 'length' bytes (2 or 3) in a parameter request, yet still the correct check sum, the JU-06 responds with a dump of the whole data set (as in a voice dump), but with more entries. This way, I discovered that the patch name starts at address (03 00) 11 16. A patch name appears to be 16 characters long -- at least that's the number of characters in the file dumps that you get when you follow the data backup procedure of your module. In the sysex dump there are a lot more characters, but I don't know what they're for -- yet.
If you want to query the voice name, you have to include 2 bytes before the voice name. When I supplied address 11 16, the module consistently failed to respond. However, when giving address 11 14, I can get as many characters as I want. Of course, with the lower address the characters start at index 2 of the sysex data field, with 1 character per byte.
This is as far as I got, but there's certainly more to discover. Stay tuned!
Sources and Further reading
- Roland System Exclusive Messages
- Reverse-engineering the Roland JU-06 synth
- Roland Boutique JU-08 Data File Format
- Summary Of Roland Boutique SYSEX messages [JPG]
Updated: 6.1.2016
Would such a scheme work for the JD-08? It doesn't appear to support the chain mode that the earlier boutiques did, but I am curious if the SysEx request method still works. However, I don't know how to figure out the message bytes, such as the device ID, product code, etc. Do you have any ideas?
ReplyDelete