-
Notifications
You must be signed in to change notification settings - Fork 2
01 SysEx
aka SysEx - a part of MIDI standard that allows sending of a little bit more than just a NoteOn and NoteOff commands.
The only standard thing about SysEx messages is the beginning and the end of the message - SysEx messages begins with a byte $F0, and ends with $F7.
The second byte in the message is the ID of the equipment manufacturer (the list of IDs is maintained by the MIDI association - www.midi.org ).
So, as our interest here is about Yamaha, our ID of interest would be $43.
So, we have $F0, $43.........$F7, and what comes in between - that's Yamaha's decision.
For Yamaha DX-series, we have the following bytes at the beginning of the message
$F0, $43, sc, f, msb, lsb, where
- sc is a combination of two information - s and c in following bits 0ssscccc. This means - the most significant bit is always 0, the next 3 bits are for s parameter (3 bits can store the values 0 to 7), and the last 4 bits are for c - MIDI-channel.
- f describes the message function (the list will follow)
-
msb and lsb combined gives the length of the data to follow in the message. Attention - msb and lsb are 7-bit values (length=128*msb+lsb), do not threat as 8-bit values.
At the end of the message, we have checksum and $F7.
s-parameter
- s=0 - the data from the message body is a parameter dump
- s=1 - the data in the message body is a direct parameter change
- s=2 - this is a dump request
f-parameter
- f=0 - single voice DX7/DX9 - VCED
- f=1 - single function TX7 - PCED
- f=2 - bulk function TX7 - PMEM
- f=3 - single voice DX11/TX81z/V50/DX21 - VCED
- f=4 - bulk voice DX11/TX81z/V50/DX21 - VMEM
- f=5 - single supplement DX7II - ACED
- f=6 - bulk supplement DX7II - AMEM
- f=7 -
- f=8 -
- f=9 - bulk voice DX7/DX9 - VMEM
- f=7E - Yamaha universal dump (description follows)
where bulk means 32x or 64x
As it was clear, that there won't be enough f-numbers for all the Yamaha keyboards, Yamaha came with the Universal dump (which isn't quite universal...).
This one means, that there is a second f-parameter inside the message body, which allows some more space for more kinds of dumps.
So, that second descriptor, inside the message body, is a string of 10 chars.
Here are some examples (the underscores are spaces) inclusive data length and a description:
- LM__8973PE 61 byte DX7II Performance Edit Buffer - PCED
- LM__8973PM 1642 byte DX7II Packed 32 Performance - PMEM
- LM__8973S_ 112 byte DX7II System Set-up
- LM__MCRYE_ 266 byte Micro Tuning Edit Buffer
- LM__MCRYMx 266 byte Micro Tuning with Memory #x=(0,1)
- LM__MCRYC_ 266 byte Micro Tuning Cartridge
- LM__FKSYE_ 502 byte Fractional Scaling Edit Buffer
- LM__FKSYC_ 502 byte Fractional Scaling in Cartridge with Memory #
Yamaha V50/DX11/TX81z
- LM__8976AE 33 byte ACED TX81Z
- LM__8023AE 20 byte ACED2 DX11
- LM__8073AE 30 byte ACED3 V50
- LM__8976PE 120 byte PCED DX11
- LM__8073PE 43 byte PCED2 V50
- LM__8976PM 2442 byte PMEM DX11
- LM__8073PM 810 byte PMEM2 V50
- LM__8976Sx xx byte System
- LM__MCRTE0 34 byte Micro Tuning Edit Buffer OCT
- LM__MCRTE1 274 byte Micro Tuning Edit Buffer FULL
- LM__8023S0 26 byte System
- LM__8073S0 42 byte System
DX7 voice has 155 parameters (well, 156, but one won't be transmitted). With the addition of the SysEx header and footer, that were 163 bytes. Not too much data to transmit over MIDI.
But, 32 voices (32x155+8 = 4968 bytes) - that is some more data, and there is enough chances to catch some interference from some other signals in cables - e.g. the transmission could get corrupted.
Yamaha came with two solutions:
- there is a checksum byte in the message
- the data could be a little bit compressed to take some less space
There is no real compression taking place. Let's say you have a parameter with range 0-7. This value needs just 3 bits to be stored. If you take some another parameter that can use the rest 4 bites (yup, the data is 7-bit, not 8-bit), you can combine these into one byte and save some space. That's how Yamaha "compressed" 155 parameters into 128 bytes.
So, VCED is the uncompressed form, and the VMEM is the "compressed" form.
VCED means VoiCeEDit, and VMEM - Voice MEMory. It means, VCED is used to transmit the Edit buffer, and VMEM is used to transmit the whole memory (32 voices).
What is the Edit buffer? Let's say, you have a voice in RAM, and you want to change some parameters. As soon you begin with the editing, you do not edit the original voice in RAM - you are working on a copy in Edit buffer. The editing will be saved to the RAM when you save your voice.
The first DX7 (aka Mark I) supported just VCED/VMEM. DX7II (Mark II) had some additional parameters for voices. In order to maintain the compatibility, DX7II had VCED/VMEM, and additional parameters are transmitted as a separate dump ACED/AMEM (A - additional).
PCED/PMEM (P - Performance) are the DX7II performance data.
For 4-OP series (TX81z, DX11 etc.) there is a bit more to the story.
DX21 had the VCED, TX81z added some more = ACED, DX11 added even more = ACED2, V50 added even more = ACED3.
So, a Yamaha V50 voice is VCED+ACED+ACED2+ACED3. Simple as that...
The byte before the ending $F7 is the checksum byte. The calculation of the checksum was a mystery for a long time, but this world is full of smart guys, and one of them got the calculation solved.
The following Pascal-code is for calculating the checksum for a VCED (same formula applies to VMEM):
checksum := 0; //initialize the variable
for counter := 0 to 155 do //get the summ of all the parameters
checksum := checksum + data[counter];
checksum := ((not (checksum and 255)) and 127) + 1; //apply magic formula