Skip to content

01 SysEx

Boban Spasic edited this page Apr 25, 2023 · 1 revision

System Exclusive Messages

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

Yamaha universal dump

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 

What the heck is VCED, and what is a VMEM?

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.

And what about the AMEM, PMEM?

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

Checksum byte

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