furnace/papers/export-tech.md

86 lines
1.9 KiB
Markdown

# ROM export technical details
## instrument data
TODO
## macro data
read length, loop and then release (1 byte).
if it is a 2-byte macro, read a dummy byte.
then read data.
## binary command stream
Furnace Command Stream, split version.
```
size | description
-----|------------------------------------
4 | "FCS\0" format magic
4 | channel count
4?? | pointers to channel data
1?? | preset delays
| - 16 values
1?? | speed dial commands
| - 16 values
??? | channel data
```
read command and values (if any).
the list of commands follows.
```
hex | description
----|------------------------------------
00 | note on: C-(-5)
01 | note on: C#(-5)
02 | note on: D-(-5)
.. | ...
b1 | note on: A-9
b2 | note on: A#9
b3 | note on: B-9
b4 | note on: null
----|------------------------------------
b5 | note off
b6 | note off env
b7 | env release
b8 | instrument // (ins, force)
be | panning // (left, right)
c0 | pre porta // (inporta, isportaorslide)
c2 | vibrato // (speed, depth)
c3 | vibrato range // (range)
c4 | vibrato shape // (shape)
c5 | pitch // (pitch)
c6 | arpeggio // (note1, note2)
c7 | volume // (vol)
c8 | vol slide // (amount, onetick)
c9 | porta // (target, speed)
ca | legato // (note)
----|------------------------------------
d0 | speed dial command 0
d1 | speed dial command 1
.. | ...
df | speed dial command 15
----|------------------------------------
e0 | preset delay 0
e1 | preset delay 1
.. | ...
ef | preset delay 15
----|------------------------------------
f4 | call symbol (16-bit index follows; only used internally)
f5 | jump to sub-block (address follows)
f6 | go to sub-block (32-bit offset follows)
f7 | full command (command and data follows)
f8 | go to sub-block (16-bit offset follows)
f9 | return from sub-block
fa | jump (address follows)
fb | set tick rate (4 bytes)
fc | wait (16-bit)
fd | wait (8-bit)
fe | wait one tick
ff | stop
```