Created
July 24, 2021 10:24
-
-
Save rerrahkr/179e99a956dcba76142de2ffab4d2823 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
transcribed from https://github.com/takamichih/fmplayer/blob/df38031f493c0cdb35218fda566077103ee1a68e/fmdriver/fmdriver_fmp.c | |
# Header | |
0x00 uint16 offset to footer | |
## version <= 0x29 | |
0x02 uint16 offset to FM1 | |
0x04 uint16 offset to FM2 | |
0x06 uint16 offset to FM3 | |
0x08 uint16 offset to SSG1 | |
0x0a uint16 offset to SSG2 | |
0x0c uint16 offset to SSG3 | |
0x0e uint16 loop pointer of FM1 | |
0x10 uint16 loop pointer of FM2 | |
0x12 uint16 loop pointer of FM3 | |
0x14 uint16 loop pointer of SSG1 | |
0x16 uint16 loop pointer of SSG2 | |
0x18 uint16 loop pointer of SSG3 | |
0x1a uint8 resolution | |
0x1b uint8 data flags | |
## version <= 0x49 | |
0x02 uint16 offset to FM1 | |
0x04 uint16 offset to FM2 | |
0x06 uint16 offset to FM3 | |
0x08 uint16 offset to FM4 | |
0x0a uint16 offset to FM5 | |
0x0c uint16 offset to FM6 | |
0x0e uint16 offset to SSG1 | |
0x10 uint16 offset to SSG2 | |
0x12 uint16 offset to SSG3 | |
0x14 uint16 offset to rhythm | |
0x16 uint16 offset to ADPCM | |
0x18 uint16 loop pointer of FM1 | |
0x1a uint16 loop pointer of FM2 | |
0x1c uint16 loop pointer of FM3 | |
0x1e uint16 loop pointer of FM4 | |
0x20 uint16 loop pointer of FM5 | |
0x22 uint16 loop pointer of FM6 | |
0x24 uint16 loop pointer of SSG1 | |
0x26 uint16 loop pointer of SSG2 | |
0x28 uint16 loop pointer of SSG3 | |
0x2a uint16 loop pointer of rhythm | |
0x2c uint16 loop pointer of ADPCM | |
0x2e uint8 resolution | |
0x2f uint8 data flags | |
0x30 uint16 adpcm pointer | |
## version <= 0x69 | |
0x02 uint16 offset to FM1 | |
0x04 uint16 offset to FM2 | |
0x06 uint16 offset to FM3 | |
0x08 uint16 offset to FM4 | |
0x0a uint16 offset to FM5 | |
0x0c uint16 offset to FM6 | |
0x0e uint16 offset to SSG1 | |
0x10 uint16 offset to SSG2 | |
0x12 uint16 offset to SSG3 | |
0x14 uint16 offset to rhythm | |
0x16 uint16 offset to ADPCM | |
0x18 uint16 offset to FM EX1 | |
0x1a uint16 offset to FM EX2 | |
0x1c uint16 offset to FM EX3 | |
0x30 uint16 loop pointer of FM1 | |
0x32 uint16 loop pointer of FM2 | |
0x34 uint16 loop pointer of FM3 | |
0x36 uint16 loop pointer of FM4 | |
0x38 uint16 loop pointer of FM5 | |
0x3a uint16 loop pointer of FM6 | |
0x3c uint16 loop pointer of SSG1 | |
0x3e uint16 loop pointer of SSG2 | |
0x40 uint16 loop pointer of SSG3 | |
0x42 uint16 loop pointer of rhythm | |
0x44 uint16 loop pointer of ADPCM | |
0x46 uint16 loop pointer of FM EX1 | |
0x48 uint16 loop pointer of FM EX2 | |
0x4a uint16 loop pointer of FM EX3 | |
0x5e uint8 resolution | |
0x5f uint8 data flags | |
0x60 uint16 adpcm pointer | |
## PLAY6 | |
0x02 uint16 offset to FM1 | |
0x04 uint16 offset to FM2 | |
0x06 uint16 offset to FM3 | |
0x08 uint16 offset to FM4 | |
0x0a uint16 offset to FM5 | |
0x0c uint16 offset to FM6 | |
0x0e uint16 offset to SSG1 | |
0x10 uint16 offset to SSG2 | |
0x12 uint16 offset to SSG3 | |
0x14 uint16 offset to rhythm | |
0x16 uint16 loop pointer of FM1 | |
0x18 uint16 loop pointer of FM2 | |
0x1a uint16 loop pointer of FM3 | |
0x1c uint16 loop pointer of FM4 | |
0x1e uint16 loop pointer of FM5 | |
0x20 uint16 loop pointer of FM6 | |
0x22 uint16 loop pointer of SSG1 | |
0x24 uint16 loop pointer of SSG2 | |
0x26 uint16 loop pointer of SSG3 | |
0x28 uint16 loop pointer of rhythm | |
0x2a uint8 resolution | |
0x2b uint8 data flags | |
### data flags | |
bit 0: q | |
bit 1: ppz | |
bit 2: lfo octave fix | |
# FM tone section | |
start address | |
0x1c (version <= 0x29), 0x32 (version <= 0x49), 0x66 (version <= 0x69), 0x2e (PLAY6) | |
repeat below (in descending order of register number): | |
0x00 uint8 DT/ML op1 | |
0x01 uint8 DT/ML op3 | |
0x02 uint8 DT/ML op2 | |
0x03 uint8 DT/ML op4 | |
... | |
# Track section | |
// TODO | |
# SSG tone section | |
repeat below: | |
0x00 uint8 strat volume | |
0x01 uint8 attack rate | |
0x02 uint8 decay rate | |
0x03 uint8 sustain level | |
0x04 uint8 sustain rate | |
0x05 uint8 release rate | |
# ADPCM section | |
repeat below: | |
0x00 uint16 start address | |
0x02 uint16 stop address | |
0x04 uint16 detatt | |
# misc | |
[??] footer - 0x12 uint16 PCM pointer (if 0x00 offset to footer > filesize and pointer < filesize, no PCM file) | |
[??] footer - 2 uint16 SSG tone pointer (if 0x00 offset to footer > filesize, no tone data) | |
I guess: | |
footer - 2 uint16 misc pointer | |
and in misc section, | |
0x00 uint16 PCM pointer | |
0x02 begin SSG tone section | |
# Footer | |
0x00 3 bytes 'FMC' letters or 'ELF' (PLAY6) | |
0x03 uint8 version | |
0x04 x byte title (null terminated) | |
if text has character at 4th line or later, pdzf.mode = 1 | |
if text has "using PDZF" line, pdzf.mode = 2 | |
# PCM section | |
0x00 8 bytes PPZ file name | |
0x08 8 bytes PVI file name |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment