summaryrefslogtreecommitdiff
path: root/arm9/lib/include/SND_main.h
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