From 95b431793182bd021cb4234255f90b996edd8d4d Mon Sep 17 00:00:00 2001 From: engineer124 <47598039+engineer124@users.noreply.github.com> Date: Tue, 10 May 2022 02:59:23 +1000 Subject: [PATCH] Audio Ocarina Documentation (#1026) * Begin ocarina documentation * Many ocarina-related docs * More ocarina docs * Introduce Ocarina Fonts Enum * Fix ocarina font enum * Fix incorrect documentation, more documentation * Ocarina recording documentation * cleanup * Small touch-ups * Fix font -> instrument * format * Better docs on playback, memory game * more cleanup * Add z64ocarina.h * Clean up names * final cleanup * typo * Fix description * better docs * Fix channel -> channelIdx * Fix old "font" name to correct "instrument" name, add io port docs * Add comments to clarify certain lines/functions * format * Rename noteIdx to pitch * Missed a name * Add comment on pitch * `reset` -> `SetInstrument` and `displayed` -> `playback` * Clarify audio_update and windmill comment * Minor PR fixes * Revert Audio_Update because there are 2 different Audio_Update functions * PR Feedback * Ocarina Idx -> Index * Introduce OCARINA_BTN_C_RIGHT_OR_C_LEFT * PR Suggestions * Next PR Suggestions * Next PR Feedback * consistency * Better docs (PR) * Better comment --- include/functions.h | 22 +- include/regs.h | 8 +- include/variables.h | 6 +- include/z64.h | 104 +- include/z64audio.h | 32 +- include/z64ocarina.h | 180 ++ include/z64save.h | 4 +- src/code/audio_data.c | 258 +-- src/code/audio_load.c | 4 +- src/code/audio_seqplayer.c | 8 +- src/code/code_800E4FE0.c | 17 +- src/code/code_800EC960.c | 1933 +++++++++-------- src/code/z_construct.c | 16 +- src/code/z_demo.c | 2 +- src/code/z_message_PAL.c | 703 +++--- src/code/z_sram.c | 12 +- src/overlays/actors/ovl_En_Fr/z_en_fr.c | 35 +- src/overlays/actors/ovl_En_Fu/z_en_fu.c | 3 +- .../actors/ovl_En_Kakasi/z_en_kakasi.c | 18 +- .../actors/ovl_En_Kakasi3/z_en_kakasi3.c | 18 +- src/overlays/actors/ovl_En_Ma1/z_en_ma1.c | 2 +- src/overlays/actors/ovl_En_Skj/z_en_skj.c | 8 +- .../actors/ovl_player_actor/z_player.c | 2 +- .../ovl_kaleido_scope/z_kaleido_collect.c | 48 +- .../ovl_kaleido_scope/z_kaleido_scope_PAL.c | 16 +- tools/csdis.py | 6 +- 26 files changed, 1872 insertions(+), 1593 deletions(-) create mode 100644 include/z64ocarina.h diff --git a/include/functions.h b/include/functions.h index 1fc58c2117..c282e52425 100644 --- a/include/functions.h +++ b/include/functions.h @@ -1928,16 +1928,16 @@ void AudioSeq_SkipForwardSequence(SequencePlayer* seqPlayer); void AudioSeq_ResetSequencePlayer(SequencePlayer* seqPlayer); void AudioSeq_InitSequencePlayerChannels(s32 playerIdx); void AudioSeq_InitSequencePlayers(void); -void func_800ECC04(u16); -void Audio_OcaSetInstrument(u8); -void Audio_OcaSetSongPlayback(s8 songIdxPlusOne, s8 playbackState); -void Audio_OcaSetRecordingState(u8); -OcarinaStaff* Audio_OcaGetRecordingStaff(void); -OcarinaStaff* Audio_OcaGetPlayingStaff(void); -OcarinaStaff* Audio_OcaGetDisplayingStaff(void); -void Audio_OcaMemoryGameStart(u8 minigameIdx); -s32 Audio_OcaMemoryGameGenNote(void); -void func_800EE824(void); +void AudioOcarina_Start(u16 ocarinaFlags); +void AudioOcarina_SetInstrument(u8 ocarinaInstrumentId); +void AudioOcarina_SetPlaybackSong(s8 songIndexPlusOne, s8 playbackState); +void AudioOcarina_SetRecordingState(u8 recordingState); +OcarinaStaff* AudioOcarina_GetRecordingStaff(void); +OcarinaStaff* AudioOcarina_GetPlayingStaff(void); +OcarinaStaff* AudioOcarina_GetPlaybackStaff(void); +void AudioOcarina_MemoryGameInit(u8 minigameRound); +s32 AudioOcarina_MemoryGameNextNote(void); +void AudioOcarina_PlayLongScarecrowAfterCredits(void); void AudioDebug_Draw(GfxPrint* printer); void AudioDebug_ScrPrt(const s8* str, u16 num); void func_800F3054(void); @@ -2280,7 +2280,7 @@ s32 __osSpSetPc(void* pc); f32 absf(f32); void* __osMemset(void* dest, s32 val, size_t len); void* __osMemmove(void* dest, const void* src, size_t len); -void Message_UpdateOcarinaGame(GlobalContext* globalCtx); +void Message_UpdateOcarinaMemoryGame(GlobalContext* globalCtx); u8 Message_ShouldAdvance(GlobalContext* globalCtx); void Message_CloseTextbox(GlobalContext*); void Message_StartTextbox(GlobalContext* globalCtx, u16 textId, Actor* actor); diff --git a/include/regs.h b/include/regs.h index cfbd1ae200..4bd7529e90 100644 --- a/include/regs.h +++ b/include/regs.h @@ -159,9 +159,9 @@ #define R_TEXTBOX_BG_YPOS XREG(61) #define R_TEXTBOX_CLEF_XPOS VREG(7) #define R_TEXTBOX_CLEF_YPOS VREG(8) -#define R_OCARINA_NOTES_XPOS VREG(28) -#define R_OCARINA_NOTES_YPOS(note) VREG(45 + (note)) -#define R_OCARINA_NOTES_XPOS_OFFSET VREG(29) -#define R_OCARINA_NOTES_YPOS_OFFSET VREG(51) +#define R_OCARINA_BUTTONS_XPOS VREG(28) +#define R_OCARINA_BUTTONS_YPOS(note) VREG(45 + (note)) +#define R_OCARINA_BUTTONS_XPOS_OFFSET VREG(29) +#define R_OCARINA_BUTTONS_YPOS_OFFSET VREG(51) #endif diff --git a/include/variables.h b/include/variables.h index 7ca41f64fa..fc4a0c14eb 100644 --- a/include/variables.h +++ b/include/variables.h @@ -115,7 +115,7 @@ extern volatile OSTime gIrqMgrRetraceTime; extern s16* gWaveSamples[9]; extern f32 gBendPitchOneOctaveFrequencies[256]; extern f32 gBendPitchTwoSemitonesFrequencies[256]; -extern f32 gNoteFrequencies[]; +extern f32 gPitchFrequencies[]; extern u8 gDefaultShortNoteVelocityTable[16]; extern u8 gDefaultShortNoteGateTimeTable[16]; extern AdsrEnvelope gDefaultEnvelope[4]; @@ -134,9 +134,9 @@ extern u8 gChannelsPerBank[4][7]; extern u8 gUsedChannelsPerBank[4][7]; extern u8 gMorphaTransposeTable[16]; extern u8* gFrogsSongPtr; -extern OcarinaNote* gScarecrowCustomSongPtr; +extern OcarinaNote* gScarecrowLongSongPtr; extern u8* gScarecrowSpawnSongPtr; -extern OcarinaSongInfo gOcarinaSongNotes[]; +extern OcarinaSongButtons gOcarinaSongButtons[]; extern SoundParams* gSoundParams[7]; extern char D_80133390[]; extern char D_80133398[]; diff --git a/include/z64.h b/include/z64.h index e6b03ebbd9..e7fc4009a0 100644 --- a/include/z64.h +++ b/include/z64.h @@ -10,6 +10,7 @@ #include "z64player.h" #include "z64audio.h" #include "z64object.h" +#include "z64ocarina.h" #include "z64camera.h" #include "z64environment.h" #include "z64cutscene.h" @@ -359,97 +360,6 @@ typedef struct { /* 0x150 */ char unk_150[0x10]; } SkyboxContext; // size = 0x160 -typedef enum { - /* 0 */ OCARINA_SONG_MINUET, - /* 1 */ OCARINA_SONG_BOLERO, - /* 2 */ OCARINA_SONG_SERENADE, - /* 3 */ OCARINA_SONG_REQUIEM, - /* 4 */ OCARINA_SONG_NOCTURNE, - /* 5 */ OCARINA_SONG_PRELUDE, - /* 6 */ OCARINA_SONG_SARIAS, - /* 7 */ OCARINA_SONG_EPONAS, - /* 8 */ OCARINA_SONG_LULLABY, - /* 9 */ OCARINA_SONG_SUNS, - /* 10 */ OCARINA_SONG_TIME, - /* 11 */ OCARINA_SONG_STORMS, - /* 12 */ OCARINA_SONG_SCARECROW, - /* 13 */ OCARINA_SONG_MEMORY_GAME, - /* 14 */ OCARINA_SONG_MAX, - /* 14 */ OCARINA_SONG_SCARECROW_LONG = OCARINA_SONG_MAX // anything larger than 13 is considered the long scarecrow's song -} OcarinaSongId; - -typedef enum { - /* 0x00 */ OCARINA_ACTION_UNK_0, // acts like free play but never set - /* 0x01 */ OCARINA_ACTION_FREE_PLAY, - /* 0x02 */ OCARINA_ACTION_TEACH_MINUET, // Song demonstrations by teachers - /* 0x03 */ OCARINA_ACTION_TEACH_BOLERO, - /* 0x04 */ OCARINA_ACTION_TEACH_SERENADE, - /* 0x05 */ OCARINA_ACTION_TEACH_REQUIEM, - /* 0x06 */ OCARINA_ACTION_TEACH_NOCTURNE, - /* 0x07 */ OCARINA_ACTION_TEACH_PRELUDE, - /* 0x08 */ OCARINA_ACTION_TEACH_SARIA, - /* 0x09 */ OCARINA_ACTION_TEACH_EPONA, - /* 0x0A */ OCARINA_ACTION_TEACH_LULLABY, - /* 0x0B */ OCARINA_ACTION_TEACH_SUNS, - /* 0x0C */ OCARINA_ACTION_TEACH_TIME, - /* 0x0D */ OCARINA_ACTION_TEACH_STORMS, - /* 0x0E */ OCARINA_ACTION_UNK_E, - /* 0x0F */ OCARINA_ACTION_PLAYBACK_MINUET, // Playing back a particular song - /* 0x10 */ OCARINA_ACTION_PLAYBACK_BOLERO, - /* 0x11 */ OCARINA_ACTION_PLAYBACK_SERENADE, - /* 0x12 */ OCARINA_ACTION_PLAYBACK_REQUIEM, - /* 0x13 */ OCARINA_ACTION_PLAYBACK_NOCTURNE, - /* 0x14 */ OCARINA_ACTION_PLAYBACK_PRELUDE, - /* 0x15 */ OCARINA_ACTION_PLAYBACK_SARIA, - /* 0x16 */ OCARINA_ACTION_PLAYBACK_EPONA, - /* 0x17 */ OCARINA_ACTION_PLAYBACK_LULLABY, - /* 0x18 */ OCARINA_ACTION_PLAYBACK_SUNS, - /* 0x19 */ OCARINA_ACTION_PLAYBACK_TIME, - /* 0x1A */ OCARINA_ACTION_PLAYBACK_STORMS, - /* 0x1B */ OCARINA_ACTION_UNK_1B, - /* 0x1C */ OCARINA_ACTION_CHECK_MINUET, // Playing songs for check spots - /* 0x1D */ OCARINA_ACTION_CHECK_BOLERO, - /* 0x1E */ OCARINA_ACTION_CHECK_SERENADE, - /* 0x1F */ OCARINA_ACTION_CHECK_REQUIEM, - /* 0020 */ OCARINA_ACTION_CHECK_NOCTURNE, - /* 0x21 */ OCARINA_ACTION_CHECK_PRELUDE, - /* 0x22 */ OCARINA_ACTION_CHECK_SARIA, - /* 0x23 */ OCARINA_ACTION_CHECK_EPONA, - /* 0x24 */ OCARINA_ACTION_CHECK_LULLABY, - /* 0x25 */ OCARINA_ACTION_CHECK_SUNS, - /* 0x26 */ OCARINA_ACTION_CHECK_TIME, - /* 0x27 */ OCARINA_ACTION_CHECK_STORMS, - /* 0x28 */ OCARINA_ACTION_CHECK_SCARECROW, // Playing back the song as adult that was set as child - /* 0x29 */ OCARINA_ACTION_FREE_PLAY_DONE, - /* 0x2A */ OCARINA_ACTION_SCARECROW_LONG_RECORDING, - /* 0x2B */ OCARINA_ACTION_SCARECROW_LONG_PLAYBACK, - /* 0x2C */ OCARINA_ACTION_SCARECROW_RECORDING, - /* 0x2D */ OCARINA_ACTION_SCARECROW_PLAYBACK, - /* 0x2E */ OCARINA_ACTION_MEMORY_GAME, - /* 0x2F */ OCARINA_ACTION_FROGS, - /* 0x30 */ OCARINA_ACTION_CHECK_NOWARP, // Check for any of sarias - storms - /* 0x31 */ OCARINA_ACTION_CHECK_NOWARP_DONE -} OcarinaSongActionIDs; - -typedef enum { - /* 0x00 */ OCARINA_MODE_00, - /* 0x01 */ OCARINA_MODE_01, - /* 0x02 */ OCARINA_MODE_02, - /* 0x03 */ OCARINA_MODE_03, - /* 0x04 */ OCARINA_MODE_04, - /* 0x05 */ OCARINA_MODE_05, - /* 0x06 */ OCARINA_MODE_06, - /* 0x07 */ OCARINA_MODE_07, - /* 0x08 */ OCARINA_MODE_08, - /* 0x09 */ OCARINA_MODE_09, - /* 0x0A */ OCARINA_MODE_0A, - /* 0x0B */ OCARINA_MODE_0B, - /* 0x0C */ OCARINA_MODE_0C, - /* 0x0D */ OCARINA_MODE_0D, - /* 0x0E */ OCARINA_MODE_0E, - /* 0x0F */ OCARINA_MODE_0F -} OcarinaMode; - typedef enum { TEXTBOX_ICON_TRIANGLE, TEXTBOX_ICON_SQUARE, @@ -508,11 +418,11 @@ typedef enum { /* 0x21 */ MSGMODE_SCARECROW_LONG_RECORDING_START, /* 0x22 */ MSGMODE_SCARECROW_LONG_RECORDING_ONGOING, /* 0x23 */ MSGMODE_SCARECROW_LONG_PLAYBACK, - /* 0x24 */ MSGMODE_SCARECROW_RECORDING_START, - /* 0x25 */ MSGMODE_SCARECROW_RECORDING_ONGOING, - /* 0x26 */ MSGMODE_SCARECROW_RECORDING_FAILED, - /* 0x27 */ MSGMODE_SCARECROW_RECORDING_DONE, - /* 0x28 */ MSGMODE_SCARECROW_PLAYBACK, + /* 0x24 */ MSGMODE_SCARECROW_SPAWN_RECORDING_START, + /* 0x25 */ MSGMODE_SCARECROW_SPAWN_RECORDING_ONGOING, + /* 0x26 */ MSGMODE_SCARECROW_SPAWN_RECORDING_FAILED, + /* 0x27 */ MSGMODE_SCARECROW_SPAWN_RECORDING_DONE, + /* 0x28 */ MSGMODE_SCARECROW_SPAWN_PLAYBACK, /* 0x29 */ MSGMODE_MEMORY_GAME_START, /* 0x2A */ MSGMODE_MEMORY_GAME_LEFT_SKULLKID_PLAYING, /* 0x2B */ MSGMODE_MEMORY_GAME_LEFT_SKULLKID_WAIT, @@ -626,7 +536,7 @@ typedef struct { /* 0xE408 */ Actor* talkActor; /* 0xE40C */ s16 disableWarpSongs; // warp song flag set by scene commands /* 0xE40E */ s16 unk_E40E; // ocarina related - /* 0xE410 */ u8 lastOcaNoteIdx; + /* 0xE410 */ u8 lastOcarinaButtonIndex; } MessageContext; // size = 0xE418 typedef enum { diff --git a/include/z64audio.h b/include/z64audio.h index 0326d7638f..7fe2de390e 100644 --- a/include/z64audio.h +++ b/include/z64audio.h @@ -814,7 +814,7 @@ typedef struct { /* 0x2894 */ s32 numNotes; /* 0x2898 */ s16 tempoInternalToExternal; /* 0x289A */ s8 soundMode; - /* 0x289C */ s32 totalTaskCnt; + /* 0x289C */ s32 totalTaskCount; /* 0x28A0 */ s32 curAudioFrameDmaCount; /* 0x28A4 */ s32 rspTaskIdx; /* 0x28A8 */ s32 curAIBufIdx; @@ -1011,34 +1011,4 @@ typedef struct { u16 params; } SoundParams; -typedef struct { - /* 0x0000 */ u8 noteIdx; - /* 0x0001 */ u8 unk_01; - /* 0x0002 */ u16 unk_02; - /* 0x0004 */ u8 volume; - /* 0x0005 */ u8 vibrato; - /* 0x0006 */ s8 tone; - /* 0x0007 */ u8 semitone; -} OcarinaNote; // size = 0x8 - -typedef struct { - u8 len; - u8 notesIdx[8]; -} OcarinaSongInfo; - -typedef struct { - u8 noteIdx; - u8 state; // original name: "status" - u8 pos; // original name: "locate" -} OcarinaStaff; - -typedef enum { - /* 0 */ OCARINA_NOTE_A, - /* 1 */ OCARINA_NOTE_C_DOWN, - /* 2 */ OCARINA_NOTE_C_RIGHT, - /* 3 */ OCARINA_NOTE_C_LEFT, - /* 4 */ OCARINA_NOTE_C_UP, - /* -1 */ OCARINA_NOTE_INVALID = 0xFF -} OcarinaNoteIdx; - #endif diff --git a/include/z64ocarina.h b/include/z64ocarina.h new file mode 100644 index 0000000000..71e3352692 --- /dev/null +++ b/include/z64ocarina.h @@ -0,0 +1,180 @@ +#ifndef Z64OCARINA_H +#define Z64OCARINA_H + +#include "ultra64.h" + +typedef enum { + /* 0 */ OCARINA_SONG_MINUET, + /* 1 */ OCARINA_SONG_BOLERO, + /* 2 */ OCARINA_SONG_SERENADE, + /* 3 */ OCARINA_SONG_REQUIEM, + /* 4 */ OCARINA_SONG_NOCTURNE, + /* 5 */ OCARINA_SONG_PRELUDE, + /* 6 */ OCARINA_SONG_SARIAS, + /* 7 */ OCARINA_SONG_EPONAS, + /* 8 */ OCARINA_SONG_LULLABY, + /* 9 */ OCARINA_SONG_SUNS, + /* 10 */ OCARINA_SONG_TIME, + /* 11 */ OCARINA_SONG_STORMS, + /* 12 */ OCARINA_SONG_SCARECROW_SPAWN, + /* 13 */ OCARINA_SONG_MEMORY_GAME, + /* 14 */ OCARINA_SONG_MAX, + /* 14 */ OCARINA_SONG_SCARECROW_LONG = OCARINA_SONG_MAX // anything larger than 13 is considered the long scarecrow's song +} OcarinaSongId; + +typedef enum { + /* 0x00 */ OCARINA_ACTION_UNK_0, // acts like free play but never set + /* 0x01 */ OCARINA_ACTION_FREE_PLAY, + /* 0x02 */ OCARINA_ACTION_TEACH_MINUET, // Song demonstrations by teachers + /* 0x03 */ OCARINA_ACTION_TEACH_BOLERO, + /* 0x04 */ OCARINA_ACTION_TEACH_SERENADE, + /* 0x05 */ OCARINA_ACTION_TEACH_REQUIEM, + /* 0x06 */ OCARINA_ACTION_TEACH_NOCTURNE, + /* 0x07 */ OCARINA_ACTION_TEACH_PRELUDE, + /* 0x08 */ OCARINA_ACTION_TEACH_SARIA, + /* 0x09 */ OCARINA_ACTION_TEACH_EPONA, + /* 0x0A */ OCARINA_ACTION_TEACH_LULLABY, + /* 0x0B */ OCARINA_ACTION_TEACH_SUNS, + /* 0x0C */ OCARINA_ACTION_TEACH_TIME, + /* 0x0D */ OCARINA_ACTION_TEACH_STORMS, + /* 0x0E */ OCARINA_ACTION_UNK_E, + /* 0x0F */ OCARINA_ACTION_PLAYBACK_MINUET, // Playing back a particular song + /* 0x10 */ OCARINA_ACTION_PLAYBACK_BOLERO, + /* 0x11 */ OCARINA_ACTION_PLAYBACK_SERENADE, + /* 0x12 */ OCARINA_ACTION_PLAYBACK_REQUIEM, + /* 0x13 */ OCARINA_ACTION_PLAYBACK_NOCTURNE, + /* 0x14 */ OCARINA_ACTION_PLAYBACK_PRELUDE, + /* 0x15 */ OCARINA_ACTION_PLAYBACK_SARIA, + /* 0x16 */ OCARINA_ACTION_PLAYBACK_EPONA, + /* 0x17 */ OCARINA_ACTION_PLAYBACK_LULLABY, + /* 0x18 */ OCARINA_ACTION_PLAYBACK_SUNS, + /* 0x19 */ OCARINA_ACTION_PLAYBACK_TIME, + /* 0x1A */ OCARINA_ACTION_PLAYBACK_STORMS, + /* 0x1B */ OCARINA_ACTION_UNK_1B, + /* 0x1C */ OCARINA_ACTION_CHECK_MINUET, // Playing songs for check spots + /* 0x1D */ OCARINA_ACTION_CHECK_BOLERO, + /* 0x1E */ OCARINA_ACTION_CHECK_SERENADE, + /* 0x1F */ OCARINA_ACTION_CHECK_REQUIEM, + /* 0x20 */ OCARINA_ACTION_CHECK_NOCTURNE, + /* 0x21 */ OCARINA_ACTION_CHECK_PRELUDE, + /* 0x22 */ OCARINA_ACTION_CHECK_SARIA, + /* 0x23 */ OCARINA_ACTION_CHECK_EPONA, + /* 0x24 */ OCARINA_ACTION_CHECK_LULLABY, + /* 0x25 */ OCARINA_ACTION_CHECK_SUNS, + /* 0x26 */ OCARINA_ACTION_CHECK_TIME, + /* 0x27 */ OCARINA_ACTION_CHECK_STORMS, + /* 0x28 */ OCARINA_ACTION_CHECK_SCARECROW_SPAWN, // Playing back the song as adult that was set as child + /* 0x29 */ OCARINA_ACTION_FREE_PLAY_DONE, + /* 0x2A */ OCARINA_ACTION_SCARECROW_LONG_RECORDING, + /* 0x2B */ OCARINA_ACTION_SCARECROW_LONG_PLAYBACK, + /* 0x2C */ OCARINA_ACTION_SCARECROW_SPAWN_RECORDING, + /* 0x2D */ OCARINA_ACTION_SCARECROW_SPAWN_PLAYBACK, + /* 0x2E */ OCARINA_ACTION_MEMORY_GAME, + /* 0x2F */ OCARINA_ACTION_FROGS, + /* 0x30 */ OCARINA_ACTION_CHECK_NOWARP, // Check for any of sarias - storms + /* 0x31 */ OCARINA_ACTION_CHECK_NOWARP_DONE +} OcarinaSongActionId; + +typedef enum { + /* 0x00 */ OCARINA_MODE_00, + /* 0x01 */ OCARINA_MODE_01, + /* 0x02 */ OCARINA_MODE_02, + /* 0x03 */ OCARINA_MODE_03, + /* 0x04 */ OCARINA_MODE_04, + /* 0x05 */ OCARINA_MODE_05, + /* 0x06 */ OCARINA_MODE_06, + /* 0x07 */ OCARINA_MODE_07, + /* 0x08 */ OCARINA_MODE_08, + /* 0x09 */ OCARINA_MODE_09, + /* 0x0A */ OCARINA_MODE_0A, + /* 0x0B */ OCARINA_MODE_0B, + /* 0x0C */ OCARINA_MODE_0C, + /* 0x0D */ OCARINA_MODE_0D, + /* 0x0E */ OCARINA_MODE_0E, + /* 0x0F */ OCARINA_MODE_0F +} OcarinaMode; + +typedef enum { + /* 0 */ OCARINA_BTN_A, + /* 1 */ OCARINA_BTN_C_DOWN, + /* 2 */ OCARINA_BTN_C_RIGHT, + /* 3 */ OCARINA_BTN_C_LEFT, + /* 4 */ OCARINA_BTN_C_UP, + /* 5 */ OCARINA_BTN_C_RIGHT_OR_C_LEFT, // Special case for bFlat4: Interface/Overlap between C_RIGHT and C_LEFT + /* 0xFF */ OCARINA_BTN_INVALID = 0xFF +} OcarinaButtonIndex; + +// Uses scientific pitch notation relative to middle C +// https://en.wikipedia.org/wiki/Scientific_pitch_notation +typedef enum { + /* 0x0 */ OCARINA_PITCH_C4, + /* 0x1 */ OCARINA_PITCH_DFLAT4, + /* 0x2 */ OCARINA_PITCH_D4, + /* 0x3 */ OCARINA_PITCH_EFLAT4, + /* 0x4 */ OCARINA_PITCH_E4, + /* 0x5 */ OCARINA_PITCH_F4, + /* 0x6 */ OCARINA_PITCH_GFLAT4, + /* 0x7 */ OCARINA_PITCH_G4, + /* 0x8 */ OCARINA_PITCH_AFLAT4, + /* 0x9 */ OCARINA_PITCH_A4, + /* 0xA */ OCARINA_PITCH_BFLAT4, + /* 0xB */ OCARINA_PITCH_B4, + /* 0xC */ OCARINA_PITCH_C5, + /* 0xD */ OCARINA_PITCH_DFLAT5, + /* 0xE */ OCARINA_PITCH_D5, + /* 0xF */ OCARINA_PITCH_EFLAT5, + /* 0xFF */ OCARINA_PITCH_NONE = 0xFF +} OcarinaPitch; + +typedef enum { + /* 0 */ OCARINA_INSTRUMENT_OFF, + /* 1 */ OCARINA_INSTRUMENT_DEFAULT, + /* 2 */ OCARINA_INSTRUMENT_MALON, + /* 3 */ OCARINA_INSTRUMENT_WHISTLE, + /* 4 */ OCARINA_INSTRUMENT_HARP, + /* 5 */ OCARINA_INSTRUMENT_GRIND_ORGAN, + /* 6 */ OCARINA_INSTRUMENT_FLUTE, + /* 7 */ OCARINA_INSTRUMENT_MAX, + /* 7 */ OCARINA_INSTRUMENT_DEFAULT_COPY1 = OCARINA_INSTRUMENT_MAX, // Unused but present in Sequence 0 table + /* 8 */ OCARINA_INSTRUMENT_DEFAULT_COPY2 = OCARINA_INSTRUMENT_MAX + 1 // Unused but present in Sequence 0 table +} OcarinaInstrumentId; + +typedef enum { + /* 0 */ OCARINA_RECORD_OFF, + /* 1 */ OCARINA_RECORD_SCARECROW_LONG, + /* 2 */ OCARINA_RECORD_SCARECROW_SPAWN, + /* 0xFF */ OCARINA_RECORD_REJECTED = 0xFF +} OcarinaRecordingState; + +/** + * 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 (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 + */ + +typedef struct { + /* 0x0 */ u8 pitch; // number of semitones above middle C + /* 0x2 */ u16 length; // number of frames the note is sustained + /* 0x4 */ u8 volume; + /* 0x5 */ u8 vibrato; + /* 0x6 */ s8 bend; // frequency multiplicative offset from the pitch + /* 0x7 */ u8 bFlat4Flag; // See note above +} OcarinaNote; // size = 0x8 + +typedef struct { + /* 0x0 */ u8 numButtons; + /* 0x1 */ u8 buttonsIndex[8]; +} OcarinaSongButtons; // size = 0x9 + +typedef struct { + /* 0x0 */ u8 buttonIndex; + /* 0x1 */ u8 state; // multi-use. Playing: used as songIndex. Playback: used as repeat count of song. Recording: used as OcarinaRecordingState. "status" + /* 0x2 */ u8 pos; // "locate" +} OcarinaStaff; // size = 0x3 + +#endif diff --git a/include/z64save.h b/include/z64save.h index d89c62a191..b5756e63b2 100644 --- a/include/z64save.h +++ b/include/z64save.h @@ -104,8 +104,8 @@ typedef struct { /* 0x0F34 */ char unk_F34[0x04]; /* 0x0F38 */ u32 worldMapAreaData; // "area_arrival" /* 0x0F3C */ char unk_F3C[0x4]; - /* 0x0F40 */ u8 scarecrowCustomSongSet; - /* 0x0F41 */ u8 scarecrowCustomSong[0x360]; + /* 0x0F40 */ u8 scarecrowLongSongSet; + /* 0x0F41 */ u8 scarecrowLongSong[0x360]; /* 0x12A1 */ char unk_12A1[0x24]; /* 0x12C5 */ u8 scarecrowSpawnSongSet; /* 0x12C6 */ u8 scarecrowSpawnSong[0x80]; diff --git a/src/code/audio_data.c b/src/code/audio_data.c index 5a8d463872..4798ea47c8 100644 --- a/src/code/audio_data.c +++ b/src/code/audio_data.c @@ -404,135 +404,135 @@ f32 gBendPitchTwoSemitonesFrequencies[] = { 1.117368f, 1.118385f, 1.119403f, 1.120422f, 1.121441f, 1.122462f, }; -f32 gNoteFrequencies[] = { - /* 0x00 */ 0.105112f, // NOTE_A0 - /* 0x01 */ 0.111362f, // NOTE_BFLAT0 - /* 0x02 */ 0.117984f, // NOTE_B0 - /* 0x03 */ 0.125f, // NOTE_C1 - /* 0x04 */ 0.132433f, // NOTE_DFLAT1 - /* 0x05 */ 0.140308f, // NOTE_D1 - /* 0x06 */ 0.148651f, // NOTE_EFLAT1 - /* 0x07 */ 0.15749f, // NOTE_E1 - /* 0x08 */ 0.166855f, // NOTE_F1 - /* 0x09 */ 0.176777f, // NOTE_GFLAT1 - /* 0x0A */ 0.187288f, // NOTE_G1 - /* 0x0B */ 0.198425f, // NOTE_AFLAT1 - /* 0x0C */ 0.210224f, // NOTE_A1 - /* 0x0D */ 0.222725f, // NOTE_BFLAT1 - /* 0x0E */ 0.235969f, // NOTE_B1 - /* 0x0F */ 0.25f, // NOTE_C2 - /* 0x10 */ 0.264866f, // NOTE_DFLAT2 - /* 0x11 */ 0.280616f, // NOTE_D2 - /* 0x12 */ 0.297302f, // NOTE_EFLAT2 - /* 0x13 */ 0.31498f, // NOTE_E2 - /* 0x14 */ 0.33371f, // NOTE_F2 - /* 0x15 */ 0.353553f, // NOTE_GFLAT2 - /* 0x16 */ 0.374577f, // NOTE_G2 - /* 0x17 */ 0.39685f, // NOTE_AFLAT2 - /* 0x18 */ 0.420448f, // NOTE_A2 - /* 0x19 */ 0.445449f, // NOTE_BFLAT2 - /* 0x1A */ 0.471937f, // NOTE_B2 - /* 0x1B */ 0.5f, // NOTE_C3 - /* 0x1C */ 0.529732f, // NOTE_DFLAT3 - /* 0x1D */ 0.561231f, // NOTE_D3 - /* 0x1E */ 0.594604f, // NOTE_EFLAT3 - /* 0x1F */ 0.629961f, // NOTE_E3 - /* 0x20 */ 0.66742f, // NOTE_F3 - /* 0x21 */ 0.707107f, // NOTE_GFLAT3 - /* 0x22 */ 0.749154f, // NOTE_G3 - /* 0x23 */ 0.793701f, // NOTE_AFLAT3 - /* 0x24 */ 0.840897f, // NOTE_A3 - /* 0x25 */ 0.890899f, // NOTE_BFLAT3 - /* 0x26 */ 0.943875f, // NOTE_B3 - /* 0x27 */ 1.0f, // NOTE_C4 (Middle C) - /* 0x28 */ 1.059463f, // NOTE_DFLAT4 - /* 0x29 */ 1.122462f, // NOTE_D4 - /* 0x2A */ 1.189207f, // NOTE_EFLAT4 - /* 0x2B */ 1.259921f, // NOTE_E4 - /* 0x2C */ 1.33484f, // NOTE_F4 - /* 0x2D */ 1.414214f, // NOTE_GFLAT4 - /* 0x2E */ 1.498307f, // NOTE_G4 - /* 0x2F */ 1.587401f, // NOTE_AFLAT4 - /* 0x30 */ 1.681793f, // NOTE_A4 - /* 0x31 */ 1.781798f, // NOTE_BFLAT4 - /* 0x32 */ 1.887749f, // NOTE_B4 - /* 0x33 */ 2.0f, // NOTE_C5 - /* 0x34 */ 2.118926f, // NOTE_DFLAT5 - /* 0x35 */ 2.244924f, // NOTE_D5 - /* 0x36 */ 2.378414f, // NOTE_EFLAT5 - /* 0x37 */ 2.519842f, // NOTE_E5 - /* 0x38 */ 2.66968f, // NOTE_F5 - /* 0x39 */ 2.828428f, // NOTE_GFLAT5 - /* 0x3A */ 2.996615f, // NOTE_G5 - /* 0x3B */ 3.174803f, // NOTE_AFLAT5 - /* 0x3C */ 3.363586f, // NOTE_A5 - /* 0x3D */ 3.563596f, // NOTE_BFLAT5 - /* 0x3E */ 3.775498f, // NOTE_B5 - /* 0x3F */ 4.0f, // NOTE_C6 - /* 0x40 */ 4.237853f, // NOTE_DFLAT6 - /* 0x41 */ 4.489849f, // NOTE_D6 - /* 0x42 */ 4.756829f, // NOTE_EFLAT6 - /* 0x43 */ 5.039685f, // NOTE_E6 - /* 0x44 */ 5.33936f, // NOTE_F6 - /* 0x45 */ 5.656855f, // NOTE_GFLAT6 - /* 0x46 */ 5.993229f, // NOTE_G6 - /* 0x47 */ 6.349606f, // NOTE_AFLAT6 - /* 0x48 */ 6.727173f, // NOTE_A6 - /* 0x49 */ 7.127192f, // NOTE_BFLAT6 - /* 0x4A */ 7.550996f, // NOTE_B6 - /* 0x4B */ 8.0f, // NOTE_C7 - /* 0x4C */ 8.475705f, // NOTE_DFLAT7 - /* 0x4D */ 8.979697f, // NOTE_D7 - /* 0x4E */ 9.513658f, // NOTE_EFLAT7 - /* 0x4F */ 10.07937f, // NOTE_E7 - /* 0x50 */ 10.6787205f, // NOTE_F7 - /* 0x51 */ 11.31371f, // NOTE_GFLAT7 - /* 0x52 */ 11.986459f, // NOTE_G7 - /* 0x53 */ 12.699211f, // NOTE_AFLAT7 - /* 0x54 */ 13.454346f, // NOTE_A7 - /* 0x55 */ 14.254383f, // NOTE_BFLAT7 - /* 0x56 */ 15.101993f, // NOTE_B7 - /* 0x57 */ 16.0f, // NOTE_C8 - /* 0x58 */ 16.95141f, // NOTE_DFLAT8 - /* 0x59 */ 17.959395f, // NOTE_D8 - /* 0x5A */ 19.027315f, // NOTE_EFLAT8 - /* 0x5B */ 20.15874f, // NOTE_E8 - /* 0x5C */ 21.35744f, // NOTE_F8 - /* 0x5D */ 22.62742f, // NOTE_GFLAT8 - /* 0x5E */ 23.972918f, // NOTE_G8 - /* 0x5F */ 25.398422f, // NOTE_AFLAT8 - /* 0x60 */ 26.908691f, // NOTE_A8 - /* 0x61 */ 28.508766f, // NOTE_BFLAT8 - /* 0x62 */ 30.203985f, // NOTE_B8 - /* 0x63 */ 32.0f, // NOTE_C9 - /* 0x64 */ 33.90282f, // NOTE_DFLAT9 - /* 0x65 */ 35.91879f, // NOTE_D9 - /* 0x66 */ 38.05463f, // NOTE_EFLAT9 - /* 0x67 */ 40.31748f, // NOTE_E9 - /* 0x68 */ 42.71488f, // NOTE_F9 - /* 0x69 */ 45.25484f, // NOTE_GFLAT9 - /* 0x6A */ 47.945835f, // NOTE_G9 - /* 0x6B */ 50.796845f, // NOTE_AFLAT9 - /* 0x6C */ 53.817383f, // NOTE_A9 - /* 0x6D */ 57.017532f, // NOTE_BFLAT9 - /* 0x6E */ 60.40797f, // NOTE_B9 - /* 0x6F */ 64.0f, // NOTE_C10 - /* 0x70 */ 67.80564f, // NOTE_DFLAT10 - /* 0x71 */ 71.83758f, // NOTE_D10 - /* 0x72 */ 76.10926f, // NOTE_EFLAT10 - /* 0x73 */ 80.63496f, // NOTE_E10 - /* 0x74 */ 85.42976f, // NOTE_F10 - /* 0x75 */ 0.055681f, // NOTE_BFLATNEG1 - /* 0x76 */ 0.058992f, // NOTE_BNEG1 - /* 0x77 */ 0.0625f, // NOTE_C0 - /* 0x78 */ 0.066216f, // NOTE_DFLAT0 - /* 0x79 */ 0.070154f, // NOTE_D0 - /* 0x7A */ 0.074325f, // NOTE_EFLAT0 - /* 0x7B */ 0.078745f, // NOTE_E0 - /* 0x7C */ 0.083427f, // NOTE_F0 - /* 0x7D */ 0.088388f, // NOTE_GFLAT0 - /* 0x7E */ 0.093644f, // NOTE_G0 - /* 0x7F */ 0.099213f, // NOTE_AFLAT0 +f32 gPitchFrequencies[] = { + /* 0x00 */ 0.105112f, // PITCH_A0 + /* 0x01 */ 0.111362f, // PITCH_BFLAT0 + /* 0x02 */ 0.117984f, // PITCH_B0 + /* 0x03 */ 0.125f, // PITCH_C1 + /* 0x04 */ 0.132433f, // PITCH_DFLAT1 + /* 0x05 */ 0.140308f, // PITCH_D1 + /* 0x06 */ 0.148651f, // PITCH_EFLAT1 + /* 0x07 */ 0.15749f, // PITCH_E1 + /* 0x08 */ 0.166855f, // PITCH_F1 + /* 0x09 */ 0.176777f, // PITCH_GFLAT1 + /* 0x0A */ 0.187288f, // PITCH_G1 + /* 0x0B */ 0.198425f, // PITCH_AFLAT1 + /* 0x0C */ 0.210224f, // PITCH_A1 + /* 0x0D */ 0.222725f, // PITCH_BFLAT1 + /* 0x0E */ 0.235969f, // PITCH_B1 + /* 0x0F */ 0.25f, // PITCH_C2 + /* 0x10 */ 0.264866f, // PITCH_DFLAT2 + /* 0x11 */ 0.280616f, // PITCH_D2 + /* 0x12 */ 0.297302f, // PITCH_EFLAT2 + /* 0x13 */ 0.31498f, // PITCH_E2 + /* 0x14 */ 0.33371f, // PITCH_F2 + /* 0x15 */ 0.353553f, // PITCH_GFLAT2 + /* 0x16 */ 0.374577f, // PITCH_G2 + /* 0x17 */ 0.39685f, // PITCH_AFLAT2 + /* 0x18 */ 0.420448f, // PITCH_A2 + /* 0x19 */ 0.445449f, // PITCH_BFLAT2 + /* 0x1A */ 0.471937f, // PITCH_B2 + /* 0x1B */ 0.5f, // PITCH_C3 + /* 0x1C */ 0.529732f, // PITCH_DFLAT3 + /* 0x1D */ 0.561231f, // PITCH_D3 + /* 0x1E */ 0.594604f, // PITCH_EFLAT3 + /* 0x1F */ 0.629961f, // PITCH_E3 + /* 0x20 */ 0.66742f, // PITCH_F3 + /* 0x21 */ 0.707107f, // PITCH_GFLAT3 + /* 0x22 */ 0.749154f, // PITCH_G3 + /* 0x23 */ 0.793701f, // PITCH_AFLAT3 + /* 0x24 */ 0.840897f, // PITCH_A3 + /* 0x25 */ 0.890899f, // PITCH_BFLAT3 + /* 0x26 */ 0.943875f, // PITCH_B3 + /* 0x27 */ 1.0f, // PITCH_C4 (Middle C) + /* 0x28 */ 1.059463f, // PITCH_DFLAT4 + /* 0x29 */ 1.122462f, // PITCH_D4 + /* 0x2A */ 1.189207f, // PITCH_EFLAT4 + /* 0x2B */ 1.259921f, // PITCH_E4 + /* 0x2C */ 1.33484f, // PITCH_F4 + /* 0x2D */ 1.414214f, // PITCH_GFLAT4 + /* 0x2E */ 1.498307f, // PITCH_G4 + /* 0x2F */ 1.587401f, // PITCH_AFLAT4 + /* 0x30 */ 1.681793f, // PITCH_A4 + /* 0x31 */ 1.781798f, // PITCH_BFLAT4 + /* 0x32 */ 1.887749f, // PITCH_B4 + /* 0x33 */ 2.0f, // PITCH_C5 + /* 0x34 */ 2.118926f, // PITCH_DFLAT5 + /* 0x35 */ 2.244924f, // PITCH_D5 + /* 0x36 */ 2.378414f, // PITCH_EFLAT5 + /* 0x37 */ 2.519842f, // PITCH_E5 + /* 0x38 */ 2.66968f, // PITCH_F5 + /* 0x39 */ 2.828428f, // PITCH_GFLAT5 + /* 0x3A */ 2.996615f, // PITCH_G5 + /* 0x3B */ 3.174803f, // PITCH_AFLAT5 + /* 0x3C */ 3.363586f, // PITCH_A5 + /* 0x3D */ 3.563596f, // PITCH_BFLAT5 + /* 0x3E */ 3.775498f, // PITCH_B5 + /* 0x3F */ 4.0f, // PITCH_C6 + /* 0x40 */ 4.237853f, // PITCH_DFLAT6 + /* 0x41 */ 4.489849f, // PITCH_D6 + /* 0x42 */ 4.756829f, // PITCH_EFLAT6 + /* 0x43 */ 5.039685f, // PITCH_E6 + /* 0x44 */ 5.33936f, // PITCH_F6 + /* 0x45 */ 5.656855f, // PITCH_GFLAT6 + /* 0x46 */ 5.993229f, // PITCH_G6 + /* 0x47 */ 6.349606f, // PITCH_AFLAT6 + /* 0x48 */ 6.727173f, // PITCH_A6 + /* 0x49 */ 7.127192f, // PITCH_BFLAT6 + /* 0x4A */ 7.550996f, // PITCH_B6 + /* 0x4B */ 8.0f, // PITCH_C7 + /* 0x4C */ 8.475705f, // PITCH_DFLAT7 + /* 0x4D */ 8.979697f, // PITCH_D7 + /* 0x4E */ 9.513658f, // PITCH_EFLAT7 + /* 0x4F */ 10.07937f, // PITCH_E7 + /* 0x50 */ 10.6787205f, // PITCH_F7 + /* 0x51 */ 11.31371f, // PITCH_GFLAT7 + /* 0x52 */ 11.986459f, // PITCH_G7 + /* 0x53 */ 12.699211f, // PITCH_AFLAT7 + /* 0x54 */ 13.454346f, // PITCH_A7 + /* 0x55 */ 14.254383f, // PITCH_BFLAT7 + /* 0x56 */ 15.101993f, // PITCH_B7 + /* 0x57 */ 16.0f, // PITCH_C8 + /* 0x58 */ 16.95141f, // PITCH_DFLAT8 + /* 0x59 */ 17.959395f, // PITCH_D8 + /* 0x5A */ 19.027315f, // PITCH_EFLAT8 + /* 0x5B */ 20.15874f, // PITCH_E8 + /* 0x5C */ 21.35744f, // PITCH_F8 + /* 0x5D */ 22.62742f, // PITCH_GFLAT8 + /* 0x5E */ 23.972918f, // PITCH_G8 + /* 0x5F */ 25.398422f, // PITCH_AFLAT8 + /* 0x60 */ 26.908691f, // PITCH_A8 + /* 0x61 */ 28.508766f, // PITCH_BFLAT8 + /* 0x62 */ 30.203985f, // PITCH_B8 + /* 0x63 */ 32.0f, // PITCH_C9 + /* 0x64 */ 33.90282f, // PITCH_DFLAT9 + /* 0x65 */ 35.91879f, // PITCH_D9 + /* 0x66 */ 38.05463f, // PITCH_EFLAT9 + /* 0x67 */ 40.31748f, // PITCH_E9 + /* 0x68 */ 42.71488f, // PITCH_F9 + /* 0x69 */ 45.25484f, // PITCH_GFLAT9 + /* 0x6A */ 47.945835f, // PITCH_G9 + /* 0x6B */ 50.796845f, // PITCH_AFLAT9 + /* 0x6C */ 53.817383f, // PITCH_A9 + /* 0x6D */ 57.017532f, // PITCH_BFLAT9 + /* 0x6E */ 60.40797f, // PITCH_B9 + /* 0x6F */ 64.0f, // PITCH_C10 + /* 0x70 */ 67.80564f, // PITCH_DFLAT10 + /* 0x71 */ 71.83758f, // PITCH_D10 + /* 0x72 */ 76.10926f, // PITCH_EFLAT10 + /* 0x73 */ 80.63496f, // PITCH_E10 + /* 0x74 */ 85.42976f, // PITCH_F10 + /* 0x75 */ 0.055681f, // PITCH_BFLATNEG1 + /* 0x76 */ 0.058992f, // PITCH_BNEG1 + /* 0x77 */ 0.0625f, // PITCH_C0 + /* 0x78 */ 0.066216f, // PITCH_DFLAT0 + /* 0x79 */ 0.070154f, // PITCH_D0 + /* 0x7A */ 0.074325f, // PITCH_EFLAT0 + /* 0x7B */ 0.078745f, // PITCH_E0 + /* 0x7C */ 0.083427f, // PITCH_F0 + /* 0x7D */ 0.088388f, // PITCH_GFLAT0 + /* 0x7E */ 0.093644f, // PITCH_G0 + /* 0x7F */ 0.099213f, // PITCH_AFLAT0 }; u8 gDefaultShortNoteVelocityTable[] = { diff --git a/src/code/audio_load.c b/src/code/audio_load.c index 092ae1d3f6..f331f8bdc2 100644 --- a/src/code/audio_load.c +++ b/src/code/audio_load.c @@ -1098,7 +1098,7 @@ void AudioLoad_Init(void* heap, u32 heapSize) { gAudioContext.aiBufLengths[i] = 0xA0; } - gAudioContext.totalTaskCnt = 0; + gAudioContext.totalTaskCount = 0; gAudioContext.rspTaskIdx = 0; gAudioContext.curAIBufIdx = 0; gAudioContext.soundMode = 0; @@ -1162,7 +1162,7 @@ void AudioLoad_Init(void* heap, u32 heapSize) { AudioHeap_AllocPoolInit(&gAudioContext.permanentPool, temp_v0_3, D_8014A6C4.permanentPoolSize); gAudioContextInitalized = true; - osSendMesg(gAudioContext.taskStartQueueP, (OSMesg)gAudioContext.totalTaskCnt, OS_MESG_NOBLOCK); + osSendMesg(gAudioContext.taskStartQueueP, (OSMesg)gAudioContext.totalTaskCount, OS_MESG_NOBLOCK); } void AudioLoad_InitSlowLoads(void) { diff --git a/src/code/audio_seqplayer.c b/src/code/audio_seqplayer.c index e405309ca5..3f4b159782 100644 --- a/src/code/audio_seqplayer.c +++ b/src/code/audio_seqplayer.c @@ -716,8 +716,8 @@ s32 AudioSeq_SeqLayerProcessScriptStep4(SequenceLayer* layer, s32 cmd) { } } - temp_f2 = gNoteFrequencies[semitone2] * tuning; - temp_f14 = gNoteFrequencies[layer->portamentoTargetNote] * tuning; + temp_f2 = gPitchFrequencies[semitone2] * tuning; + temp_f14 = gPitchFrequencies[layer->portamentoTargetNote] * tuning; switch (PORTAMENTO_MODE(*portamento)) { case PORTAMENTO_MODE_1: @@ -767,10 +767,10 @@ s32 AudioSeq_SeqLayerProcessScriptStep4(SequenceLayer* layer, s32 cmd) { sound = Audio_InstrumentGetSound(instrument, semitone); sameSound = (sound == layer->sound); layer->sound = sound; - layer->freqScale = gNoteFrequencies[semitone2] * sound->tuning; + layer->freqScale = gPitchFrequencies[semitone2] * sound->tuning; } else { layer->sound = NULL; - layer->freqScale = gNoteFrequencies[semitone2]; + layer->freqScale = gPitchFrequencies[semitone2]; if (instOrWave >= 0xC0) { layer->sound = &gAudioContext.synthesisReverbs[instOrWave - 0xC0].sound; } diff --git a/src/code/code_800E4FE0.c b/src/code/code_800E4FE0.c index 04c43a2bd0..93419f4bee 100644 --- a/src/code/code_800E4FE0.c +++ b/src/code/code_800E4FE0.c @@ -35,6 +35,9 @@ AudioTask* func_800E4FE0(void) { return func_800E5000(); } +/** + * This is Audio_Update for the audio thread + */ AudioTask* func_800E5000(void) { static s32 sMaxAbiCmdCnt = 0x80; static AudioTask* sWaitingAudioTask = NULL; @@ -50,13 +53,13 @@ AudioTask* func_800E5000(void) { s32 sp48; s32 i; - gAudioContext.totalTaskCnt++; - if (gAudioContext.totalTaskCnt % (gAudioContext.audioBufferParameters.specUnk4) != 0) { + gAudioContext.totalTaskCount++; + if (gAudioContext.totalTaskCount % (gAudioContext.audioBufferParameters.specUnk4) != 0) { if (D_801755D0 != NULL) { D_801755D0(); } - if ((gAudioContext.totalTaskCnt % gAudioContext.audioBufferParameters.specUnk4) + 1 == + if ((gAudioContext.totalTaskCount % gAudioContext.audioBufferParameters.specUnk4) + 1 == gAudioContext.audioBufferParameters.specUnk4) { return sWaitingAudioTask; } else { @@ -64,7 +67,7 @@ AudioTask* func_800E5000(void) { } } - osSendMesg(gAudioContext.taskStartQueueP, (OSMesg)gAudioContext.totalTaskCnt, OS_MESG_NOBLOCK); + osSendMesg(gAudioContext.taskStartQueueP, (OSMesg)gAudioContext.totalTaskCount, OS_MESG_NOBLOCK); gAudioContext.rspTaskIdx ^= 1; gAudioContext.curAIBufIdx++; gAudioContext.curAIBufIdx %= 3; @@ -163,9 +166,9 @@ AudioTask* func_800E5000(void) { gAudioContext.curAbiCmdBuf = AudioSynth_Update(gAudioContext.curAbiCmdBuf, &abiCmdCnt, currAiBuffer, gAudioContext.aiBufLengths[index]); - gAudioContext.audioRandom = (gAudioContext.audioRandom + gAudioContext.totalTaskCnt) * osGetCount(); + gAudioContext.audioRandom = (gAudioContext.audioRandom + gAudioContext.totalTaskCount) * osGetCount(); gAudioContext.audioRandom = - gAudioContext.aiBuffers[index][gAudioContext.totalTaskCnt & 0xFF] + gAudioContext.audioRandom; + gAudioContext.aiBuffers[index][gAudioContext.totalTaskCount & 0xFF] + gAudioContext.audioRandom; gWaveSamples[8] = (s16*)(((u8*)func_800E4FE0) + (gAudioContext.audioRandom & 0xFFF0)); index = gAudioContext.rspTaskIdx; @@ -809,7 +812,7 @@ s32 func_800E66C0(s32 arg0) { u32 Audio_NextRandom(void) { static u32 audRand = 0x12345678; - audRand = ((osGetCount() + 0x1234567) * (audRand + gAudioContext.totalTaskCnt)); + audRand = ((osGetCount() + 0x1234567) * (audRand + gAudioContext.totalTaskCount)); audRand += gAudioContext.audioRandom; return audRand; } diff --git a/src/code/code_800EC960.c b/src/code/code_800EC960.c index 34badb146b..9e6309eb56 100644 --- a/src/code/code_800EC960.c +++ b/src/code/code_800EC960.c @@ -23,6 +23,8 @@ Audio_QueueSeqCmd(0x80000000 | ((u8)playerIdx << 24) | ((u8)a << 16) | ((u8)b << 8) | ((u8)c)) #define Audio_SeqCmdF(playerIdx, a) Audio_QueueSeqCmd(0xF0000000 | ((u8)playerIdx << 24) | ((u8)a)) +#define ABS_ALT(x) ((x) < 0 ? -(x) : (x)) + typedef struct { /* 0x0 */ f32 vol; /* 0x4 */ f32 freqScale; @@ -33,6 +35,25 @@ typedef struct { /* 0xC */ u8 unk_0C; } SfxPlayerState; +typedef enum { + /* 0x0 */ SFX_CHANNEL_PLAYER0, // SfxPlayerBank + /* 0x1 */ SFX_CHANNEL_PLAYER1, + /* 0x2 */ SFX_CHANNEL_PLAYER2, + /* 0x3 */ SFX_CHANNEL_ITEM0, // SfxItemBank + /* 0x4 */ SFX_CHANNEL_ITEM1, + /* 0x5 */ SFX_CHANNEL_ENV0, // SfxEnvironmentBank + /* 0x6 */ SFX_CHANNEL_ENV1, + /* 0x7 */ SFX_CHANNEL_ENV2, + /* 0x8 */ SFX_CHANNEL_ENEMY0, // SfxEnemyBank + /* 0x9 */ SFX_CHANNEL_ENEMY1, + /* 0xA */ SFX_CHANNEL_ENEMY2, + /* 0xB */ SFX_CHANNEL_SYSTEM0, // SfxSystemBank + /* 0xC */ SFX_CHANNEL_SYSTEM1, + /* 0xD */ SFX_CHANNEL_OCARINA, // SfxOcarinaBank + /* 0xE */ SFX_CHANNEL_VOICE0, // SfxVoiceBank + /* 0xF */ SFX_CHANNEL_VOICE1 +} SfxChannelIndex; // playerIdx = 2 + typedef struct { /* 0x0 */ f32 value; /* 0x4 */ f32 target; @@ -65,24 +86,12 @@ typedef enum { /* 0xF */ PAGE_MAX } AudioDebugPage; -/** bit field of songs that can be played - * 0x0800 storms - * 0x0400 song of time - * 0x0200 suns - * 0x0100 lullaby - * 0x0080 epona - * 0x0040 sarias - * 0x0020 prelude - * 0x0010 nocturne - * 0x0008 requiem - * 0x0004 serenade - * 0x0002 bolero - * 0x0001 minuet - */ - #define SCROLL_PRINT_BUF_SIZE 25 -#define SFX_PLAYER_CHANNEL_OCARINA 13 +typedef struct { + s8 x; + s8 y; +} OcarinaStick; u8 gIsLargeSoundBank[7] = { 0, 0, 0, 1, 0, 0, 0 }; @@ -824,353 +833,376 @@ NatureAmbienceDataIO sNatureAmbienceDataIO[20] = { }, }; -u32 sOcarinaAllowedBtnMask = 0x800F; -s32 sOcarinaABtnMap = 0x8000; -s32 sOcarinaCUPBtnMap = 8; -s32 sOcarinaCDownBtnMap = 4; -u8 sOcarinaInpEnabled = 0; -s8 D_80130F10 = 0; // "OCA", ocarina active? -u8 sCurOcarinaBtnVal = 0xFF; -u8 sPrevOcarinaNoteVal = 0; -u8 sCurOcarinaBtnIdx = 0; // note index? -u8 sLearnSongLastBtn = 0; -f32 D_80130F24 = 1.0f; -f32 D_80130F28 = 87.0f / 127.0f; -s8 D_80130F2C = 0; // pitch? -s8 D_80130F30 = 0x57; -s8 D_80130F34 = 0; -u8 sPlaybackState = 0; // 80130F38 -u32 D_80130F3C = 0; // "SEQ" -u32 sNotePlaybackTimer = 0; +u32 sOcarinaAllowedButtonMask = (BTN_A | BTN_CRIGHT | BTN_CLEFT | BTN_CDOWN | BTN_CUP); +s32 sOcarinaAButtonMap = BTN_A; +s32 sOcarinaCUpButtonMap = BTN_CUP; +s32 sOcarinaCDownButtonMap = BTN_CDOWN; +u8 sIsOcarinaInputEnabled = false; +s8 sOcarinaInstrumentId = OCARINA_INSTRUMENT_OFF; +u8 sCurOcarinaPitch = OCARINA_PITCH_NONE; +u8 sPrevOcarinaPitch = OCARINA_PITCH_C4; +u8 sCurOcarinaButtonIndex = OCARINA_BTN_A; +u8 sMusicStaffPrevPitch = OCARINA_PITCH_C4; +f32 sCurOcarinaBendFreq = 1.0f; +f32 sRelativeOcarinaVolume = 87.0f / 127.0f; +s8 sCurOcarinaBendIndex = 0; +s8 sCurOcarinaVolume = 87; +s8 sCurOcarinaVibrato = 0; +u8 sPlaybackState = 0; +u32 sOcarinaFlags = 0; +u32 sPlaybackNoteTimer = 0; u16 sPlaybackNotePos = 0; -u16 sStaffPlaybackPos = 0; -u16 D_80130F4C = 0; -u8 sDisplayedNoteValue = 0xFF; // Note to display on screen? +u16 sPlaybackStaffPos = 0; +u16 sPrevOcarinaWithMusicStaffFlags = 0; +u8 sPlaybackPitch = OCARINA_PITCH_NONE; // Pitch + PitchFlags u8 sNotePlaybackVolume = 0; u8 sNotePlaybackVibrato = 0; -s8 sNotePlaybackTone = 0; -f32 sNormalizedNotePlaybackTone = 1.0f; -f32 sNormalizedNotePlaybackVolume = 1.0f; -s32 D_80130F68 = 0; -u8 sOcarinaNoteValues[5] = { 2, 5, 9, 11, 14 }; -u8 sOcaMinigameAppendPos = 0; -u8 sOcaMinigameEndPos = 0; -u8 sOcaMinigameNoteCnts[] = { 5, 6, 8 }; +s8 sNotePlaybackBend = 0; +f32 sRelativeNotePlaybackBend = 1.0f; +f32 sRelativeNotePlaybackVolume = 1.0f; +s32 sOcarinaPlaybackTaskStart = 0; -OcarinaNote sOcarinaSongs[OCARINA_SONG_MAX][20] = { - // Minuet +u8 sButtonToPitchMap[5] = { + OCARINA_PITCH_D4, // OCARINA_BTN_A + OCARINA_PITCH_F4, // OCARINA_BTN_C_DOWN + OCARINA_PITCH_A4, // OCARINA_BTN_C_RIGHT + OCARINA_PITCH_B4, // OCARINA_BTN_C_LEFT + OCARINA_PITCH_D5, // OCARINA_BTN_C_UP +}; + +u8 sOcaMemoryGameAppendPos = 0; +u8 sOcaMemoryGameEndPos = 0; +u8 sOcaMemoryGameNumNotes[] = { 5, 6, 8 }; + +OcarinaNote sOcarinaSongNotes[OCARINA_SONG_MAX][20] = { + // OCARINA_SONG_MINUET { - { 2, 0, 18, 86, 0, 0, 0 }, - { 14, 0, 18, 92, 0, 0, 0 }, - { 11, 0, 72, 86, 0, 0, 0 }, - { 9, 0, 18, 80, 0, 0, 0 }, - { 11, 0, 18, 88, 0, 0, 0 }, - { 9, 0, 144, 86, 0, 0, 0 }, - { 0xFF, 0, 0, 86, 0, 0, 0 }, + { OCARINA_PITCH_D4, 18, 86, 0, 0, 0 }, + { OCARINA_PITCH_D5, 18, 92, 0, 0, 0 }, + { OCARINA_PITCH_B4, 72, 86, 0, 0, 0 }, + { OCARINA_PITCH_A4, 18, 80, 0, 0, 0 }, + { OCARINA_PITCH_B4, 18, 88, 0, 0, 0 }, + { OCARINA_PITCH_A4, 144, 86, 0, 0, 0 }, + { OCARINA_PITCH_NONE, 0, 86, 0, 0, 0 }, }, - // Bolero + // OCARINA_SONG_BOLERO { - { 5, 0, 15, 80, 0, 0, 0 }, - { 2, 0, 15, 72, 0, 0, 0 }, - { 5, 0, 15, 84, 0, 0, 0 }, - { 2, 0, 15, 76, 0, 0, 0 }, - { 9, 0, 15, 84, 0, 0, 0 }, - { 5, 0, 15, 74, 0, 0, 0 }, - { 9, 0, 15, 78, 0, 0, 0 }, - { 5, 0, 135, 66, 0, 0, 0 }, - { 0xFF, 0, 0, 66, 0, 0, 0 }, + { OCARINA_PITCH_F4, 15, 80, 0, 0, 0 }, + { OCARINA_PITCH_D4, 15, 72, 0, 0, 0 }, + { OCARINA_PITCH_F4, 15, 84, 0, 0, 0 }, + { OCARINA_PITCH_D4, 15, 76, 0, 0, 0 }, + { OCARINA_PITCH_A4, 15, 84, 0, 0, 0 }, + { OCARINA_PITCH_F4, 15, 74, 0, 0, 0 }, + { OCARINA_PITCH_A4, 15, 78, 0, 0, 0 }, + { OCARINA_PITCH_F4, 135, 66, 0, 0, 0 }, + { OCARINA_PITCH_NONE, 0, 66, 0, 0, 0 }, }, - // Serenade + // OCARINA_SONG_SERENADE { - { 2, 0, 36, 60, 0, 0, 0 }, - { 5, 0, 36, 78, 0, 0, 0 }, - { 9, 0, 33, 82, 0, 0, 0 }, - { 0xFF, 0, 3, 82, 0, 0, 0 }, - { 9, 0, 36, 84, 0, 0, 0 }, - { 11, 0, 144, 90, 0, 0, 0 }, - { 0xFF, 0, 0, 90, 0, 0, 0 }, + { OCARINA_PITCH_D4, 36, 60, 0, 0, 0 }, + { OCARINA_PITCH_F4, 36, 78, 0, 0, 0 }, + { OCARINA_PITCH_A4, 33, 82, 0, 0, 0 }, + { OCARINA_PITCH_NONE, 3, 82, 0, 0, 0 }, + { OCARINA_PITCH_A4, 36, 84, 0, 0, 0 }, + { OCARINA_PITCH_B4, 144, 90, 0, 0, 0 }, + { OCARINA_PITCH_NONE, 0, 90, 0, 0, 0 }, }, - // Requiem + // OCARINA_SONG_REQUIEM { - { 2, 0, 45, 88, 0, 0, 0 }, - { 5, 0, 23, 86, 0, 0, 0 }, - { 2, 0, 22, 84, 0, 0, 0 }, - { 9, 0, 45, 86, 0, 0, 0 }, - { 5, 0, 45, 94, 0, 0, 0 }, - { 2, 0, 180, 94, 0, 0, 0 }, - { 0xFF, 0, 0, 94, 0, 0, 0 }, + { OCARINA_PITCH_D4, 45, 88, 0, 0, 0 }, + { OCARINA_PITCH_F4, 23, 86, 0, 0, 0 }, + { OCARINA_PITCH_D4, 22, 84, 0, 0, 0 }, + { OCARINA_PITCH_A4, 45, 86, 0, 0, 0 }, + { OCARINA_PITCH_F4, 45, 94, 0, 0, 0 }, + { OCARINA_PITCH_D4, 180, 94, 0, 0, 0 }, + { OCARINA_PITCH_NONE, 0, 94, 0, 0, 0 }, }, - // Nocturne + // OCARINA_SONG_NOCTURNE { - { 11, 0, 36, 88, 0, 0, 0 }, - { 9, 0, 33, 84, 0, 0, 0 }, - { 0xFF, 0, 3, 84, 0, 0, 0 }, - { 9, 0, 18, 82, 0, 0, 0 }, - { 2, 0, 18, 60, 0, 0, 0 }, - { 11, 0, 18, 90, 0, 0, 0 }, - { 9, 0, 18, 88, 0, 0, 0 }, - { 5, 0, 144, 96, 0, 0, 0 }, - { 0xFF, 0, 0, 96, 0, 0, 0 }, + { OCARINA_PITCH_B4, 36, 88, 0, 0, 0 }, + { OCARINA_PITCH_A4, 33, 84, 0, 0, 0 }, + { OCARINA_PITCH_NONE, 3, 84, 0, 0, 0 }, + { OCARINA_PITCH_A4, 18, 82, 0, 0, 0 }, + { OCARINA_PITCH_D4, 18, 60, 0, 0, 0 }, + { OCARINA_PITCH_B4, 18, 90, 0, 0, 0 }, + { OCARINA_PITCH_A4, 18, 88, 0, 0, 0 }, + { OCARINA_PITCH_F4, 144, 96, 0, 0, 0 }, + { OCARINA_PITCH_NONE, 0, 96, 0, 0, 0 }, }, - // Prelude + // OCARINA_SONG_PRELUDE { - { 14, 0, 15, 84, 0, 0, 0 }, - { 9, 0, 45, 88, 0, 0, 0 }, - { 14, 0, 15, 88, 0, 0, 0 }, - { 9, 0, 15, 82, 0, 0, 0 }, - { 11, 0, 15, 86, 0, 0, 0 }, - { 14, 0, 60, 90, 0, 0, 0 }, - { 0xFF, 0, 75, 90, 0, 0, 0 }, - { 0xFF, 0, 0, 90, 0, 0, 0 }, + { OCARINA_PITCH_D5, 15, 84, 0, 0, 0 }, + { OCARINA_PITCH_A4, 45, 88, 0, 0, 0 }, + { OCARINA_PITCH_D5, 15, 88, 0, 0, 0 }, + { OCARINA_PITCH_A4, 15, 82, 0, 0, 0 }, + { OCARINA_PITCH_B4, 15, 86, 0, 0, 0 }, + { OCARINA_PITCH_D5, 60, 90, 0, 0, 0 }, + { OCARINA_PITCH_NONE, 75, 90, 0, 0, 0 }, + { OCARINA_PITCH_NONE, 0, 90, 0, 0, 0 }, }, - // Sarias + // OCARINA_SONG_SARIAS { - { 5, 0, 17, 84, 0, 0, 0 }, - { 9, 0, 17, 88, 0, 0, 0 }, - { 11, 0, 34, 80, 0, 0, 0 }, - { 5, 0, 17, 84, 0, 0, 0 }, - { 9, 0, 17, 88, 0, 0, 0 }, - { 11, 0, 136, 80, 0, 0, 0 }, - { 0xFF, 0, 0, 90, 0, 0, 0 }, + { OCARINA_PITCH_F4, 17, 84, 0, 0, 0 }, + { OCARINA_PITCH_A4, 17, 88, 0, 0, 0 }, + { OCARINA_PITCH_B4, 34, 80, 0, 0, 0 }, + { OCARINA_PITCH_F4, 17, 84, 0, 0, 0 }, + { OCARINA_PITCH_A4, 17, 88, 0, 0, 0 }, + { OCARINA_PITCH_B4, 136, 80, 0, 0, 0 }, + { OCARINA_PITCH_NONE, 0, 90, 0, 0, 0 }, }, - // Epona + // OCARINA_SONG_EPONAS { - { 14, 0, 18, 84, 0, 0, 0 }, - { 11, 0, 18, 88, 0, 0, 0 }, - { 9, 0, 72, 80, 0, 0, 0 }, - { 14, 0, 18, 84, 0, 0, 0 }, - { 11, 0, 18, 88, 0, 0, 0 }, - { 9, 0, 144, 80, 0, 0, 0 }, - { 0xFF, 0, 0, 90, 0, 0, 0 }, + { OCARINA_PITCH_D5, 18, 84, 0, 0, 0 }, + { OCARINA_PITCH_B4, 18, 88, 0, 0, 0 }, + { OCARINA_PITCH_A4, 72, 80, 0, 0, 0 }, + { OCARINA_PITCH_D5, 18, 84, 0, 0, 0 }, + { OCARINA_PITCH_B4, 18, 88, 0, 0, 0 }, + { OCARINA_PITCH_A4, 144, 80, 0, 0, 0 }, + { OCARINA_PITCH_NONE, 0, 90, 0, 0, 0 }, }, - // Lullaby + // OCARINA_SONG_LULLABY { - { 11, 0, 51, 84, 0, 0, 0 }, - { 14, 0, 25, 88, 0, 0, 0 }, - { 9, 0, 78, 80, 0, 0, 0 }, - { 11, 0, 51, 84, 0, 0, 0 }, - { 14, 0, 25, 88, 0, 0, 0 }, - { 9, 0, 100, 80, 0, 0, 0 }, - { 0xFF, 0, 0, 90, 0, 0, 0 }, + { OCARINA_PITCH_B4, 51, 84, 0, 0, 0 }, + { OCARINA_PITCH_D5, 25, 88, 0, 0, 0 }, + { OCARINA_PITCH_A4, 78, 80, 0, 0, 0 }, + { OCARINA_PITCH_B4, 51, 84, 0, 0, 0 }, + { OCARINA_PITCH_D5, 25, 88, 0, 0, 0 }, + { OCARINA_PITCH_A4, 100, 80, 0, 0, 0 }, + { OCARINA_PITCH_NONE, 0, 90, 0, 0, 0 }, }, - // Suns + // OCARINA_SONG_SUNS { - { 9, 0, 12, 84, 0, 0, 0 }, - { 5, 0, 13, 88, 0, 0, 0 }, - { 14, 0, 29, 80, 2, 0, 0 }, - { 0xFF, 0, 9, 84, 0, 0, 0 }, - { 9, 0, 12, 84, 0, 0, 0 }, - { 5, 0, 13, 88, 0, 0, 0 }, - { 14, 0, 120, 80, 3, 0, 0 }, - { 0xFF, 0, 0, 90, 0, 0, 0 }, + { OCARINA_PITCH_A4, 12, 84, 0, 0, 0 }, + { OCARINA_PITCH_F4, 13, 88, 0, 0, 0 }, + { OCARINA_PITCH_D5, 29, 80, 2, 0, 0 }, + { OCARINA_PITCH_NONE, 9, 84, 0, 0, 0 }, + { OCARINA_PITCH_A4, 12, 84, 0, 0, 0 }, + { OCARINA_PITCH_F4, 13, 88, 0, 0, 0 }, + { OCARINA_PITCH_D5, 120, 80, 3, 0, 0 }, + { OCARINA_PITCH_NONE, 0, 90, 0, 0, 0 }, }, - // Song of Time + // OCARINA_SONG_TIME { - { 9, 0, 32, 84, 0, 0, 0 }, - { 2, 0, 65, 88, 0, 0, 0 }, - { 5, 0, 33, 80, 0, 0, 0 }, - { 9, 0, 32, 84, 0, 0, 0 }, - { 2, 0, 65, 88, 0, 0, 0 }, - { 5, 0, 99, 80, 0, 0, 0 }, - { 0xFF, 0, 0, 90, 0, 0, 0 }, + { OCARINA_PITCH_A4, 32, 84, 0, 0, 0 }, + { OCARINA_PITCH_D4, 65, 88, 0, 0, 0 }, + { OCARINA_PITCH_F4, 33, 80, 0, 0, 0 }, + { OCARINA_PITCH_A4, 32, 84, 0, 0, 0 }, + { OCARINA_PITCH_D4, 65, 88, 0, 0, 0 }, + { OCARINA_PITCH_F4, 99, 80, 0, 0, 0 }, + { OCARINA_PITCH_NONE, 0, 90, 0, 0, 0 }, }, - // Storms + // OCARINA_SONG_STORMS { - { 2, 0, 11, 84, 0, 0, 0 }, - { 5, 0, 11, 88, 0, 0, 0 }, - { 14, 0, 45, 80, 0, 0, 0 }, - { 2, 0, 11, 84, 0, 0, 0 }, - { 5, 0, 11, 88, 0, 0, 0 }, - { 14, 0, 90, 80, 0, 0, 0 }, - { 0xFF, 0, 0, 90, 0, 0, 0 }, + { OCARINA_PITCH_D4, 11, 84, 0, 0, 0 }, + { OCARINA_PITCH_F4, 11, 88, 0, 0, 0 }, + { OCARINA_PITCH_D5, 45, 80, 0, 0, 0 }, + { OCARINA_PITCH_D4, 11, 84, 0, 0, 0 }, + { OCARINA_PITCH_F4, 11, 88, 0, 0, 0 }, + { OCARINA_PITCH_D5, 90, 80, 0, 0, 0 }, + { OCARINA_PITCH_NONE, 0, 90, 0, 0, 0 }, }, - // Scarecrow + // OCARINA_SONG_SCARECROW_SPAWN { - { 2, 0, 3, 0, 0, 0, 0 }, - { 0xFF, 0, 0, 255, 0, 0, 0 }, + { OCARINA_PITCH_D4, 3, 0, 0, 0, 0 }, + { OCARINA_PITCH_NONE, 0, 255, 0, 0, 0 }, }, - // Lost Woods Memory Game + // OCARINA_SONG_MEMORY_GAME { - { 2, 0, 3, 0, 0, 0, 0 }, - { 0xFF, 0, 0, 0, 0, 0, 0 }, + { OCARINA_PITCH_D4, 3, 0, 0, 0, 0 }, + { OCARINA_PITCH_NONE, 0, 0, 0, 0, 0 }, }, }; -OcarinaNote* sPlaybackSong = sOcarinaSongs[0]; +OcarinaNote* sPlaybackSong = sOcarinaSongNotes[0]; u8 sFrogsSongNotes[14] = { - OCARINA_NOTE_A, OCARINA_NOTE_C_LEFT, OCARINA_NOTE_C_RIGHT, OCARINA_NOTE_C_DOWN, OCARINA_NOTE_C_LEFT, - OCARINA_NOTE_C_RIGHT, OCARINA_NOTE_C_DOWN, OCARINA_NOTE_A, OCARINA_NOTE_C_DOWN, OCARINA_NOTE_A, - OCARINA_NOTE_C_DOWN, OCARINA_NOTE_C_RIGHT, OCARINA_NOTE_C_LEFT, OCARINA_NOTE_A, + 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, + OCARINA_BTN_C_DOWN, OCARINA_BTN_C_RIGHT, OCARINA_BTN_C_LEFT, OCARINA_BTN_A, }; u8* gFrogsSongPtr = sFrogsSongNotes; -u8 sRecordingState = 0; +u8 sRecordingState = OCARINA_RECORD_OFF; u8 sRecordSongPos = 0; -u32 D_80131860 = 0; -u8 D_80131864 = 0; -u8 D_80131868 = 0; -u8 D_8013186C = 0; -s8 D_80131870 = 0; -u8 D_80131874 = 0; -u8 D_80131878 = 0; -u8 D_8013187C = 0; -u8 D_80131880 = 0; +u32 sOcarinaRecordTaskStart = 0; +u8 sRecordOcarinaPitch = 0; +u8 sRecordOcarinaVolume = 0; +u8 sRecordOcarinaVibrato = 0; +s8 sRecordOcarinaBendIndex = 0; +u8 sRecordOcarinaButtonIndex = 0; +u8 sPlayedOcarinaSongIndexPlusOne = 0; +u8 sMusicStaffNumNotesPerTest = 0; +u8 sOcarinaDropInputTimer = 0; -OcarinaNote sPierresSong[108] = { - { 0xFF, 0, 0, 0, 0, 0, 0 }, - { 0xFF, 0, 0, 0, 0, 0, 0 }, +OcarinaNote sScarecrowsLongSongNotes[108] = { + { OCARINA_PITCH_NONE, 0, 0, 0, 0, 0 }, + { OCARINA_PITCH_NONE, 0, 0, 0, 0, 0 }, }; -OcarinaNote* gScarecrowCustomSongPtr = sPierresSong; +OcarinaNote* gScarecrowLongSongPtr = sScarecrowsLongSongNotes; -u8* gScarecrowSpawnSongPtr = (u8*)&sOcarinaSongs[OCARINA_SONG_SCARECROW]; -OcarinaNote* D_80131BEC = sOcarinaSongs[OCARINA_SONG_MEMORY_GAME]; -u8 sNoteValueIndexMap[16] = { 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 5, 3, 3, 4, 4, 4 }; +u8* gScarecrowSpawnSongPtr = (u8*)&sOcarinaSongNotes[OCARINA_SONG_SCARECROW_SPAWN]; +OcarinaNote* sMemoryGameSongPtr = sOcarinaSongNotes[OCARINA_SONG_MEMORY_GAME]; -OcarinaSongInfo gOcarinaSongNotes[OCARINA_SONG_MAX] = { - // Minuet +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_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 +}; + +OcarinaSongButtons gOcarinaSongButtons[OCARINA_SONG_MAX] = { + // OCARINA_SONG_MINUET { 6, { - OCARINA_NOTE_A, - OCARINA_NOTE_C_UP, - OCARINA_NOTE_C_LEFT, - OCARINA_NOTE_C_RIGHT, - OCARINA_NOTE_C_LEFT, - OCARINA_NOTE_C_RIGHT, + OCARINA_BTN_A, + OCARINA_BTN_C_UP, + OCARINA_BTN_C_LEFT, + OCARINA_BTN_C_RIGHT, + OCARINA_BTN_C_LEFT, + OCARINA_BTN_C_RIGHT, } }, - // Bolero + // OCARINA_SONG_BOLERO { 8, { - OCARINA_NOTE_C_DOWN, - OCARINA_NOTE_A, - OCARINA_NOTE_C_DOWN, - OCARINA_NOTE_A, - OCARINA_NOTE_C_RIGHT, - OCARINA_NOTE_C_DOWN, - OCARINA_NOTE_C_RIGHT, - OCARINA_NOTE_C_DOWN, + OCARINA_BTN_C_DOWN, + OCARINA_BTN_A, + OCARINA_BTN_C_DOWN, + OCARINA_BTN_A, + OCARINA_BTN_C_RIGHT, + OCARINA_BTN_C_DOWN, + OCARINA_BTN_C_RIGHT, + OCARINA_BTN_C_DOWN, } }, - // Serenade + // OCARINA_SONG_SERENADE { 5, { - OCARINA_NOTE_A, - OCARINA_NOTE_C_DOWN, - OCARINA_NOTE_C_RIGHT, - OCARINA_NOTE_C_RIGHT, - OCARINA_NOTE_C_LEFT, + OCARINA_BTN_A, + OCARINA_BTN_C_DOWN, + OCARINA_BTN_C_RIGHT, + OCARINA_BTN_C_RIGHT, + OCARINA_BTN_C_LEFT, } }, - // Requiem + // OCARINA_SONG_REQUIEM { 6, { - OCARINA_NOTE_A, - OCARINA_NOTE_C_DOWN, - OCARINA_NOTE_A, - OCARINA_NOTE_C_RIGHT, - OCARINA_NOTE_C_DOWN, - OCARINA_NOTE_A, + OCARINA_BTN_A, + OCARINA_BTN_C_DOWN, + OCARINA_BTN_A, + OCARINA_BTN_C_RIGHT, + OCARINA_BTN_C_DOWN, + OCARINA_BTN_A, } }, - // Nocturne + // OCARINA_SONG_NOCTURNE { 7, { - OCARINA_NOTE_C_LEFT, - OCARINA_NOTE_C_RIGHT, - OCARINA_NOTE_C_RIGHT, - OCARINA_NOTE_A, - OCARINA_NOTE_C_LEFT, - OCARINA_NOTE_C_RIGHT, - OCARINA_NOTE_C_DOWN, + OCARINA_BTN_C_LEFT, + OCARINA_BTN_C_RIGHT, + OCARINA_BTN_C_RIGHT, + OCARINA_BTN_A, + OCARINA_BTN_C_LEFT, + OCARINA_BTN_C_RIGHT, + OCARINA_BTN_C_DOWN, } }, - // Prelude + // OCARINA_SONG_PRELUDE { 6, { - OCARINA_NOTE_C_UP, - OCARINA_NOTE_C_RIGHT, - OCARINA_NOTE_C_UP, - OCARINA_NOTE_C_RIGHT, - OCARINA_NOTE_C_LEFT, - OCARINA_NOTE_C_UP, + OCARINA_BTN_C_UP, + OCARINA_BTN_C_RIGHT, + OCARINA_BTN_C_UP, + OCARINA_BTN_C_RIGHT, + OCARINA_BTN_C_LEFT, + OCARINA_BTN_C_UP, } }, - // Sarias + // OCARINA_SONG_SARIAS { 6, { - OCARINA_NOTE_C_DOWN, - OCARINA_NOTE_C_RIGHT, - OCARINA_NOTE_C_LEFT, - OCARINA_NOTE_C_DOWN, - OCARINA_NOTE_C_RIGHT, - OCARINA_NOTE_C_LEFT, + OCARINA_BTN_C_DOWN, + OCARINA_BTN_C_RIGHT, + OCARINA_BTN_C_LEFT, + OCARINA_BTN_C_DOWN, + OCARINA_BTN_C_RIGHT, + OCARINA_BTN_C_LEFT, } }, - // Epona + // OCARINA_SONG_EPONAS { 6, { - OCARINA_NOTE_C_UP, - OCARINA_NOTE_C_LEFT, - OCARINA_NOTE_C_RIGHT, - OCARINA_NOTE_C_UP, - OCARINA_NOTE_C_LEFT, - OCARINA_NOTE_C_RIGHT, + OCARINA_BTN_C_UP, + OCARINA_BTN_C_LEFT, + OCARINA_BTN_C_RIGHT, + OCARINA_BTN_C_UP, + OCARINA_BTN_C_LEFT, + OCARINA_BTN_C_RIGHT, } }, - // Lullaby + // OCARINA_SONG_LULLABY { 6, { - OCARINA_NOTE_C_LEFT, - OCARINA_NOTE_C_UP, - OCARINA_NOTE_C_RIGHT, - OCARINA_NOTE_C_LEFT, - OCARINA_NOTE_C_UP, - OCARINA_NOTE_C_RIGHT, + OCARINA_BTN_C_LEFT, + OCARINA_BTN_C_UP, + OCARINA_BTN_C_RIGHT, + OCARINA_BTN_C_LEFT, + OCARINA_BTN_C_UP, + OCARINA_BTN_C_RIGHT, } }, - // Suns + // OCARINA_SONG_SUNS { 6, { - OCARINA_NOTE_C_RIGHT, - OCARINA_NOTE_C_DOWN, - OCARINA_NOTE_C_UP, - OCARINA_NOTE_C_RIGHT, - OCARINA_NOTE_C_DOWN, - OCARINA_NOTE_C_UP, + OCARINA_BTN_C_RIGHT, + OCARINA_BTN_C_DOWN, + OCARINA_BTN_C_UP, + OCARINA_BTN_C_RIGHT, + OCARINA_BTN_C_DOWN, + OCARINA_BTN_C_UP, } }, - // Song of Time + // OCARINA_SONG_TIME { 6, { - OCARINA_NOTE_C_RIGHT, - OCARINA_NOTE_A, - OCARINA_NOTE_C_DOWN, - OCARINA_NOTE_C_RIGHT, - OCARINA_NOTE_A, - OCARINA_NOTE_C_DOWN, + OCARINA_BTN_C_RIGHT, + OCARINA_BTN_A, + OCARINA_BTN_C_DOWN, + OCARINA_BTN_C_RIGHT, + OCARINA_BTN_A, + OCARINA_BTN_C_DOWN, } }, - // Storms + // OCARINA_SONG_STORMS { 6, { - OCARINA_NOTE_A, - OCARINA_NOTE_C_DOWN, - OCARINA_NOTE_C_UP, - OCARINA_NOTE_A, - OCARINA_NOTE_C_DOWN, - OCARINA_NOTE_C_UP, + OCARINA_BTN_A, + OCARINA_BTN_C_DOWN, + OCARINA_BTN_C_UP, + OCARINA_BTN_A, + OCARINA_BTN_C_DOWN, + OCARINA_BTN_C_UP, } }, - // Scarecrow - { 8, { 0, 0, 0, 0, 0, 0, 0, 0 } }, - // Lost Woods Memory Game - { 0, { 0, 0, 0, 0, 0, 0, 0, 0 } }, + // OCARINA_SONG_SCARECROW_SPAWN + { 8, { 0 } }, + // OCARINA_SONG_MEMORY_GAME + { 0, { 0 } }, }; -/** - * BSS - */ -u32 sAudioUpdateStartTime; // 8016B7A0 +u32 sAudioUpdateStartTime; u32 sAudioUpdateEndTime; f32 D_8016B7A8; f32 D_8016B7AC; @@ -1192,7 +1224,6 @@ u8 sRiverSoundMainBgmLower; u8 sRiverSoundMainBgmRestore; u8 sGanonsTowerVol; SfxPlayerState sSfxChannelState[0x10]; - char sBinToStrBuf[0x20]; u8 D_8016B9D8; u8 sAudioSpecPeakNumNotes[0x12]; @@ -1202,916 +1233,1081 @@ u8 D_8016B9F4; u16 D_8016B9F6; OcarinaStaff sPlayingStaff; -OcarinaStaff sDisplayedStaff; +OcarinaStaff sPlaybackStaff; OcarinaStaff sRecordingStaff; -u32 D_8016BA04; -typedef struct { - s8 x; - s8 y; -} OcarinaStick; -OcarinaStick sCurOcaStick; -u32 sCurOcarinaBtnPress; -u32 D_8016BA10; -u32 sPrevOcarinaBtnPress; -s32 D_8016BA18; -s32 D_8016BA1C; -u8 sCurOcarinaSong[8]; -u8 sOcarinaSongAppendPos; +u32 sOcarinaUpdateTaskStart; +OcarinaStick sOcarinaInputStickRel; +u32 sOcarinaInputButtonCur; +u32 sOcarinaInputButtonStart; +u32 sOcarinaInputButtonPrev; +s32 sOcarinaInputButtonPress; +s32 sOcarinaUnused; +u8 sCurOcarinaSongWithoutMusicStaff[8]; +u8 sOcarinaWithoutMusicStaffPos; u8 sOcarinaHasStartedSong; -u8 sOcarinaSongNoteStartIdx; -u8 sOcarinaSongCnt; -u16 sOcarinaAvailSongs; -u8 sStaffPlayingPos; -u16 sLearnSongPos[0x10]; -u16 D_8016BA50[0x10]; -u16 D_8016BA70[0x10]; -u8 sLearnSongExpectedNote[0x10]; -OcarinaNote D_8016BAA0; +u8 sFirstOcarinaSongIndex; +u8 sLastOcarinaSongIndex; +u16 sAvailOcarinaSongFlags; +u8 sStaffOcarinaPlayingPos; +u16 sMusicStaffPos[OCARINA_SONG_MAX]; +u16 sMusicStaffCurHeldLength[OCARINA_SONG_MAX]; +u16 sMusicStaffExpectedLength[OCARINA_SONG_MAX]; +u8 sMusicStaffExpectedPitch[OCARINA_SONG_MAX]; +OcarinaNote sScarecrowsLongSongSecondNote; u8 sAudioHasMalonBgm; f32 sAudioMalonBgmDist; -// Start debug bss -u32 sDebugPadHold; -u32 sDebugPadBtnLast; -u32 sDebugPadPress; -s32 sAudioUpdateTaskStart; -s32 sAudioUpdateTaskEnd; - void PadMgr_RequestPadData(PadMgr* padmgr, Input* inputs, s32 mode); - void Audio_StepFreqLerp(FreqLerp* lerp); void func_800F56A8(void); void Audio_PlayNatureAmbienceSequence(u8 natureAmbienceId); s32 Audio_SetGanonsTowerBgmVolume(u8 targetVol); -void func_800EC960(u8 custom) { - if (!custom) { +// =========== Audio Ocarina =========== + +void AudioOcarina_SetCustomButtonMapping(u8 useCustom) { + if (!useCustom) { osSyncPrintf("AUDIO : Ocarina Control Assign Normal\n"); - sOcarinaAllowedBtnMask = (BTN_A | BTN_CUP | BTN_CDOWN | BTN_CLEFT | BTN_CRIGHT); - sOcarinaABtnMap = BTN_A; - sOcarinaCUPBtnMap = BTN_CUP; - sOcarinaCDownBtnMap = BTN_CDOWN; + sOcarinaAllowedButtonMask = (BTN_A | BTN_CUP | BTN_CDOWN | BTN_CLEFT | BTN_CRIGHT); + sOcarinaAButtonMap = BTN_A; + sOcarinaCUpButtonMap = BTN_CUP; + sOcarinaCDownButtonMap = BTN_CDOWN; } else { osSyncPrintf("AUDIO : Ocarina Control Assign Custom\n"); - sOcarinaAllowedBtnMask = (BTN_A | BTN_B | BTN_CDOWN | BTN_CLEFT | BTN_CRIGHT); - sOcarinaABtnMap = BTN_B; - sOcarinaCUPBtnMap = BTN_CDOWN; - sOcarinaCDownBtnMap = BTN_A; + sOcarinaAllowedButtonMask = (BTN_A | BTN_B | BTN_CDOWN | BTN_CLEFT | BTN_CRIGHT); + sOcarinaAButtonMap = BTN_B; + sOcarinaCUpButtonMap = BTN_CDOWN; + sOcarinaCDownButtonMap = BTN_A; } } -void Audio_GetOcaInput(void) { +void AudioOcarina_ReadControllerInput(void) { Input inputs[4]; Input* input = &inputs[0]; - u32 sp18; + u32 ocarinaInputButtonPrev = sOcarinaInputButtonCur; - sp18 = sCurOcarinaBtnPress; PadMgr_RequestPadData(&gPadMgr, inputs, 0); - sCurOcarinaBtnPress = input->cur.button; - sPrevOcarinaBtnPress = sp18; - sCurOcaStick.x = input->rel.stick_x; - sCurOcaStick.y = input->rel.stick_y; + sOcarinaInputButtonCur = input->cur.button; + sOcarinaInputButtonPrev = ocarinaInputButtonPrev; + sOcarinaInputStickRel.x = input->rel.stick_x; + sOcarinaInputStickRel.y = input->rel.stick_y; } -f32 Audio_OcaAdjStick(s8 inp) { - s8 inpAdj; - f32 ret; +/** + * 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; - if (inp > 0x40) { - inpAdj = 127; - } else if (inp < -0x40) { - inpAdj = -128; - } else if (inp >= 0) { - inpAdj = (inp * 127) / 64; + if (bendIndex > 64) { + adjBendIndex = 127; + } else if (bendIndex < -64) { + adjBendIndex = -128; + } else if (bendIndex >= 0) { + adjBendIndex = (bendIndex * 127) / 64; } else { - inpAdj = (inp * 128) / 64; - } - ret = gBendPitchTwoSemitonesFrequencies[inpAdj + 128]; - return ret; -} - -u8 Audio_OcaGetPlayingState(void) { - u8 ret; - - if (D_80131878 != 0) { - ret = D_80131878 - 1; - D_80131878 = 0; - } else if (D_80130F3C != 0) { - ret = 0xFE; - } else { - ret = 0xFF; + adjBendIndex = (bendIndex * 128) / 64; } - return ret; + /** + * 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; } -u8 Audio_OcaMapNoteValue(u8 arg0) { - u8 temp_v1; +/** + * 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; - temp_v1 = sNoteValueIndexMap[arg0 & 0x3F]; - if (temp_v1 == 5) { - if (arg0 & 0x80) { - return 2; + if (sPlayedOcarinaSongIndexPlusOne != 0) { + playedOcarinaSongIndex = sPlayedOcarinaSongIndexPlusOne - 1; + sPlayedOcarinaSongIndexPlusOne = 0; + } else if (sOcarinaFlags != 0) { + playedOcarinaSongIndex = 0xFE; + } else { + playedOcarinaSongIndex = 0xFF; + } + + return playedOcarinaSongIndex; +} + +u8 AudioOcarina_MapNoteToButton(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 pitches 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 & 0x80) { + return OCARINA_BTN_C_RIGHT; } - return 3; + return OCARINA_BTN_C_LEFT; } - return temp_v1; + + return buttonIndex; } -void func_800ECB7C(u8 songIdx) { - u8 savedSongIdx; - u8 scarecrowSongIdx; - u8 noteIdx; +void AudioOcarina_MapNotesToScarecrowButtons(u8 noteSongIndex) { + u8 buttonSongPos = 0; + u8 noteSongPos = 0; + u8 pitch; - savedSongIdx = 0; - scarecrowSongIdx = 0; - while (savedSongIdx < 8 && scarecrowSongIdx < 0x10) { - noteIdx = sOcarinaSongs[songIdx][scarecrowSongIdx++].noteIdx; - if (noteIdx != 0xFF) { - gOcarinaSongNotes[OCARINA_SONG_SCARECROW].notesIdx[savedSongIdx++] = sNoteValueIndexMap[noteIdx]; + while (buttonSongPos < 8 && noteSongPos < 16) { + pitch = sOcarinaSongNotes[noteSongIndex][noteSongPos++].pitch; + + if (pitch != OCARINA_PITCH_NONE) { + gOcarinaSongButtons[OCARINA_SONG_SCARECROW_SPAWN].buttonsIndex[buttonSongPos++] = sPitchToButtonMap[pitch]; } } } -// start ocarina. -void func_800ECC04(u16 flg) { +/** + * 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) + */ +void AudioOcarina_Start(u16 ocarinaFlags) { u8 i; - if ((sOcarinaSongs[OCARINA_SONG_SCARECROW][1].volume != 0xFF) && ((flg & 0xFFF) == 0xFFF)) { - flg |= 0x1000; + if ((sOcarinaSongNotes[OCARINA_SONG_SCARECROW_SPAWN][1].volume != 0xFF) && ((ocarinaFlags & 0xFFF) == 0xFFF)) { + ocarinaFlags |= 0x1000; } - if ((flg == 0xCFFF) && (sOcarinaSongs[OCARINA_SONG_SCARECROW][1].volume != 0xFF)) { - flg = 0xDFFF; + if ((ocarinaFlags == 0xCFFF) && (sOcarinaSongNotes[OCARINA_SONG_SCARECROW_SPAWN][1].volume != 0xFF)) { + ocarinaFlags = 0xDFFF; } - if ((flg == 0xFFF) && (sOcarinaSongs[OCARINA_SONG_SCARECROW][1].volume != 0xFF)) { - flg = 0x1FFF; + if ((ocarinaFlags == 0xFFF) && (sOcarinaSongNotes[OCARINA_SONG_SCARECROW_SPAWN][1].volume != 0xFF)) { + ocarinaFlags = 0x1FFF; } - if (flg != 0xFFFF) { - D_80130F3C = 0x80000000 + (u32)flg; - sOcarinaSongNoteStartIdx = 0; - sOcarinaSongCnt = 0xE; - if (flg != 0xA000) { - sOcarinaSongCnt--; + if (ocarinaFlags != 0xFFFF) { + sOcarinaFlags = 0x80000000 + (u32)ocarinaFlags; + sFirstOcarinaSongIndex = 0; + sLastOcarinaSongIndex = OCARINA_SONG_MAX; + if (ocarinaFlags != 0xA000) { + sLastOcarinaSongIndex--; } - sOcarinaAvailSongs = flg & 0x3FFF; - D_8013187C = 8; - sOcarinaHasStartedSong = 0; - D_80131878 = 0; - sStaffPlayingPos = 0; - sPlayingStaff.state = Audio_OcaGetPlayingState(); - sOcarinaInpEnabled = 1; - D_80130F4C = 0; - for (i = 0; i < 0xE; i++) { - sLearnSongPos[i] = 0; - D_8016BA50[i] = 0; - D_8016BA70[i] = 0; - sLearnSongExpectedNote[i] = 0; + sAvailOcarinaSongFlags = ocarinaFlags & 0x3FFF; + sMusicStaffNumNotesPerTest = 8; // Ocarina Check + sOcarinaHasStartedSong = false; + sPlayedOcarinaSongIndexPlusOne = 0; + sStaffOcarinaPlayingPos = 0; + sPlayingStaff.state = AudioOcarina_GetPlayingState(); + sIsOcarinaInputEnabled = true; + sPrevOcarinaWithMusicStaffFlags = 0; + + // Reset music staff song check + for (i = 0; i < OCARINA_SONG_MAX; i++) { + sMusicStaffPos[i] = 0; + sMusicStaffCurHeldLength[i] = 0; + sMusicStaffExpectedLength[i] = 0; + sMusicStaffExpectedPitch[i] = 0; } - if (flg & 0x8000) { - D_8013187C = 0; + if (ocarinaFlags & 0x8000) { + sMusicStaffNumNotesPerTest = 0; // Ocarina Playback } - if (flg & 0x4000) { - sOcarinaSongAppendPos = 0; + if (ocarinaFlags & 0x4000) { + sOcarinaWithoutMusicStaffPos = 0; } - if (flg & 0xD000) { - func_800ECB7C(OCARINA_SONG_SCARECROW); + if (ocarinaFlags & 0xD000) { + AudioOcarina_MapNotesToScarecrowButtons(OCARINA_SONG_SCARECROW_SPAWN); } } else { - D_80130F3C = 0; - sOcarinaInpEnabled = 0; + sOcarinaFlags = 0; + sIsOcarinaInputEnabled = false; } } -void func_800ECDBC(void) { - if (sCurOcarinaBtnVal != 0xFF && sOcarinaHasStartedSong == 0) { - sOcarinaHasStartedSong = 1; - sLearnSongLastBtn = 0xFF; +void AudioOcarina_CheckIfStartedSong(void) { + if (sCurOcarinaPitch != OCARINA_PITCH_NONE && !sOcarinaHasStartedSong) { + sOcarinaHasStartedSong = true; + sMusicStaffPrevPitch = OCARINA_PITCH_NONE; } } -void func_800ECDF8(void) { - u16 sh; +/** + * 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) { + u16 curOcarinaSongFlag; u16 pad; - u8 inputChanged = 0; + u8 noNewValidInput = false; u16 pad2; - s8 sp57 = 0; - u8 i; - OcarinaNote* prevNote; - OcarinaNote* note; + s8 staffOcarinaPlayingPosOffset = 0; + u8 songIndex; + OcarinaNote* curNote; + OcarinaNote* nextNote; - func_800ECDBC(); + AudioOcarina_CheckIfStartedSong(); - if (sOcarinaHasStartedSong) { - if ((D_80130F2C < 0 ? -D_80130F2C : D_80130F2C) >= 0x15) { - D_80130F3C = 0; + if (!sOcarinaHasStartedSong) { + return; + } + + if (ABS_ALT(sCurOcarinaBendIndex) > 20) { + sOcarinaFlags = 0; + return; + } + + // clang-format off + if (sPrevOcarinaPitch == sCurOcarinaPitch || sCurOcarinaPitch == OCARINA_PITCH_NONE) { noNewValidInput = true; } + // clang-format on + + for (songIndex = sFirstOcarinaSongIndex; songIndex < sLastOcarinaSongIndex; songIndex++) { + curOcarinaSongFlag = 1 << songIndex; + + if (sAvailOcarinaSongFlags & curOcarinaSongFlag) { + sMusicStaffCurHeldLength[songIndex] = sMusicStaffExpectedLength[songIndex] + 18; + + if (noNewValidInput) { + if ((sMusicStaffCurHeldLength[songIndex] >= sMusicStaffExpectedLength[songIndex] - 18) && + (sMusicStaffCurHeldLength[songIndex] >= sMusicStaffExpectedLength[songIndex] + 18) && + (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; + } + } else if (sMusicStaffCurHeldLength[songIndex] >= (sMusicStaffExpectedLength[songIndex] - 18)) { + // 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 (songIndex == OCARINA_SONG_SCARECROW_SPAWN) { + sMusicStaffCurHeldLength[songIndex] = 0; + } + } else { + // Note is not part of expected song, so this song is no longer available as an option in this + // playback + sAvailOcarinaSongFlags ^= curOcarinaSongFlag; + } + } + + curNote = &sOcarinaSongNotes[songIndex][sMusicStaffPos[songIndex]]; + nextNote = &sOcarinaSongNotes[songIndex][++sMusicStaffPos[songIndex]]; + sMusicStaffExpectedLength[songIndex] = curNote->length; + sMusicStaffExpectedPitch[songIndex] = curNote->pitch; + + // The current note is not the expected note. + if (sCurOcarinaPitch != sMusicStaffExpectedPitch[songIndex]) { + sAvailOcarinaSongFlags ^= curOcarinaSongFlag; + } + + while (curNote->pitch == nextNote->pitch || + (nextNote->pitch == OCARINA_BTN_INVALID && nextNote->length != 0)) { + sMusicStaffExpectedLength[songIndex] += nextNote->length; + curNote = &sOcarinaSongNotes[songIndex][sMusicStaffPos[songIndex]]; + nextNote = &sOcarinaSongNotes[songIndex][sMusicStaffPos[songIndex] + 1]; + sMusicStaffPos[songIndex]++; + } + } else if (sMusicStaffCurHeldLength[songIndex] < 10) { + // case never taken + staffOcarinaPlayingPosOffset = -1; + sMusicStaffCurHeldLength[songIndex] = 0; + sMusicStaffPrevPitch = sCurOcarinaPitch; + } else { + // case never taken + sAvailOcarinaSongFlags ^= 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 (sAvailOcarinaSongFlags == 0 && sStaffOcarinaPlayingPos >= sMusicStaffNumNotesPerTest) { + sIsOcarinaInputEnabled = false; + if ((sOcarinaFlags & 0x4000) && sCurOcarinaPitch == sOcarinaSongNotes[songIndex][0].pitch) { + // case never taken, this function is not called if (sOcarinaFlags & 0x4000) is set + sPrevOcarinaWithMusicStaffFlags = sOcarinaFlags; + } + sOcarinaFlags = 0; return; } + } - // clang-format off - if (sPrevOcarinaNoteVal == sCurOcarinaBtnVal || sCurOcarinaBtnVal == 0xFF) { inputChanged = 1; } - // clang-format on - - for (i = sOcarinaSongNoteStartIdx; i < sOcarinaSongCnt; i++) { - sh = 1 << i; - if (sOcarinaAvailSongs & sh) { - D_8016BA50[i] = D_8016BA70[i] + 0x12; - if (inputChanged) { - // (pointless if check, this is always true) - if ((D_8016BA50[i] >= D_8016BA70[i] - 0x12) && (D_8016BA50[i] >= D_8016BA70[i] + 0x12) && - (sOcarinaSongs[i][sLearnSongPos[i]].unk_02 == 0) && - (sLearnSongLastBtn == sLearnSongExpectedNote[i])) { - D_80131878 = i + 1; - sOcarinaInpEnabled = 0; - D_80130F3C = 0; - } - } else if (D_8016BA50[i] >= (D_8016BA70[i] - 0x12)) { - if (sLearnSongLastBtn != 0xFF) { - if (sLearnSongLastBtn == sLearnSongExpectedNote[i]) { - if (i == 12) { - D_8016BA50[i] = 0; - } - } else { - sOcarinaAvailSongs ^= sh; - } - } - - prevNote = &sOcarinaSongs[i][sLearnSongPos[i]]; - note = &sOcarinaSongs[i][++sLearnSongPos[i]]; - D_8016BA70[i] = prevNote->unk_02; - sLearnSongExpectedNote[i] = prevNote->noteIdx; - - if (sCurOcarinaBtnVal != sLearnSongExpectedNote[i]) { - sOcarinaAvailSongs ^= sh; - } - while (prevNote->noteIdx == note->noteIdx || - (note->noteIdx == OCARINA_NOTE_INVALID && note->unk_02 != 0)) { - D_8016BA70[i] += note->unk_02; - prevNote = &sOcarinaSongs[i][sLearnSongPos[i]]; - note = &sOcarinaSongs[i][sLearnSongPos[i] + 1]; - sLearnSongPos[i]++; - } - } else if (D_8016BA50[i] < 0xA) { - sp57 = -1; - D_8016BA50[i] = 0; - sLearnSongLastBtn = sCurOcarinaBtnVal; - } else { - sOcarinaAvailSongs ^= sh; - } - } - - if (sOcarinaAvailSongs == 0 && sStaffPlayingPos >= D_8013187C) { - sOcarinaInpEnabled = 0; - if (CHECK_BTN_ANY(D_80130F3C, BTN_B) && sCurOcarinaBtnVal == sOcarinaSongs[i][0].noteIdx) { - D_80130F4C = D_80130F3C; - } - D_80130F3C = 0; - return; - } - } - - if (!inputChanged) { - sLearnSongLastBtn = sCurOcarinaBtnVal; - sStaffPlayingPos += sp57 + 1; - } + if (!noNewValidInput) { + sMusicStaffPrevPitch = sCurOcarinaPitch; + sStaffOcarinaPlayingPos += staffOcarinaPlayingPosOffset + 1; } } -void func_800ED200(void) { - u32 temp_v0; +/** + * 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 i; u8 j; u8 k; - if (CHECK_BTN_ANY(sCurOcarinaBtnPress, BTN_L) && CHECK_BTN_ANY(sCurOcarinaBtnPress, sOcarinaAllowedBtnMask)) { - func_800ECC04((u16)D_80130F3C); + if (CHECK_BTN_ANY(sOcarinaInputButtonCur, BTN_L) && + CHECK_BTN_ANY(sOcarinaInputButtonCur, sOcarinaAllowedButtonMask)) { + AudioOcarina_Start((u16)sOcarinaFlags); return; } - func_800ECDBC(); + AudioOcarina_CheckIfStartedSong(); - if (sOcarinaHasStartedSong) { - if ((sPrevOcarinaNoteVal != sCurOcarinaBtnVal) && (sCurOcarinaBtnVal != 0xFF)) { - sStaffPlayingPos++; - if (sStaffPlayingPos >= 9) { - sStaffPlayingPos = 1; + if (!sOcarinaHasStartedSong) { + return; + } + + if ((sPrevOcarinaPitch != sCurOcarinaPitch) && (sCurOcarinaPitch != OCARINA_PITCH_NONE)) { + sStaffOcarinaPlayingPos++; + if (sStaffOcarinaPlayingPos > ARRAY_COUNT(sCurOcarinaSongWithoutMusicStaff)) { + sStaffOcarinaPlayingPos = 1; + } + + if (sOcarinaWithoutMusicStaffPos == 8) { + for (i = 0; i < 7; i++) { + sCurOcarinaSongWithoutMusicStaff[i] = sCurOcarinaSongWithoutMusicStaff[i + 1]; } + } else { + sOcarinaWithoutMusicStaffPos++; + } - if (sOcarinaSongAppendPos == 8) { - for (i = 0; i < 7; i++) { - sCurOcarinaSong[i] = sCurOcarinaSong[i + 1]; + if (ABS_ALT(sCurOcarinaBendIndex) > 20) { + 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 (i = sFirstOcarinaSongIndex; i < sLastOcarinaSongIndex; i++) { + // Checks to see if the song is available to be played + if (sAvailOcarinaSongFlags & (u16)(1 << i)) { + for (j = 0, k = 0; j < gOcarinaSongButtons[i].numButtons && k == 0 && + sOcarinaWithoutMusicStaffPos >= gOcarinaSongButtons[i].numButtons;) { + pitch = sCurOcarinaSongWithoutMusicStaff[sOcarinaWithoutMusicStaffPos - + gOcarinaSongButtons[i].numButtons + j]; + if (pitch == sButtonToPitchMap[gOcarinaSongButtons[i].buttonsIndex[j]]) { + j++; + } else { + k++; + } } - } else { - sOcarinaSongAppendPos++; - } - if ((D_80130F2C < 0 ? -D_80130F2C : D_80130F2C) >= 0x15) { - sCurOcarinaSong[sOcarinaSongAppendPos - 1] = 0xFF; - } else { - sCurOcarinaSong[sOcarinaSongAppendPos - 1] = sCurOcarinaBtnVal; - } - - for (i = sOcarinaSongNoteStartIdx; i < sOcarinaSongCnt; i++) { - if (sOcarinaAvailSongs & (u16)(1 << i)) { - for (j = 0, k = 0; - j < gOcarinaSongNotes[i].len && k == 0 && sOcarinaSongAppendPos >= gOcarinaSongNotes[i].len;) { - temp_v0 = sCurOcarinaSong[(sOcarinaSongAppendPos - gOcarinaSongNotes[i].len) + j]; - if (temp_v0 == sOcarinaNoteValues[gOcarinaSongNotes[i].notesIdx[j]]) { - j++; - } else { - k++; - } - } - - if (j == gOcarinaSongNotes[i].len) { - D_80131878 = i + 1; - sOcarinaInpEnabled = 0; - D_80130F3C = 0; - } + // This conditional is true if songIndex = i is detected + if (j == gOcarinaSongButtons[i].numButtons) { + sPlayedOcarinaSongIndexPlusOne = i + 1; + sIsOcarinaInputEnabled = false; + sOcarinaFlags = 0; } } } } } -void func_800ED458(s32 arg0) { - u32 phi_v1_2; +// This unused argument is used in Majora's Mask as a u8 +void AudioOcarina_PlayControllerInput(u8 unused) { + u32 ocarinaBtnsHeld; - if (D_80130F3C != 0 && D_80131880 != 0) { - D_80131880--; + // Prevents two different ocarina notes from being played on two consecutive frames + if ((sOcarinaFlags != 0) && (sOcarinaDropInputTimer != 0)) { + sOcarinaDropInputTimer--; return; } - if ((D_8016BA10 == 0) || - ((D_8016BA10 & sOcarinaAllowedBtnMask) != (sCurOcarinaBtnPress & sOcarinaAllowedBtnMask))) { - D_8016BA10 = 0; + // Ensures the button pressed to start the ocarina does not also play an ocarina note + if ((sOcarinaInputButtonStart == 0) || ((sOcarinaInputButtonStart & sOcarinaAllowedButtonMask) != + (sOcarinaInputButtonCur & sOcarinaAllowedButtonMask))) { + sOcarinaInputButtonStart = 0; if (1) {} - sCurOcarinaBtnVal = 0xFF; - sCurOcarinaBtnIdx = 0xFF; - phi_v1_2 = (sCurOcarinaBtnPress & sOcarinaAllowedBtnMask) & (sPrevOcarinaBtnPress & sOcarinaAllowedBtnMask); - if (!(D_8016BA18 & phi_v1_2) && (sCurOcarinaBtnPress != 0)) { - D_8016BA18 = sCurOcarinaBtnPress; + sCurOcarinaPitch = OCARINA_PITCH_NONE; + sCurOcarinaButtonIndex = OCARINA_BTN_INVALID; + ocarinaBtnsHeld = (sOcarinaInputButtonCur & sOcarinaAllowedButtonMask) & + (sOcarinaInputButtonPrev & sOcarinaAllowedButtonMask); + if (!(sOcarinaInputButtonPress & ocarinaBtnsHeld) && (sOcarinaInputButtonCur != 0)) { + sOcarinaInputButtonPress = sOcarinaInputButtonCur; } else { - D_8016BA18 &= phi_v1_2; + sOcarinaInputButtonPress &= ocarinaBtnsHeld; } - if (D_8016BA18 & sOcarinaABtnMap) { - osSyncPrintf("Presss NA_KEY_D4 %08x\n", sOcarinaABtnMap); - sCurOcarinaBtnVal = 2; - sCurOcarinaBtnIdx = 0; - } else if (D_8016BA18 & sOcarinaCDownBtnMap) { - osSyncPrintf("Presss NA_KEY_F4 %08x\n", sOcarinaCDownBtnMap); - sCurOcarinaBtnVal = 5; - sCurOcarinaBtnIdx = 1; - } else if (D_8016BA18 & 1) { - osSyncPrintf("Presss NA_KEY_A4 %08x\n", 1); - sCurOcarinaBtnVal = 9; - sCurOcarinaBtnIdx = 2; - } else if (D_8016BA18 & 2) { - osSyncPrintf("Presss NA_KEY_B4 %08x\n", 2); - sCurOcarinaBtnVal = 0xB; - sCurOcarinaBtnIdx = 3; - } else if (D_8016BA18 & sOcarinaCUPBtnMap) { - osSyncPrintf("Presss NA_KEY_D5 %08x\n", sOcarinaCUPBtnMap); - sCurOcarinaBtnVal = 0xE; - sCurOcarinaBtnIdx = 4; + // Interprets and transforms controller input into ocarina buttons and notes + if (CHECK_BTN_ANY(sOcarinaInputButtonPress, sOcarinaAButtonMap)) { + osSyncPrintf("Presss NA_KEY_D4 %08x\n", sOcarinaAButtonMap); + sCurOcarinaPitch = OCARINA_PITCH_D4; + sCurOcarinaButtonIndex = OCARINA_BTN_A; + + } else if (CHECK_BTN_ANY(sOcarinaInputButtonPress, sOcarinaCDownButtonMap)) { + osSyncPrintf("Presss NA_KEY_F4 %08x\n", sOcarinaCDownButtonMap); + sCurOcarinaPitch = OCARINA_PITCH_F4; + sCurOcarinaButtonIndex = OCARINA_BTN_C_DOWN; + + } else if (CHECK_BTN_ANY(sOcarinaInputButtonPress, BTN_CRIGHT)) { + osSyncPrintf("Presss NA_KEY_A4 %08x\n", BTN_CRIGHT); + sCurOcarinaPitch = OCARINA_PITCH_A4; + sCurOcarinaButtonIndex = OCARINA_BTN_C_RIGHT; + + } else if (CHECK_BTN_ANY(sOcarinaInputButtonPress, BTN_CLEFT)) { + osSyncPrintf("Presss NA_KEY_B4 %08x\n", BTN_CLEFT); + sCurOcarinaPitch = OCARINA_PITCH_B4; + sCurOcarinaButtonIndex = OCARINA_BTN_C_LEFT; + + } else if (CHECK_BTN_ANY(sOcarinaInputButtonPress, sOcarinaCUpButtonMap)) { + osSyncPrintf("Presss NA_KEY_D5 %08x\n", sOcarinaCUpButtonMap); + sCurOcarinaPitch = OCARINA_PITCH_D5; + sCurOcarinaButtonIndex = OCARINA_BTN_C_UP; } - if (sCurOcarinaBtnVal != 0xFF && sCurOcarinaBtnPress & 0x10 && sRecordingState != 2) { - sCurOcarinaBtnIdx += 0x80; - sCurOcarinaBtnVal++; + // 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 += 0x80; // Flag to resolve B Flat 4 + sCurOcarinaPitch++; // Raise the pitch by 1 semitone } - if ((sCurOcarinaBtnVal != 0xFF) && (sCurOcarinaBtnPress & 0x2000) && (sRecordingState != 2)) { - sCurOcarinaBtnIdx += 0x40; - sCurOcarinaBtnVal--; + // 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 += 0x40; // Flag to resolve B Flat 4 + sCurOcarinaPitch--; // Lower the pitch by 1 semitone } - if (sRecordingState != 2) { - D_80130F2C = sCurOcaStick.y; - D_80130F24 = Audio_OcaAdjStick(D_80130F2C); + if (sRecordingState != OCARINA_RECORD_SCARECROW_SPAWN) { + // Bend the pitch of the note based on y control stick + sCurOcarinaBendIndex = sOcarinaInputStickRel.y; + sCurOcarinaBendFreq = AudioOcarina_BendPitchTwoSemitones(sCurOcarinaBendIndex); - D_80130F34 = (sCurOcaStick.x < 0 ? -sCurOcaStick.x : sCurOcaStick.x) >> 2; - Audio_QueueCmdS8(0x6 << 24 | SEQ_PLAYER_SFX << 16 | 0xD06, D_80130F34); + // 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 { - D_80130F2C = 0; - D_80130F24 = 1.0f; + // no bending or vibrato for recording state OCARINA_RECORD_SCARECROW_SPAWN + sCurOcarinaBendIndex = 0; + sCurOcarinaBendFreq = 1.0f; // No bend } - if ((sCurOcarinaBtnVal != 0xFF) && (sPrevOcarinaNoteVal != sCurOcarinaBtnVal)) { - Audio_QueueCmdS8(0x6 << 24 | SEQ_PLAYER_SFX << 16 | 0xD07, D_80130F10 - 1); - Audio_QueueCmdS8(0x6 << 24 | SEQ_PLAYER_SFX << 16 | 0xD05, sCurOcarinaBtnVal); - Audio_PlaySoundGeneral(NA_SE_OC_OCARINA, &gSfxDefaultPos, 4, &D_80130F24, &D_80130F28, &gSfxDefaultReverb); - } else if ((sPrevOcarinaNoteVal != 0xFF) && (sCurOcarinaBtnVal == 0xFF)) { + // Processes new and valid notes + if ((sCurOcarinaPitch != OCARINA_PITCH_NONE) && (sPrevOcarinaPitch != sCurOcarinaPitch)) { + // Sets ocarina instrument Id to channelIdx 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_PlaySoundGeneral(NA_SE_OC_OCARINA, &gSfxDefaultPos, 4, &sCurOcarinaBendFreq, &sRelativeOcarinaVolume, + &gSfxDefaultReverb); + } else if ((sPrevOcarinaPitch != OCARINA_PITCH_NONE) && (sCurOcarinaPitch == OCARINA_PITCH_NONE)) { + // Stops ocarina sound when transitioning from playing to not playing a note Audio_StopSfxById(NA_SE_OC_OCARINA); } } } -void func_800ED848(u8 inputEnabled) { - sOcarinaInpEnabled = inputEnabled; +/** + * 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; } -void Audio_OcaSetInstrument(u8 arg0) { - if (D_80130F10 == arg0) { +/** + * Resets ocarina properties based on the ocarina instrument id + * If ocarina instrument id is "OCARINA_INSTRUMENT_OFF", turn off the ocarina + * For all ocarina instrument ids, turn the ocarina on with the instrument id + */ +void AudioOcarina_SetInstrument(u8 ocarinaInstrumentId) { + if (sOcarinaInstrumentId == ocarinaInstrumentId) { return; } - Audio_SeqCmd8(SEQ_PLAYER_SFX, 1, SFX_PLAYER_CHANNEL_OCARINA, arg0); - D_80130F10 = arg0; - if (arg0 == 0) { - sCurOcarinaBtnPress = 0; - sPrevOcarinaBtnPress = 0; - D_8016BA18 = 0; - D_8016BA10 = 0xFFFF; - func_800ED458(0); + Audio_SeqCmd8(SEQ_PLAYER_SFX, 1, SFX_CHANNEL_OCARINA, ocarinaInstrumentId); + sOcarinaInstrumentId = ocarinaInstrumentId; + if (ocarinaInstrumentId == OCARINA_INSTRUMENT_OFF) { + sOcarinaInputButtonCur = 0; + sOcarinaInputButtonPrev = 0; + sOcarinaInputButtonPress = 0; + + sOcarinaInputButtonStart = 0xFFFF; + + AudioOcarina_PlayControllerInput(false); Audio_StopSfxById(NA_SE_OC_OCARINA); Audio_SetSoundBanksMute(0); sPlaybackState = 0; - sStaffPlaybackPos = 0; - sOcarinaInpEnabled = 0; - D_80130F3C = 0; - Audio_ClearBGMMute(SFX_PLAYER_CHANNEL_OCARINA); + sPlaybackStaffPos = 0; + sIsOcarinaInputEnabled = false; + sOcarinaFlags = 0; + // return to full volume for players 0 and 3 (background bgm) after ocarina is finished + Audio_ClearBGMMute(SFX_CHANNEL_OCARINA); } else { - sCurOcarinaBtnPress = 0; - Audio_GetOcaInput(); - D_8016BA10 = sCurOcarinaBtnPress; - Audio_QueueSeqCmdMute(SFX_PLAYER_CHANNEL_OCARINA); + sOcarinaInputButtonCur = 0; + AudioOcarina_ReadControllerInput(); + // Store button used to turn on ocarina + sOcarinaInputButtonStart = sOcarinaInputButtonCur; + // lowers volumes of players 0 and 3 (background bgm) while playing ocarina + Audio_QueueSeqCmdMute(SFX_CHANNEL_OCARINA); } } -void Audio_OcaSetSongPlayback(s8 songIdxPlusOne, s8 playbackState) { - if (songIdxPlusOne == 0) { +void AudioOcarina_SetPlaybackSong(s8 songIndexPlusOne, s8 playbackState) { + if (songIndexPlusOne == 0) { sPlaybackState = 0; Audio_StopSfxById(NA_SE_OC_OCARINA); return; } - if (songIdxPlusOne < 0xF) { - sPlaybackSong = sOcarinaSongs[songIdxPlusOne - 1]; + if (songIndexPlusOne < (OCARINA_SONG_SCARECROW_LONG + 1)) { + sPlaybackSong = sOcarinaSongNotes[songIndexPlusOne - 1]; } else { - sPlaybackSong = sPierresSong; + sPlaybackSong = sScarecrowsLongSongNotes; } sPlaybackState = playbackState; - sNotePlaybackTimer = 0; - sDisplayedNoteValue = 0xFF; + sPlaybackNoteTimer = 0; + sPlaybackPitch = OCARINA_PITCH_NONE; sPlaybackNotePos = 0; - sStaffPlaybackPos = 0; - while (sPlaybackSong[sPlaybackNotePos].noteIdx == OCARINA_NOTE_INVALID) { + sPlaybackStaffPos = 0; + + while (sPlaybackSong[sPlaybackNotePos].pitch == OCARINA_PITCH_NONE) { sPlaybackNotePos++; } } -void Audio_OcaPlayback(void) { +/** + * Play a song with the ocarina to the user that is + * based on OcarinaNote data and not user input + */ +void AudioOcarina_PlaybackSong(void) { u32 noteTimerStep; u32 nextNoteTimerStep; - if (sPlaybackState != 0) { - if (sStaffPlaybackPos == 0) { - noteTimerStep = 3; - } else { - noteTimerStep = D_8016BA04 - D_80130F68; + 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) { + + sPlaybackNoteTimer = sPlaybackSong[sPlaybackNotePos].length; + + if (sPlaybackNotePos == 1) { + sPlaybackNoteTimer++; } - if (noteTimerStep < sNotePlaybackTimer) { - sNotePlaybackTimer -= noteTimerStep; - } else { - nextNoteTimerStep = noteTimerStep - sNotePlaybackTimer; - sNotePlaybackTimer = 0; - } - - if (sNotePlaybackTimer == 0) { - - sNotePlaybackTimer = sPlaybackSong[sPlaybackNotePos].unk_02; - - if (sPlaybackNotePos == 1) { - sNotePlaybackTimer++; - } - - if (sNotePlaybackTimer == 0) { - sPlaybackState--; - if (sPlaybackState != 0) { - sPlaybackNotePos = 0; - sStaffPlaybackPos = 0; - sDisplayedNoteValue = 0xFF; - } else { - Audio_StopSfxById(NA_SE_OC_OCARINA); - } - return; + if (sPlaybackNoteTimer == 0) { + sPlaybackState--; + if (sPlaybackState != 0) { + sPlaybackNotePos = 0; + sPlaybackStaffPos = 0; + sPlaybackPitch = OCARINA_PITCH_NONE; } else { - sNotePlaybackTimer -= nextNoteTimerStep; + Audio_StopSfxById(NA_SE_OC_OCARINA); } - - if (sNotePlaybackVolume != sPlaybackSong[sPlaybackNotePos].volume) { - sNotePlaybackVolume = sPlaybackSong[sPlaybackNotePos].volume; - sNormalizedNotePlaybackVolume = sNotePlaybackVolume / 127.0f; - } - - if (sNotePlaybackVibrato != sPlaybackSong[sPlaybackNotePos].vibrato) { - sNotePlaybackVibrato = sPlaybackSong[sPlaybackNotePos].vibrato; - Audio_QueueCmdS8(0x6 << 24 | SEQ_PLAYER_SFX << 16 | 0xD06, sNotePlaybackVibrato); - } - - if (sNotePlaybackTone != sPlaybackSong[sPlaybackNotePos].tone) { - sNotePlaybackTone = sPlaybackSong[sPlaybackNotePos].tone; - sNormalizedNotePlaybackTone = Audio_OcaAdjStick(sNotePlaybackTone); - } - - if ((sPlaybackSong[sPlaybackNotePos].volume == sPlaybackSong[sPlaybackNotePos - 1].volume && - (sPlaybackSong[sPlaybackNotePos].vibrato == sPlaybackSong[sPlaybackNotePos - 1].vibrato) && - (sPlaybackSong[sPlaybackNotePos].tone == sPlaybackSong[sPlaybackNotePos - 1].tone))) { - sDisplayedNoteValue = 0xFE; - } - - if (sDisplayedNoteValue != sPlaybackSong[sPlaybackNotePos].noteIdx) { - u8 tmp = sPlaybackSong[sPlaybackNotePos].noteIdx; - - if (tmp == 0xA) { - sDisplayedNoteValue = tmp + sPlaybackSong[sPlaybackNotePos].semitone; - } else { - sDisplayedNoteValue = tmp; - } - - if (sDisplayedNoteValue != 0xFF) { - sStaffPlaybackPos++; - Audio_QueueCmdS8(0x6 << 24 | SEQ_PLAYER_SFX << 16 | 0xD07, D_80130F10 - 1); - Audio_QueueCmdS8(0x6 << 24 | SEQ_PLAYER_SFX << 16 | 0xD05, sDisplayedNoteValue & 0x3F); - Audio_PlaySoundGeneral(NA_SE_OC_OCARINA, &gSfxDefaultPos, 4, &sNormalizedNotePlaybackTone, - &sNormalizedNotePlaybackVolume, &gSfxDefaultReverb); - } else { - Audio_StopSfxById(NA_SE_OC_OCARINA); - } - } - sPlaybackNotePos++; + return; + } else { + sPlaybackNoteTimer -= nextNoteTimerStep; } + + // Update volume + if (sNotePlaybackVolume != sPlaybackSong[sPlaybackNotePos].volume) { + sNotePlaybackVolume = sPlaybackSong[sPlaybackNotePos].volume; + sRelativeNotePlaybackVolume = sNotePlaybackVolume / 127.0f; + } + + // Update vibrato + if (sNotePlaybackVibrato != sPlaybackSong[sPlaybackNotePos].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 channelIdx 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 sPlaybackPitch to channelIdx io port 5 + Audio_QueueCmdS8(0x6 << 24 | SEQ_PLAYER_SFX << 16 | SFX_CHANNEL_OCARINA << 8 | 5, + sPlaybackPitch & 0x3F); + Audio_PlaySoundGeneral(NA_SE_OC_OCARINA, &gSfxDefaultPos, 4, &sRelativeNotePlaybackBend, + &sRelativeNotePlaybackVolume, &gSfxDefaultReverb); + } else { + Audio_StopSfxById(NA_SE_OC_OCARINA); + } + } + sPlaybackNotePos++; } } -void func_800EDD68(u8 arg0) { +void AudioOcarina_SetRecordingSong(u8 isRecordingComplete) { u16 i; u16 i2; u16 pad; - u8 lastNote; + u8 pitch; OcarinaNote* note; u8 j; u8 k; s32 t; - OcarinaNote* song; + OcarinaNote* recordedSong; - if (sRecordingState == 1) { - song = gScarecrowCustomSongPtr; + if (sRecordingState == OCARINA_RECORD_SCARECROW_LONG) { + recordedSong = gScarecrowLongSongPtr; } else { - song = D_80131BEC; + /** + * OCARINA_RECORD_SCARECROW_SPAWN + * + * The notes for scarecrows spawn song are first recorded into the ocarina memory + * game 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 = sMemoryGameSongPtr; } - song[sRecordSongPos].noteIdx = D_80131864; - song[sRecordSongPos].unk_02 = D_8016BA04 - D_80131860; - song[sRecordSongPos].volume = D_80131868; - song[sRecordSongPos].vibrato = D_8013186C; - song[sRecordSongPos].tone = D_80131870; - song[sRecordSongPos].semitone = D_80131874 & 0xC0; - D_80131864 = sCurOcarinaBtnVal; - D_80131868 = D_80130F30; - D_8013186C = D_80130F34; - D_80131870 = D_80130F2C; - D_80131874 = sCurOcarinaBtnIdx; + + 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 & 0xC0; + + sRecordOcarinaPitch = sCurOcarinaPitch; + sRecordOcarinaVolume = sCurOcarinaVolume; + sRecordOcarinaVibrato = sCurOcarinaVibrato; + sRecordOcarinaBendIndex = sCurOcarinaBendIndex; + sRecordOcarinaButtonIndex = sCurOcarinaButtonIndex; + sRecordSongPos++; - if ((sRecordSongPos != 107) && (arg0 == 0)) { + if ((sRecordSongPos != (ARRAY_COUNT(sScarecrowsLongSongNotes) - 1)) && !isRecordingComplete) { + // Continue recording return; } + // Recording is complete + i = sRecordSongPos; - lastNote = 0xFF; - while (i != 0 && lastNote == 0xFF) { + pitch = OCARINA_PITCH_NONE; + while (i != 0 && pitch == OCARINA_PITCH_NONE) { i--; - lastNote = song[i].noteIdx; + pitch = recordedSong[i].pitch; } if (1) {} if (sRecordSongPos != (i + 1)) { sRecordSongPos = i + 2; - song[sRecordSongPos - 1].unk_02 = 0; + recordedSong[sRecordSongPos - 1].length = 0; } - song[sRecordSongPos].unk_02 = 0; + recordedSong[sRecordSongPos].length = 0; - if (sRecordingState == 2) { - if (sStaffPlayingPos >= 8) { + if (sRecordingState == OCARINA_RECORD_SCARECROW_SPAWN) { + if (sStaffOcarinaPlayingPos >= 8) { for (i = 0; i < sRecordSongPos; i++) { - song[i] = song[i + 1]; + recordedSong[i] = recordedSong[i + 1]; } - func_800ECB7C(OCARINA_SONG_MEMORY_GAME); + // Copies Notes from buffer into scarecrows spawn buttons to be tested for acceptance or rejection + AudioOcarina_MapNotesToScarecrowButtons(OCARINA_SONG_MEMORY_GAME); - for (i = 0; i < OCARINA_SONG_SCARECROW; i++) { - for (j = 0; j < 9 - gOcarinaSongNotes[i].len; j++) { - for (k = 0; - k < gOcarinaSongNotes[i].len && k + j < 8 && - gOcarinaSongNotes[i].notesIdx[k] == gOcarinaSongNotes[OCARINA_SONG_SCARECROW].notesIdx[k + j]; + // Loop through each of the songs + for (i = 0; i < OCARINA_SONG_SCARECROW_SPAWN; i++) { + // Loops through all possible starting indices + for (j = 0; j < 9 - gOcarinaSongButtons[i].numButtons; j++) { + // Loops through the notes of song i + for (k = 0; k < gOcarinaSongButtons[i].numButtons && k + j < 8 && + gOcarinaSongButtons[i].buttonsIndex[k] == + gOcarinaSongButtons[OCARINA_SONG_SCARECROW_SPAWN].buttonsIndex[k + j]; k++) { ; } - if (k == gOcarinaSongNotes[i].len) { - sRecordingState = 0xFF; - sOcarinaSongs[OCARINA_SONG_SCARECROW][1].volume = 0xFF; + // This conditional is true if the recorded song contains a reserved song + 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 (gOcarinaSongNotes[OCARINA_SONG_SCARECROW].notesIdx[0] != - gOcarinaSongNotes[OCARINA_SONG_SCARECROW].notesIdx[i]) { - i = 9; + if (gOcarinaSongButtons[OCARINA_SONG_SCARECROW_SPAWN].buttonsIndex[0] != + gOcarinaSongButtons[OCARINA_SONG_SCARECROW_SPAWN].buttonsIndex[i]) { + i = 9; // break } else { i++; } } + // This condition is true if all 8 notes are the same pitch if (i == 8) { - sRecordingState = 0xFF; - sOcarinaSongs[OCARINA_SONG_SCARECROW][1].volume = 0xFF; + 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++) { - sOcarinaSongs[OCARINA_SONG_SCARECROW][i] = sOcarinaSongs[OCARINA_SONG_MEMORY_GAME][i]; + sOcarinaSongNotes[OCARINA_SONG_SCARECROW_SPAWN][i] = sOcarinaSongNotes[OCARINA_SONG_MEMORY_GAME][i]; } - sOcarinaInpEnabled = 0; + sIsOcarinaInputEnabled = false; } else { - sOcarinaSongs[OCARINA_SONG_SCARECROW][1].volume = 0xFF; + sOcarinaSongNotes[OCARINA_SONG_SCARECROW_SPAWN][1].volume = 0xFF; } } - sRecordingState = 0; + + sRecordingState = OCARINA_RECORD_OFF; } -// start custom song? /** - * recordingState = 1, start long scarecrows song - * recordingState = 0, end - * recordingState = 2, also scarecrows song + * recordingState = OCARINA_RECORD_OFF, end + * recordingState = OCARINA_RECORD_SCARECROW_LONG, start long scarecrows song + * recordingState = OCARINA_RECORD_SCARECROW_SPAWN, start spawn scarecrows song */ -void Audio_OcaSetRecordingState(u8 recordingState) { +void AudioOcarina_SetRecordingState(u8 recordingState) { if ((u32)recordingState == sRecordingState) { return; } - if (recordingState != 0) { - D_80131860 = D_8016BA04; - D_80131864 = 0xFF; - D_80131868 = 0x57; - D_8013186C = 0; - D_80131870 = 0; - D_80131874 = 0; + if (recordingState != OCARINA_RECORD_OFF) { + sOcarinaRecordTaskStart = sOcarinaUpdateTaskStart; + sRecordOcarinaPitch = OCARINA_PITCH_NONE; + sRecordOcarinaVolume = 0x57; + sRecordOcarinaVibrato = 0; + sRecordOcarinaBendIndex = 0; + sRecordOcarinaButtonIndex = 0; sRecordSongPos = 0; - sOcarinaInpEnabled = 1; - sStaffPlayingPos = 0; - D_8016BAA0 = sPierresSong[1]; + sIsOcarinaInputEnabled = true; + sStaffOcarinaPlayingPos = 0; + sScarecrowsLongSongSecondNote = sScarecrowsLongSongNotes[1]; } else { if (sRecordSongPos == 0) { - sPierresSong[1] = D_8016BAA0; + sScarecrowsLongSongNotes[1] = sScarecrowsLongSongSecondNote; } else { - if (sRecordingState == 2) { - sStaffPlayingPos = 1; + if (sRecordingState == OCARINA_RECORD_SCARECROW_SPAWN) { + sStaffOcarinaPlayingPos = 1; } - func_800EDD68(1); + AudioOcarina_SetRecordingSong(true); } - sOcarinaInpEnabled = 0; - sStaffPlayingPos = 0; + sIsOcarinaInputEnabled = false; + sStaffOcarinaPlayingPos = 0; } sRecordingState = recordingState; } -void Audio_OcaUpdateRecordingStaff(void) { +void AudioOcarina_UpdateRecordingStaff(void) { sRecordingStaff.state = sRecordingState; - sRecordingStaff.pos = sStaffPlayingPos; - if (sRecordingState == 0xFF) { - sRecordingState = 0; + sRecordingStaff.pos = sStaffOcarinaPlayingPos; + if (sRecordingState == OCARINA_RECORD_REJECTED) { + sRecordingState = OCARINA_RECORD_OFF; } } -void Audio_OcaUpdatePlayingStaff(void) { - sPlayingStaff.noteIdx = sCurOcarinaBtnIdx & 0x3F; - sPlayingStaff.state = Audio_OcaGetPlayingState(); - sPlayingStaff.pos = sStaffPlayingPos; +void AudioOcarina_UpdatePlayingStaff(void) { + sPlayingStaff.buttonIndex = sCurOcarinaButtonIndex & 0x3F; + sPlayingStaff.state = AudioOcarina_GetPlayingState(); + sPlayingStaff.pos = sStaffOcarinaPlayingPos; } -void Audio_OcaUpdateDisplayedStaff(void) { - if ((sDisplayedNoteValue & 0x3F) < 0x10) { - sDisplayedStaff.noteIdx = Audio_OcaMapNoteValue(sDisplayedNoteValue); +void AudioOcarina_UpdatePlaybackStaff(void) { + if ((sPlaybackPitch & 0x3F) <= OCARINA_PITCH_EFLAT5) { + sPlaybackStaff.buttonIndex = AudioOcarina_MapNoteToButton(sPlaybackPitch); } - sDisplayedStaff.state = sPlaybackState; + sPlaybackStaff.state = sPlaybackState; - if (sPlaybackSong != sPierresSong) { - sDisplayedStaff.pos = sStaffPlaybackPos; - } else if (sStaffPlaybackPos == 0) { - sDisplayedStaff.pos = 0; + if (sPlaybackSong != sScarecrowsLongSongNotes) { + sPlaybackStaff.pos = sPlaybackStaffPos; + } else if (sPlaybackStaffPos == 0) { + sPlaybackStaff.pos = 0; } else { - sDisplayedStaff.pos = ((sStaffPlaybackPos - 1) % 8) + 1; + sPlaybackStaff.pos = ((sPlaybackStaffPos - 1) % 8) + 1; } } -OcarinaStaff* Audio_OcaGetRecordingStaff(void) { +OcarinaStaff* AudioOcarina_GetRecordingStaff(void) { return &sRecordingStaff; } -OcarinaStaff* Audio_OcaGetPlayingStaff(void) { +OcarinaStaff* AudioOcarina_GetPlayingStaff(void) { if (sPlayingStaff.state < 0xFE) { - D_80130F3C = 0; + sOcarinaFlags = 0; } + return &sPlayingStaff; } -OcarinaStaff* Audio_OcaGetDisplayingStaff(void) { - return &sDisplayedStaff; +OcarinaStaff* AudioOcarina_GetPlaybackStaff(void) { + return &sPlaybackStaff; } -void func_800EE404(void) { +void AudioOcarina_RecordSong(void) { s32 noteChanged; - if ((sRecordingState != 0) && ((D_8016BA04 - D_80131860) >= 3)) { + if ((sRecordingState != OCARINA_RECORD_OFF) && ((sOcarinaUpdateTaskStart - sOcarinaRecordTaskStart) >= 3)) { noteChanged = false; - if (D_80131864 != sCurOcarinaBtnVal) { - if (sCurOcarinaBtnVal != 0xFF) { - sRecordingStaff.noteIdx = sCurOcarinaBtnIdx & 0x3F; - sStaffPlayingPos++; - } else if ((sRecordingState == 2) && (sStaffPlayingPos == 8)) { - func_800EDD68(1); + if (sRecordOcarinaPitch != sCurOcarinaPitch) { + if (sCurOcarinaPitch != OCARINA_PITCH_NONE) { + sRecordingStaff.buttonIndex = sCurOcarinaButtonIndex & 0x3F; + sStaffOcarinaPlayingPos++; + } else if ((sRecordingState == OCARINA_RECORD_SCARECROW_SPAWN) && (sStaffOcarinaPlayingPos == 8)) { + AudioOcarina_SetRecordingSong(true); return; } - if (sStaffPlayingPos > 8) { - if (sRecordingState == 2) { + if (sStaffOcarinaPlayingPos > 8) { + if (sRecordingState == OCARINA_RECORD_SCARECROW_SPAWN) { // notes played are over 8 and in recording mode. - func_800EDD68(1); + AudioOcarina_SetRecordingSong(true); return; } - sStaffPlayingPos = true; + sStaffOcarinaPlayingPos = 1; } noteChanged = true; - } else if (D_80131868 != D_80130F30) { + } else if (sRecordOcarinaVolume != sCurOcarinaVolume) { noteChanged = true; - } else if (D_8013186C != D_80130F34) { + } else if (sRecordOcarinaVibrato != sCurOcarinaVibrato) { noteChanged = true; - } else if (D_80131870 != D_80130F2C) { + } else if (sRecordOcarinaBendIndex != sCurOcarinaBendIndex) { noteChanged = true; } if (noteChanged) { - func_800EDD68(0); - D_80131860 = D_8016BA04; + AudioOcarina_SetRecordingSong(false); + sOcarinaRecordTaskStart = sOcarinaUpdateTaskStart; } } } -void Audio_OcaMemoryGameStart(u8 minigameRound) { +void AudioOcarina_MemoryGameInit(u8 minigameRound) { u8 i; if (minigameRound > 2) { minigameRound = 2; } - sOcaMinigameAppendPos = 0; - sOcaMinigameEndPos = sOcaMinigameNoteCnts[minigameRound]; + sOcaMemoryGameAppendPos = 0; + sOcaMemoryGameEndPos = sOcaMemoryGameNumNotes[minigameRound]; for (i = 0; i < 3; i++) { - Audio_OcaMemoryGameGenNote(); + AudioOcarina_MemoryGameNextNote(); } } -s32 Audio_OcaMemoryGameGenNote(void) { - u32 rnd; - u8 rndNote; +s32 AudioOcarina_MemoryGameNextNote(void) { + u32 randomButtonIndex; + u8 randomPitch; - if (sOcaMinigameAppendPos == sOcaMinigameEndPos) { + if (sOcaMemoryGameAppendPos == sOcaMemoryGameEndPos) { return 1; } - rnd = Audio_NextRandom(); - rndNote = sOcarinaNoteValues[rnd % 5]; + randomButtonIndex = Audio_NextRandom(); + randomPitch = sButtonToPitchMap[randomButtonIndex % 5]; - if (sOcarinaSongs[OCARINA_SONG_MEMORY_GAME][sOcaMinigameAppendPos - 1].noteIdx == rndNote) { - rndNote = sOcarinaNoteValues[(rnd + 1) % 5]; + if (sOcarinaSongNotes[OCARINA_SONG_MEMORY_GAME][sOcaMemoryGameAppendPos - 1].pitch == randomPitch) { + randomPitch = sButtonToPitchMap[(randomButtonIndex + 1) % 5]; } - sOcarinaSongs[OCARINA_SONG_MEMORY_GAME][sOcaMinigameAppendPos].noteIdx = rndNote; - sOcarinaSongs[OCARINA_SONG_MEMORY_GAME][sOcaMinigameAppendPos].unk_02 = 0x2D; - sOcarinaSongs[OCARINA_SONG_MEMORY_GAME][sOcaMinigameAppendPos].volume = 0x50; - sOcarinaSongs[OCARINA_SONG_MEMORY_GAME][sOcaMinigameAppendPos].vibrato = 0; - sOcarinaSongs[OCARINA_SONG_MEMORY_GAME][sOcaMinigameAppendPos].tone = 0; + sOcarinaSongNotes[OCARINA_SONG_MEMORY_GAME][sOcaMemoryGameAppendPos].pitch = randomPitch; + sOcarinaSongNotes[OCARINA_SONG_MEMORY_GAME][sOcaMemoryGameAppendPos].length = 45; + sOcarinaSongNotes[OCARINA_SONG_MEMORY_GAME][sOcaMemoryGameAppendPos].volume = 0x50; + sOcarinaSongNotes[OCARINA_SONG_MEMORY_GAME][sOcaMemoryGameAppendPos].vibrato = 0; + sOcarinaSongNotes[OCARINA_SONG_MEMORY_GAME][sOcaMemoryGameAppendPos].bend = 0; - sOcaMinigameAppendPos++; + sOcaMemoryGameAppendPos++; - sOcarinaSongs[OCARINA_SONG_MEMORY_GAME][sOcaMinigameAppendPos].noteIdx = 0xFF; - sOcarinaSongs[OCARINA_SONG_MEMORY_GAME][sOcaMinigameAppendPos].unk_02 = 0; - sOcarinaSongs[OCARINA_SONG_MEMORY_GAME][sOcaMinigameAppendPos + 1].noteIdx = 0xFF; - sOcarinaSongs[OCARINA_SONG_MEMORY_GAME][sOcaMinigameAppendPos + 1].unk_02 = 0; + sOcarinaSongNotes[OCARINA_SONG_MEMORY_GAME][sOcaMemoryGameAppendPos].pitch = OCARINA_PITCH_NONE; + sOcarinaSongNotes[OCARINA_SONG_MEMORY_GAME][sOcaMemoryGameAppendPos].length = 0; + sOcarinaSongNotes[OCARINA_SONG_MEMORY_GAME][sOcaMemoryGameAppendPos + 1].pitch = OCARINA_PITCH_NONE; + sOcarinaSongNotes[OCARINA_SONG_MEMORY_GAME][sOcaMemoryGameAppendPos + 1].length = 0; if (1) {} return 0; } -// input update? -void func_800EE6F4(void) { - D_8016BA04 = gAudioContext.totalTaskCnt; - if (D_80130F10 != 0) { - if (sOcarinaInpEnabled == 1) { - Audio_GetOcaInput(); +void AudioOcarina_Update(void) { + sOcarinaUpdateTaskStart = gAudioContext.totalTaskCount; + if (sOcarinaInstrumentId != OCARINA_INSTRUMENT_OFF) { + if (sIsOcarinaInputEnabled == true) { + AudioOcarina_ReadControllerInput(); } - if ((sPlaybackState == 0) && (sOcarinaInpEnabled == 1)) { - func_800ED458(0); + + if ((sPlaybackState == 0) && (sIsOcarinaInputEnabled == true)) { + AudioOcarina_PlayControllerInput(false); } - if (D_80130F3C != 0) { - if (D_80130F3C & 0x4000) { - func_800ED200(); + + if (sOcarinaFlags != 0) { + if (sOcarinaFlags & 0x4000) { + AudioOcarina_CheckSongsWithoutMusicStaff(); } else { - func_800ECDF8(); + AudioOcarina_CheckSongsWithMusicStaff(); } } - Audio_OcaPlayback(); - D_80130F68 = D_8016BA04; + AudioOcarina_PlaybackSong(); + sOcarinaPlaybackTaskStart = sOcarinaUpdateTaskStart; if (sPlaybackState == 0) { - func_800EE404(); + AudioOcarina_RecordSong(); } - if ((D_80130F3C != 0) && (sPrevOcarinaNoteVal != sCurOcarinaBtnVal)) { - D_80131880 = 1; + if ((sOcarinaFlags != 0) && (sPrevOcarinaPitch != sCurOcarinaPitch)) { + sOcarinaDropInputTimer = 1; // Drops ocarina input for 1 frame } - sPrevOcarinaNoteVal = sCurOcarinaBtnVal; + sPrevOcarinaPitch = sCurOcarinaPitch; } - Audio_OcaUpdatePlayingStaff(); - Audio_OcaUpdateDisplayedStaff(); - Audio_OcaUpdateRecordingStaff(); + AudioOcarina_UpdatePlayingStaff(); + AudioOcarina_UpdatePlaybackStaff(); + AudioOcarina_UpdateRecordingStaff(); } -void func_800EE824(void) { - static u8 D_80131C80 = 0; - static u8 D_80131C84 = 1; - static u16 D_80131C88 = 1200; +void AudioOcarina_PlayLongScarecrowAfterCredits(void) { + static u8 sScarecrowAfterCreditsState = 0; + static u8 sScarecrowAfterCreditsIntrumentId = OCARINA_INSTRUMENT_DEFAULT; + static u16 sScarecrowAfterCreditsTimer = 1200; - switch (D_80131C80) { + switch (sScarecrowAfterCreditsState) { case 0: - if (D_80131C88-- == 0) { - if (D_80131C84 < 7) { - D_80131C80++; + if (sScarecrowAfterCreditsTimer-- == 0) { + if (sScarecrowAfterCreditsIntrumentId < OCARINA_INSTRUMENT_MAX) { + // set next ocarina instrument and restart + sScarecrowAfterCreditsState++; } else { - D_80131C80 = 3; - Audio_OcaSetInstrument(0); + // finished + sScarecrowAfterCreditsState = 3; + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); } - D_80131C88 = 1200; + sScarecrowAfterCreditsTimer = 1200; } break; case 1: Audio_SetSoundBanksMute(0); - Audio_OcaSetInstrument(D_80131C84); - Audio_OcaSetSongPlayback(OCARINA_SONG_SCARECROW_LONG + 1, 1); - D_80131C84++; - D_80131C80++; + AudioOcarina_SetInstrument(sScarecrowAfterCreditsIntrumentId); + AudioOcarina_SetPlaybackSong(OCARINA_SONG_SCARECROW_LONG + 1, 1); + sScarecrowAfterCreditsIntrumentId++; + sScarecrowAfterCreditsState++; break; case 2: - if (Audio_OcaGetDisplayingStaff()->state == 0) { - D_80131C80 = 0; + if (AudioOcarina_GetPlaybackStaff()->state == 0) { + sScarecrowAfterCreditsState = 0; } break; } } -void func_800EE930(void) { - sPlayingStaff.noteIdx = OCARINA_NOTE_INVALID; +void AudioOcarina_ResetStaffs(void) { + sPlayingStaff.buttonIndex = OCARINA_BTN_INVALID; sPlayingStaff.state = 0xFF; sPlayingStaff.pos = 0; - sDisplayedStaff.noteIdx = OCARINA_NOTE_INVALID; - sDisplayedStaff.state = 0; - sDisplayedStaff.pos = 0; - sRecordingStaff.noteIdx = OCARINA_NOTE_INVALID; - sRecordingStaff.state = 0xFF; + sPlaybackStaff.buttonIndex = OCARINA_BTN_INVALID; + sPlaybackStaff.state = 0; + sPlaybackStaff.pos = 0; + sRecordingStaff.buttonIndex = OCARINA_BTN_INVALID; + sRecordingStaff.state = OCARINA_RECORD_REJECTED; sRecordingStaff.pos = 0; - D_80131880 = 0; + sOcarinaDropInputTimer = 0; } f32 D_80131C8C = 0.0f; -// === Audio Debugging === +// =========== Audio Debugging =========== -// These variables come between in-function statics in func_800EE824 and Audio_SplitBgmChannels +extern u16 gAudioSfxSwapSource[]; +extern u16 gAudioSfxSwapTarget[]; +extern u8 gAudioSfxSwapMode[]; +extern u8 gAudioSfxSwapOff; +extern u8 D_801333F0; + +u32 sDebugPadHold; +u32 sDebugPadBtnLast; +u32 sDebugPadPress; +s32 sAudioUpdateTaskStart; +s32 sAudioUpdateTaskEnd; f32 sAudioUpdateDuration = 0.0f; f32 sAudioUpdateDurationMax = 0.0f; @@ -2767,11 +2963,11 @@ void AudioDebug_Draw(GfxPrint* printer) { case PAGE_OCARINA_TEST: SETCOL(255, 255, 255); GfxPrint_SetPos(printer, 3, 4); - GfxPrint_Printf(printer, "SEQ INFO : %2d %02x %d", sDisplayedStaff.noteIdx, sDisplayedStaff.state, - sDisplayedStaff.pos); + GfxPrint_Printf(printer, "SEQ INFO : %2d %02x %d", sPlaybackStaff.buttonIndex, sPlaybackStaff.state, + sPlaybackStaff.pos); GfxPrint_SetPos(printer, 3, 5); - GfxPrint_Printf(printer, "PLAY INFO : %2d %02x %d", sPlayingStaff.noteIdx, sPlayingStaff.state, + GfxPrint_Printf(printer, "PLAY INFO : %2d %02x %d", sPlayingStaff.buttonIndex, sPlayingStaff.state, sPlayingStaff.pos); GfxPrint_SetPos(printer, 3, 6); @@ -2786,8 +2982,8 @@ void AudioDebug_Draw(GfxPrint* printer) { } GfxPrint_SetPos(printer, 3, 24); - GfxPrint_Printf(printer, "OCA:%02x SEQ:%04x PLAY:%02x REC:%02x", D_80130F10, D_80130F3C, sPlaybackState, - sRecordingState); + GfxPrint_Printf(printer, "OCA:%02x SEQ:%04x PLAY:%02x REC:%02x", sOcarinaInstrumentId, sOcarinaFlags, + sPlaybackState, sRecordingState); break; case PAGE_SFX_PARAMETER_CHANGE: @@ -3494,11 +3690,14 @@ void AudioDebug_ProcessInput(void) { void Audio_UpdateRiverSoundVolumes(void); void func_800F5CF8(void); +/** + * This is Audio_Update for the graph thread + */ void func_800F3054(void) { if (func_800FAD34() == 0) { - sAudioUpdateTaskStart = gAudioContext.totalTaskCnt; + sAudioUpdateTaskStart = gAudioContext.totalTaskCount; sAudioUpdateStartTime = osGetTime(); - func_800EE6F4(); + AudioOcarina_Update(); Audio_StepFreqLerp(&sRiverFreqScaleLerp); Audio_StepFreqLerp(&sWaterfallFreqScaleLerp); Audio_UpdateRiverSoundVolumes(); @@ -3514,7 +3713,7 @@ void func_800F3054(void) { AudioDebug_SetInput(); AudioDebug_ProcessInput(); Audio_ScheduleProcessCmds(); - sAudioUpdateTaskEnd = gAudioContext.totalTaskCnt; + sAudioUpdateTaskEnd = gAudioContext.totalTaskCount; sAudioUpdateEndTime = osGetTime(); } } @@ -3880,7 +4079,7 @@ void Audio_ResetSfxChannelState(void) { state->unk_0C = 0xFF; } - sSfxChannelState[SFX_PLAYER_CHANNEL_OCARINA].unk_0C = 0; + sSfxChannelState[SFX_CHANNEL_OCARINA].unk_0C = 0; sPrevSeqMode = 0; sAudioCodeReverb = 0; } @@ -4184,7 +4383,7 @@ void Audio_UpdateRiverSoundVolumes(void) { } void Audio_PlaySoundIncreasinglyTransposed(Vec3f* pos, s16 sfxId, u8* semitones) { - Audio_PlaySoundGeneral(sfxId, pos, 4, &gNoteFrequencies[semitones[sAudioIncreasingTranspose] + 39], + Audio_PlaySoundGeneral(sfxId, pos, 4, &gPitchFrequencies[semitones[sAudioIncreasingTranspose] + 39], &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); if (sAudioIncreasingTranspose < 15) { @@ -4197,7 +4396,7 @@ void Audio_ResetIncreasingTranspose(void) { } void Audio_PlaySoundTransposed(Vec3f* pos, u16 sfxId, s8 semitone) { - Audio_PlaySoundGeneral(sfxId, pos, 4, &gNoteFrequencies[semitone + 39], &gSfxDefaultFreqAndVolScale, + Audio_PlaySoundGeneral(sfxId, pos, 4, &gPitchFrequencies[semitone + 39], &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); } @@ -4875,26 +5074,26 @@ void Audio_PlaySoundIfNotInCutscene(u16 sfxId) { void func_800F6964(u16 arg0) { s32 skip; - u8 i; + u8 channelIdx; Audio_SeqCmd1(SEQ_PLAYER_BGM_MAIN, (arg0 * 3) / 2); Audio_SeqCmd1(SEQ_PLAYER_FANFARE, (arg0 * 3) / 2); - for (i = 0; i < 0x10; i++) { + for (channelIdx = 0; channelIdx < 16; channelIdx++) { skip = false; - switch (i) { - case 11: - case 12: + switch (channelIdx) { + case SFX_CHANNEL_SYSTEM0: + case SFX_CHANNEL_SYSTEM1: if (gAudioSpecId == 10) { skip = true; } break; - case 13: + case SFX_CHANNEL_OCARINA: skip = true; break; } if (!skip) { - Audio_SeqCmd6(SEQ_PLAYER_SFX, arg0 >> 1, i, 0); + Audio_SeqCmd6(SEQ_PLAYER_SFX, arg0 >> 1, channelIdx, 0); } } @@ -4947,7 +5146,7 @@ void func_800F6C34(void) { sAudioExtraFilter = 0; sAudioBaseFilter2 = 0; sAudioExtraFilter2 = 0; - Audio_OcaSetInstrument(0); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); sRiverFreqScaleLerp.remainingFrames = 0; sWaterfallFreqScaleLerp.remainingFrames = 0; sRiverFreqScaleLerp.value = 1.0f; @@ -5060,7 +5259,7 @@ void Audio_Init(void) { void Audio_InitSound(void) { func_800F6C34(); - func_800EE930(); + AudioOcarina_ResetStaffs(); Audio_ResetSfxChannelState(); func_800FAEB4(); Audio_ResetSounds(); @@ -5077,7 +5276,7 @@ void func_800F7170(void) { void func_800F71BC(s32 arg0) { D_80133418 = 1; func_800F6C34(); - func_800EE930(); + AudioOcarina_ResetStaffs(); Audio_ResetSfxChannelState(); func_800FADF8(); Audio_ResetSounds(); diff --git a/src/code/z_construct.c b/src/code/z_construct.c index fbfc9dcb06..cbf9983ad3 100644 --- a/src/code/z_construct.c +++ b/src/code/z_construct.c @@ -533,8 +533,8 @@ void func_80111070(void) { VREG(25) = 0; VREG(26) = 0; VREG(27) = 0; - R_OCARINA_NOTES_XPOS = 98; - R_OCARINA_NOTES_XPOS_OFFSET = 18; + R_OCARINA_BUTTONS_XPOS = 98; + R_OCARINA_BUTTONS_XPOS_OFFSET = 18; VREG(30) = 0; VREG(31) = 0; VREG(32) = 0; @@ -551,13 +551,13 @@ void func_80111070(void) { VREG(42) = 250; VREG(43) = 440; VREG(44) = 10; - R_OCARINA_NOTES_YPOS(0) = 190; - R_OCARINA_NOTES_YPOS(1) = 184; - R_OCARINA_NOTES_YPOS(2) = 176; - R_OCARINA_NOTES_YPOS(3) = 172; - R_OCARINA_NOTES_YPOS(4) = 170; + R_OCARINA_BUTTONS_YPOS(0) = 190; + R_OCARINA_BUTTONS_YPOS(1) = 184; + R_OCARINA_BUTTONS_YPOS(2) = 176; + R_OCARINA_BUTTONS_YPOS(3) = 172; + R_OCARINA_BUTTONS_YPOS(4) = 170; VREG(50) = 30; - R_OCARINA_NOTES_YPOS_OFFSET = 0; + R_OCARINA_BUTTONS_YPOS_OFFSET = 0; VREG(52) = -16; VREG(53) = 230; VREG(54) = 230; diff --git a/src/code/z_demo.c b/src/code/z_demo.c index 9e58d7b69a..549e79da12 100644 --- a/src/code/z_demo.c +++ b/src/code/z_demo.c @@ -420,7 +420,7 @@ void func_80064824(GlobalContext* globalCtx, CutsceneContext* csCtx, CsCmdBase* } break; case 35: - func_800EE824(); + AudioOcarina_PlayLongScarecrowAfterCredits(); csCtx->frames = cmd->startFrame - 1; break; } diff --git a/src/code/z_message_PAL.c b/src/code/z_message_PAL.c index dfbed1e0aa..38968e59ae 100644 --- a/src/code/z_message_PAL.c +++ b/src/code/z_message_PAL.c @@ -7,9 +7,9 @@ s16 sTextFade = false; // original name: key_off_flag ? u8 D_8014B2F4 = 0; -s16 sOcarinaNoteBufPos = 0; +s16 sOcarinaButtonIndexBufPos = 0; -s16 sOcarinaNoteBufLen = 0; +s16 sOcarinaButtonIndexBufLen = 0; u8 sTextboxSkipped = false; @@ -19,7 +19,7 @@ s16 sTextIsCredits = false; UNK_TYPE D_8014B30C = 0; -s16 sLastPlayedSong = 0xFF; // last played song? +s16 sLastPlayedSong = 0xFF; s16 sHasSunsSong = false; @@ -82,9 +82,9 @@ s16 sTextboxBackgroundYOffsets[] = { }; // original name: onpu_buff -u8 sOcarinaNoteBuf[12] = { 0 }; +u8 sOcarinaButtonIndexBuf[12] = { 0 }; -s16 sOcarinaNotesAlphaValues[9] = { 0 }; +s16 sOcarinaButtonAlphaValues[9] = { 0 }; // Maps the ocarina song order to the quest item order s16 gOcarinaSongItemMap[] = { @@ -95,59 +95,59 @@ s16 gOcarinaSongItemMap[] = { s32 sCharTexSize; s32 sCharTexScale; -s16 sOcarinaNoteAPrimR; -s16 sOcarinaNoteAPrimB; -s16 sOcarinaNoteAPrimG; -s16 sOcarinaNoteAEnvR; -s16 sOcarinaNoteAEnvB; -s16 sOcarinaNoteAEnvG; -s16 sOcarinaNoteCPrimR; -s16 sOcarinaNoteCPrimB; -s16 sOcarinaNoteCPrimG; -s16 sOcarinaNoteCEnvR; -s16 sOcarinaNoteCEnvB; -s16 sOcarinaNoteCEnvG; +s16 sOcarinaButtonAPrimR; +s16 sOcarinaButtonAPrimB; +s16 sOcarinaButtonAPrimG; +s16 sOcarinaButtonAEnvR; +s16 sOcarinaButtonAEnvB; +s16 sOcarinaButtonAEnvG; +s16 sOcarinaButtonCPrimR; +s16 sOcarinaButtonCPrimB; +s16 sOcarinaButtonCPrimG; +s16 sOcarinaButtonCEnvR; +s16 sOcarinaButtonCEnvB; +s16 sOcarinaButtonCEnvG; void Message_ResetOcarinaNoteState(void) { - R_OCARINA_NOTES_YPOS(0) = 189; - R_OCARINA_NOTES_YPOS(1) = 184; - R_OCARINA_NOTES_YPOS(2) = 179; - R_OCARINA_NOTES_YPOS(3) = 174; - R_OCARINA_NOTES_YPOS(4) = 169; - sOcarinaNoteBuf[0] = 0xFF; - sOcarinaNotesAlphaValues[0] = sOcarinaNotesAlphaValues[1] = sOcarinaNotesAlphaValues[2] = - sOcarinaNotesAlphaValues[3] = sOcarinaNotesAlphaValues[4] = sOcarinaNotesAlphaValues[5] = - sOcarinaNotesAlphaValues[6] = sOcarinaNotesAlphaValues[7] = sOcarinaNotesAlphaValues[8] = 0; - sOcarinaNoteAPrimR = 80; - sOcarinaNoteAPrimG = 255; - sOcarinaNoteAPrimB = 150; - sOcarinaNoteAEnvR = 10; - sOcarinaNoteAEnvG = 10; - sOcarinaNoteAEnvB = 10; - sOcarinaNoteCPrimR = 255; - sOcarinaNoteCPrimG = 255; - sOcarinaNoteCPrimB = 50; - sOcarinaNoteCEnvR = 10; - sOcarinaNoteCEnvG = 10; - sOcarinaNoteCEnvB = 10; + R_OCARINA_BUTTONS_YPOS(0) = 189; + R_OCARINA_BUTTONS_YPOS(1) = 184; + R_OCARINA_BUTTONS_YPOS(2) = 179; + R_OCARINA_BUTTONS_YPOS(3) = 174; + R_OCARINA_BUTTONS_YPOS(4) = 169; + sOcarinaButtonIndexBuf[0] = OCARINA_BTN_INVALID; + sOcarinaButtonAlphaValues[0] = sOcarinaButtonAlphaValues[1] = sOcarinaButtonAlphaValues[2] = + sOcarinaButtonAlphaValues[3] = sOcarinaButtonAlphaValues[4] = sOcarinaButtonAlphaValues[5] = + sOcarinaButtonAlphaValues[6] = sOcarinaButtonAlphaValues[7] = sOcarinaButtonAlphaValues[8] = 0; + sOcarinaButtonAPrimR = 80; + sOcarinaButtonAPrimG = 255; + sOcarinaButtonAPrimB = 150; + sOcarinaButtonAEnvR = 10; + sOcarinaButtonAEnvG = 10; + sOcarinaButtonAEnvB = 10; + sOcarinaButtonCPrimR = 255; + sOcarinaButtonCPrimG = 255; + sOcarinaButtonCPrimB = 50; + sOcarinaButtonCEnvR = 10; + sOcarinaButtonCEnvG = 10; + sOcarinaButtonCEnvB = 10; } -void Message_UpdateOcarinaGame(GlobalContext* globalCtx) { +void Message_UpdateOcarinaMemoryGame(GlobalContext* globalCtx) { MessageContext* msgCtx = &globalCtx->msgCtx; globalCtx->msgCtx.msgMode++; if (globalCtx->msgCtx.msgMode == MSGMODE_MEMORY_GAME_PLAYER_PLAYING) { - Audio_OcaSetInstrument(1); - msgCtx->ocarinaStaff = Audio_OcaGetPlayingStaff(); - msgCtx->ocarinaStaff->pos = sOcarinaNoteBufPos = 0; - func_800ECC04((1 << OCARINA_SONG_MEMORY_GAME) + 0x8000); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT); + msgCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff(); + msgCtx->ocarinaStaff->pos = sOcarinaButtonIndexBufPos = 0; + AudioOcarina_Start((1 << OCARINA_SONG_MEMORY_GAME) + 0x8000); msgCtx->textDrawPos = msgCtx->decodedTextLen; } else if (msgCtx->msgMode == MSGMODE_MEMORY_GAME_RIGHT_SKULLKID_PLAYING) { - Audio_OcaSetInstrument(6); - msgCtx->ocarinaStaff = Audio_OcaGetDisplayingStaff(); - msgCtx->ocarinaStaff->pos = sOcarinaNoteBufPos = 0; - Audio_OcaSetSongPlayback(OCARINA_SONG_MEMORY_GAME + 1, 1); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_FLUTE); + msgCtx->ocarinaStaff = AudioOcarina_GetPlaybackStaff(); + msgCtx->ocarinaStaff->pos = sOcarinaButtonIndexBufPos = 0; + AudioOcarina_SetPlaybackSong(OCARINA_SONG_MEMORY_GAME + 1, 1); msgCtx->stateTimer = 2; } Message_ResetOcarinaNoteState(); @@ -790,31 +790,31 @@ void Message_HandleOcarina(GlobalContext* globalCtx) { } else if (msgCtx->ocarinaAction == OCARINA_ACTION_SCARECROW_LONG_PLAYBACK) { // "Recording Playback / Recording Playback / Recording Playback / Recording Playback -> " osSyncPrintf("録音再生 録音再生 録音再生 録音再生 -> "); - Audio_OcaSetInstrument(1); - Audio_OcaSetInstrument(1); - msgCtx->ocarinaStaff = Audio_OcaGetDisplayingStaff(); - sOcarinaNoteBufPos = sOcarinaNoteBufLen = 0; - msgCtx->ocarinaStaff->pos = sOcarinaNoteBufPos; + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT); + msgCtx->ocarinaStaff = AudioOcarina_GetPlaybackStaff(); + sOcarinaButtonIndexBufPos = sOcarinaButtonIndexBufLen = 0; + msgCtx->ocarinaStaff->pos = sOcarinaButtonIndexBufPos; Message_ResetOcarinaNoteState(); msgCtx->stateTimer = 3; msgCtx->msgMode = MSGMODE_SCARECROW_LONG_PLAYBACK; - Audio_OcaSetSongPlayback(OCARINA_SONG_SCARECROW_LONG + 1, 1); - } else if (msgCtx->ocarinaAction == OCARINA_ACTION_SCARECROW_RECORDING) { - msgCtx->msgMode = MSGMODE_SCARECROW_RECORDING_START; + AudioOcarina_SetPlaybackSong(OCARINA_SONG_SCARECROW_LONG + 1, 1); + } else if (msgCtx->ocarinaAction == OCARINA_ACTION_SCARECROW_SPAWN_RECORDING) { + msgCtx->msgMode = MSGMODE_SCARECROW_SPAWN_RECORDING_START; // "8 Note Recording Start / 8 Note Recording Start / 8 Note Recording Start -> " osSyncPrintf("8音録音開始 8音録音開始 8音録音開始 -> "); - } else if (msgCtx->ocarinaAction == OCARINA_ACTION_SCARECROW_PLAYBACK) { + } else if (msgCtx->ocarinaAction == OCARINA_ACTION_SCARECROW_SPAWN_PLAYBACK) { // "8 Note Playback / 8 Note Playback / 8 Note Playback -> " osSyncPrintf("8音再生 8音再生 8音再生 -> "); - Audio_OcaSetInstrument(1); - Audio_OcaSetInstrument(1); - msgCtx->ocarinaStaff = Audio_OcaGetDisplayingStaff(); - sOcarinaNoteBufPos = sOcarinaNoteBufLen = 0; - msgCtx->ocarinaStaff->pos = sOcarinaNoteBufPos; + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT); + msgCtx->ocarinaStaff = AudioOcarina_GetPlaybackStaff(); + sOcarinaButtonIndexBufPos = sOcarinaButtonIndexBufLen = 0; + msgCtx->ocarinaStaff->pos = sOcarinaButtonIndexBufPos; Message_ResetOcarinaNoteState(); msgCtx->stateTimer = 3; - msgCtx->msgMode = MSGMODE_SCARECROW_PLAYBACK; - Audio_OcaSetSongPlayback(OCARINA_SONG_SCARECROW + 1, 1); + msgCtx->msgMode = MSGMODE_SCARECROW_SPAWN_PLAYBACK; + AudioOcarina_SetPlaybackSong(OCARINA_SONG_SCARECROW_SPAWN + 1, 1); } else if (msgCtx->ocarinaAction == OCARINA_ACTION_MEMORY_GAME) { msgCtx->msgMode = MSGMODE_MEMORY_GAME_START; // "Musical Round Start / Musical Round Start / Musical Round Start / Musical Round Start -> " @@ -1739,11 +1739,19 @@ void Message_ContinueTextbox(GlobalContext* globalCtx, u16 textId) { void Message_StartOcarina(GlobalContext* globalCtx, u16 ocarinaActionId) { static u16 sOcarinaSongFlagsMap[] = { - (1 << OCARINA_SONG_MINUET), (1 << OCARINA_SONG_BOLERO), (1 << OCARINA_SONG_SERENADE), - (1 << OCARINA_SONG_REQUIEM), (1 << OCARINA_SONG_NOCTURNE), (1 << OCARINA_SONG_PRELUDE), - (1 << OCARINA_SONG_LULLABY), (1 << OCARINA_SONG_EPONAS), (1 << OCARINA_SONG_SARIAS), - (1 << OCARINA_SONG_SUNS), (1 << OCARINA_SONG_TIME), (1 << OCARINA_SONG_STORMS), - (1 << OCARINA_SONG_SCARECROW), + (1 << OCARINA_SONG_MINUET), + (1 << OCARINA_SONG_BOLERO), + (1 << OCARINA_SONG_SERENADE), + (1 << OCARINA_SONG_REQUIEM), + (1 << OCARINA_SONG_NOCTURNE), + (1 << OCARINA_SONG_PRELUDE), + (1 << OCARINA_SONG_LULLABY), + (1 << OCARINA_SONG_EPONAS), + (1 << OCARINA_SONG_SARIAS), + (1 << OCARINA_SONG_SUNS), + (1 << OCARINA_SONG_TIME), + (1 << OCARINA_SONG_STORMS), + (1 << OCARINA_SONG_SCARECROW_SPAWN), }; MessageContext* msgCtx = &globalCtx->msgCtx; s32 textId; @@ -1754,24 +1762,24 @@ void Message_StartOcarina(GlobalContext* globalCtx, u16 ocarinaActionId) { osSyncPrintf(VT_FGCOL(GREEN)); - for (i = sOcarinaSongBitFlags = 0; i < (QUEST_KOKIRI_EMERALD - QUEST_SONG_MINUET); i++) { + for (i = sOcarinaSongBitFlags = 0; i <= (QUEST_SONG_STORMS - QUEST_SONG_MINUET); i++) { if (CHECK_QUEST_ITEM(QUEST_SONG_MINUET + i)) { osSyncPrintf("ocarina_check_bit[%d]=%x\n", i, sOcarinaSongFlagsMap[i]); sOcarinaSongBitFlags |= sOcarinaSongFlagsMap[i]; } } if (gSaveContext.scarecrowSpawnSongSet) { - sOcarinaSongBitFlags |= (1 << OCARINA_SONG_SCARECROW); + sOcarinaSongBitFlags |= (1 << OCARINA_SONG_SCARECROW_SPAWN); } osSyncPrintf("ocarina_bit = %x\n", sOcarinaSongBitFlags); osSyncPrintf(VT_RST); sHasSunsSong = CHECK_QUEST_ITEM(QUEST_SONG_SUN); - msgCtx->ocarinaStaff = Audio_OcaGetRecordingStaff(); - msgCtx->ocarinaStaff->pos = sOcarinaNoteBufPos = 0; - sOcarinaNoteBufLen = 0; + msgCtx->ocarinaStaff = AudioOcarina_GetRecordingStaff(); + msgCtx->ocarinaStaff->pos = sOcarinaButtonIndexBufPos = 0; + sOcarinaButtonIndexBufLen = 0; Message_ResetOcarinaNoteState(); - sLastPlayedSong = msgCtx->unk_E3F2 = msgCtx->lastOcaNoteIdx = 0xFF; + sLastPlayedSong = msgCtx->unk_E3F2 = msgCtx->lastOcarinaButtonIndex = 0xFF; // "Ocarina Number" osSyncPrintf(VT_FGCOL(RED) "☆☆☆☆☆ オカリナ番号=%d(%d) ☆☆☆☆☆\n" VT_RST, ocarinaActionId, 2); @@ -1790,7 +1798,7 @@ void Message_StartOcarina(GlobalContext* globalCtx, u16 ocarinaActionId) { Audio_PlaySoundGeneral(NA_SE_SY_TRE_BOX_APPEAR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); } - if (ocarinaActionId == OCARINA_ACTION_SCARECROW_PLAYBACK) { + if (ocarinaActionId == OCARINA_ACTION_SCARECROW_SPAWN_PLAYBACK) { Message_OpenText(globalCtx, 0x86F); // Ocarina textId = ocarinaActionId + 0x86E; } else { @@ -1850,15 +1858,15 @@ void Message_StartOcarina(GlobalContext* globalCtx, u16 ocarinaActionId) { } else if (ocarinaActionId == OCARINA_ACTION_SCARECROW_LONG_PLAYBACK) { // "?????Recording Playback / Recording Playback / Recording Playback / Recording Playback -> " osSyncPrintf("?????録音再生 録音再生 録音再生 録音再生 -> "); - Audio_OcaSetInstrument(1); - Audio_OcaSetInstrument(1); - msgCtx->ocarinaStaff = Audio_OcaGetDisplayingStaff(); - sOcarinaNoteBufPos = sOcarinaNoteBufLen = 0; - msgCtx->ocarinaStaff->pos = sOcarinaNoteBufPos; + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT); + msgCtx->ocarinaStaff = AudioOcarina_GetPlaybackStaff(); + sOcarinaButtonIndexBufPos = sOcarinaButtonIndexBufLen = 0; + msgCtx->ocarinaStaff->pos = sOcarinaButtonIndexBufPos; Message_ResetOcarinaNoteState(); msgCtx->stateTimer = 3; msgCtx->msgMode = MSGMODE_SCARECROW_LONG_PLAYBACK; - Audio_OcaSetSongPlayback(OCARINA_SONG_SCARECROW_LONG + 1, 1); + AudioOcarina_SetPlaybackSong(OCARINA_SONG_SCARECROW_LONG + 1, 1); gSaveContext.unk_13EA = 0; Interface_ChangeAlpha(1); } @@ -1970,24 +1978,24 @@ void Message_DrawMain(GlobalContext* globalCtx, Gfx** p) { static void* sOcarinaNoteTextures[] = { gOcarinaATex, gOcarinaCDownTex, gOcarinaCRightTex, gOcarinaCLeftTex, gOcarinaCUpTex, }; - static s16 sOcarinaNoteAPrimColors[][3] = { + static s16 sOcarinaButtonAPrimColors[][3] = { { 80, 255, 150 }, { 100, 255, 200 }, }; - static s16 sOcarinaNoteAEnvColors[][3] = { + static s16 sOcarinaButtonAEnvColors[][3] = { { 10, 10, 10 }, { 50, 255, 50 }, }; - static s16 sOcarinaNoteCPrimColors[][3] = { + static s16 sOcarinaButtonCPrimColors[][3] = { { 255, 255, 50 }, { 255, 255, 180 }, }; - static s16 sOcarinaNoteCEnvColors[][3] = { + static s16 sOcarinaButtonCEnvColors[][3] = { { 10, 10, 10 }, { 110, 110, 50 }, }; static s16 sOcarinaNoteFlashTimer = 12; - static s16 sOcarinaNoteFlashColorIdx = 1; + static s16 sOcarinaNoteFlashColorIndex = 1; static s16 sOcarinaSongFanfares[] = { NA_BGM_OCA_MINUET, NA_BGM_OCA_BOLERO, NA_BGM_OCA_SERENADE, NA_BGM_OCA_REQUIEM, NA_BGM_OCA_NOCTURNE, NA_BGM_OCA_LIGHT, NA_BGM_OCA_SARIA, NA_BGM_OCA_EPONA, @@ -1995,7 +2003,7 @@ void Message_DrawMain(GlobalContext* globalCtx, Gfx** p) { }; InterfaceContext* interfaceCtx = &globalCtx->interfaceCtx; MessageContext* msgCtx = &globalCtx->msgCtx; - u16 noteBufPos; + u16 buttonIndexPos; Player* player = GET_PLAYER(globalCtx); s32 pad; Gfx* gfx = *p; @@ -2051,37 +2059,37 @@ void Message_DrawMain(GlobalContext* globalCtx, Gfx** p) { case MSGMODE_OCARINA_STARTING: case MSGMODE_SONG_DEMONSTRATION_STARTING: case MSGMODE_SONG_PLAYBACK_STARTING: - Audio_OcaSetInstrument(1); - msgCtx->ocarinaStaff = Audio_OcaGetPlayingStaff(); - msgCtx->ocarinaStaff->pos = sOcarinaNoteBufPos = 0; + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT); + msgCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff(); + msgCtx->ocarinaStaff->pos = sOcarinaButtonIndexBufPos = 0; globalCtx->msgCtx.ocarinaMode = OCARINA_MODE_01; Message_ResetOcarinaNoteState(); sOcarinaNoteFlashTimer = 3; - sOcarinaNoteFlashColorIdx = 1; + sOcarinaNoteFlashColorIndex = 1; if (msgCtx->msgMode == MSGMODE_OCARINA_STARTING) { if (msgCtx->ocarinaAction == OCARINA_ACTION_UNK_0 || msgCtx->ocarinaAction == OCARINA_ACTION_FREE_PLAY || - msgCtx->ocarinaAction == OCARINA_ACTION_SCARECROW_RECORDING || + msgCtx->ocarinaAction == OCARINA_ACTION_SCARECROW_SPAWN_RECORDING || msgCtx->ocarinaAction == OCARINA_ACTION_CHECK_NOWARP || msgCtx->ocarinaAction >= OCARINA_ACTION_CHECK_SARIA) { if (msgCtx->ocarinaAction == OCARINA_ACTION_FREE_PLAY || msgCtx->ocarinaAction == OCARINA_ACTION_CHECK_NOWARP) { - func_800ECC04(sOcarinaSongBitFlags + 0xC000); + AudioOcarina_Start(sOcarinaSongBitFlags + 0xC000); } else { // "On Stage Performance" osSyncPrintf("台上演奏\n"); - func_800ECC04(sOcarinaSongBitFlags); + AudioOcarina_Start(sOcarinaSongBitFlags); } } else { osSyncPrintf("Na_StartOcarinaSinglePlayCheck2( message->ocarina_no );\n"); - func_800ECC04((1 << msgCtx->ocarinaAction) + 0x8000); + AudioOcarina_Start((1 << msgCtx->ocarinaAction) + 0x8000); } msgCtx->msgMode = MSGMODE_OCARINA_PLAYING; } else if (msgCtx->msgMode == MSGMODE_SONG_DEMONSTRATION_STARTING) { msgCtx->stateTimer = 20; msgCtx->msgMode = MSGMODE_SONG_DEMONSTRATION_SELECT_INSTRUMENT; } else { - func_800ECC04((1 << (msgCtx->ocarinaAction + 0x11)) + 0x8000); + AudioOcarina_Start((1 << (msgCtx->ocarinaAction + 0x11)) + 0x8000); // "Performance Check" osSyncPrintf("演奏チェック=%d\n", msgCtx->ocarinaAction - OCARINA_ACTION_PLAYBACK_MINUET); msgCtx->msgMode = MSGMODE_SONG_PLAYBACK; @@ -2092,30 +2100,30 @@ void Message_DrawMain(GlobalContext* globalCtx, Gfx** p) { } break; case MSGMODE_OCARINA_PLAYING: - msgCtx->ocarinaStaff = Audio_OcaGetPlayingStaff(); + msgCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff(); if (msgCtx->ocarinaStaff->pos) { - osSyncPrintf("locate=%d onpu_pt=%d\n", msgCtx->ocarinaStaff->pos, sOcarinaNoteBufPos); - if (msgCtx->ocarinaStaff->pos == 1 && sOcarinaNoteBufPos == 8) { - sOcarinaNoteBufPos = 0; + osSyncPrintf("locate=%d onpu_pt=%d\n", msgCtx->ocarinaStaff->pos, sOcarinaButtonIndexBufPos); + if (msgCtx->ocarinaStaff->pos == 1 && sOcarinaButtonIndexBufPos == 8) { + sOcarinaButtonIndexBufPos = 0; } - if (sOcarinaNoteBufPos == msgCtx->ocarinaStaff->pos - 1) { - msgCtx->lastOcaNoteIdx = sOcarinaNoteBuf[msgCtx->ocarinaStaff->pos - 1] = - msgCtx->ocarinaStaff->noteIdx; - sOcarinaNoteBuf[msgCtx->ocarinaStaff->pos] = OCARINA_NOTE_INVALID; - sOcarinaNoteBufPos++; + if (sOcarinaButtonIndexBufPos == msgCtx->ocarinaStaff->pos - 1) { + msgCtx->lastOcarinaButtonIndex = sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos - 1] = + msgCtx->ocarinaStaff->buttonIndex; + sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos] = OCARINA_BTN_INVALID; + sOcarinaButtonIndexBufPos++; } } msgCtx->lastPlayedSong = msgCtx->ocarinaStaff->state; if (msgCtx->ocarinaStaff->state < OCARINA_SONG_MEMORY_GAME) { - if (msgCtx->ocarinaStaff->state == OCARINA_SONG_SCARECROW || + if (msgCtx->ocarinaStaff->state == OCARINA_SONG_SCARECROW_SPAWN || CHECK_QUEST_ITEM(QUEST_SONG_MINUET + gOcarinaSongItemMap[msgCtx->ocarinaStaff->state])) { sLastPlayedSong = msgCtx->unk_E3F2 = msgCtx->lastPlayedSong = msgCtx->ocarinaStaff->state; msgCtx->msgMode = MSGMODE_OCARINA_CORRECT_PLAYBACK; msgCtx->stateTimer = 20; if (msgCtx->ocarinaAction == OCARINA_ACTION_CHECK_NOWARP) { if (msgCtx->ocarinaStaff->state < OCARINA_SONG_SARIAS || - msgCtx->ocarinaStaff->state == OCARINA_SONG_SCARECROW) { - Audio_OcaSetInstrument(0); + msgCtx->ocarinaStaff->state == OCARINA_SONG_SCARECROW_SPAWN) { + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); Audio_PlaySoundGeneral(NA_SE_SY_OCARINA_ERROR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); @@ -2132,9 +2140,9 @@ void Message_DrawMain(GlobalContext* globalCtx, Gfx** p) { &gSfxDefaultReverb); Interface_ChangeAlpha(1); } - } else if (msgCtx->ocarinaAction == OCARINA_ACTION_CHECK_SCARECROW) { - if (msgCtx->ocarinaStaff->state < OCARINA_SONG_SCARECROW) { - Audio_OcaSetInstrument(0); + } else if (msgCtx->ocarinaAction == OCARINA_ACTION_CHECK_SCARECROW_SPAWN) { + if (msgCtx->ocarinaStaff->state < OCARINA_SONG_SCARECROW_SPAWN) { + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); Audio_PlaySoundGeneral(NA_SE_SY_OCARINA_ERROR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); @@ -2169,19 +2177,19 @@ void Message_DrawMain(GlobalContext* globalCtx, Gfx** p) { } Interface_ChangeAlpha(1); } else { - Audio_OcaSetInstrument(0); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); Audio_PlaySoundGeneral(NA_SE_SY_OCARINA_ERROR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); msgCtx->msgMode = MSGMODE_OCARINA_STARTING; } } else if (msgCtx->ocarinaStaff->state == 0xFF) { - Audio_OcaSetInstrument(0); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); Audio_PlaySoundGeneral(NA_SE_SY_OCARINA_ERROR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); msgCtx->stateTimer = 10; msgCtx->msgMode = MSGMODE_OCARINA_FAIL; } else if (CHECK_BTN_ALL(globalCtx->state.input[0].press.button, BTN_B)) { - Audio_OcaSetInstrument(0); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); globalCtx->msgCtx.ocarinaMode = OCARINA_MODE_04; Message_CloseTextbox(globalCtx); } @@ -2192,120 +2200,120 @@ void Message_DrawMain(GlobalContext* globalCtx, Gfx** p) { break; case MSGMODE_OCARINA_CORRECT_PLAYBACK: case MSGMODE_SONG_PLAYBACK_SUCCESS: - case MSGMODE_SCARECROW_RECORDING_DONE: - r = ABS(sOcarinaNoteAPrimR - sOcarinaNoteAPrimColors[sOcarinaNoteFlashColorIdx][0]) / + case MSGMODE_SCARECROW_SPAWN_RECORDING_DONE: + r = ABS(sOcarinaButtonAPrimR - sOcarinaButtonAPrimColors[sOcarinaNoteFlashColorIndex][0]) / sOcarinaNoteFlashTimer; - g = ABS(sOcarinaNoteAPrimG - sOcarinaNoteAPrimColors[sOcarinaNoteFlashColorIdx][1]) / + g = ABS(sOcarinaButtonAPrimG - sOcarinaButtonAPrimColors[sOcarinaNoteFlashColorIndex][1]) / sOcarinaNoteFlashTimer; - b = ABS(sOcarinaNoteAPrimB - sOcarinaNoteAPrimColors[sOcarinaNoteFlashColorIdx][2]) / + b = ABS(sOcarinaButtonAPrimB - sOcarinaButtonAPrimColors[sOcarinaNoteFlashColorIndex][2]) / sOcarinaNoteFlashTimer; - if (sOcarinaNoteAPrimR >= sOcarinaNoteAPrimColors[sOcarinaNoteFlashColorIdx][0]) { - sOcarinaNoteAPrimR -= r; + if (sOcarinaButtonAPrimR >= sOcarinaButtonAPrimColors[sOcarinaNoteFlashColorIndex][0]) { + sOcarinaButtonAPrimR -= r; } else { - sOcarinaNoteAPrimR += r; + sOcarinaButtonAPrimR += r; } - if (sOcarinaNoteAPrimG >= sOcarinaNoteAPrimColors[sOcarinaNoteFlashColorIdx][1]) { - sOcarinaNoteAPrimG -= g; + if (sOcarinaButtonAPrimG >= sOcarinaButtonAPrimColors[sOcarinaNoteFlashColorIndex][1]) { + sOcarinaButtonAPrimG -= g; } else { - sOcarinaNoteAPrimG += g; + sOcarinaButtonAPrimG += g; } - if (sOcarinaNoteAPrimB >= sOcarinaNoteAPrimColors[sOcarinaNoteFlashColorIdx][2]) { - sOcarinaNoteAPrimB -= b; + if (sOcarinaButtonAPrimB >= sOcarinaButtonAPrimColors[sOcarinaNoteFlashColorIndex][2]) { + sOcarinaButtonAPrimB -= b; } else { - sOcarinaNoteAPrimB += b; + sOcarinaButtonAPrimB += b; } - r = ABS(sOcarinaNoteAEnvR - sOcarinaNoteAEnvColors[sOcarinaNoteFlashColorIdx][0]) / + r = ABS(sOcarinaButtonAEnvR - sOcarinaButtonAEnvColors[sOcarinaNoteFlashColorIndex][0]) / sOcarinaNoteFlashTimer; - g = ABS(sOcarinaNoteAEnvG - sOcarinaNoteAEnvColors[sOcarinaNoteFlashColorIdx][1]) / + g = ABS(sOcarinaButtonAEnvG - sOcarinaButtonAEnvColors[sOcarinaNoteFlashColorIndex][1]) / sOcarinaNoteFlashTimer; - b = ABS(sOcarinaNoteAEnvB - sOcarinaNoteAEnvColors[sOcarinaNoteFlashColorIdx][2]) / + b = ABS(sOcarinaButtonAEnvB - sOcarinaButtonAEnvColors[sOcarinaNoteFlashColorIndex][2]) / sOcarinaNoteFlashTimer; - if (sOcarinaNoteCEnvR >= sOcarinaNoteAEnvColors[sOcarinaNoteFlashColorIdx][0]) { - sOcarinaNoteAEnvR -= r; + if (sOcarinaButtonCEnvR >= sOcarinaButtonAEnvColors[sOcarinaNoteFlashColorIndex][0]) { + sOcarinaButtonAEnvR -= r; } else { - sOcarinaNoteAEnvR += r; + sOcarinaButtonAEnvR += r; } - if (sOcarinaNoteCEnvG >= sOcarinaNoteAEnvColors[sOcarinaNoteFlashColorIdx][1]) { - sOcarinaNoteAEnvG -= g; + if (sOcarinaButtonCEnvG >= sOcarinaButtonAEnvColors[sOcarinaNoteFlashColorIndex][1]) { + sOcarinaButtonAEnvG -= g; } else { - sOcarinaNoteAEnvG += g; + sOcarinaButtonAEnvG += g; } - if (sOcarinaNoteCEnvB >= sOcarinaNoteAEnvColors[sOcarinaNoteFlashColorIdx][2]) { - sOcarinaNoteAEnvB -= b; + if (sOcarinaButtonCEnvB >= sOcarinaButtonAEnvColors[sOcarinaNoteFlashColorIndex][2]) { + sOcarinaButtonAEnvB -= b; } else { - sOcarinaNoteAEnvB += b; + sOcarinaButtonAEnvB += b; } - r = ABS(sOcarinaNoteCPrimR - sOcarinaNoteCPrimColors[sOcarinaNoteFlashColorIdx][0]) / + r = ABS(sOcarinaButtonCPrimR - sOcarinaButtonCPrimColors[sOcarinaNoteFlashColorIndex][0]) / sOcarinaNoteFlashTimer; - g = ABS(sOcarinaNoteCPrimG - sOcarinaNoteCPrimColors[sOcarinaNoteFlashColorIdx][1]) / + g = ABS(sOcarinaButtonCPrimG - sOcarinaButtonCPrimColors[sOcarinaNoteFlashColorIndex][1]) / sOcarinaNoteFlashTimer; - b = ABS(sOcarinaNoteCPrimB - sOcarinaNoteCPrimColors[sOcarinaNoteFlashColorIdx][2]) / + b = ABS(sOcarinaButtonCPrimB - sOcarinaButtonCPrimColors[sOcarinaNoteFlashColorIndex][2]) / sOcarinaNoteFlashTimer; - if (sOcarinaNoteCPrimR >= sOcarinaNoteCPrimColors[sOcarinaNoteFlashColorIdx][0]) { - sOcarinaNoteCPrimR -= r; + if (sOcarinaButtonCPrimR >= sOcarinaButtonCPrimColors[sOcarinaNoteFlashColorIndex][0]) { + sOcarinaButtonCPrimR -= r; } else { - sOcarinaNoteCPrimR += r; + sOcarinaButtonCPrimR += r; } - if (sOcarinaNoteCPrimG >= sOcarinaNoteCPrimColors[sOcarinaNoteFlashColorIdx][1]) { - sOcarinaNoteCPrimG -= g; + if (sOcarinaButtonCPrimG >= sOcarinaButtonCPrimColors[sOcarinaNoteFlashColorIndex][1]) { + sOcarinaButtonCPrimG -= g; } else { - sOcarinaNoteCPrimG += g; + sOcarinaButtonCPrimG += g; } - if (sOcarinaNoteCPrimB >= sOcarinaNoteCPrimColors[sOcarinaNoteFlashColorIdx][2]) { - sOcarinaNoteCPrimB -= b; + if (sOcarinaButtonCPrimB >= sOcarinaButtonCPrimColors[sOcarinaNoteFlashColorIndex][2]) { + sOcarinaButtonCPrimB -= b; } else { - sOcarinaNoteCPrimB += b; + sOcarinaButtonCPrimB += b; } - r = ABS(sOcarinaNoteCEnvR - sOcarinaNoteCEnvColors[sOcarinaNoteFlashColorIdx][0]) / + r = ABS(sOcarinaButtonCEnvR - sOcarinaButtonCEnvColors[sOcarinaNoteFlashColorIndex][0]) / sOcarinaNoteFlashTimer; - g = ABS(sOcarinaNoteCEnvG - sOcarinaNoteCEnvColors[sOcarinaNoteFlashColorIdx][1]) / + g = ABS(sOcarinaButtonCEnvG - sOcarinaButtonCEnvColors[sOcarinaNoteFlashColorIndex][1]) / sOcarinaNoteFlashTimer; - b = ABS(sOcarinaNoteCEnvB - sOcarinaNoteCEnvColors[sOcarinaNoteFlashColorIdx][2]) / + b = ABS(sOcarinaButtonCEnvB - sOcarinaButtonCEnvColors[sOcarinaNoteFlashColorIndex][2]) / sOcarinaNoteFlashTimer; - if (sOcarinaNoteCEnvR >= sOcarinaNoteCEnvColors[sOcarinaNoteFlashColorIdx][0]) { - sOcarinaNoteCEnvR -= r; + if (sOcarinaButtonCEnvR >= sOcarinaButtonCEnvColors[sOcarinaNoteFlashColorIndex][0]) { + sOcarinaButtonCEnvR -= r; } else { - sOcarinaNoteCEnvR += r; + sOcarinaButtonCEnvR += r; } - if (sOcarinaNoteCEnvG >= sOcarinaNoteCEnvColors[sOcarinaNoteFlashColorIdx][1]) { - sOcarinaNoteCEnvG -= g; + if (sOcarinaButtonCEnvG >= sOcarinaButtonCEnvColors[sOcarinaNoteFlashColorIndex][1]) { + sOcarinaButtonCEnvG -= g; } else { - sOcarinaNoteCEnvG += g; + sOcarinaButtonCEnvG += g; } - if (sOcarinaNoteCEnvB >= sOcarinaNoteCEnvColors[sOcarinaNoteFlashColorIdx][2]) { - sOcarinaNoteCEnvB -= b; + if (sOcarinaButtonCEnvB >= sOcarinaButtonCEnvColors[sOcarinaNoteFlashColorIndex][2]) { + sOcarinaButtonCEnvB -= b; } else { - sOcarinaNoteCEnvB += b; + sOcarinaButtonCEnvB += b; } sOcarinaNoteFlashTimer--; if (sOcarinaNoteFlashTimer == 0) { - sOcarinaNoteAPrimR = sOcarinaNoteAPrimColors[sOcarinaNoteFlashColorIdx][0]; - sOcarinaNoteAPrimG = sOcarinaNoteAPrimColors[sOcarinaNoteFlashColorIdx][1]; - sOcarinaNoteAPrimB = sOcarinaNoteAPrimColors[sOcarinaNoteFlashColorIdx][2]; - sOcarinaNoteAEnvR = sOcarinaNoteAEnvColors[sOcarinaNoteFlashColorIdx][0]; - sOcarinaNoteAEnvG = sOcarinaNoteAEnvColors[sOcarinaNoteFlashColorIdx][1]; - sOcarinaNoteAEnvB = sOcarinaNoteAEnvColors[sOcarinaNoteFlashColorIdx][2]; - sOcarinaNoteCPrimR = sOcarinaNoteCPrimColors[sOcarinaNoteFlashColorIdx][0]; - sOcarinaNoteCPrimG = sOcarinaNoteCPrimColors[sOcarinaNoteFlashColorIdx][1]; - sOcarinaNoteCPrimB = sOcarinaNoteCPrimColors[sOcarinaNoteFlashColorIdx][2]; - sOcarinaNoteCEnvR = sOcarinaNoteCEnvColors[sOcarinaNoteFlashColorIdx][0]; - sOcarinaNoteCEnvG = sOcarinaNoteCEnvColors[sOcarinaNoteFlashColorIdx][1]; - sOcarinaNoteCEnvB = sOcarinaNoteCEnvColors[sOcarinaNoteFlashColorIdx][2]; + sOcarinaButtonAPrimR = sOcarinaButtonAPrimColors[sOcarinaNoteFlashColorIndex][0]; + sOcarinaButtonAPrimG = sOcarinaButtonAPrimColors[sOcarinaNoteFlashColorIndex][1]; + sOcarinaButtonAPrimB = sOcarinaButtonAPrimColors[sOcarinaNoteFlashColorIndex][2]; + sOcarinaButtonAEnvR = sOcarinaButtonAEnvColors[sOcarinaNoteFlashColorIndex][0]; + sOcarinaButtonAEnvG = sOcarinaButtonAEnvColors[sOcarinaNoteFlashColorIndex][1]; + sOcarinaButtonAEnvB = sOcarinaButtonAEnvColors[sOcarinaNoteFlashColorIndex][2]; + sOcarinaButtonCPrimR = sOcarinaButtonCPrimColors[sOcarinaNoteFlashColorIndex][0]; + sOcarinaButtonCPrimG = sOcarinaButtonCPrimColors[sOcarinaNoteFlashColorIndex][1]; + sOcarinaButtonCPrimB = sOcarinaButtonCPrimColors[sOcarinaNoteFlashColorIndex][2]; + sOcarinaButtonCEnvR = sOcarinaButtonCEnvColors[sOcarinaNoteFlashColorIndex][0]; + sOcarinaButtonCEnvG = sOcarinaButtonCEnvColors[sOcarinaNoteFlashColorIndex][1]; + sOcarinaButtonCEnvB = sOcarinaButtonCEnvColors[sOcarinaNoteFlashColorIndex][2]; sOcarinaNoteFlashTimer = 3; - sOcarinaNoteFlashColorIdx ^= 1; + sOcarinaNoteFlashColorIndex ^= 1; } msgCtx->stateTimer--; if (msgCtx->stateTimer == 0) { - Audio_OcaSetInstrument(0); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); if (msgCtx->msgMode == MSGMODE_OCARINA_CORRECT_PLAYBACK) { // "Correct Example Performance" osSyncPrintf("正解模範演奏=%x\n", msgCtx->lastPlayedSong); @@ -2336,7 +2344,7 @@ void Message_DrawMain(GlobalContext* globalCtx, Gfx** p) { case MSGMODE_OCARINA_FAIL_NO_TEXT: msgCtx->stateTimer--; if (msgCtx->stateTimer == 0) { - R_OCARINA_NOTES_YPOS_OFFSET = 1; + R_OCARINA_BUTTONS_YPOS_OFFSET = 1; if (msgCtx->msgMode == MSGMODE_SONG_PLAYBACK_FAIL) { // "kokokokokoko" osSyncPrintf("ここここここ\n"); @@ -2353,14 +2361,15 @@ void Message_DrawMain(GlobalContext* globalCtx, Gfx** p) { case MSGMODE_OCARINA_NOTES_DROP: case MSGMODE_SONG_PLAYBACK_NOTES_DROP: for (i = 0; i < 5; i++) { - R_OCARINA_NOTES_YPOS(i) += R_OCARINA_NOTES_YPOS_OFFSET; + R_OCARINA_BUTTONS_YPOS(i) += R_OCARINA_BUTTONS_YPOS_OFFSET; } - R_OCARINA_NOTES_YPOS_OFFSET += R_OCARINA_NOTES_YPOS_OFFSET; - if (R_OCARINA_NOTES_YPOS_OFFSET >= 550) { - sOcarinaNoteBuf[0] = OCARINA_NOTE_INVALID; - sOcarinaNotesAlphaValues[0] = sOcarinaNotesAlphaValues[1] = sOcarinaNotesAlphaValues[2] = - sOcarinaNotesAlphaValues[3] = sOcarinaNotesAlphaValues[4] = sOcarinaNotesAlphaValues[5] = - sOcarinaNotesAlphaValues[6] = sOcarinaNotesAlphaValues[7] = sOcarinaNotesAlphaValues[8] = 0; + R_OCARINA_BUTTONS_YPOS_OFFSET += R_OCARINA_BUTTONS_YPOS_OFFSET; + if (R_OCARINA_BUTTONS_YPOS_OFFSET >= 550) { + sOcarinaButtonIndexBuf[0] = OCARINA_BTN_INVALID; + sOcarinaButtonAlphaValues[0] = sOcarinaButtonAlphaValues[1] = sOcarinaButtonAlphaValues[2] = + sOcarinaButtonAlphaValues[3] = sOcarinaButtonAlphaValues[4] = sOcarinaButtonAlphaValues[5] = + sOcarinaButtonAlphaValues[6] = sOcarinaButtonAlphaValues[7] = sOcarinaButtonAlphaValues[8] = + 0; if (msgCtx->msgMode == MSGMODE_SONG_PLAYBACK_NOTES_DROP) { msgCtx->msgMode = MSGMODE_OCARINA_AWAIT_INPUT; } else { @@ -2371,7 +2380,7 @@ void Message_DrawMain(GlobalContext* globalCtx, Gfx** p) { case MSGMODE_SONG_PLAYED: msgCtx->stateTimer--; if (msgCtx->stateTimer == 0) { - Audio_OcaSetInstrument(0); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); osSyncPrintf(VT_FGCOL(GREEN)); osSyncPrintf("Na_StopOcarinaMode();\n"); osSyncPrintf("Na_StopOcarinaMode();\n"); @@ -2379,8 +2388,8 @@ void Message_DrawMain(GlobalContext* globalCtx, Gfx** p) { osSyncPrintf(VT_RST); Message_Decode(globalCtx); msgCtx->msgMode = MSGMODE_SETUP_DISPLAY_SONG_PLAYED; - msgCtx->ocarinaStaff = Audio_OcaGetPlayingStaff(); - msgCtx->ocarinaStaff->pos = sOcarinaNoteBufPos = 0; + msgCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff(); + msgCtx->ocarinaStaff->pos = sOcarinaButtonIndexBufPos = 0; Message_ResetOcarinaNoteState(); if (msgCtx->lastPlayedSong >= OCARINA_SONG_SARIAS && msgCtx->lastPlayedSong < OCARINA_SONG_MEMORY_GAME) { @@ -2393,10 +2402,10 @@ void Message_DrawMain(GlobalContext* globalCtx, Gfx** p) { break; case MSGMODE_SETUP_DISPLAY_SONG_PLAYED: Message_DrawText(globalCtx, &gfx); - Audio_OcaSetInstrument(1); - Audio_OcaSetInstrument(1); - Audio_OcaSetSongPlayback(msgCtx->lastPlayedSong + 1, 1); - if (msgCtx->lastPlayedSong != OCARINA_SONG_SCARECROW) { + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT); + AudioOcarina_SetPlaybackSong(msgCtx->lastPlayedSong + 1, 1); + if (msgCtx->lastPlayedSong != OCARINA_SONG_SCARECROW_SPAWN) { Audio_PlayFanfare(sOcarinaSongFanfares[msgCtx->lastPlayedSong]); Audio_SetSoundBanksMute(0x20); } @@ -2407,7 +2416,7 @@ void Message_DrawMain(GlobalContext* globalCtx, Gfx** p) { if (msgCtx->ocarinaAction == OCARINA_ACTION_CHECK_NOWARP) { msgCtx->ocarinaAction = OCARINA_ACTION_CHECK_NOWARP_DONE; } - sOcarinaNoteBufPos = 0; + sOcarinaButtonIndexBufPos = 0; msgCtx->msgMode = MSGMODE_DISPLAY_SONG_PLAYED; break; case MSGMODE_SONG_DEMONSTRATION_SELECT_INSTRUMENT: @@ -2416,20 +2425,20 @@ void Message_DrawMain(GlobalContext* globalCtx, Gfx** p) { // "ocarina_no=%d Song Chosen=%d" osSyncPrintf("ocarina_no=%d 選曲=%d\n", msgCtx->ocarinaAction, 0x16); if (msgCtx->ocarinaAction < OCARINA_ACTION_TEACH_SARIA) { - Audio_OcaSetInstrument(4); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_HARP); } else if (msgCtx->ocarinaAction == OCARINA_ACTION_TEACH_EPONA) { - Audio_OcaSetInstrument(2); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_MALON); } else if (msgCtx->ocarinaAction == OCARINA_ACTION_TEACH_LULLABY) { - Audio_OcaSetInstrument(3); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_WHISTLE); } else if (msgCtx->ocarinaAction == OCARINA_ACTION_TEACH_STORMS) { - Audio_OcaSetInstrument(5); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_GRIND_ORGAN); } else { - Audio_OcaSetInstrument(1); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT); } // "Example Performance" osSyncPrintf("模範演奏=%x\n", msgCtx->ocarinaAction - OCARINA_ACTION_TEACH_MINUET); - Audio_OcaSetSongPlayback(msgCtx->ocarinaAction - OCARINA_ACTION_TEACH_MINUET + 1, 2); - sOcarinaNoteBufPos = 0; + AudioOcarina_SetPlaybackSong(msgCtx->ocarinaAction - OCARINA_ACTION_TEACH_MINUET + 1, 2); + sOcarinaButtonIndexBufPos = 0; msgCtx->msgMode = MSGMODE_SONG_DEMONSTRATION; } Message_DrawText(globalCtx, &gfx); @@ -2449,7 +2458,7 @@ void Message_DrawMain(GlobalContext* globalCtx, Gfx** p) { Message_DrawText(globalCtx, &gfx); break; case MSGMODE_SONG_PLAYED_ACT_BEGIN: - Audio_OcaSetInstrument(0); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); Message_ResetOcarinaNoteState(); msgCtx->msgMode = MSGMODE_SONG_PLAYED_ACT; msgCtx->stateTimer = 2; @@ -2481,7 +2490,7 @@ void Message_DrawMain(GlobalContext* globalCtx, Gfx** p) { msgCtx->ocarinaAction); if (msgCtx->ocarinaAction == OCARINA_ACTION_FREE_PLAY_DONE) { globalCtx->msgCtx.ocarinaMode = OCARINA_MODE_01; - if (msgCtx->lastPlayedSong == OCARINA_SONG_SCARECROW) { + if (msgCtx->lastPlayedSong == OCARINA_SONG_SCARECROW_SPAWN) { globalCtx->msgCtx.ocarinaMode = OCARINA_MODE_0B; } } else if (msgCtx->ocarinaAction >= OCARINA_ACTION_CHECK_MINUET) { @@ -2510,7 +2519,7 @@ void Message_DrawMain(GlobalContext* globalCtx, Gfx** p) { break; case MSGMODE_DISPLAY_SONG_PLAYED: case MSGMODE_SONG_DEMONSTRATION: - msgCtx->ocarinaStaff = Audio_OcaGetDisplayingStaff(); + msgCtx->ocarinaStaff = AudioOcarina_GetPlaybackStaff(); if (msgCtx->ocarinaStaff->state == 0) { if (msgCtx->msgMode == MSGMODE_DISPLAY_SONG_PLAYED) { msgCtx->msgMode = MSGMODE_DISPLAY_SONG_PLAYED_TEXT_BEGIN; @@ -2518,27 +2527,27 @@ void Message_DrawMain(GlobalContext* globalCtx, Gfx** p) { msgCtx->msgMode = MSGMODE_SONG_DEMONSTRATION_DONE; } osSyncPrintf("onpu_buff[%d]=%x\n", msgCtx->ocarinaStaff->pos, - sOcarinaNoteBuf[msgCtx->ocarinaStaff->pos]); + sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos]); } else { - if (sOcarinaNoteBufPos != 0 && msgCtx->ocarinaStaff->pos == 1) { - sOcarinaNoteBufPos = 0; + if (sOcarinaButtonIndexBufPos != 0 && msgCtx->ocarinaStaff->pos == 1) { + sOcarinaButtonIndexBufPos = 0; } - if (msgCtx->ocarinaStaff->pos && sOcarinaNoteBufPos == msgCtx->ocarinaStaff->pos - 1) { - msgCtx->lastOcaNoteIdx = sOcarinaNoteBuf[msgCtx->ocarinaStaff->pos - 1] = - msgCtx->ocarinaStaff->noteIdx; - sOcarinaNoteBuf[msgCtx->ocarinaStaff->pos] = OCARINA_NOTE_INVALID; - sOcarinaNoteBufPos++; + if (msgCtx->ocarinaStaff->pos && sOcarinaButtonIndexBufPos == msgCtx->ocarinaStaff->pos - 1) { + msgCtx->lastOcarinaButtonIndex = sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos - 1] = + msgCtx->ocarinaStaff->buttonIndex; + sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos] = OCARINA_BTN_INVALID; + sOcarinaButtonIndexBufPos++; } } case MSGMODE_SONG_DEMONSTRATION_DONE: Message_DrawText(globalCtx, &gfx); break; case MSGMODE_SONG_PLAYBACK: - msgCtx->ocarinaStaff = Audio_OcaGetPlayingStaff(); - if (msgCtx->ocarinaStaff->pos && sOcarinaNoteBufPos == msgCtx->ocarinaStaff->pos - 1) { - sOcarinaNoteBuf[msgCtx->ocarinaStaff->pos - 1] = msgCtx->ocarinaStaff->noteIdx; - sOcarinaNoteBuf[msgCtx->ocarinaStaff->pos] = OCARINA_NOTE_INVALID; - sOcarinaNoteBufPos++; + msgCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff(); + if (msgCtx->ocarinaStaff->pos && sOcarinaButtonIndexBufPos == msgCtx->ocarinaStaff->pos - 1) { + sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos - 1] = msgCtx->ocarinaStaff->buttonIndex; + sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos] = OCARINA_BTN_INVALID; + sOcarinaButtonIndexBufPos++; } if (msgCtx->ocarinaStaff->state < OCARINA_SONG_MEMORY_GAME) { osSyncPrintf("M_OCARINA20 : ocarina_no=%x status=%x\n", msgCtx->ocarinaAction, @@ -2570,46 +2579,49 @@ void Message_DrawMain(GlobalContext* globalCtx, Gfx** p) { case MSGMODE_SCARECROW_LONG_RECORDING_START: // "Scarecrow Recording Initialization" osSyncPrintf("案山子録音 初期化\n"); - Audio_OcaSetRecordingState(1); - Audio_OcaSetInstrument(1); - msgCtx->ocarinaStaff = Audio_OcaGetRecordingStaff(); - msgCtx->ocarinaStaff->pos = sOcarinaNoteBufPos = 0; - sOcarinaNoteBufLen = 0; + AudioOcarina_SetRecordingState(OCARINA_RECORD_SCARECROW_LONG); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT); + msgCtx->ocarinaStaff = AudioOcarina_GetRecordingStaff(); + msgCtx->ocarinaStaff->pos = sOcarinaButtonIndexBufPos = 0; + sOcarinaButtonIndexBufLen = 0; Message_ResetOcarinaNoteState(); msgCtx->msgMode = MSGMODE_SCARECROW_LONG_RECORDING_ONGOING; Message_DrawText(globalCtx, &gfx); break; case MSGMODE_SCARECROW_LONG_RECORDING_ONGOING: - msgCtx->ocarinaStaff = Audio_OcaGetRecordingStaff(); - osSyncPrintf("\nonpu_pt=%d, locate=%d", sOcarinaNoteBufPos, msgCtx->ocarinaStaff->pos); - if (msgCtx->ocarinaStaff->pos && sOcarinaNoteBufPos == msgCtx->ocarinaStaff->pos - 1) { - if (sOcarinaNoteBufLen >= 8) { - for (noteBufPos = sOcarinaNoteBufLen - 8, i = 0; i < 8; i++, noteBufPos++) { - sOcarinaNoteBuf[noteBufPos] = sOcarinaNoteBuf[noteBufPos + 1]; + msgCtx->ocarinaStaff = AudioOcarina_GetRecordingStaff(); + osSyncPrintf("\nonpu_pt=%d, locate=%d", sOcarinaButtonIndexBufPos, msgCtx->ocarinaStaff->pos); + if (msgCtx->ocarinaStaff->pos && sOcarinaButtonIndexBufPos == msgCtx->ocarinaStaff->pos - 1) { + if (sOcarinaButtonIndexBufLen >= 8) { + for (buttonIndexPos = sOcarinaButtonIndexBufLen - 8, i = 0; i < 8; i++, buttonIndexPos++) { + sOcarinaButtonIndexBuf[buttonIndexPos] = sOcarinaButtonIndexBuf[buttonIndexPos + 1]; } - sOcarinaNoteBufLen--; + sOcarinaButtonIndexBufLen--; } // "Button Entered" - osSyncPrintf(" 入力ボタン【%d】=%d", sOcarinaNoteBufLen, msgCtx->ocarinaStaff->noteIdx); - msgCtx->lastOcaNoteIdx = sOcarinaNoteBuf[sOcarinaNoteBufLen] = msgCtx->ocarinaStaff->noteIdx; - sOcarinaNoteBufLen++; - sOcarinaNoteBuf[sOcarinaNoteBufLen] = OCARINA_NOTE_INVALID; - sOcarinaNoteBufPos++; + osSyncPrintf(" 入力ボタン【%d】=%d", sOcarinaButtonIndexBufLen, + msgCtx->ocarinaStaff->buttonIndex); + msgCtx->lastOcarinaButtonIndex = sOcarinaButtonIndexBuf[sOcarinaButtonIndexBufLen] = + msgCtx->ocarinaStaff->buttonIndex; + sOcarinaButtonIndexBufLen++; + sOcarinaButtonIndexBuf[sOcarinaButtonIndexBufLen] = OCARINA_BTN_INVALID; + sOcarinaButtonIndexBufPos++; if (msgCtx->ocarinaStaff->pos == 8) { - sOcarinaNoteBufPos = 0; + sOcarinaButtonIndexBufPos = 0; } } - if (msgCtx->ocarinaStaff->state == 0 || CHECK_BTN_ALL(globalCtx->state.input[0].press.button, BTN_B)) { - if (sOcarinaNoteBufLen != 0) { + if (msgCtx->ocarinaStaff->state == OCARINA_RECORD_OFF || + CHECK_BTN_ALL(globalCtx->state.input[0].press.button, BTN_B)) { + if (sOcarinaButtonIndexBufLen != 0) { // "Recording complete!!!!!!!!!" osSyncPrintf("録音終了!!!!!!!!! message->info->status=%d \n", msgCtx->ocarinaStaff->state); - gSaveContext.scarecrowCustomSongSet = true; + gSaveContext.scarecrowLongSongSet = true; } Audio_PlaySoundGeneral(NA_SE_SY_OCARINA_ERROR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); osSyncPrintf("aaaaaaaaaaaaaa\n"); - Audio_OcaSetRecordingState(0); + AudioOcarina_SetRecordingState(OCARINA_RECORD_OFF); msgCtx->stateTimer = 10; globalCtx->msgCtx.ocarinaMode = OCARINA_MODE_04; Message_CloseTextbox(globalCtx); @@ -2617,10 +2629,10 @@ void Message_DrawMain(GlobalContext* globalCtx, Gfx** p) { osSyncPrintf("録音終了!!!!!!!!!録音終了\n"); osSyncPrintf(VT_FGCOL(YELLOW)); osSyncPrintf("\n====================================================================\n"); - MemCpy(gSaveContext.scarecrowCustomSong, gScarecrowCustomSongPtr, - sizeof(gSaveContext.scarecrowCustomSong)); - for (i = 0; i < ARRAY_COUNT(gSaveContext.scarecrowCustomSong); i++) { - osSyncPrintf("%d, ", gSaveContext.scarecrowCustomSong[i]); + MemCpy(gSaveContext.scarecrowLongSong, gScarecrowLongSongPtr, + sizeof(gSaveContext.scarecrowLongSong)); + for (i = 0; i < ARRAY_COUNT(gSaveContext.scarecrowLongSong); i++) { + osSyncPrintf("%d, ", gSaveContext.scarecrowLongSong[i]); } osSyncPrintf(VT_RST); osSyncPrintf("\n====================================================================\n"); @@ -2628,28 +2640,28 @@ void Message_DrawMain(GlobalContext* globalCtx, Gfx** p) { Message_DrawText(globalCtx, &gfx); break; case MSGMODE_SCARECROW_LONG_PLAYBACK: - case MSGMODE_SCARECROW_PLAYBACK: - msgCtx->ocarinaStaff = Audio_OcaGetDisplayingStaff(); - if (msgCtx->ocarinaStaff->pos && sOcarinaNoteBufPos == msgCtx->ocarinaStaff->pos - 1) { - if (sOcarinaNoteBufLen >= 8) { - for (noteBufPos = sOcarinaNoteBufLen - 8, i = 0; i < 8; i++, noteBufPos++) { - sOcarinaNoteBuf[noteBufPos] = sOcarinaNoteBuf[noteBufPos + 1]; + case MSGMODE_SCARECROW_SPAWN_PLAYBACK: + msgCtx->ocarinaStaff = AudioOcarina_GetPlaybackStaff(); + if (msgCtx->ocarinaStaff->pos && sOcarinaButtonIndexBufPos == msgCtx->ocarinaStaff->pos - 1) { + if (sOcarinaButtonIndexBufLen >= 8) { + for (buttonIndexPos = sOcarinaButtonIndexBufLen - 8, i = 0; i < 8; i++, buttonIndexPos++) { + sOcarinaButtonIndexBuf[buttonIndexPos] = sOcarinaButtonIndexBuf[buttonIndexPos + 1]; } - sOcarinaNoteBufLen--; + sOcarinaButtonIndexBufLen--; } - sOcarinaNoteBuf[sOcarinaNoteBufLen] = msgCtx->ocarinaStaff->noteIdx; - sOcarinaNoteBufLen++; - sOcarinaNoteBuf[sOcarinaNoteBufLen] = OCARINA_NOTE_INVALID; - sOcarinaNoteBufPos++; + sOcarinaButtonIndexBuf[sOcarinaButtonIndexBufLen] = msgCtx->ocarinaStaff->buttonIndex; + sOcarinaButtonIndexBufLen++; + sOcarinaButtonIndexBuf[sOcarinaButtonIndexBufLen] = OCARINA_BTN_INVALID; + sOcarinaButtonIndexBufPos++; if (msgCtx->ocarinaStaff->pos == 8) { - sOcarinaNoteBufLen = sOcarinaNoteBufPos = 0; + sOcarinaButtonIndexBufLen = sOcarinaButtonIndexBufPos = 0; } } osSyncPrintf("status=%d (%d)\n", msgCtx->ocarinaStaff->state, 0); if (msgCtx->stateTimer == 0) { if (msgCtx->ocarinaStaff->state == 0) { osSyncPrintf("bbbbbbbbbbb\n"); - Audio_OcaSetInstrument(0); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); globalCtx->msgCtx.ocarinaMode = OCARINA_MODE_0F; Message_CloseTextbox(globalCtx); } @@ -2657,25 +2669,26 @@ void Message_DrawMain(GlobalContext* globalCtx, Gfx** p) { msgCtx->stateTimer--; } break; - case MSGMODE_SCARECROW_RECORDING_START: - Audio_OcaSetRecordingState(2); - Audio_OcaSetInstrument(1); - msgCtx->msgMode = MSGMODE_SCARECROW_RECORDING_ONGOING; + case MSGMODE_SCARECROW_SPAWN_RECORDING_START: + AudioOcarina_SetRecordingState(OCARINA_RECORD_SCARECROW_SPAWN); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT); + msgCtx->msgMode = MSGMODE_SCARECROW_SPAWN_RECORDING_ONGOING; Message_DrawText(globalCtx, &gfx); break; - case MSGMODE_SCARECROW_RECORDING_ONGOING: - msgCtx->ocarinaStaff = Audio_OcaGetRecordingStaff(); - if (msgCtx->ocarinaStaff->pos && sOcarinaNoteBufPos == msgCtx->ocarinaStaff->pos - 1) { - msgCtx->lastOcaNoteIdx = sOcarinaNoteBuf[sOcarinaNoteBufPos] = msgCtx->ocarinaStaff->noteIdx; - sOcarinaNoteBufPos++; - sOcarinaNoteBuf[sOcarinaNoteBufPos] = OCARINA_NOTE_INVALID; + case MSGMODE_SCARECROW_SPAWN_RECORDING_ONGOING: + msgCtx->ocarinaStaff = AudioOcarina_GetRecordingStaff(); + if (msgCtx->ocarinaStaff->pos && sOcarinaButtonIndexBufPos == msgCtx->ocarinaStaff->pos - 1) { + msgCtx->lastOcarinaButtonIndex = sOcarinaButtonIndexBuf[sOcarinaButtonIndexBufPos] = + msgCtx->ocarinaStaff->buttonIndex; + sOcarinaButtonIndexBufPos++; + sOcarinaButtonIndexBuf[sOcarinaButtonIndexBufPos] = OCARINA_BTN_INVALID; } - if (msgCtx->ocarinaStaff->state == 0) { + if (msgCtx->ocarinaStaff->state == OCARINA_RECORD_OFF) { // "8 Note Recording OK!" osSyncPrintf("8音録音OK!\n"); msgCtx->stateTimer = 20; gSaveContext.scarecrowSpawnSongSet = true; - msgCtx->msgMode = MSGMODE_SCARECROW_RECORDING_DONE; + msgCtx->msgMode = MSGMODE_SCARECROW_SPAWN_RECORDING_DONE; Audio_PlaySoundGeneral(NA_SE_SY_TRE_BOX_APPEAR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); osSyncPrintf(VT_FGCOL(YELLOW)); @@ -2687,32 +2700,32 @@ void Message_DrawMain(GlobalContext* globalCtx, Gfx** p) { } osSyncPrintf(VT_RST); osSyncPrintf("\n====================================================================\n"); - } else if (msgCtx->ocarinaStaff->state == 0xFF || + } else if (msgCtx->ocarinaStaff->state == OCARINA_RECORD_REJECTED || CHECK_BTN_ALL(globalCtx->state.input[0].press.button, BTN_B)) { // "Played an existing song!!!" osSyncPrintf("すでに存在する曲吹いた!!! \n"); - Audio_OcaSetRecordingState(0); + AudioOcarina_SetRecordingState(OCARINA_RECORD_OFF); Audio_PlaySoundGeneral(NA_SE_SY_OCARINA_ERROR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); Message_CloseTextbox(globalCtx); - msgCtx->msgMode = MSGMODE_SCARECROW_RECORDING_FAILED; + msgCtx->msgMode = MSGMODE_SCARECROW_SPAWN_RECORDING_FAILED; } Message_DrawText(globalCtx, &gfx); break; - case MSGMODE_SCARECROW_RECORDING_FAILED: + case MSGMODE_SCARECROW_SPAWN_RECORDING_FAILED: osSyncPrintf("cccccccccccc\n"); - Audio_OcaSetInstrument(0); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); Message_StartTextbox(globalCtx, 0x40AD, NULL); // Bonooru doesn't remember your song globalCtx->msgCtx.ocarinaMode = OCARINA_MODE_04; break; case MSGMODE_MEMORY_GAME_START: - Audio_OcaSetInstrument(1); - Audio_OcaSetInstrument(6); - Audio_OcaMemoryGameStart(gSaveContext.ocarinaGameRoundNum); - msgCtx->ocarinaStaff = Audio_OcaGetDisplayingStaff(); - msgCtx->ocarinaStaff->pos = sOcarinaNoteBufPos = 0; + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_FLUTE); + AudioOcarina_MemoryGameInit(gSaveContext.ocarinaGameRoundNum); + msgCtx->ocarinaStaff = AudioOcarina_GetPlaybackStaff(); + msgCtx->ocarinaStaff->pos = sOcarinaButtonIndexBufPos = 0; Message_ResetOcarinaNoteState(); - Audio_OcaSetSongPlayback(OCARINA_SONG_MEMORY_GAME + 1, 1); + AudioOcarina_SetPlaybackSong(OCARINA_SONG_MEMORY_GAME + 1, 1); msgCtx->msgMode = MSGMODE_MEMORY_GAME_LEFT_SKULLKID_PLAYING; msgCtx->stateTimer = 2; break; @@ -2720,11 +2733,11 @@ void Message_DrawMain(GlobalContext* globalCtx, Gfx** p) { case MSGMODE_MEMORY_GAME_RIGHT_SKULLKID_PLAYING: Audio_PlaySoundGeneral(NA_SE_SY_METRONOME_LV - SFX_FLAG, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); - msgCtx->ocarinaStaff = Audio_OcaGetDisplayingStaff(); - if (msgCtx->ocarinaStaff->pos && sOcarinaNoteBufPos == msgCtx->ocarinaStaff->pos - 1) { - sOcarinaNoteBuf[msgCtx->ocarinaStaff->pos - 1] = msgCtx->ocarinaStaff->noteIdx; - sOcarinaNoteBuf[msgCtx->ocarinaStaff->pos] = OCARINA_NOTE_INVALID; - sOcarinaNoteBufPos++; + msgCtx->ocarinaStaff = AudioOcarina_GetPlaybackStaff(); + if (msgCtx->ocarinaStaff->pos && sOcarinaButtonIndexBufPos == msgCtx->ocarinaStaff->pos - 1) { + sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos - 1] = msgCtx->ocarinaStaff->buttonIndex; + sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos] = OCARINA_BTN_INVALID; + sOcarinaButtonIndexBufPos++; } if (msgCtx->stateTimer == 0) { if (msgCtx->ocarinaStaff->state == 0) { @@ -2744,31 +2757,31 @@ void Message_DrawMain(GlobalContext* globalCtx, Gfx** p) { break; case MSGMODE_MEMORY_GAME_LEFT_SKULLKID_WAIT: case MSGMODE_MEMORY_GAME_RIGHT_SKULLKID_WAIT: - msgCtx->ocarinaStaff = Audio_OcaGetDisplayingStaff(); - if (msgCtx->ocarinaStaff->pos && sOcarinaNoteBufPos == msgCtx->ocarinaStaff->pos - 1) { - sOcarinaNoteBuf[msgCtx->ocarinaStaff->pos - 1] = msgCtx->ocarinaStaff->noteIdx; - sOcarinaNoteBuf[msgCtx->ocarinaStaff->pos] = OCARINA_NOTE_INVALID; - sOcarinaNoteBufPos++; + msgCtx->ocarinaStaff = AudioOcarina_GetPlaybackStaff(); + if (msgCtx->ocarinaStaff->pos && sOcarinaButtonIndexBufPos == msgCtx->ocarinaStaff->pos - 1) { + sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos - 1] = msgCtx->ocarinaStaff->buttonIndex; + sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos] = OCARINA_BTN_INVALID; + sOcarinaButtonIndexBufPos++; } break; case MSGMODE_MEMORY_GAME_PLAYER_PLAYING: Audio_PlaySoundGeneral(NA_SE_SY_METRONOME_LV - SFX_FLAG, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); - msgCtx->ocarinaStaff = Audio_OcaGetPlayingStaff(); - if (msgCtx->ocarinaStaff->pos && sOcarinaNoteBufPos == msgCtx->ocarinaStaff->pos - 1) { - sOcarinaNoteBuf[msgCtx->ocarinaStaff->pos - 1] = msgCtx->ocarinaStaff->noteIdx; - sOcarinaNoteBuf[msgCtx->ocarinaStaff->pos] = OCARINA_NOTE_INVALID; - sOcarinaNoteBufPos++; + msgCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff(); + if (msgCtx->ocarinaStaff->pos && sOcarinaButtonIndexBufPos == msgCtx->ocarinaStaff->pos - 1) { + sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos - 1] = msgCtx->ocarinaStaff->buttonIndex; + sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos] = OCARINA_BTN_INVALID; + sOcarinaButtonIndexBufPos++; } if (msgCtx->ocarinaStaff->state == 0xFF) { // "Musical round failed!!!!!!!!!" osSyncPrintf("輪唱失敗!!!!!!!!!\n"); - Audio_OcaSetInstrument(0); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); Audio_PlaySoundGeneral(NA_SE_SY_OCARINA_ERROR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); msgCtx->stateTimer = 10; globalCtx->msgCtx.ocarinaMode = OCARINA_MODE_03; - } else if (msgCtx->ocarinaStaff->state == 0xD) { + } else if (msgCtx->ocarinaStaff->state == OCARINA_SONG_MEMORY_GAME) { // "Musical round succeeded!!!!!!!!!" osSyncPrintf("輪唱成功!!!!!!!!!\n"); Audio_PlaySoundGeneral(NA_SE_SY_GET_ITEM, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, @@ -2779,19 +2792,19 @@ void Message_DrawMain(GlobalContext* globalCtx, Gfx** p) { Message_DrawText(globalCtx, &gfx); break; case MSGMODE_MEMORY_GAME_ROUND_SUCCESS: - msgCtx->ocarinaStaff = Audio_OcaGetPlayingStaff(); - if (msgCtx->ocarinaStaff->pos && sOcarinaNoteBufPos == msgCtx->ocarinaStaff->pos - 1) { - sOcarinaNoteBuf[msgCtx->ocarinaStaff->pos - 1] = msgCtx->ocarinaStaff->noteIdx; - sOcarinaNoteBuf[msgCtx->ocarinaStaff->pos] = OCARINA_NOTE_INVALID; - sOcarinaNoteBufPos++; + msgCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff(); + if (msgCtx->ocarinaStaff->pos && sOcarinaButtonIndexBufPos == msgCtx->ocarinaStaff->pos - 1) { + sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos - 1] = msgCtx->ocarinaStaff->buttonIndex; + sOcarinaButtonIndexBuf[msgCtx->ocarinaStaff->pos] = OCARINA_BTN_INVALID; + sOcarinaButtonIndexBufPos++; } msgCtx->stateTimer--; if (msgCtx->stateTimer == 0) { - if (Audio_OcaMemoryGameGenNote() != 1) { + if (AudioOcarina_MemoryGameNextNote() != 1) { Audio_PlaySoundGeneral(NA_SE_SY_METRONOME, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); - msgCtx->ocarinaStaff = Audio_OcaGetPlayingStaff(); - msgCtx->ocarinaStaff->pos = sOcarinaNoteBufPos = 0; + msgCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff(); + msgCtx->ocarinaStaff->pos = sOcarinaButtonIndexBufPos = 0; Message_ResetOcarinaNoteState(); msgCtx->msgMode = MSGMODE_MEMORY_GAME_START_NEXT_ROUND; } else { @@ -2802,26 +2815,26 @@ void Message_DrawMain(GlobalContext* globalCtx, Gfx** p) { break; case MSGMODE_MEMORY_GAME_START_NEXT_ROUND: if (!Audio_IsSfxPlaying(NA_SE_SY_METRONOME)) { - msgCtx->ocarinaStaff = Audio_OcaGetDisplayingStaff(); - msgCtx->ocarinaStaff->pos = sOcarinaNoteBufPos = 0; + msgCtx->ocarinaStaff = AudioOcarina_GetPlaybackStaff(); + msgCtx->ocarinaStaff->pos = sOcarinaButtonIndexBufPos = 0; Message_ResetOcarinaNoteState(); - Audio_OcaSetSongPlayback(OCARINA_SONG_MEMORY_GAME + 1, 1); + AudioOcarina_SetPlaybackSong(OCARINA_SONG_MEMORY_GAME + 1, 1); } break; case MSGMODE_FROGS_START: - Audio_OcaSetInstrument(1); - msgCtx->ocarinaStaff = Audio_OcaGetPlayingStaff(); - msgCtx->ocarinaStaff->pos = sOcarinaNoteBufPos = 0; + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT); + msgCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff(); + msgCtx->ocarinaStaff->pos = sOcarinaButtonIndexBufPos = 0; globalCtx->msgCtx.ocarinaMode = OCARINA_MODE_01; Message_ResetOcarinaNoteState(); - func_800ECC04(sOcarinaSongBitFlags + 0xC000); + AudioOcarina_Start(sOcarinaSongBitFlags + 0xC000); msgCtx->msgMode = MSGMODE_FROGS_PLAYING; break; case MSGMODE_FROGS_PLAYING: - msgCtx->ocarinaStaff = Audio_OcaGetPlayingStaff(); - if (msgCtx->ocarinaStaff->pos && sOcarinaNoteBufPos == msgCtx->ocarinaStaff->pos - 1) { - msgCtx->lastOcaNoteIdx = msgCtx->ocarinaStaff->noteIdx; - msgCtx->ocarinaStaff->pos = sOcarinaNoteBufPos = 0; + msgCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff(); + if (msgCtx->ocarinaStaff->pos && sOcarinaButtonIndexBufPos == msgCtx->ocarinaStaff->pos - 1) { + msgCtx->lastOcarinaButtonIndex = msgCtx->ocarinaStaff->buttonIndex; + msgCtx->ocarinaStaff->pos = sOcarinaButtonIndexBufPos = 0; Message_ResetOcarinaNoteState(); msgCtx->msgMode = MSGMODE_FROGS_WAITING; } @@ -2873,56 +2886,58 @@ void Message_DrawMain(GlobalContext* globalCtx, Gfx** p) { if (msgCtx->msgMode == MSGMODE_SONG_PLAYBACK) { g = msgCtx->ocarinaAction - OCARINA_ACTION_PLAYBACK_MINUET; - r = gOcarinaSongNotes[g].len; - for (notePosX = R_OCARINA_NOTES_XPOS, i = 0; i < r; i++, notePosX += R_OCARINA_NOTES_XPOS_OFFSET) { + r = gOcarinaSongButtons[g].numButtons; + for (notePosX = R_OCARINA_BUTTONS_XPOS, i = 0; i < r; i++, notePosX += R_OCARINA_BUTTONS_XPOS_OFFSET) { gDPPipeSync(gfx++); gDPSetPrimColor(gfx++, 0, 0, 150, 150, 150, 150); gDPSetEnvColor(gfx++, 10, 10, 10, 0); - gDPLoadTextureBlock(gfx++, sOcarinaNoteTextures[gOcarinaSongNotes[g].notesIdx[i]], G_IM_FMT_IA, - G_IM_SIZ_8b, 16, 16, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, - G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + gDPLoadTextureBlock(gfx++, sOcarinaNoteTextures[gOcarinaSongButtons[g].buttonsIndex[i]], + G_IM_FMT_IA, G_IM_SIZ_8b, 16, 16, 0, G_TX_NOMIRROR | G_TX_WRAP, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); - gSPTextureRectangle( - gfx++, notePosX << 2, R_OCARINA_NOTES_YPOS(gOcarinaSongNotes[g].notesIdx[i]) << 2, - (notePosX + 16) << 2, (R_OCARINA_NOTES_YPOS(gOcarinaSongNotes[g].notesIdx[i]) + 16) << 2, - G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); + gSPTextureRectangle(gfx++, notePosX << 2, + R_OCARINA_BUTTONS_YPOS(gOcarinaSongButtons[g].buttonsIndex[i]) << 2, + (notePosX + 16) << 2, + (R_OCARINA_BUTTONS_YPOS(gOcarinaSongButtons[g].buttonsIndex[i]) + 16) << 2, + G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); } } if (msgCtx->msgMode != MSGMODE_SCARECROW_LONG_RECORDING_START && msgCtx->msgMode != MSGMODE_MEMORY_GAME_START) { - for (notePosX = R_OCARINA_NOTES_XPOS, i = 0; i < 8; i++, notePosX += R_OCARINA_NOTES_XPOS_OFFSET) { - if (sOcarinaNoteBuf[i] == OCARINA_NOTE_INVALID) { + for (notePosX = R_OCARINA_BUTTONS_XPOS, i = 0; i < 8; i++, notePosX += R_OCARINA_BUTTONS_XPOS_OFFSET) { + if (sOcarinaButtonIndexBuf[i] == OCARINA_BTN_INVALID) { break; } if (1) {} - if (sOcarinaNotesAlphaValues[i] != 255) { - sOcarinaNotesAlphaValues[i] += VREG(50); - if (sOcarinaNotesAlphaValues[i] >= 255) { - sOcarinaNotesAlphaValues[i] = 255; + if (sOcarinaButtonAlphaValues[i] != 255) { + sOcarinaButtonAlphaValues[i] += VREG(50); + if (sOcarinaButtonAlphaValues[i] >= 255) { + sOcarinaButtonAlphaValues[i] = 255; } } gDPPipeSync(gfx++); - if (sOcarinaNoteBuf[i] == OCARINA_NOTE_A) { - gDPSetPrimColor(gfx++, 0, 0, sOcarinaNoteAPrimR, sOcarinaNoteAPrimG, sOcarinaNoteAPrimB, - sOcarinaNotesAlphaValues[i]); - gDPSetEnvColor(gfx++, sOcarinaNoteAEnvR, sOcarinaNoteAEnvG, sOcarinaNoteAEnvB, 0); + if (sOcarinaButtonIndexBuf[i] == OCARINA_BTN_A) { + gDPSetPrimColor(gfx++, 0, 0, sOcarinaButtonAPrimR, sOcarinaButtonAPrimG, sOcarinaButtonAPrimB, + sOcarinaButtonAlphaValues[i]); + gDPSetEnvColor(gfx++, sOcarinaButtonAEnvR, sOcarinaButtonAEnvG, sOcarinaButtonAEnvB, 0); } else { - gDPSetPrimColor(gfx++, 0, 0, sOcarinaNoteCPrimR, sOcarinaNoteCPrimG, sOcarinaNoteCPrimB, - sOcarinaNotesAlphaValues[i]); - gDPSetEnvColor(gfx++, sOcarinaNoteCEnvR, sOcarinaNoteCEnvG, sOcarinaNoteCEnvB, 0); + gDPSetPrimColor(gfx++, 0, 0, sOcarinaButtonCPrimR, sOcarinaButtonCPrimG, sOcarinaButtonCPrimB, + sOcarinaButtonAlphaValues[i]); + gDPSetEnvColor(gfx++, sOcarinaButtonCEnvR, sOcarinaButtonCEnvG, sOcarinaButtonCEnvB, 0); } - gDPLoadTextureBlock(gfx++, sOcarinaNoteTextures[sOcarinaNoteBuf[i]], G_IM_FMT_IA, G_IM_SIZ_8b, 16, - 16, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, - G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + gDPLoadTextureBlock(gfx++, sOcarinaNoteTextures[sOcarinaButtonIndexBuf[i]], G_IM_FMT_IA, + G_IM_SIZ_8b, 16, 16, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, + G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); - gSPTextureRectangle(gfx++, notePosX << 2, R_OCARINA_NOTES_YPOS(sOcarinaNoteBuf[i]) << 2, - (notePosX + 16) << 2, (R_OCARINA_NOTES_YPOS(sOcarinaNoteBuf[i]) + 16) << 2, - G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10); + gSPTextureRectangle(gfx++, notePosX << 2, R_OCARINA_BUTTONS_YPOS(sOcarinaButtonIndexBuf[i]) << 2, + (notePosX + 16) << 2, + (R_OCARINA_BUTTONS_YPOS(sOcarinaButtonIndexBuf[i]) + 16) << 2, G_TX_RENDERTILE, + 0, 0, 1 << 10, 1 << 10); } } } @@ -2989,7 +3004,7 @@ void Message_Draw(GlobalContext* globalCtx) { OPEN_DISPS(globalCtx->state.gfxCtx, "../z_message_PAL.c", 3554); - watchVar = gSaveContext.scarecrowCustomSongSet; + watchVar = gSaveContext.scarecrowLongSongSet; Message_DrawDebugVariableChanged(&watchVar, globalCtx->state.gfxCtx); if (BREG(0) != 0 && globalCtx->msgCtx.textId != 0) { plusOne = Graph_GfxPlusOne(polyOpaP = POLY_OPA_DISP); @@ -3316,7 +3331,7 @@ void Message_Update(GlobalContext* globalCtx) { case MSGMODE_PAUSED: break; default: - msgCtx->lastOcaNoteIdx = OCARINA_NOTE_INVALID; + msgCtx->lastOcarinaButtonIndex = OCARINA_BTN_INVALID; break; } } diff --git a/src/code/z_sram.c b/src/code/z_sram.c index 1277b06ea9..21664a53d3 100644 --- a/src/code/z_sram.c +++ b/src/code/z_sram.c @@ -47,8 +47,8 @@ typedef struct { /* 0x0F18 */ char unk_F18[0x04]; /* 0x0F1C */ u32 worldMapAreaData; // "area_arrival" /* 0x0F20 */ char unk_F20[0x4]; - /* 0x0F24 */ u8 scarecrowCustomSongSet; - /* 0x0F25 */ u8 scarecrowCustomSong[0x360]; + /* 0x0F24 */ u8 scarecrowLongSongSet; + /* 0x0F25 */ u8 scarecrowLongSong[0x360]; /* 0x1285 */ char unk_1285[0x24]; /* 0x12A9 */ u8 scarecrowSpawnSongSet; /* 0x12AA */ u8 scarecrowSpawnSong[0x80]; @@ -393,14 +393,14 @@ void Sram_OpenSave(SramContext* sramCtx) { gSaveContext.health = 0x30; } - if (gSaveContext.scarecrowCustomSongSet) { + if (gSaveContext.scarecrowLongSongSet) { osSyncPrintf(VT_FGCOL(BLUE)); osSyncPrintf("\n====================================================================\n"); - MemCpy(gScarecrowCustomSongPtr, gSaveContext.scarecrowCustomSong, sizeof(gSaveContext.scarecrowCustomSong)); + MemCpy(gScarecrowLongSongPtr, gSaveContext.scarecrowLongSong, sizeof(gSaveContext.scarecrowLongSong)); - ptr = (u8*)gScarecrowCustomSongPtr; - for (i = 0; i < ARRAY_COUNT(gSaveContext.scarecrowCustomSong); i++, ptr++) { + ptr = (u8*)gScarecrowLongSongPtr; + for (i = 0; i < ARRAY_COUNT(gSaveContext.scarecrowLongSong); i++, ptr++) { osSyncPrintf("%d, ", *ptr); } diff --git a/src/overlays/actors/ovl_En_Fr/z_en_fr.c b/src/overlays/actors/ovl_En_Fr/z_en_fr.c index a9efc555cf..18521e40ed 100644 --- a/src/overlays/actors/ovl_En_Fr/z_en_fr.c +++ b/src/overlays/actors/ovl_En_Fr/z_en_fr.c @@ -208,7 +208,7 @@ static u8 sJumpOrder[] = { }; static u8 sOcarinaNotes[] = { - OCARINA_NOTE_A, OCARINA_NOTE_C_DOWN, OCARINA_NOTE_C_RIGHT, OCARINA_NOTE_C_LEFT, OCARINA_NOTE_C_UP, + OCARINA_BTN_A, OCARINA_BTN_C_DOWN, OCARINA_BTN_C_RIGHT, OCARINA_BTN_C_LEFT, OCARINA_BTN_C_UP, }; void EnFr_OrientUnderwater(EnFr* this) { @@ -696,21 +696,22 @@ void EnFr_ListeningToOcarinaNotes(EnFr* this, GlobalContext* globalCtx) { case OCARINA_MODE_04: EnFr_OcarinaMistake(this, globalCtx); break; - case OCARINA_MODE_01: // Ocarina note played, but no song played - switch (globalCtx->msgCtx.lastOcaNoteIdx) { // Jumping frogs in open ocarina based on ocarina note played - case OCARINA_NOTE_A: + case OCARINA_MODE_01: // Ocarina note played, but no song played + switch (globalCtx->msgCtx.lastOcarinaButtonIndex) { + // Jumping frogs in open ocarina based on ocarina note played + case OCARINA_BTN_A: EnFr_SetupJumpingUp(this, FROG_BLUE); break; - case OCARINA_NOTE_C_DOWN: + case OCARINA_BTN_C_DOWN: EnFr_SetupJumpingUp(this, FROG_YELLOW); break; - case OCARINA_NOTE_C_RIGHT: + case OCARINA_BTN_C_RIGHT: EnFr_SetupJumpingUp(this, FROG_RED); break; - case OCARINA_NOTE_C_LEFT: + case OCARINA_BTN_C_LEFT: EnFr_SetupJumpingUp(this, FROG_PURPLE); break; - case OCARINA_NOTE_C_UP: + case OCARINA_BTN_C_UP: EnFr_SetupJumpingUp(this, FROG_WHITE); break; } @@ -834,7 +835,7 @@ s32 EnFr_IsFrogSongComplete(EnFr* this, GlobalContext* globalCtx) { MessageContext* msgCtx = &globalCtx->msgCtx; u8 ocarinaNoteIndex; - if (this->ocarinaNote == (*msgCtx).lastOcaNoteIdx) { // required to match, possibly an array? + if (this->ocarinaNote == (*msgCtx).lastOcarinaButtonIndex) { // required to match, possibly an array? this->ocarinaNoteIndex++; ocarinaNoteIndex = this->ocarinaNoteIndex; if (1) {} @@ -856,7 +857,7 @@ void EnFr_OcarinaMistake(EnFr* this, GlobalContext* globalCtx) { Message_CloseTextbox(globalCtx); this->reward = GI_NONE; func_80078884(NA_SE_SY_OCARINA_ERROR); - Audio_OcaSetInstrument(0); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); sEnFrPointers.flags = 12; EnFr_DeactivateButterfly(); this->actionFunc = EnFr_Deactivate; @@ -889,20 +890,20 @@ void EnFr_ContinueFrogSong(EnFr* this, GlobalContext* globalCtx) { if (globalCtx->msgCtx.msgMode == MSGMODE_FROGS_WAITING) { globalCtx->msgCtx.msgMode = MSGMODE_FROGS_START; - switch (globalCtx->msgCtx.lastOcaNoteIdx) { - case OCARINA_NOTE_A: + switch (globalCtx->msgCtx.lastOcarinaButtonIndex) { + case OCARINA_BTN_A: EnFr_SetupJumpingUp(this, FROG_BLUE); break; - case OCARINA_NOTE_C_DOWN: + case OCARINA_BTN_C_DOWN: EnFr_SetupJumpingUp(this, FROG_YELLOW); break; - case OCARINA_NOTE_C_RIGHT: + case OCARINA_BTN_C_RIGHT: EnFr_SetupJumpingUp(this, FROG_RED); break; - case OCARINA_NOTE_C_LEFT: + case OCARINA_BTN_C_LEFT: EnFr_SetupJumpingUp(this, FROG_PURPLE); break; - case OCARINA_NOTE_C_UP: + case OCARINA_BTN_C_UP: EnFr_SetupJumpingUp(this, FROG_WHITE); } if (EnFr_IsFrogSongComplete(this, globalCtx)) { @@ -921,7 +922,7 @@ void EnFr_SetupReward(EnFr* this, GlobalContext* globalCtx, u8 unkCondition) { func_80078884(NA_SE_SY_CORRECT_CHIME); } - Audio_OcaSetInstrument(0); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); globalCtx->msgCtx.msgMode = MSGMODE_PAUSED; this->actionFunc = EnFr_PrintTextBox; } diff --git a/src/overlays/actors/ovl_En_Fu/z_en_fu.c b/src/overlays/actors/ovl_En_Fu/z_en_fu.c index a1e2cbc597..5c27b04509 100644 --- a/src/overlays/actors/ovl_En_Fu/z_en_fu.c +++ b/src/overlays/actors/ovl_En_Fu/z_en_fu.c @@ -203,7 +203,8 @@ void EnFu_TeachSong(EnFu* this, GlobalContext* globalCtx) { // if dialog state is 2, start song demonstration if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CLOSING) { this->behaviorFlags &= ~FU_WAIT; - Audio_OcaSetInstrument(4); // seems to be related to setting instrument type + // Ocarina is set to harp here but is immediately overwritten to the grind organ in the message system + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_HARP); func_8010BD58(globalCtx, OCARINA_ACTION_TEACH_STORMS); this->actionFunc = EnFu_WaitForPlayback; } 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 5fb3e783d6..783010a8e1 100644 --- a/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c +++ b/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c @@ -92,7 +92,7 @@ void func_80A8F28C(EnKakasi* this) { } void func_80A8F320(EnKakasi* this, GlobalContext* globalCtx, s16 arg) { - s16 ocarinaNote = globalCtx->msgCtx.lastOcaNoteIdx; + s16 ocarinaNote = globalCtx->msgCtx.lastOcarinaButtonIndex; s16 currentFrame; if (arg != 0) { @@ -105,30 +105,30 @@ void func_80A8F320(EnKakasi* this, GlobalContext* globalCtx, s16 arg) { ocarinaNote = this->unk_1A6; } switch (ocarinaNote) { - case OCARINA_NOTE_A: + case OCARINA_BTN_A: this->unk_19A++; if (this->unk_1A4 == 0) { this->unk_1A4 = 1; Audio_PlayActorSound2(&this->actor, NA_SE_EV_KAKASHI_ROLL); } break; - case OCARINA_NOTE_C_DOWN: + case OCARINA_BTN_C_DOWN: this->unk_19A++; this->unk_1B8 = 1.0f; break; - case OCARINA_NOTE_C_RIGHT: + case OCARINA_BTN_C_RIGHT: this->unk_19A++; if (this->unk_1AC == 0) { this->unk_1AC = 0x1388; } break; - case OCARINA_NOTE_C_LEFT: + case OCARINA_BTN_C_LEFT: this->unk_19A++; if (this->unk_1A8 == 0) { this->unk_1A8 = 0x1388; } break; - case OCARINA_NOTE_C_UP: + case OCARINA_BTN_C_UP: this->unk_19A++; this->unk_1B8 = 2.0f; break; @@ -178,13 +178,13 @@ void func_80A8F660(EnKakasi* this, GlobalContext* globalCtx) { this->unk_196 = TEXT_STATE_DONE; if (!LINK_IS_ADULT) { this->unk_194 = false; - if (gSaveContext.scarecrowCustomSongSet) { + if (gSaveContext.scarecrowLongSongSet) { this->actor.textId = 0x407A; this->unk_196 = TEXT_STATE_EVENT; } } else { this->unk_194 = true; - if (gSaveContext.scarecrowCustomSongSet) { + if (gSaveContext.scarecrowLongSongSet) { this->actor.textId = 0x4079; this->unk_196 = TEXT_STATE_EVENT; } @@ -341,7 +341,7 @@ void EnKakasi_Draw(Actor* thisx, GlobalContext* globalCtx) { if (BREG(3) != 0) { osSyncPrintf("\n\n"); // "flag!" - osSyncPrintf(VT_FGCOL(YELLOW) "☆☆☆☆☆ フラグ! ☆☆☆☆☆ %d\n" VT_RST, gSaveContext.scarecrowCustomSongSet); + osSyncPrintf(VT_FGCOL(YELLOW) "☆☆☆☆☆ フラグ! ☆☆☆☆☆ %d\n" VT_RST, gSaveContext.scarecrowLongSongSet); } func_80093D18(globalCtx->state.gfxCtx); SkelAnime_DrawFlexOpa(globalCtx, this->skelanime.skeleton, this->skelanime.jointTable, this->skelanime.dListCount, diff --git a/src/overlays/actors/ovl_En_Kakasi3/z_en_kakasi3.c b/src/overlays/actors/ovl_En_Kakasi3/z_en_kakasi3.c index e9db2b2b6e..8eb1c67b91 100644 --- a/src/overlays/actors/ovl_En_Kakasi3/z_en_kakasi3.c +++ b/src/overlays/actors/ovl_En_Kakasi3/z_en_kakasi3.c @@ -96,7 +96,7 @@ void func_80A90E28(EnKakasi3* this) { void func_80A90EBC(EnKakasi3* this, GlobalContext* globalCtx, s32 arg) { s16 currentFrame; - s16 ocarinaNote = globalCtx->msgCtx.lastOcaNoteIdx; + s16 ocarinaNote = globalCtx->msgCtx.lastOcarinaButtonIndex; if (arg != 0) { if (this->unk_19C[3] == 0) { @@ -108,30 +108,30 @@ void func_80A90EBC(EnKakasi3* this, GlobalContext* globalCtx, s32 arg) { ocarinaNote = this->unk_1A6; } switch (ocarinaNote) { - case OCARINA_NOTE_A: + case OCARINA_BTN_A: this->unk_19A++; if (this->unk_1A4 == 0) { this->unk_1A4 = 1; Audio_PlayActorSound2(&this->actor, NA_SE_EV_KAKASHI_ROLL); } break; - case OCARINA_NOTE_C_DOWN: + case OCARINA_BTN_C_DOWN: this->unk_19A++; this->unk_1B8 = 1.0f; break; - case OCARINA_NOTE_C_RIGHT: + case OCARINA_BTN_C_RIGHT: this->unk_19A++; if (this->unk_1AE == 0x0) { this->unk_1AE = 0x1388; } break; - case OCARINA_NOTE_C_LEFT: + case OCARINA_BTN_C_LEFT: this->unk_19A++; if (this->unk_1AA == 0x0) { this->unk_1AA = 0x1388; } break; - case OCARINA_NOTE_C_UP: + case OCARINA_BTN_C_UP: this->unk_19A++; this->unk_1B8 = 2.0f; break; @@ -269,7 +269,7 @@ void func_80A91348(EnKakasi3* this, GlobalContext* globalCtx) { void func_80A915B8(EnKakasi3* this, GlobalContext* globalCtx) { if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_EVENT && Message_ShouldAdvance(globalCtx)) { Message_CloseTextbox(globalCtx); - func_8010BD58(globalCtx, OCARINA_ACTION_SCARECROW_RECORDING); + func_8010BD58(globalCtx, OCARINA_ACTION_SCARECROW_SPAWN_RECORDING); this->actionFunc = func_80A91620; } } @@ -312,7 +312,7 @@ void func_80A91760(EnKakasi3* this, GlobalContext* globalCtx) { SkelAnime_Update(&this->skelAnime); if (this->dialogState == Message_GetState(&globalCtx->msgCtx) && Message_ShouldAdvance(globalCtx)) { globalCtx->msgCtx.msgMode = MSGMODE_PAUSED; - func_8010BD58(globalCtx, OCARINA_ACTION_SCARECROW_PLAYBACK); + func_8010BD58(globalCtx, OCARINA_ACTION_SCARECROW_SPAWN_PLAYBACK); this->actionFunc = func_80A917FC; this->camId = OnePointCutscene_Init(globalCtx, 2280, -99, &this->actor, MAIN_CAM); } @@ -333,7 +333,7 @@ void func_80A917FC(EnKakasi3* this, GlobalContext* globalCtx) { void func_80A9187C(EnKakasi3* this, GlobalContext* globalCtx) { if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_EVENT && Message_ShouldAdvance(globalCtx)) { Message_CloseTextbox(globalCtx); - func_8010BD58(globalCtx, OCARINA_ACTION_CHECK_SCARECROW); + func_8010BD58(globalCtx, OCARINA_ACTION_CHECK_SCARECROW_SPAWN); this->actionFunc = func_80A918E4; } } diff --git a/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c b/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c index 46a40a7191..b9f8dcd1a8 100644 --- a/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c +++ b/src/overlays/actors/ovl_En_Ma1/z_en_ma1.c @@ -367,7 +367,7 @@ void func_80AA0F44(EnMa1* this, GlobalContext* globalCtx) { void func_80AA106C(EnMa1* this, GlobalContext* globalCtx) { GET_PLAYER(globalCtx)->stateFlags2 |= PLAYER_STATE2_23; if (this->unk_1E8.unk_00 == 2) { - Audio_OcaSetInstrument(2); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_MALON); func_8010BD58(globalCtx, OCARINA_ACTION_TEACH_EPONA); this->actor.flags &= ~ACTOR_FLAG_16; this->actionFunc = func_80AA10EC; diff --git a/src/overlays/actors/ovl_En_Skj/z_en_skj.c b/src/overlays/actors/ovl_En_Skj/z_en_skj.c index 9ccdf22f38..44c16c0ec2 100644 --- a/src/overlays/actors/ovl_En_Skj/z_en_skj.c +++ b/src/overlays/actors/ovl_En_Skj/z_en_skj.c @@ -1440,7 +1440,7 @@ void EnSkj_WaitForPlayback(EnSkj* this, GlobalContext* globalCtx) { sOcarinaMinigameSkullKids[SKULL_KID_RIGHT].skullkid->minigameState = SKULL_KID_OCARINA_PLAY_NOTES; } - Message_UpdateOcarinaGame(globalCtx); + Message_UpdateOcarinaMemoryGame(globalCtx); } break; case MSGMODE_MEMORY_GAME_RIGHT_SKULLKID_WAIT: @@ -1448,7 +1448,7 @@ void EnSkj_WaitForPlayback(EnSkj* this, GlobalContext* globalCtx) { sOcarinaMinigameSkullKids[SKULL_KID_RIGHT].skullkid->minigameState = SKULL_KID_OCARINA_WAIT; } if (!Audio_IsSfxPlaying(NA_SE_SY_METRONOME)) { - Message_UpdateOcarinaGame(globalCtx); + Message_UpdateOcarinaMemoryGame(globalCtx); this->songFailTimer = 160; } break; @@ -1472,8 +1472,8 @@ void EnSkj_WaitForPlayback(EnSkj* this, GlobalContext* globalCtx) { SKULL_KID_OCARINA_PLAY_NOTES; } this->songFailTimer = 160; - Audio_OcaSetInstrument(6); // related instrument sound (flute?) - Audio_OcaSetSongPlayback(OCARINA_SONG_MEMORY_GAME + 1, 1); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_FLUTE); + AudioOcarina_SetPlaybackSong(OCARINA_SONG_MEMORY_GAME + 1, 1); globalCtx->msgCtx.msgMode = MSGMODE_MEMORY_GAME_LEFT_SKULLKID_PLAYING; globalCtx->msgCtx.stateTimer = 2; } diff --git a/src/overlays/actors/ovl_player_actor/z_player.c b/src/overlays/actors/ovl_player_actor/z_player.c index 760867828f..6070fa5750 100644 --- a/src/overlays/actors/ovl_player_actor/z_player.c +++ b/src/overlays/actors/ovl_player_actor/z_player.c @@ -2779,7 +2779,7 @@ s32 func_80835C58(GlobalContext* globalCtx, Player* this, PlayerFunc674 func, s3 } if (func_8084E3C4 == this->func_674) { - Audio_OcaSetInstrument(0); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); this->stateFlags2 &= ~(PLAYER_STATE2_24 | PLAYER_STATE2_25); } else if (func_808507F4 == this->func_674) { func_80832340(globalCtx, this); diff --git a/src/overlays/misc/ovl_kaleido_scope/z_kaleido_collect.c b/src/overlays/misc/ovl_kaleido_scope/z_kaleido_collect.c index 474ce6d96a..fd46213bab 100644 --- a/src/overlays/misc/ovl_kaleido_scope/z_kaleido_collect.c +++ b/src/overlays/misc/ovl_kaleido_scope/z_kaleido_collect.c @@ -187,9 +187,9 @@ void KaleidoScope_DrawQuestStatus(GlobalContext* globalCtx, GraphicsContext* gfx } D_8082A11C = 0; - Audio_OcaSetInstrument(1); - func_800ECC04((1 << pauseCtx->ocarinaSongIdx) + 0x8000); - pauseCtx->ocarinaStaff = Audio_OcaGetDisplayingStaff(); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT); + AudioOcarina_Start((1 << pauseCtx->ocarinaSongIdx) + 0x8000); + pauseCtx->ocarinaStaff = AudioOcarina_GetPlaybackStaff(); pauseCtx->ocarinaStaff->pos = 0; pauseCtx->ocarinaStaff->state = 0xFF; VREG(21) = -62; @@ -198,13 +198,13 @@ void KaleidoScope_DrawQuestStatus(GlobalContext* globalCtx, GraphicsContext* gfx VREG(24) = -46; VREG(25) = -41; pauseCtx->unk_1E4 = 8; - Audio_OcaSetInstrument(0); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); } } } else if (pauseCtx->unk_1E4 == 5) { if ((pauseCtx->stickRelX != 0) || (pauseCtx->stickRelY != 0)) { pauseCtx->unk_1E4 = 0; - Audio_OcaSetInstrument(0); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); } } else if (pauseCtx->unk_1E4 == 8) { if (CHECK_BTN_ALL(input->press.button, BTN_A) && (sp216 >= QUEST_SONG_MINUET) && @@ -274,12 +274,12 @@ void KaleidoScope_DrawQuestStatus(GlobalContext* globalCtx, GraphicsContext* gfx VREG(24) = -46; VREG(25) = -41; sp216 = pauseCtx->cursorSlot[PAUSE_QUEST]; - Audio_OcaSetInstrument(1); - Audio_OcaSetInstrument(1); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT); pauseCtx->ocarinaSongIdx = gOcarinaSongItemMap[sp216 - QUEST_SONG_MINUET]; - Audio_OcaSetSongPlayback(pauseCtx->ocarinaSongIdx + 1, 1); + AudioOcarina_SetPlaybackSong(pauseCtx->ocarinaSongIdx + 1, 1); pauseCtx->unk_1E4 = 2; - pauseCtx->ocarinaStaff = Audio_OcaGetDisplayingStaff(); + pauseCtx->ocarinaStaff = AudioOcarina_GetPlaybackStaff(); pauseCtx->ocarinaStaff->pos = 0; sp216 = pauseCtx->cursorSlot[PAUSE_QUEST]; KaleidoScope_SetCursorVtx(pauseCtx, sp216 * 4, pauseCtx->questVtx); @@ -471,12 +471,12 @@ void KaleidoScope_DrawQuestStatus(GlobalContext* globalCtx, GraphicsContext* gfx } if (pauseCtx->unk_1E4 == 2) { - pauseCtx->ocarinaStaff = Audio_OcaGetDisplayingStaff(); + pauseCtx->ocarinaStaff = AudioOcarina_GetPlaybackStaff(); if (pauseCtx->ocarinaStaff->pos != 0) { if (D_8082A11C + 1 == pauseCtx->ocarinaStaff->pos) { D_8082A11C++; - D_8082A124[pauseCtx->ocarinaStaff->pos - 1] = pauseCtx->ocarinaStaff->noteIdx; + D_8082A124[pauseCtx->ocarinaStaff->pos - 1] = pauseCtx->ocarinaStaff->buttonIndex; } for (sp218 = 0, phi_s3 = 0; sp218 < 8; sp218++, phi_s3 += 4, sp21A += 4) { @@ -517,11 +517,11 @@ void KaleidoScope_DrawQuestStatus(GlobalContext* globalCtx, GraphicsContext* gfx } } else if (((pauseCtx->unk_1E4 >= 4) && (pauseCtx->unk_1E4 <= 6)) || (pauseCtx->unk_1E4 == 8)) { sp224 = pauseCtx->ocarinaSongIdx; - sp226 = gOcarinaSongNotes[sp224].len; + sp226 = gOcarinaSongButtons[sp224].numButtons; for (sp218 = sp21A, phi_s3 = 0; phi_s3 < sp226; phi_s3++, sp21A += 4) { pauseCtx->questVtx[sp21A + 0].v.ob[1] = pauseCtx->questVtx[sp21A + 1].v.ob[1] = - VREG(21 + gOcarinaSongNotes[sp224].notesIdx[phi_s3]); + VREG(21 + gOcarinaSongButtons[sp224].buttonsIndex[phi_s3]); pauseCtx->questVtx[sp21A + 2].v.ob[1] = pauseCtx->questVtx[sp21A + 3].v.ob[1] = pauseCtx->questVtx[sp21A + 0].v.ob[1] - 12; @@ -529,7 +529,7 @@ void KaleidoScope_DrawQuestStatus(GlobalContext* globalCtx, GraphicsContext* gfx gDPPipeSync(POLY_OPA_DISP++); if (pauseCtx->unk_1E4 == 8) { - if (gOcarinaSongNotes[sp224].notesIdx[phi_s3] == 0) { + if (gOcarinaSongButtons[sp224].buttonsIndex[phi_s3] == OCARINA_BTN_A) { gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 80, 255, 150, 200); } else { gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 50, 200); @@ -542,21 +542,21 @@ void KaleidoScope_DrawQuestStatus(GlobalContext* globalCtx, GraphicsContext* gfx gSPVertex(POLY_OPA_DISP++, &pauseCtx->questVtx[sp21A], 4, 0); - gDPLoadTextureBlock(POLY_OPA_DISP++, D_8082A130[gOcarinaSongNotes[sp224].notesIdx[phi_s3]], G_IM_FMT_IA, - G_IM_SIZ_8b, 16, 16, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, - G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + gDPLoadTextureBlock(POLY_OPA_DISP++, D_8082A130[gOcarinaSongButtons[sp224].buttonsIndex[phi_s3]], + G_IM_FMT_IA, G_IM_SIZ_8b, 16, 16, 0, G_TX_NOMIRROR | G_TX_WRAP, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0); } if (pauseCtx->unk_1E4 != 8) { - pauseCtx->ocarinaStaff = Audio_OcaGetPlayingStaff(); + pauseCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff(); if (pauseCtx->ocarinaStaff->pos != 0) { if (D_8082A11C == (pauseCtx->ocarinaStaff->pos - 1)) { - if ((pauseCtx->ocarinaStaff->noteIdx >= OCARINA_NOTE_A) && - (pauseCtx->ocarinaStaff->noteIdx <= OCARINA_NOTE_C_UP)) { - D_8082A124[pauseCtx->ocarinaStaff->pos - 1] = pauseCtx->ocarinaStaff->noteIdx; + if ((pauseCtx->ocarinaStaff->buttonIndex >= OCARINA_BTN_A) && + (pauseCtx->ocarinaStaff->buttonIndex <= OCARINA_BTN_C_UP)) { + D_8082A124[pauseCtx->ocarinaStaff->pos - 1] = pauseCtx->ocarinaStaff->buttonIndex; D_8082A124[pauseCtx->ocarinaStaff->pos] = 0xFF; D_8082A11C++; } @@ -608,9 +608,9 @@ void KaleidoScope_DrawQuestStatus(GlobalContext* globalCtx, GraphicsContext* gfx } D_8082A11C = 0; - Audio_OcaSetInstrument(1); - func_800ECC04((1 << pauseCtx->ocarinaSongIdx) + 0x8000); - pauseCtx->ocarinaStaff = Audio_OcaGetDisplayingStaff(); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_DEFAULT); + AudioOcarina_Start((1 << pauseCtx->ocarinaSongIdx) + 0x8000); + pauseCtx->ocarinaStaff = AudioOcarina_GetPlaybackStaff(); pauseCtx->ocarinaStaff->pos = 0; pauseCtx->ocarinaStaff->state = 0xFE; pauseCtx->unk_1E4 = 5; diff --git a/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c b/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c index c10fc5e85d..6326e18c19 100644 --- a/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c +++ b/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c @@ -2927,10 +2927,10 @@ void KaleidoScope_Update(GlobalContext* globalCtx) { break; case 2: - pauseCtx->ocarinaStaff = Audio_OcaGetDisplayingStaff(); + pauseCtx->ocarinaStaff = AudioOcarina_GetPlaybackStaff(); if (pauseCtx->ocarinaStaff->state == 0) { pauseCtx->unk_1E4 = 4; - Audio_OcaSetInstrument(0); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); } break; @@ -2942,10 +2942,10 @@ void KaleidoScope_Update(GlobalContext* globalCtx) { break; case 5: - pauseCtx->ocarinaStaff = Audio_OcaGetPlayingStaff(); + pauseCtx->ocarinaStaff = AudioOcarina_GetPlayingStaff(); if (CHECK_BTN_ALL(input->press.button, BTN_START)) { - Audio_OcaSetInstrument(0); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); Interface_SetDoAction(globalCtx, DO_ACTION_NONE); pauseCtx->state = 0x12; WREG(2) = -6240; @@ -2953,7 +2953,7 @@ void KaleidoScope_Update(GlobalContext* globalCtx) { pauseCtx->unk_1E4 = 0; break; } else if (CHECK_BTN_ALL(input->press.button, BTN_B)) { - Audio_OcaSetInstrument(0); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); pauseCtx->unk_1E4 = 0; pauseCtx->mode = 0; pauseCtx->promptChoice = 0; @@ -2986,7 +2986,7 @@ void KaleidoScope_Update(GlobalContext* globalCtx) { if (D_8082B25C == 0) { pauseCtx->unk_1E4 = D_8082B258; if (pauseCtx->unk_1E4 == 0) { - Audio_OcaSetInstrument(0); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); } } break; @@ -2996,14 +2996,14 @@ void KaleidoScope_Update(GlobalContext* globalCtx) { case 8: if (CHECK_BTN_ALL(input->press.button, BTN_START)) { - Audio_OcaSetInstrument(0); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); Interface_SetDoAction(globalCtx, DO_ACTION_NONE); pauseCtx->state = 0x12; WREG(2) = -6240; func_800F64E0(0); pauseCtx->unk_1E4 = 0; } else if (CHECK_BTN_ALL(input->press.button, BTN_B)) { - Audio_OcaSetInstrument(0); + AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF); pauseCtx->unk_1E4 = 0; pauseCtx->mode = 0; pauseCtx->promptChoice = 0; diff --git a/tools/csdis.py b/tools/csdis.py index 2f6f26c9f8..b5aedb19c2 100755 --- a/tools/csdis.py +++ b/tools/csdis.py @@ -177,12 +177,12 @@ ocarina_action_ids = { 0x25: "OCARINA_ACTION_CHECK_SUNS", 0x26: "OCARINA_ACTION_CHECK_TIME", 0x27: "OCARINA_ACTION_CHECK_STORMS", - 0x28: "OCARINA_ACTION_CHECK_SCARECROW", + 0x28: "OCARINA_ACTION_CHECK_SCARECROW_SPAWN", 0x29: "OCARINA_ACTION_FREE_PLAY_DONE", 0x2A: "OCARINA_ACTION_SCARECROW_LONG_RECORDING", 0x2B: "OCARINA_ACTION_SCARECROW_LONG_PLAYBACK", - 0x2C: "OCARINA_ACTION_SCARECROW_RECORDING", - 0x2D: "OCARINA_ACTION_SCARECROW_PLAYBACK", + 0x2C: "OCARINA_ACTION_SCARECROW_SPAWN_RECORDING", + 0x2D: "OCARINA_ACTION_SCARECROW_SPAWN_PLAYBACK", 0x2E: "OCARINA_ACTION_MEMORY_GAME", 0x2F: "OCARINA_ACTION_FROGS", 0x30: "OCARINA_ACTION_CHECK_NOWARP",