prepare a new info header
This commit is contained in:
parent
47d572914c
commit
03b7762f05
2 changed files with 471 additions and 390 deletions
848
papers/format.md
848
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.
|
||||
```
|
||||
13
papers/wavetable.md
Normal file
13
papers/wavetable.md
Normal file
|
|
@ -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.
|
||||
Loading…
Add table
Add a link
Reference in a new issue