Skip to content

Instantly share code, notes, and snippets.

@rerrahkr
Created July 24, 2021 10:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rerrahkr/179e99a956dcba76142de2ffab4d2823 to your computer and use it in GitHub Desktop.
Save rerrahkr/179e99a956dcba76142de2ffab4d2823 to your computer and use it in GitHub Desktop.
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