diff options
| author | engineer124 <47598039+engineer124@users.noreply.github.com> | 2022-05-10 02:59:23 +1000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-05-09 18:59:23 +0200 |
| commit | 95b431793182bd021cb4234255f90b996edd8d4d (patch) | |
| tree | 13b56539e1ecab971892ebe3d333b13113262245 /src/code | |
| parent | 6cd8029cd5e039a1094260da49d50b35a36f4f2a (diff) | |
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
Diffstat (limited to 'src/code')
| -rw-r--r-- | src/code/audio_data.c | 258 | ||||
| -rw-r--r-- | src/code/audio_load.c | 4 | ||||
| -rw-r--r-- | src/code/audio_seqplayer.c | 8 | ||||
| -rw-r--r-- | src/code/code_800E4FE0.c | 17 | ||||
| -rw-r--r-- | src/code/code_800EC960.c | 1911 | ||||
| -rw-r--r-- | src/code/z_construct.c | 16 | ||||
| -rw-r--r-- | src/code/z_demo.c | 2 | ||||
| -rw-r--r-- | src/code/z_message_PAL.c | 707 | ||||
| -rw-r--r-- | src/code/z_sram.c | 12 |
9 files changed, 1576 insertions, 1359 deletions
diff --git a/src/code/audio_data.c b/src/code/audio_data.c index 5a8d46387..4798ea47c 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 092ae1d3f..f331f8bdc 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 e405309ca..3f4b15978 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 04c43a2bd..93419f4be 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 34badb146..9e6309eb5 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 }; - -OcarinaNote sOcarinaSongs[OCARINA_SONG_MAX][20] = { - // Minuet +s8 sNotePlaybackBend = 0; +f32 sRelativeNotePlaybackBend = 1.0f; +f32 sRelativeNotePlaybackVolume = 1.0f; +s32 sOcarinaPlaybackTaskStart = 0; + +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; - -OcarinaNote sPierresSong[108] = { - { 0xFF, 0, 0, 0, 0, 0, 0 }, - { 0xFF, 0, 0, 0, 0, 0, 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 sScarecrowsLongSongNotes[108] = { + { OCARINA_PITCH_NONE, 0, 0, 0, 0, 0 }, + { OCARINA_PITCH_NONE, 0, 0, 0, 0, 0 }, +}; +OcarinaNote* gScarecrowLongSongPtr = sScarecrowsLongSongNotes; + +u8* gScarecrowSpawnSongPtr = (u8*)&sOcarinaSongNotes[OCARINA_SONG_SCARECROW_SPAWN]; +OcarinaNote* sMemoryGameSongPtr = sOcarinaSongNotes[OCARINA_SONG_MEMORY_GAME]; + +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 }; -OcarinaNote* gScarecrowCustomSongPtr = sPierresSong; - -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 }; -OcarinaSongInfo gOcarinaSongNotes[OCARINA_SONG_MAX] = { - // Minuet +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; - - if (inp > 0x40) { - inpAdj = 127; - } else if (inp < -0x40) { - inpAdj = -128; - } else if (inp >= 0) { - inpAdj = (inp * 127) / 64; +/** + * 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 (bendIndex > 64) { + adjBendIndex = 127; + } else if (bendIndex < -64) { + adjBendIndex = -128; + } else if (bendIndex >= 0) { + adjBendIndex = (bendIndex * 127) / 64; } else { - inpAdj = (inp * 128) / 64; + adjBendIndex = (bendIndex * 128) / 64; } - ret = gBendPitchTwoSemitonesFrequencies[inpAdj + 128]; - return ret; -} -u8 Audio_OcaGetPlayingState(void) { - u8 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; +} - if (D_80131878 != 0) { - ret = D_80131878 - 1; - D_80131878 = 0; - } else if (D_80130F3C != 0) { - ret = 0xFE; +/** + * 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; + + if (sPlayedOcarinaSongIndexPlusOne != 0) { + playedOcarinaSongIndex = sPlayedOcarinaSongIndexPlusOne - 1; + sPlayedOcarinaSongIndexPlusOne = 0; + } else if (sOcarinaFlags != 0) { + playedOcarinaSongIndex = 0xFE; } else { - ret = 0xFF; + playedOcarinaSongIndex = 0xFF; } - return ret; + return playedOcarinaSongIndex; } -u8 Audio_OcaMapNoteValue(u8 arg0) { - u8 temp_v1; +u8 AudioOcarina_MapNoteToButton(u8 pitchAndBFlatFlag) { + u8 buttonIndex = sPitchToButtonMap[pitchAndBFlatFlag & 0x3F]; - temp_v1 = sNoteValueIndexMap[arg0 & 0x3F]; - if (temp_v1 == 5) { - if (arg0 & 0x80) { - return 2; + /** + * 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; + + while (buttonSongPos < 8 && noteSongPos < 16) { + pitch = sOcarinaSongNotes[noteSongIndex][noteSongPos++].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]; + 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; - return; - } + if (!sOcarinaHasStartedSong) { + 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; + 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; } + } - prevNote = &sOcarinaSongs[i][sLearnSongPos[i]]; - note = &sOcarinaSongs[i][++sLearnSongPos[i]]; - D_8016BA70[i] = prevNote->unk_02; - sLearnSongExpectedNote[i] = prevNote->noteIdx; + curNote = &sOcarinaSongNotes[songIndex][sMusicStaffPos[songIndex]]; + nextNote = &sOcarinaSongNotes[songIndex][++sMusicStaffPos[songIndex]]; + sMusicStaffExpectedLength[songIndex] = curNote->length; + sMusicStaffExpectedPitch[songIndex] = curNote->pitch; - 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; + // The current note is not the expected note. + if (sCurOcarinaPitch != sMusicStaffExpectedPitch[songIndex]) { + sAvailOcarinaSongFlags ^= curOcarinaSongFlag; } - } - 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; + 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]++; } - D_80130F3C = 0; - return; + } else if (sMusicStaffCurHeldLength[songIndex] < 10) { + // case never taken + staffOcarinaPlayingPosOffset = -1; + sMusicStaffCurHeldLength[songIndex] = 0; + sMusicStaffPrevPitch = sCurOcarinaPitch; + } else { + // case never taken + sAvailOcarinaSongFlags ^= curOcarinaSongFlag; } } - if (!inputChanged) { - sLearnSongLastBtn = sCurOcarinaBtnVal; - sStaffPlayingPos += sp57 + 1; + // 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; } } + + 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 (sOcarinaSongAppendPos == 8) { - for (i = 0; i < 7; i++) { - sCurOcarinaSong[i] = sCurOcarinaSong[i + 1]; - } - } else { - sOcarinaSongAppendPos++; - } + if ((sPrevOcarinaPitch != sCurOcarinaPitch) && (sCurOcarinaPitch != OCARINA_PITCH_NONE)) { + sStaffOcarinaPlayingPos++; + if (sStaffOcarinaPlayingPos > ARRAY_COUNT(sCurOcarinaSongWithoutMusicStaff)) { + sStaffOcarinaPlayingPos = 1; + } - if ((D_80130F2C < 0 ? -D_80130F2C : D_80130F2C) >= 0x15) { - sCurOcarinaSong[sOcarinaSongAppendPos - 1] = 0xFF; - } else { - sCurOcarinaSong[sOcarinaSongAppendPos - 1] = sCurOcarinaBtnVal; + if (sOcarinaWithoutMusicStaffPos == 8) { + for (i = 0; i < 7; i++) { + sCurOcarinaSongWithoutMusicStaff[i] = sCurOcarinaSongWithoutMusicStaff[i + 1]; } + } else { + sOcarinaWithoutMusicStaffPos++; + } - 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 (ABS_ALT(sCurOcarinaBendIndex) > 20) { + sCurOcarinaSongWithoutMusicStaff[sOcarinaWithoutMusicStaffPos - 1] = OCARINA_PITCH_NONE; + } else { + sCurOcarinaSongWithoutMusicStaff[sOcarinaWithoutMusicStaffPos - 1] = sCurOcarinaPitch; + } - if (j == gOcarinaSongNotes[i].len) { - D_80131878 = i + 1; - sOcarinaInpEnabled = 0; - D_80130F3C = 0; + // 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++; } } + + // 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; - } - - 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; - } - - if (sCurOcarinaBtnVal != 0xFF && sCurOcarinaBtnPress & 0x10 && sRecordingState != 2) { - sCurOcarinaBtnIdx += 0x80; - sCurOcarinaBtnVal++; - } - - if ((sCurOcarinaBtnVal != 0xFF) && (sCurOcarinaBtnPress & 0x2000) && (sRecordingState != 2)) { - sCurOcarinaBtnIdx += 0x40; - sCurOcarinaBtnVal--; - } - - if (sRecordingState != 2) { - D_80130F2C = sCurOcaStick.y; - D_80130F24 = Audio_OcaAdjStick(D_80130F2C); - - D_80130F34 = (sCurOcaStick.x < 0 ? -sCurOcaStick.x : sCurOcaStick.x) >> 2; - Audio_QueueCmdS8(0x6 << 24 | SEQ_PLAYER_SFX << 16 | 0xD06, D_80130F34); + sOcarinaInputButtonPress &= ocarinaBtnsHeld; + } + + // 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; + } + + // 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 + } + + // 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 != OCARINA_RECORD_SCARECROW_SPAWN) { + // Bend the pitch of the note based on y control stick + sCurOcarinaBendIndex = sOcarinaInputStickRel.y; + sCurOcarinaBendFreq = AudioOcarina_BendPitchTwoSemitones(sCurOcarinaBendIndex); + + // Add vibrato of the ocarina note based on the x control stick + sCurOcarinaVibrato = ABS_ALT(sOcarinaInputStickRel.x) >> 2; + // Sets vibrato to io port 6 + Audio_QueueCmdS8(0x6 << 24 | SEQ_PLAYER_SFX << 16 | SFX_CHANNEL_OCARINA << 8 | 6, sCurOcarinaVibrato); } else { - 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 (noteTimerStep < sNotePlaybackTimer) { - sNotePlaybackTimer -= noteTimerStep; - } else { - nextNoteTimerStep = noteTimerStep - sNotePlaybackTimer; - sNotePlaybackTimer = 0; - } + if (sPlaybackStaffPos == 0) { + noteTimerStep = 3; + } else { + noteTimerStep = sOcarinaUpdateTaskStart - sOcarinaPlaybackTaskStart; + } - if (sNotePlaybackTimer == 0) { + if (noteTimerStep < sPlaybackNoteTimer) { + sPlaybackNoteTimer -= noteTimerStep; + } else { + nextNoteTimerStep = noteTimerStep - sPlaybackNoteTimer; + sPlaybackNoteTimer = 0; + } - sNotePlaybackTimer = sPlaybackSong[sPlaybackNotePos].unk_02; + if (sPlaybackNoteTimer == 0) { - if (sPlaybackNotePos == 1) { - sNotePlaybackTimer++; - } + sPlaybackNoteTimer = sPlaybackSong[sPlaybackNotePos].length; - if (sNotePlaybackTimer == 0) { - sPlaybackState--; - if (sPlaybackState != 0) { - sPlaybackNotePos = 0; - sStaffPlaybackPos = 0; - sDisplayedNoteValue = 0xFF; - } else { - Audio_StopSfxById(NA_SE_OC_OCARINA); - } - return; + if (sPlaybackNotePos == 1) { + sPlaybackNoteTimer++; + } + + if (sPlaybackNoteTimer == 0) { + sPlaybackState--; + if (sPlaybackState != 0) { + sPlaybackNotePos = 0; + sPlaybackStaffPos = 0; + sPlaybackPitch = OCARINA_PITCH_NONE; } else { - sNotePlaybackTimer -= nextNoteTimerStep; + Audio_StopSfxById(NA_SE_OC_OCARINA); } + return; + } else { + sPlaybackNoteTimer -= nextNoteTimerStep; + } - if (sNotePlaybackVolume != sPlaybackSong[sPlaybackNotePos].volume) { - sNotePlaybackVolume = sPlaybackSong[sPlaybackNotePos].volume; - sNormalizedNotePlaybackVolume = sNotePlaybackVolume / 127.0f; - } + // Update volume + if (sNotePlaybackVolume != sPlaybackSong[sPlaybackNotePos].volume) { + sNotePlaybackVolume = sPlaybackSong[sPlaybackNotePos].volume; + sRelativeNotePlaybackVolume = sNotePlaybackVolume / 127.0f; + } - if (sNotePlaybackVibrato != sPlaybackSong[sPlaybackNotePos].vibrato) { - sNotePlaybackVibrato = sPlaybackSong[sPlaybackNotePos].vibrato; - Audio_QueueCmdS8(0x6 << 24 | SEQ_PLAYER_SFX << 16 | 0xD06, sNotePlaybackVibrato); - } + // 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); + } - if (sNotePlaybackTone != sPlaybackSong[sPlaybackNotePos].tone) { - sNotePlaybackTone = sPlaybackSong[sPlaybackNotePos].tone; - sNormalizedNotePlaybackTone = Audio_OcaAdjStick(sNotePlaybackTone); - } + // Update bend + if (sNotePlaybackBend != sPlaybackSong[sPlaybackNotePos].bend) { + sNotePlaybackBend = sPlaybackSong[sPlaybackNotePos].bend; + sRelativeNotePlaybackBend = AudioOcarina_BendPitchTwoSemitones(sNotePlaybackBend); + } - if ((sPlaybackSong[sPlaybackNotePos].volume == sPlaybackSong[sPlaybackNotePos - 1].volume && - (sPlaybackSong[sPlaybackNotePos].vibrato == sPlaybackSong[sPlaybackNotePos - 1].vibrato) && - (sPlaybackSong[sPlaybackNotePos].tone == sPlaybackSong[sPlaybackNotePos - 1].tone))) { - sDisplayedNoteValue = 0xFE; - } + // 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 (sDisplayedNoteValue != sPlaybackSong[sPlaybackNotePos].noteIdx) { - u8 tmp = sPlaybackSong[sPlaybackNotePos].noteIdx; + if (sPlaybackPitch != sPlaybackSong[sPlaybackNotePos].pitch) { + u8 pitch = sPlaybackSong[sPlaybackNotePos].pitch; - if (tmp == 0xA) { - sDisplayedNoteValue = tmp + sPlaybackSong[sPlaybackNotePos].semitone; - } else { - sDisplayedNoteValue = tmp; - } + // 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 (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); - } + 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++; } + 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; - } - 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; + /** + * 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; + } + + 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); - - 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]; + // Copies Notes from buffer into scarecrows spawn buttons to be tested for acceptance or rejection + AudioOcarina_MapNotesToScarecrowButtons(OCARINA_SONG_MEMORY_GAME); + + // 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 fbfc9dcb0..cbf9983ad 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 9e58d7b69..549e79da1 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 dfbed1e0a..38968e59a 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_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(i) += R_OCARINA_BUTTONS_YPOS_OFFSET; + } + 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; - } - if (msgCtx->ocarinaStaff->state == 0) { + 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 == 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 1277b06ea..21664a53d 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); } |
