blob: e35f1ee14141710e4e8df5ebee0428169f60bd95 (
plain)
| 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
 | #ifndef GUARD_SND_MAIN_H
#define GUARD_SND_MAIN_H
#include "global.h"
void SNDi_UnlockMutex(void);
void SNDi_LockMutex(void);
void SND_Init(void);
struct SNDBinaryFileHeader {
    s8 signature[4];    // 0x0
    u16 byteOrder;      // 0x4
    u16 version;        // 0x6
    u32 fileSize;       // 0x8
    u16 headerSize;     // 0xC
    u16 dataBlocks;     // 0xE
};  // size = 0x10
typedef struct SNDBinaryBlockHeader {
    u32 type;       // 0x0
    u32 size;       // 0x4
} SNDBinaryBlockHeader;  // size = 0x8
struct SNDWaveParam {
    u8 format;      // 0x0
    u8 loopEnabled; // 0x1
    u16 samplerate; // 0x2
    u16 timer;      // 0x4
    u16 loopStart;  // 0x6
    u32 loopLength; // 0x8
}; // size = 0xC
struct SNDLfoParam {
    u8 target;  // 0x0
    u8 speed;   // 0x1
    u8 depth;   // 0x2
    u8 range;   // 0x3
    u16 delay;  // 0x4
}; // size = 0x6
struct SNDLfo {
    struct SNDLfoParam param;   // 0x0
    u16 delayCounter;           // 0x6
    u16 counter;                // 0x8
}; // size = 0xA
struct SNDExChannel {
    u8 id;              // 0x00
    u8 type;            // 0x01
    u8 envStatus;       // 0x02
    struct {
        u8 active : 1;
        u8 start : 1;
        u8 autoSweep : 1;
        u8 syncFlag : 5;
    } flags;            // 0x03
    u8 panRange;        // 0x04
    u8 rootMidiKey;     // 0x05
    s16 userDecay2;     // 0x06
    u8 midiKey;         // 0x08
    u8 velocity;        // 0x09
    s8 initPan;         // 0x0A
    s8 userPan;         // 0x0B
    s16 userDecay;      // 0x0C
    s16 userPitch;      // 0x0E
    s32 envAttenuation; // 0x10
    s32 sweepCounter;   // 0x14
    s32 sweepLength;    // 0x18
    u8 envAttack;       // 0x1C
    u8 envSustain;      // 0x1D
    u16 envDecay;       // 0x1E
    u16 envRelease;     // 0x20
    u8 priority;        // 0x22
    u8 pan;             // 0x23
    u16 volume;         // 0x24
    u16 timer;          // 0x26
    struct SNDLfo lfo;  // 0x28
    s16 sweepPitch;     // 0x32
    s32 length;         // 0x34
    struct SNDWaveParam waveParam;  // 0x38
    union {
        const void *waveDataPtr;
        u32 dutyCycle;
    };                  // 0x44
    void (*callback)(struct SNDExChannel *chn, u32 status, void *userData); // 0x48
    void *callbackUserData; // 0x4C
    struct SNDExChannel *channelLLNext; // 0x50
};  // size = 0x54
#define SND_TRACK_COUNT_PER_PLAYER 16
#define SND_INVALID_TRACK_INDEX 0xFF
struct SNDPlayer {
    struct {
        u8 active : 1;
        u8 prepared : 1;
        u8 paused : 1;
    } flags;            // 0x0
    u8 playerId;        // 0x1
    u8 unk_2[2];        // 0x2
    u8 prio;            // 0x4
    u8 volume;          // 0x5
    s16 extFader;       // 0x6
    u8 tracks[SND_TRACK_COUNT_PER_PLAYER];  // 0x8
    u16 tempo;          // 0x18
    u16 tempoRatio;     // 0x1A
    u16 tempoCounter;   // 0x1C
    u8 unk_1E[2];       // 0x1E
    struct SNDBankData *bank;   // 0x20
};  // size = 0x24
#define SND_TRACK_MAX_CALL 3
struct SNDBankData;
struct SNDTrack {
    struct {
        u8 active : 1;
        u8 noteWait : 1;
        u8 muted : 1;
        u8 tie : 1;
        u8 noteFinishWait : 1;
        u8 portamento : 1;
        u8 cmp : 1; // ???
        u8 channelMask : 1;
    } flags;        // 0x00
    u8 panRange;    // 0x01
    u16 program;    // 0x02
    u8 volume;      // 0x04
    u8 expression;  // 0x05
    s8 pitchBend;   // 0x06
    u8 bendRange;   // 0x07
    s8 pan;         // 0x08
    s8 extPan;      // 0x09
    s16 extFader;   // 0x0A
    s16 extPitch;   // 0x0C
    u8 envAttack;   // 0x0E
    u8 envDecay;    // 0x0F
    u8 envSustain;  // 0x10
    u8 envRelease;  // 0x11
    u8 priority;    // 0x12
    s8 transpose;   // 0x13
    u8 portamentoKey;           // 0x14
    u8 portamentoTime;          // 0x15
    s16 sweepPitch;             // 0x16
    struct SNDLfoParam mod;     // 0x18
    u16 channelMask;            // 0x1E
    s32 wait;                   // 0x20
    const u8 *trackDataStart;   // 0x24
    const u8 *trackDataPos;     // 0x28
    const u8 *posCallStack[SND_TRACK_MAX_CALL]; // 0x34
    u8 loopCount[SND_TRACK_MAX_CALL];           // 0x38
    u8 callStackDepth;                          // 0x3B
    struct SNDExChannel *channelLLHead; // 0x3C
};  // size = 0x40
#endif // GUARD_SND_MAIN_H
 |