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

Wednesday 23 December 2015

Roland Boutique JU-06 Data File Format

In my YoshiMusix music blog, I've written two short reviews [one in english, der andere in deutsch] on the new Boutique synth modules by Roland, in particular the JU-06 that I bought. At the moment, I'm also fiddling with the new Web MIDI API by the World Wide Web Consortium, because you have to be up-to-date with stuff like that. So, while poking around and checking this and that, I thought I could check the file format used by the Boutiques, because ... why not? The first thing you do, or rather, the first thing I do is to drag the file into Windows Notepad. That'll give you a broad idea on what's inside a file, because among all the garbage you can read printable characters.

What a surprise I got, when I saw that the data files for the sequencer and voice data are actually ASCII text files! Here's a dump of the first sequencer line, and below of voice 1-1. I think the dumps speak for themselves (lines are separated by CR LF).

Contents of the first sequencer data (BQ_PTN1.PRM):
SCALE(1);
LASTSTEP(15);
SW1(1);
SW2(1);
SW3(1);
SW4(1);
SW5(1);
SW6(1);
SW7(1);
SW8(1);
SW9(1);
SW10(1);
SW11(1);
SW12(1);
SW13(1);
SW14(1);
SW15(1);
SW16(1);
NOTE1(48);
NOTE2(72);
NOTE3(61);
NOTE4(60);
NOTE5(70);
NOTE6(75);
NOTE7(60);
NOTE8(73);
NOTE9(60);
NOTE10(48);
NOTE11(60);
NOTE12(72);
NOTE13(60);
NOTE14(70);
NOTE15(60);
NOTE16(72);
VELOCITY1(70);
VELOCITY2(83);
VELOCITY3(72);
VELOCITY4(64);
VELOCITY5(79);
VELOCITY6(49);
VELOCITY7(51);
VELOCITY8(82);
VELOCITY9(44);
VELOCITY10(38);
VELOCITY11(44);
VELOCITY12(50);
VELOCITY13(71);
VELOCITY14(72);
VELOCITY15(67);
VELOCITY16(67);
GATETIME1(100);
GATETIME2(100);
GATETIME3(100);
GATETIME4(100);
GATETIME5(100);
GATETIME6(100);
GATETIME7(100);
GATETIME8(100);
GATETIME9(100);
GATETIME10(100);
GATETIME11(100);
GATETIME12(100);
GATETIME13(100);
GATETIME14(100);
GATETIME15(100);
GATETIME16(100);
PTN_NAME(PATTERN 01                      );
 And here the voice data of preset 1-1 (JU06_PATCH1.PRM)
LFO RATE        (30);
LFO DELAY TIME  (59);
OSC RANGE       (0);
OSC LFO MOD     (0);
PWM             (253);
PWM SOURCE      (0);
SQR SW          (0);
SAW SW          (1);
SUB LEVEL       (0);
NOISE LEVEL     (0);
HPF             (41);
CUTOFF          (102);
RESONANCE       (17);
ENV POLARITY    (1);
ENV MOD         (100);
FLT LFO MOD     (0);
FLT KEY FOLLOW  (194);
AMP MODE        (1);
AMP LEVEL       (255);
ATTACK          (32);
DECAY           (110);
SUSTAIN         (119);
RELEASE         (60);
CHORUS SW       (1);
DELAY LEVEL     (0);
DELAY TIME      (0);
DELAY FEEDBACK  (0);
PORTA SW        (0);
PORTA TIME      (100);
ASSIGN MODE     (0);
BEND RANGE      (2);
PATCH_NAME(Brass           );
So, if you're unhappy with the vintage analog slider-and-knob-interfaces of the Boutique synths, all you need to edit a patch is Notepad!