1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2025-07-03 06:24:30 +00:00

Audio WIP (#836)

* being code_800EC960

* wip

* wip

* more audio progress

* migrate data in code_800E11F0

* wip

* make ok

* remove asm

* wip

* move some variables outside of gAudioContext to the AudioContext structure due to the size used in func_800E3094

* more progress

* wip

* wip

* split code_800E11F0

* migrate rodata in code_800E11F0

* match functions that couldn't because of data issues

* move code_800E4FE0 asm files

* wip

* more wip

* fix global functions, and forward declarations

* wip

* wip

* wip

* ocarina wip

* match a couple functions

* some progress

* separate some bss

* match func_800EDA3C

* some matching

* more matches

* migrate audio rodata

* some matches

* more matchess

* start on synthesis

* work on synthesis

* fix function declaration

* Merge branch 'master' into audio

* match a few more functions

* wip

* wip

* more matching, rename Audio_SetBGM to Audio_QueueSeqCmd

* name several audio functions, and audiocontext members

* more naming, rename code_800E11F0 to audio_load, code_800DAAC0 to audio_synthesis

* audio wip

* match a few more functions.

* wip

* add missing NON_MATCHING directive

* wip

* some matching, data reogranization

* match cursed function

* wip

* wip

* formatting

* remove prefix from struct memebers

* missed function rename

* review

Co-authored-by: fig02 <fig02srl@gmail.com>
This commit is contained in:
krimtonz 2021-07-27 18:44:58 -05:00 committed by GitHub
parent cc9a04feb4
commit d1a5ea5110
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
429 changed files with 9047 additions and 17038 deletions

View file

@ -1893,7 +1893,7 @@ void UCodeDisas_RegisterUCode(UCodeDisas*, s32, UCodeInfo*);
void UCodeDisas_SetCurUCode(UCodeDisas*, void*);
// ? func_800DACC0(?);
// ? func_800DB03C(?);
// ? func_800DB0C4(?);
// ? AudioSynth_Update(?);
// ? func_800DB2C0(?);
// ? func_800DB330(?);
// ? func_800DB3D8(?);
@ -1905,24 +1905,24 @@ void UCodeDisas_SetCurUCode(UCodeDisas*, void*);
// ? func_800DBAE8(?);
// ? func_800DBB9C(?);
// ? func_800DBBD4(?);
// ? func_800DBC20(?);
// ? func_800DBC64(?);
// ? func_800DBCB0(?);
// ? AudioSynth_SetBuffer(?);
// ? AudioSynth_DMemMove(?);
// ? AudioSynth_InterL(?);
// ? func_800DBCD4(?);
// ? func_800DBD10(?);
// ? func_800DBD38(?);
// ? func_800DBD60(?);
// ? func_800DBD94(?);
// ? func_800DBDB0(?);
// ? func_800DBDE4(?);
// ? func_800DBE38(?);
// ? func_800DBE74(?);
// ? func_800DBE98(?);
// ? AudioSynth_SaveBuffer(?);
// ? AudioSynth_EnvSetup2(?);
// ? AudioSynth_UnkCmd17(?);
// ? AudioSynth_HiLoGain(?);
// ? AudioSynth_UnkCmd19(?);
// ? AudioSynth_UnkCmd3(?);
// ? AudioSynth_SetFilter(?);
// ? AudioSynth_SetFilterCount(?);
// ? func_800DBEB0(?);
// ? func_800DBF5C(?);
// ? func_800DC008(?);
// ? func_800DC074(?);
// ? func_800DC0E0(?);
// ? AudioSynth_LoadRingBuffer(?);
// ? AudioSynth_SaveRingBuffer(?);
// ? AudioSynth_SaveBuffer(?);
// ? func_800DC124(?);
// ? func_800DC164(?);
// ? func_800DC1D8(?);
@ -1963,9 +1963,9 @@ void func_800DF688(s16* arg0, s32 arg1, s32 arg2);
void func_800DF7C4(void);
void func_800DF888(void);
s32 Audio_ResetStep(void);
void func_800DFBF8(void);
void Audio_InitHeap(void);
void* func_800E04E8(s32 poolIdx, s32 id);
// ? func_800E0540(?);
void* func_800E0540(s32 poolIdx, s32 id, u32 size);
void* func_800E05C4(u32 size, s32 arg1, void* arg2, s8 arg3, s32 arg4);
void func_800E0634(u32 arg0, u32 arg1);
UnkHeapEntry* func_800E06CC(u32 size);
@ -1979,103 +1979,49 @@ void func_800E0E6C(s32 id);
void func_800E0E90(s32 id);
void func_800E0EB4(s32 arg0, s32 id);
void func_800E1148(void);
// ? func_800E11F0(?);
// ? func_800E12DC(?);
void func_800E11F0(void);
s32 func_800E12DC(s32 arg0, s32 arg1, s32 arg2, u8* arg3, s32 arg4);
void func_800E1618(s32 arg0);
s32 Audio_IsBankLoadComplete(s32 bankId);
s32 Audio_IsSeqLoadComplete(s32 seqId);
void Audio_SetBankLoadStatus(s32 bankId, u8 status);
void Audio_SetSeqLoadStatus(s32 seqId, u8 status);
// ? func_800E1A78(?);
// ? func_800E1AD8(?);
// ? func_800E1B08(?);
// ? func_800E1B68(?);
// ? func_800E1C18(?);
// ? func_800E1C78(?);
// ? func_800E1D64(?);
// ? func_800E1E34(?);
// ? func_800E1E6C(?);
// ? func_800E1EB0(?);
// ? func_800E1EF4(?);
// ? func_800E1F38(?);
// ? func_800E1F7C(?);
// ? func_800E202C(?);
void func_800E20D4(s32, s32, s32);
// ? func_800E2124(?);
// ? func_800E217C(?);
// ? func_800E22C4(?);
// ? func_800E2318(?);
// ? func_800E2338(?);
// ? func_800E2454(?);
// ? func_800E2558(?);
// ? func_800E2768(?);
// ? func_800E27A4(?);
// ? func_800E27F8(?);
// ? func_800E283C(?);
// ? func_800E2AA8(?);
// ? func_800E2BCC(?);
// ? func_800E2BE0(?);
// ? func_800E2CE0(?);
// ? func_800E2FEC(?);
void Audio_SetBankLoadStatus(s32 bankId, s32 status);
void Audio_SetSeqLoadStatus(s32 seqId, s32 status);
void func_800E1C18(s32 channelIdx, s32 arg1);
s32 func_800E1D64(s32 arg0, s32 arg1, s32 arg2);
void Audio_AudioSeqAsyncLoad(s32 arg0, s32 arg1, s32 arg2, OSMesgQueue* arg3);
void Audio_AudioTableAsyncLoad(s32 arg0, s32 arg1, s32 arg2, OSMesgQueue* arg3);
void Audio_AudioBankAsyncLoad(s32 arg0, s32 arg1, s32 arg2, OSMesgQueue* arg3);
u8* func_800E1F38(s32 arg0, u32* arg1);
void func_800E1F7C(s32 arg0);
s32 func_800E20D4(s32 playerIdx, s32 seqId, s32 arg2);
s32 func_800E2124(s32 playerIdx, s32 seqId, s32 arg2);
void Audio_ProcessLoads(s32 resetStatus);
void func_800E301C(void* callback);
// ? func_800E3034(?);
// ? func_800E3094(?);
void func_800E3400(void);
// ? func_800E3414(?);
// ? func_800E35E0(?);
// ? func_800E3678(?);
// ? func_800E36EC(?);
// ? func_800E3874(?);
// ? func_800E38F8(?);
void func_800E390C(s32, void*, void*);
void func_800E3A14(void);
// ? func_800E3A44(?);
// ? func_800E3AC8(?);
// ? func_800E3BEC(?);
// ? func_800E3D10(?);
// ? func_800E3D1C(?);
// ? func_800E3E58(?);
// ? func_800E3FB4(?);
// ? func_800E4044(?);
// ? func_800E4058(?);
// ? func_800E4198(?);
// ? func_800E4590(?);
// ? func_800E4744(?);
// ? func_800E48C0(?);
// ? func_800E4918(?);
void Audio_ContextInit(void* heap, u32 heapSize);
void Audio_SyncLoadsInit(void);
s32 Audio_SyncLoadSample(s32 arg0, s32 arg1, u8* arg2);
s32 Audio_SyncLoadSeq(s32 seqIdx, u8* ramAddr, u8* arg2);
void Audio_AsyncLoadReqInit(void);
void func_800E4D94(void);
void func_800E4EEC(u32, u32, s8*);
// ? func_800E4F58(?);
// ? func_800E4EEC(?);
void func_800E4F58(void);
void func_800E4FB0(void);
Sub_AudioMgr_18* func_800E4FE0(void);
// ? func_800E5000(?);
// ? func_800E5584(?);
// ? func_800E5958(?);
// ? func_800E59AC(?);
// ? func_800E59F4(?);
// ? func_800E5A8C(?);
// ? func_800E5AD8(?);
// ? func_800E5AFC(?);
void func_800E5B20(u32, s8);
// ? func_800E5B50(?);
// ? func_800E5B80(?);
// ? func_800E5C10(?);
// ? func_800E5C28(?);
// ? func_800E5D6C(?);
// ? func_800E5E20(?);
// ? func_800E5E84(?);
// ? func_800E5EDC(?);
// ? func_800E5F34(?);
// ? func_800E5F88(?);
// ? func_800E6024(?);
// ? func_800E6128(?);
// ? func_800E6300(?);
// ? func_800E6680(?);
// ? func_800E66C0(?);
s32 Audio_NextRandom(void);
// ? func_800E6818(?);
// ? func_800E6840(?);
void func_800E6880(void* mem, s32 size);
AudioTask* func_800E4FE0(void);
void Audio_QueueCmdF32(u32 arg0, f32 arg1);
void Audio_QueueCmdS32(u32 arg0, s32 arg1);
void Audio_QueueCmdS8(u32 arg0, s8 arg1);
void Audio_QueueCmdU16(u32 arg0, u16 arg1);
s32 Audio_ScheduleProcessCmds(void);
u32 func_800E5E20(u32* arg0);
u8* func_800E5E84(s32 arg0, u32* arg1);
s32 func_800E5EDC(void);
s32 func_800E5F88(u32 arg0);
void Audio_PreNMIInternal(void);
s32 func_800E6680(void);
u32 Audio_NextRandom(void);
void Audio_InitMesgQueues(void);
void Audio_osInvalDCache(void* buf, s32 size);
void Audio_osWritebackDCache(void* mem, s32 size);
s32 osAiSetNextBuffer(void*, u32);
void Audio_NoteSetVelPanReverb(Note* note, NoteSubEu* sub, Reverb* reverb);
void Audio_NoteSetResamplingRate(NoteSubEu* noteSubEu, f32 resamplingRateInput);
@ -2128,10 +2074,10 @@ void Audio_ProcessSequence(SequencePlayer* seqPlayer);
void Audio_ResetSequencePlayer(SequencePlayer* seqPlayer);
void func_800EC734(s32 seqPlayerIdx);
void Audio_InitSequencePlayers(void);
// ? func_800ECA00(?);
// ? func_800ECA60(?);
// ? Audio_GetOcaInput(?);
// ? Audio_OcaAdjStick(?);
// ? func_800ECAF0(?);
// ? func_800ECB34(?);
// ? Audio_OcaMapNoteValue(?);
// ? func_800ECB7C(?);
void func_800ECC04(u16);
// ? func_800ECDBC(?);
@ -2147,8 +2093,8 @@ void func_800ED93C(s8 songIdx, s8 arg1);
// ? func_800EE2D4(?);
// ? func_800EE318(?);
// ? func_800EE3C8(?);
UnkAudioStruct* func_800EE3D4(void);
UnkAudioStruct* func_800EE3F8(void);
OcarinaStaff* func_800EE3D4(void);
OcarinaStaff* Audio_OcaGetDisplayStaff(void);
// ? func_800EE404(?);
// ? func_800EE57C(?);
// ? func_800EE5EC(?);
@ -2167,7 +2113,7 @@ void func_800EEA50(GfxPrint* printer);
// ? func_800F28B4(?);
// ? func_800F29FC(?);
// ? func_800F2A04(?);
void func_800F2D6C(u8*, u16 sfxId);
void func_800F2D6C(s8*, u16 sfxId);
// ? func_800F2E28(?);
void func_800F3054(void);
// ? func_800F3188(?);
@ -2184,17 +2130,19 @@ void func_800F4010(Vec3f*, u16 sfxId, f32);
void func_800F41E0(Vec3f*, u16 sfxId, u8);
void func_800F4138(Vec3f*, u16 sfxId, f32);
void func_800F4190(Vec3f*, u16 sfxId);
void func_800F436C(Vec3f* pos, u16 sfxId, f32 arg2);
void func_800F4414(Vec3f* pos, u16 sfxId, f32);
void func_800F44EC(s8 arg0, s8 arg1);
void func_800F4524(Vec3f* arg0, u16 arg1, s8 arg2);
void func_800F4254(Vec3f* pos, u8 arg1);
void func_800F436C(Vec3f*, u16 sfxId, f32 arg2);
void func_800F4414(Vec3f*, u16 sfxId, f32 arg2);
void func_800F44EC(UNK_TYPE arg0, UNK_TYPE arg1);
void func_800F4524(Vec3f*, u16 sfxId, u8);
void func_800F4634(Vec3f*, f32);
void func_800F46E0(Vec3f* pos, f32 arg0);
// ? func_800F4784(?);
void func_800F47BC(void);
void func_800F47FC(void);
void func_800F483C(UNK_TYPE arg0, UNK_TYPE arg1);
void func_800F483C(u8 arg0, u8 arg1);
void func_800F4870(u8);
// ? func_800F491C(?);
void func_800F4A54(u8);
@ -2203,20 +2151,20 @@ void func_800F4BF4(Vec3f*, u16 sfxId, s8);
void func_800F4C58(Vec3f*, u16 sfxId, u8);
void func_800F4E30(Vec3f*, f32);
// ? func_800F50CC(?);
void func_800F50EC(Vec3f*);
void* func_800F50EC(Vec3f*);
// ? func_800F510C(?);
void func_800F52A0(Vec3f*, u16, u16);
void func_800F5504();
// ? func_800F5510(?);
// ? func_800F5550(?);
// ? func_800F56A8(?);
void func_800F574C(f32 arg0, u8 arg2);
void func_800F5718(void);
void func_800F574C(f32 arg0, UNK_TYPE arg2);
void func_800F5918(void);
void func_800F595C(u16);
void func_800F59E8(u16);
s32 func_800F5A58(s32, GlobalContext*);
void func_800F5ACC(u32 bgmID);
s32 func_800F5A58(u8);
void func_800F5ACC(u16 bgmID);
void func_800F5B58(void);
void func_800F5BF0(u8 arg0);
void func_800F5C64(u16);
@ -2225,10 +2173,8 @@ void func_800F5C2C(void);
// ? func_800F5E18(?);
void func_800F5E90(u8);
void func_800F6114(f32);
void func_800F6268(f32, UNK_TYPE);
void func_800F6584(UNK_TYPE);
void func_800F64E0(u8);
void func_800F6584(UNK_TYPE);
void func_800F6268(f32, u16);
void func_800F64E0(u8 arg0);
void func_800F66C0(s8 echo);
void func_800F66DC(s8);
void func_800F6700(s8 outputMode);
@ -2238,22 +2184,22 @@ void func_800F68BC(s8);
// ? func_800F68D4(?);
// ? func_800F691C(?);
void func_800F6964(u16);
void func_800F6AB0(u8);
// ? func_800F6B68(?);
void func_800F6AB0(u16);
// ? Audio_DisableAllSeq(?);
// ? func_800F6BB8(?);
void func_800F6C14();
void Audio_PreNMI();
// ? func_800F6C34(?);
void func_800F6D58(u8, u8, u8);
// ? func_800F6E7C(?);
void func_800F6FB4(u8);
void func_800F70F8();
void func_800F711C();
// ? func_800F7170(?);
void func_800F7170(void);
// ? func_800F71BC(?);
void func_800F7260(u16);
void func_800F72B8(u8);
void func_800F731C(u8);
void Audio_PlaySoundGeneral(u16 sfxId, Vec3f* a1, u8 a2, f32* a3, f32* a4, f32* a5);
void Audio_QueueSeqCmdMute(u8);
void Audio_ClearBGMMute(u8);
void Audio_PlaySoundGeneral(u16 sfxId, Vec3f* a1, u8 a2, f32* a3, f32* a4, s8* a5);
// ? func_800F74E0(?);
void func_800F7680(void);
void func_800F7B54(u8, u8);
@ -2263,25 +2209,25 @@ void func_800F87A0(u8);
void func_800F8884(u8, Vec3f*);
void func_800F89A0(u8, Vec3f*);
void func_800F89E8(Vec3f*);
// ? func_800F9280(?);
void Audio_QueueSeqCmd(u32 bgmID);
u16 func_800FA0B4(u8 a0);
s32 func_800FA11C(u32, u32);
void func_800F8A44(Vec3f* pos, u16 sfxId);
void func_800F8BA0(u8, u16);
void func_800F8D04(u32 sfxId);
void Audio_StopSfx(u32 sfxId);
void func_800F8E3C(void);
void func_800F8EA0(u8, u8, u16);
void func_800F8F34(u8);
void func_800F8F88(void);
u8 func_800F8FF4(u32 sfxId);
void func_800F905C(void);
// ? func_800F9280(?);
void func_800F9474(u8, u16);
void func_800F94FC(u32);
void Audio_SetBGM(u32 bgmId);
void func_800FA034(void);
u16 func_800FA0B4(u8 a0);
s32 func_800FA11C(u32, s32);
void Audio_ProcessSeqCmd(u32);
void Audio_ProcessSeqCmds(void);
void func_800FA174(u8);
void func_800FA18C(u8, u8);
void func_800FA240(u8, u8, u8, u8);
void Audio_SetVolScale(u8, u8, u8, u8);
void func_800FA3DC(void);
u8 func_800FAD34(void);
void func_800FADF8(void);

View file

@ -2,6 +2,7 @@
#define _ULTRA64_ABI_H_
/* Audio commands: */
/*
#define A_SPNOOP 0
#define A_ADPCM 1
#define A_CLEARBUFF 2
@ -18,7 +19,32 @@
#define A_INTERLEAVE 13
#define A_POLEF 14
#define A_SETLOOP 15
*/
#define A_SPNOOP 0
#define A_ADPCM 1
#define A_CLEARBUFF 2
#define A_UNK3 3
#define A_ADDMIXER 4
#define A_RESAMPLE 5
#define A_RESAMPLE_ZOH 6
#define A_FILTER 7
#define A_SETBUFF 8
#define A_DUPLICATE 9
#define A_DMEMMOVE 10
#define A_LOADADPCM 11
#define A_MIXER 12
#define A_INTERLEAVE 13
#define A_HILOGAIN 14
#define A_SETLOOP 15
#define A_INTERL 17
#define A_ENVSETUP1 18
#define A_ENVMIXER 19
#define A_LOADBUFF 20
#define A_SAVEBUFF 21
#define A_ENVSETUP2 22
#define A_UNK17 23
#define A_UNK19 25
#define ACMD_SIZE 32
/*
* Audio flags
@ -271,6 +297,38 @@ typedef short ENVMIX_STATE[40];
_a->words.w1 = (unsigned int)(s); \
}
#define aHiLoGain(pkt, gain, count, dmem, a4) \
{ \
Acmd *_a = (Acmd *)pkt; \
\
_a->words.w0 = _SHIFTL(A_HILOGAIN, 24, 8) | _SHIFTL(gain, 16, 8) | _SHIFTL(count, 0, 16); \
_a->words.w1 = _SHIFTL(dmem, 16, 16) | _SHIFTL(a4, 0, 16); \
}
#define aUnkCmd3(pkt, a1, a2, a3) \
{ \
Acmd *_a = (Acmd *)pkt;\
\
_a->words.w0 = _SHIFTL(A_UNK3, 24, 8) | _SHIFTL(a3, 0, 16); \
_a->words.w1 = _SHIFTL(a1, 16, 16) | _SHIFTL(a2, 0, 16); \
}
#define aUnkCmd19(pkt, a1, a2, a3, a4) \
{ \
Acmd *_a = (Acmd *)pkt; \
\
_a->words.w0 = _SHIFTL(A_UNK19, 24, 8) | _SHIFTL(a1, 16, 8) | _SHIFTL(a2, 0, 16); \
_a->words.w1 = _SHIFTL(a3, 16, 16) | _SHIFTL(a4, 0, 16); \
}
#define aUnkCmd17(pkt, a1, a2) \
{ \
Acmd *_a = (Acmd *)pkt; \
\
_a->words.w0 = _SHIFTL(A_UNK17, 24, 8) | _SHIFTL(a1, 16, 8); \
_a->words.w1 = (unsigned int)(a2); \
}
#define aClearBuffer(pkt, d, c) \
{ \
Acmd *_a = (Acmd *)pkt; \
@ -279,6 +337,7 @@ typedef short ENVMIX_STATE[40];
_a->words.w1 = (unsigned int)(c); \
}
/*
#define aEnvMixer(pkt, f, s) \
{ \
Acmd *_a = (Acmd *)pkt; \
@ -286,7 +345,19 @@ typedef short ENVMIX_STATE[40];
_a->words.w0 = _SHIFTL(A_ENVMIXER, 24, 8) | _SHIFTL(f, 16, 8); \
_a->words.w1 = (unsigned int)(s); \
}
*/
extern u32 D_801304A0;
#define aEnvMixer(pkt, dmemi, count, swapLR, x0, x1, x2, x3, m) \
{ \
Acmd *_a = (Acmd *)pkt; \
_a->words.w0 = D_801304A0 | _SHIFTL(dmemi >> 4, 16, 8) | _SHIFTL(count, 8, 8) | \
_SHIFTL(swapLR, 4, 1) | _SHIFTL(x0, 3, 1) | _SHIFTL(x1, 2, 1) | _SHIFTL(x2, 1, 1) | _SHIFTL(x3, 0, 1); \
_a->words.w1 = (unsigned int)(m); \
}
/*
#define aInterleave(pkt, l, r) \
{ \
Acmd *_a = (Acmd *)pkt; \
@ -294,7 +365,24 @@ typedef short ENVMIX_STATE[40];
_a->words.w0 = _SHIFTL(A_INTERLEAVE, 24, 8); \
_a->words.w1 = _SHIFTL(l, 16, 16) | _SHIFTL(r, 0, 16); \
}
*/
#define aInterleave(pkt, count, d, l, r) \
{ \
Acmd *_a = (Acmd *)pkt; \
\
_a->words.w0 = _SHIFTL(A_INTERLEAVE, 24, 8) | _SHIFTL(count >> 4, 16, 8) | _SHIFTL(d, 0, 16); \
_a->words.w1 = _SHIFTL(l, 16, 16) | _SHIFTL(r, 0, 16); \
}
#define aInterl(pkt, dmemi, dmemo, count) \
{ \
Acmd *_a = (Acmd*)pkt; \
_a->words.w0 = _SHIFTL(A_INTERL, 24, 8) | _SHIFTL(count, 0, 16); \
_a->words.w1 = _SHIFTL(dmemi, 16, 16) | _SHIFTL(dmemo, 0, 16); \
}
/*
#define aLoadBuffer(pkt, s) \
{ \
Acmd *_a = (Acmd *)pkt; \
@ -302,6 +390,16 @@ typedef short ENVMIX_STATE[40];
_a->words.w0 = _SHIFTL(A_LOADBUFF, 24, 8); \
_a->words.w1 = (unsigned int)(s); \
}
*/
#define aLoadBuffer(pkt, s, d, c) \
{ \
Acmd *_a = (Acmd *)pkt; \
\
_a->words.w0 = _SHIFTL(A_LOADBUFF, 24, 8) | \
_SHIFTL((c) >> 4, 16, 8) | _SHIFTL(d, 0, 16); \
_a->words.w1 = (unsigned int)(s); \
}
#define aMix(pkt, f, g, i, o) \
{ \
@ -330,6 +428,7 @@ typedef short ENVMIX_STATE[40];
_a->words.w1 = (unsigned int)(s); \
}
/*
#define aSaveBuffer(pkt, s) \
{ \
Acmd *_a = (Acmd *)pkt; \
@ -337,6 +436,16 @@ typedef short ENVMIX_STATE[40];
_a->words.w0 = _SHIFTL(A_SAVEBUFF, 24, 8); \
_a->words.w1 = (unsigned int)(s); \
}
*/
#define aSaveBuffer(pkt, s, d, c) \
{ \
Acmd *_a = (Acmd *)pkt; \
\
_a->words.w0 = _SHIFTL(A_SAVEBUFF, 24, 8) | \
_SHIFTL((c) >> 4, 16, 8) | _SHIFTL(s, 0, 16); \
_a->words.w1 = (unsigned int)(d); \
}
#define aSegment(pkt, s, b) \
{ \
@ -352,7 +461,7 @@ typedef short ENVMIX_STATE[40];
\
_a->words.w0 = (_SHIFTL(A_SETBUFF, 24, 8) | _SHIFTL(f, 16, 8) | \
_SHIFTL(i, 0, 16)); \
_a->words.w1 = _SHIFTL(c, 0, 16) | _SHIFTL(o, 16, 16); \
_a->words.w1 = _SHIFTL(o, 16, 16) | _SHIFTL(c, 0, 16); \
}
#define aSetVolume(pkt, f, v, t, r) \
@ -388,4 +497,54 @@ typedef short ENVMIX_STATE[40];
_a->words.w1 = (unsigned int)d; \
}
#define aEnvSetup1(pkt, a, b, c, d) \
{ \
Acmd *_a = (Acmd *)pkt; \
\
_a->words.w0 = (_SHIFTL(A_ENVSETUP1, 24, 8) | \
_SHIFTL(a, 16, 8) | _SHIFTL(b, 0, 16)); \
_a->words.w1 = _SHIFTL(c, 16, 16) | _SHIFTL(d, 0, 16); \
}
#define aEnvSetup2(pkt, volLeft, volRight) \
{ \
Acmd *_a = (Acmd *)pkt; \
\
_a->words.w0 = _SHIFTL(A_ENVSETUP2, 24, 8); \
_a->words.w1 = _SHIFTL(volLeft, 16, 16) | \
_SHIFTL(volRight, 0, 16); \
}
#define aFilter(pkt, f, countOrBuf, addr) \
{ \
Acmd *_a = (Acmd *)pkt; \
\
_a->words.w0 = _SHIFTL(A_FILTER, 24, 8) | _SHIFTL(f, 16, 8) | \
_SHIFTL(countOrBuf, 0, 16); \
_a->words.w1 = (unsigned int)(addr); \
}
#define aDuplicate(pkt, count, dmemi, dmemo, a4) \
{ \
Acmd *_a = (Acmd *)pkt; \
_a->words.w0 = _SHIFTL(A_DUPLICATE, 24, 8) | _SHIFTL(count, 16, 8) | _SHIFTL(dmemi, 0, 16); \
_a->words.w1 = _SHIFTL(dmemo, 16, 16) | _SHIFTL(a4, 0, 16); \
}
#define aAddMixer(pkt, count, dmemi, dmemo, a4) \
{ \
Acmd *_a = (Acmd *)pkt; \
_a->words.w0 = _SHIFTL(A_ADDMIXER, 24, 8) | _SHIFTL(count >> 4, 16, 8) | _SHIFTL(a4, 0, 16); \
_a->words.w1 = _SHIFTL(dmemi, 16, 16) | _SHIFTL(dmemo, 0, 16); \
}
#define aResampleZOH(pkt, pitch, pitchAccu) \
{ \
Acmd *_a = (Acmd *)pkt; \
_a->words.w0 = _SHIFTL(A_RESAMPLE_ZOH, 24, 8) | _SHIFTL(pitch, 0, 16); \
_a->words.w1 = _SHIFTL(pitchAccu, 0, 16); \
}
#endif /* _ULTRA64_ABI_H_ */

View file

@ -97,6 +97,9 @@ typedef struct {
#define OS_VI_PAL_HPN2 26
#define OS_VI_PAL_HPF2 27
#define OS_TV_PAL 0
#define OS_TV_NTSC 1
#define OS_TV_MPAL 2
#define OS_VI_UNK28 28
#endif

View file

@ -340,7 +340,7 @@ extern s32 gDebugArenaLogSeverity;
//extern ? D_8012DDDC;
//extern ? sUCodeDisasModeHMacros;
//extern ? sUCodeDisasModeLMacros;
extern s16* gWaveSamples[6];
extern s16* gWaveSamples[9];
extern f32 gPitchBendFrequencyScale[256];
//extern ? D_8012F098;
//extern ? D_8012F0B0;
@ -366,14 +366,8 @@ extern s16 D_80130328[];
//extern ? D_801304A0;
//extern ? D_801304AC;
//extern ? D_801304C0;
//extern ? D_801304D0;
//extern ? D_801304D8;
//extern ? D_801304DC;
//extern ? D_801304E0;
//extern ? D_801304E4;
extern s32 gAudioContextInitalized;
//extern ? D_801304E8;
//extern ? D_801304EC;
//extern ? D_801304F0;
//extern ? D_80130500;
extern f32 D_80130510;
extern s32 D_80130514;
@ -386,7 +380,7 @@ extern u8 D_80130594[4][7];
//extern ? D_801305BC;
//extern ? D_801305C0;
//extern ? D_801305CC;
//extern ? D_801305E0;
//extern ? sPrevChargeLevel;
//extern ? D_801305F4;
//extern ? D_801305FF;
//extern ? D_80130600;
@ -412,45 +406,45 @@ extern u8 D_80130594[4][7];
//extern ? D_80130654;
//extern ? D_80130658;
//extern ? D_801306DC;
//extern ? D_80130EFC;
//extern ? D_80130F00;
//extern ? D_80130F04;
//extern ? D_80130F08;
//extern ? D_80130F0C;
//extern ? sOcarinaAllowedBtnMask;
//extern ? sOcarinaABtnMap;
//extern ? sOcarinaCUPBtnMap;
//extern ? sOcarinaCDownBtnMap;
//extern ? sOcarinaInpEnabled;
//extern ? D_80130F10;
//extern ? D_80130F14;
//extern ? D_80130F18;
//extern ? D_80130F1C;
//extern ? D_80130F20;
//extern ? sCurOcarinaBtnVal;
//extern ? sPrevOcarinaNoteVal;
//extern ? sCurOcarinaBtnIdx;
//extern ? sLearnSongLastBtn;
//extern ? D_80130F24;
//extern ? D_80130F28;
//extern ? D_80130F2C;
//extern ? D_80130F30;
//extern ? D_80130F34;
//extern ? D_80130F38;
//extern ? sPlaybackState;
//extern ? D_80130F3C;
//extern ? D_80130F3E;
//extern ? D_80130F40;
//extern ? D_80130F44;
//extern ? D_80130F48;
//extern ? sNotePlaybackTimer;
//extern ? sPlaybackNotePos;
//extern ? sStaffPlaybackPos;
//extern ? D_80130F4C;
//extern ? D_80130F50;
//extern ? D_80130F54;
//extern ? D_80130F58;
//extern ? D_80130F5C;
//extern ? D_80130F60;
//extern ? D_80130F64;
//extern ? sDisplayedNoteValue;
//extern ? sNotePlaybackVolume;
//extern ? sNotePlaybackVibrato;
//extern ? sNotePlaybackTone;
//extern ? sNormalizedNotePlaybackTone;
//extern ? sNormalizedNotePlaybackVolume;
//extern ? D_80130F68;
//extern ? D_80130F6C;
//extern ? D_80130F74;
//extern ? D_80130F78;
//extern ? D_80130F80;
//extern ? sOcarinaNoteValues;
//extern ? sOcaMinigameApndPos;
//extern ? sOcaMinigameEndPos;
//extern ? sOcarinaSongs;
//extern ? D_80131100;
//extern ? D_8013170C;
//extern ? D_80131840;
extern u8* gFrogsSongPtr; // D_80131854: pointer to a u8 array of the notes you need to play for the frogs
//extern ? D_80131858;
//extern ? D_8013185C;
//extern ? sRecordSongPos;
//extern ? D_80131860;
//extern ? D_80131864;
//extern ? D_80131868;
@ -460,13 +454,13 @@ extern u8* gFrogsSongPtr; // D_80131854: pointer to a u8 array of the notes you
//extern ? D_80131878;
//extern ? D_8013187C;
//extern ? D_80131880;
//extern ? D_80131884;
//extern ? sPierresSong;
//extern ? D_8013188C;
extern u8* gScarecrowCustomSongPtr;
extern OcarinaSong* gScarecrowCustomSongPtr;
extern u8* gScarecrowSpawnSongPtr;
//extern ? D_80131BEC;
//extern ? D_80131BF0;
extern u8 D_80131C00[][9];
extern OcarinaSongInfo gOcarinaSongNotes[];
//extern ? D_80131C80;
//extern ? D_80131C84;
//extern ? D_80131C88;
@ -518,7 +512,7 @@ extern u8 D_80131C00[][9];
//extern ? D_80131F64;
//extern ? D_80131F68;
//extern ? D_80131F6C;
//extern ? D_8013331C;
extern Struct_8013331C *D_8013331C[];
extern u8 D_80133340[4];
//extern ? D_80133344;
extern s32 D_8013338C;
@ -532,17 +526,17 @@ extern u8 D_801333CC;
extern u16 D_801333D0;
extern Vec3f D_801333D4;
extern f32 D_801333E0;
extern f32 D_801333E8;
extern s8 D_801333E8;
extern u8 D_801333F0;
extern u8 D_801333F4;
extern u8 D_801333F8;
//extern ? D_80133400;
//extern ? D_80133404;
//extern ? sSeqCmdWrPos;
//extern ? sSeqCmdRdPos;
//extern ? D_80133408;
//extern ? D_8013340C;
//extern ? D_80133414;
//extern ? D_80133418;
extern AudioSessionSettings gAudioSessionPresets[];
extern AudioSessionSettings gAudioSessionPresets[18];
extern s32 gOverlayLogSeverity;
//extern ? D_80134480;
//extern ? D_80134484;
@ -2732,10 +2726,9 @@ extern char D_80146238[];
//extern ? D_8014A450;
//extern ? D_8014A45C;
//extern ? D_8014A460;
extern s16 gTatumsPerBeat;
//extern ? D_8014A6C4;
//extern ? D_8014A6C8;
//extern ? D_8014A6CC;
extern const s16 D_8014A6C0[];
#define gTatumsPerBeat (D_8014A6C0[1])
extern const AudioContextInitSizes D_8014A6C4;
//extern ? D_8014A710;
//extern ? D_8014A728;
//extern ? D_8014A730;
@ -2990,10 +2983,10 @@ extern s16 D_80153960[];
//extern ? D_80154AE8;
//extern ? D_80154AFC;
//extern ? D_80154B00;
//extern ? D_801550D0;
//extern ? D_80155340;
//extern ? D_80155500;
//extern ? D_80155BF0;
extern u8 gAudioBankTable[];
extern u8 D_80155340[];
extern u8 gSequenceTable[];
extern u8 gAudioTable[];
//extern ? D_80155C70;
extern u8 D_80155F50[];
extern u8 D_80157580[];
@ -3229,11 +3222,12 @@ extern FaultThreadStruct gFaultStruct;
//extern ? D_8016B6A0;
//extern ? D_8016B6B5;
//extern ? D_8016B6B8;
//extern ? D_8016B6E0;
//extern ? D_8016B6F8;
//extern ? D_8016B780;
//extern ? D_8016B7A0;
//extern ? D_8016B7A4;
extern OSMesgQueue D_8016B6E0;
//extern OSMesg D_8016B6F8;
extern u8* D_8016B738[];
//extern u32 D_8016B780;
//extern ? sAudioUpdateStartTime;
//extern ? sAudioUpdateEndTime;
//extern ? D_8016B7A8;
//extern ? D_8016B7AC;
//extern ? D_8016B7B0;
@ -3258,33 +3252,31 @@ extern FaultThreadStruct gFaultStruct;
//extern ? D_8016B9F6;
//extern ? D_8016B9F8;
//extern ? D_8016B9F9;
//extern ? D_8016B9FC;
//extern ? D_8016BA00;
//extern ? D_8016BA04;
//extern ? D_8016BA08;
//extern ? D_8016BA09;
//extern ? D_8016BA0C;
//extern ? sCurOcarinaBtnPress;
//extern ? D_8016BA10;
//extern ? D_8016BA14;
//extern ? sPrevOcarinaBtnPress;
//extern ? D_8016BA18;
//extern ? D_8016BA20;
//extern ? D_8016BA28;
//extern ? D_8016BA29;
//extern ? D_8016BA2A;
//extern ? D_8016BA2B;
//extern ? D_8016BA2C;
//extern ? sCurOcarinaSong;
//extern ? sOcarinaSongAppendPos;
//extern ? sOcarinaHasStartedSong;
//extern ? gOcarinaSongNotestartIdx;
//extern ? sOcarinaSongCnt;
//extern ? sOcarinaAvailSongs;
//extern ? D_8016BA2E;
//extern ? D_8016BA30;
//extern ? D_8016BA50;
//extern ? D_8016BA70;
//extern ? D_8016BA90;
//extern ? sLearnSongExpectedNote;
//extern ? D_8016BAA0;
//extern ? D_8016BAA8;
//extern ? D_8016BAB0;
//extern ? D_8016BAB4;
//extern ? D_8016BAB8;
//extern ? D_8016BABC;
//extern ? D_8016BAC0;
//extern ? sDebugPadPressRaw;
//extern ? sDebugPadPress;
//extern ? sAudioUpdateTaskStart;
//extern ? sAudioUpdateTaskEnd;
extern SoundBankEntry D_8016BAD0[9];
extern SoundBankEntry D_8016BC80[12];
extern SoundBankEntry D_8016BEC0[22];
@ -3296,7 +3288,7 @@ extern SoundBankEntry D_8016C8B0[5];
extern u8 D_8016E1A0[7];
extern u8 D_8016E1A8[7];
extern u8 D_8016E1B0[7];
//extern ? D_8016E1B8;
extern Struct_800F7CEC D_8016E1B8[7][3]; // total size = 0xA8
extern u8 D_8016E260;
extern u8 D_8016E264[];
//extern ? D_8016E270;
@ -3305,12 +3297,10 @@ extern u16 D_8016E2F8[];
extern u8 D_8016E310[];
//extern ? D_8016E320;
//extern ? D_8016E348;
//extern ? D_8016E350;
//extern ? D_8016E750;
//extern ? D_8016E9A4;
//extern ? sAudioSeqCmds;
extern unk_D_8016E750 D_8016E750[4];
//extern ? D_8016EE8B;
extern AudioContext gAudioContext; // at 0x8016f180
extern NotePool gNoteFreeLists; // probably includes this and further members, too
extern AudioContext gAudioContext; // at 0x8016F180
//extern ? D_80174D28;
//extern ? D_80174D38;
//extern ? D_80174D48;
@ -3321,7 +3311,7 @@ extern NotePool gNoteFreeLists; // probably includes this and further members, t
//extern ? D_80174DB8;
//extern ? D_80174DBC;
//extern ? D_80174DC0;
//extern ? D_801755D0;
extern void(*D_801755D0)(void); // not sure about arguments yet.
extern u32 __osMalloc_FreeBlockTest_Enable;
//extern ? D_80175640;
//extern ? D_80175670;

View file

@ -510,7 +510,7 @@ typedef struct {
/* 0x0168 */ Vtx* cursorVtx;
/* 0x016C */ Vtx* saveVtx;
/* 0x0170 */ char unk_170[0x24];
/* 0x0194 */ UnkAudioStruct* unk_194;
/* 0x0194 */ OcarinaStaff* unk_194;
/* 0x0198 */ char unk_198[0x20];
/* 0x01B8 */ OSMesgQueue loadQueue;
/* 0x01D0 */ OSMesg loadMsg;
@ -1505,24 +1505,12 @@ typedef struct {
#define OS_SC_YIELD 0x0010
#define OS_SC_YIELDED 0x0020
typedef struct {
struct {
/* 0x0000 */ s32 unk_0[0x10]; // not char to avoid generating lwl/lwr swl/swr in a struct copy
} unk_0;
/* 0x0040 */ OSMesgQueue* unk_40;
} Sub_AudioMgr_18; // size = 0x44
typedef struct {
/* 0x0000 */ IrqMgr* irqMgr;
/* 0x0004 */ SchedContext* sched;
/* 0x0008 */ OSMesg unk_8;
/* 0x000C */ char unk_C[0x04];
/* 0x0010 */ s32 unk_10;
/* 0x0014 */ s32 unk_14;
/* 0x0018 */ Sub_AudioMgr_18 unk_18;
/* 0x005C */ UNK_PTR unk_5C;
/* 0x0008 */ OSScTask audioTask;
/* 0x0060 */ char unk_60[0x10];
/* 0x0070 */ Sub_AudioMgr_18* unk_70;
/* 0x0070 */ AudioTask* rspTask;
/* 0x0074 */ OSMesgQueue unk_74;
/* 0x008C */ OSMesg unk_8C;
/* 0x0090 */ OSMesgQueue unk_90;
@ -1535,7 +1523,6 @@ typedef struct {
/* 0x00E8 */ OSThread unk_E8;
} AudioMgr; // size = 0x298
struct ArenaNode;
typedef struct Arena {

View file

@ -1,6 +1,8 @@
#ifndef _Z64_AUDIO_H_
#define _Z64_AUDIO_H_
#define MK_CMD(b0,b1,b2,b3) ((((b0) & 0xFF) << 0x18) | (((b1) & 0xFF) << 0x10) | (((b2) & 0xFF) << 0x8) | (((b3) & 0xFF) << 0))
/**
* Structs in this repository have primarily been imported from the SM64 Decompilation.
* Many struct members are wrong; the symbol '?' next to an offset means the member is a guess.
@ -11,7 +13,7 @@
#define TATUMS_PER_BEAT 48
#define IS_SEQUENCE_CHANNEL_VALID(ptr) ((u32)(ptr) != (u32)&gAudioContext.gSequenceChannelNone)
#define IS_SEQUENCE_CHANNEL_VALID(ptr) ((u32)(ptr) != (u32)&gAudioContext.sequenceChannelNone)
#define ADSR_STATE_DISABLED 0
#define ADSR_STATE_INITIAL 1
@ -28,6 +30,8 @@
#define ADSR_GOTO -2
#define ADSR_RESTART -3
#define AIBUF_LEN 0xB00
struct Note;
struct NotePool;
struct SequenceChannel;
@ -88,10 +92,16 @@ typedef struct {
} AdpcmBook;
typedef struct {
/* 0x00 */ u8 bits4 : 4;
/* 0x00 */ u8 bits2 : 2;
/* 0x00 */ u8 unk_bits2 : 2;
/* 0x01 */ u32 bits24 : 24;
union{
struct {
/* 0x00 */ u32 bits4 : 4;
/* 0x00 */ u32 bits2 : 2;
/* 0x00 */ u32 unk_bits26 : 1;
/* 0x00 */ u32 unk_bits25 : 1;
/* 0x01 */ u32 size : 24;
};
u32 bits;
};
/* 0x04 */ u8* sampleAddr;
/* 0x08 */ AdpcmLoop* loop;
/*?0x0C */ AdpcmBook* book;
@ -110,35 +120,43 @@ typedef struct {
/*?0x0C */ s32 startPos; // start pos in ring buffer
/*?0x10 */ s16 lengthA; // first length in ring buffer (from startPos, at most until end)
/*?0x12 */ s16 lengthB; // second length in ring buffer (from pos 0)
/* 0x14 */ u8 pad[8];
/* 0x14 */ u16 unk_14;
/* 0x16 */ u16 unk_16;
/* 0x18 */ u16 unk_18;
/* 0x1A */ char unk_1A[2];
} ReverbRingBufferItem; // size = 0x1C
typedef struct {
/* 0x000 */ u8 unk_00;
/* 0x000 */ u8 resampleFlags;
/* 0x001 */ u8 useReverb;
/* 0x002 */ u8 unk_02;
/* 0x003 */ u8 unk_03;
/* 0x002 */ u8 framesToIgnore;
/* 0x003 */ u8 curFrame;
/* 0x004 */ u8 downsampleRate;
/* 0x005 */ u8 unk_05;
/* 0x005 */ s8 unk_05;
/* 0x006 */ u16 windowSize;
/* 0x008 */ u16 unk_08;
/* 0x00A */ u16 unk_0A;
/* 0x008 */ s16 unk_08;
/* 0x00A */ s16 unk_0A;
/* 0x00C */ u16 unk_0C;
/* 0x00E */ u16 unk_0E;
/* 0x010 */ u16 unk_10;
/* 0x012 */ u16 unk_12;
/* 0x010 */ s16 unk_10;
/* 0x012 */ s16 unk_12;
/* 0x014 */ u16 unk_14;
/* 0x016 */ u16 unk_16;
/* 0x016 */ s16 unk_16;
/* 0x018 */ u8 unk_18;
/* 0x01C */ s32 unk_1C;
/* 0x019 */ u8 unk_19;
/* 0x01A */ u8 unk_1A;
/* 0x01B */ u8 unk_1B;
/* 0x01C */ s32 nextRingBufPos;
/* 0x020 */ s32 unk_20;
/* 0x024 */ s32 unk_24;
/* 0x028 */ s16* unk_28;
/* 0x02C */ s16* unk_2C;
/* 0x024 */ s32 bufSizePerChan;
/* 0x028 */ s16* leftRingBuf;
/* 0x02C */ s16* rightRingBuf;
/* 0x030 */ void* unk_30;
/* 0x034 */ void* unk_34;
/* 0x038 */ void* unk_38;
/* 0x03C */ void* unk_3C;
/* 0x040 */ ReverbRingBufferItem items[2][5];
/*?0x158 */ ReverbRingBufferItem items2[2][5];
/* 0x270 */ s16* unk_270;
@ -166,7 +184,7 @@ typedef struct {
/* 0x01 */ u8 pan;
/*?0x02 */ u8 loaded;
/* 0x04 */ AudioBankSound sound;
/* 0x14 */ AdsrEnvelope *envelope;
/* 0x14 */ AdsrEnvelope* envelope;
} Drum; // size >= 0x14
typedef struct {
@ -229,7 +247,7 @@ typedef struct {
/* 0x010 */ u16 delay;
/* 0x012 */ u16 fadeTimer;
/* 0x014 */ u16 fadeTimerUnkEu;
/* 0x016 */ char pad_16[0x2];
/* 0x016 */ char unk_16[0x2];
/* 0x018 */ u8* seqData;
/* 0x01C */ f32 fadeVolume;
/* 0x020 */ f32 fadeVelocity;
@ -282,8 +300,8 @@ typedef struct {
/* 0x0C */ f32 fadeOutVel;
/* 0x10 */ f32 current;
/* 0x14 */ f32 target;
/* */ char pad_18[4];
/* 0x1C */ AdsrEnvelope *envelope;
/* 0x18 */ char unk_18[4];
/* 0x1C */ AdsrEnvelope* envelope;
} AdsrState;
typedef struct {
@ -407,7 +425,7 @@ typedef struct SequenceChannelLayer {
/* 0x0E */ u16 portamentoTime;
/* 0x10 */ s16 transposition; // #semitones added to play commands
// (m64 instruction encoding only allows referring to the limited range
// 0..0x3f; this makes 0x40..0x7f accessible as well)
// 0..0x3F; this makes 0x40..0x7F accessible as well)
/* 0x12 */ s16 shortNoteDefaultPlayPercentage;
/* 0x14 */ s16 playPercentage;
/* 0x18 */ AdsrSettings adsr;
@ -427,25 +445,33 @@ typedef struct SequenceChannelLayer {
} SequenceChannelLayer; // size = 0x80
typedef struct {
/*?00 */ s16 adpcmdecState[0x10];
/*?00 */ s16 finalResampleState[0x10];
/*?00 */ s16 mixEnvelopeState[0x28];
/*?00 */ s16 panResampleState[0x10];
/*?00 */ s16 panSamplesBuffer[0x20];
/*?00 */ s16 dummyResampleState[0x10];
} NoteSynthesisBuffers;
/* 0x0000 */ s16 adpcmdecState[0x10];
/* 0x0020 */ s16 finalResampleState[0x10];
/* 0x0040 */ s16 mixEnvelopeState[0x28];
/* 0x0090 */ s16 panResampleState[0x10];
/* 0x00B0 */ s16 panSamplesBuffer[0x20];
/* 0x00F0 */ s16 dummyResampleState[0x10];
} NoteSynthesisBuffers; // size = 0x110
typedef struct {
/*?0x00 */ u8 restart;
/*?0x01 */ u8 sampleDmaIndex;
/*?0x02 */ u8 prevHeadsetPanRight;
/*?0x03 */ u8 prevHeadsetPanLeft;
/*?0x04 */ u16 samplePosFrac;
/*?0x04 */ u8 samplePosFrac;
/* 0x05 */ u8 unk_05;
/* 0x06 */ u16 unk_06;
/*?0x08 */ s32 samplePosInt;
/* 0x0C */ NoteSynthesisBuffers* synthesisBuffers;
/*?0x10 */ s16 curVolLeft;
/*?0x12 */ s16 curVolRight;
} NoteSynthesisState;
/* 0x14 */ u16 unk_14;
/* 0x16 */ u16 unk_16;
/* 0x18 */ u16 unk_18;
/* 0x1A */ u8 unk_1A;
/* 0x1C */ u16 unk_1C;
/* 0x1E */ u16 unk_1E;
} NoteSynthesisState; // size = 0x20
typedef struct {
/* 0x00 */ struct SequenceChannel* seqChannel;
@ -523,11 +549,10 @@ typedef struct {
typedef struct Note {
/* 0x00 */ AudioListItem listItem;
/*?0x10 */ NoteSynthesisState synthesisState;
/* 0x24 */ char pad_24[0xC];
/* 0x30 */ NotePlaybackState playbackState;
/* 0x90 */ Portamento portamento;
/* 0x9C */ VibratoState vibratoState;
/* 0xB8 */ char pad_B8[0x4];
/* 0xB8 */ char unk_B8[0x4];
/* 0xBC */ u32 unk_BC;
/* 0xC0 */ NoteSubEu noteSubEu;
} Note; // size = 0xE0
@ -552,9 +577,9 @@ typedef struct {
/*?0x04 */ u8 unk_04;
/* 0x05 */ u8 maxSimultaneousNotes;
/* 0x06 */ u8 numSequencePlayers;
/* 0x07 */ u8 pad_07[2];
/* 0x07 */ u8 unk_07[0x2];
/* 0x09 */ u8 numReverbs;
/* 0x0A */ u8 pad_0A[2];
/* 0x0A */ u8 unk_0A[0x2];
/* 0x0C */ ReverbSettings* reverbSettings;
/* 0x10 */ u16 unk_10;
/* 0x12 */ u16 unk_12;
@ -605,7 +630,7 @@ typedef struct {
/* 0x00 */ s8 unk_00;
/* 0x01 */ s8 unk_01;
/* 0x02 */ s8 unk_02;
/* 0x03 */ char pad[0x5];
/* 0x03 */ char unk_03[0x5];
/* 0x08 */ u8* unk_08;
/* 0x0C */ void* unk_0C;
/* 0x10 */ u32 size;
@ -635,7 +660,7 @@ typedef struct
{
/* 0x000*/ PersistentPool persistent;
/* 0x0D4*/ TemporaryPool temporary;
/* 0x100*/ u8 pad[0x10];
/* 0x100*/ u8 unk_100[0x10];
} SoundMultiPool; // size = 0x110
typedef struct {
@ -661,96 +686,327 @@ typedef struct {
u8* unk_4;
u32 unk_8;
s8 unk_C;
s8 unk_D;
s16 unk_E;
} Struct_800E0E0C_2;
typedef struct {
char pad[0xC];
char unk_00[0x2];
s16 unk_02;
char unk_04[0x8];
Struct_800E0E0C_2 unk_C[1]; // unknown size
} ManyStruct_800E0E0C_2;
typedef struct {
/* 0x00 */ s32 unk_00;
/* 0x00 */ u8* unk_00;
/* 0x04 */ AudioBankSample* sample;
/* 0x08 */ u8* unk_08;
/* 0x0C */ s32 pad;
/* 0x10 */ s32 unk_10;
} AudioStruct0D68; // size = 0x14
typedef struct {
union{
u32 opArgs;
struct {
u8 op;
u8 arg0;
u8 arg1;
u8 arg2;
};
};
union {
void* data;
f32 asFloat;
s32 asInt;
u16 asUShort;
s8 asSbyte;
u8 asUbyte;
u32 asUInt;
};
} AudioCmd;
typedef struct {
union{
struct {
s16 unk_00;
u16 unk_02;
};
u32 unk_00w;
};
u32 unk_04;
s8 unk_08;
char unk_09[0x7];
} unk_dma_s;
#define MK_ASYNC_MSG(b0,b1,b2,b3)(((b0) << 0x18) | ((b1) << 0x10) | ((b2) << 0x08) | ((b3) << 0x00))
#define ASYNC_TBLTYPE(v)((u8)(v >> 0x10))
#define ASYNC_B2(v)((u8)(v >> 0x08))
#define ASYNC_B3(v)((u8)(v >> 0x00))
#define AYSNC_B0(v)(((u8)(v >> 0x18))
typedef struct {
/* 0x00 */ s8 status;
/* 0x01 */ s8 unk_01;
/* 0x02 */ s8 unk_02; // type?
/* 0x03 */ char unk_03[0x1];
/* 0x04 */ u32 unk_04;
/* 0x08 */ u32 devAddr;
/* 0x0C */ u8* ramAddr;
/* 0x10 */ u32 bytesRemaining;
/* 0x14 */ u32 chunkSize;
/* 0x18 */ s32 unk_18;
/* 0x1C */ u32 retMsg;
/* 0x20 */ OSMesgQueue* retQueue;
/* 0x24 */ OSMesgQueue msgQueue;
/* 0x3C */ OSMesg msg[1];
/* 0x40 */ OSIoMesg ioMesg;
} AsyncLoadReq; // size = 0x58
typedef struct {
/* 0x0000 */ u8 unk_00;
/* 0x0001 */ u8 unk_01;
/* 0x0002 */ u16 unk_02;
/* 0x0004 */ s32 unk_04;
/* 0x0008 */ s32 devAddr;
/* 0x000C */ u8* ramAddr;
/* 0x0010 */ u8* unk_10;
/* 0x0014 */ s32 status;
/* 0x0018 */ s32 size;
/* 0x001C */ s8* isDone;
/* 0x0020 */ AudioBankSample sample;
/* 0x0030 */ OSMesgQueue msgqueue;
/* 0x0048 */ OSMesg msg[1];
/* 0x004C */ OSIoMesg ioMesg;
} AudioSyncLoad; // size = 0x64
typedef struct {
u16 offsets[18];
char data[1];
} unk_283C;
typedef struct {
/* 0x0000 */ s16 entryCnt;
/* 0x0002 */ s16 unk_02;
/* 0x0004 */ u32 romAddr;
/* 0x0008 */ char pad[0x8];
} AudioTableHeader; // size = 0x10
typedef struct {
/* 0x0000 */ u32 romAddr;
/* 0x0004 */ u32 size;
/* 0x0008 */ s8 unk_08;
/* 0x0009 */ s8 type;
/* 0x000A */ char pad[6];
} SequenceTableEntry; // size = 0x10
typedef struct {
/* 0x0000 */ u32 romAddr;
/* 0x0004 */ u32 size;
/* 0x0008 */ u8 unk_08;
/* 0x0009 */ u8 unk_09;
/* 0x000A */ s16 unk_0A;
/* 0x000C */ s16 unk_0C;
/* 0x000E */ s16 unk_0E;
} AudioBankTableEntry; // size = 0x10
typedef struct {
/* 0x0000 */ u32 romAddr;
/* 0x0004 */ u32 size;
/* 0x0008 */ s8 unk_08;
/* 0x0009 */ s8 unk_09;
/* 0x000A */ char pad[6];
} AudioTableEntry; // size = 0x10
typedef struct {
/* 0x0000 */ AudioTableHeader header;
/* 0x0010 */ SequenceTableEntry entries[1];
} SequenceTable; // size >= 0x20
typedef struct {
/* 0x0000 */ AudioTableHeader header;
/* 0x0010 */ AudioBankTableEntry entries[1];
} AudioBankTable; // size >= 0x20
typedef struct {
/* 0x0000 */ AudioTableHeader header;
/* 0x0010 */ AudioTableEntry entries[1];
} AudioTable; // size >= 0x20
typedef struct {
/* 0x0000 */ OSTask task;
/* 0x0040 */ OSMesgQueue* taskQueue;
/* 0x0044 */ void* unk_44; // probbly a message that gets unused.
/* 0x0048 */ char unk_48[0x8];
} AudioTask; // size = 0x50
typedef struct {
/* 0x0000 */ u8* ramAddr;
/* 0x0004 */ u32 devAddr;
/* 0x0008 */ u16 unk_08;
/* 0x000A */ u16 size;
/* 0x000C */ u8 unk_0C;
/* 0x000D */ u8 unk_0D;
/* 0x000E */ u8 unk_0E;
/* 0x000F */ u8 unk_0F;
} SampleDmaReq; // size = 0x10
typedef struct {
s32 unk_00;
s32 unk_04;
s32 unk_08;
s32 unk_0C;
s32 unk_10;
s32 unk_14;
} RelocInfo;
typedef enum {
SEQUENCE_TABLE,
BANK_TABLE,
AUDIO_TABLE
} AudioTableType;
typedef struct {
Drum** drums;
AudioBankSound* sfx;
Instrument* instruments[1];
} unk_ldr;
typedef struct {
/* 0x0000 */ char unk_0000;
/* 0x0001 */ s8 gNumSynthesisReverbs;
/* 0x0001 */ s8 numSynthesisReverbs;
/* 0x0002 */ u16 unk_2;
/* 0x0004 */ u16 unk_4;
/* 0x0006 */ char unk_0006[0x0e];
/* 0x0014 */ NoteSubEu* gNoteSubsEu;
/* 0x0018 */ SynthesisReverb gSynthesisReverbs[4];
/* 0x0B38 */ char unk_0B38[0x230];
/* 0x0D68 */ AudioStruct0D68 unk_0D68[128]; // guessing at size
/* 0x1768 */ char unk_1768[4];
/* 0x0006 */ char unk_0006[0x0A];
/* 0x0000 */ s32 unk_0x10;
/* 0x0014 */ NoteSubEu* noteSubsEu;
/* 0x0018 */ SynthesisReverb synthesisReverbs[4];
/* 0x0B38 */ char unk_0B38[0x30];
/* 0x0B68 */ AudioBankSample* unk_B68[1]; // unknown size.
/* 0x0B6C */ char unk_B6C[0x1E8];
/* 0x0D54 */ AudioStruct0D68 unk_0D54[129]; // guessing at size
/* 0x1768 */ s32 unk_1768;
/* 0x176C */ s32 unk_176C;
/* 0x1770 */ char unk_1770[0xEB0];
/* 0x2620 */ s32 gSampleDmaNumListItems;
/* 0x2624 */ char unk_2624[0x210];
/* 0x2834 */ s16* unk_2834;
/* 0x2838 */ ManyStruct_800E0E0C_2* unk_2838;
/* 0x283C */ u8* unk_283C;
/* 0x2840 */ char unk_2840[0x4];
/* 0x2844 */ CtlEntry* gCtlEntries;
/* 0x2848 */ AudioBufferParameters gAudioBufferParameters;
/* 0x1770 */ AsyncLoadReq asyncReqs[0x10];
/* 0x1CF0 */ OSMesgQueue asyncLoadQueue;
/* 0x1D08 */ char unk_1D08[0x40];
/* 0x1D48 */ AsyncLoadReq* curAsyncReq;
/* 0x1D4C */ u32 syncLoadPos;
/* 0x1D50 */ AudioSyncLoad syncLoads[2];
/* 0x1E18 */ OSPiHandle* cartHandle;
/* probably an unused PI handle for n64 disk drive */
/* 0x1E1C */ OSPiHandle* unk_1E1C;
/* 0x1E20 */ OSMesgQueue unk_1E20;
/* 0x1E38 */ OSMesg unk_1E38;
/* 0x1E38 */ char unk_1E3C[0x3C];
/* 0x1E78 */ OSMesgQueue unk_1E78;
/* 0x1E90 */ OSMesg unk_1E90;
/* 0x1E94 */ char unk_1E94[0x3C];
/* 0x1ED0 */ OSMesgQueue unk_1ED0;
/* 0x1EE8 */ OSMesg unk_1EE8;
/* 0x1EEC */ char unk_1EEC[0xFC];
/* 0x1FE8 */ OSIoMesg sampIoReq[1]; // unknown size
/* 0x2000 */ char unk_2000[0x5E8];
/* 0x25E8 */ OSMesgQueue unk_25E8;
/* 0x2600 */ OSMesg unk_2600;
/* 0x2604 */ OSIoMesg unk_2604;
/* 0x261C */ SampleDmaReq* sampleDmaReqs;
/* 0x2620 */ u32 sampleDmaReqCnt;
/* 0x2624 */ u32 unk_2624; // sample start idx?
/* 0x2628 */ s32 unk_2628;
/* 0x262C */ u8 unk_262C[0x100];
/* 0x272C */ u8 unk_272C[0x100];
/* 0x282C */ u8 unk_282C;
/* 0x282D */ u8 unk_282D;
/* 0x282E */ u8 unk_282E;
/* 0x282F */ u8 unk_282F;
/* 0x2830 */ SequenceTable* sequenceTable;
/* 0x2834 */ AudioBankTable* audioBankTable;
/* 0x2838 */ AudioTable* audioTable;
union {
/* 0x283C */ u16* unk_283C;
/* 0x283C */ char* unk_283Cb;
};
/* 0x2840 */ u16 seqTabEntCnt; // channels used?
/* 0x2844 */ CtlEntry* ctlEntries;
/* 0x2848 */ AudioBufferParameters audioBufferParameters;
/* 0x2870 */ f32 unk_2870;
/* 0x2874 */ s32 unk_2874;
/* 0x2874 */ s32 unk_2878;
/* 0x287C */ char unk_287C[0x14];
/* 0x2890 */ s32 gMaxAudioCmds;
/* 0x2894 */ s32 gMaxSimultaneousNotes; // (bad name)
/* 0x2898 */ s16 gTempoInternalToExternal;
/* 0x289A */ s8 gSoundMode;
/* 0x289B */ char unk_289B[0xD];
/* 0x28A8 */ s32 unk_28A8;
/* 0x28AC */ u64* gAudioCmdBuffers[2];
/* 0x28B4 */ char unk_28B4[0xAC];
/* 0x287C */ char unk_287C[0x10];
/* 0x288C */ s32 unk_288C;
/* 0x2890 */ s32 maxAudioCmds;
/* 0x2894 */ s32 maxSimultaneousNotes; // (bad name)
/* 0x2898 */ s16 tempoInternalToExternal;
/* 0x289A */ s8 soundMode;
/* 0x289C */ s32 totalTaskCnt;
/* 0x28A0 */ s32 sampleIoReqIdx;
/* 0x28A4 */ s32 rspTaskIdx;
/* 0x28A8 */ s32 curAIBufIdx;
/* 0x28AC */ u64* abiCmdBufs[2];
/* 0x28B4 */ u64* curAbiCmdBuf;
/* 0x28B8 */ AudioTask* currTask;
/* 0x28BC */ char unk_28BC[0x4];
/* 0x28C0 */ AudioTask rspTask[2];
/* 0x2960 */ f32 unk_2960;
/* 0x2964 */ s32 gRefreshRate;
/* 0x2968 */ s16* unk_2968[3];
/* 0x2974 */ s16 unk_2974[3];
/* 0x297C */ u32 gAudioRandom;
/* 0x2980 */ s32 gAudioErrorFlags;
/* 0x2984 */ char unk_2984[0xC];
/* 0x2990 */ SoundAllocPool gAudioSessionPool;
/* 0x29A0 */ SoundAllocPool gUnkPool;
/* 0x29B0 */ SoundAllocPool gAudioInitPool;
/* 0x29C0 */ SoundAllocPool gNotesAndBuffersPool;
/* 0x2964 */ s32 refreshRate;
/* 0x2968 */ s16* aiBuffers[3];
/* 0x2974 */ s16 aiBufLengths[3];
/* 0x297C */ u32 audioRandom;
/* 0x2980 */ s32 audioErrorFlags;
/* 0x2984 */ volatile u32 resetTimer;
/* 0x2988 */ char unk_2988[0x8];
/* 0x2990 */ SoundAllocPool audioSessionPool;
/* 0x29A0 */ SoundAllocPool unkPool;
/* 0x29B0 */ SoundAllocPool audioInitPool;
/* 0x29C0 */ SoundAllocPool notesAndBuffersPool;
/* 0x29D0 */ char unk_29D0[0x20]; // probably two unused pools
/* 0x29F0 */ SoundAllocPool gSeqAndBankPool;
/* 0x2A00 */ SoundAllocPool gPersistentCommonPool;
/* 0x2A10 */ SoundAllocPool gTemporaryCommonPool;
/* 0x2A20 */ SoundMultiPool gSeqLoadedPool;
/* 0x2B30 */ SoundMultiPool gBankLoadedPool;
/* 0x2C40 */ SoundMultiPool gUnusedLoadedPool; // rename after we figure out what this is
/* 0x29F0 */ SoundAllocPool seqAndBankPool;
/* 0x2A00 */ SoundAllocPool persistentCommonPool;
/* 0x2A10 */ SoundAllocPool temporaryCommonPool;
/* 0x2A20 */ SoundMultiPool seqLoadedPool;
/* 0x2B30 */ SoundMultiPool bankLoadedPool;
/* 0x2C40 */ SoundMultiPool unusedLoadedPool; // rename after we figure out what this is
/* 0x2D50 */ SoundAllocPool unk_2D50;
/* 0x2D60 */ SeqOrBankEntry unk_2D60[32];
/* 0x2EE0 */ UnkPool unk_2EE0;
/* 0x3174 */ UnkPool unk_3174;
/* 0x3408 */ AudioPoolSplit4 sSessionPoolSplit;
/* 0x3418 */ AudioPoolSplit2 sSeqAndBankPoolSplit;
/* 0x3420 */ AudioPoolSplit3 sPersistentCommonPoolSplit;
/* 0x342C */ AudioPoolSplit3 sTemporaryCommonPoolSplit;
/* 0x3438 */ u8 gUnusedLoadStatus[0x30];
/* 0x3468 */ u8 gBankLoadStatus[0x30];
/* 0x3498 */ u8 gSeqLoadStatus[0x80];
/* 0x3518 */ volatile u8 gAudioResetStatus;
/* 0x3519 */ u8 gAudioResetPresetIdToLoad;
/* 0x351C */ s32 gAudioResetFadeOutFramesLeft;
/* 0x3408 */ AudioPoolSplit4 sessionPoolSplit;
/* 0x3418 */ AudioPoolSplit2 seqAndBankPoolSplit;
/* 0x3420 */ AudioPoolSplit3 persistentCommonPoolSplit;
/* 0x342C */ AudioPoolSplit3 temporaryCommonPoolSplit;
/* 0x3438 */ u8 audioTableLoadStatus[0x30];
/* 0x3468 */ u8 bankLoadStatus[0x30];
/* 0x3498 */ u8 seqLoadstatus[0x80];
/* 0x3518 */ volatile u8 resetStatus;
/* 0x3519 */ u8 audioResetPresetIdToLoad;
/* 0x351C */ s32 audioResetFadeOutFramesLeft;
/* 0x3520 */ f32* unk_3520;
/* 0x3524 */ u8* gAudioHeap;
/* 0x3528 */ u32 gAudioHeapSize;
/* 0x352C */ Note* gNotes;
/* 0x3530 */ SequencePlayer gSequencePlayers[4];
/* 0x3AB0 */ SequenceChannelLayer gSequenceLayers[64];
/* 0x5AB0 */ SequenceChannel gSequenceChannelNone;
/* 0x5B84 */ s32 gNoteSubEuOffset;
/* 0x5B88 */ AudioListItem gLayerFreeList;
} AudioContext; // size >= 0x5c50
/* 0x3524 */ u8* audioHeap;
/* 0x3528 */ u32 audioHeapSize;
/* 0x352C */ Note* notes;
/* 0x3530 */ SequencePlayer seqPlayers[4];
/* 0x3AB0 */ SequenceChannelLayer sequenceLayers[64];
/* 0x5AB0 */ SequenceChannel sequenceChannelNone;
/* 0x5B84 */ s32 noteSubEuOffset;
/* 0x5B88 */ AudioListItem layerFreeList;
/* 0x5B98 */ NotePool noteFreeLists;
/* 0x5BD8 */ u8 cmdWrPos;
/* 0x5BD9 */ u8 cmdRdPos;
/* 0x5BDA */ u8 cmdQueueFinished;
/* 0x5BDB */ char unk_5BDB[0x1];
/* 0x5BDC */ u16 unk_5BDC[4];
/* 0x5BE4 */ OSMesgQueue* audioResetQueueP;
/* 0x5BE8 */ OSMesgQueue* taskStartQueueP;
/* 0x5BEC */ OSMesgQueue* cmdProcQueueP;
/* 0x5BF0 */ OSMesgQueue taskStartQueue;
/* 0x5C08 */ OSMesgQueue cmdProcQueue;
/* 0x5C20 */ OSMesgQueue audioResetQueue;
/* 0x5C38 */ OSMesg taskStartMsgs[1];
/* 0x5C3C */ OSMesg audioResetMesgs[1];
/* 0x5C40 */ OSMesg cmdProcMsgs[4];
/* 0x5C50 */ AudioCmd cmdBuf[0x100];
} AudioContext; // size = 0x6450
typedef struct {
/* 0x00 */ u8 reverb; // i.e. volume
@ -765,6 +1021,65 @@ typedef struct {
/* 0x16 */ u16 unk_16;
} Reverb; // size >= 0x18
typedef struct {
/* 0x0000 */ u32 heap;
/* 0x0004 */ u32 mainPool;
/* 0x0008 */ u32 initPool;
} AudioContextInitSizes; // size = 0xC
typedef struct {
/* 0x0000 */ f32 unk_00;
/* 0x0004 */ f32 unk_04;
/* 0x0008 */ f32 unk_08;
/* 0x000C */ u16 unk_0C;
/* 0x0010 */ f32 unk_10;
/* 0x0014 */ f32 unk_14;
/* 0x0018 */ f32 unk_18;
/* 0x001C */ u16 unk_1C;
} unk_50_s; // size = 0x20
typedef struct {
/* 0x0000 */ f32 volCur;
/* 0x0004 */ f32 volTarget;
/* 0x0008 */ f32 unk_08;
/* 0x000C */ u16 unk_0C;
/* 0x000E */ u8 volScales[0x4];
/* 0x0012 */ u8 volFadeTimer;
/* 0x0013 */ u8 fadeVolUpdate;
/* 0x0014 */ u32 unk_14;
/* 0x0018 */ u16 unk_18;
/* 0x001C */ f32 unk_1C;
/* 0x0020 */ f32 unk_20;
/* 0x0024 */ f32 unk_24;
/* 0x0028 */ u16 unk_28;
/* 0x002A */ char unk_2A[0x2];
/* 0x002C */ u32 unk_2C[8];
/* 0x004C */ u8 unk_4C;
/* 0x004D */ u8 unk_4D;
/* 0x004E */ u8 unk_4E;
/* 0x004F */ char unk_4F;
/* 0x0050 */ unk_50_s unk_50[0x10];
/* 0x0250 */ u16 unk_250;
/* 0x0252 */ u16 unk_252;
/* 0x0254 */ u16 unk_254;
/* 0x0256 */ u16 unk_256;
/* 0x0258 */ u16 unk_258;
/* 0x025A */ char unk_25A[0x2];
/* 0x025C */ u32 unk_25C;
/* 0x0260 */ u8 unk_260;
/* 0x0261 */ char unk_261[0x3];
} unk_D_8016E750; // size = 0x264
typedef enum {
BANK_PLAYER,
BANK_ITEM,
BANK_ENV,
BANK_ENEMY,
BANK_SYSTEM,
BANK_OCARINA,
BANK_VOICE
} SoundBankTypes;
typedef struct {
/* 0x00 */ f32* posX;
/* 0x04 */ f32* posY;
@ -772,7 +1087,7 @@ typedef struct {
/* 0x0C */ u8 unk_C;
/* 0x10 */ f32* unk_10;
/* 0x14 */ f32* unk_14;
/* 0x18 */ f32* unk_18;
/* 0x18 */ s8* unk_18;
/* 0x1C */ f32 unk_1C;
/* 0x20 */ u32 unk_20;
/* 0x24 */ u8 unk_24;
@ -808,4 +1123,62 @@ typedef struct {
#define SFX_INDEX(sfxId) ((sfxId) & 0x01FF)
#define SFX_BANK(sfxId) SFX_BANK_SHIFT(SFX_BANK_MASK(sfxId))
typedef struct {
u32 unk_0;
u8 unk_4;
} Struct_800F7CEC;
typedef struct {
u8 unk_0;
u16 unk_2;
} Struct_8013331C;
typedef struct {
/* 0x0000 */ u8 noteIdx;
/* 0x0001 */ u8 unk_01;
/* 0x0002 */ u16 unk_02;
/* 0x0004 */ u8 volume;
/* 0x0005 */ u8 vibrato;
/* 0x0006 */ s8 tone;
/* 0x0007 */ u8 semitone;
} OcarinaNote; // size = 0x8
typedef struct {
/* 0x0000 */ OcarinaNote notes[20];
} OcarinaSong; // size = 0xA0
#define Audio_DisableSeq(seqIdx, fadeOut) Audio_QueueCmdS32(0x83000000 | ((u8)seqIdx << 16), fadeOut)
#define Audio_Cmd82(seqIdx, a, b) Audio_QueueCmdS32(0x82000000 | ((u8)seqIdx << 16) | ((u8)a << 8), b)
#define Audio_StartSeq(seqIdx, fadeTimer, seqId) Audio_QueueSeqCmd(0x00000000 | ((u8)seqIdx << 24) | ((u8)(fadeTimer) << 0x10) | (u16)seqId)
#define Audio_SeqCmd7(seqIdx, a, b) Audio_QueueSeqCmd(0x70000000 | ((u8)seqIdx << 0x18) | ((u8)a << 0x10) | (u8)(b))
#define Audio_SeqCmdC(seqIdx, a, b, c) Audio_QueueSeqCmd(0xC0000000 | ((u8)seqIdx << 24) | ((u8)a << 16) | ((u8)b << 8) | ((u8)(c)))
#define Audio_SeqCmdA(seqIdx, a) Audio_QueueSeqCmd(0xA0000000 | ((u8)seqIdx << 24) | ((u16)(a)))
#define Audio_SeqCmd1(seqIdx, a) Audio_QueueSeqCmd(0x100000FF | ((u8)seqIdx << 24) | ((u8)(a) << 16))
#define Audio_SeqCmdB(seqIdx, a, b, c) Audio_QueueSeqCmd(0xB0000000 | ((u8)seqIdx << 24) | ((u8)a << 16) | ((u8)b << 8) | ((u8)c))
#define Audio_SeqCmdB30(seqIdx, a, b) Audio_QueueSeqCmd(0xB0003000 | ((u8)seqIdx << 24) | ((u8)a << 16) | ((u8)b))
#define Audio_SeqCmdB40(seqIdx, a, b) Audio_QueueSeqCmd(0xB0004000 | ((u8)seqIdx << 24) | ((u8)a << 16) | ((u8)b))
#define Audio_SeqCmd6(seqIdx, a, b, c) Audio_QueueSeqCmd(0x60000000 | ((u8)seqIdx << 24) | ((u8)(a) << 16) | ((u8)b << 8) | ((u8)c))
#define Audio_SeqCmdE0(seqIdx, a) Audio_QueueSeqCmd(0xE0000000 | ((u8)seqIdx << 24) | ((u8)a))
#define Audio_SeqCmdE01(seqIdx, a) Audio_QueueSeqCmd(0xE0000100 | ((u8)seqIdx << 24) | ((u16)a))
#define Audio_SeqCmd8(seqIdx, a, b, c) Audio_QueueSeqCmd(0x80000000 | ((u8)seqIdx << 24) | ((u8)a << 16) | ((u8)b << 8) | ((u8)c))
#define Audio_SeqCmd3(seqIdx, a) Audio_QueueSeqCmd(0x80000000 | ((u8)seqIdx << 24) | ((u16)a))
#define Audio_SeqCmd5(seqIdx, a, b) Audio_QueueSeqCmd(0x50000000 | ((u8)seqIdx << 24) | ((u8)a << 16) | ((u16)(b)))
#define Audio_SeqCmd4(seqIdx, a, b) Audio_QueueSeqCmd(0x40000000 | ((u8)seqIdx << 24) | ((u8)a << 16) | ((u8)(b)))
#define Audio_SeqCmdF(seqIdx, a) Audio_QueueSeqCmd(0xF0000000 | ((u8)seqIdx << 24) | ((u8)a))
#define Unk2C_B8(v) (((v & 0x00F00000) >> 20))
#define Unk2C_B12(v) (((v & 0x000F0000) >> 16))
#define Unk2C_B16(v) (((v & 0x0000FF00) >> 8))
#define Unk2C_B24(v) (((v & 0x000000FF) >> 0))
typedef struct {
u8 len;
u8 notesIdx[8];
} OcarinaSongInfo;
typedef struct {
u8 noteIdx;
u8 state;
u8 pos;
} OcarinaStaff;
#endif