2021-12-29 22:00:49 +00:00
# the Furnace file format (.fur)
while Furnace works directly with the .dmf format, I had to create a new format to handle future additions to the program.
this document has the goal of detailing the format.
2022-02-27 05:28:16 +00:00
**notice:** GitHub's Markdown formatter may break on this file as it doesn't seem to treat tables correctly.
2022-02-04 20:20:49 +00:00
# information
2022-02-27 04:00:02 +00:00
files may be zlib-compressed, but Furnace accepts uncompressed files as well.
2022-02-04 20:20:49 +00:00
all numbers are little-endian.
the following fields may be found in "size":
- `f` indicates a floating point number.
- `STR` is a UTF-8 zero-terminated string.
- `???` is an array of variable size.
- `S??` is an array of `STR` s.
- `1??` is an array of bytes.
- `2??` is an array of shorts.
- `4??` is an array of ints.
the format has changed several times across versions. a `(>=VER)` indicates this field is only present starting from format version `VER` , and `(<VER)` indicates this field is present only before version `VER` .
furthermore, an `or reserved` indicates this field is always present, but is reserved when the version condition is not met.
2022-06-29 06:56:57 +00:00
the `size of this block` fields represent the size of a block excluding the ID and the aforementioned field.
these fields are 0 in format versions prior to 100 (0.6pre1).
2022-02-04 20:20:49 +00:00
# format versions
the format versions are:
2023-10-02 04:08:46 +00:00
- 181: Furnace 0.6
2023-09-27 21:00:06 +00:00
- 180: Furnace 0.6pre18
2023-09-25 19:28:38 +00:00
- 179: Furnace 0.6pre17
2023-09-14 09:31:15 +00:00
- 178: Furnace 0.6pre16
2023-09-13 23:25:32 +00:00
- 177: Furnace 0.6pre15
2023-09-11 08:20:17 +00:00
- 175: Furnace 0.6pre14
2023-09-10 23:05:16 +00:00
- 174: Furnace 0.6pre13
2023-09-09 21:23:17 +00:00
- 173: Furnace 0.6pre12
2023-09-08 00:09:53 +00:00
- 172: Furnace 0.6pre11
2023-09-07 07:25:21 +00:00
- 171: Furnace 0.6pre10
2023-08-26 08:36:28 +00:00
- 169: Furnace 0.6pre9
2023-08-19 09:48:27 +00:00
- 166: Furnace 0.6pre8
2023-07-09 08:40:45 +00:00
- 162: Furnace 0.6pre7
2023-07-09 01:07:33 +00:00
- 161: Furnace 0.6pre6
2023-05-26 20:16:07 +00:00
- 158: Furnace 0.6pre5
2023-04-07 21:54:05 +00:00
- 146: Furnace Pro (joke version)
2023-02-24 10:15:19 +00:00
- 143: Furnace 0.6pre4
2023-02-19 20:58:56 +00:00
- 141: Furnace Tournament Edition (for intro tune contest)
2022-12-28 23:11:30 +00:00
- 133: Furnace 0.6pre3
2022-12-25 04:39:44 +00:00
- 132: Furnace 0.6pre2
2022-09-22 09:13:26 +00:00
- 116: Furnace 0.6pre1.5
2022-06-29 06:56:57 +00:00
- 100: Furnace 0.6pre1
2022-04-04 09:47:52 +00:00
- 75: Furnace dev75/April Fools' 0.6pre0
2022-02-22 22:49:29 +00:00
2022-02-25 03:52:20 +00:00
- 54: Furnace 0.5.8
2022-02-22 22:49:29 +00:00
- 53: Furnace 0.5.7
- 52: Furnace 0.5.7pre4
2022-02-19 23:18:12 +00:00
- 51: Furnace 0.5.7pre3
2022-02-18 07:03:31 +00:00
- 50: Furnace 0.5.7pre2
- 49: Furnace 0.5.7pre1
- 48: Furnace 0.5.6
2022-02-10 03:07:32 +00:00
- 47: Furnace 0.5.6pre1
- 46: Furnace 0.5.5
2022-02-08 21:43:40 +00:00
- 45: Furnace 0.5.5pre3
2022-02-08 08:50:42 +00:00
- 44: Furnace 0.5.5pre2
- 43: Furnace 0.5.5pre1
- 42: Furnace 0.5.4
- 41: Furnace 0.5.3
- 40: Furnace 0.5.2
- 39: Furnace 0.5.2pre3
2022-02-04 20:20:49 +00:00
- 38: Furnace 0.5.2pre2
- 37: Furnace 0.5.2pre1
- 36: Furnace 0.5.1
- 35: Furnace 0.5
- 27: Furnace 0.4.6
- 26: Furnace 0.4.6pre1
- 25: Furnace 0.4.5
- 24: Furnace 0.4.4
- 23: Furnace 0.4.3
- 22: Furnace 0.4.2
- 21: Furnace 0.4.1
- 20: Furnace 0.4
- 19: Furnace 0.4pre3
- 18: Furnace 0.4pre2
- 17: Furnace 0.4pre1
- 16: Furnace 0.3.1
- 15: Furnace 0.3
- 14: Furnace 0.2.2
- 13: Furnace 0.2.1
- 12: Furnace 0.2
2023-07-22 00:54:35 +00:00
versions that do not appear in this list are `dev???` ones.
2021-12-29 22:00:49 +00:00
# header
the header is 32 bytes long.
2022-02-27 05:28:16 +00:00
```
2021-12-29 22:00:49 +00:00
size | description
-----|------------------------------------
16 | "-Furnace module-" format magic
2 | format version
2 | reserved
4 | song info pointer
8 | reserved
2022-02-27 05:28:16 +00:00
```
2021-12-29 22:00:49 +00:00
# song info
2022-02-27 05:28:16 +00:00
```
2021-12-29 22:00:49 +00:00
size | description
-----|------------------------------------
4 | "INFO" block ID
2022-06-29 06:56:57 +00:00
4 | size of this block
2022-05-15 06:42:49 +00:00
1 | time base (of first song)
1 | speed 1 (of first song)
1 | speed 2 (of first song)
1 | initial arpeggio time (of first song)
4f | ticks per second (of first song)
2021-12-29 22:00:49 +00:00
| - 60 is NTSC
| - 50 is PAL
2022-05-15 06:42:49 +00:00
2 | pattern length (of first song)
2022-04-08 22:21:36 +00:00
| - the limit is 256.
2022-05-15 06:42:49 +00:00
2 | orders length (of first song)
2022-04-08 22:21:36 +00:00
| - the limit is 256 (>=80) or 127 (< 80 ) .
2022-05-15 06:42:49 +00:00
1 | highlight A (of first song)
1 | highlight B (of first song)
2021-12-29 22:00:49 +00:00
2 | instrument count
2022-04-08 22:21:36 +00:00
| - the limit is 256.
2021-12-29 22:00:49 +00:00
2 | wavetable count
2022-04-08 22:21:36 +00:00
| - the limit is 256.
2021-12-29 22:00:49 +00:00
2 | sample count
2022-04-08 22:21:36 +00:00
| - the limit is 256.
2022-05-15 06:42:49 +00:00
4 | pattern count (global)
2022-01-09 08:52:41 +00:00
32 | list of sound chips
2021-12-29 22:00:49 +00:00
| - possible soundchips:
2022-01-09 08:52:41 +00:00
| - 0x00: end of list
2021-12-29 22:00:49 +00:00
| - 0x01: YMU759 - 17 channels
2022-02-24 04:22:46 +00:00
| - 0x02: Genesis - 10 channels (compound!)
2021-12-29 22:00:49 +00:00
| - 0x03: SMS (SN76489) - 4 channels
| - 0x04: Game Boy - 4 channels
| - 0x05: PC Engine - 6 channels
| - 0x06: NES - 5 channels
| - 0x07: C64 (8580) - 3 channels
2022-02-24 04:22:46 +00:00
| - 0x08: Arcade (YM2151+SegaPCM) - 13 channels (compound!)
2022-03-02 23:39:21 +00:00
| - 0x09: Neo Geo CD (YM2610) - 13 channels
2022-04-03 18:54:02 +00:00
| - 0x42: Genesis extended - 13 channels
| - 0x43: SMS (SN76489) + OPLL (YM2413) - 13 channels (compound!)
| - 0x46: NES + VRC7 - 11 channels (compound!)
| - 0x47: C64 (6581) - 3 channels
| - 0x49: Neo Geo CD extended - 16 channels
| - 0x80: AY-3-8910 - 3 channels
| - 0x81: Amiga - 4 channels
2023-08-13 00:18:28 +00:00
| - 0x82: YM2151 - 8 channels
| - 0x83: YM2612 - 6 channels
2022-04-03 18:54:02 +00:00
| - 0x84: TIA - 2 channels
| - 0x85: VIC-20 - 4 channels
| - 0x86: PET - 1 channel
| - 0x87: SNES - 8 channels
| - 0x88: VRC6 - 3 channels
| - 0x89: OPLL (YM2413) - 9 channels
| - 0x8a: FDS - 1 channel
| - 0x8b: MMC5 - 3 channels
| - 0x8c: Namco 163 - 8 channels
2022-12-20 21:56:44 +00:00
| - 0x8d: YM2203 - 6 channels
| - 0x8e: YM2608 - 16 channels
2022-04-03 18:54:02 +00:00
| - 0x8f: OPL (YM3526) - 9 channels
| - 0x90: OPL2 (YM3812) - 9 channels
| - 0x91: OPL3 (YMF262) - 18 channels
2023-08-13 00:18:28 +00:00
| - 0x92: MultiPCM - 28 channels (UNAVAILABLE)
2022-04-03 18:54:02 +00:00
| - 0x93: Intel 8253 (beeper) - 1 channel
| - 0x94: POKEY - 4 channels
| - 0x95: RF5C68 - 8 channels
| - 0x96: WonderSwan - 4 channels
| - 0x97: Philips SAA1099 - 6 channels
| - 0x98: OPZ (YM2414) - 8 channels
| - 0x99: Pokémon Mini - 1 channel
| - 0x9a: AY8930 - 3 channels
| - 0x9b: SegaPCM - 16 channels
| - 0x9c: Virtual Boy - 6 channels
| - 0x9d: VRC7 - 6 channels
| - 0x9e: YM2610B - 16 channels
2023-03-03 19:13:33 +00:00
| - 0x9f: ZX Spectrum (beeper, tildearrow engine) - 6 channels
2022-04-03 18:54:02 +00:00
| - 0xa0: YM2612 extended - 9 channels
| - 0xa1: Konami SCC - 5 channels
| - 0xa2: OPL drums (YM3526) - 11 channels
| - 0xa3: OPL2 drums (YM3812) - 11 channels
| - 0xa4: OPL3 drums (YMF262) - 20 channels
| - 0xa5: Neo Geo (YM2610) - 14 channels
| - 0xa6: Neo Geo extended (YM2610) - 17 channels
| - 0xa7: OPLL drums (YM2413) - 11 channels
| - 0xa8: Atari Lynx - 4 channels
2022-04-26 23:32:33 +00:00
| - 0xa9: SegaPCM (for DefleMask compatibility) - 5 channels
2022-04-03 18:54:02 +00:00
| - 0xaa: MSM6295 - 4 channels
| - 0xab: MSM6258 - 1 channel
| - 0xac: Commander X16 (VERA) - 17 channels
| - 0xad: Bubble System WSG - 2 channels
2023-08-13 00:18:28 +00:00
| - 0xae: OPL4 (YMF278B) - 42 channels (UNAVAILABLE)
| - 0xaf: OPL4 drums (YMF278B) - 44 channels (UNAVAILABLE)
2022-04-03 18:54:02 +00:00
| - 0xb0: Seta/Allumer X1-010 - 16 channels
2022-04-12 19:57:55 +00:00
| - 0xb1: Ensoniq ES5506 - 32 channels
2022-04-12 20:06:11 +00:00
| - 0xb2: Yamaha Y8950 - 10 channels
| - 0xb3: Yamaha Y8950 drums - 12 channels
2022-04-12 20:13:02 +00:00
| - 0xb4: Konami SCC+ - 5 channels
2022-04-26 23:32:33 +00:00
| - 0xb5: tildearrow Sound Unit - 8 channels
2022-12-20 21:56:44 +00:00
| - 0xb6: YM2203 extended - 9 channels
| - 0xb7: YM2608 extended - 19 channels
2022-05-14 21:18:24 +00:00
| - 0xb8: YMZ280B - 8 channels
2022-05-19 23:24:53 +00:00
| - 0xb9: Namco WSG - 3 channels
2023-08-13 00:18:28 +00:00
| - 0xba: Namco C15 - 8 channels
| - 0xbb: Namco C30 - 8 channels
2022-09-28 22:05:48 +00:00
| - 0xbc: MSM5232 - 8 channels
2023-08-13 00:18:28 +00:00
| - 0xbd: YM2612 DualPCM extended - 11 channels
| - 0xbe: YM2612 DualPCM - 7 channels
2022-07-01 19:13:50 +00:00
| - 0xbf: T6W28 - 4 channels
2022-07-02 01:19:25 +00:00
| - 0xc0: PCM DAC - 1 channel
2022-07-21 19:51:26 +00:00
| - 0xc1: YM2612 CSM - 10 channels
2023-08-13 00:18:28 +00:00
| - 0xc2: Neo Geo CSM (YM2610) - 18 channels (UNAVAILABLE)
| - 0xc3: YM2203 CSM - 10 channels (UNAVAILABLE)
| - 0xc4: YM2608 CSM - 20 channels (UNAVAILABLE)
| - 0xc5: YM2610B CSM - 20 channels (UNAVAILABLE)
2022-12-15 04:55:29 +00:00
| - 0xc6: K007232 - 2 channels
| - 0xc7: GA20 - 4 channels
2023-02-11 22:42:02 +00:00
| - 0xc8: SM8521 - 3 channels
2023-08-13 00:18:28 +00:00
| - 0xc9: M114S - 16 channels (UNAVAILABLE)
2023-03-03 19:13:33 +00:00
| - 0xca: ZX Spectrum (beeper, QuadTone engine) - 5 channels
2023-03-05 18:36:39 +00:00
| - 0xcb: Casio PV-1000 - 3 channels
2023-07-09 09:12:17 +00:00
| - 0xcc: K053260 - 4 channels
2023-07-23 09:42:38 +00:00
| - 0xcd: TED - 2 channels
2023-08-12 06:54:12 +00:00
| - 0xce: Namco C140 - 24 channels
2023-08-27 23:46:10 +00:00
| - 0xcf: Namco C219 - 16 channels
2023-08-13 00:18:28 +00:00
| - 0xd0: Namco C352 - 32 channels (UNAVAILABLE)
2023-10-25 20:40:10 +00:00
| - 0xd1: ESFM - 18 channels (UNAVAILABLE)
2024-01-22 19:46:22 +00:00
| - 0xd2: Ensoniq ES5503 (hard pan) - 32 channels (UNAVAILABLE)
2024-01-22 04:58:12 +00:00
| - 0xd4: PowerNoise - 4 channels (UNAVAILABLE)
2022-04-03 18:54:02 +00:00
| - 0xde: YM2610B extended - 19 channels
| - 0xe0: QSound - 19 channels
2022-10-24 08:19:42 +00:00
| - 0xfc: Pong - 1 channel
2022-04-27 05:56:15 +00:00
| - 0xfd: Dummy System - 8 channels
| - 0xfe: reserved for development
| - 0xff: reserved for development
2022-02-24 04:22:46 +00:00
| - (compound!) means that the system is composed of two or more chips,
| and has to be flattened.
2023-08-13 00:18:28 +00:00
| - (UNAVAILABLE) means that the chip hasn't been implemented in Furnace
| yet.
2023-02-26 09:21:27 +00:00
32 | sound chip volumes (< 135 ) or reserved
2022-01-09 08:52:41 +00:00
| - signed char, 64=1.0, 127=~2.0
2023-02-26 09:21:27 +00:00
| - as of version 135 these fields only exist for compatibility reasons.
32 | sound chip panning (< 135 ) or reserved
2022-01-09 08:52:41 +00:00
| - signed char, -128=left, 127=right
2023-02-26 09:21:27 +00:00
| - as of version 135 these fields only exist for compatibility reasons.
2022-09-29 08:19:48 +00:00
128 | sound chip flag pointers (>=119) or sound chip flags
| - before 118, these were 32-bit flags.
| - for conversion details, see the "converting from old flags" section.
2022-02-04 20:20:49 +00:00
STR | song name
STR | song author
2022-01-28 05:55:51 +00:00
4f | A-4 tuning
2022-02-04 20:20:49 +00:00
1 | limit slides (>=36) or reserved
1 | linear pitch (>=36) or reserved
2022-06-24 06:51:05 +00:00
| - 0: non-linear
2022-05-10 08:51:18 +00:00
| - 1: only pitch change (04xy/E5xx) linear
| - 2: full linear (>=94)
2022-02-04 20:20:49 +00:00
1 | loop modality (>=36) or reserved
2022-02-06 06:56:50 +00:00
1 | proper noise layout (>=42) or reserved
1 | wave duty is volume (>=42) or reserved
2022-02-08 21:43:40 +00:00
1 | reset macro on porta (>=45) or reserved
1 | legacy volume slides (>=45) or reserved
1 | compatible arpeggio (>=45) or reserved
1 | note off resets slides (>=45) or reserved
1 | target resets slides (>=45) or reserved
2022-02-10 03:07:32 +00:00
1 | arpeggio inhibits portamento (>=47) or reserved
1 | wack algorithm macro (>=47) or reserved
2022-02-18 06:27:26 +00:00
1 | broken shortcut slides (>=49) or reserved
2022-02-18 07:03:31 +00:00
1 | ignore duplicate slides (>=50) or reserved
2022-03-04 04:14:38 +00:00
1 | stop portamento on note off (>=62) or reserved
1 | continuous vibrato (>=62) or reserved
2022-03-12 03:11:33 +00:00
1 | broken DAC mode (>=64) or reserved
2022-03-12 04:01:18 +00:00
1 | one tick cut (>=65) or reserved
2022-03-14 06:23:31 +00:00
1 | instrument change allowed during porta (>=66) or reserved
2022-03-17 21:39:01 +00:00
1 | reset note base on arpeggio effect stop (0000) (>=69) or reserved
2021-12-29 22:00:49 +00:00
4?? | pointers to instruments
4?? | pointers to wavetables
4?? | pointers to samples
4?? | pointers to patterns
2022-05-15 06:42:49 +00:00
??? | orders (of first song)
2022-02-27 22:30:33 +00:00
| - a table of bytes
2021-12-29 22:00:49 +00:00
| - size=channels*ordLen
2022-02-27 22:31:11 +00:00
| - read orders then channels
2022-04-08 22:21:36 +00:00
| - the maximum value of a cell is FF (>=80) or 7F (< 80 ) .
2022-05-15 06:42:49 +00:00
??? | effect columns (of first song)
2021-12-29 22:00:49 +00:00
| - size=channels
2022-05-15 06:42:49 +00:00
1?? | channel hide status (of first song)
2022-02-04 19:44:07 +00:00
| - size=channels
2022-05-15 06:42:49 +00:00
1?? | channel collapse status (of first song)
2022-02-04 19:44:07 +00:00
| - size=channels
2022-05-15 06:42:49 +00:00
S?? | channel names (of first song)
2022-02-04 19:44:07 +00:00
| - a list of channelCount C strings
2022-05-15 06:42:49 +00:00
S?? | channel short names (of first song)
2022-02-04 19:44:07 +00:00
| - same as above
2022-02-04 20:20:49 +00:00
STR | song comment
2022-02-24 22:56:19 +00:00
4f | master volume, 1.0f=100% (>=59)
| this is 2.0f for modules before 59
2022-03-23 06:35:57 +00:00
--- | **extended compatibility flags** (>=70)
1 | broken speed selection
2022-03-24 04:56:59 +00:00
1 | no slides on first tick (>=71) or reserved
1 | next row reset arp pos (>=71) or reserved
1 | ignore jump at end (>=71) or reserved
2022-03-27 03:15:15 +00:00
1 | buggy portamento after slide (>=72) or reserved
1 | new ins affects envelope (Game Boy) (>=72) or reserved
2022-04-07 06:14:34 +00:00
1 | ExtCh channel state is shared (>=78) or reserved
2022-04-13 05:34:00 +00:00
1 | ignore DAC mode change outside of intended channel (>=83) or reserved
2022-06-29 09:57:05 +00:00
1 | E1xy and E2xy also take priority over Slide00 (>=83) or reserved
2022-04-24 19:40:07 +00:00
1 | new Sega PCM (with macros and proper vol/pan) (>=84) or reserved
1 | weird f-num/block-based chip pitch slides (>=85) or reserved
2022-04-24 23:12:18 +00:00
1 | SN duty macro always resets phase (>=86) or reserved
2022-04-28 05:26:21 +00:00
1 | pitch macro is linear (>=90) or reserved
2022-05-10 08:51:18 +00:00
1 | pitch slide speed in full linear pitch mode (>=94) or reserved
2022-05-22 18:25:59 +00:00
1 | old octave boundary behavior (>=97) or reserved
2022-05-27 10:13:10 +00:00
1 | disable OPN2 DAC volume control (>=98) or reserved
1 | new volume scaling strategy (>=99) or reserved
1 | volume macro still applies after end (>=99) or reserved
1 | broken outVol (>=99) or reserved
2022-06-29 09:57:05 +00:00
1 | E1xy and E2xy stop on same note (>=100) or reserved
2022-07-04 06:43:59 +00:00
1 | broken initial position of porta after arp (>=101) or reserved
2022-08-19 23:46:19 +00:00
1 | SN periods under 8 are treated as 1 (>=108) or reserved
2022-08-22 07:13:33 +00:00
1 | cut/delay effect policy (>=110) or reserved
2022-09-10 06:39:42 +00:00
1 | 0B/0D effect treatment (>=113) or reserved
2022-09-22 00:27:42 +00:00
1 | automatic system name detection (>=115) or reserved
| - this one isn't a compatibility flag, but it's here for convenience...
2022-10-08 05:53:01 +00:00
1 | disable sample macro (>=117) or reserved
1 | broken outVol episode 2 (>=121) or reserved
2022-12-17 05:54:56 +00:00
1 | old arpeggio strategy (>=130) or reserved
2022-05-18 05:05:25 +00:00
--- | **virtual tempo data**
2 | virtual tempo numerator of first song (>=96) or reserved
2 | virtual tempo denominator of first song (>=96) or reserved
2022-05-15 06:42:49 +00:00
--- | **additional subsongs** (>=95)
STR | first subsong name
STR | first subsong comment
1 | number of additional subsongs
3 | reserved
4?? | pointers to subsong data
2022-07-23 22:02:03 +00:00
--- | **additional metadata** (>=103)
STR | system name
STR | album/category/game name
STR | song name (Japanese)
STR | song author (Japanese)
STR | system name (Japanese)
STR | album/category/game name (Japanese)
2023-01-06 22:43:08 +00:00
--- | **extra chip output settings (× chipCount)** (>=135)
4f | chip volume
4f | chip panning
4f | chip front/rear balance
--- | **patchbay** (>=135)
4 | patchbay connection count
4?? | patchbay
| - see next section for more details.
2023-01-10 20:58:15 +00:00
1 | automatic patchbay (>=136)
2023-01-17 06:58:59 +00:00
--- | **a couple more compat flags** (>=138)
1 | broken portamento during legato
2023-05-05 07:14:53 +00:00
1 | broken macro during note off in some FM chips (>=155)
2023-08-23 17:50:22 +00:00
1 | pre note (C64) does not compensate for portamento or legato (>=168)
2023-10-14 00:57:36 +00:00
1 | disable new NES DPCM features (>=183)
2023-10-14 08:19:02 +00:00
1 | reset arp effect phase on new note (>=184)
2023-11-14 09:22:06 +00:00
1 | linear volume scaling rounds up (>=188)
2024-01-17 04:54:32 +00:00
1 | legacy "always set volume" behavior (>=191)
1 | reserved
2023-02-05 07:56:39 +00:00
--- | **speed pattern of first song** (>=139)
1 | length of speed pattern (fail if this is lower than 0 or higher than 16)
16 | speed pattern (this overrides speed 1 and speed 2 settings)
--- | **groove list** (>=139)
1 | number of entries
??? | groove entries. the format is:
| - 1 byte: length of groove
| - 16 bytes: groove pattern
2023-05-16 07:44:46 +00:00
--- | **pointers to asset directories** (>=156)
4 | instrument directories
4 | wavetable directories
4 | sample directories
2022-05-15 06:42:49 +00:00
```
2023-01-06 22:43:08 +00:00
# patchbay
Furnace dev135 adds a "patchbay" which allows for arbitrary connection of chip outputs to system outputs.
2023-05-21 09:39:36 +00:00
it also allows connecting outputs to effects and so on.
2023-01-06 22:43:08 +00:00
a connection is represented as an unsigned int in the following format:
- bit 16-31: source port
- bit 0-15: destination port
a port is in the following format (hexadecimal): `xxxy`
2023-01-06 23:44:20 +00:00
- `xxx` (bit 4 to 15) represents a portset.
- `y` (bit 0 to 3) is the port in that portset.
2023-01-06 22:43:08 +00:00
2023-01-06 23:44:20 +00:00
reserved input portsets:
2023-01-06 22:43:08 +00:00
- `000` : system outputs
2023-01-06 23:44:20 +00:00
- `FFF` : "null" portset
2023-01-06 22:43:08 +00:00
2023-01-06 23:44:20 +00:00
reserved output portsets:
2023-01-06 22:43:08 +00:00
- `000` through `01F` : chip outputs
2023-01-11 00:09:26 +00:00
- `FFD` : wave/sample preview
- `FFE` : metronome
- `FFF` : "null" portset
2023-01-06 22:43:08 +00:00
2022-05-15 06:42:49 +00:00
# subsong
from version 95 onwards, Furnace supports storing multiple songs on a single file.
the way it's currently done is really weird, but it provides for some backwards compatibility (previous versions will only load the first subsong which is already defined in the `INFO` block).
```
size | description
-----|------------------------------------
4 | "SONG" block ID
2022-06-29 06:56:57 +00:00
4 | size of this block
2022-05-15 06:42:49 +00:00
1 | time base
1 | speed 1
1 | speed 2
1 | initial arpeggio time
4f | ticks per second
| - 60 is NTSC
| - 50 is PAL
2 | pattern length
| - the limit is 256.
2 | orders length
| - the limit is 256.
1 | highlight A
1 | highlight B
2022-05-18 05:05:25 +00:00
2 | virtual tempo numerator
2 | virtual tempo denominator
2022-05-15 06:42:49 +00:00
STR | subsong name
STR | subsong comment
??? | orders
| - a table of bytes
| - size=channels*ordLen
| - read orders then channels
| - the maximum value of a cell is FF.
??? | effect columns
| - size=channels
1?? | channel hide status
| - size=channels
1?? | channel collapse status
| - size=channels
S?? | channel names
| - a list of channelCount C strings
S?? | channel short names
| - same as above
2023-02-05 07:56:39 +00:00
--- | **speed pattern** (>=139)
1 | length of speed pattern (fail if this is lower than 0 or higher than 16)
16 | speed pattern (this overrides speed 1 and speed 2 settings)
2022-02-27 05:28:16 +00:00
```
2021-12-29 22:00:49 +00:00
2022-09-29 08:19:48 +00:00
# chip flags
```
size | description
-----|------------------------------------
4 | "FLAG" block ID
4 | size of this block
STR | data
```
flags are stored in text (`key=value`) format. for example:
```
clock=4000000
stereo=true
```
2023-05-16 07:44:46 +00:00
# asset directories (>=156)
also known as "folder" in the user interface.
```
size | description
-----|------------------------------------
4 | "ADIR" block ID
4 | size of this block
4 | number of directories
--- | **asset directory** (× numberOfDirs)
STR | name (if empty, this is the uncategorized directory)
2 | number of assets
1?? | assets in this directory
```
2022-11-21 10:26:39 +00:00
# instrument (>=127)
Furnace dev127 and higher use the new instrument format.
```
size | description
-----|------------------------------------
4 | "INS2" block ID
4 | size of this block
2 | format version
2 | instrument type
??? | features...
```
see [newIns.md ](newIns.md ) for more information.
# old instrument (<127)
2021-12-29 22:00:49 +00:00
2024-01-22 19:43:49 +00:00
instruments in older versions of Furnace used a different format. see [oldIns.md ](oldIns.md ) for more information.
2022-10-07 09:11:45 +00:00
2023-10-29 08:04:55 +00:00
## C64 compatibility note (>=187)
in Furnace dev187 the volume and cutoff macros have been separated, as noted above.
2023-10-29 08:12:33 +00:00
however, there are two other changes as well: **inverted relative (non-absolute) cutoff macro** ; and a new, improved Special macro.
2023-10-29 08:04:55 +00:00
2023-10-29 08:12:33 +00:00
if version is less than 187, you must convert the Special macro:
2023-10-29 08:04:55 +00:00
1. do not continue if ex4 is not a Sequence type macro!
2. move bit 0 of ex4 macro data into bit 3.
3. set bit 0 on all steps of ex4 macro to 1.
4. if ex3 is not a Sequence type macro, stop here.
5. if ex3 macro length is 0, stop here.
6. merge the ex3 macro (former Special) into ex4 (former Test).
- use the largest size (between ex3 and ex4).
- if the ex3 macro is shorter than the ex4 one, use the last value of ex3, and vice-versa.
2023-10-29 08:12:33 +00:00
- if the ex4 macro length is 0, expand it to the largest size, and set all steps to 1.
2023-10-29 08:04:55 +00:00
don't worry about loop or release...
2021-12-29 22:00:49 +00:00
# wavetable
2022-02-27 05:28:16 +00:00
```
2021-12-29 22:00:49 +00:00
size | description
-----|------------------------------------
4 | "WAVE" block ID
2022-06-29 06:56:57 +00:00
4 | size of this block
2022-02-04 20:20:49 +00:00
STR | wavetable name
2022-08-22 09:38:46 +00:00
4 | wavetable width
4 | reserved
4 | wavetable height
2021-12-29 22:00:49 +00:00
4?? | wavetable data
2022-02-27 05:28:16 +00:00
```
2021-12-29 22:00:49 +00:00
2022-07-22 07:29:01 +00:00
# sample (>=102)
this is the new sample storage format used in Furnace dev102 and higher.
```
size | description
-----|------------------------------------
4 | "SMP2" block ID
4 | size of this block
STR | sample name
4 | length
4 | compatibility rate
4 | C-4 rate
1 | depth
| - 0: ZX Spectrum overlay drum (1-bit)
| - 1: 1-bit NES DPCM (1-bit)
| - 3: YMZ ADPCM
| - 4: QSound ADPCM
| - 5: ADPCM-A
| - 6: ADPCM-B
| - 8: 8-bit PCM
| - 9: BRR (SNES)
| - 10: VOX
| - 16: 16-bit PCM
2022-11-07 22:22:13 +00:00
1 | loop direction (>=123) or reserved
| - 0: forward
2022-12-07 07:57:19 +00:00
| - 1: backward
| - 2: ping-pong
1 | flags (>=129) or reserved
| - 0: BRR emphasis
2023-06-05 09:28:07 +00:00
1 | flags 2 (>=159) or reserved
| - 0: dither
2022-07-22 07:29:01 +00:00
4 | loop start
| - -1 means no loop
4 | loop end
| - -1 means no loop
16 | sample presence bitfields
| - for future use.
| - indicates whether the sample should be present in the memory of a system.
| - read 4 32-bit numbers (for 4 memory banks per system, e.g. YM2610
| does ADPCM-A and ADPCM-B on separate memory banks).
??? | sample data
| - size is length
```
# old sample (<102)
this format is present when saving using previous Furnace versions.
2021-12-29 22:00:49 +00:00
2022-02-27 05:28:16 +00:00
```
2021-12-29 22:00:49 +00:00
size | description
-----|------------------------------------
4 | "SMPL" block ID
2022-06-29 06:56:57 +00:00
4 | size of this block
2022-02-04 20:20:49 +00:00
STR | sample name
2021-12-29 22:00:49 +00:00
4 | length
2022-07-22 07:29:01 +00:00
4 | compatibility rate
2022-02-24 08:57:45 +00:00
2 | volume (< 58 ) or reserved
2 | pitch (< 58 ) or reserved
2021-12-29 22:00:49 +00:00
1 | depth
2022-02-24 08:57:45 +00:00
| - 0: ZX Spectrum overlay drum (1-bit)
| - 1: 1-bit NES DPCM (1-bit)
2022-05-14 21:59:07 +00:00
| - 3: YMZ ADPCM
2022-02-24 08:57:45 +00:00
| - 4: QSound ADPCM
| - 5: ADPCM-A
| - 6: ADPCM-B
| - 8: 8-bit PCM
| - 9: BRR (SNES)
| - 10: VOX
| - 16: 16-bit PCM
2022-01-27 21:52:06 +00:00
1 | reserved
2022-02-04 20:20:49 +00:00
2 | C-4 rate (>=32) or reserved
4 | loop point (>=19) or reserved
2022-01-15 22:54:21 +00:00
| - -1 means no loop
2022-02-24 08:57:45 +00:00
??? | sample data
| - version< 58 size is length * 2
| - version>=58 size is length
2022-02-27 05:28:16 +00:00
```
2021-12-29 22:00:49 +00:00
2023-05-18 22:53:13 +00:00
# pattern (>=157)
```
size | description
-----|------------------------------------
4 | "PATN" block ID
4 | size of this block
1 | subsong
1 | channel
2 | pattern index
STR | pattern name (>=51)
??? | pattern data
2023-05-19 00:50:36 +00:00
| - read a byte per row.
2023-10-14 01:08:59 +00:00
| - if it is 0xff, end of data. the rest of the pattern is empty.
2023-05-19 00:50:36 +00:00
| - if bit 7 is set, then read bit 0-6 as "skip N+2 rows".
| - if bit 7 is clear, then:
| - bit 0: note present
| - bit 1: ins present
| - bit 2: volume present
| - bit 3: effect 0 present
| - bit 4: effect value 0 present
| - bit 5: other effects (0-3) present
| - bit 6: other effects (4-7) present
| - if bit 5 is set, read another byte:
| - bit 0: effect 0 present
| - bit 1: effect value 0 present
| - bit 2: effect 1 present
| - bit 3: effect value 1 present
| - bit 4: effect 2 present
| - bit 5: effect value 2 present
| - bit 6: effect 3 present
| - bit 7: effect value 3 present
| - if bit 6 is set, read another byte:
| - bit 0: effect 4 present
| - bit 1: effect value 4 present
| - bit 2: effect 5 present
| - bit 3: effect value 5 present
| - bit 4: effect 6 present
| - bit 5: effect value 6 present
| - bit 6: effect 7 present
| - bit 7: effect value 7 present
| - then read note, ins, volume, effects and effect values depending on what is present.
| - for note:
| - 0 is C-(-5)
| - 179 is B-9
| - 180 is note off
| - 181 is note release
| - 182 is macro release
2023-05-18 22:53:13 +00:00
```
# old pattern (<157)
2021-12-29 22:00:49 +00:00
2022-02-27 05:28:16 +00:00
```
2021-12-29 22:00:49 +00:00
size | description
-----|------------------------------------
4 | "PATR" block ID
2022-06-29 06:56:57 +00:00
4 | size of this block
2021-12-29 22:00:49 +00:00
2 | channel
2 | pattern index
2022-05-15 06:42:49 +00:00
2 | subsong (>=95) or reserved
2 | reserved
2021-12-29 22:00:49 +00:00
??? | pattern data
| - size: rows*(4+effectColumns*2)*2
| - read shorts in this order:
| - note
2022-04-07 01:21:20 +00:00
| - 0: empty/invalid
| - 1: C#
| - 2: D
| - 3: D#
| - 4: E
| - 5: F
| - 6: F#
| - 7: G
| - 8: G#
| - 9: A
| - 10: A#
| - 11: B
| - 12: C (of next octave)
2022-04-16 23:01:12 +00:00
| - this is actually a leftover of the .dmf format.
2022-04-07 01:21:20 +00:00
| - 100: note off
2023-05-18 22:53:13 +00:00
| - 101: note release
| - 102: macro release
2021-12-29 22:00:49 +00:00
| - octave
2022-04-07 01:21:20 +00:00
| - this is an signed char stored in a short.
| - therefore octave value 255 is actually octave -1.
2022-04-16 23:01:12 +00:00
| - yep, another leftover of the .dmf format...
2021-12-29 22:00:49 +00:00
| - instrument
| - volume
2022-04-16 23:01:12 +00:00
| - effect and effect data (× effect columns)
| - for note/octave, if both values are 0 then it means empty.
2022-04-07 01:21:20 +00:00
| - for instrument, volume, effect and effect data, a value of -1 means empty.
2022-02-19 23:18:12 +00:00
STR | pattern name (>=51)
2022-02-27 05:28:16 +00:00
```
2022-01-11 09:45:07 +00:00
# the Furnace wavetable format (.fuw)
similar to the instrument format...
2022-02-27 05:28:16 +00:00
```
2022-01-11 09:45:07 +00:00
size | description
-----|------------------------------------
16 | "-Furnace waveta-" format magic
2 | format version
2 | reserved
2022-02-27 05:28:16 +00:00
```
2022-01-11 09:45:07 +00:00
wavetable data follows.
2022-09-29 08:19:48 +00:00
# converting from old flags
prior to format version 119, chip flags were stored as a 32-bit integer.
this section will help you understand the old flag format.
chips which aren't on this list don't have any flags.
## 0x02: Genesis (COMPOUND) and 0x42: Genesis extended (COMPOUND)
- bit 31: ladderEffect (bool)
- bit 0-30: clockSel (int)
- 0: NTSC
- 1: PAL
- 2: 8MHz
- 3: Firecore (`COLOR_NTSC*12/7`)
- 4: System 32 (`COLOR_NTSC*9/4`)
- only 0 and 1 apply to the SN part as well.
## 0x03: SMS (SN76489)
- flags AND 0xff03: clockSel (int)
- 0x0000: NTSC (becomes 0)
- 0x0001: PAL (becomes 1)
- 0x0002: 4MHz (becomes 2)
- 0x0003: half NTSC (becomes 3)
- 0x0100: 3MHz (becomes 4)
- 0x0101: 2MHz (becomes 5)
- 0x0102: eighth NTSC (becomes 6)
- flags AND 0xcc: chipType (int)
- 0x00: Sega PSG (becomes 0)
- 0x04: TI SN76489 (becomes 1)
- 0x08: SN with Atari-like short noise (becomes 2)
- 0x0c: Game Gear (becomes 3)
- 0x40: TI SN76489A (becomes 4)
- 0x44: TI SN76496 (becomes 5)
- 0x48: NCR 8496 (becomes 6)
- 0x4c: Tandy PSSJ 3-voice sound (becomes 7)
- 0x80: TI SN94624 (becomes 8)
- 0x84: TI SN76494 (becomes 9)
- bit 4: noPhaseReset (bool)
## 0x04: Game Boy
- bits 0-1: chipType (int)
- 0: DMG (rev B)
- 1: CGB (rev C)
- 2: CGB (rev E)
- 3: AGB
- bit 3: noAntiClick (bool)
## 0x05: PC Engine
2022-09-29 23:03:39 +00:00
- bit 0: clockSel (int)
2022-09-29 08:19:48 +00:00
- 0: NTSC
- 1: pseudo-PAL
- bit 2: chipType (int)
- 0: HuC6280
- 1: HuC6280A
- bit 3: noAntiClick (bool)
## 0x06: NES, 0x88: VRC6, 0x8a: FDS and 0x8b: MMC5
- flags: clockSel (int)
- 0: NTSC (2A03)
- 1: PAL (2A07)
- 2: Dendy
## 0x07: C64 (8580) and 0x47: C64 (6581)
- bit 0-3: clockSel (int)
- 0: NTSC
- 1: PAL
- 2: SSI 2001
## 0x08: Arcade (YM2151+SegaPCM; COMPOUND)
- bit 0-7: clockSel (int)
- 0: NTSC
- 1: PAL
- 2: 4MHz
- this clock only applies to the YM2151.
## 0x09: Neo Geo CD (YM2610), 0xa5: Neo Geo (YM2610), 0xa6: Neo Geo extended (YM2610), 0x49: Neo Geo CD extended, 0x9e: YM2610B and 0xde: YM2610B extended
- bit 0-7: clockSel (int)
- 0: 8MHz
- 1: 8.06MHz (Neo Geo AES)
## 0x80: AY-3-8910
- bit 0-3: clockSel (int)
- 0: NTSC
- 1: PAL
- 2: ZX Spectrum 48K (1.75MHz)
- 3: 2MHz
- 4: 1.5MHz
- 5: 1MHz
- 6: Sunsoft 5B
- 7: PAL NES
- 8: Sunsoft 5B on PAL NES
- 9: 1.10MHz
- 10: 2^21MHz
- 11: double NTSC
- 12: 3.6MHz
- 13: 1.25MHz
- 14: 1.536MHz
- bit 4-5: chipType (int)
- 0: AY-3-8910
- 1: YM2149(F)
- 2: Sunsoft 5B
- 3: AY-3-8914
- bit 6: stereo (bool)
2022-09-29 23:03:39 +00:00
- bit 7: halfClock (bool)
2022-09-29 08:19:48 +00:00
- bit 8-15: stereoSep (int)
## 0x81: Amiga
- bit 0: clockSel (int)
- 0: NTSC
- 1: PAL
- bit 1: chipType (int)
- 0: Amiga 500
- 1: Amiga 1200
- bit 2: bypassLimits (bool)
- bit 8-14: stereoSep (int)
## 0x82: YM2151 alone
- bit 0-7: clockSel (int)
- 0: NTSC
- 1: PAL
- 2: 4MHz
## 0x83: YM2612 alone, 0xa0: YM2612 extended, 0xbd: YM2612 extra features extended and 0xbe: YM2612 extra features
- bit 31: ladderEffect (bool)
- bit 0-30: clockSel (int)
- 0: NTSC
- 1: PAL
- 2: 8MHz
- 3: Firecore (`COLOR_NTSC*12/7`)
- 4: System 32 (`COLOR_NTSC*9/4`)
## 0x84: TIA
- bit 0: clockSel (int)
- 0: NTSC
- 1: PAL
- bit 1-2: mixingType (int)
- 0: mono
- 1: mono (no distortion)
- 2: stereo
## 0x85: VIC-20
- bit 0: clockSel (int)
- 0: NTSC
- 1: PAL
## 0x87: SNES
- bit 0-6: volScaleL (int)
- bit 8-14: volScaleR (int)
## 0x89: OPLL (YM2413) and 0xa7: OPLL drums (YM2413)
- bit 0-3: clockSel (int)
- 0: NTSC
- 1: PAL
- 2: 4MHz
- 3: half NTSC
- bit 4-31: patchSet (int)
- 0: YM2413
- 1: YMF281
- 2: YM2423
- 3: VRC7
## 0x8c: Namco 163
- bit 0-3: clockSel (int)
- 0: NTSC (2A03)
- 1: PAL (2A07)
- 2: Dendy
- bit 4-6: channels (int)
- bit 7: multiplex (bool)
2022-12-20 21:56:44 +00:00
## 0x8d: YM2203 and 0xb6: YM2203 extended
2022-09-29 08:19:48 +00:00
- bit 0-4: clockSel (int)
- 0: NTSC
- 1: PAL
- 2: 4MHz
- 3: 3MHz
- 4: 3.99MHz
- 5: 1.5MHz
- bit 5-6: prescale (int)
- 0: /6
- 1: /3
- 2: /2
2022-12-20 21:56:44 +00:00
## 0x8e: YM2608 and 0xb7: YM2608 extended
2022-09-29 08:19:48 +00:00
- bit 0-4: clockSel (int)
- 0: 8MHz
- 1: 7.98MHz
- bit 5-6: prescale (int)
- 0: /6
- 1: /3
- 2: /2
## 0x8f: OPL (YM3526), 0xa2: OPL drums (YM3526), 0x90: OPL2 (YM3812), 0xa3: OPL2 drums (YM3812), 0xb2: Yamaha Y8950 and 0xb3: Yamaha Y8950 drums
- bit 0-7: clockSel (int)
- 0: NTSC
- 1: PAL
- 2: 4MHz
- 3: 3MHz
- 4: 3.99MHz
- 5: 3.5MHz
## 0x91: OPL3 (YMF262) and 0xa4: OPL3 drums (YMF262)
- bit 0-7: clockSel (int)
- 0: NTSC
- 1: PAL
- 2: 14MHz
- 3: 16MHz
- 4: 15MHz
## 0x93: Intel 8253 (beeper)
- bit 0-1: speakerType (int)
- 0: unfiltered
- 1: cone
- 2: piezo
- 3: system
## 0x95: RF5C68
- bit 0-3: clockSel (int)
- 0: 8MHz
- 1: 10MHz
- 2: 12.5MHz
- bit 4-31: chipType (int)
- 0: RF5C68
- 1: RF5C164
## 0x97: Philips SAA1099
- flags: clockSel (int)
- 0: 8MHz
- 1: NTSC
- 2: PAL
## 0x98: OPZ (YM2414)
- flags: clockSel (int)
- 0: NTSC
- 1: pseudo-PAL
- 2: 4MHz
## 0x9a: AY8930
- bit 0-3: clockSel (int)
- 0: NTSC
- 1: PAL
- 2: ZX Spectrum 48K (1.75MHz)
- 3: 2MHz
- 4: 1.5MHz
- 5: 1MHz
- 6: Sunsoft 5B
- 7: PAL NES
- 8: Sunsoft 5B on PAL NES
- 9: 1.10MHz
- 10: 2^21MHz
- 11: double NTSC
- 12: 3.6MHz
- bit 6: stereo (bool)
2022-09-29 23:03:39 +00:00
- bit 7: halfClock (bool)
2022-09-29 08:19:48 +00:00
- bit 8-15: stereoSep (int)
## 0x9d: VRC7
- bit 0-3: clockSel (int)
- 0: NTSC
- 1: PAL
- 2: 4MHz
- 3: half NTSC
## 0x9f: ZX Spectrum (beeper)
- bit 0-1: clockSel (int)
- 0: NTSC
- 1: PAL
## 0xa1: Konami SCC and 0xb4: Konami SCC+
- bit 0-6: clockSel (int)
- 0: NTSC
- 1: PAL
- 2: 1.5MHz
- 3: 2MHz
## 0xaa: MSM6295
- bit 0-6: clockSel (int)
- 0: 1MHz
- 1: 1.056MHz
- 2: 4MHz
- 3: 4.224MHz
- 4: NTSC
- 5: half NTSC
- 6: 2/7 NTSC
- 7: quarter NTSC
- 8: 2MHz
- 9: 2.112MHz
- 10: 875KHz
- 11: 937.5KHz
- 12: 1.5MHz
- 13: 3MHz
- 14: 1/3 NTSC
- bit 7: rateSel (bool)
## 0xab: MSM6258
- flags: clockSel (int)
- 0: 4MHz
- 1: 4.096MHz
- 2: 8MHz
- 3: 8.192MHz
## 0xae: OPL4 (YMF278B) and 0xaf: OPL4 drums (YMF278B)
- bit 0-7: clockSel (int)
- 0: NTSC
- 1: PAL
- 2: 33.8688MHz
## 0xb0: Seta/Allumer X1-010
- bit 0-3: clockSel (int)
- 0: 16MHz
- 1: 16.67MHz
- bit 4: stereo (bool)
2022-09-29 13:40:28 +00:00
## 0xb1: Ensoniq ES5506
- bit 0-4: channels (int)
2022-09-29 08:19:48 +00:00
## 0xb5: tildearrow Sound Unit
- bit 0: clockSel (int)
- 0: NTSC
- 1: PAL
- bit 2: echo (bool)
- bit 3: swapEcho (bool)
- bit 4: sampleMemSize (int)
- 0: 8K
- 1: 64K
- bit 5: pdm (bool)
- bit 8-13: echoDelay (int)
- bit 16-19: echoFeedback (int)
- bit 20-23: echoResolution (int)
- bit 24-31: echoVol (int)
## 0xb8: YMZ280B
- bit 0-7: clockSel (int)
- 0: 16.9344MHz
- 1: NTSC
- 2: PAL
- 3: 16MHz
- 4: 16.67MHz
- 5: 14MHz
## 0xc0: PCM DAC
- bit 0-15: rate (int)
- add +1 to this value
- bit 16-19: outDepth (int)
- bit 20: stereo (bool)
## 0xe0: QSound
- bit 0-11: echoDelay (int)
2022-09-29 23:03:39 +00:00
- bit 12-19: echoFeedback (int)