The Yamaha PSR-225 keyboard sends its bulk dump data in a series of MIDI system exclusive messages. This document describes the format and content of those system exclusive messages.
The PSR-225's bulk dump data consists of three sections. Each data section can be considered as a large sequence of bytes.
Because MIDI transmissions use the most significant bit of each byte to signal the beginning of MIDI messages, the actual bulk dump data is encoded and enclosed in a series of system exclusive messages.
Format of the system exclusive messages
Order of the system exclusive messages
Decoding the data
One Touch Setting data decoded
Song data decoded
Chord data decoded
In this document, hexadecimal values are indicated by using a monospace font, or by a dollar sign prefix. Other numeric values are in decimal. For example, 10 and $800 are hexadecimal values, while 2048 is a decimal value.
This document refers to specific pages from the PSR-225 Owner's Manual. A PDF version of the manual can be downloaded from Yamaha: PSR225E.pdf.
This document assumes you are familiar with the format of MIDI events and MIDI files. If not, you can read The MIDI Specification and MIDI File Format, both from Jeff Glatt's MIDI Technical Fanatic's Brainwashing Center.
This document was created by observing my PSR-225. My keyboard is version "Prog 400, Wave 100", according to its test mode. (To enter the test mode, hold down a C# major chord (C#, F, G#) in the second octave as you turn on the keyboard.)
The general format for the bulk dump system exclusive messages is:
F0 43 73 57 06 TT SS SS SS ZZ ZZ ZZ ... KK F7
09 = One Touch Setting
0A = Song
0C = Chord
Indicates the number of encoded data bytes in this system exclusive message.
Because the most significant bit of each byte must be zero, each byte only stores 7 bits of the value. The most significant bits of the value are in the first byte. For example, the bytes 02 11 7F indicate the value $88FF.
If these bytes are 7F 7F 7F, this indicates the end of this type of data.
Otherwise, these bytes indicate the total number of encoded data bytes in all previous system exclusive messages for this type of data. (The value is stored using the 7-bit method mentioned above.)
If this is the end of this section, then there are three data bytes which indicate the total number of encoded data bytes for this type of data. (The value is stored using the 7-bit method mentioned above.)
Otherwise, these bytes encode the bulk dump data. Each pair of data bytes in the system exclusive message encodes one byte of the bulk dump data. The first byte of a pair stores the least significant nybble, the second byte stores the most significant nybble. For example, the bytes 0F 07 indicate the decoded byte 7F.
The sum of all bytes from SS SS SS to KK, inclusive, should equal 0, modulo 128 decimal.
When the bulk dump is started, the PSR-225 begins transmitting the system exclusive messages for One Touch Setting, then Song, then Chord data. The maximum number of encoded data bytes stored in a single system exclusive message is $800. The end of each data section is marked with a system exclusive message with the End of section flag.
Since the One Touch Setting data can be encoded in less than $800 bytes, it is sent in one system exclusive message, followed by a system exclusive message marking the end of the One Touch Setting data.
Next, the Song data is transmitted in a series of system exclusive messages. Each system exclusive message stores $800 encoded data bytes (or, if there are less than $800 encoded data bytes left, whatever remains), then a system exclusive message marks the end of the Song data.
Finally, the Chord data is transmitted. It fits into two system exclusive messages, each storing $800 encoded data bytes, and then a system exclusive message marks the end of the Chord data.
TT SS SS SS ZZ ZZ ZZ ........ KK
F0 43 73 57 06 09 00 0C 28 00 00 00 ........ KK F7 One Touch Setting data
F0 43 73 57 06 09 00 00 03 7F 7F 7F 00 0C 28 4C F7 end of One Touch Setting section
F0 43 73 57 06 0A 00 10 00 00 00 00 ........ KK F7 Song data, $800 encoded data bytes at a time
F0 43 73 57 06 0A 00 10 00 00 10 00 ........ KK F7
F0 43 73 57 06 0A 00 10 00 00 20 00 ........ KK F7
: : :
F0 43 73 57 06 0A 00 10 00 08 00 00 ........ KK F7
F0 43 73 57 06 0A 00 03 1C 08 10 00 ........ KK F7 last $19C encoded data bytes
F0 43 73 57 06 0A 00 00 03 7F 7F 7F 08 13 1C 49 F7 end of Song section
F0 43 73 57 06 0C 00 10 00 00 00 00 ........ KK F7 Chord data
F0 43 73 57 06 0C 00 10 00 00 10 00 ........ KK F7
F0 43 73 57 06 0C 00 00 03 7F 7F 7F 00 20 00 60 F7 end of Chord section
Once all of the messages for a particular type of data have been received, you can decode the data into one large sequence of bytes. As mentioned above, each pair of encoded data bytes corresponds to one byte of decoded data. The first byte of a pair stores the least significant nybble, the second byte stores the most significant nybble. For example, the encoded data bytes 0F 07 represent the decoded byte 7F.
The decoded One Touch Setting data is 788 bytes long and contains settings for each One Touch Setting button (in each selected One Touch Setting Bank) as follows.
|000||31||Button 1, Bank 1|
|031||31||Button 1, Bank 2|
|062||31||Button 1, Bank 3|
|093||31||Button 1, Bank 4|
|0C4...||31||Button 2, Bank 1...|
|188...||31||Button 3, Bank 1...|
|24C...||31||Button 4, Bank 1...|
|2DF||31||Button 4, Bank 4|
|310||01||Button 1 banks used||
01 = Bank 1 used|
02 = Bank 2 used
04 = Bank 3 used
08 = Bank 4 used
|311||01||Button 2 banks used|
|312||01||Button 3 banks used|
|313||01||Button 4 banks used|
The contents of a single button are as follows.
|00||Voice Bank MSB|
|01||Voice Bank LSB|
3F = -1|
40 = 0
41 = +1, etc.
|09||Voice Bank MSB|
|0A||Voice Bank LSB|
3F = -1|
40 = 0
41 = +1, etc.
|12||Dual||00 = off; 7F = on|
|13||Voice Bank MSB|
|14||Voice Bank LSB|
3F = -1|
40 = 0
41 = +1, etc.
|1C||Split||00 = off; 7F = on|
00 = Off|
01 = Hall 1...
08 = Plate 2 (see page 45)
09 = Room
0A = Stage
0B = Plate (see pages 115, 116) a
|1F||Reverb||00 = off; 7F = on|
00 = Off|
01 = Chorus 1...
04 = Flanger 2 (see page 45)
05 = Chorus
06 = Celeste
07 = Flanger (see pages 115, 116) a
|21||Chorus||00 = off; 7F = on|
00 = Off|
01 = Hall 1...
21 = EQ Tel (see page 45)
22 = Room...
26 = Karaoke
27 = Chorus...
33 = Auto Wah (see pages 115, 116) a
|23||DSP||00 = off; 7F = on|
00 = Duet...|
21 = Echo 1/32 (see page 46)
|25||Harmony||00 = off; 7F = on|
00 = 8 Beat Pop...|
63 = Happy (see page 111)
|28||Accompaniment||00 = off; 01 = on|
|29||Main A / Main B||00 = Main A; 05 = Main B|
|2A||Acmp. Split Point|
00 = Sustain...|
0B = DSP (see page 92)
|2C||Touch Sensitivity||00 = 1; 01 = 2; 02 = 3 (see page 39)|
00 = 32 bmp...|
54 = 116 bmp...
F8 = 280 bmp
F4 = -12... (two's complement)|
00 = 0...
0C = 12
9C = -100... (two's complement)|
00 = 0...
64 = 100
The effects values are described in the Owner's Manual on pages 45 and 46. System exclusive messages can be used to select additional effects that are unavailable from the front panel, as described on pages 115 and 116.
Specifically, on the Effect map on page 116, effects with numbers in parentheses are available via the front panel. Unnumbered effects are available via system exclusive messages. Blank spaces in the table, or spaces marked "No effect" or "Thru" are not selectable.
The decoded Song data is 66766 bytes long and contains the User Songs in a block-based file system as follows.
|00000||00001||Songs in use||
01 = Song 1|
02 = Song 2
04 = Song 3
|00001||00001||Song 1 - Tracks recorded||
01 = Track 1|
02 = Track 2
04 = Track 3
08 = Track 4
10 = Track 5
20 = Track 6
40 = Chord track
|00002||00001||Song 2 - Tracks recorded|
|00003||00001||Song 3 - Tracks recorded|
|00004||00001||Song 1 - Tracks using Step Recording|
|00005||00001||Song 2 - Tracks using Step Recording|
|00006||00001||Song 3 - Tracks using Step Recording|
|0002B||00001||Song 1, Track 1 beginning block||
01 - 82 = first block|
FF = track not used
|0002C||00001||Song 1, Track 2 beginning block|
|0002D||00001||Song 1, Track 3 beginning block|
|0002E||00001||Song 1, Track 4 beginning block|
|0002F||00001||Song 1, Track 5 beginning block|
|00030||00001||Song 1, Track 6 beginning block|
|00031||00001||Song 1, Time track beginning block|
|00032...||00001||Song 2, Track 1 beginning block...|
|00039...||00001||Song 3, Track 1 beginning block...|
|0003F||00001||Song 3, Time track beginning block|
|00040...||00001||Block 1 next block...||
00 = empty block|
01 - 82 = next block
FF = last block
|000C1||00001||Block $82 next block|
When the blocks for a track are read in sequential order, it can be seen that the content stored for each track is actually an MTrk chunk from a standard MIDI file. The actual size of the track should be determined from data stored in the MTrk chunk. This is important because there may be unrelated data left over from previous recordings after the last valid byte in the last block.
The Time track contains a time signature metaevent and tempo metaevents. It also contains system exclusive events for turning on the GM system, and setting reverb, chorus, and DSP types (see pages 115 and 116). Also, proprietary metaevents are used to store the selected style, accompaniment volume, section changes, and chord events.
The general format of the proprietary metaevent content is:
43 76 1A TT ...
TT = Type
01 = Section Change
02 = Accompaniment Volume
03 = Chord
04 = Style
43 76 1A 01 XX
XX = Section
00 = Main A
01 = Fill AA
02 = Fill AB
03 = Intro A
04 = Ending A
05 = Main B
06 = Fill BA
07 = Fill BB
08 = Intro B
09 = Ending B
0F = Delayed Main B (?) (found in Step Recording immediately after 02)
10 = Delayed Main A (?) (found in Step Recording immediately after 06)
43 76 1A 02 VV
VV = Accompaniment Volume (0-127)
43 76 1A 03 RR TT RR TT
RR = Root
TT = Type
The Root and Type values appear twice in the metaevent, but the second values are always(?) the same as the first. Information about the Root and Type values can be found in the Chord data decoded section below.
43 76 1A 04 SS
SS = Style
00 = 8 Beat Pop...
63 = Happy (see page 111)
A valid MIDI file can be created from the track data by placing a MThd chunk, the Time track MTrk chunk, and the individual Track MTrk chunks in order. The MThd chunk should be set for a Type 1 MIDI file, 96 pulses per quarter note, and the correct number of MTrk chunks.
For example, if you are creating a MIDI file from a User Song with one recorded Track, you can use the following MThd header
4D 54 68 64 "MThd"
00 00 00 06 length of this chunk
00 01 MIDI type 1
00 02 two MTrk chunks follow
00 60 96 pulses per quarter note
followed by the Time track MTrk chunk, and then the Track MTrk chunk.
If such a MIDI file is created, it will play in a MIDI player. Because of the way the PSR-225's voice banks are setup, the Voice Bank messages can be ignored and the Program Change messages will select the closest appropriate General MIDI voice. However, the PSR-225 specific system exclusive and proprietary metaevents will also be ignored, meaning no effects or accompaniment will play, only the recorded notes.
The decoded Chord data is 2048 bytes long and contains the chord data for each of the EZ Chord banks as follows.
|000||100||EZ Chord bank 1|
|100||100||EZ Chord bank 2|
|200||100||EZ Chord bank 3|
|300||100||EZ Chord bank 4|
|400||100||EZ Chord bank 5|
|500||100||EZ Chord bank 6|
|600||100||EZ Chord bank 7|
|700||100||EZ Chord bank 8|
Each pair of bytes stores data for one chord. The first byte of the pair stores a value for the root of the chord. The second byte of the pair stores a value for the type of chord. An empty chord position is indicated by the pair 7F 7F.
00 = C
01 = C# / Db
02 = D
03 = D# / Eb
04 = E
05 = F
06 = F# / Gb
07 = G
08 = G# / Ab
09 = A
0A = A# / Bb
0B = B
Note that these values are in a different order than the list on page 57.
00 = major
01 = sixth
02 = major seventh
03 = major seventh add sharp eleventh
04 = add ninth
05 = major seventh ninth
06 = sixth ninth
07 = augmented
08 = minor
09 = minor sixth
0A = minor seventh
0B = minor seventh flatted fifth
0C = minor add ninth
0D = minor seventh ninth
0E = minor seventh add eleventh
0F = minor major seventh
10 = minor major seventh ninth
11 = diminished
12 = diminished seventh
13 = seventh
14 = seventh suspended fourth
15 = seventh flatted fifth
16 = seventh ninth
17 = seventh add sharp eleventh
18 = seventh add thirteenth
19 = seventh flatted ninth
1A = seventh add flatted thirteenth
1B = seventh sharp ninth
1C = major seventh augmented
1D = seventh augmented
1E = open octave
1F = open fifth
20 = suspended fourth
21 = one plus two plus five
22 = (accompaniment off / bass note only) b
23 = major seventh flatted fifth
24 = flatted fifth
25 = minor major seventh flatted fifth
This type of chord can be entered by pressing four adjacent keys in the accompaniment section of the keyboard. (For example, C, C#, D, D#.) This chord type can also be produced by other invalid chord patterns. The Root stored is the second-lowest key pressed (although it is not used for anything), and the Type stored is 22.
When this type of chord is recorded in an EZ Chord bank, it functions as an "off" command. That is, when this chord is advanced to in the EZ Chord bank, it turns off the accompaniment.
When this type of chord is played in the Style mode, it changes the accompaniment to a bass note only. The bass note is the same note as the lowest key pressed.
Articles > Yamaha PSR-225 Bulk Dump Format||