diff --git a/papers/format.md b/papers/format.md index c92c7da3f..8b78b9eb2 100644 --- a/papers/format.md +++ b/papers/format.md @@ -120,7 +120,456 @@ size | description 8 | reserved ``` -# song info +# song info (>=239) (DRAFT) + +``` +size | description +-----|------------------------------------ + 4 | "INF2" block ID + 4 | size of this block + --- | **song information** + STR | song name + STR | song author + 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) + 4f | A-4 tuning + --- | **system definition** + 2 | total number of channels + 2 | number of chips + --- | **chip definition (×numChips)** + 2 | chip ID + 2 | chip channel count + 4f | chip volume + 4f | chip panning + 4f | chip front/rear balance + --- | **groove list** + 1 | number of entries + ??? | groove entries. the format is: + | - 1 byte: length of groove + | - 16 bytes: groove pattern + --- | **patchbay** + 4 | patchbay connection count + 4?? | patchbay + | - see next section for more details. + 1 | automatic patchbay + --- | **song elements** + 1 | element type + 4?? | pointers to elements + | - a zero pointer means "end of list". + | - if the element is unique, only a single pointer will be present. +``` + +## list of sound chips + +this is a list of sound chips, and their nominal channel count. +the channel count is stored in the file in order to allow Furnace to load files with unsupported chips from derivatives of Furnace or newer versions. + +- 0x00: invalid (end of chips in previous versions) +- 0x01: YMU759 - 17 channels +- 0x02: Genesis - 10 channels (compound!) + - flatten to 0x83 + 0x03 +- 0x03: SMS (SN76489) - 4 channels +- 0x04: Game Boy - 4 channels +- 0x05: PC Engine - 6 channels +- 0x06: NES - 5 channels +- 0x07: C64 (8580) - 3 channels +- 0x08: Arcade (YM2151+SegaPCM) - 13 channels (compound!) + - flatten to 0x82 + 0xa9 +- 0x09: Neo Geo CD (YM2610) - 13 channels +- 0x42: Genesis extended - 13 channels (compound!) + - flatten to 0xa0 + 0x03 +- 0x43: SMS (SN76489) + OPLL (YM2413) - 13 channels (compound!) + - flatten to 0x03 + 0x89 +- 0x46: NES + VRC7 - 11 channels (compound!) + - flatten to 0x06 + 0x9d +- 0x47: C64 (6581) - 3 channels +- 0x49: Neo Geo CD extended - 16 channels +- 0x80: AY-3-8910 - 3 channels +- 0x81: Amiga - 4 channels +- 0x82: YM2151 - 8 channels +- 0x83: YM2612 - 6 channels +- 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 +- 0x8d: YM2203 - 6 channels +- 0x8e: YM2608 - 16 channels +- 0x8f: OPL (YM3526) - 9 channels +- 0x90: OPL2 (YM3812) - 9 channels +- 0x91: OPL3 (YMF262) - 18 channels +- 0x92: MultiPCM - 28 channels +- 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 +- 0x9f: ZX Spectrum (beeper, SFX-like tildearrow engine) - 6 channels +- 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 +- 0xa9: SegaPCM (for DefleMask compatibility) - 5 channels +- 0xaa: MSM6295 - 4 channels +- 0xab: MSM6258 - 1 channel +- 0xac: Commander X16 (VERA) - 17 channels +- 0xad: Bubble System WSG - 2 channels +- 0xae: OPL4 (YMF278B) - 42 channels +- 0xaf: OPL4 drums (YMF278B) - 44 channels +- 0xb0: Seta/Allumer X1-010 - 16 channels +- 0xb1: Ensoniq ES5506 - 32 channels +- 0xb2: Yamaha Y8950 - 10 channels +- 0xb3: Yamaha Y8950 drums - 12 channels +- 0xb4: Konami SCC+ - 5 channels +- 0xb5: tildearrow Sound Unit - 8 channels +- 0xb6: YM2203 extended - 9 channels +- 0xb7: YM2608 extended - 19 channels +- 0xb8: YMZ280B - 8 channels +- 0xb9: Namco WSG - 3 channels +- 0xba: Namco C15 - 8 channels +- 0xbb: Namco C30 - 8 channels +- 0xbc: MSM5232 - 8 channels +- 0xbd: YM2612 DualPCM extended - 11 channels +- 0xbe: YM2612 DualPCM - 7 channels +- 0xbf: T6W28 - 4 channels +- 0xc0: PCM DAC - 1 channel +- 0xc1: YM2612 CSM - 10 channels +- 0xc2: Neo Geo CSM (YM2610) - 18 channels +- 0xc3: YM2203 CSM - 10 channels +- 0xc4: YM2608 CSM - 20 channels +- 0xc5: YM2610B CSM - 20 channels +- 0xc6: K007232 - 2 channels +- 0xc7: GA20 - 4 channels +- 0xc8: SM8521 - 3 channels +- 0xc9: M114S - 16 channels (UNAVAILABLE) +- 0xca: ZX Spectrum (beeper, QuadTone engine) - 5 channels +- 0xcb: Casio PV-1000 - 3 channels +- 0xcc: K053260 - 4 channels +- 0xcd: TED - 2 channels +- 0xce: Namco C140 - 24 channels +- 0xcf: Namco C219 - 16 channels +- 0xd0: Namco C352 - 32 channels (UNAVAILABLE) +- 0xd1: ESFM - 18 channels +- 0xd2: Ensoniq ES5503 (hard pan) - 32 channels (UNAVAILABLE) +- 0xd4: PowerNoise - 4 channels +- 0xd5: Dave - 6 channels +- 0xd6: NDS - 16 channels +- 0xd7: Game Boy Advance (direct) - 2 channels +- 0xd8: Game Boy Advance (MinMod) - 16 channels +- 0xd9: Bifurcator - 4 channels +- 0xda: SCSP - 32 channels (UNAVAILABLE) +- 0xdb: YMF271 (OPX) - 48 channels (UNAVAILABLE) +- 0xdc: RF5C400 - 32 channels (UNAVAILABLE) +- 0xdd: YM2612 XGM - 9 channels (UNAVAILABLE) +- 0xde: YM2610B extended - 19 channels +- 0xdf: YM2612 XGM extended - 13 channels (UNAVAILABLE) +- 0xe0: QSound - 19 channels +- 0xe1: PS1 - 24 channels (UNAVAILABLE) +- 0xe2: C64 (6581) with PCM - 4 channels +- 0xe3: Watara Supervision - 4 channels +- 0xe5: µPD1771C-017 - 4 channels +- 0xf0: SID2 - 3 channels +- 0xf1: 5E01 - 5 channels +- 0xf5: SID3 - 7 channels +- 0xfc: Pong - 1 channel +- 0xfd: Dummy System - 8 channels +- 0xfe: reserved for development +- 0xff: reserved for development + +notes: + +- (compound!) means that the system is composed of two or more chips, and has to be flattened. +- (UNAVAILABLE) means that the chip hasn't been implemented in Furnace yet. + +## song elements + +the following element types are available: + +``` + ## | ID | description +----|------|----------------------------- + 00 | ---- | end of element list (end of info header) + 01 | SONG | sub-song + 02 | FLAG | chip flags + 03 | ADIR | asset directory** + 04 | INS2 | instrument + 05 | WAVE | wavetable + 06 | SMP2 | sample + 07 | PATN | pattern + 08 | CFLG | compatibility flags* + 09 | CMNT | song comments* + +* element is unique (read only one pointer and assume the pointer list is over) + +** first pointer is for instruments, second for wavetables and third for samples +``` + +# patchbay + +Furnace dev135 adds a "patchbay" which allows for arbitrary connection of chip outputs to system outputs. +it also allows connecting outputs to effects and so on. + +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` + +- `xxx` (bit 4 to 15) represents a portset. +- `y` (bit 0 to 3) is the port in that portset. + +reserved input portsets: +- `000`: system outputs +- `FFF`: "null" portset + +reserved output portsets: +- `000` through `chipCount`: chip outputs +- `FFC`: reference file/music player (>=238) +- `FFD`: wave/sample preview +- `FFE`: metronome +- `FFF`: "null" portset + +# subsong + +``` +size | description +-----|------------------------------------ + 4 | "SONG" block ID + 4 | size of this block + 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 + 2 | virtual tempo numerator + 2 | virtual tempo denominator + 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 + --- | **speed pattern** (>=139) + 1 | length of speed pattern (fail if this is lower than 1 or higher than 16) + 16 | speed pattern (this overrides speed 1 and speed 2 settings) +``` + +# 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 +``` + +# 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 +``` + +# 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. + +# wavetable + +``` +size | description +-----|------------------------------------ + 4 | "WAVE" block ID + 4 | size of this block + STR | wavetable name + 4 | wavetable width + 4 | reserved + 4 | wavetable height + 4?? | wavetable data +``` + +# sample (>=102) + +``` +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 + | - 7: K05 ADPCM + | - 8: 8-bit PCM + | - 9: BRR (SNES) + | - 10: VOX + | - 11: 8-bit μ-law PCM + | - 12: C219 PCM + | - 13: IMA ADPCM + | - 14: 12-bit PCM (MultiPCM) + | - 16: 16-bit PCM + 1 | loop direction (>=123) or reserved + | - 0: forward + | - 1: backward + | - 2: ping-pong + 1 | flags (>=129) or reserved + | - 0: BRR emphasis + 1 | flags 2 (>=159) or reserved + | - 0: dither + | - 1: no BRR filters (>=213) + 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 +``` + +# 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 + | - read a byte per row. + | - if it is 0xff, end of data. the rest of the pattern is empty. + | - if bit 7 is set, then skip N+2 rows. N is bits 0-6. + | - for example, $80 means skip 2 rows, $81 means skip 3, $82 means 4 and so on. + | - 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 none of these bits are set, then skip 1 row. + | - 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 +``` + +--- + +# old format blocks + +these were present in previous versions of the Furnace file format. + +## old song info (<239) + +hic sunt dracones! + +this info block is messy because it was devised during Furnace's early days, back when it didn't support sub-songs. +the first sub-song is defined here. compatibility flags are all over the place. ``` size | description @@ -147,134 +596,9 @@ size | description 2 | sample count | - the limit is 256. 4 | pattern count (global) - 32 | list of sound chips - | - possible soundchips: - | - 0x00: end of list - | - 0x01: YMU759 - 17 channels - | - 0x02: Genesis - 10 channels (compound!) - | - 0x03: SMS (SN76489) - 4 channels - | - 0x04: Game Boy - 4 channels - | - 0x05: PC Engine - 6 channels - | - 0x06: NES - 5 channels - | - 0x07: C64 (8580) - 3 channels - | - 0x08: Arcade (YM2151+SegaPCM) - 13 channels (compound!) - | - 0x09: Neo Geo CD (YM2610) - 13 channels - | - 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 - | - 0x82: YM2151 - 8 channels - | - 0x83: YM2612 - 6 channels - | - 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 - | - 0x8d: YM2203 - 6 channels - | - 0x8e: YM2608 - 16 channels - | - 0x8f: OPL (YM3526) - 9 channels - | - 0x90: OPL2 (YM3812) - 9 channels - | - 0x91: OPL3 (YMF262) - 18 channels - | - 0x92: MultiPCM - 28 channels - | - 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 - | - 0x9f: ZX Spectrum (beeper, SFX-like tildearrow engine) - 6 channels - | - 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 - | - 0xa9: SegaPCM (for DefleMask compatibility) - 5 channels - | - 0xaa: MSM6295 - 4 channels - | - 0xab: MSM6258 - 1 channel - | - 0xac: Commander X16 (VERA) - 17 channels - | - 0xad: Bubble System WSG - 2 channels - | - 0xae: OPL4 (YMF278B) - 42 channels - | - 0xaf: OPL4 drums (YMF278B) - 44 channels - | - 0xb0: Seta/Allumer X1-010 - 16 channels - | - 0xb1: Ensoniq ES5506 - 32 channels - | - 0xb2: Yamaha Y8950 - 10 channels - | - 0xb3: Yamaha Y8950 drums - 12 channels - | - 0xb4: Konami SCC+ - 5 channels - | - 0xb5: tildearrow Sound Unit - 8 channels - | - 0xb6: YM2203 extended - 9 channels - | - 0xb7: YM2608 extended - 19 channels - | - 0xb8: YMZ280B - 8 channels - | - 0xb9: Namco WSG - 3 channels - | - 0xba: Namco C15 - 8 channels - | - 0xbb: Namco C30 - 8 channels - | - 0xbc: MSM5232 - 8 channels - | - 0xbd: YM2612 DualPCM extended - 11 channels - | - 0xbe: YM2612 DualPCM - 7 channels - | - 0xbf: T6W28 - 4 channels - | - 0xc0: PCM DAC - 1 channel - | - 0xc1: YM2612 CSM - 10 channels - | - 0xc2: Neo Geo CSM (YM2610) - 18 channels - | - 0xc3: YM2203 CSM - 10 channels - | - 0xc4: YM2608 CSM - 20 channels - | - 0xc5: YM2610B CSM - 20 channels - | - 0xc6: K007232 - 2 channels - | - 0xc7: GA20 - 4 channels - | - 0xc8: SM8521 - 3 channels - | - 0xc9: M114S - 16 channels (UNAVAILABLE) - | - 0xca: ZX Spectrum (beeper, QuadTone engine) - 5 channels - | - 0xcb: Casio PV-1000 - 3 channels - | - 0xcc: K053260 - 4 channels - | - 0xcd: TED - 2 channels - | - 0xce: Namco C140 - 24 channels - | - 0xcf: Namco C219 - 16 channels - | - 0xd0: Namco C352 - 32 channels (UNAVAILABLE) - | - 0xd1: ESFM - 18 channels - | - 0xd2: Ensoniq ES5503 (hard pan) - 32 channels (UNAVAILABLE) - | - 0xd4: PowerNoise - 4 channels - | - 0xd5: Dave - 6 channels - | - 0xd6: NDS - 16 channels - | - 0xd7: Game Boy Advance (direct) - 2 channels - | - 0xd8: Game Boy Advance (MinMod) - 16 channels - | - 0xd9: Bifurcator - 4 channels - | - 0xda: SCSP - 32 channels (UNAVAILABLE) - | - 0xdb: YMF271 (OPX) - 48 channels (UNAVAILABLE) - | - 0xdc: RF5C400 - 32 channels (UNAVAILABLE) - | - 0xdd: YM2612 XGM - 9 channels (UNAVAILABLE) - | - 0xde: YM2610B extended - 19 channels - | - 0xdf: YM2612 XGM extended - 13 channels (UNAVAILABLE) - | - 0xe0: QSound - 19 channels - | - 0xe1: PS1 - 24 channels (UNAVAILABLE) - | - 0xe2: C64 (6581) with PCM - 4 channels - | - 0xe3: Watara Supervision - 4 channels - | - 0xe5: µPD1771C-017 - 4 channels - | - 0xf0: SID2 - 3 channels - | - 0xf1: 5E01 - 5 channels - | - 0xf5: SID3 - 7 channels - | - 0xfc: Pong - 1 channel - | - 0xfd: Dummy System - 8 channels - | - 0xfe: reserved for development - | - 0xff: reserved for development - | - (compound!) means that the system is composed of two or more chips, - | and has to be flattened. - | - (UNAVAILABLE) means that the chip hasn't been implemented in Furnace - | yet. + 32 | list of sound chip IDs + | - 0x00 means "end of chip list". you must read 32 bytes regardless. + | - see list at the top of this file for the list of sound chips. 32 | sound chip volumes (<135) or reserved | - signed char, 64=1.0, 127=~2.0 | - as of version 135 these fields only exist for compatibility reasons. @@ -411,133 +735,11 @@ size | description 4 | sample directories ``` -# patchbay - -Furnace dev135 adds a "patchbay" which allows for arbitrary connection of chip outputs to system outputs. -it also allows connecting outputs to effects and so on. - -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` - -- `xxx` (bit 4 to 15) represents a portset. -- `y` (bit 0 to 3) is the port in that portset. - -reserved input portsets: -- `000`: system outputs -- `FFF`: "null" portset - -reserved output portsets: -- `000` through `01F`: chip outputs -- `FFC`: reference file/music player (>=238) -- `FFD`: wave/sample preview -- `FFE`: metronome -- `FFF`: "null" portset - -# 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 - 4 | size of this block - 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 - 2 | virtual tempo numerator - 2 | virtual tempo denominator - 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 - --- | **speed pattern** (>=139) - 1 | length of speed pattern (fail if this is lower than 1 or higher than 16) - 16 | speed pattern (this overrides speed 1 and speed 2 settings) -``` - -# 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 -``` - -# 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 -``` - -# 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) +## old instrument (<127) instruments in older versions of Furnace used a different format. see [oldIns.md](oldIns.md) for more information. -## C64 compatibility note (>=187) +### C64 compatibility note (>=187) in Furnace dev187 the volume and cutoff macros have been separated, as noted above. however, there are two other changes as well: **inverted relative (non-absolute) cutoff macro**; and a new, improved Special macro. @@ -555,74 +757,7 @@ if version is less than 187, you must convert the Special macro: don't worry about loop or release... -# wavetable - -``` -size | description ------|------------------------------------ - 4 | "WAVE" block ID - 4 | size of this block - STR | wavetable name - 4 | wavetable width - 4 | reserved - 4 | wavetable height - 4?? | wavetable data -``` - -# 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 - | - 7: K05 ADPCM - | - 8: 8-bit PCM - | - 9: BRR (SNES) - | - 10: VOX - | - 11: 8-bit μ-law PCM - | - 12: C219 PCM - | - 13: IMA ADPCM - | - 14: 12-bit PCM (MultiPCM) - | - 16: 16-bit PCM - 1 | loop direction (>=123) or reserved - | - 0: forward - | - 1: backward - | - 2: ping-pong - 1 | flags (>=129) or reserved - | - 0: BRR emphasis - 1 | flags 2 (>=159) or reserved - | - 0: dither - | - 1: no BRR filters (>=213) - 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. +## old sample (<102) ``` size | description @@ -654,60 +789,7 @@ size | description | - version>=58 size is length ``` -# 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 - | - read a byte per row. - | - if it is 0xff, end of data. the rest of the pattern is empty. - | - if bit 7 is set, then skip N+2 rows. N is bits 0-6. - | - for example, $80 means skip 2 rows, $81 means skip 3, $82 means 4 and so on. - | - 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 none of these bits are set, then skip 1 row. - | - 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 -``` - - -# old pattern (<157) +## old pattern (<157) ``` size | description @@ -749,18 +831,4 @@ size | description | - for note/octave, if both values are 0 then it means empty. | - for instrument, volume, effect and effect data, a value of -1 means empty. STR | pattern name (>=51) -``` - -# the Furnace wavetable format (.fuw) - -similar to the instrument format... - -``` -size | description ------|------------------------------------ - 16 | "-Furnace waveta-" format magic - 2 | format version - 2 | reserved -``` - -wavetable data follows. +``` \ No newline at end of file diff --git a/papers/wavetable.md b/papers/wavetable.md new file mode 100644 index 000000000..b54818d99 --- /dev/null +++ b/papers/wavetable.md @@ -0,0 +1,13 @@ +# the Furnace wavetable format (.fuw) + +similar to the instrument format... + +``` +size | description +-----|------------------------------------ + 16 | "-Furnace waveta-" format magic + 2 | format version + 2 | reserved +``` + +wavetable data follows.