A couple days ago, I released a program called midisnoop that allows a user to send custom messages to a MIDI port and to monitor the messages that come out of another MIDI port. I wrote this program with the intention of probing my MIDI-enabled hardware, and the first hardware I decided to probe was my Blofeld.
I started by doing a little research. The Blofeld system exclusive specification contain data regarding the format of system exclusive messages that can be used to communicate with the Blofeld. Here's the basic format:
Hex | Description |
---|---|
f0 | Start of sysex message |
3e | Waldorf Music manufacturer ID |
13 | Blofeld ID |
(DD) | Device ID |
(MM) | Message Type ID |
(HH) | Location High Byte |
(LL) | Location Low Byte |
(Data Bytes) | Data Bytes pertaining to the type of message (not always necessary) |
(CS) | Checksum byte (not always necessary) |
f7 | End of sysex message |
The document also defines some message types:
Hex | Description |
---|---|
00 | Sound Data Request |
10 | Sound Data Dump |
20 | Sound Parameter Change |
04 | Global Data Request |
14 | Global Data Dump |
The sound data types above are for monotimbral patches. The document also goes into how you can access sound parameters from each part of the currently loaded multitimbral patch, but doesn't go into how to access the actual parameters of a multitimbral patch.
There's more data in the document too, on the format of monotimbral patches, the exact format of the above message types, the format of global data, and how a Blofeld responds to device inquiry messages. I'm not going into that here.
This data is helpful, but it didn't solve my problem. I started looking for documentation on other multitimbral synths made by Waldorf, and came across this fantastic document on Waldorf synthesizers. This document contained information on the MIDI implementations of the Waldorf Q, Q+, and microQ. In particular, all three of the synths used the same general message format as the Waldorf Blofeld, and used the same message type byte to request multitimbral patch data, which is:
Hex | Description |
---|---|
f0 | Start of sysex message |
3e | Waldorf Music manufacturer ID |
13 | Blofeld ID |
(DD) | Device ID |
01 | Multitimbral Patch Request ID |
(BB) | Location High Byte |
(LL) | Location Low Byte |
f7 | End of sysex message |
Cool! I fired up my Blofeld, and started midisnoop. I connected midisnoop to my Blofeld, making sure that system exclusive events won't be ignored:
... composed my MIDI message:
... and sent it off:
The Blofeld sent me back something! Let's disect the data. Here's the data contained in the system exclusive message:
3e 13 00 11 00 00 49 6e 69 74 20 4d 75 6c 74 69 20 20 20 20 20 20 00 7f 37 01 00 02 04 0b 0c 00 00 00 00 00 00 00 00 00 64 40 00 40 40 02 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 03 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 04 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 05 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 06 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 07 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 08 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 09 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0a 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0b 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0c 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0d 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0e 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0f 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 10 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 11 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 7b
This might seem overwhelming at first, but there are patterns here. See the row of '7f' at the end there? And there's another row of '00' next to it. There's a method to this madness.
Let's start by eliminating the bytes that belong to the message and not the multitimbral patch itself. Using the basic Blofeld message format I referenced above, I can see that the first 6 bytes belong to the MIDI message:
Hex | Description |
---|---|
3e | Waldorf Music manufacturer ID |
13 | Blofeld ID |
(DD) | Device ID |
11 | Multitimbral Patch Dump ID |
(HH) | Location High Byte |
(LL) | Location Low Byte |
... and the last byte also belongs to the MIDI message:
Hex | Description |
---|---|
CS | Checksum byte |
So, let's eliminate those bytes and see what we have left:
49 6e 69 74 20 4d 75 6c 74 69 20 20 20 20 20 20 00 7f 37 01 00 02 04 0b 0c 00 00 00 00 00 00 00 00 00 64 40 00 40 40 02 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 03 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 04 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 05 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 06 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 07 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 08 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 09 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0a 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0b 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0c 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0d 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0e 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0f 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 10 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 11 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00
Now, let's look in the Blofeld manual. There's a section on multis, and their parameters. A multi has the following parameters:
- Name
- Tempo
- 16 parts
Each of the 16 parts has the following parameters:
- Sound Bank (A ... H)
- Sound Number (0 ... 127)
- Mixer Volume (0 ... 127)
- Pan (L64 - R63)
- Transpose (-48 - +48)
- Detune (-64 - +63)
- Channel (Global, Omni, 1 - 16)
- Low Key (0 ... 127)
- High Key (0 ... 127)
- Low Velocity (1 ... 127)
- High Velocity (1 ... 127)
- Status (play/mute)
- MIDI (ignore/receive)
- USB (ignore/receive)
- Local (ignore/receive)
- Pitch Bend (ignore/receive)
- Mod Wheel (ignore/receive)
- Pressure (ignore/receive)
- Sustain (ignore/receive)
- Edits (ignore/receive)
- Prg Change (ignore/receive)
Let's start by finding the name. Names of Blofeld patches are 16 letters long. We'll change the name of the first multi using the Blofeld to "ABCDEFGHIJKLMNOP", save the multi, fetch the data again using midisnoop, and look for a series of 16 ascending hex bytes:
Here's the next mass of hex bytes, sans message data:
41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 00 7f 37 01 00 02 04 0b 0c 00 00 00 00 00 00 00 00 00 64 7f 00 70 7f 02 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 03 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 04 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 05 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 06 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 07 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 08 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 09 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0a 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0b 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0c 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0d 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0e 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 0f 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 10 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 00 00 64 40 00 40 40 11 00 7f 01 7f 07 3f 01 3f 00 00 00 00 00 00 00 00 32
Right at the beginning, there are 16 hex bytes in ascending order. We now know where the name is stored!
We can do this with the rest of the parameters, changing them one at a time to figure out the Blofeld's multitimbral patch format. I'm not going to go into detail about how to find every parameter in this post. Suffice to say that I meticulously went through the parameters, and used midisnoop to check the Blofeld's data for each parameter.
Here are the results:
Multi Format
Bytes | Description |
---|---|
0-15 | Name |
16 | ? |
17 | Multi Volume |
18 | Tempo |
19-24 | ? |
25-31 | (Reserved?) |
32-55 | Part 1 |
56-79 | Part 2 |
80-103 | Part 3 |
104-127 | Part 4 |
128-151 | Part 5 |
152-175 | Part 6 |
176-199 | Part 7 |
200-223 | Part 8 |
224-247 | Part 9 |
248-271 | Part 10 |
272-295 | Part 11 |
296-319 | Part 12 |
320-343 | Part 13 |
344-367 | Part 14 |
368-391 | Part 15 |
392-415 | Part 16 |
Multi Part Format
Bytes | Description |
---|---|
0 | Sound Bank |
1 | Sound Number |
2 | Mixer Volume |
3 | Pan |
4 | (Reserved?) |
5 | Transpose |
6 | Detune |
7 | Channel - Global (0), Omni (1), 1 - 16 (2-17) |
8 | Low Key |
9 | High Key |
10 | Low Velocity |
11 | High Velocity |
12 | Bitfield: XS???LUM
|
13 | Bitfield: X?RESpMP
|
14 - 15 | ? |
16 - 23 | (Reserved?) |
As you can see, there are some bytes that I'm still not sure about. I suspect that bytes 14 and 15 in the part above are the send equivalents of bytes 12 and 13 respectively, and that they only pertain to the Blofeld Keyboard (I own a Blofeld Desktop).