-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathit_structs.h
261 lines (234 loc) · 6.91 KB
/
it_structs.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
#pragma once
#include <stdint.h>
#include <stdbool.h>
#define CHN_DISOWNED 128
#define DIR_FORWARDS 0
#define DIR_BACKWARDS 1
#define PAN_SURROUND 100
#define LOOP_PINGPONG 24
#define LOOP_FORWARDS 8
enum // 8bb: envelope flags
{
ENVF_ENABLED = 1,
ENVF_LOOP = 2,
ENVF_SUSTAINLOOP = 4,
ENVF_CARRY = 8,
ENVF_TYPE_FILTER = 128 // 8bb: for pitch envelope only
};
enum // 8bb: sample flags
{
SMPF_ASSOCIATED_WITH_HEADER = 1,
SMPF_16BIT = 2,
SMPF_STEREO = 4,
SMPF_COMPRESSED = 8,
SMPF_USE_LOOP = 16,
SMPF_USE_SUSTAINLOOP = 32,
SMPF_LOOP_PINGPONG = 64,
SMPF_SUSTAINLOOP_PINGPONG = 128
};
enum // 8bb: host channel flags
{
HF_UPDATE_EFX_IF_CHAN_ON = 1,
HF_ALWAYS_UPDATE_EFX = 2,
HF_CHAN_ON = 4,
HF_CHAN_CUT = 8, // No longer implemented
HF_PITCH_SLIDE_ONGOING = 16,
HF_FREEPLAY_NOTE = 32, // 8bb: Only needed for tracker. Logic removed.
HF_ROW_UPDATED = 64,
HF_APPLY_RANDOM_VOL = 128,
HF_UPDATE_VOLEFX_IF_CHAN_ON = 256,
HF_ALWAYS_VOLEFX = 512
};
enum // 8bb: slave channel flags
{
SF_CHAN_ON = 1,
SF_RECALC_PAN = 2,
SF_NOTE_OFF = 4,
SF_FADEOUT = 8,
SF_RECALC_VOL = 16,
SF_FREQ_CHANGE = 32,
SF_RECALC_FINALVOL = 64,
SF_CENTRAL_PAN = 128,
SF_NEW_NOTE = 256,
SF_NOTE_STOP = 512,
SF_LOOP_CHANGED = 1024,
SF_CHN_MUTED = 2048,
SF_VOLENV_ON = 4096,
SF_PANENV_ON = 8192,
SF_PITCHENV_ON = 16384,
SF_PAN_CHANGED = 32768
};
enum // 8bb: IT header flags
{
ITF_STEREO = 1,
ITF_VOL0_OPTIMIZATION = 2, // 8bb: not used in IT1.04 and later
ITF_INSTR_MODE = 4,
ITF_LINEAR_FRQ = 8,
ITF_OLD_EFFECTS = 16,
ITF_COMPAT_GXX = 32,
ITF_USE_MIDI_PITCH_CNTRL = 64,
ITF_REQ_MIDI_CFG = 128
};
enum // 8bb: audio driver flags
{
DF_SUPPORTS_MIDI = 1,
DF_USES_VOLRAMP = 2, // 8bb: aka. "hiqual"
DF_WAVEFORM = 4, // Output waveform data available
DF_HAS_RESONANCE_FILTER = 8 // 8bb: added this
};
// 8bb: do NOT change these, it will only mess things up!
#define MAX_PATTERNS 200
#define MAX_SAMPLES 100
#define MAX_INSTRUMENTS 100
#define MAX_ORDERS 256
#define MAX_ROWS 200
#define MAX_HOST_CHANNELS 64
#define MAX_SLAVE_CHANNELS 256
#define MAX_SONGMSG_LENGTH 8000
typedef struct pattern_t
{
uint16_t Rows;
uint8_t *PackedData;
} pattern_t;
typedef struct envNode_t
{
int8_t Magnitude;
uint16_t Tick;
} envNode_t;
typedef struct env_t
{
uint8_t Flags, Num, LoopBegin, LoopEnd, SustainLoopBegin, SustainLoopEnd;
envNode_t NodePoints[25];
} env_t;
typedef struct instrument_t
{
char DOSFilename[12+1];
uint8_t NNA, DCT, DCA;
uint16_t FadeOut;
uint8_t PitchPanSep, PitchPanCenter, GlobVol, DefPan, RandVol, RandPan;
char InstrumentName[26];
uint8_t FilterCutoff, FilterResonance, MIDIChn, MIDIProg;
uint16_t MIDIBank;
uint16_t SmpNoteTable[120];
env_t VolEnv, PanEnv, PitchEnv;
} instrument_t;
typedef struct smp_t
{
char DOSFilename[12+1];
uint8_t GlobVol, Flags, Vol;
char SampleName[26];
uint8_t Cvt, DefPan;
uint32_t Length, LoopBegin, LoopEnd, C5Speed, SustainLoopBegin, SustainLoopEnd, OffsetInFile;
uint8_t AutoVibratoSpeed, AutoVibratoDepth, AutoVibratoRate, AutoVibratoWaveform;
void *Data;
// 8bb: added this for custom HQ driver
void *OrigData, *DataR, *OrigDataR;
} sample_t;
typedef struct hostChn_t
{
uint16_t Flags;
uint8_t NotePackMask, RawNote, Ins, RawVolColumn, Cmd, CmdVal, OldCmd, OldCmdVal, VolCmd, VolCmdVal;
uint8_t MIDIChn, MIDIProg, TranslatedNote, Smp;
uint8_t EfxMem_DKL, EfxMem_EFG, EfxMem_O, EfxMem_I, EfxMem_J, EfxMem_N, EfxMem_P;
uint8_t EfxMem_Q, EfxMem_T, EfxMem_S, EfxMem_W, EfxMem_G_Compat, EfxMem_SFx;
uint8_t HighSmpOffs;
uint8_t HostChnNum, VolSet;
void *SlaveChnPtr;
uint8_t PattLoopStartRow, PattLoopCount;
uint8_t PanbrelloWaveform, PanbrelloPos, PanbrelloDepth, PanbrelloSpeed, LastPanbrelloData;
int8_t LastVibratoData, LastTremoloData;
uint8_t ChnPan, ChnVol;
int8_t VolSlideDelta;
uint8_t TremorCount, TremorOnOff, RetrigCount;
int32_t PortaFreq;
uint8_t VibratoWaveform, VibratoPos, VibratoDepth, VibratoSpeed;
uint8_t TremoloWaveform, TremoloPos, TremoloDepth, TremoloSpeed;
uint8_t MiscEfxData[16];
} hostChn_t;
typedef struct envState_t
{
int32_t Value, Delta;
int16_t Tick, CurNode, NextTick;
} envState_t;
typedef struct slaveChn_t
{
bool SmpIs16Bit;
uint16_t Flags;
uint32_t MixOffset; // 8bb: which sample mix function to use
uint8_t LoopMode, LoopDirection;
int32_t LeftVolume, RightVolume;
int32_t Frequency, FrequencySet;
uint8_t AutoVibratoPos;
uint16_t AutoVibratoDepth;
int32_t OldLeftVolume, OldRightVolume;
uint8_t FinalVol128, Vol, VolSet, ChnVol, SmpVol, FinalPan;
uint16_t FadeOut;
uint8_t DCT, DCA, Pan, PanSet;
instrument_t *InsPtr;
sample_t *SmpPtr;
uint8_t Note, Ins;
uint8_t Smp;
void *HostChnPtr;
uint8_t HostChnNum, NNA, MIDIChn, MIDIProg;
uint16_t MIDIBank;
int32_t LoopBegin, LoopEnd;
uint32_t Frac32;
uint16_t FinalVol32768;
int32_t SamplingPosition;
int32_t filtera, filterb, filterc;
envState_t VolEnvState, PanEnvState, PitchEnvState;
// 8bb: added these
uint32_t Delta32;
int32_t OldSamples[2];
int32_t DestVolL, DestVolR, CurrVolL, CurrVolR; // 8bb: ramp
float fOldSamples[4], fFiltera, fFilterb, fFilterc;
// 8bb: for custom HQ mixer
float fOldLeftVolume, fOldRightVolume, fLeftVolume, fRightVolume;
float fDestVolL, fDestVolR, fCurrVolL, fCurrVolR;
uint64_t Frac64, Delta64;
} slaveChn_t;
typedef struct it_header_t
{
char SongName[26];
uint16_t OrdNum, InsNum, SmpNum, PatNum, Cwtv, Cmwt, Flags, Special;
uint8_t GlobalVol, MixVolume, InitialSpeed, InitialTempo, PanSep;
uint16_t MessageLength;
uint32_t MessageOffset;
uint8_t ChnlPan[MAX_HOST_CHANNELS], ChnlVol[MAX_HOST_CHANNELS];
} it_header_t;
typedef struct // 8bb: custom struct
{
uint32_t NumChannels;
uint8_t Type, Flags, FilterParameters[128];
uint32_t MixMode, MixSpeed;
int32_t Delta32;
int64_t Delta64;
float QualityFactorTable[128], FreqParameterMultiplier, FreqMultiplier;
float *fCubicLUT, fLastLeftValue, fLastRightValue; // 8bb: for HQ driver
// 8bb: for "WAV writer" driver
bool StartNoRamp;
int32_t LastLeftValue, LastRightValue;
// -----------------------------
} driver_t;
typedef struct song_t
{
it_header_t Header;
uint8_t Orders[MAX_ORDERS];
instrument_t Ins[MAX_INSTRUMENTS];
sample_t Smp[MAX_SAMPLES];
pattern_t Patt[MAX_PATTERNS];
char Message[MAX_SONGMSG_LENGTH+1]; // 8bb: +1 to fit protection-NUL
volatile bool Playing, Loaded;
uint8_t *PatternOffset, LastMIDIByte;
uint16_t CurrentOrder, CurrentPattern, CurrentRow, ProcessOrder, ProcessRow;
uint16_t BreakRow;
uint8_t RowDelay;
bool RowDelayOn, StopSong, PatternLooping;
uint16_t NumberOfRows, CurrentTick, CurrentSpeed, ProcessTick;
uint16_t Tempo, GlobalVolume;
uint16_t DecodeExpectedPattern, DecodeExpectedRow;
} song_t;
extern hostChn_t hChn[MAX_HOST_CHANNELS];
extern slaveChn_t sChn[MAX_SLAVE_CHANNELS];
extern song_t Song;
extern driver_t Driver;