Thursday, 31 December 2015

Roland Boutique JU-08 MIDI System Exclusive

The Roland Boutique line of synthesizer modules are known to support only a few of the generic MIDI control messages. The MIDI Implementation Chart of the JU-06 lists the following MIDI CC messages:

1MOD
11EXPRESSION PEDAL
64HOLD

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.
  1. 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.
  2. If voice parameters are changed via panel controls, appropriate system exclusive messages are sent.
Note, that these patch dumps or panel controller messages are sent only if the module is in chain mode. But a module will always respond to such system exclusive messages, irrespective of the mode it is in.

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, ...).

060708090A1011
00RateRangeHPF ModeAttackChorus SwitchPorta Switch
02Delay TimeLFO ModCutoffLevelDecayDelay LevelPorta Time
04PWMResoSustainDelay TimeAssign Mode
06PWM SourceEnv PolarityReleaseDelay Feedb???
08Square SwitchEnv ModBend Range
0ASaw SwitchLFO Mod
0CSub LevelKey Follow
0ENoise Level
LFODCOVCFVCAENVEffectController
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...

Address060708090A1011
FunctionLFODCOVCFVCAENVEffectController
Parameters2872444 (5)
Sysex entries71312791011

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


Updated: 6.1.2016

1 comment:

  1. 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