649 lines
13 KiB
Python
649 lines
13 KiB
Python
from chipchune._util import EnumShowNameOnly, EnumValueEquals
|
|
from typing import Tuple
|
|
|
|
class LinearPitch(EnumShowNameOnly, EnumValueEquals):
|
|
"""
|
|
Options for :attr:`chipchune.furnace.data_types.ModuleCompatFlags.linear_pitch`.
|
|
"""
|
|
NON_LINEAR = 0
|
|
ONLY_PITCH_CHANGE = 1
|
|
FULL_LINEAR = 2
|
|
|
|
|
|
class LoopModality(EnumShowNameOnly, EnumValueEquals):
|
|
"""
|
|
Options for :attr:`chipchune.furnace.data_types.ModuleCompatFlags.loop_modality`.
|
|
"""
|
|
HARD_RESET_CHANNELS = 0
|
|
SOFT_RESET_CHANNELS = 1
|
|
DO_NOTHING = 2
|
|
|
|
|
|
class DelayBehavior(EnumShowNameOnly, EnumValueEquals):
|
|
"""
|
|
Options for :attr:`chipchune.furnace.data_types.ModuleCompatFlags.cut_delay_effect_policy`.
|
|
"""
|
|
STRICT = 0
|
|
BROKEN = 1
|
|
LAX = 2
|
|
|
|
|
|
class JumpTreatment(EnumShowNameOnly, EnumValueEquals):
|
|
"""
|
|
Options for :attr:`chipchune.furnace.data_types.ModuleCompatFlags.jump_treatment`.
|
|
"""
|
|
ALL_JUMPS = 0
|
|
FIRST_JUMP_ONLY = 1
|
|
ROW_JUMP_PRIORITY = 2
|
|
|
|
|
|
class Note(EnumShowNameOnly):
|
|
"""
|
|
All notes recognized by Furnace
|
|
"""
|
|
__ = 0
|
|
Cs = 1
|
|
D_ = 2
|
|
Ds = 3
|
|
E_ = 4
|
|
F_ = 5
|
|
Fs = 6
|
|
G_ = 7
|
|
Gs = 8
|
|
A_ = 9
|
|
As = 10
|
|
B_ = 11
|
|
C_ = 12
|
|
OFF = 100
|
|
OFF_REL = 101
|
|
REL = 102
|
|
|
|
|
|
class MacroItem(EnumShowNameOnly):
|
|
"""
|
|
Special values used only in this parser, to allow data editing similar to that
|
|
of Furnace itself.
|
|
"""
|
|
LOOP = 0
|
|
RELEASE = 1
|
|
|
|
|
|
class MacroCode(EnumShowNameOnly, EnumValueEquals):
|
|
"""
|
|
Marks what aspect of an instrument does a macro change.
|
|
"""
|
|
|
|
VOL = 0
|
|
"""
|
|
Also:
|
|
- C64 cutoff
|
|
"""
|
|
|
|
ARP = 1
|
|
"""
|
|
Not applicable to MSM6258 and MSM6295.
|
|
"""
|
|
|
|
DUTY = 2
|
|
"""
|
|
Also:
|
|
- AY noise freq
|
|
- POKEY audctl
|
|
- Mikey duty/int
|
|
- MSM5232 group ctrl
|
|
- Beeper/Pokemon Mini pulse width
|
|
- T6W28 noise type
|
|
- Virtual Boy noise length
|
|
- PC Engine/Namco/WonderSwan noise type
|
|
- SNES noise freq
|
|
- Namco 163 waveform pos.
|
|
- ES5506 filter mode
|
|
- MSM6258/MSM6295 freq. divider
|
|
- ADPCMA global volume
|
|
- QSound echo level
|
|
"""
|
|
|
|
WAVE = 3
|
|
"""
|
|
Also:
|
|
- OPLL patch
|
|
- OPZ/OPM lfo1 shape
|
|
"""
|
|
|
|
PITCH = 4
|
|
|
|
EX1 = 5
|
|
"""
|
|
- OPZ/OPM am depth
|
|
- C64 filter mode
|
|
- SAA1099 envelope
|
|
- X1-010 env. mode
|
|
- Namco 163 wave length
|
|
- FDS mod depth
|
|
- TSU cutoff
|
|
- ES5506 filter k1
|
|
- MSM6258 clk divider
|
|
- QSound echo feedback
|
|
- SNES special
|
|
- MSM5232 group attack
|
|
- AY8930 duty?
|
|
"""
|
|
|
|
EX2 = 6
|
|
"""
|
|
- C64 resonance
|
|
- Namco 163 wave update
|
|
- FDS mod speed
|
|
- TSU resonance
|
|
- ES5506 filter k2
|
|
- QSound echo length
|
|
- SNES gain
|
|
- MSM5232 group decay
|
|
- AY3/AY8930 envelope
|
|
"""
|
|
|
|
EX3 = 7
|
|
"""
|
|
- C64 special
|
|
- AY/AY8930 autoenv num
|
|
- X1-010 autoenv num
|
|
- Namco 163 waveload wave
|
|
- FDS mod position
|
|
- TSU control
|
|
- MSM5232 noise
|
|
"""
|
|
|
|
ALG = 8
|
|
"""
|
|
Also:
|
|
- AY/AY8930 autoenv den
|
|
- X1-010 autoenv den
|
|
- Namco 163 waveload pos
|
|
- ES5506 control
|
|
"""
|
|
|
|
FB = 9
|
|
"""
|
|
Also:
|
|
- AY8930 noise & mask
|
|
- Namco 163 waveload len
|
|
- ES5506 outputs
|
|
"""
|
|
|
|
FMS = 10
|
|
"""
|
|
Also:
|
|
- AY8930 noise | mask
|
|
- Namco 163 waveload trigger
|
|
"""
|
|
|
|
AMS = 11
|
|
|
|
PAN_L = 12
|
|
|
|
PAN_R = 13
|
|
|
|
PHASE_RESET = 14
|
|
|
|
EX4 = 15
|
|
"""
|
|
- C64 test/gate
|
|
- TSU phase reset timer
|
|
- FM/OPM opmask
|
|
"""
|
|
|
|
EX5 = 16
|
|
"""
|
|
- OPZ am depth 2
|
|
"""
|
|
|
|
EX6 = 17
|
|
"""
|
|
- OPZ pm depth 2
|
|
"""
|
|
|
|
EX7 = 18
|
|
"""
|
|
- OPZ lfo2 speed
|
|
"""
|
|
|
|
EX8 = 19
|
|
"""
|
|
- OPZ lfo2 shape
|
|
"""
|
|
|
|
STOP = 255
|
|
"""
|
|
Marks end of macro reading.
|
|
"""
|
|
|
|
|
|
class OpMacroCode(EnumShowNameOnly, EnumValueEquals):
|
|
"""
|
|
Controls which FM parameter a macro should change.
|
|
"""
|
|
AM = 0
|
|
AR = 1
|
|
DR = 2
|
|
MULT = 3
|
|
RR = 4
|
|
SL = 5
|
|
TL = 6
|
|
DT2 = 7
|
|
RS = 8
|
|
DT = 9
|
|
D2R = 10
|
|
SSG_EG = 11
|
|
DAM = 12
|
|
DVB = 13
|
|
EGT = 14
|
|
KSL = 15
|
|
SUS = 16
|
|
VIB = 17
|
|
WS = 18
|
|
KSR = 19
|
|
|
|
|
|
class MacroType(EnumShowNameOnly):
|
|
"""
|
|
Instrument macro type (version 120+).
|
|
"""
|
|
SEQUENCE = 0
|
|
ADSR = 1
|
|
LFO = 2
|
|
|
|
|
|
class MacroSize(EnumShowNameOnly):
|
|
"""
|
|
Type of value stored in the instrument file.
|
|
"""
|
|
_value_: int
|
|
num_bytes: int
|
|
signed: bool
|
|
|
|
UINT8: Tuple[int, int, bool] = (0, 1, False)
|
|
INT8: Tuple[int, int, bool] = (1, 1, True)
|
|
INT16: Tuple[int, int, bool] = (2, 2, True)
|
|
INT32: Tuple[int, int, bool] = (3, 4, True)
|
|
|
|
def __new__(cls, id: int, num_bytes: int, signed: bool): # type: ignore[no-untyped-def]
|
|
member = object.__new__(cls)
|
|
member._value_ = id
|
|
setattr(member, 'num_bytes', num_bytes)
|
|
setattr(member, 'signed', signed)
|
|
return member
|
|
|
|
|
|
class GBHwCommand(EnumShowNameOnly):
|
|
"""
|
|
Game Boy hardware envelope commands.
|
|
"""
|
|
ENVELOPE = 0
|
|
SWEEP = 1
|
|
WAIT = 2
|
|
WAIT_REL = 3
|
|
LOOP = 4
|
|
LOOP_REL = 5
|
|
|
|
|
|
class SampleType(EnumShowNameOnly):
|
|
"""
|
|
Sample types used in Furnace
|
|
"""
|
|
ZX_DRUM = 0
|
|
NES_DPCM = 1
|
|
QSOUND_ADPCM = 4
|
|
ADPCM_A = 5
|
|
ADPCM_B = 6
|
|
X68K_ADPCM = 7
|
|
PCM_8 = 8
|
|
SNES_BRR = 9
|
|
VOX = 10
|
|
PCM_16 = 16
|
|
|
|
|
|
class InstrumentType(EnumShowNameOnly):
|
|
"""
|
|
Instrument types currently available as of version 144.
|
|
"""
|
|
STANDARD = 0
|
|
FM_4OP = 1
|
|
GB = 2
|
|
C64 = 3
|
|
AMIGA = 4
|
|
PCE = 5
|
|
SSG = 6
|
|
AY8930 = 7
|
|
TIA = 8
|
|
SAA1099 = 9
|
|
VIC = 10
|
|
PET = 11
|
|
VRC6 = 12
|
|
FM_OPLL = 13
|
|
FM_OPL = 14
|
|
FDS = 15
|
|
VB = 16
|
|
N163 = 17
|
|
KONAMI_SCC = 18
|
|
FM_OPZ = 19
|
|
POKEY = 20
|
|
PC_BEEPER = 21
|
|
WONDERSWAN = 22
|
|
LYNX = 23
|
|
VERA = 24
|
|
X1010 = 25
|
|
VRC6_SAW = 26
|
|
ES5506 = 27
|
|
MULTIPCM = 28
|
|
SNES = 29
|
|
TSU = 30
|
|
NAMCO_WSG = 31
|
|
OPL_DRUMS = 32
|
|
FM_OPM = 33
|
|
NES = 34
|
|
MSM6258 = 35
|
|
MSM6295 = 36
|
|
ADPCM_A = 37
|
|
ADPCM_B = 38
|
|
SEGAPCM = 39
|
|
QSOUND = 40
|
|
YMZ280B = 41
|
|
RF5C68 = 42
|
|
MSM5232 = 43
|
|
T6W28 = 44
|
|
K007232 = 45
|
|
GA20 = 46
|
|
POKEMON_MINI = 47
|
|
SM8521 = 48
|
|
PV1000 = 49
|
|
|
|
|
|
class ChipType(EnumShowNameOnly):
|
|
"""
|
|
Furnace chip database, either planned or implemented.
|
|
Contains console name, chip ID and number of channels.
|
|
"""
|
|
_value_: int
|
|
channels: int
|
|
|
|
YMU759 = (0x01, 17)
|
|
GENESIS = (0x02, 10) # YM2612 + SN76489
|
|
SMS = (0x03, 4) # SN76489
|
|
GB = (0x04, 4) # LR53902
|
|
PCE = (0x05, 6) # HuC6280
|
|
NES = (0x06, 5) # RP2A03
|
|
C64_8580 = (0x07, 3) # SID r8580
|
|
SEGA_ARCADE = (0x08, 13) # YM2151 + SegaPCM
|
|
NEO_GEO_CD = (0x09, 13)
|
|
|
|
GENESIS_EX = (0x42, 13) # YM2612 + SN76489
|
|
SMS_JP = (0x43, 13) # SN76489 + YM2413
|
|
NES_VRC7 = (0x46, 11) # RP2A03 + YM2413
|
|
C64_6581 = (0x47, 3) # SID r6581
|
|
NEO_GEO_CD_EX = (0x49, 16)
|
|
|
|
AY38910 = (0x80, 3)
|
|
AMIGA = (0x81, 4) # Paula
|
|
YM2151 = (0x82, 8) # YM2151
|
|
YM2612 = (0x83, 6) # YM2612
|
|
TIA = (0x84, 2)
|
|
VIC20 = (0x85, 4)
|
|
PET = (0x86, 1)
|
|
SNES = (0x87, 8) # SPC700
|
|
VRC6 = (0x88, 3)
|
|
OPLL = (0x89, 9) # YM2413
|
|
FDS = (0x8a, 1)
|
|
MMC5 = (0x8b, 3)
|
|
N163 = (0x8c, 8)
|
|
OPN = (0x8d, 6) # YM2203
|
|
PC98 = (0x8e, 16) # YM2608
|
|
OPL = (0x8f, 9) # YM3526
|
|
|
|
OPL2 = (0x90, 9) # YM3812
|
|
OPL3 = (0x91, 18) # YMF262
|
|
MULTIPCM = (0x92, 24)
|
|
PC_SPEAKER = (0x93, 1) # Intel 8253
|
|
POKEY = (0x94, 4)
|
|
RF5C68 = (0x95, 8)
|
|
WONDERSWAN = (0x96, 4)
|
|
SAA1099 = (0x97, 6)
|
|
OPZ = (0x98, 8)
|
|
POKEMON_MINI = (0x99, 1)
|
|
AY8930 = (0x9a, 3)
|
|
SEGAPCM = (0x9b, 16)
|
|
VIRTUAL_BOY = (0x9c, 6)
|
|
VRC7 = (0x9d, 6)
|
|
YM2610B = (0x9e, 16)
|
|
ZX_BEEPER = (0x9f, 6) # tildearrow's engine
|
|
|
|
YM2612_EX = (0xa0, 9)
|
|
SCC = (0xa1, 5)
|
|
OPL_DRUMS = (0xa2, 11)
|
|
OPL2_DRUMS = (0xa3, 11)
|
|
OPL3_DRUMS = (0xa4, 20)
|
|
NEO_GEO = (0xa5, 14)
|
|
NEO_GEO_EX = (0xa6, 17)
|
|
OPLL_DRUMS = (0xa7, 11)
|
|
LYNX = (0xa8, 4)
|
|
SEGAPCM_DMF = (0xa9, 5)
|
|
MSM6295 = (0xaa, 4)
|
|
MSM6258 = (0xab, 1)
|
|
COMMANDER_X16 = (0xac, 17) # VERA
|
|
BUBBLE_SYSTEM_WSG = (0xad, 2)
|
|
OPL4 = (0xae, 42)
|
|
OPL4_DRUMS = (0xaf, 44)
|
|
|
|
SETA = (0xb0, 16) # Allumer X1-010
|
|
ES5506 = (0xb1, 32)
|
|
Y8950 = (0xb2, 10)
|
|
Y8950_DRUMS = (0xb3, 12)
|
|
SCC_PLUS = (0xb4, 5)
|
|
TSU = (0xb5, 8)
|
|
YM2203_EX = (0xb6, 9)
|
|
YM2608_EX = (0xb7, 19)
|
|
YMZ280B = (0xb8, 8)
|
|
NAMCO = (0xb9, 3) # Namco WSG
|
|
N15XX = (0xba, 8) # Namco 15xx
|
|
CUS30 = (0xbb, 8) # Namco CUS30
|
|
MSM5232 = (0xbc, 8)
|
|
YM2612_PLUS_EX = (0xbd, 11)
|
|
YM2612_PLUS = (0xbe, 7)
|
|
T6W28 = (0xbf, 4)
|
|
|
|
PCM_DAC = (0xc0, 1)
|
|
YM2612_CSM = (0xc1, 10)
|
|
NEO_GEO_CSM = (0xc2, 18) # YM2610 CSM
|
|
YM2203_CSM = (0xc3, 10)
|
|
YM2608_CSM = (0xc4, 20)
|
|
YM2610B_CSM = (0xc5, 20)
|
|
K007232 = (0xc6, 2)
|
|
GA20 = (0xc7, 4)
|
|
SM8521 = (0xc8, 3)
|
|
M114S = (0xc9, 16)
|
|
ZX_BEEPER_QUADTONE: Tuple[int, int] = (0xca, 5) # Natt Akuma's engine
|
|
PV_1000: Tuple[int, int] = (0xcb, 3) # NEC D65010G031
|
|
K053260 = (0xcc, 4)
|
|
TED = (0xcd, 2)
|
|
NAMCO_C140 = (0xce, 24)
|
|
NAMCO_C219 = (0xcf, 16)
|
|
|
|
NAMCO_C352 = (0xd0, 32)
|
|
ESFM = (0xd1, 18)
|
|
ES5503 = (0xd2, 32)
|
|
POWERNOISE = (0xd4, 4)
|
|
DAVE = (0xd5, 6)
|
|
NDS = (0xd6, 16)
|
|
GBA = (0xd7, 2)
|
|
GBA_MINMOD = (0xd8, 16)
|
|
BIFURCATOR = (0xd9, 4)
|
|
YM2610B_EX = (0xde, 19)
|
|
|
|
QSOUND = (0xe0, 19)
|
|
|
|
SID2 = (0xf0, 3) # SID2
|
|
FIVEE01 = (0xf1, 5) # 5E01
|
|
PONG = (0xfc, 1)
|
|
DUMMY = (0xfd, 1)
|
|
|
|
RESERVED_1 = (0xfe, 1)
|
|
RESERVED_2 = (0xff, 1)
|
|
|
|
def __new__(cls, id: int, channels: int): # type: ignore[no-untyped-def]
|
|
member = object.__new__(cls)
|
|
member._value_ = id
|
|
setattr(member, 'channels', channels)
|
|
return member
|
|
|
|
def __repr__(self) -> str:
|
|
# repr abuse
|
|
# about as stupid as "mapping for the renderer"...
|
|
return "%s (0x%02x), %d channel%s" % (
|
|
self.name, self._value_, self.channels,
|
|
"s" if self.channels != 1 else ""
|
|
)
|
|
|
|
|
|
class InputPortSet(EnumShowNameOnly):
|
|
"""
|
|
Devices which contain an "input" port.
|
|
"""
|
|
SYSTEM = 0
|
|
NULL = 0xFFF
|
|
|
|
|
|
class OutputPortSet(EnumShowNameOnly):
|
|
"""
|
|
Devices which contain an "output" port.
|
|
"""
|
|
CHIP_1 = 0
|
|
CHIP_2 = 1
|
|
CHIP_3 = 2
|
|
CHIP_4 = 3
|
|
CHIP_5 = 4
|
|
CHIP_6 = 5
|
|
CHIP_7 = 6
|
|
CHIP_8 = 7
|
|
CHIP_9 = 8
|
|
CHIP_10 = 9
|
|
CHIP_11 = 10
|
|
CHIP_12 = 11
|
|
CHIP_13 = 12
|
|
CHIP_14 = 13
|
|
CHIP_15 = 14
|
|
CHIP_16 = 15
|
|
CHIP_17 = 16
|
|
CHIP_18 = 17
|
|
CHIP_19 = 18
|
|
CHIP_20 = 19
|
|
CHIP_21 = 20
|
|
CHIP_22 = 21
|
|
CHIP_23 = 22
|
|
CHIP_24 = 23
|
|
CHIP_25 = 24
|
|
CHIP_26 = 25
|
|
CHIP_27 = 26
|
|
CHIP_28 = 27
|
|
CHIP_29 = 28
|
|
CHIP_30 = 29
|
|
CHIP_31 = 30
|
|
CHIP_32 = 31
|
|
PREVIEW = 0xFFD
|
|
METRONOME = 0xFFE
|
|
NULL = 0xFFF
|
|
|
|
|
|
class WaveFX(EnumShowNameOnly):
|
|
"""
|
|
Used in :attr:`chipchune.furnace.data_types.InsFeatureWaveSynth.effect`.
|
|
"""
|
|
NONE = 0
|
|
|
|
# single waveform
|
|
INVERT = 1
|
|
ADD = 2
|
|
SUBTRACT = 3
|
|
AVERAGE = 4
|
|
PHASE = 5
|
|
CHORUS = 6
|
|
|
|
# double waveform
|
|
NONE_DUAL = 128
|
|
WIPE = 129
|
|
FADE = 130
|
|
PING_PONG = 131
|
|
OVERLAY = 132
|
|
NEGATIVE_OVERLAY = 133
|
|
SLIDE = 134
|
|
MIX = 135
|
|
PHASE_MOD = 136
|
|
|
|
|
|
class ESFilterMode(EnumShowNameOnly):
|
|
"""
|
|
Used in :attr:`chipchune.furnace.data_types.InsFeatureES5506.filter_mode`.
|
|
"""
|
|
HPK2_HPK2 = 0
|
|
HPK2_LPK1 = 1
|
|
LPK2_LPK2 = 2
|
|
LPK2_LPK1 = 3
|
|
|
|
|
|
class GainMode(EnumShowNameOnly):
|
|
"""
|
|
Used in :attr:`chipchune.furnace.data_types.InsFeatureSNES.gain_mode`.
|
|
"""
|
|
DIRECT = 0
|
|
DEC_LINEAR = 4
|
|
DEC_LOG = 5
|
|
INC_LINEAR = 6
|
|
INC_INVLOG = 7
|
|
|
|
|
|
class SNESSusMode(EnumShowNameOnly):
|
|
"""
|
|
Used in :attr:`chipchune.furnace.data_types.InsFeatureSNES.sus`.
|
|
"""
|
|
DIRECT = 0
|
|
SUS_WITH_DEC = 1
|
|
SUS_WITH_EXP = 2
|
|
SUS_WITH_REL = 3
|
|
|
|
|
|
class _FurInsImportType(EnumShowNameOnly, EnumValueEquals):
|
|
"""
|
|
Also only used in this parser to differentiate between different types of instrument formats.
|
|
"""
|
|
# Old format
|
|
FORMAT_0_FILE = 0
|
|
FORMAT_0_EMBED = 1
|
|
|
|
# Dev127 format
|
|
FORMAT_1_FILE = 2
|
|
FORMAT_1_EMBED = 3
|
|
|
|
class _FurWavetableImportType(EnumShowNameOnly, EnumValueEquals):
|
|
"""
|
|
Also only used in this parser to differentiate between different types of wavetable formats.
|
|
"""
|
|
FILE = 0
|
|
EMBED = 1
|
|
|
|
class _FurSampleType(EnumShowNameOnly, EnumValueEquals):
|
|
"""
|
|
Also only used in this parser to differentiate between different types of sample formats.
|
|
"""
|
|
PCM_1_BIT = 0
|
|
DPCM = 1
|
|
YMZ = 3
|
|
QSOUND = 4
|
|
ADPCM_A = 5
|
|
ADPCM_B = 6
|
|
K05_ADPCM = 7
|
|
PCM_8_BIT = 8
|
|
BRR = 9
|
|
VOX = 10
|
|
ULAW = 11
|
|
C219 = 12
|
|
IMA = 13
|
|
PCM_16_BIT = 16
|