![]() |
![]() |
GPS04 Reference Manual | ![]() |
---|
This information may include any number of errors. Any corrections and contributions are welcome.
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. |
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 | ? |
|
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 | ? |
|
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 | ? |
|
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 | ? |
|
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 | ? |
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
(<randy@integrand.com>
).
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 (?) |
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
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 |
|
||||||||||||||||
0002/0006 | 2 | uint16_t |
|