Basic Voice Table Editing in Sappy

The Voice Table


A voice table is a collection of pointers to samples for a song to use. They typically consist of 127 voices, though some can be unused. Each entry is 12 bytes long, and consist of:

  • 4 bytes for the instrument type, pitch & panning settings
  • a 4-byte pointer to the instrument sample
    • Alternatively, if the instrument is a “drum”, this is a pointer to another table of samples
  • 4 bytes for attack, decay, sustain and release a.k.a. the envelope, which will be discussed later
  • Alternatively, if the instrument is a “multi”, then this is instead a pointer to a list of samples the instrument will use. More on this later.

The end result is something that looks like this:

00 3C 00 A0 55 66 77 08 FF 00 FF 80
40 00 00 A0 55 66 79 08 45 60 78 08
80 00 00 A0 55 66 74 08 FF 00 FF 80
00 3C 00 A0 55 66 73 08 FF 00 FF 80
00 3C 00 A0 55 66 7A 08 FF 00 FF 80

If this were a voicegroup, then the first line would correspond to instrument 0, typically a piano; the second to instrument 1, etc. You can imagine this would continue until there were 127 of these. It’s worth noting that FE games have a different voicetable for every song (there are various reasons for this).

I’ll talk about the first four bytes here.


The first is a byte that tells us the instrument type, which can be Direct, Multi, or Drum. Occasionally this is also set to 08, which tells the game to ignore any pitch offsets and play the sample at the original frequency, which is mostly used for drums and sound effects.

0x00: a regular Direct sound, or sample. These are normal instruments.

0x40: a “multi” sound. This is a series of two or more samples that the game will play depending on which note is playing. What I mean by this is you could have one sample set to play for notes C0-C5, and then another sample to plays notes from C5-C10. This is especially useful for instruments that have a wide pitch range and therefore need more sample types to accommodate for this. This is covered later in this tutorial.

0x80: a “drum”. This is similar to a multi, but rather than have a sample play for a range of notes, this will specifically make each note correspond to one sample. The pointer instead goes to a table of samples which are each sample in a drum. This is also covered in more detail later.


The second byte tells us the pitch at which the sample should be adjusted to. This is actually completely unused unless the sample is within a Drum table, so it won’t help to adjust the pitch of your strings or piano, and only the pitch of a hi-hat, or cymbal, etc. By default, this should be 0x3C, which is 60, which is equivalent to a middle C/C5.


The third byte is, as far as I’m aware, unused.


The fourth byte is a panning setting. If bit 7 is set i.e. if the value is 0x80 or higher, then the game will actually use the panning setting you give it. To get a panning setting, you need to take your desired value and add 0x80 to it. So if you want the sample to play at the extreme left, then it would be 0x01 + 0x80 = 0x81. This mostly has applications within a Drum table, like if you wanted two cymbals where one played on the left and the other on the right, but could also be applied to something like a piano, or an organ. If you have no idea what any of that means, just set it to 0x00.


The next four bytes are a pointer to the actual sample/sound itself, which is to be covered a little bit later.


Finally, the last four bytes are the envelope, which is explained here.