diff --git a/include/functions.h b/include/functions.h index f8d57ad120..ff0a9985ec 100644 --- a/include/functions.h +++ b/include/functions.h @@ -3195,51 +3195,24 @@ void AudioSeq_InitSequencePlayerChannels(s32 playerIndex); void AudioSeq_InitSequencePlayers(void); void func_8019AE40(s32 param_1, s32 param_2, u32 param_3, s32 param_4); void func_8019AEC0(UNK_PTR param_1, UNK_PTR param_2); -// void func_8019AF00(void); -// void func_8019AF58(void); -// void func_8019AFE8(void); -// void func_8019B02C(void); -// void AudioOcarina_MapSongFromNotesToButtons(void); -// void func_8019B144(void); -// void func_8019B378(void); -// void func_8019B38C(void); -// void func_8019B3D0(void); -// void func_8019B4B8(void); -void AudioOcarina_StartDefault(u32 arg0); -// void func_8019B568(void); -// void func_8019B5AC(void); -// void func_8019B5EC(void); -// void func_8019B618(void); -// void func_8019B654(void); -// void func_8019B6B4(void); -// void func_8019BC44(void); -// void func_8019BE98(void); -// void func_8019C1D0(void); -// void func_8019C268(void); -// void func_8019C2E4(void); -u32 AudioOcarina_SetInstrumentId(u8 arg0); -// void func_8019C398(void); -// void func_8019C5A0(void); -// void func_8019C8D8(void); -// void func_8019CD08(void); -// void func_8019CE34(void); -// void func_8019CE6C(void); -// void func_8019CEBC(void); -// void func_8019CF6C(void); -// void func_8019CF78(void); + +void AudioOcarina_SetSongStartingPos(void); +void AudioOcarina_StartAtSongStartingPos(u32 ocarinaFlags); +void AudioOcarina_StartForSongCheck(u32 ocarinaFlags, u8 ocarinaStaffPlayingPosStart); +void AudioOcarina_StartWithSongNoteLengths(u32 ocarinaFlags); +void AudioOcarina_StartDefault(u32 ocarinaFlags); +u8 func_8019B5AC(void); +void AudioOcarina_ResetAndReadInput(void); +void AudioOcarina_SetOcarinaDisableTimer(u8 resetUnused, u8 resetDelay); +u32 AudioOcarina_SetInstrument(u8 ocarinaInstrumentId); +void AudioOcarina_SetPlaybackSong(s8 songIndexPlusOne, u8 playbackState); +void AudioOcarina_SetRecordingState(u8 recordingState); +OcarinaStaff* AudioOcarina_GetRecordingStaff(void); +OcarinaStaff* AudioOcarina_GetPlayingStaff(void); OcarinaStaff* AudioOcarina_GetPlaybackStaff(void); -// void func_8019CFA8(void); -// void AudioOcarina_TerminaWallValidateNotes(void); void AudioOcarina_TerminaWallGenerateNotes(void); -// void AudioOcarina_MemoryGameSetNumNotes(void); -// void AudioOcarina_MemoryGameGenerateNotes(void); -// void func_8019D600(void); -void func_8019D758(void); -// void func_8019D864(void); -// void func_8019D8B4(void); -// void func_8019D8E4(void); -// void func_8019DF28(void); -// void func_8019DF64(void); +void AudioOcarina_PlayLongScarecrowAfterCredits(void); + void func_8019E014(void); // void func_8019E110(void); // void func_8019E14C(void); @@ -3365,7 +3338,7 @@ void func_801A4058(UNK_TYPE arg0); // void func_801A42C8(void); // void func_801A4324(void); // void func_801A4348(void); -// void func_801A4380(void); +void Audio_SetSfxVolumeExceptSystemAndOcarinaBanks(u8 arg0); void func_801A4428(u8 reverbIndex); void Audio_PreNMI(void); // void func_801A44C4(void); @@ -3402,9 +3375,9 @@ UNK_TYPE func_801A51F0(UNK_TYPE arg0); // void func_801A5808(void); // void func_801A5A10(void); // void func_801A5A1C(void); -void func_801A5BD0(s32 param_1); -// void func_801A5C28(void); -// void func_801A5C8C(void); +void Audio_SetSfxBanksMute(u16 muteMask); +void Audio_SetFlagForBgmVolumeLow(u8 channelIndex); +void Audio_ClearFlagForBgmVolumeLow(u8 channelIndex); void Audio_PlaySfxGeneral(u16 sfxId, Vec3f* param_2, u8 param_3, f32* param_4, f32* param_5, s8* param_6); // void func_801A5DDC(void); // void func_801A5F7C(void); @@ -3417,7 +3390,7 @@ void func_801A7084(u8 bankId); void Audio_StopSfxByPos(Vec3f* pos); void func_801A7328(Vec3f* pos, u16 sfxId); // void func_801A7484(void); -void func_801A75E8(u16 sfxId); +void Audio_StopSfxById(u16 sfxId); // void func_801A7720(void); void func_801A7794(u32 param_1, u32 param_2, u32 param_3); // void func_801A7828(void); diff --git a/include/variables.h b/include/variables.h index f46c1babfa..f908fd43a6 100644 --- a/include/variables.h +++ b/include/variables.h @@ -1553,7 +1553,7 @@ extern s16 gHighPassFilterData[]; extern s16 gBandStopFilterData[]; extern s16 gBandPassFilterData[]; extern s16* gWaveSamples[9]; -extern f32 gBendPitchOneOctaveFrequencies[256]; +extern f32 gBendPitchOneOctaveFrequencies[]; extern f32 gBendPitchTwoSemitonesFrequencies[]; extern f32 gPitchFrequencies[]; extern u8 gDefaultShortNoteVelocityTable[]; @@ -1649,8 +1649,8 @@ extern f32 gSfxVolume; // extern UNK_TYPE1 D_801D6FD8; // extern UNK_TYPE1 D_801D6FDC; // extern UNK_TYPE1 D_801D6FE0; -// extern UNK_TYPE1 D_801D6FE4; -// extern UNK_TYPE1 D_801D6FE8; +// extern UNK_TYPE1 sPlaybackStaffStopPos; +// extern UNK_TYPE1 sPlaybackStaffStartPos; // extern UNK_TYPE4 D_801D6FEC; // extern UNK_TYPE4 D_801D6FF0; // extern UNK_TYPE2 D_801D6FF4; @@ -1731,14 +1731,14 @@ extern UNK_PTR D_801DB478[7]; // extern UNK_TYPE1 D_801DB494; // extern UNK_TYPE1 D_801DB49C; // extern UNK_TYPE2 D_801DB4A0; -extern Vec3f D_801DB4A4; +extern Vec3f gSfxDefaultPos; extern f32 D_801DB4B0; -extern s8 D_801DB4B8; +extern s8 gSfxDefaultReverb; // extern UNK_TYPE1 D_801DB4C0; // extern UNK_TYPE1 D_801DB4C4; // extern UNK_TYPE1 D_801DB4C8; // extern UNK_TYPE1 D_801DB4CC; -// extern UNK_TYPE1 D_801DB4D4; +extern u8 gAudioSpecId; // extern UNK_TYPE1 D_801DB4D8; // extern UNK_TYPE4 D_801DB4DC; // extern UNK_TYPE1 D_801DB4E0; diff --git a/include/z64ocarina.h b/include/z64ocarina.h index 8cc82b51a4..597580388c 100644 --- a/include/z64ocarina.h +++ b/include/z64ocarina.h @@ -26,10 +26,10 @@ typedef enum { /* 19 */ OCARINA_SONG_EVAN_PART1, /* 20 */ OCARINA_SONG_EVAN_PART2, /* 21 */ OCARINA_SONG_ZELDAS_LULLABY, - /* 22 */ OCARINA_SONG_SCARECROW, + /* 22 */ OCARINA_SONG_SCARECROW_SPAWN, /* 23 */ OCARINA_SONG_TERMINA_WALL, /* 24 */ OCARINA_SONG_MAX, - /* 24 */ OCARINA_SONG_SCARECROW_LONG = OCARINA_SONG_MAX + /* 24 */ OCARINA_SONG_SCARECROW_LONG = OCARINA_SONG_MAX // anything larger than 24 is considered the long scarecrow's song } OcarinaSongId; typedef enum { @@ -38,6 +38,7 @@ typedef enum { /* 2 */ OCARINA_BTN_C_RIGHT, /* 3 */ OCARINA_BTN_C_LEFT, /* 4 */ OCARINA_BTN_C_UP, + /* 5 */ OCARINA_BTN_C_RIGHT_OR_C_LEFT, /* -1 */ OCARINA_BTN_INVALID = 0xFF } OcarinaButtonIndex; @@ -92,15 +93,19 @@ typedef enum { } OcarinaRecordingState; /** - * BFlat4Flag Note: + * bFlat4Flag Note: * Flag for resolving whether (pitch = OCARINA_PITCH_BFLAT4) * gets mapped to either C_RIGHT and C_LEFT * * This is required as C_RIGHT and C_LEFT are the only notes - * that map to two semitones apart (NOTE_A4 and NOTE_B4) + * that map to two semitones apart (OCARINA_PITCH_A4 and OCARINA_PITCH_B4) * 0x40 - BTN_Z is pressed to lower note by a semitone * 0x80 - BTN_R is pressed to raise note by a semitone */ +#define OCARINA_BUTTON_MASK_PITCH 0x3F +#define OCARINA_BUTTON_MASK_FLAG 0xC0 +#define OCARINA_BUTTON_FLAG_BFLAT_LOWER 0x40 +#define OCARINA_BUTTON_FLAG_BFLAT_RAISE 0x80 typedef struct { /* 0x0 */ u8 pitch; // number of semitones above middle C @@ -108,7 +113,7 @@ typedef struct { /* 0x4 */ u8 volume; /* 0x5 */ u8 vibrato; /* 0x6 */ s8 bend; // frequency multiplicative offset from the pitch defined by pitch - /* 0x7 */ u8 BFlat4Flag; // See note above + /* 0x7 */ u8 bFlat4Flag; // See note above } OcarinaNote; // size = 0x8 typedef struct { diff --git a/include/z64save.h b/include/z64save.h index 43260b2777..103fe6a536 100644 --- a/include/z64save.h +++ b/include/z64save.h @@ -167,7 +167,7 @@ typedef struct Save { /* 0x0F60 */ u32 mapsVisible; // "cloud_clear" /* 0x0F64 */ u8 unk_F64; // "oca_rec_flag" has scarecrows song /* 0x0F65 */ u8 unk_F65; // "oca_rec_flag8" scarecrows song set? - /* 0x0F66 */ u8 scarecrowsSong[128]; + /* 0x0F66 */ u8 scarecrowSpawnSong[128]; /* 0x0FE6 */ s8 bombersCaughtNum; // "aikotoba_index" /* 0x0FE7 */ s8 bombersCaughtOrder[5]; // "aikotoba_table" /* 0x0FEC */ s8 lotteryCodes[3][3]; // "numbers_table", Preset lottery codes diff --git a/src/code/audio/code_8019AF00.c b/src/code/audio/code_8019AF00.c index 2e7cc91e17..65c3a6de89 100644 --- a/src/code/audio/code_8019AF00.c +++ b/src/code/audio/code_8019AF00.c @@ -66,7 +66,7 @@ typedef struct { /* 0xC */ s32 remainingFrames; } FreqLerp; // size = 0x10 -s32 AudioOcarina_MemoryGameGenerateNotes(void); +s32 AudioOcarina_MemoryGameNextNote(void); s32 Audio_SetGanonsTowerBgmVolume(u8 targetVolume); void func_801A3238(s8 playerIndex, u16 seqId, u8 fadeTimer, s8 arg3, u8 arg4); @@ -131,18 +131,18 @@ u16 D_801FD438; OcarinaStaff sPlayingStaff; OcarinaStaff sPlaybackStaff; OcarinaStaff sRecordingStaff; -u32 sOcarinaUpdateTaskCurrent; +u32 sOcarinaUpdateTaskStart; OcarinaControlStick sOcarinaInputStickRel; u32 sOcarinaInputButtonCur; u32 sOcarinaInputButtonStart; u32 sOcarinaInputButtonPrev; -s32 sOcaInputBtnPress; -u8 sOcarinaResetDelay; -u8 sOcarinaResetUnused; +s32 sOcarinaInputButtonPress; +u8 sOcarinaDisableTimer; +u8 sOcarinaUnused; u8 sOcarinaHasStartedSong; u8 sFirstOcarinaSongIndex; u8 sLastOcarinaSongIndex; -u32 sOcarinaAvailSongs; +u32 sOcarinaAvailableSongFlags; u8 sOcarinaStaffPlayingPos; u16 sMusicStaffPos[OCARINA_SONG_MAX]; u16 sMusicStaffCurHeldLength[OCARINA_SONG_MAX]; @@ -150,7 +150,7 @@ u16 sMusicStaffExpectedLength[OCARINA_SONG_MAX]; u8 sMusicStaffExpectedPitch[OCARINA_SONG_MAX]; // Next required pitch in song playback u8 D_801FD518[OCARINA_SONG_MAX]; u32 D_801FD530[OCARINA_SONG_MAX]; -OcarinaNote sRecordingSongNote; +OcarinaNote sScarecrowsLongSongSecondNote; u16 sCustomSequencePc; // Sfx Data @@ -987,35 +987,35 @@ NatureAmbienceDataIO sNatureAmbienceData[20] = { u8 sIsOcarinaInputEnabled = false; s8 sOcarinaInstrumentId = OCARINA_INSTRUMENT_OFF; u8 sCurOcarinaPitch = OCARINA_PITCH_NONE; -u8 sPrevOcarinaPitch = 0; -u8 sCurOcarinaButtonIndex = 0; -u8 sMusicStaffPrevPitch = 0; +u8 sPrevOcarinaPitch = OCARINA_PITCH_C4; +u8 sCurOcarinaButtonIndex = OCARINA_BTN_A; +u8 sMusicStaffPrevPitch = OCARINA_PITCH_C4; f32 sCurOcarinaBendFreq = 1.0f; -f32 sDefaultOcarinaVolume = 0.68503935f; +f32 sDefaultOcarinaVolume = 87.0f / 127.0f; s8 sCurOcarinaBendIndex = 0; -s8 sCurOcarinaVolume = 0x57; +s8 sCurOcarinaVolume = 87; s8 sCurOcarinaVibrato = 0; u8 sPlaybackState = 0; -u8 D_801D6FE4 = 0xFF; -u8 D_801D6FE8 = 0xFF; +u8 sPlaybackStaffStopPos = 0xFF; +u8 sPlaybackStaffStartPos = 0xFF; u32 sOcarinaFlags = 0; s32 sPlaybackNoteTimer = 0; u16 sPlaybackNotePos = 0; u16 sPlaybackStaffPos = 0; -u32 sPrevOcarinaSongFlags = 0; // Stores sOcarinaFlags but never used -u8 sPlaybackNoteValue = OCARINA_PITCH_NONE; +u32 sPrevOcarinaWithMusicStaffFlags = 0; // Stores sOcarinaFlags but never used +u8 sPlaybackPitch = OCARINA_PITCH_NONE; // Pitch + PitchFlags u8 sNotePlaybackVolume = 0; u8 sNotePlaybackVibrato = 0; s8 sNotePlaybackBend = 0; -f32 sNormalizedNotePlaybackTone = 1.0f; -f32 sNormalizedNotePlaybackVolume = 1.0f; +f32 sRelativeNotePlaybackBend = 1.0f; +f32 sRelativeNotePlaybackVolume = 1.0f; u32 sOcarinaPlaybackTaskStart = 0; u32 sOcarinaWallCounter = 0; -u8 sCurOcarinaSong[8] = { +u8 sCurOcarinaSongWithoutMusicStaff[8] = { OCARINA_PITCH_C4, OCARINA_PITCH_C4, OCARINA_PITCH_C4, OCARINA_PITCH_C4, OCARINA_PITCH_C4, OCARINA_PITCH_C4, OCARINA_PITCH_C4, OCARINA_PITCH_C4, }; -u8 sOcarinaSongAppendPos = 0; +u8 sOcarinaWithoutMusicStaffPos = 0; u8 sOcarinaSongStartingPos = 0; u8 sButtonToPitchMap[5] = { @@ -1027,10 +1027,10 @@ u8 sButtonToPitchMap[5] = { }; u8 sOcarinaMemoryGameAppendPos = 0; -u8 sOcaMemoryGameEndPos = 0; -u8 sOcaMemoryGameNumNotes[] = { 5, 6, 8 }; +u8 sOcarinaMemoryGameEndPos = 0; +u8 sOcarinaMemoryGameNumNotes[] = { 5, 6, 8 }; OcarinaNote sOcarinaSongNotes[OCARINA_SONG_MAX][20] = { - // 0: Sonata of Awakening + // OCARINA_SONG_SONATA { { OCARINA_PITCH_D5, 19, 92, 0, 0, 0 }, { OCARINA_PITCH_B4, 19, 90, 0, 0, 0 }, @@ -1042,7 +1042,7 @@ OcarinaNote sOcarinaSongNotes[OCARINA_SONG_MAX][20] = { { OCARINA_PITCH_NONE, 0, 86, 0, 0, 0 }, }, - // 1: Goron Lullaby + // OCARINA_SONG_GORON_LULLABY { { OCARINA_PITCH_D4, 41, 80, 0, 0, 0 }, { OCARINA_PITCH_A4, 40, 72, 0, 0, 0 }, @@ -1056,7 +1056,7 @@ OcarinaNote sOcarinaSongNotes[OCARINA_SONG_MAX][20] = { { OCARINA_PITCH_NONE, 0, 66, 0, 0, 0 }, }, - // 2: New Wave Bossa Nova + // OCARINA_SONG_NEW_WAVE { { OCARINA_PITCH_B4, 64, 74, 0, 0, 0 }, { OCARINA_PITCH_D5, 13, 88, 0, 0, 0 }, @@ -1068,7 +1068,7 @@ OcarinaNote sOcarinaSongNotes[OCARINA_SONG_MAX][20] = { { OCARINA_PITCH_NONE, 0, 90, 0, 0, 0 }, }, - // 3: Elegy of Emptyness + // OCARINA_SONG_ELEGY { { OCARINA_PITCH_A4, 85, 93, 0, 0, 0 }, { OCARINA_PITCH_B4, 43, 91, 0, 0, 0 }, @@ -1080,7 +1080,7 @@ OcarinaNote sOcarinaSongNotes[OCARINA_SONG_MAX][20] = { { OCARINA_PITCH_NONE, 0, 94, 0, 0, 0 }, }, - // 4: Oath to Order + // OCARINA_SONG_OATH { { OCARINA_PITCH_A4, 97, 104, 0, 0, 0 }, { OCARINA_PITCH_F4, 48, 88, 0, 0, 0 }, @@ -1092,7 +1092,7 @@ OcarinaNote sOcarinaSongNotes[OCARINA_SONG_MAX][20] = { }, - // 5: Sarias Song + // OCARINA_SONG_SARIAS { { OCARINA_PITCH_F4, 17, 84, 0, 0, 0 }, { OCARINA_PITCH_A4, 17, 88, 0, 0, 0 }, @@ -1103,7 +1103,7 @@ OcarinaNote sOcarinaSongNotes[OCARINA_SONG_MAX][20] = { { OCARINA_PITCH_NONE, 0, 90, 0, 0, 0 }, }, - // 6: Song of Time + // OCARINA_SONG_TIME { { OCARINA_PITCH_A4, 32, 84, 0, 0, 0 }, { OCARINA_PITCH_D4, 65, 88, 0, 0, 0 }, @@ -1114,7 +1114,7 @@ OcarinaNote sOcarinaSongNotes[OCARINA_SONG_MAX][20] = { { OCARINA_PITCH_NONE, 0, 90, 0, 0, 0 }, }, - // 7: Song of Healing + // OCARINA_SONG_HEALING { { OCARINA_PITCH_B4, 32, 88, 0, 0, 0 }, { OCARINA_PITCH_A4, 33, 88, 0, 0, 0 }, @@ -1126,7 +1126,7 @@ OcarinaNote sOcarinaSongNotes[OCARINA_SONG_MAX][20] = { { OCARINA_PITCH_NONE, 0, 90, 0, 0, 0 }, }, - // 8: Eponas Song + // OCARINA_SONG_EPONAS { { OCARINA_PITCH_D5, 18, 84, 0, 0, 0 }, { OCARINA_PITCH_B4, 18, 88, 0, 0, 0 }, @@ -1137,7 +1137,7 @@ OcarinaNote sOcarinaSongNotes[OCARINA_SONG_MAX][20] = { { OCARINA_PITCH_NONE, 0, 90, 0, 0, 0 }, }, - // 9: Song of Soaring + // OCARINA_SONG_SOARING { { OCARINA_PITCH_F4, 18, 84, 0, 0, 0 }, { OCARINA_PITCH_B4, 18, 80, 0, 0, 0 }, @@ -1148,7 +1148,7 @@ OcarinaNote sOcarinaSongNotes[OCARINA_SONG_MAX][20] = { { OCARINA_PITCH_NONE, 0, 90, 0, 0, 0 }, }, - // 10: Song of Storms + // OCARINA_SONG_STORMS { { OCARINA_PITCH_D4, 11, 84, 0, 0, 0 }, { OCARINA_PITCH_F4, 11, 88, 0, 0, 0 }, @@ -1159,7 +1159,7 @@ OcarinaNote sOcarinaSongNotes[OCARINA_SONG_MAX][20] = { { OCARINA_PITCH_NONE, 0, 90, 0, 0, 0 }, }, - // 11: Suns Song + // OCARINA_SONG_SUNS { { OCARINA_PITCH_A4, 12, 84, 0, 0, 0 }, { OCARINA_PITCH_F4, 13, 88, 0, 0, 0 }, @@ -1171,7 +1171,7 @@ OcarinaNote sOcarinaSongNotes[OCARINA_SONG_MAX][20] = { { OCARINA_PITCH_NONE, 0, 90, 0, 0, 0 }, }, - // 12: Inverted Song of Time + // OCARINA_SONG_INVERTED_TIME { { OCARINA_PITCH_F4, 32, 84, 0, 0, 0 }, { OCARINA_PITCH_D4, 65, 88, 0, 0, 0 }, @@ -1182,7 +1182,7 @@ OcarinaNote sOcarinaSongNotes[OCARINA_SONG_MAX][20] = { { OCARINA_PITCH_NONE, 0, 90, 0, 0, 0 }, }, - // 13: Song of Double Time + // OCARINA_SONG_DOUBLE_TIME { { OCARINA_PITCH_A4, 29, 84, 0, 0, 0 }, { OCARINA_PITCH_NONE, 3, 84, 0, 0, 0 }, @@ -1198,7 +1198,7 @@ OcarinaNote sOcarinaSongNotes[OCARINA_SONG_MAX][20] = { { OCARINA_PITCH_NONE, 0, 0, 0, 0, 0 }, }, - // 14: Goron Lullaby Intro + // OCARINA_SONG_GORON_LULLABY_INTRO { { OCARINA_PITCH_D4, 32, 78, 0, 0, 0 }, { OCARINA_PITCH_A4, 33, 90, 0, 0, 0 }, @@ -1209,7 +1209,7 @@ OcarinaNote sOcarinaSongNotes[OCARINA_SONG_MAX][20] = { { OCARINA_PITCH_NONE, 0, 66, 0, 0, 0 }, }, - // 15: Milk Bar Jam "Ballad of the Wind Fish" Human + // OCARINA_SONG_WIND_FISH_HUMAN { { OCARINA_PITCH_D5, 89, 80, 0, 0, 0 }, { OCARINA_PITCH_A4, 41, 72, 0, 0, 0 }, @@ -1219,7 +1219,7 @@ OcarinaNote sOcarinaSongNotes[OCARINA_SONG_MAX][20] = { { OCARINA_PITCH_NONE, 0, 66, 0, 0, 0 }, }, - // 16: Milk Bar Jam "Ballad of the Wind Fish" Goron + // OCARINA_SONG_WIND_FISH_GORON { { OCARINA_PITCH_D4, 52, 80, 0, 0, 0 }, { OCARINA_PITCH_NONE, 3, 66, 0, 0, 0 }, @@ -1238,7 +1238,7 @@ OcarinaNote sOcarinaSongNotes[OCARINA_SONG_MAX][20] = { { OCARINA_PITCH_NONE, 0, 66, 0, 0, 0 }, }, - // 17: Milk Bar Jam "Ballad of the Wind Fish" Zora + // OCARINA_SONG_WIND_FISH_ZORA { { OCARINA_PITCH_D5, 11, 80, 0, 0, 0 }, { OCARINA_PITCH_A4, 11, 72, 0, 0, 0 }, @@ -1251,7 +1251,7 @@ OcarinaNote sOcarinaSongNotes[OCARINA_SONG_MAX][20] = { { OCARINA_PITCH_NONE, 0, 66, 0, 0, 0 }, }, - // 18: Milk Bar Jam "Ballad of the Wind Fish" Deku + // OCARINA_SONG_WIND_FISH_DEKU { { OCARINA_PITCH_A4, 54, 80, 0, 0, 0 }, { OCARINA_PITCH_D4, 77, 72, 0, 0, 0 }, @@ -1261,7 +1261,7 @@ OcarinaNote sOcarinaSongNotes[OCARINA_SONG_MAX][20] = { { OCARINA_PITCH_NONE, 0, 66, 0, 0, 0 }, }, - // 19: Evan HP (Zora Band Leader) Song Part 1 + // OCARINA_SONG_EVAN_PART1 { { OCARINA_PITCH_A4, 33, 100, 0, 0, 0 }, { OCARINA_PITCH_NONE, 3, 92, 0, 0, 0 }, @@ -1276,7 +1276,7 @@ OcarinaNote sOcarinaSongNotes[OCARINA_SONG_MAX][20] = { { OCARINA_PITCH_NONE, 0, 66, 0, 0, 0 }, }, - // 20: Evan HP (Zora Band Leader) Song Part 2 + // OCARINA_SONG_EVAN_PART2 { { OCARINA_PITCH_B4, 33, 107, 0, 0, 0 }, { OCARINA_PITCH_NONE, 3, 100, 0, 0, 0 }, @@ -1291,7 +1291,7 @@ OcarinaNote sOcarinaSongNotes[OCARINA_SONG_MAX][20] = { { OCARINA_PITCH_NONE, 0, 66, 0, 0, 0 }, }, - // 21: Zeldas Lullaby + // OCARINA_SONG_ZELDAS_LULLABY { { OCARINA_PITCH_B4, 51, 84, 0, 0, 0 }, { OCARINA_PITCH_D5, 25, 88, 0, 0, 0 }, @@ -1302,13 +1302,13 @@ OcarinaNote sOcarinaSongNotes[OCARINA_SONG_MAX][20] = { { OCARINA_PITCH_NONE, 0, 90, 0, 0, 0 }, }, - // 22: Scarecrow + // OCARINA_SONG_SCARECROW_SPAWN { { OCARINA_PITCH_D4, 3, 0, 0, 0, 0 }, { OCARINA_PITCH_NONE, 0, 255, 0, 0, 0 }, }, - // 23: Termina Field 2D Song Buttons Appearing on Wall (In OoT, this is Ocarina Memory Game) + // OCARINA_SONG_TERMINA_WALL { { OCARINA_PITCH_D4, 3, 0, 0, 0, 0 }, { OCARINA_PITCH_NONE, 0, 255, 0, 0, 0 }, @@ -1434,7 +1434,7 @@ u8 sOoTOcarinaSongsNumNotes[] = { 6, // Suns Song }; -OcarinaNote* sPlaybackSong = sOcarinaSongNotes[OCARINA_SONG_SONATA]; +OcarinaNote* sPlaybackSong = sOcarinaSongNotes[0]; u8 sFrogsSongNotes[14] = { OCARINA_BTN_A, OCARINA_BTN_C_LEFT, OCARINA_BTN_C_RIGHT, OCARINA_BTN_C_DOWN, OCARINA_BTN_C_LEFT, OCARINA_BTN_C_RIGHT, OCARINA_BTN_C_DOWN, OCARINA_BTN_A, OCARINA_BTN_C_DOWN, OCARINA_BTN_A, @@ -1453,7 +1453,7 @@ u8 sPlayedOcarinaSongIndexPlusOne = 0; u8 sMusicStaffNumNotesPerTest = 0; u8 D_801D8530 = false; u32 D_801D8534 = 0; -u8 sIsOcarinaNoteChanged = false; +u8 sOcarinaDropInputTimer = 0; OcarinaNote sScarecrowsLongSongNotes[108] = { { OCARINA_PITCH_NONE, 0, 0, 0, 0, 0 }, @@ -1461,38 +1461,81 @@ OcarinaNote sScarecrowsLongSongNotes[108] = { }; OcarinaNote* gScarecrowLongSongPtr = sScarecrowsLongSongNotes; -u8* gScarecrowSpawnSongPtr = (u8*)&sOcarinaSongNotes[OCARINA_SONG_SCARECROW]; +u8* gScarecrowSpawnSongPtr = (u8*)&sOcarinaSongNotes[OCARINA_SONG_SCARECROW_SPAWN]; OcarinaNote* sTerminaWallSongPtr = sOcarinaSongNotes[OCARINA_SONG_TERMINA_WALL]; u8 sPitchToButtonMap[16] = { - OCARINA_BTN_A, // OCARINA_PITCH_C4 - OCARINA_BTN_A, // OCARINA_PITCH_DFLAT4 - OCARINA_BTN_A, // OCARINA_PITCH_D4 - OCARINA_BTN_A, // OCARINA_PITCH_EFLAT4 - OCARINA_BTN_C_DOWN, // OCARINA_PITCH_E4 - OCARINA_BTN_C_DOWN, // OCARINA_PITCH_F4 - OCARINA_BTN_C_DOWN, // OCARINA_PITCH_GFLAT4 - OCARINA_BTN_C_RIGHT, // OCARINA_PITCH_G4 - OCARINA_BTN_C_RIGHT, // OCARINA_PITCH_AFLAT4 - OCARINA_BTN_C_RIGHT, // OCARINA_PITCH_A4 - OCARINA_BTN_C_RIGHT + OCARINA_BTN_C_LEFT, // OCARINA_PITCH_BFLAT4: Interface/Overlap between C_RIGHT and C_LEFT - OCARINA_BTN_C_LEFT, // OCARINA_PITCH_B4 - OCARINA_BTN_C_LEFT, // OCARINA_PITCH_C5 - OCARINA_BTN_C_UP, // OCARINA_PITCH_DFLAT5 - OCARINA_BTN_C_UP, // OCARINA_PITCH_D5 - OCARINA_BTN_C_UP, // OCARINA_PITCH_EFLAT5 + OCARINA_BTN_A, // OCARINA_PITCH_C4 + OCARINA_BTN_A, // OCARINA_PITCH_DFLAT4 + OCARINA_BTN_A, // OCARINA_PITCH_D4 + OCARINA_BTN_A, // OCARINA_PITCH_EFLAT4 + OCARINA_BTN_C_DOWN, // OCARINA_PITCH_E4 + OCARINA_BTN_C_DOWN, // OCARINA_PITCH_F4 + OCARINA_BTN_C_DOWN, // OCARINA_PITCH_GFLAT4 + OCARINA_BTN_C_RIGHT, // OCARINA_PITCH_G4 + OCARINA_BTN_C_RIGHT, // OCARINA_PITCH_AFLAT4 + OCARINA_BTN_C_RIGHT, // OCARINA_PITCH_A4 + OCARINA_BTN_C_RIGHT_OR_C_LEFT, // OCARINA_PITCH_BFLAT4: Interface/Overlap between C_RIGHT and C_LEFT + OCARINA_BTN_C_LEFT, // OCARINA_PITCH_B4 + OCARINA_BTN_C_LEFT, // OCARINA_PITCH_C5 + OCARINA_BTN_C_UP, // OCARINA_PITCH_DFLAT5 + OCARINA_BTN_C_UP, // OCARINA_PITCH_D5 + OCARINA_BTN_C_UP, // OCARINA_PITCH_EFLAT5 }; // seqData written in the music macro language // Only used in unused functions +// clang-format off u8 sCustomSequenceScript[400] = { - 0xFE, 0xFE, 0xD3, 0x20, 0xD7, 0x00, 0x01, 0xCC, 0x00, 0x70, 0x90, 0x00, 0x16, 0xDB, 0x64, 0xDD, 0x78, - 0xFE, 0x00, 0xF3, 0xFC, 0xFF, 0xC3, 0x88, 0x00, 0x29, 0x89, 0x00, 0x2B, 0xDF, 0x7F, 0xE9, 0x0F, 0xDD, - 0x37, 0xD4, 0x40, 0xC1, 0x52, 0xFE, 0x80, 0xF3, 0xFC, 0xFF, 0xC2, 0xFB, 0xC0, 0x00, 0xC1, 0x57, 0xC9, + /* 0 */ 0xFE, // delay1 + /* 1 */ 0xFE, // delay1 + /* 2 */ 0xD3, 0x20, // mutebhv 0x20 + /* 4 */ 0xD7, 0x00, 0x01, // initchan 0x0001 + /* 7 */ 0xCC, 0x00, // ldi 0 + /* 9 */ 0x70, // stio 0 + /* 10 */ 0x90, 0x00, 22, // ldchan 0, chan0 + /* 13 */ 0xDB, 100, // vol 100 + /* 15 */ 0xDD, 120, // tempo 120 + + // .sequence seq_loop + /* 17 */ 0xFE, // delay1 + /* 18 */ 0x00, // testchan 0 + /* 19 */ 0xF3, -4, // rbeqz seq_loop + /* 21 */ 0xFF, // end + + // .channel chan0 + /* 22 */ 0xC3, // short + /* 23 */ 0x88, 0x00, 41, // ldlayer 0, layer0 + /* 26 */ 0x89, 0x00, 43, // ldlayer 1, layer1 + /* 29 */ 0xDF, 127, // vol 127 + /* 31 */ 0xE9, 0x0F, // notepri 0x0F + /* 33 */ 0xDD, 55, // pan 55 + /* 35 */ 0xD4, 64, // reverb 64 + /* 37 */ 0xC1, 82, // instr 82 + + // .channel chan_loop + /* 39 */ 0xFE, // delay1 + /* 40 */ 0x80, // testlayer 0 + + // (no end or loop; channel script seems to run into the note layers?) + + // .layer layer0 + /* 41 */ 0xF3, -4, // rbeqz chan_loop + + // .layer layer1 + /* 43 */ 0xFF, // end + + // .layer layer2? + /* 44 */ 0xC2, -5, // transpose -5 + /* 46 */ 0xC0, 0, // ldelay 0 + /* 48 */ 0xC1, 87, // shortvel 87 + /* 50 */ 0xC9, 0, // shortgate 0 + /* 52 */ 0, // empty until the end }; +// clang-format on OcarinaSongButtons gOcarinaSongButtons[OCARINA_SONG_MAX] = { - // 0: Sonata of Awakening + // OCARINA_SONG_SONATA { 7, { @@ -1506,7 +1549,7 @@ OcarinaSongButtons gOcarinaSongButtons[OCARINA_SONG_MAX] = { }, }, - // 1: Goron Lullaby + // OCARINA_SONG_GORON_LULLABY { 8, { @@ -1521,7 +1564,7 @@ OcarinaSongButtons gOcarinaSongButtons[OCARINA_SONG_MAX] = { }, }, - // 2: New Wave Bossa Nova + // OCARINA_SONG_NEW_WAVE { 7, { @@ -1535,7 +1578,7 @@ OcarinaSongButtons gOcarinaSongButtons[OCARINA_SONG_MAX] = { }, }, - // 3: Elegy of Emptyness + // OCARINA_SONG_ELEGY { 7, { @@ -1549,7 +1592,7 @@ OcarinaSongButtons gOcarinaSongButtons[OCARINA_SONG_MAX] = { }, }, - // 4: Oath to Order + // OCARINA_SONG_OATH { 6, { @@ -1562,7 +1605,7 @@ OcarinaSongButtons gOcarinaSongButtons[OCARINA_SONG_MAX] = { }, }, - // 5; Sarias Song + // OCARINA_SONG_SARIAS { 6, { @@ -1575,7 +1618,7 @@ OcarinaSongButtons gOcarinaSongButtons[OCARINA_SONG_MAX] = { }, }, - // 6: Song of Time + // OCARINA_SONG_TIME { 6, { @@ -1588,7 +1631,7 @@ OcarinaSongButtons gOcarinaSongButtons[OCARINA_SONG_MAX] = { }, }, - // 7: Song of Healing + // OCARINA_SONG_HEALING { 6, { @@ -1601,7 +1644,7 @@ OcarinaSongButtons gOcarinaSongButtons[OCARINA_SONG_MAX] = { }, }, - // 8: Eponas Song + // OCARINA_SONG_EPONAS { 6, { @@ -1614,7 +1657,7 @@ OcarinaSongButtons gOcarinaSongButtons[OCARINA_SONG_MAX] = { }, }, - // 9: Song of Soaring + // OCARINA_SONG_SOARING { 6, { @@ -1627,7 +1670,7 @@ OcarinaSongButtons gOcarinaSongButtons[OCARINA_SONG_MAX] = { }, }, - // 10: Song of Storms + // OCARINA_SONG_STORMS { 6, { @@ -1640,7 +1683,7 @@ OcarinaSongButtons gOcarinaSongButtons[OCARINA_SONG_MAX] = { }, }, - // 11: Suns Song + // OCARINA_SONG_SUNS { 6, { @@ -1653,7 +1696,7 @@ OcarinaSongButtons gOcarinaSongButtons[OCARINA_SONG_MAX] = { }, }, - // 12: Inverted Song of Time + // OCARINA_SONG_INVERTED_TIME { 6, { @@ -1666,7 +1709,7 @@ OcarinaSongButtons gOcarinaSongButtons[OCARINA_SONG_MAX] = { }, }, - // 13; Song of Double Time + // OCARINA_SONG_DOUBLE_TIME { 6, { @@ -1679,7 +1722,7 @@ OcarinaSongButtons gOcarinaSongButtons[OCARINA_SONG_MAX] = { }, }, - // 14: Goron Lullaby Intro + // OCARINA_SONG_GORON_LULLABY_INTRO { 6, { @@ -1692,7 +1735,7 @@ OcarinaSongButtons gOcarinaSongButtons[OCARINA_SONG_MAX] = { }, }, - // 15: Milk Bar Jam "Ballad of the Wind Fish" Human + // OCARINA_SONG_WIND_FISH_HUMAN { 4, { @@ -1703,7 +1746,7 @@ OcarinaSongButtons gOcarinaSongButtons[OCARINA_SONG_MAX] = { }, }, - // 16: Milk Bar Jam "Ballad of the Wind Fish" Goron + // OCARINA_SONG_WIND_FISH_GORON { 8, { @@ -1718,7 +1761,7 @@ OcarinaSongButtons gOcarinaSongButtons[OCARINA_SONG_MAX] = { }, }, - // 17: Milk Bar Jam "Ballad of the Wind Fish" Zora + // OCARINA_SONG_WIND_FISH_ZORA { 8, { @@ -1733,7 +1776,7 @@ OcarinaSongButtons gOcarinaSongButtons[OCARINA_SONG_MAX] = { }, }, - // 18: Milk Bar Jam "Ballad of the Wind Fish" Deku + // OCARINA_SONG_WIND_FISH_DEKU { 5, { @@ -1745,7 +1788,7 @@ OcarinaSongButtons gOcarinaSongButtons[OCARINA_SONG_MAX] = { }, }, - // 19: Evan HP (Zora Band Leader) Song Part 1 + // OCARINA_SONG_EVAN_PART1 { 8, { @@ -1760,7 +1803,7 @@ OcarinaSongButtons gOcarinaSongButtons[OCARINA_SONG_MAX] = { }, }, - // 20: Evan HP (Zora Band Leader) Song Part 2 + // OCARINA_SONG_EVAN_PART2 { 8, { @@ -1775,7 +1818,7 @@ OcarinaSongButtons gOcarinaSongButtons[OCARINA_SONG_MAX] = { }, }, - // 21: Zeldas Lullaby + // OCARINA_SONG_ZELDAS_LULLABY { 6, { @@ -1788,7 +1831,7 @@ OcarinaSongButtons gOcarinaSongButtons[OCARINA_SONG_MAX] = { }, }, - // 22: Scarecrow + // OCARINA_SONG_SCARECROW_SPAWN { 8, { @@ -1803,7 +1846,7 @@ OcarinaSongButtons gOcarinaSongButtons[OCARINA_SONG_MAX] = { }, }, - // 23: Termina Field 2D Song Buttons Appearing on Wall (In OoT, this is Ocarina Memory Game) + // OCARINA_SONG_TERMINA_WALL { 8, { @@ -1819,26 +1862,6 @@ OcarinaSongButtons gOcarinaSongButtons[OCARINA_SONG_MAX] = { }, }; -// Static In-Function Data -u8 sScarecrowAfterCreditsState = 0; -u8 sScarecrowAfterCreditsIntrumentId = OCARINA_INSTRUMENT_DEFAULT; -u16 sScarecrowAfterCreditsTimer = 1200; -u8 sRequestCustomSequence = false; -s8 D_801D8B30[] = { - 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 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, 56, 57, 57, 58, 58, 59, 59, 60, 60, 60, 61, 61, 61, 62, 62, 62, 63, 63, 63, 64, 64, - 64, 65, 65, 65, 66, 66, 66, 67, 67, 67, 68, 68, 69, 69, 70, 70, 71, 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, 105, 107, 109, 111, 113, 115, 117, 119, 121, 123, 125, 127, -}; -f32 sBigBellsVolume[8] = { - 1.0f, 0.9f, 0.8f, 0.7f, 0.6f, 0.5f, 0.4f, 0.3f, -}; -u8 sBgmPlayers[2] = { SEQ_PLAYER_BGM_MAIN, SEQ_PLAYER_BGM_SUB }; -f32 sSfxOriginalPos[] = { 0.0f, 0.0f, 0.0f }; - -// OoT's soundEffects from EnRiverSound const u16 gAudioEnvironmentalSfx[] = { NA_SE_EV_RIVER_STREAM - SFX_FLAG, NA_SE_EV_WAVE - SFX_FLAG, NA_SE_EV_WATER_WALL_BIG - SFX_FLAG, NA_SE_EV_WATER_WALL - SFX_FLAG, @@ -1853,8 +1876,6 @@ const u16 gAudioEnvironmentalSfx[] = { NA_SE_EV_WAVE_S - SFX_FLAG, NA_SE_EV_WAVE_S - SFX_FLAG, }; -extern const u8 sIsOcarinaSongReserved[OCARINA_SONG_MAX]; -/** const u8 sIsOcarinaSongReserved[OCARINA_SONG_MAX] = { true, // OCARINA_SONG_SONATA true, // OCARINA_SONG_GORON_LULLABY @@ -1878,65 +1899,9 @@ const u8 sIsOcarinaSongReserved[OCARINA_SONG_MAX] = { true, // OCARINA_SONG_EVAN_PART1 true, // OCARINA_SONG_EVAN_PART2 false, // OCARINA_SONG_ZELDAS_LULLABY - true, // OCARINA_SONG_SCARECROW + true, // OCARINA_SONG_SCARECROW_SPAWN false, // OCARINA_SONG_TERMINA_WALL }; -*/ - -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019AF00.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019AF58.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019AFE8.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019B02C.s") - -void AudioOcarina_MapSongFromNotesToButtons(u8 noteSongIndex, u8 buttonSongIndex, u8 numButtons); -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/AudioOcarina_MapSongFromNotesToButtons.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019B144.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019B378.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019B38C.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019B3D0.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019B4B8.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/AudioOcarina_StartDefault.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019B568.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019B5AC.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019B5EC.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019B618.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019B654.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019B6B4.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019BC44.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019BE98.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019C1C0.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019C1D0.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019C268.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019C2E4.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/AudioOcarina_SetInstrumentId.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019C398.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019C5A0.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019C8D8.s") const char sAudioOcarinaUnusedText0[] = "key step is too long !!! %d:%d>%d\n"; const char sAudioOcarinaUnusedText1[] = "You played %d Melody !!! (last step:%d)\n"; @@ -1947,21 +1912,1112 @@ const char sAudioOcarinaUnusedText5[] = "last key is bad !!! %d %d %02X %02X\n"; const char sAudioOcarinaUnusedText6[] = "last key step is too short !!! %d:%d %d<%d\n"; const char sAudioOcarinaUnusedText7[] = "check is over!!! %d %d %d\n"; -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019CD08.s") +void AudioOcarina_ReadControllerInput(void) { + Input inputs[4]; + Input* input = &inputs[0]; + u32 ocarinaInputButtonPrev = sOcarinaInputButtonCur; -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019CE34.s") + Padmgr_GetInput2(inputs, 0); + sOcarinaInputButtonCur = input->cur.button; + sOcarinaInputButtonPrev = ocarinaInputButtonPrev; + sOcarinaInputStickRel.x = input->rel.stick_x; + sOcarinaInputStickRel.y = input->rel.stick_y; +} -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019CE6C.s") +/** + * Looks up the frequency to bend the pitch by. + * The pitch will bend up to a maximum of 2 semitones + * in each direction giving a total range of 4 semitones + */ +f32 AudioOcarina_BendPitchTwoSemitones(s8 bendIndex) { + s8 adjBendIndex; + f32 bendFreq; -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019CEBC.s") + if (bendIndex > 64) { + adjBendIndex = 127; + } else if (bendIndex < -64) { + adjBendIndex = -128; + } else if (bendIndex >= 0) { + adjBendIndex = (bendIndex * 127) / 64; + } else { + adjBendIndex = (bendIndex * 128) / 64; + } -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019CF6C.s") + /** + * index 128 is in the middle of the table and + * contains the value 1.0f i.e. no bend + * absolute indices above 128 will bend the pitch 2 semitones upwards + * absolute indices below 128 will bend the pitch 2 semitones downwards + */ + bendFreq = gBendPitchTwoSemitonesFrequencies[adjBendIndex + 128]; + return bendFreq; +} -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019CF78.s") +/** + * If an available song has been played, then return that song index + * If the ocarina is on, but no song has been played then return 0xFE + * If the ocarina is off, return 0xFF + */ +u8 AudioOcarina_GetPlayingState(void) { + u8 playedOcarinaSongIndex; -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/AudioOcarina_GetPlaybackStaff.s") + if (sPlayedOcarinaSongIndexPlusOne != 0) { + playedOcarinaSongIndex = sPlayedOcarinaSongIndexPlusOne - 1; + sPlayedOcarinaSongIndexPlusOne = 0; + } else if (sOcarinaFlags != 0) { + playedOcarinaSongIndex = 0xFE; + } else { + playedOcarinaSongIndex = 0xFF; + } -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019CFA8.s") + return playedOcarinaSongIndex; +} + +u8 AudioOcarina_MapPitchToButton(u8 pitchAndBFlatFlag) { + u8 buttonIndex = sPitchToButtonMap[pitchAndBFlatFlag & 0x3F]; + + /** + * Special case for bFlat4: + * CRIGHT and CLEFT are the only two pitches that are 2 semitones apart + * which are pitches A4 and B4 respectively + * bFlat4 is in the middle of those two and is the only pitch that can not + * be resolved between the two buttons without external information. + * That information is stored as flags in pitch with the mask: + * (pitchAndBFlatFlag & 0xC0) + */ + if (buttonIndex == OCARINA_BTN_C_RIGHT_OR_C_LEFT) { + if (pitchAndBFlatFlag & OCARINA_BUTTON_FLAG_BFLAT_RAISE) { + return OCARINA_BTN_C_RIGHT; + } + // OCARINA_BUTTON_FLAG_BFLAT_LOWER + return OCARINA_BTN_C_LEFT; + } + + return buttonIndex; +} + +void AudioOcarina_MapSongFromPitchToButton(u8 noteSongIndex, u8 buttonSongIndex, u8 numButtons) { + u8 buttonSongPos = 0; + u8 noteSongPos = 0; + u8 pitch; + + while ((buttonSongPos < numButtons) && (noteSongPos < 16)) { + pitch = sOcarinaSongNotes[noteSongIndex][noteSongPos++].pitch; + + if (pitch != OCARINA_PITCH_NONE) { + gOcarinaSongButtons[buttonSongIndex].buttonIndex[buttonSongPos++] = sPitchToButtonMap[pitch]; + } + } + + gOcarinaSongButtons[buttonSongIndex].numButtons = numButtons; +} + +/** + * Ocarina flags: + * bitmask 0x3FFF: + * - Ocarina song id + * bitmask 0xC000: + * - 0x0000: Limits the notes to 8 notes at a time. Not playing a correct song after 8 notes will cause an ocarina + * error + * - 0x4000: (Identical to 0xC000) + * - 0x8000: Limits the notes to 1 note at a time. A single incorrect note will cause an ocarina error + * - 0xC000: Free-play, no limitations to the number of notes to play + * bitmask 0x7FFF0000: + * - ocarina action (only used to make flags != 0) + * bitmask 0x80000000: + * - unused (only used to make flags != 0) + */ + +// The ocarina songs that can be performed at any time = 0x3FFF +#define OCARINA_SONGS_PLAYABLE_FLAGS \ + ((1 << OCARINA_SONG_SONATA) | (1 << OCARINA_SONG_GORON_LULLABY) | (1 << OCARINA_SONG_NEW_WAVE) | \ + (1 << OCARINA_SONG_ELEGY) | (1 << OCARINA_SONG_OATH) | (1 << OCARINA_SONG_SARIAS) | (1 << OCARINA_SONG_TIME) | \ + (1 << OCARINA_SONG_HEALING) | (1 << OCARINA_SONG_EPONAS) | (1 << OCARINA_SONG_SOARING) | \ + (1 << OCARINA_SONG_STORMS) | (1 << OCARINA_SONG_SUNS) | (1 << OCARINA_SONG_INVERTED_TIME) | \ + (1 << OCARINA_SONG_DOUBLE_TIME)) + +void AudioOcarina_Start(u32 ocarinaFlags) { + u8 songIndex; + + if ((sOcarinaSongNotes[OCARINA_SONG_SCARECROW_SPAWN][1].volume != 0xFF) && + ((ocarinaFlags & OCARINA_SONGS_PLAYABLE_FLAGS) == OCARINA_SONGS_PLAYABLE_FLAGS)) { + ocarinaFlags |= (1 << OCARINA_SONG_SCARECROW_SPAWN); + } + + if ((ocarinaFlags == (0xC0000000 | OCARINA_SONGS_PLAYABLE_FLAGS)) && + (sOcarinaSongNotes[OCARINA_SONG_SCARECROW_SPAWN][1].volume != 0xFF)) { + ocarinaFlags = (0xC0000000 | OCARINA_SONGS_PLAYABLE_FLAGS); + } + + if ((ocarinaFlags == OCARINA_SONGS_PLAYABLE_FLAGS) && + (sOcarinaSongNotes[OCARINA_SONG_SCARECROW_SPAWN][1].volume != 0xFF)) { + ocarinaFlags = OCARINA_SONGS_PLAYABLE_FLAGS; + } + + if (ocarinaFlags != 0xFFFF) { + sOcarinaFlags = 0x80000000 + ocarinaFlags; + sFirstOcarinaSongIndex = 0; + sLastOcarinaSongIndex = OCARINA_SONG_MAX; + sOcarinaAvailableSongFlags = ocarinaFlags & 0xFFFFFF; + sMusicStaffNumNotesPerTest = 8; // Ocarina Check + sOcarinaHasStartedSong = false; + sPlayedOcarinaSongIndexPlusOne = 0; + sOcarinaStaffPlayingPos = 0; + sPlayingStaff.state = AudioOcarina_GetPlayingState(); + sIsOcarinaInputEnabled = true; + sPrevOcarinaWithMusicStaffFlags = 0; + + // Reset music staff song check + for (songIndex = OCARINA_SONG_SONATA; songIndex <= OCARINA_SONG_EVAN_PART2; songIndex++) { + for (sMusicStaffPos[songIndex] = 0; + sOcarinaSongNotes[songIndex][sMusicStaffPos[songIndex]].pitch == OCARINA_PITCH_NONE;) { + sMusicStaffPos[songIndex]++; + } + + sMusicStaffCurHeldLength[songIndex] = 0; + sMusicStaffExpectedLength[songIndex] = 0; + sMusicStaffExpectedPitch[songIndex] = 0; + + if (D_801D8530) { + if ((1 << songIndex) & ocarinaFlags) { + D_801FD518[songIndex] = 0; + } else { + D_801FD518[songIndex] = 0xFF; + } + } + } + + if (ocarinaFlags & 0x80000000) { + sMusicStaffNumNotesPerTest = 0; // Ocarina Playback + } + + if (ocarinaFlags & 0x40000000) { + sOcarinaWithoutMusicStaffPos = 0; + } + + if (ocarinaFlags & 0xC0400000) { + AudioOcarina_MapSongFromPitchToButton(OCARINA_SONG_SCARECROW_SPAWN, OCARINA_SONG_SCARECROW_SPAWN, 8); + } + } else { + sOcarinaFlags = 0; + sIsOcarinaInputEnabled = false; + } +} + +#undef OCARINA_SONGS_PLAYABLE_FLAGS + +void AudioOcarina_SetSongStartingPos(void) { + sOcarinaSongStartingPos = sOcarinaWithoutMusicStaffPos; +} + +void AudioOcarina_StartAtSongStartingPos(u32 ocarinaFlags) { + D_801D8530 = false; + AudioOcarina_Start(ocarinaFlags); + if (sOcarinaSongStartingPos != 0) { + sOcarinaWithoutMusicStaffPos = sOcarinaSongStartingPos; + sOcarinaSongStartingPos = 0; + } +} + +void AudioOcarina_StartForSongCheck(u32 ocarinaFlags, u8 ocarinaStaffPlayingPosStart) { + u8 songIndex; + u8 j; + + AudioOcarina_Start(ocarinaFlags); + sMusicStaffNumNotesPerTest = 8; + sOcarinaStaffPlayingPos = ocarinaStaffPlayingPosStart; + + for (songIndex = 0; songIndex <= OCARINA_SONG_EVAN_PART2; songIndex++) { + for (j = 0; j < ocarinaStaffPlayingPosStart;) { + if (sOcarinaSongNotes[songIndex][sMusicStaffPos[songIndex]].pitch != OCARINA_PITCH_NONE) { + j++; + } + sMusicStaffPos[songIndex]++; + } + + if (sOcarinaSongNotes[songIndex][sMusicStaffPos[songIndex]].pitch == OCARINA_PITCH_NONE) { + sMusicStaffPos[songIndex]++; + } + } +} + +void AudioOcarina_StartWithSongNoteLengths(u32 ocarinaFlags) { + u8 songIndex; + + for (songIndex = 0; songIndex < OCARINA_SONG_MAX; songIndex++) { + if ((1 << songIndex) & ocarinaFlags) { + D_801FD530[songIndex] = 0; + } else { + D_801FD530[songIndex] = 0xFF; + } + } + + D_801D8530 = true; + D_801D8534 = ocarinaFlags; + AudioOcarina_Start(ocarinaFlags); +} + +void AudioOcarina_StartDefault(u32 ocarinaFlags) { + D_801D8530 = false; + AudioOcarina_Start(ocarinaFlags); +} + +u8 func_8019B568(void) { + u32 temp_v0 = D_801D8534; + u8 songIndex; + + for (songIndex = OCARINA_SONG_SONATA; !((temp_v0 >> songIndex) & 1) && (songIndex < OCARINA_SONG_MAX); + songIndex++) {} + + return songIndex; +} + +u8 func_8019B5AC(void) { + u8 songIndex = func_8019B568(); + + if (songIndex < OCARINA_SONG_MAX) { + return D_801FD518[songIndex]; + } + + return 0xFF; +} + +u8 func_8019B5EC(void) { + return D_801FD530[func_8019B568()]; +} + +void AudioOcarina_CheckIfStartedSong(void) { + if ((sCurOcarinaPitch != OCARINA_PITCH_NONE) && !sOcarinaHasStartedSong) { + sOcarinaHasStartedSong = true; + sMusicStaffPrevPitch = OCARINA_PITCH_NONE; + } +} + +void AudioOcarina_UpdateCurOcarinaSong(void) { + u8 i; + + if (sOcarinaWithoutMusicStaffPos == 8) { + for (i = 0; i < ARRAY_COUNT(sCurOcarinaSongWithoutMusicStaff) - 1; i++) { + sCurOcarinaSongWithoutMusicStaff[i] = sCurOcarinaSongWithoutMusicStaff[i + 1]; + } + } else { + sOcarinaWithoutMusicStaffPos++; + } +} + +/** + * Checks for ocarina songs from user input with a music staff prompt + * Type 1) Playback: tests note-by-note (ocarinaFlag & 0xC000 == 0x8000) eg: + * - learning a new song + * - playing the ocarina memory game + * Type 2) Check: tests in 8-note chunks (ocarinaFlag & 0xC000 == 0x0000) eg: + * - validating scarecrow spawn song as adult + * - ocarina prompt for zelda's lullaby, saria's song, Storms, Song of Time, etc... + */ +void AudioOcarina_CheckSongsWithMusicStaff(void) { + u32 curOcarinaSongFlag; + s32 pad; + u8 noNewValidInput = false; + s16 pad2; + s8 staffOcarinaPlayingPosOffset = 0; + u8 songIndex; + OcarinaNote* curNote; + OcarinaNote* nextNote; + + AudioOcarina_CheckIfStartedSong(); + + if (!sOcarinaHasStartedSong) { + return; + } + + if (ABS_ALT(sCurOcarinaBendIndex) > 20) { + sOcarinaFlags = 0; + for (songIndex = OCARINA_SONG_SONATA; songIndex < OCARINA_SONG_MAX; songIndex++) { + D_801FD518[songIndex] = 4; + } + sIsOcarinaInputEnabled = false; + return; + } + + if ((sPrevOcarinaPitch == sCurOcarinaPitch) || (sCurOcarinaPitch == OCARINA_PITCH_NONE)) { + noNewValidInput = true; + } else { + AudioOcarina_UpdateCurOcarinaSong(); + sCurOcarinaSongWithoutMusicStaff[sOcarinaWithoutMusicStaffPos - 1] = sCurOcarinaPitch; + } + + for (songIndex = sFirstOcarinaSongIndex; songIndex < sLastOcarinaSongIndex; songIndex++) { + curOcarinaSongFlag = 1 << songIndex; + + if (sOcarinaAvailableSongFlags & curOcarinaSongFlag) { + if (D_801D8530) { + sMusicStaffCurHeldLength[songIndex] += sOcarinaUpdateTaskStart - sOcarinaPlaybackTaskStart; + } else { + sMusicStaffCurHeldLength[songIndex] = sMusicStaffExpectedLength[songIndex] + 9; + } + + if (noNewValidInput) { + if ((sMusicStaffCurHeldLength[songIndex] > 8) && + (sMusicStaffPrevPitch != sMusicStaffExpectedPitch[songIndex])) { + sOcarinaAvailableSongFlags ^= curOcarinaSongFlag; + if (D_801D8530) { + D_801FD518[songIndex] = 1; + } + } + + if (D_801D8530 && ((sMusicStaffExpectedLength[songIndex] + 9) < sMusicStaffCurHeldLength[songIndex])) { + sOcarinaAvailableSongFlags ^= curOcarinaSongFlag; + D_801FD518[songIndex] = 3; + } else if ((sMusicStaffCurHeldLength[songIndex] >= (sMusicStaffExpectedLength[songIndex] - 9)) && + (sMusicStaffCurHeldLength[songIndex] >= sMusicStaffExpectedLength[songIndex]) && + (sOcarinaSongNotes[songIndex][sMusicStaffPos[songIndex]].length == 0) && + (sMusicStaffPrevPitch == sMusicStaffExpectedPitch[songIndex])) { + // This case is taken if the song is finished and successfully played + // (i.e. .length == 0 indicates that the song is at the end) + sPlayedOcarinaSongIndexPlusOne = songIndex + 1; + sIsOcarinaInputEnabled = false; + sOcarinaFlags = 0; + if (D_801D8530) { + D_801FD518[songIndex] = 5; + } + } + } else if (sMusicStaffCurHeldLength[songIndex] >= (sMusicStaffExpectedLength[songIndex] - 9)) { + // This else-if statement always holds true, taken if a new note is played + if (sMusicStaffPrevPitch != OCARINA_PITCH_NONE) { + // New note is played + if (sMusicStaffPrevPitch == sMusicStaffExpectedPitch[songIndex]) { + // Note is part of expected song + if (D_801D8530) { + D_801FD530[songIndex] += + ABS_ALT(sMusicStaffExpectedLength[songIndex] - sMusicStaffCurHeldLength[songIndex]); + } + sMusicStaffCurHeldLength[songIndex] = 0; + } else { + // Note is not part of expected song, so this song is no longer available as an option in this + // playback + sOcarinaAvailableSongFlags ^= curOcarinaSongFlag; + if (D_801D8530) { + D_801FD518[songIndex] = 1; + } + } + } + + curNote = &sOcarinaSongNotes[songIndex][sMusicStaffPos[songIndex]]; + nextNote = &sOcarinaSongNotes[songIndex][++sMusicStaffPos[songIndex]]; + sMusicStaffExpectedLength[songIndex] = curNote->length; + sMusicStaffExpectedPitch[songIndex] = curNote->pitch; + + while ((curNote->pitch == nextNote->pitch) || + ((nextNote->pitch == OCARINA_PITCH_NONE) && (nextNote->length != 0))) { + sMusicStaffExpectedLength[songIndex] += nextNote->length; + curNote = &sOcarinaSongNotes[songIndex][sMusicStaffPos[songIndex]]; + nextNote = &sOcarinaSongNotes[songIndex][sMusicStaffPos[songIndex] + 1]; + sMusicStaffPos[songIndex]++; + } + } else if (sMusicStaffCurHeldLength[songIndex] < 9) { + // case never taken + staffOcarinaPlayingPosOffset = -1; + sMusicStaffCurHeldLength[songIndex] = 0; + sMusicStaffPrevPitch = sCurOcarinaPitch; + } else { + // case never taken + if (sOcarinaSongNotes[songIndex][sMusicStaffPos[songIndex]].length == 0) { + D_801FD518[songIndex] = 1; + } else if (D_801D8530) { + D_801FD518[songIndex] = 2; + } + sOcarinaAvailableSongFlags ^= curOcarinaSongFlag; + } + } + + // if a note is played that doesn't match a song, the song bit in sAvailOcarinaSongFlags is turned off + // if there are no more songs remaining that it could be and the maximum position has been exceeded, then + if ((sOcarinaAvailableSongFlags == 0) && (sOcarinaStaffPlayingPos >= sMusicStaffNumNotesPerTest)) { + sIsOcarinaInputEnabled = false; + if (!D_801D8530) { + if ((sOcarinaFlags & 0x40000000) && (sCurOcarinaPitch == sOcarinaSongNotes[songIndex][0].pitch)) { + // case never taken, this function is not called if (sOcarinaFlags & 0x40000000) is set + sPrevOcarinaWithMusicStaffFlags = sOcarinaFlags; + } + } + sOcarinaFlags = 0; + return; + } + } + + if (!noNewValidInput) { + sMusicStaffPrevPitch = sCurOcarinaPitch; + sOcarinaStaffPlayingPos += staffOcarinaPlayingPosOffset + 1; + } +} + +/** + * Checks for ocarina songs from user input with no music staff prompt. + * Includes ocarina actions such as free play, no warp + */ +void AudioOcarina_CheckSongsWithoutMusicStaff(void) { + u32 pitch; + u8 ocarinaStaffPlayingPosStart; + u8 songIndex; + u8 j; + u8 k; + + if (CHECK_BTN_ANY(sOcarinaInputButtonCur, BTN_L) && + CHECK_BTN_ANY(sOcarinaInputButtonCur, BTN_A | BTN_CRIGHT | BTN_CLEFT | BTN_CDOWN | BTN_CUP)) { + AudioOcarina_StartDefault(sOcarinaFlags); + return; + } + + AudioOcarina_CheckIfStartedSong(); + + if (!sOcarinaHasStartedSong) { + return; + } + + ocarinaStaffPlayingPosStart = sOcarinaStaffPlayingPos; + if ((sPrevOcarinaPitch != sCurOcarinaPitch) && (sCurOcarinaPitch != OCARINA_PITCH_NONE)) { + sOcarinaStaffPlayingPos++; + if (sOcarinaStaffPlayingPos > ARRAY_COUNT(sCurOcarinaSongWithoutMusicStaff)) { + sOcarinaStaffPlayingPos = 1; + } + + AudioOcarina_UpdateCurOcarinaSong(); + + if ((ABS_ALT(sCurOcarinaBendIndex) > 20) && (ocarinaStaffPlayingPosStart != sOcarinaStaffPlayingPos)) { + sCurOcarinaSongWithoutMusicStaff[sOcarinaWithoutMusicStaffPos - 1] = OCARINA_PITCH_NONE; + } else { + sCurOcarinaSongWithoutMusicStaff[sOcarinaWithoutMusicStaffPos - 1] = sCurOcarinaPitch; + } + + // This nested for-loop tests to see if the notes from the ocarina are identical + // to any of the songIndex from sFirstOcarinaSongIndex to sLastOcarinaSongIndex + + // Loop through each of the songs + for (songIndex = sFirstOcarinaSongIndex; songIndex < sLastOcarinaSongIndex; songIndex++) { + // Checks to see if the song is available to be played + if ((u32)sOcarinaAvailableSongFlags & (1 << songIndex)) { + // Loops through all possible starting indices? + // Loops through the notes of the song? + for (j = 0, k = 0; j < gOcarinaSongButtons[songIndex].numButtons && k == 0 && + sOcarinaWithoutMusicStaffPos >= gOcarinaSongButtons[songIndex].numButtons;) { + + pitch = sCurOcarinaSongWithoutMusicStaff[(sOcarinaWithoutMusicStaffPos - + gOcarinaSongButtons[songIndex].numButtons) + + j]; + + if (pitch == sButtonToPitchMap[gOcarinaSongButtons[songIndex].buttonIndex[j]]) { + j++; + } else { + k++; + } + } + + // This conditional is true if songIndex = i is detected + if (j == gOcarinaSongButtons[songIndex].numButtons) { + sPlayedOcarinaSongIndexPlusOne = songIndex + 1; + sIsOcarinaInputEnabled = false; + sOcarinaFlags = 0; + } + } + } + } +} + +void AudioOcarina_PlayControllerInput(u8 isOcarinaSfxSuppressedWhenCancelled) { + u32 ocarinaBtnsHeld; + + // Prevents two different ocarina notes from being played on two consecutive frames + if ((sOcarinaFlags != 0) && (sOcarinaDropInputTimer != 0)) { + sOcarinaDropInputTimer--; + return; + } + + // Ensures the button pressed to start the ocarina does not also play an ocarina note + if ((sOcarinaInputButtonStart == 0) || + ((sOcarinaInputButtonStart & (BTN_A | BTN_CRIGHT | BTN_CLEFT | BTN_CDOWN | BTN_CUP)) != + (sOcarinaInputButtonCur & (BTN_A | BTN_CRIGHT | BTN_CLEFT | BTN_CDOWN | BTN_CUP)))) { + sOcarinaInputButtonStart = 0; + if (1) {} + sCurOcarinaPitch = OCARINA_PITCH_NONE; + sCurOcarinaButtonIndex = OCARINA_BTN_INVALID; + ocarinaBtnsHeld = (sOcarinaInputButtonCur & (BTN_A | BTN_CRIGHT | BTN_CLEFT | BTN_CDOWN | BTN_CUP)) & + (sOcarinaInputButtonPrev & (BTN_A | BTN_CRIGHT | BTN_CLEFT | BTN_CDOWN | BTN_CUP)); + + if (!(sOcarinaInputButtonPress & ocarinaBtnsHeld) && (sOcarinaInputButtonCur != 0)) { + sOcarinaInputButtonPress = sOcarinaInputButtonCur; + } else { + sOcarinaInputButtonPress &= ocarinaBtnsHeld; + } + + // Interprets and transforms controller input into ocarina buttons and notes + if (CHECK_BTN_ANY(sOcarinaInputButtonPress, BTN_A)) { + sCurOcarinaPitch = OCARINA_PITCH_D4; + sCurOcarinaButtonIndex = OCARINA_BTN_A; + + } else if (CHECK_BTN_ANY(sOcarinaInputButtonPress, BTN_CDOWN)) { + sCurOcarinaPitch = OCARINA_PITCH_F4; + sCurOcarinaButtonIndex = OCARINA_BTN_C_DOWN; + + } else if (CHECK_BTN_ANY(sOcarinaInputButtonPress, BTN_CRIGHT)) { + sCurOcarinaPitch = OCARINA_PITCH_A4; + sCurOcarinaButtonIndex = OCARINA_BTN_C_RIGHT; + + } else if (CHECK_BTN_ANY(sOcarinaInputButtonPress, BTN_CLEFT)) { + sCurOcarinaPitch = OCARINA_PITCH_B4; + sCurOcarinaButtonIndex = OCARINA_BTN_C_LEFT; + + } else if (CHECK_BTN_ANY(sOcarinaInputButtonPress, BTN_CUP)) { + sCurOcarinaPitch = OCARINA_PITCH_D5; + sCurOcarinaButtonIndex = OCARINA_BTN_C_UP; + } + + if (sOcarinaInputButtonCur) {} + + // Pressing the R Button will raise the pitch by 1 semitone + if ((sCurOcarinaPitch != OCARINA_PITCH_NONE) && CHECK_BTN_ANY(sOcarinaInputButtonCur, BTN_R) && + (sRecordingState != OCARINA_RECORD_SCARECROW_SPAWN)) { + sCurOcarinaButtonIndex += OCARINA_BUTTON_FLAG_BFLAT_RAISE; // Flag to resolve B Flat 4 + sCurOcarinaPitch++; // Raise the pitch by 1 semitone + } + + // Pressing the Z Button will lower the pitch by 1 semitone + if ((sCurOcarinaPitch != OCARINA_PITCH_NONE) && CHECK_BTN_ANY(sOcarinaInputButtonCur, BTN_Z) && + (sRecordingState != OCARINA_RECORD_SCARECROW_SPAWN)) { + sCurOcarinaButtonIndex += OCARINA_BUTTON_FLAG_BFLAT_LOWER; // Flag to resolve B Flat 4 + sCurOcarinaPitch--; // Lower the pitch by 1 semitone + } + + if (sRecordingState != OCARINA_RECORD_SCARECROW_SPAWN) { + // Bend the pitch of the note based on y control stick + sCurOcarinaBendIndex = sOcarinaInputStickRel.y; + sCurOcarinaBendFreq = AudioOcarina_BendPitchTwoSemitones(sCurOcarinaBendIndex); + + // Add vibrato of the ocarina note based on the x control stick + sCurOcarinaVibrato = ABS_ALT(sOcarinaInputStickRel.x) >> 2; + // Sets vibrato to io port 6 + Audio_QueueCmdS8(0x6 << 24 | SEQ_PLAYER_SFX << 16 | SFX_CHANNEL_OCARINA << 8 | 6, sCurOcarinaVibrato); + } else { + // no bending or vibrato for recording state OCARINA_RECORD_SCARECROW_SPAWN + sCurOcarinaBendIndex = 0; + sCurOcarinaVibrato = 0; + sCurOcarinaBendFreq = 1.0f; // No bend + } + + // Processes new and valid notes + if ((sCurOcarinaPitch != OCARINA_PITCH_NONE) && (sPrevOcarinaPitch != sCurOcarinaPitch)) { + // Sets ocarina instrument Id to io port 7, which is used + // as an index in seq 0 to get the true instrument Id + Audio_QueueCmdS8(0x6 << 24 | SEQ_PLAYER_SFX << 16 | SFX_CHANNEL_OCARINA << 8 | 7, sOcarinaInstrumentId - 1); + // Sets pitch to io port 5 + Audio_QueueCmdS8(0x6 << 24 | SEQ_PLAYER_SFX << 16 | SFX_CHANNEL_OCARINA << 8 | 5, sCurOcarinaPitch); + Audio_PlaySfxGeneral(NA_SE_OC_OCARINA, &gSfxDefaultPos, 4, &sCurOcarinaBendFreq, &sDefaultOcarinaVolume, + &gSfxDefaultReverb); + } else if ((sPrevOcarinaPitch != OCARINA_PITCH_NONE) && (sCurOcarinaPitch == OCARINA_PITCH_NONE) && + !isOcarinaSfxSuppressedWhenCancelled) { + // Stops ocarina sound when transitioning from playing to not playing a note + Audio_StopSfxById(NA_SE_OC_OCARINA); + } + } +} + +/** + * Directly enable the ocarina to receive input without + * properly resetting it based on an ocarina instrument id + * Unused. + */ +void AudioOcarina_EnableInput(u8 inputEnabled) { + sIsOcarinaInputEnabled = inputEnabled; +} + +/** + * Resets ocarina properties + */ +void AudioOcarina_ResetAndMute(void) { + sOcarinaInputButtonCur = 0; + sOcarinaInputButtonPrev = 0; + sOcarinaInputButtonPress = 0; + + sOcarinaInputButtonStart = 0xFFFF; + + AudioOcarina_PlayControllerInput(false); + Audio_StopSfxById(NA_SE_OC_OCARINA); + + if (gAudioSpecId != 12) { + Audio_SetSfxBanksMute(0); + } + + sPlaybackState = 0; + sPlaybackStaffPos = 0; + sIsOcarinaInputEnabled = false; + + sOcarinaFlags = 0; + + // return to full volume for both bgm players after ocarina is finished + Audio_ClearFlagForBgmVolumeLow(SFX_CHANNEL_OCARINA); + // return to full volume for all sfx channels except system & ocarina banks + Audio_SetSfxVolumeExceptSystemAndOcarinaBanks(0x7F); +} + +void AudioOcarina_ResetAndReadInput(void) { + sOcarinaInputButtonCur = 0; + sOcarinaInputButtonPrev = 0; + sOcarinaInputButtonPress = 0; + + sOcarinaInputButtonStart = 0xFFFF; + + AudioOcarina_PlayControllerInput(true); + + sPlaybackState = 0; + sPlaybackStaffPos = 0; + sIsOcarinaInputEnabled = false; + + sOcarinaFlags = 0; + + sOcarinaInputButtonCur = 0; + + AudioOcarina_ReadControllerInput(); + sOcarinaInputButtonStart = sOcarinaInputButtonCur; +} + +/** + * Set a timer that will disable the ocarina once the timer reaches 0 + */ +void AudioOcarina_SetOcarinaDisableTimer(u8 unused, u8 timer) { + sOcarinaDisableTimer = timer; + sOcarinaUnused = unused; +} + +u32 AudioOcarina_SetInstrument(u8 ocarinaInstrumentId) { + if ((sOcarinaInstrumentId != ocarinaInstrumentId) || (ocarinaInstrumentId == OCARINA_INSTRUMENT_DEFAULT)) { + Audio_QueueSeqCmd(0x80000000 | ((u32)(SEQ_PLAYER_SFX) << 24) | ((u32)(1) << 16) | + ((u32)(SFX_CHANNEL_OCARINA) << 8) | (u32)(ocarinaInstrumentId)); + sOcarinaInstrumentId = ocarinaInstrumentId; + + if (ocarinaInstrumentId == OCARINA_INSTRUMENT_OFF) { + AudioOcarina_ResetAndMute(); + } else { + sOcarinaInputButtonCur = 0; + AudioOcarina_ReadControllerInput(); + sOcarinaInputButtonStart = sOcarinaInputButtonCur; + // lowers volume of all sfx channels except system & ocarina banks + Audio_SetSfxVolumeExceptSystemAndOcarinaBanks(0x40); + // lowers volume of bgm players while playing ocarina + Audio_SetFlagForBgmVolumeLow(SFX_CHANNEL_OCARINA); + } + } +} + +void AudioOcarina_SetPlaybackSong(s8 songIndexPlusOne, u8 playbackState) { + u8 i = 0; + + if (songIndexPlusOne == 0) { + sPlaybackState = 0; + Audio_StopSfxById(NA_SE_OC_OCARINA); + return; + } + + if (songIndexPlusOne < (OCARINA_SONG_MAX + 1)) { + sPlaybackSong = sOcarinaSongNotes[songIndexPlusOne - 1]; + } else { + sPlaybackSong = sScarecrowsLongSongNotes; + } + + sPlaybackNotePos = 0; + if (playbackState & 0x80) { + sPlaybackState = 1; + sPlaybackStaffStopPos = playbackState & 0xF; + sPlaybackStaffStartPos = 0xFF; + } else if (playbackState & 0x40) { + sPlaybackState = 1; + sPlaybackStaffStartPos = playbackState & 0xF; + sPlaybackStaffStopPos = 0xFF; + while (i < sPlaybackStaffStartPos) { + if (sOcarinaSongNotes[songIndexPlusOne - 1][sPlaybackNotePos].pitch != OCARINA_PITCH_NONE) { + i++; + } + sPlaybackNotePos++; + } + } else { + sPlaybackState = playbackState; + sPlaybackStaffStopPos = 0xFF; + sPlaybackStaffStartPos = 0xFF; + } + + sPlaybackNoteTimer = 0; + sPlaybackPitch = OCARINA_PITCH_NONE; + sPlaybackStaffPos = 0; + + if (sPlaybackStaffStartPos == 0xFF) { + while ((sPlaybackSong[sPlaybackNotePos].pitch == OCARINA_PITCH_NONE) && + (songIndexPlusOne > (OCARINA_SONG_EVAN_PART2 + 1))) { + sPlaybackNotePos++; + } + } +} + +/** + * Play a song with the ocarina to the user that is + * based on OcarinaNote data and not user input + */ +void AudioOcarina_PlaybackSong(void) { + s32 noteTimerStep; + s32 nextNoteTimerStep; + + if (sPlaybackState == 0) { + return; + } + + if (sPlaybackStaffPos == 0) { + noteTimerStep = 3; + } else { + noteTimerStep = sOcarinaUpdateTaskStart - sOcarinaPlaybackTaskStart; + } + + if (noteTimerStep < sPlaybackNoteTimer) { + sPlaybackNoteTimer -= noteTimerStep; + } else { + nextNoteTimerStep = noteTimerStep - sPlaybackNoteTimer; + sPlaybackNoteTimer = 0; + } + + if (sPlaybackNoteTimer == 0) { + + if (sPlaybackStaffPos == sPlaybackStaffStopPos) { + sPlaybackState = 0; + return; + } + + sPlaybackNoteTimer = sPlaybackSong[sPlaybackNotePos].length; + + if (sPlaybackNotePos == 1) { + sPlaybackNoteTimer++; + } + + if (sPlaybackNoteTimer == 0) { + sPlaybackState--; + if (sPlaybackState != 0) { + sPlaybackNotePos = 0; + sPlaybackStaffPos = 0; + sPlaybackPitch = OCARINA_PITCH_NONE; + } else { + Audio_StopSfxById(NA_SE_OC_OCARINA); + } + return; + } else { + sPlaybackNoteTimer -= nextNoteTimerStep; + } + + // Update volume + if (sNotePlaybackVolume != sPlaybackSong[sPlaybackNotePos].volume) { + sNotePlaybackVolume = sPlaybackSong[sPlaybackNotePos].volume; + sRelativeNotePlaybackVolume = sNotePlaybackVolume / 127.0f; + } + + // Update vibrato + sNotePlaybackVibrato = sPlaybackSong[sPlaybackNotePos].vibrato; + // Sets vibrato to io port 6 + Audio_QueueCmdS8(0x6 << 24 | SEQ_PLAYER_SFX << 16 | SFX_CHANNEL_OCARINA << 8 | 6, sNotePlaybackVibrato); + + // Update bend + if (sNotePlaybackBend != sPlaybackSong[sPlaybackNotePos].bend) { + sNotePlaybackBend = sPlaybackSong[sPlaybackNotePos].bend; + sRelativeNotePlaybackBend = AudioOcarina_BendPitchTwoSemitones(sNotePlaybackBend); + } + + // No changes in volume, vibrato, or bend between notes + if ((sPlaybackSong[sPlaybackNotePos].volume == sPlaybackSong[sPlaybackNotePos - 1].volume && + (sPlaybackSong[sPlaybackNotePos].vibrato == sPlaybackSong[sPlaybackNotePos - 1].vibrato) && + (sPlaybackSong[sPlaybackNotePos].bend == sPlaybackSong[sPlaybackNotePos - 1].bend))) { + sPlaybackPitch = 0xFE; + } + + if (sPlaybackPitch != sPlaybackSong[sPlaybackNotePos].pitch) { + u8 pitch = sPlaybackSong[sPlaybackNotePos].pitch; + + // As bFlat4 is exactly in the middle of notes B & A, a flag is + // added to the pitch to resolve which button to map Bflat4 to + if (pitch == OCARINA_PITCH_BFLAT4) { + sPlaybackPitch = pitch + sPlaybackSong[sPlaybackNotePos].bFlat4Flag; + } else { + sPlaybackPitch = pitch; + } + + if (sPlaybackPitch != OCARINA_PITCH_NONE) { + sPlaybackStaffPos++; + // Sets ocarina instrument Id to io port 7, which is used + // as an index in seq 0 to get the true instrument Id + Audio_QueueCmdS8(0x6 << 24 | SEQ_PLAYER_SFX << 16 | SFX_CHANNEL_OCARINA << 8 | 7, + sOcarinaInstrumentId - 1); + Audio_QueueCmdS8(0x6 << 24 | SEQ_PLAYER_SFX << 16 | SFX_CHANNEL_OCARINA << 8 | 5, + sPlaybackPitch & OCARINA_BUTTON_MASK_PITCH); + Audio_PlaySfxGeneral(NA_SE_OC_OCARINA, &gSfxDefaultPos, 4, &sRelativeNotePlaybackBend, + &sRelativeNotePlaybackVolume, &gSfxDefaultReverb); + } else { + Audio_StopSfxById(NA_SE_OC_OCARINA); + } + } + sPlaybackNotePos++; + } +} + +void AudioOcarina_SetRecordingSong(u8 isRecordingComplete) { + u16 i; + u16 i2; + u16 pad; + u8 pitch; + OcarinaNote* note; + u8 j; + u8 k; + s32 t; + OcarinaNote* recordedSong; + + if (sRecordingState == OCARINA_RECORD_SCARECROW_LONG) { + recordedSong = gScarecrowLongSongPtr; + } else { + /** + * OCARINA_RECORD_SCARECROW_SPAWN + * + * The notes for scarecrows spawn song are first recorded into the ocarina termina + * wall address to act as a buffer. That way, if a new scarecrow spawn song is + * rejected, the previous scarecrow spawn song is not overwritten. If the scarecrow + * spawn song is accepted, then the notes are copied over to the scarecrow spawn + * song address + */ + recordedSong = sTerminaWallSongPtr; + } + + recordedSong[sRecordSongPos].pitch = sRecordOcarinaPitch; + recordedSong[sRecordSongPos].length = sOcarinaUpdateTaskStart - sOcarinaRecordTaskStart; + recordedSong[sRecordSongPos].volume = sRecordOcarinaVolume; + recordedSong[sRecordSongPos].vibrato = sRecordOcarinaVibrato; + recordedSong[sRecordSongPos].bend = sRecordOcarinaBendIndex; + recordedSong[sRecordSongPos].bFlat4Flag = sRecordOcarinaButtonIndex & OCARINA_BUTTON_MASK_FLAG; + + sRecordOcarinaPitch = sCurOcarinaPitch; + sRecordOcarinaVolume = sCurOcarinaVolume; + sRecordOcarinaVibrato = sCurOcarinaVibrato; + sRecordOcarinaBendIndex = sCurOcarinaBendIndex; + sRecordOcarinaButtonIndex = sCurOcarinaButtonIndex; + + sRecordSongPos++; + + if ((sRecordSongPos != (ARRAY_COUNT(sScarecrowsLongSongNotes) - 1)) && !isRecordingComplete) { + // Continue recording + return; + } + + // Recording is complete + + i = sRecordSongPos; + pitch = OCARINA_PITCH_NONE; + while (i != 0 && pitch == OCARINA_PITCH_NONE) { + i--; + pitch = recordedSong[i].pitch; + } + + if (sRecordSongPos != (i + 1)) { + sRecordSongPos = i + 2; + recordedSong[sRecordSongPos - 1].length = 0; + } + + recordedSong[sRecordSongPos].length = 0; + + if (sRecordingState == OCARINA_RECORD_SCARECROW_SPAWN) { + if (sOcarinaStaffPlayingPos >= 8) { + for (i = 0; i < sRecordSongPos; i++) { + recordedSong[i] = recordedSong[i + 1]; + } + + // Copies Notes from buffer into scarecrows spawn buttons to be tested for acceptance or rejection + AudioOcarina_MapSongFromPitchToButton(OCARINA_SONG_TERMINA_WALL, OCARINA_SONG_SCARECROW_SPAWN, 8); + + // Tests to see if the notes from the scarecrow song contain identical + // notes within its song to any of the reserved songIndex from 0 to 21 + + // Loop through each of the songs + for (i = 0; i < OCARINA_SONG_SCARECROW_SPAWN; i++) { + // Checks to see if the song is reserved + if (sIsOcarinaSongReserved[i]) { + // Loops through all possible starting indices + for (j = 0; (j < 9 - gOcarinaSongButtons[i].numButtons); j++) { + // Loops through the notes of the song + for (k = 0; (k < gOcarinaSongButtons[i].numButtons) && (k + j < 8) && + (gOcarinaSongButtons[i].buttonIndex[k] == + gOcarinaSongButtons[OCARINA_SONG_SCARECROW_SPAWN].buttonIndex[k + j]); + k++) { + ; + } + + // This conditional is true if the recorded song contains a reserved song + // recorded song is cancelled + if (k == gOcarinaSongButtons[i].numButtons) { + sRecordingState = OCARINA_RECORD_REJECTED; + sOcarinaSongNotes[OCARINA_SONG_SCARECROW_SPAWN][1].volume = 0xFF; + return; + } + } + } + } + + // Counts how many times a note is repeated + i = 1; + while (i < 8) { + if (gOcarinaSongButtons[OCARINA_SONG_SCARECROW_SPAWN].buttonIndex[0] != + gOcarinaSongButtons[OCARINA_SONG_SCARECROW_SPAWN].buttonIndex[i]) { + i = 9; // break + } else { + i++; + } + } + + // This condition is true if all 8 notes are the same pitch + if (i == 8) { + sRecordingState = OCARINA_RECORD_REJECTED; + sOcarinaSongNotes[OCARINA_SONG_SCARECROW_SPAWN][1].volume = 0xFF; + return; + } + + // The scarecrow spawn song is accepted and copied from the buffer to the scarecrow spawn notes + for (i = 0; i < sRecordSongPos; i++) { + sOcarinaSongNotes[OCARINA_SONG_SCARECROW_SPAWN][i] = sOcarinaSongNotes[OCARINA_SONG_TERMINA_WALL][i]; + } + + sIsOcarinaInputEnabled = false; + } else { + sOcarinaSongNotes[OCARINA_SONG_SCARECROW_SPAWN][1].volume = 0xFF; + } + } + + sRecordingState = OCARINA_RECORD_OFF; +} + +/** + * recordingState = OCARINA_RECORD_OFF, end + * recordingState = OCARINA_RECORD_SCARECROW_LONG, start long scarecrows song + * recordingState = OCARINA_RECORD_SCARECROW_SPAWN, start spawn scarecrows song + */ +void AudioOcarina_SetRecordingState(u8 recordingState) { + if ((u32)recordingState == sRecordingState) { + return; + } + + if (recordingState != OCARINA_RECORD_OFF) { + sOcarinaRecordTaskStart = sOcarinaUpdateTaskStart; + sRecordOcarinaPitch = OCARINA_PITCH_NONE; + sRecordOcarinaVolume = 0x57; + sRecordOcarinaVibrato = 0; + sRecordOcarinaBendIndex = 0; + sRecordOcarinaButtonIndex = 0; + sRecordSongPos = 0; + sIsOcarinaInputEnabled = true; + sOcarinaStaffPlayingPos = 0; + sScarecrowsLongSongSecondNote = sScarecrowsLongSongNotes[1]; + } else { + if (sRecordSongPos == 0) { + sScarecrowsLongSongNotes[1] = sScarecrowsLongSongSecondNote; + } else { + if (sRecordingState == OCARINA_RECORD_SCARECROW_SPAWN) { + sOcarinaStaffPlayingPos = 1; + } + + AudioOcarina_SetRecordingSong(true); + } + + sIsOcarinaInputEnabled = false; + sOcarinaStaffPlayingPos = 0; + } + + sRecordingState = recordingState; +} + +void AudioOcarina_UpdateRecordingStaff(void) { + sRecordingStaff.state = sRecordingState; + sRecordingStaff.pos = sOcarinaStaffPlayingPos; + if (sRecordingState == OCARINA_RECORD_REJECTED) { + sRecordingState = OCARINA_RECORD_OFF; + } +} + +void AudioOcarina_UpdatePlayingStaff(void) { + if (sCurOcarinaButtonIndex != OCARINA_BTN_INVALID) { + sPlayingStaff.buttonIndex = sCurOcarinaButtonIndex & OCARINA_BUTTON_MASK_PITCH; + } + sPlayingStaff.state = AudioOcarina_GetPlayingState(); + sPlayingStaff.pos = sOcarinaStaffPlayingPos; +} + +void AudioOcarina_UpdatePlaybackStaff(void) { + if ((sPlaybackPitch & OCARINA_BUTTON_MASK_PITCH) <= OCARINA_PITCH_EFLAT5) { + sPlaybackStaff.buttonIndex = AudioOcarina_MapPitchToButton(sPlaybackPitch); + } + + sPlaybackStaff.state = sPlaybackState; + + if (sPlaybackSong != sScarecrowsLongSongNotes) { + sPlaybackStaff.pos = sPlaybackStaffPos; + } else if (sPlaybackStaffPos == 0) { + sPlaybackStaff.pos = 0; + } else { + sPlaybackStaff.pos = ((sPlaybackStaffPos - 1) % 8) + 1; + } +} + +OcarinaStaff* AudioOcarina_GetRecordingStaff(void) { + return &sRecordingStaff; +} + +OcarinaStaff* AudioOcarina_GetPlayingStaff(void) { + if (sPlayingStaff.state < 0xFE) { + sOcarinaFlags = 0; + } + + return &sPlayingStaff; +} + +OcarinaStaff* AudioOcarina_GetPlaybackStaff(void) { + return &sPlaybackStaff; +} + +void AudioOcarina_RecordSong(void) { + s32 noteChanged; + + if ((sRecordingState != OCARINA_RECORD_OFF) && ((sOcarinaUpdateTaskStart - sOcarinaRecordTaskStart) >= 3)) { + noteChanged = false; + if (sRecordOcarinaPitch != sCurOcarinaPitch) { + if (sCurOcarinaPitch != OCARINA_PITCH_NONE) { + sRecordingStaff.buttonIndex = sCurOcarinaButtonIndex & OCARINA_BUTTON_MASK_PITCH; + sOcarinaStaffPlayingPos++; + } else if ((sRecordingState == OCARINA_RECORD_SCARECROW_SPAWN) && (sOcarinaStaffPlayingPos == 8)) { + AudioOcarina_SetRecordingSong(true); + return; + } + + if (sOcarinaStaffPlayingPos > 8) { + if (sRecordingState == OCARINA_RECORD_SCARECROW_SPAWN) { + // notes played are over 8 and in recording mode. + AudioOcarina_SetRecordingSong(true); + return; + } + sOcarinaStaffPlayingPos = 1; + } + noteChanged = true; + } else if (sRecordOcarinaVolume != sCurOcarinaVolume) { + noteChanged = true; + } else if (sRecordOcarinaVibrato != sCurOcarinaVibrato) { + if (sRecordingState != OCARINA_RECORD_SCARECROW_SPAWN) { + noteChanged = true; + } + } else if ((sRecordOcarinaBendIndex != sCurOcarinaBendIndex) && + (sRecordingState != OCARINA_RECORD_SCARECROW_SPAWN)) { + noteChanged = true; + } + + if (noteChanged) { + AudioOcarina_SetRecordingSong(false); + sOcarinaRecordTaskStart = sOcarinaUpdateTaskStart; + } + } +} /** * Tests to see if the notes from songIndex contain identical notes @@ -2007,7 +3063,7 @@ s32 AudioOcarina_TerminaWallValidateNotes(u8 songIndex, u8 maxSongIndex) { */ void AudioOcarina_TerminaWallGenerateNotes(void) { OcarinaNote* ocarinaNote; - u8 randButtonIndex; + u8 randomButtonIndex; u8 i; u8 j; @@ -2017,8 +3073,8 @@ void AudioOcarina_TerminaWallGenerateNotes(void) { j = 0; for (; i < 8; i++) { - randButtonIndex = Audio_NextRandom() % ARRAY_COUNT(sButtonToPitchMap); - sOcarinaSongNotes[OCARINA_SONG_TERMINA_WALL][j].pitch = sButtonToPitchMap[randButtonIndex]; + randomButtonIndex = Audio_NextRandom() % ARRAY_COUNT(sButtonToPitchMap); + sOcarinaSongNotes[OCARINA_SONG_TERMINA_WALL][j].pitch = sButtonToPitchMap[randomButtonIndex]; sOcarinaSongNotes[OCARINA_SONG_TERMINA_WALL][j].length = 19; sOcarinaSongNotes[OCARINA_SONG_TERMINA_WALL][j].volume = 80; sOcarinaSongNotes[OCARINA_SONG_TERMINA_WALL][j].vibrato = 0; @@ -2036,7 +3092,7 @@ void AudioOcarina_TerminaWallGenerateNotes(void) { sOcarinaSongNotes[OCARINA_SONG_TERMINA_WALL][j - 1].length = 22; sOcarinaSongNotes[OCARINA_SONG_TERMINA_WALL][j + 1].pitch = OCARINA_PITCH_NONE; sOcarinaSongNotes[OCARINA_SONG_TERMINA_WALL][j + 1].length = 0; - AudioOcarina_MapSongFromNotesToButtons(OCARINA_SONG_TERMINA_WALL, OCARINA_SONG_TERMINA_WALL, 8); + AudioOcarina_MapSongFromPitchToButton(OCARINA_SONG_TERMINA_WALL, OCARINA_SONG_TERMINA_WALL, 8); } else { j = Audio_NextRandom() % ARRAY_COUNT(sOoTOcarinaSongNotes); ocarinaNote = sOoTOcarinaSongNotes[j]; @@ -2047,8 +3103,8 @@ void AudioOcarina_TerminaWallGenerateNotes(void) { sOcarinaSongNotes[OCARINA_SONG_TERMINA_WALL][i].pitch = OCARINA_PITCH_NONE; sOcarinaSongNotes[OCARINA_SONG_TERMINA_WALL][i].length = 0; - AudioOcarina_MapSongFromNotesToButtons(OCARINA_SONG_TERMINA_WALL, OCARINA_SONG_TERMINA_WALL, - sOoTOcarinaSongsNumNotes[j]); + AudioOcarina_MapSongFromPitchToButton(OCARINA_SONG_TERMINA_WALL, OCARINA_SONG_TERMINA_WALL, + sOoTOcarinaSongsNumNotes[j]); } } while (AudioOcarina_TerminaWallValidateNotes(OCARINA_SONG_TERMINA_WALL, OCARINA_SONG_TERMINA_WALL) != 0); } @@ -2056,7 +3112,7 @@ void AudioOcarina_TerminaWallGenerateNotes(void) { /** * Unused remnant of OoT */ -void AudioOcarina_MemoryGameSetNumNotes(u8 minigameRound) { +void AudioOcarina_MemoryGameInit(u8 minigameRound) { u8 i; if (minigameRound > 2) { @@ -2064,10 +3120,10 @@ void AudioOcarina_MemoryGameSetNumNotes(u8 minigameRound) { } sOcarinaMemoryGameAppendPos = 0; - sOcaMemoryGameEndPos = sOcaMemoryGameNumNotes[minigameRound]; + sOcarinaMemoryGameEndPos = sOcarinaMemoryGameNumNotes[minigameRound]; for (i = 0; i < 3; i++) { - AudioOcarina_MemoryGameGenerateNotes(); + AudioOcarina_MemoryGameNextNote(); } } @@ -2075,52 +3131,363 @@ void AudioOcarina_MemoryGameSetNumNotes(u8 minigameRound) { * Unused remnant of OoT, Id 14 now represent Goron Lullaby Intro instead of the OoT ocarina memory game * //! @bug calling this function in MM will overwrite Goron Lullaby Intro */ -#define OCARINA_SONG_MEMORYGAME 14 -s32 AudioOcarina_MemoryGameGenerateNotes(void) { - u32 randButtonIndex; - u8 randPitch; +#define OCARINA_SONG_MEMORY_GAME 14 +s32 AudioOcarina_MemoryGameNextNote(void) { + u32 randomButtonIndex; + u8 randomPitch; - if (sOcarinaMemoryGameAppendPos == sOcaMemoryGameEndPos) { + if (sOcarinaMemoryGameAppendPos == sOcarinaMemoryGameEndPos) { return true; } - randButtonIndex = Audio_NextRandom(); - randPitch = sButtonToPitchMap[randButtonIndex % ARRAY_COUNT(sButtonToPitchMap)]; + randomButtonIndex = Audio_NextRandom(); + randomPitch = sButtonToPitchMap[randomButtonIndex % ARRAY_COUNT(sButtonToPitchMap)]; - if (sOcarinaSongNotes[OCARINA_SONG_MEMORYGAME][sOcarinaMemoryGameAppendPos - 1].pitch == randPitch) { - randPitch = sButtonToPitchMap[(randButtonIndex + 1) % ARRAY_COUNT(sButtonToPitchMap)]; + if (sOcarinaSongNotes[OCARINA_SONG_MEMORY_GAME][sOcarinaMemoryGameAppendPos - 1].pitch == randomPitch) { + randomPitch = sButtonToPitchMap[(randomButtonIndex + 1) % ARRAY_COUNT(sButtonToPitchMap)]; } - sOcarinaSongNotes[OCARINA_SONG_MEMORYGAME][sOcarinaMemoryGameAppendPos].pitch = randPitch; - sOcarinaSongNotes[OCARINA_SONG_MEMORYGAME][sOcarinaMemoryGameAppendPos].length = 45; - sOcarinaSongNotes[OCARINA_SONG_MEMORYGAME][sOcarinaMemoryGameAppendPos].volume = 0x50; - sOcarinaSongNotes[OCARINA_SONG_MEMORYGAME][sOcarinaMemoryGameAppendPos].vibrato = 0; - sOcarinaSongNotes[OCARINA_SONG_MEMORYGAME][sOcarinaMemoryGameAppendPos].bend = 0; + sOcarinaSongNotes[OCARINA_SONG_MEMORY_GAME][sOcarinaMemoryGameAppendPos].pitch = randomPitch; + sOcarinaSongNotes[OCARINA_SONG_MEMORY_GAME][sOcarinaMemoryGameAppendPos].length = 45; + sOcarinaSongNotes[OCARINA_SONG_MEMORY_GAME][sOcarinaMemoryGameAppendPos].volume = 0x50; + sOcarinaSongNotes[OCARINA_SONG_MEMORY_GAME][sOcarinaMemoryGameAppendPos].vibrato = 0; + sOcarinaSongNotes[OCARINA_SONG_MEMORY_GAME][sOcarinaMemoryGameAppendPos].bend = 0; sOcarinaMemoryGameAppendPos++; - sOcarinaSongNotes[OCARINA_SONG_MEMORYGAME][sOcarinaMemoryGameAppendPos].pitch = OCARINA_PITCH_NONE; - sOcarinaSongNotes[OCARINA_SONG_MEMORYGAME][sOcarinaMemoryGameAppendPos].length = 0; - sOcarinaSongNotes[OCARINA_SONG_MEMORYGAME][sOcarinaMemoryGameAppendPos + 1].pitch = OCARINA_PITCH_NONE; - sOcarinaSongNotes[OCARINA_SONG_MEMORYGAME][sOcarinaMemoryGameAppendPos + 1].length = 0; + sOcarinaSongNotes[OCARINA_SONG_MEMORY_GAME][sOcarinaMemoryGameAppendPos].pitch = OCARINA_PITCH_NONE; + sOcarinaSongNotes[OCARINA_SONG_MEMORY_GAME][sOcarinaMemoryGameAppendPos].length = 0; + sOcarinaSongNotes[OCARINA_SONG_MEMORY_GAME][sOcarinaMemoryGameAppendPos + 1].pitch = OCARINA_PITCH_NONE; + sOcarinaSongNotes[OCARINA_SONG_MEMORY_GAME][sOcarinaMemoryGameAppendPos + 1].length = 0; if (1) {} return false; } -#undef OCARINA_SONG_MEMORYGAME +#undef OCARINA_SONG_MEMORY_GAME -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019D600.s") +void AudioOcarina_Update(void) { + sOcarinaUpdateTaskStart = gAudioContext.totalTaskCount; + if (sOcarinaInstrumentId != OCARINA_INSTRUMENT_OFF) { + if (sIsOcarinaInputEnabled == true) { + AudioOcarina_ReadControllerInput(); + } -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019D758.s") + if ((sPlaybackState == 0) && (sIsOcarinaInputEnabled == true)) { + AudioOcarina_PlayControllerInput(false); + } -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019D864.s") + if (sOcarinaFlags != 0) { + if (sOcarinaFlags & 0x40000000) { + AudioOcarina_CheckSongsWithoutMusicStaff(); + } else { + AudioOcarina_CheckSongsWithMusicStaff(); + } + } -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019D8B4.s") + AudioOcarina_PlaybackSong(); + sOcarinaPlaybackTaskStart = sOcarinaUpdateTaskStart; -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019D8E4.s") + if (sPlaybackState == 0) { + AudioOcarina_RecordSong(); + } -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019DF28.s") + if ((sOcarinaFlags != 0) && (sPrevOcarinaPitch != sCurOcarinaPitch)) { + sOcarinaDropInputTimer = 1; // Drops ocarina input for 1 frame + } -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019DF64.s") + sPrevOcarinaPitch = sCurOcarinaPitch; + + if (sOcarinaDisableTimer != 0) { + sOcarinaDisableTimer--; + if (sOcarinaDisableTimer == 0) { + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); + } + } + } + + AudioOcarina_UpdatePlayingStaff(); + AudioOcarina_UpdatePlaybackStaff(); + AudioOcarina_UpdateRecordingStaff(); +} + +#define OCARINA_INSTRUMENT_OOT_MAX 7 + +void AudioOcarina_PlayLongScarecrowAfterCredits(void) { + static u8 sScarecrowAfterCreditsState = 0; + static u8 sScarecrowAfterCreditsIntrumentId = OCARINA_INSTRUMENT_DEFAULT; + static u16 sScarecrowAfterCreditsTimer = 1200; + + switch (sScarecrowAfterCreditsState) { + case 0: + if (sScarecrowAfterCreditsTimer-- == 0) { + // OoT originally had 7 Ocarina instruments + // MM has more so this does not go all the way to the max + if (sScarecrowAfterCreditsIntrumentId < OCARINA_INSTRUMENT_OOT_MAX) { + // set next ocarina instrument and restart + sScarecrowAfterCreditsState++; + } else { + // finished + sScarecrowAfterCreditsState = 3; + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); + } + sScarecrowAfterCreditsTimer = 1200; + } + break; + + case 1: + Audio_SetSfxBanksMute(0); + AudioOcarina_SetInstrument(sScarecrowAfterCreditsIntrumentId); + AudioOcarina_SetPlaybackSong(OCARINA_SONG_SCARECROW_LONG + 1, 1); + sScarecrowAfterCreditsIntrumentId++; + sScarecrowAfterCreditsState++; + break; + + case 2: + if (AudioOcarina_GetPlaybackStaff()->state == 0) { + sScarecrowAfterCreditsState = 0; + } + break; + } +} + +u8 sRequestCustomSequence = false; + +void AudioOcarina_SetCustomSequence(void) { + // Never passes true as sRequestCustomSequence is never set true + if (sRequestCustomSequence && gAudioContext.seqPlayers[SEQ_PLAYER_FANFARE].enabled && + ((u8)gAudioContext.seqPlayers[SEQ_PLAYER_FANFARE].soundScriptIO[0] == 0xFF)) { + gAudioContext.seqPlayers[SEQ_PLAYER_FANFARE].seqData = sCustomSequenceScript; + sRequestCustomSequence = false; + } +} + +// Called by unused function +void AudioOcarina_PlayCustomSequence(void) { + sRequestCustomSequence = true; + Audio_QueueSeqCmd(0x00000000 | ((u32)(SEQ_PLAYER_FANFARE) << 24) | ((u32)(0) << 0x10) | + (u32)(NA_BGM_DUNGEON_APPEAR)); +} + +// Unused +// Regalloc Swap https://decomp.me/scratch/QEovr +#ifdef NON_MATCHING +s32 AudioOcarina_CreateCustomSequence(void) { + OcarinaNote* prevNote; + u16 i; + u16 phi_s4; + u16 temp_a0; // delay1 + u16 phi_a2; // delay2 + u8 absPitch; + s8 phi_a0; // adjBendIndex + s8 phi_s2; // prevBend + u8 phi_t1; // vibrato + u8 phi_t5; // isLegato + u16 temp_t4; // prevNoteLength + + phi_a2 = 0; + phi_t1 = 0; + phi_s2 = 0; + phi_t5 = 0; + phi_s4 = 0; + + sCustomSequencePc = 39; // .channel chan_loop + + prevNote = &sScarecrowsLongSongNotes[0]; + for (i = 1; ((prevNote->pitch == OCARINA_PITCH_NONE) && (prevNote->length != 0)); i++) { + prevNote = &sScarecrowsLongSongNotes[i]; + } + + for (; (prevNote->length != 0) && (sCustomSequencePc < 394); i++) { + + temp_a0 = ((prevNote->length * 48) / 30); + + if (phi_t1 != prevNote->vibrato) { + sCustomSequenceScript[sCustomSequencePc++] = 0xFD; // delay cmd + + if (phi_a2 >= 0x80) { + // Store as compressed u16 + sCustomSequenceScript[sCustomSequencePc++] = (((phi_a2 >> 8) & 0xFF) & 0x7F) + 0x80; // delay arg + sCustomSequenceScript[sCustomSequencePc++] = phi_a2 & 0xFF; // delay arg + } else { + // Store as u8 + sCustomSequenceScript[sCustomSequencePc++] = phi_a2; // delay arg + } + + sCustomSequenceScript[sCustomSequencePc++] = 0xD8; // vibdepth cmd + sCustomSequenceScript[sCustomSequencePc++] = prevNote->vibrato; // vibdepth arg + + phi_a2 = temp_a0; + phi_t1 = prevNote->vibrato; + } else { + phi_a2 += temp_a0; + } + + prevNote = &sScarecrowsLongSongNotes[i]; + } + + if (phi_a2 != 0) { + sCustomSequenceScript[sCustomSequencePc++] = 0xFD; // delay cmd + if (phi_a2 >= 0x80) { + // Store as compressed u16 + sCustomSequenceScript[sCustomSequencePc++] = (((phi_a2 >> 8) & 0xFF) & 0x7F) + 0x80; // delay arg + sCustomSequenceScript[sCustomSequencePc++] = phi_a2 & 0xFF; // delay arg + } else { + // Store as u8 + sCustomSequenceScript[sCustomSequencePc++] = phi_a2; // delay arg + } + } + + sCustomSequenceScript[sCustomSequencePc++] = 0xFF; // end cmd + + // ldlayer 0, layer0 + sCustomSequenceScript[24] = sCustomSequencePc >> 8; + sCustomSequenceScript[25] = sCustomSequencePc & 0xFF; + + // ldlayer 1, layer1 + sCustomSequenceScript[27] = (sCustomSequencePc + 4) >> 8; + sCustomSequenceScript[28] = (sCustomSequencePc + 4) & 0xFF; + + sCustomSequenceScript[sCustomSequencePc++] = 0xC2; // transpose cmd + sCustomSequenceScript[sCustomSequencePc++] = -5; // transpose arg + + sCustomSequenceScript[sCustomSequencePc++] = 0xC0; // ldelay cmd + sCustomSequenceScript[sCustomSequencePc++] = 8; // ldelay arg + + sCustomSequenceScript[sCustomSequencePc++] = 0xC1; // shortvel cmd + sCustomSequenceScript[sCustomSequencePc++] = 87; // shortvel arg + + sCustomSequenceScript[sCustomSequencePc++] = 0xC9; // shortgate cmd + sCustomSequenceScript[sCustomSequencePc++] = 0; // shortgate arg + + if (1) {} + if (1) {} // TODO: Needed? + + prevNote = &sScarecrowsLongSongNotes[0]; + + for (i = 1; ((prevNote->pitch == OCARINA_PITCH_NONE) && (prevNote->length != 0)); i++) { + prevNote = &sScarecrowsLongSongNotes[i]; + } + + for (; ((temp_t4 = prevNote->length) != 0) && (sCustomSequencePc < 394); i++) { + + if (prevNote->pitch == sScarecrowsLongSongNotes[i].pitch) { + if ((sScarecrowsLongSongNotes[i].length != 0) && (phi_t5 == 0)) { + sCustomSequenceScript[sCustomSequencePc++] = 0xC4; // legato cmd + phi_t5 = 1; + } + } else if ((phi_t5 == 1) && (sScarecrowsLongSongNotes[i].pitch != OCARINA_PITCH_NONE) && + (sScarecrowsLongSongNotes[i].pitch != OCARINA_PITCH_C4)) { + sCustomSequenceScript[sCustomSequencePc++] = 0xC5; // nolegato cmd + phi_t5 = 0; + } + + if (phi_s2 != prevNote->bend) { + sCustomSequenceScript[sCustomSequencePc++] = 0xCE; // bendfine cmd + + if (ABS_ALT(prevNote->bend) > 64) { + phi_a0 = 127; + } else if (prevNote->bend < 0) { + phi_a0 = -prevNote->bend; + } else { + phi_a0 = ((prevNote->bend * 127) / 64); + } + + if (prevNote->bend < 0) { + phi_a0 *= -1; + } + + sCustomSequenceScript[sCustomSequencePc++] = phi_a0; // bendfine arg + + phi_s2 = prevNote->bend; + } + + absPitch = prevNote->pitch + 39; // convert ocarina pitch to absolute pitch, + PITCH_C4 (Middle C) + if (prevNote->pitch != OCARINA_PITCH_NONE) { + sCustomSequenceScript[sCustomSequencePc++] = absPitch; // shortdvg cmd, shortdvg arg + } else { + sCustomSequenceScript[sCustomSequencePc++] = 0xC0; // ldelay cmd + } + + // delay/duration + temp_a0 = ((temp_t4 * 48) + phi_s4) / 30; + + if (temp_a0 < 0x80) { + // Store as u8 + sCustomSequenceScript[sCustomSequencePc++] = temp_a0; // shortdvg/ldelay arg + } else { + // Store as compressed u16 + sCustomSequenceScript[sCustomSequencePc++] = (((temp_a0 >> 8) & 0xFF) & 0x7F) + 0x80; // shortdvg/ldelay arg + sCustomSequenceScript[sCustomSequencePc++] = temp_a0 & 0xFF; // shortdvg/ldelay arg + } + + if (1) {} + + phi_s4 = ((temp_t4 * 48) + phi_s4) - (temp_a0 * 30); + + prevNote = &sScarecrowsLongSongNotes[i]; + } + + sCustomSequenceScript[sCustomSequencePc++] = 0xFF; // end cmd + + AudioOcarina_PlayCustomSequence(); + + if (i >= 394) { + return -1; + } + + return 0; +} +#else +#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/AudioOcarina_CreateCustomSequence.s") +#endif + +void AudioOcarina_ResetInstrument(void) { + if (sOcarinaInstrumentId != OCARINA_INSTRUMENT_OFF) { + Audio_QueueSeqCmd(0x80000000 | ((u32)(SEQ_PLAYER_SFX) << 24) | ((u32)(1) << 16) | + ((u32)(SFX_CHANNEL_OCARINA) << 8) | (u32)(0)); + sOcarinaInstrumentId = OCARINA_INSTRUMENT_OFF; + AudioOcarina_ResetAndMute(); + } +} + +void AudioOcarina_ResetStaffs(void) { + u8 songIndex; + + sPlayingStaff.buttonIndex = OCARINA_BTN_INVALID; + sPlayingStaff.state = 0xFF; + sPlayingStaff.pos = 0; + + sPlaybackStaff.buttonIndex = OCARINA_BTN_INVALID; + sPlaybackStaff.state = 0; + sPlaybackStaff.pos = 0; + + sRecordingStaff.buttonIndex = OCARINA_BTN_INVALID; + sRecordingStaff.state = 0xFF; + sRecordingStaff.pos = 0; + + sOcarinaDisableTimer = 0; + sOcarinaDropInputTimer = 0; + + for (songIndex = OCARINA_SONG_SONATA; songIndex < OCARINA_SONG_MAX; songIndex++) { + D_801FD518[songIndex] = 0xFF; + D_801FD530[songIndex] = 0; + } + + D_801D8534 = 0; +} + +s8 D_801D8B30[] = { + 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 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, 56, 57, 57, 58, 58, 59, 59, 60, 60, 60, 61, 61, 61, 62, 62, 62, 63, 63, 63, 64, 64, + 64, 65, 65, 65, 66, 66, 66, 67, 67, 67, 68, 68, 69, 69, 70, 70, 71, 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, 105, 107, 109, 111, 113, 115, 117, 119, 121, 123, 125, 127, +}; +f32 sBigBellsVolume[8] = { + 1.0f, 0.9f, 0.8f, 0.7f, 0.6f, 0.5f, 0.4f, 0.3f, +}; +u8 sBgmPlayers[2] = { SEQ_PLAYER_BGM_MAIN, SEQ_PLAYER_BGM_SUB }; +f32 sSfxOriginalPos[] = { 0.0f, 0.0f, 0.0f }; #pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_8019DFF8.s") @@ -2226,7 +3593,7 @@ void Audio_PlaySfxForRiver(Vec3f* pos, f32 freqScale) { sRiverFreqScaleLerp.step = (sRiverFreqScaleLerp.target - sRiverFreqScaleLerp.value) / 40; } Audio_PlaySfxGeneral(NA_SE_EV_RIVER_STREAM - SFX_FLAG, pos, 4, &sRiverFreqScaleLerp.value, &D_801DB4B0, - &D_801DB4B8); + &gSfxDefaultReverb); } /** @@ -2242,7 +3609,7 @@ void Audio_PlaySfxForWaterfall(Vec3f* pos, f32 freqScale) { sWaterfallFreqScaleLerp.step = (sWaterfallFreqScaleLerp.target - sWaterfallFreqScaleLerp.value) / 40; } Audio_PlaySfxGeneral(NA_SE_EV_WATER_WALL_BIG - SFX_FLAG, pos, 4, &sWaterfallFreqScaleLerp.value, - &sWaterfallFreqScaleLerp.value, &D_801DB4B8); + &sWaterfallFreqScaleLerp.value, &gSfxDefaultReverb); } /** @@ -2664,7 +4031,7 @@ void Audio_ClearSariaBgm2(void) { #pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_801A4348.s") -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_801A4380.s") +#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/Audio_SetSfxVolumeExceptSystemAndOcarinaBanks.s") #pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/func_801A4428.s") diff --git a/src/code/audio/code_801A5BD0.c b/src/code/audio/code_801A5BD0.c index 8397fd52e6..38e4ff187a 100644 --- a/src/code/audio/code_801A5BD0.c +++ b/src/code/audio/code_801A5BD0.c @@ -1,10 +1,10 @@ #include "global.h" -#pragma GLOBAL_ASM("asm/non_matchings/code/code_801A5BD0/func_801A5BD0.s") +#pragma GLOBAL_ASM("asm/non_matchings/code/code_801A5BD0/Audio_SetSfxBanksMute.s") -#pragma GLOBAL_ASM("asm/non_matchings/code/code_801A5BD0/func_801A5C28.s") +#pragma GLOBAL_ASM("asm/non_matchings/code/code_801A5BD0/Audio_SetFlagForBgmVolumeLow.s") -#pragma GLOBAL_ASM("asm/non_matchings/code/code_801A5BD0/func_801A5C8C.s") +#pragma GLOBAL_ASM("asm/non_matchings/code/code_801A5BD0/Audio_ClearFlagForBgmVolumeLow.s") #pragma GLOBAL_ASM("asm/non_matchings/code/code_801A5BD0/Audio_PlaySfxGeneral.s") @@ -30,7 +30,7 @@ #pragma GLOBAL_ASM("asm/non_matchings/code/code_801A5BD0/func_801A7484.s") -#pragma GLOBAL_ASM("asm/non_matchings/code/code_801A5BD0/func_801A75E8.s") +#pragma GLOBAL_ASM("asm/non_matchings/code/code_801A5BD0/Audio_StopSfxById.s") #pragma GLOBAL_ASM("asm/non_matchings/code/code_801A5BD0/func_801A7720.s") diff --git a/src/code/z_actor.c b/src/code/z_actor.c index d792b276ad..53341c7831 100644 --- a/src/code/z_actor.c +++ b/src/code/z_actor.c @@ -2128,7 +2128,7 @@ void func_800B8E58(Player* player, u16 sfxId) { if (player->currentMask == PLAYER_MASK_GIANT) { func_8019F170(&player->actor.projectedPos, sfxId); } else { - Audio_PlaySfxGeneral(sfxId, &player->actor.projectedPos, 4, &D_801DB4B0, &D_801DB4B0, &D_801DB4B8); + Audio_PlaySfxGeneral(sfxId, &player->actor.projectedPos, 4, &D_801DB4B0, &D_801DB4B0, &gSfxDefaultReverb); } } @@ -2568,13 +2568,13 @@ void func_800B9D1C(Actor* actor) { if (sfxId != 0) { if (actor->audioFlags & 2) { - Audio_PlaySfxGeneral(sfxId, &actor->projectedPos, 4, &D_801DB4B0, &D_801DB4B0, &D_801DB4B8); + Audio_PlaySfxGeneral(sfxId, &actor->projectedPos, 4, &D_801DB4B0, &D_801DB4B0, &gSfxDefaultReverb); } else if (actor->audioFlags & 4) { play_sound(sfxId); } else if (actor->audioFlags & 8) { func_8019F128(sfxId); } else if (actor->audioFlags & 0x10) { - func_801A0810(&D_801DB4A4, NA_SE_SY_TIMER - SFX_FLAG, (sfxId - 1)); + func_801A0810(&gSfxDefaultPos, NA_SE_SY_TIMER - SFX_FLAG, (sfxId - 1)); } else if (actor->audioFlags & 1) { Audio_PlaySfxAtPos(&actor->projectedPos, sfxId); } diff --git a/src/code/z_demo.c b/src/code/z_demo.c index 383f8928a7..b02fe51a97 100644 --- a/src/code/z_demo.c +++ b/src/code/z_demo.c @@ -256,8 +256,7 @@ void Cutscene_Command_Misc(PlayState* play2, CutsceneContext* csCtx, CsCmdBase* } break; case 0x13: - // AudioOcarina_PlayLongScarecrowAfterCredits - func_8019D758(); + AudioOcarina_PlayLongScarecrowAfterCredits(); csCtx->frames = cmd->startFrame - 1; break; case 0x14: diff --git a/src/code/z_sram_NES.c b/src/code/z_sram_NES.c index bb6308fb6d..221305f463 100644 --- a/src/code/z_sram_NES.c +++ b/src/code/z_sram_NES.c @@ -1000,10 +1000,10 @@ void Sram_OpenSave(FileChooseContext* fileChooseCtx, SramContext* sramCtx) { } if (gSaveContext.save.unk_F65) { - Lib_MemCpy(gScarecrowSpawnSongPtr, gSaveContext.save.scarecrowsSong, - sizeof(gSaveContext.save.scarecrowsSong)); + Lib_MemCpy(gScarecrowSpawnSongPtr, gSaveContext.save.scarecrowSpawnSong, + sizeof(gSaveContext.save.scarecrowSpawnSong)); - for (i = 0; i != ARRAY_COUNT(gSaveContext.save.scarecrowsSong); i++) {} + for (i = 0; i != ARRAY_COUNT(gSaveContext.save.scarecrowSpawnSong); i++) {} } fileNum = gSaveContext.fileNum; diff --git a/src/overlays/actors/ovl_Bg_Spdweb/z_bg_spdweb.c b/src/overlays/actors/ovl_Bg_Spdweb/z_bg_spdweb.c index 4325bc2595..5ee6bfcf54 100644 --- a/src/overlays/actors/ovl_Bg_Spdweb/z_bg_spdweb.c +++ b/src/overlays/actors/ovl_Bg_Spdweb/z_bg_spdweb.c @@ -338,7 +338,7 @@ void func_809CE4C8(BgSpdweb* this, PlayState* play) { if (this->unk_164 > 3.0f) { Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_WEB_VIBRATION); } else { - func_801A75E8(NA_SE_EV_WEB_VIBRATION); + Audio_StopSfxById(NA_SE_EV_WEB_VIBRATION); } } diff --git a/src/overlays/actors/ovl_Boss_03/z_boss_03.c b/src/overlays/actors/ovl_Boss_03/z_boss_03.c index 449660f7eb..33c6b6fc7d 100644 --- a/src/overlays/actors/ovl_Boss_03/z_boss_03.c +++ b/src/overlays/actors/ovl_Boss_03/z_boss_03.c @@ -808,7 +808,7 @@ void Boss03_CatchPlayer(Boss03* this, PlayState* play) { if ((&this->actor != player->actor.parent) && (play->grabPlayer(play, player) != 0)) { player->actor.parent = &this->actor; Audio_PlaySfxGeneral(NA_SE_VO_LI_DAMAGE_S, &player->actor.projectedPos, 4, &D_801DB4B0, &D_801DB4B0, - &D_801DB4B8); + &gSfxDefaultReverb); Boss03_SetupChewPlayer(this, play); } } else { diff --git a/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c b/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c index 0e5f572099..3d84f53560 100644 --- a/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c +++ b/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c @@ -730,7 +730,7 @@ void DmStk_PlaySfxForEndingCutsceneSecondPart(DmStk* this, PlayState* play) { break; case 2000: - func_801A5BD0(0x7F); + Audio_SetSfxBanksMute(0x7F); break; } diff --git a/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c b/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c index 881785fe13..9d73fb9eac 100644 --- a/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c +++ b/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c @@ -446,7 +446,8 @@ void func_808B977C(DoorWarp1* this, PlayState* play) { if (func_808B866C(this, play) && !Play_InCsMode(play)) { Player* player = GET_PLAYER(play); - Audio_PlaySfxGeneral(NA_SE_EV_LINK_WARP, &player->actor.projectedPos, 4, &D_801DB4B0, &D_801DB4B0, &D_801DB4B8); + Audio_PlaySfxGeneral(NA_SE_EV_LINK_WARP, &player->actor.projectedPos, 4, &D_801DB4B0, &D_801DB4B0, + &gSfxDefaultReverb); func_800B7298(play, &this->dyna.actor, 9); player->unk_3A0.x = this->dyna.actor.world.pos.x; player->unk_3A0.z = this->dyna.actor.world.pos.z; @@ -619,7 +620,8 @@ void func_808B9FD0(DoorWarp1* this, PlayState* play) { ActorCutscene_SetIntentToPlay(play->playerActorCsIds[9]); } else { ActorCutscene_Start(play->playerActorCsIds[9], NULL); - Audio_PlaySfxGeneral(NA_SE_EV_LINK_WARP, &player->actor.projectedPos, 4, &D_801DB4B0, &D_801DB4B0, &D_801DB4B8); + Audio_PlaySfxGeneral(NA_SE_EV_LINK_WARP, &player->actor.projectedPos, 4, &D_801DB4B0, &D_801DB4B0, + &gSfxDefaultReverb); Animation_ChangeImpl(&this->skelAnime, &object_warp1_Anim_001374, 1.0f, Animation_GetLastFrame(&object_warp1_Anim_001374.common), Animation_GetLastFrame(&object_warp1_Anim_001374.common), 2, 40.0f, 1); diff --git a/src/overlays/actors/ovl_En_Bji_01/z_en_bji_01.c b/src/overlays/actors/ovl_En_Bji_01/z_en_bji_01.c index a84e9e4308..a9a156a6f9 100644 --- a/src/overlays/actors/ovl_En_Bji_01/z_en_bji_01.c +++ b/src/overlays/actors/ovl_En_Bji_01/z_en_bji_01.c @@ -293,7 +293,7 @@ void EnBji01_DialogueHandler(EnBji01* this, PlayState* play) { } void func_809CD634(EnBji01* this, PlayState* play) { - func_801A5BD0(0x6F); + Audio_SetSfxBanksMute(0x6F); Audio_QueueSeqCmd(0xE0000101); play->nextEntranceIndex = 0x54A0; /* Termina Field from telescope */ gSaveContext.respawn[RESPAWN_MODE_DOWN].entranceIndex = play->nextEntranceIndex; @@ -350,7 +350,7 @@ void EnBji01_Init(Actor* thisx, PlayState* play) { break; case 0x4C20: /* Observatory from Termina Field telescope */ this->actor.flags |= ACTOR_FLAG_10000; - func_801A5BD0(0); + Audio_SetSfxBanksMute(0); Audio_QueueSeqCmd(0xE0000100); this->actor.params = SHIKASHI_TYPE_LOOKED_THROUGH_TELESCOPE; func_809CCE98(this, play); diff --git a/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.c b/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.c index 3ad9f3bd14..6c80198379 100644 --- a/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.c +++ b/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.c @@ -570,7 +570,7 @@ void EnClearTag_UpdateCamera(EnClearTag* this, PlayState* play) { this->subCamAt.z = mainCam->at.z; Message_StartTextbox(play, 0xF, NULL); this->cameraState = 2; - func_8019FDC8(&D_801DB4A4, NA_SE_VO_NA_LISTEN, 0x20); + func_8019FDC8(&gSfxDefaultPos, NA_SE_VO_NA_LISTEN, 0x20); case 2: if (player->actor.world.pos.z > 0.0f) { player->actor.world.pos.z = 290.0f; diff --git a/src/overlays/actors/ovl_En_Elf/z_en_elf.c b/src/overlays/actors/ovl_En_Elf/z_en_elf.c index 795b2cb9e5..bc84c329b9 100644 --- a/src/overlays/actors/ovl_En_Elf/z_en_elf.c +++ b/src/overlays/actors/ovl_En_Elf/z_en_elf.c @@ -1468,7 +1468,7 @@ void func_8089010C(Actor* thisx, PlayState* play) { } if (Actor_ProcessTalkRequest(thisx, &play->state)) { - func_8019FDC8(&D_801DB4A4, NA_SE_VO_NA_LISTEN, 0x20); + func_8019FDC8(&gSfxDefaultPos, NA_SE_VO_NA_LISTEN, 0x20); thisx->focus.pos = thisx->world.pos; if (thisx->textId == ElfMessage_GetFirstCycleHint(play)) { diff --git a/src/overlays/actors/ovl_En_Gakufu/z_en_gakufu.c b/src/overlays/actors/ovl_En_Gakufu/z_en_gakufu.c index 8c7d883da6..cc19acb63d 100644 --- a/src/overlays/actors/ovl_En_Gakufu/z_en_gakufu.c +++ b/src/overlays/actors/ovl_En_Gakufu/z_en_gakufu.c @@ -106,12 +106,12 @@ void EnGakufu_ProcessNotes(EnGakufu* this) { s32 songIndex; AudioOcarina_TerminaWallGenerateNotes(); - AudioOcarina_SetInstrumentId(OCARINA_INSTRUMENT_DEFAULT); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT); AudioOcarina_StartDefault((1 << this->songIndex) | 0x80000000); playbackStaff = AudioOcarina_GetPlaybackStaff(); playbackStaff->pos = 0; playbackStaff->state = 0xFF; - AudioOcarina_SetInstrumentId(OCARINA_INSTRUMENT_OFF); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); songIndex = this->songIndex; ocarinaSongButtons = &gOcarinaSongButtons[songIndex]; diff --git a/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c b/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c index 31fe293694..9125b48f18 100644 --- a/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c +++ b/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c @@ -774,10 +774,10 @@ void EnKakasi_PostSongLearnDialogue(EnKakasi* this, PlayState* play) { } else { this->talkState = TEXT_STATE_5; if (play->msgCtx.choiceIndex == 1) { - func_8019F208(); // play 0x4808 sfx (decide) and calls func_801A75E8 + func_8019F208(); // play 0x4808 sfx (decide) and calls Audio_StopSfxById this->actor.textId = 0x164A; } else { - func_8019F230(); // play 0x480A sfx (cancel) and calls func_801A75E8 + func_8019F230(); // play 0x480A sfx (cancel) and calls Audio_StopSfxById this->actor.textId = 0x1661; } } diff --git a/src/overlays/actors/ovl_En_Mm3/z_en_mm3.c b/src/overlays/actors/ovl_En_Mm3/z_en_mm3.c index d263df3c81..c66f96bd54 100644 --- a/src/overlays/actors/ovl_En_Mm3/z_en_mm3.c +++ b/src/overlays/actors/ovl_En_Mm3/z_en_mm3.c @@ -366,7 +366,7 @@ void func_80A6F9DC(EnMm3* this, PlayState* play) { } void func_80A6FBA0(EnMm3* this) { - func_801A5BD0(0x6F); + Audio_SetSfxBanksMute(0x6F); func_801A0238(0, 5); gSaveContext.save.weekEventReg[63] |= 1; gSaveContext.save.weekEventReg[63] &= (u8)~2; @@ -391,7 +391,7 @@ void func_80A6FBFC(EnMm3* this, PlayState* play) { } if (Actor_ProcessTalkRequest(&this->actor, &play->state)) { - func_801A5BD0(0); + Audio_SetSfxBanksMute(0); func_801A0238(0x7F, 5); Message_StartTextbox(play, 0x2791, &this->actor); this->unk_2B4 = 0x2791; diff --git a/src/overlays/actors/ovl_En_Nwc/z_en_nwc.c b/src/overlays/actors/ovl_En_Nwc/z_en_nwc.c index 972513c04a..2f842c8aed 100644 --- a/src/overlays/actors/ovl_En_Nwc/z_en_nwc.c +++ b/src/overlays/actors/ovl_En_Nwc/z_en_nwc.c @@ -236,7 +236,7 @@ void EnNwc_CheckFound(EnNwc* this, PlayState* play) { } EnNwc_ChangeState(this, NWC_STATE_FOLLOWING); - func_801A0868(&D_801DB4A4, NA_SE_SY_CHICK_JOIN_CHIME, currentChickCount); + func_801A0868(&gSfxDefaultPos, NA_SE_SY_CHICK_JOIN_CHIME, currentChickCount); } } diff --git a/src/overlays/actors/ovl_En_Test6/z_en_test6.c b/src/overlays/actors/ovl_En_Test6/z_en_test6.c index 7d26a6fb81..cc96be0207 100644 --- a/src/overlays/actors/ovl_En_Test6/z_en_test6.c +++ b/src/overlays/actors/ovl_En_Test6/z_en_test6.c @@ -593,9 +593,9 @@ void func_80A91760(EnTest6* this, PlayState* play) { (CHECK_BTN_ALL(input->press.button, BTN_A) || CHECK_BTN_ALL(input->press.button, BTN_B))) { this->unk_286 = 1; if (ENTEST6_GET(&this->actor) == ENTEST6_25) { - func_801A75E8(NA_SE_SY_TIME_CONTROL_SLOW); + Audio_StopSfxById(NA_SE_SY_TIME_CONTROL_SLOW); } else if (ENTEST6_GET(&this->actor) == ENTEST6_24) { - func_801A75E8(NA_SE_SY_TIME_CONTROL_NORMAL); + Audio_StopSfxById(NA_SE_SY_TIME_CONTROL_NORMAL); } } diff --git a/src/overlays/actors/ovl_En_Tru/z_en_tru.c b/src/overlays/actors/ovl_En_Tru/z_en_tru.c index 943742da33..6599928547 100644 --- a/src/overlays/actors/ovl_En_Tru/z_en_tru.c +++ b/src/overlays/actors/ovl_En_Tru/z_en_tru.c @@ -994,7 +994,7 @@ s32 func_80A87DC0(Actor* thisx, PlayState* play) { break; case 2: - func_801A75E8(NA_SE_EN_KOUME_MAGIC); + Audio_StopSfxById(NA_SE_EN_KOUME_MAGIC); Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KOUME_AWAY); Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_KOUME_LAUGH); func_80A86924(this, 13); diff --git a/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c b/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c index b59b684109..c2ed3f3a11 100644 --- a/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c +++ b/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c @@ -247,7 +247,7 @@ void EnWallmas_WaitToDrop(EnWallmas* this, PlayState* play) { (player->actor.freezeTimer > 0) || !(player->actor.bgCheckFlags & 1) || ((WALLMASTER_GET_TYPE(&this->actor) == WALLMASTER_TYPE_PROXIMITY) && (Math_Vec3f_DistXZ(&this->actor.home.pos, playerPos) > (120.f + this->detectionRadius)))) { - func_801A75E8(NA_SE_EN_FALL_AIM); + Audio_StopSfxById(NA_SE_EN_FALL_AIM); this->timer = 130; } diff --git a/src/overlays/actors/ovl_En_Zot/z_en_zot.c b/src/overlays/actors/ovl_En_Zot/z_en_zot.c index 0933d2240b..1c781a92d3 100644 --- a/src/overlays/actors/ovl_En_Zot/z_en_zot.c +++ b/src/overlays/actors/ovl_En_Zot/z_en_zot.c @@ -1103,14 +1103,14 @@ void func_80B98AD0(EnZot* this, PlayState* play) { func_801477B4(play); this->actionFunc = func_80B98CA8; gSaveContext.save.weekEventReg[41] &= (u8)~0x20; - AudioOcarina_SetInstrumentId(OCARINA_INSTRUMENT_OFF); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); break; case 0x12BA: func_801477B4(play); this->actionFunc = func_80B98CA8; gSaveContext.save.weekEventReg[41] |= 0x20; - AudioOcarina_SetInstrumentId(OCARINA_INSTRUMENT_OFF); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); break; default: diff --git a/src/overlays/actors/ovl_Obj_Nozoki/z_obj_nozoki.c b/src/overlays/actors/ovl_Obj_Nozoki/z_obj_nozoki.c index a5b6401335..c4276efed5 100644 --- a/src/overlays/actors/ovl_Obj_Nozoki/z_obj_nozoki.c +++ b/src/overlays/actors/ovl_Obj_Nozoki/z_obj_nozoki.c @@ -362,7 +362,7 @@ void func_80BA2C94(ObjNozoki* this, PlayState* play) { play->roomCtx.unk7A[0] = this->dyna.actor.velocity.x; - func_8019FAD8(&D_801DB4A4, NA_SE_EV_SECOM_CONVEYOR - SFX_FLAG, this->dyna.actor.speedXZ); + func_8019FAD8(&gSfxDefaultPos, NA_SE_EV_SECOM_CONVEYOR - SFX_FLAG, this->dyna.actor.speedXZ); } void func_80BA3044(ObjNozoki* this, PlayState* play) { diff --git a/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.c b/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.c index c653bd25d6..61a6c1bce3 100644 --- a/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.c +++ b/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.c @@ -255,7 +255,7 @@ void ObjSyokudai_Update(Actor* thisx, PlayState* play2) { } } Audio_PlaySfxGeneral(NA_SE_EV_FLAME_IGNITION, &thisx->projectedPos, 4, &D_801DB4B0, &D_801DB4B0, - &D_801DB4B8); + &gSfxDefaultReverb); } } } diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt index 8605e3449f..55e98cf598 100644 --- a/tools/disasm/functions.txt +++ b/tools/disasm/functions.txt @@ -3805,52 +3805,52 @@ 0x8019ADBC:("AudioSeq_InitSequencePlayers",), 0x8019AE40:("func_8019AE40",), 0x8019AEC0:("func_8019AEC0",), - 0x8019AF00:("func_8019AF00",), - 0x8019AF58:("func_8019AF58",), - 0x8019AFE8:("func_8019AFE8",), - 0x8019B02C:("func_8019B02C",), - 0x8019B074:("AudioOcarina_MapSongFromNotesToButtons",), - 0x8019B144:("func_8019B144",), - 0x8019B378:("func_8019B378",), - 0x8019B38C:("func_8019B38C",), - 0x8019B3D0:("func_8019B3D0",), - 0x8019B4B8:("func_8019B4B8",), + 0x8019AF00:("AudioOcarina_ReadControllerInput",), + 0x8019AF58:("AudioOcarina_BendPitchTwoSemitones",), + 0x8019AFE8:("AudioOcarina_GetPlayingState",), + 0x8019B02C:("AudioOcarina_MapPitchToButton",), + 0x8019B074:("AudioOcarina_MapSongFromPitchToButton",), + 0x8019B144:("AudioOcarina_Start",), + 0x8019B378:("AudioOcarina_SetSongStartingPos",), + 0x8019B38C:("AudioOcarina_StartAtSongStartingPos",), + 0x8019B3D0:("AudioOcarina_StartForSongCheck",), + 0x8019B4B8:("AudioOcarina_StartWithSongNoteLengths",), 0x8019B544:("AudioOcarina_StartDefault",), 0x8019B568:("func_8019B568",), 0x8019B5AC:("func_8019B5AC",), 0x8019B5EC:("func_8019B5EC",), - 0x8019B618:("func_8019B618",), - 0x8019B654:("func_8019B654",), - 0x8019B6B4:("func_8019B6B4",), - 0x8019BC44:("func_8019BC44",), - 0x8019BE98:("func_8019BE98",), - 0x8019C1C0:("func_8019C1C0",), - 0x8019C1D0:("func_8019C1D0",), - 0x8019C268:("func_8019C268",), - 0x8019C2E4:("func_8019C2E4",), - 0x8019C300:("AudioOcarina_SetInstrumentId",), - 0x8019C398:("func_8019C398",), - 0x8019C5A0:("func_8019C5A0",), - 0x8019C8D8:("func_8019C8D8",), - 0x8019CD08:("func_8019CD08",), - 0x8019CE34:("func_8019CE34",), - 0x8019CE6C:("func_8019CE6C",), - 0x8019CEBC:("func_8019CEBC",), - 0x8019CF6C:("func_8019CF6C",), - 0x8019CF78:("func_8019CF78",), + 0x8019B618:("AudioOcarina_CheckIfStartedSong",), + 0x8019B654:("AudioOcarina_UpdateCurOcarinaSong",), + 0x8019B6B4:("AudioOcarina_CheckSongsWithMusicStaff",), + 0x8019BC44:("AudioOcarina_CheckSongsWithoutMusicStaff",), + 0x8019BE98:("AudioOcarina_PlayControllerInput",), + 0x8019C1C0:("AudioOcarina_EnableInput",), + 0x8019C1D0:("AudioOcarina_ResetAndMute",), + 0x8019C268:("AudioOcarina_ResetAndReadInput",), + 0x8019C2E4:("AudioOcarina_SetOcarinaDisableTimer",), + 0x8019C300:("AudioOcarina_SetInstrument",), + 0x8019C398:("AudioOcarina_SetPlaybackSong",), + 0x8019C5A0:("AudioOcarina_PlaybackSong",), + 0x8019C8D8:("AudioOcarina_SetRecordingSong",), + 0x8019CD08:("AudioOcarina_SetRecordingState",), + 0x8019CE34:("AudioOcarina_UpdateRecordingStaff",), + 0x8019CE6C:("AudioOcarina_UpdatePlayingStaff",), + 0x8019CEBC:("AudioOcarina_UpdatePlaybackStaff",), + 0x8019CF6C:("AudioOcarina_GetRecordingStaff",), + 0x8019CF78:("AudioOcarina_GetPlayingStaff",), 0x8019CF9C:("AudioOcarina_GetPlaybackStaff",), - 0x8019CFA8:("func_8019CFA8",), + 0x8019CFA8:("AudioOcarina_RecordSong",), 0x8019D134:("AudioOcarina_TerminaWallValidateNotes",), 0x8019D26C:("AudioOcarina_TerminaWallGenerateNotes",), - 0x8019D488:("AudioOcarina_MemoryGameSetNumNotes",), - 0x8019D4F8:("AudioOcarina_MemoryGameGenerateNotes",), - 0x8019D600:("func_8019D600",), - 0x8019D758:("func_8019D758",), - 0x8019D864:("func_8019D864",), - 0x8019D8B4:("func_8019D8B4",), - 0x8019D8E4:("func_8019D8E4",), - 0x8019DF28:("func_8019DF28",), - 0x8019DF64:("func_8019DF64",), + 0x8019D488:("AudioOcarina_MemoryGameInit",), + 0x8019D4F8:("AudioOcarina_MemoryGameNextNote",), + 0x8019D600:("AudioOcarina_Update",), + 0x8019D758:("AudioOcarina_PlayLongScarecrowAfterCredits",), + 0x8019D864:("AudioOcarina_SetCustomSequence",), + 0x8019D8B4:("AudioOcarina_PlayCustomSequence",), + 0x8019D8E4:("AudioOcarina_CreateCustomSequence",), + 0x8019DF28:("AudioOcarina_ResetInstrument",), + 0x8019DF64:("AudioOcarina_ResetStaffs",), 0x8019DFF8:("func_8019DFF8",), 0x8019E000:("func_8019E000",), 0x8019E00C:("func_8019E00C",), @@ -3990,7 +3990,7 @@ 0x801A42C8:("func_801A42C8",), 0x801A4324:("func_801A4324",), 0x801A4348:("func_801A4348",), - 0x801A4380:("func_801A4380",), + 0x801A4380:("Audio_SetSfxVolumeExceptSystemAndOcarinaBanks",), 0x801A4428:("func_801A4428",), 0x801A44A4:("Audio_PreNMI",), 0x801A44C4:("func_801A44C4",), @@ -4030,9 +4030,9 @@ 0x801A5808:("func_801A5808",), 0x801A5A10:("func_801A5A10",), 0x801A5A1C:("func_801A5A1C",), - 0x801A5BD0:("func_801A5BD0",), - 0x801A5C28:("func_801A5C28",), - 0x801A5C8C:("func_801A5C8C",), + 0x801A5BD0:("Audio_SetSfxBanksMute",), + 0x801A5C28:("Audio_SetFlagForBgmVolumeLow",), + 0x801A5C8C:("Audio_ClearFlagForBgmVolumeLow",), 0x801A5CFC:("Audio_PlaySfxGeneral",), 0x801A5DDC:("func_801A5DDC",), 0x801A5F7C:("func_801A5F7C",), @@ -4045,7 +4045,7 @@ 0x801A72CC:("Audio_StopSfxByPos",), 0x801A7328:("func_801A7328",), 0x801A7484:("func_801A7484",), - 0x801A75E8:("func_801A75E8",), + 0x801A75E8:("Audio_StopSfxById",), 0x801A7720:("func_801A7720",), 0x801A7794:("func_801A7794",), 0x801A7828:("func_801A7828",), diff --git a/tools/disasm/variables.txt b/tools/disasm/variables.txt index a58bd42a9e..88e031ba9f 100644 --- a/tools/disasm/variables.txt +++ b/tools/disasm/variables.txt @@ -2310,28 +2310,28 @@ 0x801D6FD8:("sCurOcarinaVolume","UNK_TYPE1","",0x1), 0x801D6FDC:("sCurOcarinaVibrato","UNK_TYPE1","",0x1), 0x801D6FE0:("sPlaybackState","UNK_TYPE1","",0x1), - 0x801D6FE4:("D_801D6FE4","UNK_TYPE1","",0x1), - 0x801D6FE8:("D_801D6FE8","UNK_TYPE1","",0x1), + 0x801D6FE4:("sPlaybackStaffStopPos","UNK_TYPE1","",0x1), + 0x801D6FE8:("sPlaybackStaffStartPos","UNK_TYPE1","",0x1), 0x801D6FEC:("sOcarinaFlags","UNK_TYPE4","",0x4), 0x801D6FF0:("sPlaybackNoteTimer","UNK_TYPE4","",0x4), 0x801D6FF4:("sPlaybackNotePos","UNK_TYPE2","",0x2), 0x801D6FF8:("sPlaybackStaffPos","UNK_TYPE2","",0x2), - 0x801D6FFC:("sPrevOcarinaSongFlags","UNK_TYPE4","",0x4), - 0x801D7000:("sPlaybackNoteValue","UNK_TYPE1","",0x1), + 0x801D6FFC:("sPrevOcarinaWithMusicStaffFlags","UNK_TYPE4","",0x4), + 0x801D7000:("sPlaybackPitch","UNK_TYPE1","",0x1), 0x801D7004:("sNotePlaybackVolume","UNK_TYPE1","",0x1), 0x801D7008:("sNotePlaybackVibrato","UNK_TYPE1","",0x1), 0x801D700C:("sNotePlaybackBend","UNK_TYPE1","",0x1), - 0x801D7010:("sNormalizedNotePlaybackTone","f32","",0x4), - 0x801D7014:("sNormalizedNotePlaybackVolume","f32","",0x4), + 0x801D7010:("sRelativeNotePlaybackBend","f32","",0x4), + 0x801D7014:("sRelativeNotePlaybackVolume","f32","",0x4), 0x801D7018:("sOcarinaPlaybackTaskStart","UNK_TYPE4","",0x4), 0x801D701C:("sOcarinaWallCounter","UNK_TYPE4","",0x4), - 0x801D7020:("sCurOcarinaSong","u8","[8]",0x8), - 0x801D7028:("sOcarinaSongAppendPos","UNK_TYPE1","",0x1), + 0x801D7020:("sCurOcarinaSongWithoutMusicStaff","u8","[8]",0x8), + 0x801D7028:("sOcarinaWithoutMusicStaffPos","UNK_TYPE1","",0x1), 0x801D702C:("sOcarinaSongStartingPos","UNK_TYPE1","",0x1), 0x801D7030:("sButtonToPitchMap","UNK_TYPE1","",0x1), 0x801D7038:("sOcarinaMemoryGameAppendPos","UNK_TYPE1","",0x1), - 0x801D703C:("sOcaMemoryGameEndPos","UNK_TYPE1","",0x1), - 0x801D7040:("sOcaMemoryGameNumNotes","UNK_TYPE1","",0x1), + 0x801D703C:("sOcarinaMemoryGameEndPos","UNK_TYPE1","",0x1), + 0x801D7040:("sOcarinaMemoryGameNumNotes","UNK_TYPE1","",0x1), 0x801D7044:("sOcarinaSongNotes","OcarinaNote","[24][20]",0xF00), 0x801D7F44:("sOoTOcarinaSongNotes","OcarinaNote","[9][20]",0x5A0), 0x801D84E4:("sOoTOcarinaSongsNumNotes","UNK_TYPE1","",0x1), @@ -2350,7 +2350,7 @@ 0x801D852C:("sMusicStaffNumNotesPerTest","UNK_TYPE1","",0x1), 0x801D8530:("D_801D8530","UNK_TYPE1","",0x1), 0x801D8534:("D_801D8534","UNK_TYPE4","",0x4), - 0x801D8538:("sIsOcarinaNoteChanged","UNK_TYPE1","",0x1), + 0x801D8538:("sOcarinaDropInputTimer","UNK_TYPE1","",0x1), 0x801D853C:("sScarecrowsLongSongNotes","OcarinaNote","[108]",0x360), 0x801D889C:("gScarecrowLongSongPtr","UNK_PTR","",0x4), 0x801D88A0:("gScarecrowSpawnSongPtr","UNK_PTR","",0x4), @@ -2387,14 +2387,14 @@ 0x801DB494:("D_801DB494","UNK_TYPE1","",0x1), 0x801DB49C:("D_801DB49C","UNK_TYPE1","",0x1), 0x801DB4A0:("D_801DB4A0","UNK_TYPE2","",0x2), - 0x801DB4A4:("D_801DB4A4","UNK_TYPE4","",0x4), + 0x801DB4A4:("gSfxDefaultPos","UNK_TYPE4","",0x4), 0x801DB4B0:("D_801DB4B0","UNK_TYPE1","",0x1), - 0x801DB4B8:("D_801DB4B8","UNK_TYPE1","",0x1), + 0x801DB4B8:("gSfxDefaultReverb","UNK_TYPE1","",0x1), 0x801DB4C0:("D_801DB4C0","UNK_TYPE1","",0x1), 0x801DB4C4:("D_801DB4C4","UNK_TYPE1","",0x1), 0x801DB4C8:("D_801DB4C8","UNK_TYPE1","",0x1), 0x801DB4CC:("D_801DB4CC","UNK_TYPE1","",0x1), - 0x801DB4D4:("D_801DB4D4","UNK_TYPE1","",0x1), + 0x801DB4D4:("gAudioSpecId","UNK_TYPE1","",0x1), 0x801DB4D8:("D_801DB4D8","UNK_TYPE1","",0x1), 0x801DB4DC:("D_801DB4DC","UNK_TYPE4","",0x4), 0x801DB4E0:("D_801DB4E0","UNK_TYPE1","",0x1), @@ -4292,18 +4292,18 @@ 0x801FD43A:("sPlayingStaff","OcarinaStaff","",0x3), 0x801FD43E:("sPlaybackStaff","OcarinaStaff","",0x3), 0x801FD442:("sRecordingStaff","OcarinaStaff","",0x3), - 0x801FD448:("sOcarinaUpdateTaskCurrent","UNK_TYPE1","",0x1), + 0x801FD448:("sOcarinaUpdateTaskStart","UNK_TYPE1","",0x1), 0x801FD44C:("sOcarinaInputStickRel","OcarinaControlStick","",0x2), 0x801FD450:("sOcarinaInputButtonCur","UNK_TYPE1","",0x1), 0x801FD454:("sOcarinaInputButtonStart","UNK_TYPE1","",0x1), 0x801FD458:("sOcarinaInputButtonPrev","UNK_TYPE1","",0x1), - 0x801FD45C:("sOcaInputBtnPress","UNK_TYPE1","",0x1), - 0x801FD460:("sOcarinaResetDelay","UNK_TYPE1","",0x1), - 0x801FD461:("sOcarinaResetUnused","UNK_TYPE1","",0x1), + 0x801FD45C:("sOcarinaInputButtonPress","UNK_TYPE1","",0x1), + 0x801FD460:("sOcarinaDisableTimer","UNK_TYPE1","",0x1), + 0x801FD461:("sOcarinaUnused","UNK_TYPE1","",0x1), 0x801FD462:("sOcarinaHasStartedSong","UNK_TYPE1","",0x1), 0x801FD463:("sFirstOcarinaSongIndex","UNK_TYPE1","",0x1), 0x801FD464:("sLastOcarinaSongIndex","UNK_TYPE1","",0x1), - 0x801FD468:("sOcarinaAvailSongs","UNK_TYPE1","",0x1), + 0x801FD468:("sOcarinaAvailableSongFlags","UNK_TYPE1","",0x1), 0x801FD46C:("sOcarinaStaffPlayingPos","UNK_TYPE1","",0x1), 0x801FD470:("sMusicStaffPos","UNK_TYPE1","",0x1), 0x801FD4A0:("sMusicStaffCurHeldLength","UNK_TYPE1","",0x1), @@ -4311,7 +4311,7 @@ 0x801FD500:("sMusicStaffExpectedPitch","UNK_TYPE1","",0x1), 0x801FD518:("D_801FD518","UNK_TYPE1","",0x1), 0x801FD530:("D_801FD530","u32","[24]",0x60), - 0x801FD590:("sRecordingSongNote","UNK_TYPE1","",0x1), + 0x801FD590:("sScarecrowsLongSongSecondNote","UNK_TYPE1","",0x1), 0x801FD598:("sCustomSequencePc","UNK_TYPE1","",0x1), 0x801FD5A0:("D_801FD5A0","UNK_TYPE1","",0x1), 0x801FD5A4:("D_801FD5A4","UNK_TYPE1","",0x1), diff --git a/tools/sizes/code_functions.csv b/tools/sizes/code_functions.csv index d884a1081a..cb8e980c2e 100644 --- a/tools/sizes/code_functions.csv +++ b/tools/sizes/code_functions.csv @@ -3321,52 +3321,52 @@ asm/non_matchings/code/audio_seqplayer/AudioSeq_InitSequencePlayer.s,AudioSeq_In asm/non_matchings/code/audio_seqplayer/AudioSeq_InitSequencePlayers.s,AudioSeq_InitSequencePlayers,0x8019ADBC,0x21 asm/non_matchings/code/code_8019AE40/func_8019AE40.s,func_8019AE40,0x8019AE40,0x1C asm/non_matchings/code/code_8019AEC0/func_8019AEC0.s,func_8019AEC0,0x8019AEC0,0x10 -asm/non_matchings/code/code_8019AF00/func_8019AF00.s,func_8019AF00,0x8019AF00,0x16 -asm/non_matchings/code/code_8019AF00/func_8019AF58.s,func_8019AF58,0x8019AF58,0x24 -asm/non_matchings/code/code_8019AF00/func_8019AFE8.s,func_8019AFE8,0x8019AFE8,0x11 -asm/non_matchings/code/code_8019AF00/func_8019B02C.s,func_8019B02C,0x8019B02C,0x12 -asm/non_matchings/code/code_8019AF00/AudioOcarina_MapSongFromNotesToButtons.s,AudioOcarina_MapSongFromNotesToButtons,0x8019B074,0x34 -asm/non_matchings/code/code_8019AF00/func_8019B144.s,func_8019B144,0x8019B144,0x8D -asm/non_matchings/code/code_8019AF00/func_8019B378.s,func_8019B378,0x8019B378,0x5 -asm/non_matchings/code/code_8019AF00/func_8019B38C.s,func_8019B38C,0x8019B38C,0x11 -asm/non_matchings/code/code_8019AF00/func_8019B3D0.s,func_8019B3D0,0x8019B3D0,0x3A -asm/non_matchings/code/code_8019AF00/func_8019B4B8.s,func_8019B4B8,0x8019B4B8,0x23 +asm/non_matchings/code/code_8019AF00/AudioOcarina_ReadControllerInput.s,AudioOcarina_ReadControllerInput,0x8019AF00,0x16 +asm/non_matchings/code/code_8019AF00/AudioOcarina_BendPitchTwoSemitones.s,AudioOcarina_BendPitchTwoSemitones,0x8019AF58,0x24 +asm/non_matchings/code/code_8019AF00/AudioOcarina_GetPlayingState.s,AudioOcarina_GetPlayingState,0x8019AFE8,0x11 +asm/non_matchings/code/code_8019AF00/AudioOcarina_MapPitchToButton.s,AudioOcarina_MapPitchToButton,0x8019B02C,0x12 +asm/non_matchings/code/code_8019AF00/AudioOcarina_MapSongFromPitchToButton.s,AudioOcarina_MapSongFromPitchToButton,0x8019B074,0x34 +asm/non_matchings/code/code_8019AF00/AudioOcarina_Start.s,AudioOcarina_Start,0x8019B144,0x8D +asm/non_matchings/code/code_8019AF00/AudioOcarina_SetSongStartingPos.s,AudioOcarina_SetSongStartingPos,0x8019B378,0x5 +asm/non_matchings/code/code_8019AF00/AudioOcarina_StartAtSongStartingPos.s,AudioOcarina_StartAtSongStartingPos,0x8019B38C,0x11 +asm/non_matchings/code/code_8019AF00/AudioOcarina_StartForSongCheck.s,AudioOcarina_StartForSongCheck,0x8019B3D0,0x3A +asm/non_matchings/code/code_8019AF00/AudioOcarina_StartWithSongNoteLengths.s,AudioOcarina_StartWithSongNoteLengths,0x8019B4B8,0x23 asm/non_matchings/code/code_8019AF00/AudioOcarina_StartDefault.s,AudioOcarina_StartDefault,0x8019B544,0x9 asm/non_matchings/code/code_8019AF00/func_8019B568.s,func_8019B568,0x8019B568,0x11 asm/non_matchings/code/code_8019AF00/func_8019B5AC.s,func_8019B5AC,0x8019B5AC,0x10 asm/non_matchings/code/code_8019AF00/func_8019B5EC.s,func_8019B5EC,0x8019B5EC,0xB -asm/non_matchings/code/code_8019AF00/func_8019B618.s,func_8019B618,0x8019B618,0xF -asm/non_matchings/code/code_8019AF00/func_8019B654.s,func_8019B654,0x8019B654,0x18 -asm/non_matchings/code/code_8019AF00/func_8019B6B4.s,func_8019B6B4,0x8019B6B4,0x164 -asm/non_matchings/code/code_8019AF00/func_8019BC44.s,func_8019BC44,0x8019BC44,0x95 -asm/non_matchings/code/code_8019AF00/func_8019BE98.s,func_8019BE98,0x8019BE98,0xCA -asm/non_matchings/code/code_8019AF00/func_8019C1C0.s,func_8019C1C0,0x8019C1C0,0x4 -asm/non_matchings/code/code_8019AF00/func_8019C1D0.s,func_8019C1D0,0x8019C1D0,0x26 -asm/non_matchings/code/code_8019AF00/func_8019C268.s,func_8019C268,0x8019C268,0x1F -asm/non_matchings/code/code_8019AF00/func_8019C2E4.s,func_8019C2E4,0x8019C2E4,0x7 -asm/non_matchings/code/code_8019AF00/AudioOcarina_SetInstrumentId.s,AudioOcarina_SetInstrumentId,0x8019C300,0x26 -asm/non_matchings/code/code_8019AF00/func_8019C398.s,func_8019C398,0x8019C398,0x82 -asm/non_matchings/code/code_8019AF00/func_8019C5A0.s,func_8019C5A0,0x8019C5A0,0xCE -asm/non_matchings/code/code_8019AF00/func_8019C8D8.s,func_8019C8D8,0x8019C8D8,0x10C -asm/non_matchings/code/code_8019AF00/func_8019CD08.s,func_8019CD08,0x8019CD08,0x4B -asm/non_matchings/code/code_8019AF00/func_8019CE34.s,func_8019CE34,0x8019CE34,0xE -asm/non_matchings/code/code_8019AF00/func_8019CE6C.s,func_8019CE6C,0x8019CE6C,0x14 -asm/non_matchings/code/code_8019AF00/func_8019CEBC.s,func_8019CEBC,0x8019CEBC,0x2C -asm/non_matchings/code/code_8019AF00/func_8019CF6C.s,func_8019CF6C,0x8019CF6C,0x3 -asm/non_matchings/code/code_8019AF00/func_8019CF78.s,func_8019CF78,0x8019CF78,0x9 +asm/non_matchings/code/code_8019AF00/AudioOcarina_CheckIfStartedSong.s,AudioOcarina_CheckIfStartedSong,0x8019B618,0xF +asm/non_matchings/code/code_8019AF00/AudioOcarina_UpdateCurOcarinaSong.s,AudioOcarina_UpdateCurOcarinaSong,0x8019B654,0x18 +asm/non_matchings/code/code_8019AF00/AudioOcarina_CheckSongsWithMusicStaff.s,AudioOcarina_CheckSongsWithMusicStaff,0x8019B6B4,0x164 +asm/non_matchings/code/code_8019AF00/AudioOcarina_CheckSongsWithoutMusicStaff.s,AudioOcarina_CheckSongsWithoutMusicStaff,0x8019BC44,0x95 +asm/non_matchings/code/code_8019AF00/AudioOcarina_PlayControllerInput.s,AudioOcarina_PlayControllerInput,0x8019BE98,0xCA +asm/non_matchings/code/code_8019AF00/AudioOcarina_EnableInput.s,AudioOcarina_EnableInput,0x8019C1C0,0x4 +asm/non_matchings/code/code_8019AF00/AudioOcarina_ResetAndMute.s,AudioOcarina_ResetAndMute,0x8019C1D0,0x26 +asm/non_matchings/code/code_8019AF00/AudioOcarina_ResetAndReadInput.s,AudioOcarina_ResetAndReadInput,0x8019C268,0x1F +asm/non_matchings/code/code_8019AF00/AudioOcarina_SetOcarinaDisableTimer.s,AudioOcarina_SetOcarinaDisableTimer,0x8019C2E4,0x7 +asm/non_matchings/code/code_8019AF00/AudioOcarina_SetInstrument.s,AudioOcarina_SetInstrument,0x8019C300,0x26 +asm/non_matchings/code/code_8019AF00/AudioOcarina_SetPlaybackSong.s,AudioOcarina_SetPlaybackSong,0x8019C398,0x82 +asm/non_matchings/code/code_8019AF00/AudioOcarina_PlaybackSong.s,AudioOcarina_PlaybackSong,0x8019C5A0,0xCE +asm/non_matchings/code/code_8019AF00/AudioOcarina_SetRecordingSong.s,AudioOcarina_SetRecordingSong,0x8019C8D8,0x10C +asm/non_matchings/code/code_8019AF00/AudioOcarina_SetRecordingState.s,AudioOcarina_SetRecordingState,0x8019CD08,0x4B +asm/non_matchings/code/code_8019AF00/AudioOcarina_UpdateRecordingStaff.s,AudioOcarina_UpdateRecordingStaff,0x8019CE34,0xE +asm/non_matchings/code/code_8019AF00/AudioOcarina_UpdatePlayingStaff.s,AudioOcarina_UpdatePlayingStaff,0x8019CE6C,0x14 +asm/non_matchings/code/code_8019AF00/AudioOcarina_UpdatePlaybackStaff.s,AudioOcarina_UpdatePlaybackStaff,0x8019CEBC,0x2C +asm/non_matchings/code/code_8019AF00/AudioOcarina_GetRecordingStaff.s,AudioOcarina_GetRecordingStaff,0x8019CF6C,0x3 +asm/non_matchings/code/code_8019AF00/AudioOcarina_GetPlayingStaff.s,AudioOcarina_GetPlayingStaff,0x8019CF78,0x9 asm/non_matchings/code/code_8019AF00/AudioOcarina_GetPlaybackStaff.s,AudioOcarina_GetPlaybackStaff,0x8019CF9C,0x3 -asm/non_matchings/code/code_8019AF00/func_8019CFA8.s,func_8019CFA8,0x8019CFA8,0x63 +asm/non_matchings/code/code_8019AF00/AudioOcarina_RecordSong.s,AudioOcarina_RecordSong,0x8019CFA8,0x63 asm/non_matchings/code/code_8019AF00/AudioOcarina_TerminaWallValidateNotes.s,AudioOcarina_TerminaWallValidateNotes,0x8019D134,0x4E asm/non_matchings/code/code_8019AF00/AudioOcarina_TerminaWallGenerateNotes.s,AudioOcarina_TerminaWallGenerateNotes,0x8019D26C,0x87 -asm/non_matchings/code/code_8019AF00/AudioOcarina_MemoryGameSetNumNotes.s,AudioOcarina_MemoryGameSetNumNotes,0x8019D488,0x1C -asm/non_matchings/code/code_8019AF00/AudioOcarina_MemoryGameGenerateNotes.s,AudioOcarina_MemoryGameGenerateNotes,0x8019D4F8,0x42 -asm/non_matchings/code/code_8019AF00/func_8019D600.s,func_8019D600,0x8019D600,0x56 -asm/non_matchings/code/code_8019AF00/func_8019D758.s,func_8019D758,0x8019D758,0x43 -asm/non_matchings/code/code_8019AF00/func_8019D864.s,func_8019D864,0x8019D864,0x14 -asm/non_matchings/code/code_8019AF00/func_8019D8B4.s,func_8019D8B4,0x8019D8B4,0xC -asm/non_matchings/code/code_8019AF00/func_8019D8E4.s,func_8019D8E4,0x8019D8E4,0x191 -asm/non_matchings/code/code_8019AF00/func_8019DF28.s,func_8019DF28,0x8019DF28,0xF -asm/non_matchings/code/code_8019AF00/func_8019DF64.s,func_8019DF64,0x8019DF64,0x25 +asm/non_matchings/code/code_8019AF00/AudioOcarina_MemoryGameInit.s,AudioOcarina_MemoryGameInit,0x8019D488,0x1C +asm/non_matchings/code/code_8019AF00/AudioOcarina_MemoryGameNextNote.s,AudioOcarina_MemoryGameNextNote,0x8019D4F8,0x42 +asm/non_matchings/code/code_8019AF00/AudioOcarina_Update.s,AudioOcarina_Update,0x8019D600,0x56 +asm/non_matchings/code/code_8019AF00/AudioOcarina_PlayLongScarecrowAfterCredits.s,AudioOcarina_PlayLongScarecrowAfterCredits,0x8019D758,0x43 +asm/non_matchings/code/code_8019AF00/AudioOcarina_SetCustomSequence.s,AudioOcarina_SetCustomSequence,0x8019D864,0x14 +asm/non_matchings/code/code_8019AF00/AudioOcarina_PlayCustomSequence.s,AudioOcarina_PlayCustomSequence,0x8019D8B4,0xC +asm/non_matchings/code/code_8019AF00/AudioOcarina_CreateCustomSequence.s,AudioOcarina_CreateCustomSequence,0x8019D8E4,0x191 +asm/non_matchings/code/code_8019AF00/AudioOcarina_ResetInstrument.s,AudioOcarina_ResetInstrument,0x8019DF28,0xF +asm/non_matchings/code/code_8019AF00/AudioOcarina_ResetStaffs.s,AudioOcarina_ResetStaffs,0x8019DF64,0x25 asm/non_matchings/code/code_8019AF00/func_8019DFF8.s,func_8019DFF8,0x8019DFF8,0x2 asm/non_matchings/code/code_8019AF00/func_8019E000.s,func_8019E000,0x8019E000,0x3 asm/non_matchings/code/code_8019AF00/func_8019E00C.s,func_8019E00C,0x8019E00C,0x2 @@ -3506,7 +3506,7 @@ asm/non_matchings/code/code_8019AF00/func_801A429C.s,func_801A429C,0x801A429C,0x asm/non_matchings/code/code_8019AF00/func_801A42C8.s,func_801A42C8,0x801A42C8,0x17 asm/non_matchings/code/code_8019AF00/func_801A4324.s,func_801A4324,0x801A4324,0x9 asm/non_matchings/code/code_8019AF00/func_801A4348.s,func_801A4348,0x801A4348,0xE -asm/non_matchings/code/code_8019AF00/func_801A4380.s,func_801A4380,0x801A4380,0x2A +asm/non_matchings/code/code_8019AF00/Audio_SetSfxVolumeExceptSystemAndOcarinaBanks.s,Audio_SetSfxVolumeExceptSystemAndOcarinaBanks,0x801A4380,0x2A asm/non_matchings/code/code_8019AF00/func_801A4428.s,func_801A4428,0x801A4428,0x1F asm/non_matchings/code/code_8019AF00/Audio_PreNMI.s,Audio_PreNMI,0x801A44A4,0x8 asm/non_matchings/code/code_8019AF00/func_801A44C4.s,func_801A44C4,0x801A44C4,0x4 @@ -3546,9 +3546,9 @@ asm/non_matchings/code/code_801A51F0/func_801A5680.s,func_801A5680,0x801A5680,0x asm/non_matchings/code/code_801A51F0/func_801A5808.s,func_801A5808,0x801A5808,0x82 asm/non_matchings/code/code_801A51F0/func_801A5A10.s,func_801A5A10,0x801A5A10,0x3 asm/non_matchings/code/code_801A51F0/func_801A5A1C.s,func_801A5A1C,0x801A5A1C,0x69 -asm/non_matchings/code/code_801A5BD0/func_801A5BD0.s,func_801A5BD0,0x801A5BD0,0x16 -asm/non_matchings/code/code_801A5BD0/func_801A5C28.s,func_801A5C28,0x801A5C28,0x19 -asm/non_matchings/code/code_801A5BD0/func_801A5C8C.s,func_801A5C8C,0x801A5C8C,0x1C +asm/non_matchings/code/code_801A5BD0/Audio_SetSfxBanksMute.s,Audio_SetSfxBanksMute,0x801A5BD0,0x16 +asm/non_matchings/code/code_801A5BD0/Audio_SetFlagForBgmVolumeLow.s,Audio_SetFlagForBgmVolumeLow,0x801A5C28,0x19 +asm/non_matchings/code/code_801A5BD0/Audio_ClearFlagForBgmVolumeLow.s,Audio_ClearFlagForBgmVolumeLow,0x801A5C8C,0x1C asm/non_matchings/code/code_801A5BD0/Audio_PlaySfxGeneral.s,Audio_PlaySfxGeneral,0x801A5CFC,0x38 asm/non_matchings/code/code_801A5BD0/func_801A5DDC.s,func_801A5DDC,0x801A5DDC,0x68 asm/non_matchings/code/code_801A5BD0/func_801A5F7C.s,func_801A5F7C,0x801A5F7C,0x12D @@ -3561,7 +3561,7 @@ asm/non_matchings/code/code_801A5BD0/func_801A7284.s,func_801A7284,0x801A7284,0x asm/non_matchings/code/code_801A5BD0/Audio_StopSfxByPos.s,Audio_StopSfxByPos,0x801A72CC,0x17 asm/non_matchings/code/code_801A5BD0/func_801A7328.s,func_801A7328,0x801A7328,0x57 asm/non_matchings/code/code_801A5BD0/func_801A7484.s,func_801A7484,0x801A7484,0x59 -asm/non_matchings/code/code_801A5BD0/func_801A75E8.s,func_801A75E8,0x801A75E8,0x4E +asm/non_matchings/code/code_801A5BD0/Audio_StopSfxById.s,Audio_StopSfxById,0x801A75E8,0x4E asm/non_matchings/code/code_801A5BD0/func_801A7720.s,func_801A7720,0x801A7720,0x1D asm/non_matchings/code/code_801A5BD0/func_801A7794.s,func_801A7794,0x801A7794,0x25 asm/non_matchings/code/code_801A5BD0/func_801A7828.s,func_801A7828,0x801A7828,0x15