# 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 ``` program follows. ### commands/instructions ``` 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) 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) c9 | porta // (target, speed) ca | legato // (note) cb | volume slide with target // (amount, target) cc | tremolo // (speed/depth) cd | panbrello // (speed/depth) ce | pan slide // (speed) cf | panning // (left, right) ----|------------------------------------ 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 ----|------------------------------------ f0 | UNUSED - placeholder used during optimization passes (3-byte nonce follows) f1 | no operation f2 | UNUSED f3 | loop (negative offset and count follow... both are 8-bit) f4 | UNUSED - call symbol (32-bit index follows; only used internally) f5 | call sub-block (32-bit address follows) f6 | UNUSED f7 | full command (command and data follows) f8 | call sub-block (16-bit address 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 ``` ## full commands ``` hex | description ----|------------------------------------ 1c | sample mode 1d | sample freq 1e | legacy sample bank 1f | sample position 20 | sample direction ----|------------------------------------ | **FM commands** 21 | hard reset 22 | LFO speed 23 | LFO waveform 24 | TL 25 | AM 26 | AR 27 | DR 28 | SL 29 | D2R 2a | RR 2b | DT 2c | DT2 2d | RS 2e | KSR 2f | VIB 30 | SUS 31 | WS 32 | SSG-EG 33 | REV 34 | EG-Shift 35 | FB 36 | MULT 37 | FINE 38 | fixed frequency 39 | ExtCh 3a | AM depth 3b | PM depth 3c | LFO2 speed 3d | LFO2 wave ----|------------------------------------ | **PSG commands** 3e | noise freq 3f | noise mode/duty/whatever 40 | waveform ----|------------------------------------ | **Game Boy commands** 41 | sweep time 42 | sweep direction ----|------------------------------------ | **PC Engine commands** 43 | LFO mode 44 | LFO speed ----|------------------------------------ | **NES commands** 45 | sweep 46 | set DMC ----|------------------------------------ | **C64 commands** 47 | coarse cutoff 48 | resonance 49 | filter mode 4a | reset time 4b | reset mask 4c | filter reset 4d | duty reset 4e | extended 4f | duty 50 | cutoff ----|------------------------------------ | **AY commands** 51 | set envelope 52 | envelope freq low 53 | envelope freq high 54 | envelope slide 55 | noise AND mask 56 | noise OR mask 57 | auto envelope 58 | I/O port write 59 | AutoPWM ----|------------------------------------ | **FDS commands** 5a | mod depth 5b | mod speed high 5c | mod speed low 5d | mod position 5e | mod waveform ----|------------------------------------ | **SAA1099 commands** 5f | envelope ----|------------------------------------ | **Amiga commands** 60 | toggle filter 61 | AM 62 | period modulation ----|------------------------------------ | **Lynx commands** 63 | load LFSR ----|------------------------------------ | **QSound commands** 64 | echo feedback 65 | echo delay 66 | echo level 67 | surround ----|------------------------------------ | **X1-010 commands** 68 | envelope shape 69 | envelope enable 6a | envelope mode 6b | envelope period 6c | envelope slide 6d | auto envelope 6e | sample bank slot ----|------------------------------------ | **WonderSwan commands** 6f | sweep time 70 | sweep amount ----|------------------------------------ | **Namco 163 commands** 71 | wave position 72 | wave length 73 | UNUSED 74 | UNUSED 75 | wave load position 76 | wave load length 77 | UNUSED 78 | channel limit 79 | global wave load 7a | global wave load position 7b | UNUSED 7c | UNUSED ----|------------------------------------ | **Sound Unit commands** 7d | sweep period low 7e | sweep period high 7f | sweep bound 80 | sweep enable 81 | sync period low 82 | sync period high ----|------------------------------------ 83 | ADPCM-A volume ----|------------------------------------ | **SNES commands** 84 | echo 85 | pitch mod 86 | invert 87 | gain mode 88 | gain 89 | echo enable 8a | echo delay 8b | echo vol left 8c | echo vol right 8d | echo feedback 8e | echo filter ----|------------------------------------ | **NES commands (continued)** 8f | envelope mode 90 | length counter 91 | count mode (?) ----|------------------------------------ | **macro control** 92 | macro off 93 | macro on ----|------------------------------------ 94 | surround panning ----|------------------------------------ | **FM commands (continued)** 95 | AM depth 2 96 | PM depth 2 ----|------------------------------------ | **ES5506 commands** 97 | filter mode 98 | filter K1 99 | filter K2 9a | filter K1 slide 9b | filter K2 slide 9c | envelope count 9d | envelope left vol ramp 9e | envelope right vol ramp 9f | envelope K1 ramp a0 | envelope K2 ramp a1 | pause ----|------------------------------------ a2 | arpeggio speed ----|------------------------------------ | **SNES commands (continued)** a3 | global vol left a4 | global vol right ----|------------------------------------ a5 | NES linear counter length ----|------------------------------------ a6 | external command ----|------------------------------------ | **C64 commands (continued)** a7 | attack/decay a8 | sustain/release ----|------------------------------------ | **ESFM commands** a9 | operator panning aa | output level ab | modulation input ac | envelope delay ----|------------------------------------ ad | restart macro ----|------------------------------------ | **PowerNoise commands** ae | load counter af | I/O write ----|------------------------------------ | **Dave commands** b0 | high pass b1 | ring mod b2 | swap counters b3 | low pass b4 | clock divider ----|------------------------------------ b5 | MinMod echo setup ----|------------------------------------ | **Bifurcator commands** b6 | state load b7 | set parameter ----|------------------------------------ b8 | FDS auto mod ----|------------------------------------ b9 | FM operator mask ----|------------------------------------ | **MultiPCM commands** ba | mix FM bb | mix PCM bc | LFO bd | VIB be | AM bf | AR c0 | D1R c1 | DL c2 | D2R c3 | RC c4 | RR c5 | damp c6 | pseudo-reverb c7 | LFO reset c8 | level direct ----|------------------------------------ | **SID3 commands** c9 | special wave ca | ring mod source cb | hard sync source cc | phase mod source cd | wave mix ce | LFSR feedback bits cf | 1-bit noise d0 | filter distortion d1 | filter output volume d2 | channel invert d3 | filter connection d4 | filter matrix d5 | filter enable ----|------------------------------------ | **slide commands** d6 | pulse width slide d7 | cutoff slide ----|------------------------------------ | **SID3 commands (continued)** d8 | phase reset d9 | noise phase reset da | envelope reset db | cutoff scaling dc | resonance scaling ----|------------------------------------ dd | WonderSwan speaker volume ```