Yamaha PSR-225 Bulk Dump Format

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.

Contents

Notes
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

Notes

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

Format of the system exclusive messages

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

TT, Type of data

09 = One Touch Setting
0A = Song
0C = Chord

SS SS SS, Size

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.

ZZ ZZ ZZ, Running total or End of section flag

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

..., Data

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.

KK, Checksum

The sum of all bytes from SS SS SS to KK, inclusive, should equal 0, modulo 128 decimal.

Order of the system exclusive messages

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

Decoding the data

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.

One Touch Setting data decoded

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.

offsetlengthcontentvalues
00031Button 1, Bank 1
03131Button 1, Bank 2
06231Button 1, Bank 3
09331Button 1, Bank 4
0C4...31Button 2, Bank 1...
188...31Button 3, Bank 1...
24C...31Button 4, Bank 1...
2DF31Button 4, Bank 4
31001Button 1 banks used 01 = Bank 1 used
02 = Bank 2 used
04 = Bank 3 used
08 = Bank 4 used
31101Button 2 banks used
31201Button 3 banks used
31301Button 4 banks used

One Touch Setting buttons

The contents of a single button are as follows.

offsetcontentvalues

Main Voice
00Voice Bank MSB
01Voice Bank LSB
02Voice Program
03Volume
04Octave 3F = -1
40 = 0
41 = +1, etc.
05Pan
06Reverb Level
07Chorus Level
08DSP Level

Dual Voice
09Voice Bank MSB
0AVoice Bank LSB
0BVoice Program
0CVolume
0DOctave 3F = -1
40 = 0
41 = +1, etc.
0EPan
0FReverb Level
10Chorus Level
11DSP Level
12Dual 00 = off; 7F = on

Split Voice
13Voice Bank MSB
14Voice Bank LSB
15Voice Program
16Volume
17Octave 3F = -1
40 = 0
41 = +1, etc.
18Pan
19Reverb Level
1AChorus Level
1BDSP Level
1CSplit 00 = off; 7F = on
1DSplit Point

Effects
1EReverb Type 00 = Off
01 = Hall 1...
08 = Plate 2 (see page 45)
09 = Room
0A = Stage
0B = Plate (see pages 115, 116) a
1FReverb 00 = off; 7F = on
20Chorus Type 00 = Off
01 = Chorus 1...
04 = Flanger 2 (see page 45)
05 = Chorus
06 = Celeste
07 = Flanger (see pages 115, 116) a
21Chorus 00 = off; 7F = on
22DSP Type 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
23DSP 00 = off; 7F = on
24Harmony Type 00 = Duet...
21 = Echo 1/32 (see page 46)
25Harmony 00 = off; 7F = on
26Harmony Volume

Style
27Style 00 = 8 Beat Pop...
63 = Happy (see page 111)
28Accompaniment 00 = off; 01 = on
29Main A / Main B 00 = Main A; 05 = Main B
2AAcmp. Split Point

Other
2BFootswitch 00 = Sustain...
0B = DSP (see page 92)
2CTouch Sensitivity 00 = 1; 01 = 2; 02 = 3 (see page 39)
2DTempo 00 = 32 bmp...
54 = 116 bmp...
F8 = 280 bmp
2ETranspose F4 = -12... (two's complement)
00 = 0...
0C = 12
2FTuning 9C = -100... (two's complement)
00 = 0...
64 = 100
30Acmp. Volume

a. Note about Effects values

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.

Song data decoded

The decoded Song data is 66766 bytes long and contains the User Songs in a block-based file system as follows.

offsetlengthcontentvalues
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
0000200001Song 2 - Tracks recorded
0000300001Song 3 - Tracks recorded
0000400001Song 1 - Tracks using Step Recording
0000500001Song 2 - Tracks using Step Recording
0000600001Song 3 - Tracks using Step Recording
000070000C"PresetStyle" 00
000130000C"PresetStyle" 00
0001F0000C"PresetStyle" 00
0002B00015
Beginning blocks
0002B00001Song 1, Track 1 beginning block 01 - 82 = first block
FF = track not used
0002C00001Song 1, Track 2 beginning block
0002D00001Song 1, Track 3 beginning block
0002E00001Song 1, Track 4 beginning block
0002F00001Song 1, Track 5 beginning block
0003000001Song 1, Track 6 beginning block
0003100001Song 1, Time track beginning block
00032...00001Song 2, Track 1 beginning block...
00039...00001Song 3, Track 1 beginning block...
0003F00001Song 3, Time track beginning block
0004000082
Next blocks
00040...00001Block 1 next block... 00 = empty block
01 - 82 = next block
FF = last block
000C100001Block $82 next block
000C200006
"PK9801"
000C810400
Block data
000C8...00200Block 1...
102C800200Block $82
104C800006
"PK9801"

Track data

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.

Proprietary metaevents

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

Section Change

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)

Accompaniment Volume

43 76 1A 02 VV

VV = Accompaniment Volume (0-127)

Chord

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.

Style

43 76 1A 04 SS

SS = Style
00 = 8 Beat Pop...
63 = Happy (see page 111)

Creating a MIDI file from the track data

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.

Chord data decoded

The decoded Chord data is 2048 bytes long and contains the chord data for each of the EZ Chord banks as follows.

offsetlengthcontent
000100EZ Chord bank 1
100100EZ Chord bank 2
200100EZ Chord bank 3
300100EZ Chord bank 4
400100EZ Chord bank 5
500100EZ Chord bank 6
600100EZ Chord bank 7
700100EZ 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.

Root values

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

Type values

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

b. Note about chord type 22

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.


Home > Articles > Yamaha PSR-225 Bulk Dump Format

Robert Hart
Updated links Mar. 22, 2015