The Zoom PS-04 Palmtop Studio

File Formats
Format Decoding Status
Project Files
Audio Files
Rhythm Files
Predefined effects
Guitar

File Formats

Note

This information may include any number of errors. Any corrections and contributions are welcome.

Format Decoding Status

The following table shows how much of the PS-04 file formats have been decoded yet.

Data Status Notes
  Not at all Partially Entirely  
Audio     X Decoded by Randy Gordon.
Rhythm patterns   X   Most drum sounds and all bass sounds still missing.
Rhythm song X      
Insert effects   X   Work has only been started; no UI yet.
Send effects X      
Mixer settings   X   Work has been started; no UI yet.

Project Files

The project file stores data about current input and mixer settings, and all effect data, including the predefined ones. All records are of a fixed size and number, and so every project file is exactly 20480 (0x5000) bytes long.

Table 1. Project File Format

Offset (hex) Length (hex) Type Description
Total 5000    
0000 2B char[43] Magic ID string: "ZOOM PS-04 PROJECT DATA VER0001 "
002B 9 ? ?
0034 6 char[6] Project name
003A 2 ? (zeroes)
003C 1 ? (0x05)
003D 13 ? (zeroes)
004C 1 ? (1 one project, 0 others) Current send effect?
0050 1 unsigned char Current insert effect
0051 1B ? (zeroes)
0064 1 ? (1 one project, 0 others) Current send effect?
006C 5 ?


        05 00 04 00 00 one project
        00 06 04 00 00 another
        01 0A 0F 06 06 third
        

0075 4 ? (17 05 06 07 in one project, 17 01 00 03 in another, 02 08 05 00 third)
007E 4 ? (02 0C 18 04 one project, 15 0F 0F 04 another, 13 0E 10 05 third)
0087 4 ? (00 07 01 08 one project, 00 00 00 00 another, 08 17 02 07)
0090 2 ? (18 00 one project, 19 0A another)
00C6 6 char[6] Name of current insert effect
00CC 1 ? (06 one project, 0F another)
00D2 A ?


        2F 00 05 00 04 00 10 00 1E 00 one project (GROOVE)
        09 00 09 00 10 00 04 00 18 00 another (GO-GO)
        

00DC 2 ? (20 20)
00DE 6 char[6] Name of current send effect
00E4 1 ? (01)
00E5 1770 struct insert_effect[60] Guitar effects
18B2 BB8 struct insert_effect[30] Mic effects
246A BB8 struct insert_effect[30] Line effects
3022 BB8 struct insert_effect[30] Dual effects
3BDA 7D0 struct insert_effect[20] Mastering effects
43AA 39C ? ?
4746 3C0 struct send_effect[40] Send effects
4AF5 3 ? (zeroes)
4AF8 D ?


        09 or 00
        01 00 00 00 32 32 64 64 00 00 00 00
        

4B05 4E struct mixer_channel[6] Mixer channels
4B53 4AD ? ?
4E84 2 unsigned short Current rhythm pattern
4E86 0A ? (zeroes)
4E90 2 unsigned short Current BPM in 10ths (90 BPM = 900)
4E92 6 ? (zeroes)
4E98 1 ? (00 one project, 03 another)
4E99 167 ?


        00 00 00 04
        00 00 00 01
        00 00 00 01
        00 00 00 04
        00 00 00 0A
        00 00 00 0A
        00 00 00 00
        00 00 00 01
        00 00 00 00
        00 00 00 04
        00 00 00 0A
        00 00 00 00
        00 00 00 00
        00 00 00 00
        00 00 00 00
        00 00 00 00
        00 00 00 00
        00 00 00 00
        00 00 00 00
        00 00 00 00
        00 00 00 03
        00 00 00 09
        00 00 00 00
        ...
        


Table 2. Insert effect record format

Offset (hex) Length (hex) Type Description
Total 64    
0000 3 ? ?
0003 3 struct compressor Compressor module data
0006 6 ? ?
000C 7 struct preamp Preamp/Drive module data
0013 4A ? ?
005C 6 char[6] Effect name
0062 1 unsigned char

Bit field indicating which modules are enabled:


Table 3. Send effect record format

Offset (hex) Length (hex) Type Description
Total 18    
0000 11 ? ?
0011 6 char[6] Effect name
0017 1 unsigned char ? (0 = empty, 1 = defined?)

Table 4. Mixer channel record format

Offset (hex) Length (hex) Type Description
Total D    
0000 1 unsigned char High-pass eq enabled (0 = off, 1 = on)
0001 1 unsigned char High-pass eq gain (0 = -12, 12 = 0, 24 = +12)
0002 1 unsigned char

High-pass eq frequency:

0003 1 unsigned char Low-pass eq enabled (0 = off, 1 = on)
0004 1 unsigned char Low-pass eq gain (0 = -12, 12 = 0, 24 = +12)
0005 1 unsigned char

Low-pass eq frequency:

0006 1 unsigned char Send enabled (0 = no, 1 = yes)
0007 1 unsigned char Send level
0008 1 unsigned char Panning (0 = -100, 50 = 0, 100 = +100)
0009 1 unsigned char Fader
000A 1 unsigned char Stereo link enabled (0 = no, 1 = yes)
000B 1 unsigned char Current V-take (0-9)
000C 1 unsigned char ?

Audio Files

The audio files stores the audio data in a non-standard compression format, which effectively reduces a 16-bit stream to 8 bits. A header block is followed by a number of 512-byte data blocks, where the first value acts as key frame and the following 508 bytes are diff values.

This format has been decoded by Randy Gordon ().

Table 5. Audio File Format

Offset (hex) Length (hex) Type Description
0000 200 struct audio_header File header (see below)
0200 (varies) struct audio_data_block[] Data blocks (see below)

Table 6. Audio File Header Format

Offset (hex) Length (hex) Type Description
Total 200    
0000 10 char[16] zero padding
0010 D char[13] Magic ID string: "ZOOM1D3ZZ9AUD"
001D 3 ? zero padding
0020 10 ? Varies. As far as Erik can tell, the prerecorded demo tracks have a version number "1.000001CMGR" followed by zeroes, while the ones you record yourself have the byte sequence 58 5C 22 00 04 00 00 00 followed by "0002STRM". Go figure.
0030 1D0 ? zero padding

Table 7. Audio Data Block Format

Offset (hex) Length (hex) Type Description
Total 200    
0000 2 short 16-bit key frame
0002 1FC unsigned char[508] 8-bit indices into delta table
01FE 2 char[2] terminator bytes (?)

Rhythm Files

The rhythm file stores data about rhythm patterns and the song.

Table 8. Rhythm File Format

Offset (hex) Length (hex) Type Description
0000 C char[12] Magic ID string: "ZOOM D120SEQ"
000C 1F4 ? Zero padding
0200 (varies) struct rhythm_pattern[511] Rhythm patterns
(varies) (varies) struct rhythm_song Rhythm song

Table 9. Rhythm Pattern Format

Offset (hex) Length (hex) Type Description
0000 8 char[8] Display name (padded with spaces or 0x00). If the pattern is empty, the display name is "(empty)" and the rest of the struct (up to 0x114) is zeroed.
0008 F8 ? Zero padding
0100 8 char[8] Copy of display name
0108 1 uint8_t Beats per bar (1–8)
0109 1 uint8_t Number of bars in pattern (1–99)
010A 1 uint8_t Drum kit (0–6)
010B 1 uint8_t Bass program (0–4)
010C 1 uint8_t Drum level (0–15)
010D 1 uint8_t Bass level (0–15)
010E 1 uint8_t Original root note
010F 1 uint8_t Original chord type?
0110 2 uint16_t Number of 32-bit “raw” events in pattern.
0112 2 uint16_t Index of start event—because the first event stored doesn't have to be the first in the pattern.
0114 (varies) struct rhythm_pattern_event[] Events

Table 10. Rhythm Pattern Event Format

Offset (hex) Length (hex) Type Description
Total 4    
0000 1 uint8_t Time delta (in ticks) from previous event (or start of pattern). If this value is 0xFF, it means that a 32-bit value follows, which should be added to the delta; in other words, the 32-bit value is the real delta minus 0xFF. Oh well...
0001 3 struct rhythm_note Rhythm note

Table 11. Rhythm Note Format

Offset (hex) Length (hex) Type Description
Total 3    
0000 2 bit field Bit 0–7: Pitch or drum key. Bit 8–11: velocity (0–7).
0002 1 uint8_t Duration

Table 12. Rhythm Song Format

Offset (hex) Length (hex) Type Description
0000 8 char[8] Song name. This can be anything—it's not visible anywhere—but empty songs are marked by the name "(empty)".
0008 F8 ? Zero padding
0100 8 char[8] Copy of song name
0108 2 unsigned short Number of events in song
010A 2 ? ?
010C (varies) struct rhythm_song_event[] Events

Table 13. Rhythm Song Event Format

Offset (hex) Length (hex) Type Description
Total 4/8    
0000 1 uint8_t Time delta (in ticks) from previous event (or start of song). This may have the same exotic 32-bit escape format as rhythm events (see above).
0001/0005 1 uint8_t
Event type as follows:  
0 End of song
1 New pattern
2 New root note
3 New root chord
4 New time signature
5 New drum volume
6 New bass volume
0002/0006 2 uint16_t
Event value as follows:  
0 End of song
1 New pattern
2 New root note
3 New root chord
4 New time signature
5 New drum volume
6 New bass volume