SY-22 / SY-35 MIDI System Exclusive

Written by Matt Thorman

The following text gives full information on system exclusive midi bulk dumps for the SY22 and SY35 (which are identical in every respect apart from slight differences in the samples) and is intended for use in the development of editors/librarians etc. There is plenty of hidden programmability (i.e. parameters not accessible from the synth's front panel), mostly for the FM elements.

The information is arranged as follows:

  1. SINGLE VOICE DUMP FORMAT
  2. ALL V/M DUMP FORMAT
  3. VOICE DATA FORMAT
  4. FM OPERATOR WAVEFORM DETAILS
The information gives byte offsets, the range of possible values for those bytes, and further comments (with info on each bit where necessary). Where there are two byte offsets indicated in the first column, their contents are combined to form one value eg $01 $7F is written as $17F, but note that each 'byte' is 7-bit so $17F would actually be $FF in 8-bit. Quite often the 8-bit values stored internally in the synth will have to be split into two 7-bit 'bytes'. The first byte will only ever be 0 or 1 as it holds the 8th bit of the internal byte- it is a sort of overflow byte. The remaining 7-bits will be contained in the next byte. I have indicated the 'overflow' bytes with brackets. They are very important when it comes to calculating the internal 8-bit checksum.

Negative numbers are generally represented in the usual way (2's complement) but remember any overflow! eg the value range 140,3F is -64,63 in decimal.

I haven't included any detailed info about the MULTI data format in the ALL V/M DUMP because I haven't worked any of it out! This is because it takes such a long time to do an ALL V/M dump that it didn't seem practical to be editing MULTI's by receiving-changing-sending. It would have been sensible for Yamaha to include a separate MULTI dump for this purpose (as with TG33).

Matt Thorman (thorman@teaching.physics.ox.ac.uk)

1) SINGLE VOICE DUMP FORMAT

Byte offset
Value range
Comments
00
F0
Start of sysex
01
43
-
02
00,0F
Midi channel
03
7E
-
04 05
0448
Byte count for following block ($248 in 8-bit, ie 584 bytes)



06
'P'
-
07
'K'
-
08
' '
(space)
09
' '
(space)
0A
'2'
-
0B
'2'
-
0C
'0'
-
0D
'3'
-
0E
'A'
-
0F
'E'
-
10
-
-
|
(Voice Data)
-
24D
-
-



24E
00,7F
Checksum (calculated on above block) - it is the 2's complement of the sum of all the bytes. Put another way:

chk=(-S AND $7F)

where S is the sum of the bytes and the $7F is there because obviously only the lowest 7-bits can be used!

24F
F7
EOX

2) ALL V/M DUMP FORMAT

Byte offset
Value range
Comments
00
F0
Start of sysex
01
43
-
02
00,0F
Midi channel
03
7E
-
04 05
1202
Byte count for first voice block ($902 in 8-bit, ie 2306 bytes)



06-0F
'PK 2203VM'
-
10
-
-
|
-
(Data for first 4 voices, 4 * 574 bytes)
907
-
-



908
00,7F
Checksum for 1st voice block (see SINGLE VOICE dump)
909 90A
1178
Byte count for next block, (now 2296 bytes as there is no 'PK 2203VM')



90B
-
-
|
-
(Data for 4 voices, 4 * 574 bytes)
1202
-
-



1203
00,0F
Checksum for voice block
|
|
-
|
|
-
|
|
(similarly for remaining 14 4-voice blocks)
|
|
-
|
|
-
8FBE
0B
Byte count for MULTI data
8FBF
60
-



8FC0
-
-
:
-
(MULTI data, 16 * 94 bytes each)
959F
-
-



95A0
00,7F
Checksum for MULTI data
95A1
F7
EOX

3) VOICE DATA

Byte offset
Value range
Bit map
Comments
00,01
01,25
-
(I don't know what these bytes are but if you change them, the synth goes quiet!)
02
0 to 7F
DDDTTTT
Effect: D=depth (0 to 7); T=type(0 to 15)
03-0A
-
-
Voice name (8 characters)
(0B)0C
-
(T)00PPPPP
T=type (AB or ABCD); P=pitch bend (0 to 12)
0D
-
LPA00PA
After touch (Level,PM,AM) and Mod Wheel (PM,AM)
(0E)0F
(1)74 to 0C
-
After touch pitch shift (-12 to +12)
10
0 to 7F
-
Envelope delay (same for all envelopes)
(11)12
(1)40,3F
-
Common attack rate (-64 to +63)
(13)14
(1)40,3F
-
Common release rate (-64 to +63)
Element A
15
0 to 7F
-
Wave
(16)17
(1)74 to 0C
-
Pitch shift (-12 to +12)
18
0 to 7A
VVVAAAA
V=velocity response; A=after touch response
(19)1A
0 to (1)7F
(L)LLSSSSS
L=LFO wave; S=LFO speed
(1B)1C
0 to (1)7F
-
LFO Delay
(1D)1E
0 to (1)7F
-
LFO Rate
1F
10 to 1F
001AAAA
A=LFO AM depth
20
20 to 3F
01PPPPP
P=LFO PM depth
21
-
EEE0PPP
E=env type (0=User, 7=Organ); P=pan (0=Right, 4=Left)
22
0 to 7F
-
Tone volume (0:max $7F:min)
23
0 to 3F
0TTDDDD
T=temperament; D=detune (note: these are not accessible from the synth but they are only really useful for FM elements)
(24)25
-
(L)LLL0RRR
Envelope: L=level scaling; R=rate scaling
(26)27
-
(D)0AAAAAA
D=envelope delay(on/off); A=attack rate
(28)29
0 to (1)7F
(P)PDDDDDD
D=decay rate 1; P=env peak (each of the envelope levels has a number: initial=0, attack=1, decay 1=2, decay 2=3. The number of the PEAK level must be put in the two bits PP for the envelope to work)
2A
0 to 3F
-
Decay rate 2
2B
0 to 3F
-
Release rate
2C
0 to 7F
-
Initial level (0=Max, 127=Min) (The peak level is the one with the lowest value!)
2D
0 to 7F
-
Attack level (0=Max, 127=Min)
2E
0 to 7F
-
Decay level 1 (0=Max, 127=Min)
2F
0 to 7F
-
Decay level 2 (0=Max, 127=Min)
Element B
(30)31
0 to (1)7F
-
Wave (This doesn't set the sound, just the name displayed. To change the sound, you have to alter the FM parameters. There is no way of selecting the presets unless you have all the values stored!)
(32)33
(1)74 to 0C
-
Pitch shift (-12 to +12)
34
0 to 7A
VVVAAAA
V=velocity response A=after touch response
(35)36
0 to (1)7F
(L)LLSSSSS
LFO wave/speed
(37)38
0 to (1)7F
- LFO delay
(39)3A
0 to (1)7F
- LFO rate
3B
0 to 3F
0CMAAAA
A=LFO AM depth; C=assign carrier; M=assign modulator
3C
0 to 7F
CMPPPPP
P=LFO PM depth; C=assign carrier; M=assign modulator. (note: normally AM just creates tremolo effects by modulating the carrier, but now you can set it to vary the modulation level as well! When you change PM on the synth it controls both modulator AND carrier. Here you can set it to modulate just one of them, creating strange beating effects.)
3D
-
EEE0PPP
E=envelope type, P=pan
3E
0 to 7
-
Feedback
Modulator
(3F)40
0 to (1)7F
(X)WWWFFFF
X=fixed freq mode; W=waveform; F=freq(harmonics)
41
0 to 7F
-
FM level (equivalent to FM lvl control on synth)
42
0 to 3F
0TTDDDD
T=temperament; D=detune (the temperament makes frequency ratios between adjacent notes vary over the keyboard- producing bell like effects. Detune can be used to create beating effects between carrier and modulator.)
(43)44
-
-
+
(45)46
-
-
|
(47)48
-
-
Modulator envelope, defined as per element A's envelope
49
-
-
|
|
-
-
|
4E
-
-
+
Carrier
(4F)50
0 to (1)7F
(X)WWWFFFF
X=fixed freq mode; W=waveform; F=freq(harmonic)
51
0 to 7F
-
Tone Volume
52
0 to 3F
0TTDDDD
T=temperament; D=detune
(53)54
-
-
+
(55)56
-
-
|
(57)58
-
-
Carrier envelope, defined as per element A's envelope
59
-
-
|
|
-
-
|
5E
-
-
+
Element C
5F
0 to 7F
-
Wave
(60)61
(1)74 to 0C
-
Pitch shift (-12 to +12)
62
0 to 7A
VVVAAAA
V=velocity response; A=after touch response
(63)64
0 to (1)7F
(L)LLSSSSS
L=LFO wave; S=LFO speed
(65)66
0 to (1)7F
-
LFO Delay
(67)68
0 to (1)7F
-
LFO Rate
69
10 to 1F
001AAAA
A=LFO AM depth
6A
20 to 3F
01PPPPP
P=LFO PM depth
6B
-
EEE0PPP
E=env type (0=User, 7=Organ); P=pan (0=Right, 4=Left)
6C
0 to 7F
-
Tone volume (0:max $7F:min)
6D
0 to 3F
0TTDDDD
T=temperament; D=detune (note: these are not accessible from the synth but they are only really useful for FM elements)
(6E)6F
-
-
+
(70)71
-
-
|
(72)73
-
-
Envelope
74
-
-
|
|
-
-
|
79
-
-
+
Element D
(7A)7B
0 to (1)7F
-
Wave
(7C)7D
(1)74 to 0C
-
Pitch shift (-12 to +12)
7E
0 to 7A
VVVAAAA
V=velocity response A=after touch response
(7F)80
0 to (1)7F
(L)LLSSSSS
LFO wave/speed
(81)82
0 to (1)7F
- LFO delay
(83)84
0 to (1)7F
- LFO rate
85
0 to 3F
0CMAAAA
A=LFO AM depth; C=assign carrier; M=assign modulator
86
0 to 7F
CMPPPPP
P=LFO PM depth; C=assign carrier; M=assign modulator
87
-
EEE0PPP
E=envelope type, P=pan
88
0 to 7
-
Feedback
Modulator
(89)8A
0 to (1)7F
(X)WWWFFFF
X=fixed freq mode; W=waveform; F=freq(harmonics)
8B
0 to 7F
-
FM level
8C
0 to 3F
0TTDDDD
T=temperament; D=detune
(8D)8E
-
-
+
(8F)90
-
-
|
(91)92
-
-
Modulator envelope
93
-
-
|
|
-
-
|
98
-
-
+
Carrier
(99)9A
0 to (1)7F
(X)WWWFFFF
X=fixed freq mode; W=waveform; F=freq(harmonics)
9B
0 to 7F
-
Tone volume
9C
0 to 3F
0TTDDDD
T=temperament; D=detune
(9D)9E
-
-
+
(9F)A0
-
-
|
(A1)A2
-
-
Carrier envelope
A3
-
-
|
|
-
-
|
A8
-
-
+
Vector



A9
0 to F
-
Vector level rate
AA
0 to F
-
Vector detune rate
(AB)AC
0 to (1)7F
-
Level step 1 length ($17E=Repeat; $17F=End)
AD
0 to 3E
-
Level step 1 X (-31 to +31)
AE
0 to 3E
-
Level step 1 Y (-31 to +31)
|
-
-
Above four bytes repeated for each level step
|
-
-
-
(173)174
0 to (1)7F
-
Detune step 1 length ($17E=Repeat; $17F=End)
175
0 to 3E
-
Detune step 1 X (-31 to +31)
176
0 to 3E
-
Detune step 1 Y (-31 to +31)
|
-
-
Above four bytes repeated for each detune step
|
-
-
-




23B
0
-
Null
(23C)23D
0 to (1)7F
-
8 bit checksum

The 8-bit checksum is calculated in a very similar way to the 7-bit sysex checksum. When summing all the bytes, the overflows (in brackets) must be treated as the 8th bit of the following byte. The way I think of this is that all the bytes are summed but the overflow bytes must be multiplied by 128 first. The 8 lowest bits of the sum then give the checksum so that:

(-S AND $7F) goes into byte 23D (extracting least significant 7 bits)
(-S AND $80)/$80 goes into byte 23C (extracting 8th bit)

Remember that the first byte in each vector step is an overflow! If you miss one out then the checksum is wrong.

There is some good news though: you DON'T NEED TO BOTHER with the 8-bit checksum if you are just altering data in a SINGLE VOICE dump. When you send a single voice to the synth it goes into the edit buffer and it doesn't matter if the 8-bit checksum is wrong. It gets put right if you STORE the voice. However, if you are changing things in an ALL V/M dump then the 8-bit checksums must be correct for every voice. This time when you send the data to the synth it gets STORED directly in the Internal voice bank, so everything must be right.

4) FM OPERATOR WAVEFORM

There are 8 waveforms to choose from. If the waveform number is represented as 3 bits, ABC. A chooses between the two source waveforms:

       A=0                             A=1
                                       . .
      . " .                          .     .
    .       .                       .       .
   .         .                     .         .
  .           .           .      .             .             .
               .         .                       .         .
                .       .                         .       .
                  .   .                            .     .
                    "                                . .

The first is just a sine, the second one is wierd. It looks like bits of a sine wave with intermediate linear portions where it crosses zero. Either type can be further modified if B and/or C is set.

BC=01
      . " .                    . " .
    .       .                .       .
   .         .              .         .
  .           .____________.           .____

BC=10
    .-.                      .-.
   .   .                    .   .
  .     .     .____________.     .     .____
         .   .                    .   .
          . .                      . .
           "                        "
BC=11
    .-.   .-.                .-.   .-.
   .   . .   .              .   . .   .
  .     .     .____________.     .     ._____