summaryrefslogtreecommitdiff
path: root/soh/src/code/code_800EC960.c
diff options
context:
space:
mode:
authorM4xw <m4x@m4xw.net>2022-03-22 02:51:23 +0100
committerM4xw <m4x@m4xw.net>2022-03-22 02:51:23 +0100
commit39cc86c2608e2f75ace33fc7f43bc4f2ad743f1a (patch)
tree0d3fd9e995d7484eaaeb158ac808bd6a39121189 /soh/src/code/code_800EC960.c
parent0bb0e7b53bd80bdc7f78e08c441691737e039b2b (diff)
git subrepo clone https://github.com/HarbourMasters/soh.git
subrepo: subdir: "soh" merged: "ba904bbd0" upstream: origin: "https://github.com/HarbourMasters/soh.git" branch: "master" commit: "ba904bbd0" git-subrepo: version: "0.4.1" origin: "???" commit: "???"
Diffstat (limited to 'soh/src/code/code_800EC960.c')
-rw-r--r--soh/src/code/code_800EC960.c5056
1 files changed, 5056 insertions, 0 deletions
diff --git a/soh/src/code/code_800EC960.c b/soh/src/code/code_800EC960.c
new file mode 100644
index 000000000..5efa93167
--- /dev/null
+++ b/soh/src/code/code_800EC960.c
@@ -0,0 +1,5056 @@
+#include "ultra64.h"
+#include "global.h"
+
+// TODO: can these macros be shared between files? code_800F9280 seems to use
+// versions without any casts...
+#define Audio_DisableSeq(playerIdx, fadeOut) Audio_QueueCmdS32(0x83000000 | ((u8)playerIdx << 16), fadeOut)
+#define Audio_StartSeq(playerIdx, fadeTimer, seqId) \
+ Audio_QueueSeqCmd(0x00000000 | ((u8)playerIdx << 24) | ((u8)(fadeTimer) << 0x10) | (u16)seqId)
+#define Audio_SeqCmd7(playerIdx, a, b) \
+ Audio_QueueSeqCmd(0x70000000 | ((u8)playerIdx << 0x18) | ((u8)a << 0x10) | (u8)(b))
+#define Audio_SeqCmdC(playerIdx, a, b, c) \
+ Audio_QueueSeqCmd(0xC0000000 | ((u8)playerIdx << 24) | ((u8)a << 16) | ((u8)b << 8) | ((u8)(c)))
+#define Audio_SeqCmdA(playerIdx, a) Audio_QueueSeqCmd(0xA0000000 | ((u8)playerIdx << 24) | ((u16)(a)))
+#define Audio_SeqCmd1(playerIdx, a) Audio_QueueSeqCmd(0x100000FF | ((u8)playerIdx << 24) | ((u8)(a) << 16))
+#define Audio_SeqCmdB(playerIdx, a, b, c) \
+ Audio_QueueSeqCmd(0xB0000000 | ((u8)playerIdx << 24) | ((u8)a << 16) | ((u8)b << 8) | ((u8)c))
+#define Audio_SeqCmdB40(playerIdx, a, b) Audio_QueueSeqCmd(0xB0004000 | ((u8)playerIdx << 24) | ((u8)a << 16) | ((u8)b))
+#define Audio_SeqCmd6(playerIdx, a, b, c) \
+ Audio_QueueSeqCmd(0x60000000 | ((u8)playerIdx << 24) | ((u8)(a) << 16) | ((u8)b << 8) | ((u8)c))
+#define Audio_SeqCmdE0(playerIdx, a) Audio_QueueSeqCmd(0xE0000000 | ((u8)playerIdx << 24) | ((u8)a))
+#define Audio_SeqCmdE01(playerIdx, a) Audio_QueueSeqCmd(0xE0000100 | ((u8)playerIdx << 24) | ((u16)a))
+#define Audio_SeqCmd8(playerIdx, a, b, c) \
+ 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))
+
+typedef struct {
+ /* 0x0 */ f32 vol;
+ /* 0x4 */ f32 freqScale;
+ /* 0x8 */ s8 reverb;
+ /* 0x9 */ s8 panSigned;
+ /* 0xA */ s8 stereoBits;
+ /* 0xB */ u8 filter;
+ /* 0xC */ u8 unk_0C;
+} SfxPlayerState;
+
+typedef struct {
+ /* 0x0 */ f32 value;
+ /* 0x4 */ f32 target;
+ /* 0x8 */ f32 step;
+ /* 0xC */ s32 remainingFrames;
+} FreqLerp;
+
+typedef struct {
+ /* 0x0 */ u16 playerIO;
+ /* 0x2 */ u16 channelMask;
+ /* 0x4 */ u8 channelIO[3 * 33 + 1];
+} NatureAmbienceDataIO; // size = 0x68
+
+typedef enum {
+ /* 0x0 */ PAGE_NON,
+ /* 0x1 */ PAGE_SOUND_CONTROL,
+ /* 0x2 */ PAGE_SPEC_INFO, // unused
+ /* 0x3 */ PAGE_HEAP_INFO,
+ /* 0x4 */ PAGE_GROUP_TRACK_INFO, // unused
+ /* 0x5 */ PAGE_SUB_TRACK_INFO,
+ /* 0x6 */ PAGE_CHANNEL_INFO, // unused
+ /* 0x7 */ PAGE_INTERFACE_INFO,
+ /* 0x8 */ PAGE_SFX_SWAP,
+ /* 0x9 */ PAGE_BLOCK_CHANGE_BGM,
+ /* 0xA */ PAGE_NATURAL_SOUND_CONTROL, // unused
+ /* 0xB */ PAGE_OCARINA_TEST,
+ /* 0xC */ PAGE_SFX_PARAMETER_CHANGE,
+ /* 0xD */ PAGE_SCROLL_PRINT,
+ /* 0xE */ PAGE_FREE_AREA,
+ /* 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
+
+u8 gIsLargeSoundBank[7] = { 0, 0, 0, 1, 0, 0, 0 };
+
+// Only the first row of these is supported by sequence 0. (gSfxChannelLayout is always 0.)
+u8 gChannelsPerBank[4][7] = {
+ { 3, 2, 3, 3, 2, 1, 2 },
+ { 3, 2, 2, 2, 2, 2, 2 },
+ { 3, 2, 2, 2, 2, 2, 2 },
+ { 4, 1, 0, 0, 2, 2, 2 },
+};
+u8 gUsedChannelsPerBank[4][7] = {
+ { 3, 2, 3, 2, 2, 1, 1 },
+ { 3, 1, 1, 1, 2, 1, 1 },
+ { 3, 1, 1, 1, 2, 1, 1 },
+ { 2, 1, 0, 0, 1, 1, 1 },
+};
+
+f32 D_801305B0 = 0.7950898f;
+s8 D_801305B4 = 35;
+s8 D_801305B8 = 20;
+s8 D_801305BC = 30;
+s8 D_801305C0 = 20;
+f32 sBehindScreenZ[2] = { -15.0f, -65.0f };
+u8 sAudioIncreasingTranspose = 0;
+u8 gMorphaTransposeTable[16] = { 0, 0, 0, 1, 1, 2, 4, 6, 8, 8, 8, 8, 8, 8, 8, 8 };
+u8 sPrevChargeLevel = 0;
+f32 D_801305E4[4] = { 1.0f, 1.12246f, 1.33484f, 1.33484f }; // 2**({0, 2, 5, 5}/12)
+f32 D_801305F4 = 1.0f;
+u8 D_801305F8[8] = { 127, 80, 75, 73, 70, 68, 65, 60 };
+u8 D_80130600 = 0;
+s8 D_80130604 = 2;
+s8 D_80130608 = 0;
+s8 sAudioCutsceneFlag = 0;
+s8 sSpecReverb = 0;
+s8 sAudioEnvReverb = 0;
+s8 sAudioCodeReverb = 0;
+u8 sPrevSeqMode = 0;
+f32 sAudioEnemyDist = 0.0f;
+s8 sAudioEnemyVol = 127;
+u16 sPrevMainBgmSeqId = NA_BGM_DISABLED;
+u8 D_8013062C = 0;
+u8 D_80130630 = NA_BGM_GENERAL_SFX;
+u32 sNumFramesStill = 0;
+u32 sNumFramesMoving = 0;
+u8 sAudioBaseFilter = 0;
+u8 sAudioExtraFilter = 0;
+u8 sAudioBaseFilter2 = 0;
+u8 sAudioExtraFilter2 = 0;
+Vec3f* sSariaBgmPtr = NULL;
+f32 D_80130650 = 2000.0f;
+u8 sSeqModeInput = 0;
+u8 sSeqFlags[0x6E] = {
+ 0x2, // NA_BGM_GENERAL_SFX
+ 0x1, // NA_BGM_NATURE_BACKGROUND
+ 0, // NA_BGM_FIELD_LOGIC
+ 0, // NA_BGM_FIELD_INIT
+ 0, // NA_BGM_FIELD_DEFAULT_1
+ 0, // NA_BGM_FIELD_DEFAULT_2
+ 0, // NA_BGM_FIELD_DEFAULT_3
+ 0, // NA_BGM_FIELD_DEFAULT_4
+ 0, // NA_BGM_FIELD_DEFAULT_5
+ 0, // NA_BGM_FIELD_DEFAULT_6
+ 0, // NA_BGM_FIELD_DEFAULT_7
+ 0, // NA_BGM_FIELD_DEFAULT_8
+ 0, // NA_BGM_FIELD_DEFAULT_9
+ 0, // NA_BGM_FIELD_DEFAULT_A
+ 0, // NA_BGM_FIELD_DEFAULT_B
+ 0, // NA_BGM_FIELD_ENEMY_INIT
+ 0, // NA_BGM_FIELD_ENEMY_1
+ 0, // NA_BGM_FIELD_ENEMY_2
+ 0, // NA_BGM_FIELD_ENEMY_3
+ 0, // NA_BGM_FIELD_ENEMY_4
+ 0, // NA_BGM_FIELD_STILL_1
+ 0, // NA_BGM_FIELD_STILL_2
+ 0, // NA_BGM_FIELD_STILL_3
+ 0, // NA_BGM_FIELD_STILL_4
+ 0x21, // NA_BGM_DUNGEON
+ 0x10, // NA_BGM_KAKARIKO_ADULT
+ 0, // NA_BGM_ENEMY
+ 0x88, // NA_BGM_BOSS
+ 0x1, // NA_BGM_INSIDE_DEKU_TREE
+ 0, // NA_BGM_MARKET
+ 0, // NA_BGM_TITLE
+ 0x20, // NA_BGM_LINK_HOUSE
+ 0, // NA_BGM_GAME_OVER
+ 0, // NA_BGM_BOSS_CLEAR
+ 0x2, // NA_BGM_ITEM_GET
+ 0x4, // NA_BGM_OPENING_GANON
+ 0x2, // NA_BGM_HEART_GET
+ 0x2, // NA_BGM_OCA_LIGHT
+ 0x1, // NA_BGM_JABU_JABU
+ 0x10, // NA_BGM_KAKARIKO_KID
+ 0, // NA_BGM_GREAT_FAIRY
+ 0, // NA_BGM_ZELDA_THEME
+ 0x1, // NA_BGM_FIRE_TEMPLE
+ 0x2, // NA_BGM_OPEN_TRE_BOX
+ 0x1, // NA_BGM_FOREST_TEMPLE
+ 0, // NA_BGM_COURTYARD
+ 0x80, // NA_BGM_GANON_TOWER
+ 0, // NA_BGM_LONLON
+ 0x80, // NA_BGM_GORON_CITY
+ 0, // NA_BGM_FIELD_MORNING
+ 0x2, // NA_BGM_SPIRITUAL_STONE
+ 0x2, // NA_BGM_OCA_BOLERO
+ 0x2, // NA_BGM_OCA_MINUET
+ 0x2, // NA_BGM_OCA_SERENADE
+ 0x2, // NA_BGM_OCA_REQUIEM
+ 0x2, // NA_BGM_OCA_NOCTURNE
+ 0x88, // NA_BGM_MINI_BOSS
+ 0x2, // NA_BGM_SMALL_ITEM_GET
+ 0, // NA_BGM_TEMPLE_OF_TIME
+ 0x2, // NA_BGM_EVENT_CLEAR
+ 0x11, // NA_BGM_KOKIRI
+ 0x2, // NA_BGM_OCA_FAIRY_GET
+ 0x1, // NA_BGM_SARIA_THEME
+ 0x1, // NA_BGM_SPIRIT_TEMPLE
+ 0, // NA_BGM_HORSE
+ 0, // NA_BGM_HORSE_GOAL
+ 0, // NA_BGM_INGO
+ 0x2, // NA_BGM_MEDALLION_GET
+ 0x2, // NA_BGM_OCA_SARIA
+ 0x2, // NA_BGM_OCA_EPONA
+ 0x2, // NA_BGM_OCA_ZELDA
+ 0x2, // NA_BGM_OCA_SUNS
+ 0x2, // NA_BGM_OCA_TIME
+ 0x2, // NA_BGM_OCA_STORM
+ 0, // NA_BGM_NAVI_OPENING
+ 0, // NA_BGM_DEKU_TREE_CS
+ 0, // NA_BGM_WINDMILL
+ 0, // NA_BGM_HYRULE_CS
+ 0x20, // NA_BGM_MINI_GAME
+ 0, // NA_BGM_SHEIK
+ 0x10, // NA_BGM_ZORA_DOMAIN
+ 0x2, // NA_BGM_APPEAR
+ 0, // NA_BGM_ADULT_LINK
+ 0, // NA_BGM_MASTER_SWORD
+ 0x4, // NA_BGM_INTRO_GANON
+ 0x20, // NA_BGM_SHOP
+ 0x40, // NA_BGM_CHAMBER_OF_SAGES
+ 0x40, // NA_BGM_FILE_SELECT
+ 0x1, // NA_BGM_ICE_CAVERN
+ 0x2, // NA_BGM_DOOR_OF_TIME
+ 0x2, // NA_BGM_OWL
+ 0x1, // NA_BGM_SHADOW_TEMPLE
+ 0x1, // NA_BGM_WATER_TEMPLE
+ 0x2, // NA_BGM_BRIDGE_TO_GANONS
+ 0, // NA_BGM_OCARINA_OF_TIME
+ 0x11, // NA_BGM_GERUDO_VALLEY
+ 0, // NA_BGM_POTION_SHOP
+ 0, // NA_BGM_KOTAKE_KOUME
+ 0x80, // NA_BGM_ESCAPE
+ 0, // NA_BGM_UNDERGROUND
+ 0x80, // NA_BGM_GANON_BATTLE_1
+ 0x80, // NA_BGM_GANON_BATTLE_2
+ 0, // NA_BGM_END_DEMO
+ 0, // NA_BGM_STAFF_1
+ 0, // NA_BGM_STAFF_2
+ 0, // NA_BGM_STAFF_3
+ 0, // NA_BGM_STAFF_4
+ 0, // NA_BGM_FIRE_BOSS
+ 0x8, // NA_BGM_TIMED_MINI_GAME
+ 0, // NA_BGM_VARIOUS_SFX
+};
+
+s8 sSpecReverbs[20] = { 0, 0, 0, 0, 0, 0, 0, 40, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+
+NatureAmbienceDataIO sNatureAmbienceDataIO[20] = {
+ // NATURE_ID_GENERAL_NIGHT
+ {
+ 0xC0FF, // PlayerIO Data
+ 0xC0FE, // Channel Mask
+ {
+ // Channel 0
+ NATURE_IO_STREAM_0_TYPE(NATURE_STREAM_RUSHING_WATER),
+ NATURE_IO_STREAM_0_PORT3(0),
+
+ // Channel 1
+ NATURE_IO_CRITTER_0_TYPE(NATURE_CRITTER_CROWS_CAWS),
+ NATURE_IO_CRITTER_0_BEND_PITCH(64),
+ NATURE_IO_CRITTER_0_NUM_LAYERS(0),
+ NATURE_IO_CRITTER_0_PORT5(32),
+
+ // Channel 2
+ NATURE_IO_CRITTER_1_TYPE(NATURE_CRITTER_CRICKETS),
+ NATURE_IO_CRITTER_1_BEND_PITCH(0),
+ NATURE_IO_CRITTER_1_NUM_LAYERS(1),
+ NATURE_IO_CRITTER_1_PORT5(16),
+
+ // Channel 3
+ NATURE_IO_CRITTER_2_TYPE(NATURE_CRITTER_SMALL_BIRD_CHIRPS),
+ NATURE_IO_CRITTER_2_BEND_PITCH(112),
+ NATURE_IO_CRITTER_2_NUM_LAYERS(1),
+ NATURE_IO_CRITTER_2_PORT5(48),
+
+ // Channel 4
+ NATURE_IO_CRITTER_3_TYPE(NATURE_CRITTER_HAWK_SCREECH),
+ NATURE_IO_CRITTER_3_BEND_PITCH(127),
+ NATURE_IO_CRITTER_3_NUM_LAYERS(0),
+ NATURE_IO_CRITTER_3_PORT5(16),
+
+ // Channel 5
+ NATURE_IO_CRITTER_4_TYPE(NATURE_CRITTER_BIRD_CHIRP_1),
+ NATURE_IO_CRITTER_4_BEND_PITCH(127),
+ NATURE_IO_CRITTER_4_NUM_LAYERS(1),
+ NATURE_IO_CRITTER_4_PORT5(16),
+
+ // Channel 6
+ NATURE_IO_CRITTER_5_TYPE(NATURE_CRITTER_TAP),
+ NATURE_IO_CRITTER_5_BEND_PITCH(127),
+ NATURE_IO_CRITTER_5_NUM_LAYERS(3),
+ NATURE_IO_CRITTER_5_PORT5(16),
+
+ // Channel 7
+ NATURE_IO_CRITTER_6_TYPE(NATURE_CRITTER_CUCCO_CROWS),
+ NATURE_IO_CRITTER_6_BEND_PITCH(127),
+ NATURE_IO_CRITTER_6_NUM_LAYERS(1),
+ NATURE_IO_CRITTER_6_PORT5(16),
+
+ // End
+ NATURE_IO_ENTRIES_END,
+ },
+ },
+
+ // NATURE_ID_MARKET_ENTRANCE
+ {
+ 0xC0FB, // PlayerIO Data
+ 0xC0FA, // Channel Mask
+ {
+ // Channel 0
+ NATURE_IO_STREAM_0_TYPE(NATURE_STREAM_RUSHING_WATER),
+ NATURE_IO_STREAM_0_PORT3(0),
+
+ // Channel 1
+ NATURE_IO_CRITTER_0_TYPE(NATURE_CRITTER_CRICKETS),
+ NATURE_IO_CRITTER_0_BEND_PITCH(0),
+ NATURE_IO_CRITTER_0_NUM_LAYERS(1),
+ NATURE_IO_CRITTER_0_PORT5(16),
+
+ // Channel 3
+ NATURE_IO_CRITTER_2_TYPE(NATURE_CRITTER_BIRD_SCREECH),
+ NATURE_IO_CRITTER_2_BEND_PITCH(112),
+ NATURE_IO_CRITTER_2_NUM_LAYERS(1),
+ NATURE_IO_CRITTER_2_PORT5(48),
+
+ // Channel 4
+ NATURE_IO_CRITTER_3_TYPE(NATURE_CRITTER_HAWK_SCREECH),
+ NATURE_IO_CRITTER_3_BEND_PITCH(127),
+ NATURE_IO_CRITTER_3_NUM_LAYERS(0),
+ NATURE_IO_CRITTER_3_PORT5(16),
+
+ // Channel 5
+ NATURE_IO_CRITTER_4_TYPE(NATURE_CRITTER_BIRD_CHIRP_1),
+ NATURE_IO_CRITTER_4_BEND_PITCH(127),
+ NATURE_IO_CRITTER_4_NUM_LAYERS(1),
+ NATURE_IO_CRITTER_4_PORT5(16),
+
+ // Channel 6
+ NATURE_IO_CRITTER_5_TYPE(NATURE_CRITTER_TAP),
+ NATURE_IO_CRITTER_5_BEND_PITCH(127),
+ NATURE_IO_CRITTER_5_NUM_LAYERS(3),
+ NATURE_IO_CRITTER_5_PORT5(16),
+
+ // Channel 7
+ NATURE_IO_CRITTER_6_TYPE(NATURE_CRITTER_CUCCO_CROWS),
+ NATURE_IO_CRITTER_6_BEND_PITCH(127),
+ NATURE_IO_CRITTER_6_NUM_LAYERS(1),
+ NATURE_IO_CRITTER_6_PORT5(16),
+
+ // End
+ NATURE_IO_ENTRIES_END,
+ },
+ },
+
+ // NATURE_ID_KAKARIKO_REGION
+ {
+ 0xC001, // PlayerIO Data
+ 0x4000, // Channel Mask
+ {
+ // Channel 0
+ NATURE_IO_STREAM_0_TYPE(NATURE_STREAM_RUSHING_WATER),
+ NATURE_IO_STREAM_0_PORT3(0),
+
+ // Channel 2
+ NATURE_IO_CRITTER_1_TYPE(NATURE_CRITTER_BIRD_SCREECH),
+ NATURE_IO_CRITTER_1_BEND_PITCH(48),
+ NATURE_IO_CRITTER_1_NUM_LAYERS(1),
+ NATURE_IO_CRITTER_1_PORT5(32),
+
+ // End
+ NATURE_IO_ENTRIES_END,
+ },
+ },
+
+ // NATURE_ID_MARKET_RUINS
+ {
+ 0xC005, // PlayerIO Data
+ 0x4000, // Channel Mask
+ {
+ // Channel 0
+ NATURE_IO_STREAM_0_TYPE(NATURE_STREAM_HOWLING_WIND),
+ NATURE_IO_STREAM_0_PORT3(32),
+
+ // Channel 2
+ NATURE_IO_CRITTER_1_TYPE(NATURE_CRITTER_BIRD_SCREECH),
+ NATURE_IO_CRITTER_1_BEND_PITCH(48),
+ NATURE_IO_CRITTER_1_NUM_LAYERS(1),
+ NATURE_IO_CRITTER_1_PORT5(32),
+
+ // End
+ NATURE_IO_ENTRIES_END,
+ },
+ },
+
+ // NATURE_ID_KOKIRI_REGION
+ {
+ 0xC01F, // PlayerIO Data
+ 0xC000, // Channel Mask
+ {
+ // Channel 0
+ NATURE_IO_STREAM_0_TYPE(NATURE_STREAM_RUSHING_WATER),
+ NATURE_IO_STREAM_0_PORT3(47),
+
+ // Channel 1
+ NATURE_IO_CRITTER_0_TYPE(NATURE_CRITTER_OWL_HOOT),
+ NATURE_IO_CRITTER_0_BEND_PITCH(0),
+ NATURE_IO_CRITTER_0_NUM_LAYERS(1),
+ NATURE_IO_CRITTER_0_PORT5(16),
+
+ // Channel 2
+ NATURE_IO_CRITTER_1_TYPE(NATURE_CRITTER_CAWING_BIRD),
+ NATURE_IO_CRITTER_1_BEND_PITCH(0),
+ NATURE_IO_CRITTER_1_NUM_LAYERS(1),
+ NATURE_IO_CRITTER_1_PORT5(32),
+
+ // Channel 3
+ NATURE_IO_CRITTER_2_TYPE(NATURE_CRITTER_HAWK_SCREECH),
+ NATURE_IO_CRITTER_2_BEND_PITCH(0),
+ NATURE_IO_CRITTER_2_NUM_LAYERS(0),
+ NATURE_IO_CRITTER_2_PORT5(44),
+
+ // Channel 4
+ NATURE_IO_CRITTER_3_TYPE(NATURE_CRITTER_BIRD_SCREECH),
+ NATURE_IO_CRITTER_3_BEND_PITCH(63),
+ NATURE_IO_CRITTER_3_NUM_LAYERS(1),
+ NATURE_IO_CRITTER_3_PORT5(44),
+
+ // End
+ NATURE_IO_ENTRIES_END,
+ },
+ },
+
+ // NATURE_ID_MARKET_NIGHT
+ {
+ 0xC003, // PlayerIO Data
+ 0xC000, // Channel Mask
+ {
+ // Channel 0
+ NATURE_IO_STREAM_0_TYPE(NATURE_STREAM_RUSHING_WATER),
+ NATURE_IO_STREAM_0_PORT3(0),
+
+ // Channel 1
+ NATURE_IO_CRITTER_0_TYPE(NATURE_CRITTER_CRICKETS),
+ NATURE_IO_CRITTER_0_BEND_PITCH(0),
+ NATURE_IO_CRITTER_0_NUM_LAYERS(1),
+ NATURE_IO_CRITTER_0_PORT5(16),
+
+ // End
+ NATURE_IO_ENTRIES_END,
+ },
+ },
+
+ // NATURE_ID_06
+ {
+ 0xC0FB, // PlayerIO Data
+ 0xC0FA, // Channel Mask
+ {
+ // Channel 0
+ NATURE_IO_STREAM_0_TYPE(NATURE_STREAM_RUSHING_WATER),
+ NATURE_IO_STREAM_0_PORT3(0),
+
+ // Channel 1
+ NATURE_IO_CRITTER_0_TYPE(NATURE_CRITTER_CRICKETS),
+ NATURE_IO_CRITTER_0_BEND_PITCH(0),
+ NATURE_IO_CRITTER_0_NUM_LAYERS(1),
+ NATURE_IO_CRITTER_0_PORT5(16),
+
+ // Channel 3
+ NATURE_IO_CRITTER_2_TYPE(NATURE_CRITTER_BIRD_SCREECH),
+ NATURE_IO_CRITTER_2_BEND_PITCH(112),
+ NATURE_IO_CRITTER_2_NUM_LAYERS(1),
+ NATURE_IO_CRITTER_2_PORT5(48),
+
+ // Channel 4
+ NATURE_IO_CRITTER_3_TYPE(NATURE_CRITTER_HAWK_SCREECH),
+ NATURE_IO_CRITTER_3_BEND_PITCH(127),
+ NATURE_IO_CRITTER_3_NUM_LAYERS(0),
+ NATURE_IO_CRITTER_3_PORT5(16),
+
+ // Channel 5
+ NATURE_IO_CRITTER_4_TYPE(NATURE_CRITTER_BIRD_CHIRP_1),
+ NATURE_IO_CRITTER_4_BEND_PITCH(127),
+ NATURE_IO_CRITTER_4_NUM_LAYERS(1),
+ NATURE_IO_CRITTER_4_PORT5(16),
+
+ // Channel 6
+ NATURE_IO_CRITTER_5_TYPE(NATURE_CRITTER_TAP),
+ NATURE_IO_CRITTER_5_BEND_PITCH(127),
+ NATURE_IO_CRITTER_5_NUM_LAYERS(3),
+ NATURE_IO_CRITTER_5_PORT5(16),
+
+ // Channel 7
+ NATURE_IO_CRITTER_6_TYPE(NATURE_CRITTER_CUCCO_CROWS),
+ NATURE_IO_CRITTER_6_BEND_PITCH(127),
+ NATURE_IO_CRITTER_6_NUM_LAYERS(1),
+ NATURE_IO_CRITTER_6_PORT5(16),
+
+ // End
+ NATURE_IO_ENTRIES_END,
+ },
+ },
+
+ // NATURE_ID_GANONS_LAIR
+ {
+ 0x8001, // PlayerIO Data
+ 0x0, // Channel Mask
+ {
+ // Channel 0
+ NATURE_IO_STREAM_0_TYPE(NATURE_STREAM_HOWLING_WIND),
+ NATURE_IO_STREAM_0_PORT3(32),
+
+ // End
+ NATURE_IO_ENTRIES_END,
+ },
+ },
+
+ // NATURE_ID_08
+ {
+ 0xC003, // PlayerIO Data
+ 0xC000, // Channel Mask
+ {
+ // Channel 0
+ NATURE_IO_STREAM_0_TYPE(NATURE_STREAM_RUSHING_WATER),
+ NATURE_IO_STREAM_0_PORT3(0),
+
+ // Channel 1
+ NATURE_IO_CRITTER_0_TYPE(NATURE_CRITTER_CRICKETS),
+ NATURE_IO_CRITTER_0_BEND_PITCH(0),
+ NATURE_IO_CRITTER_0_NUM_LAYERS(1),
+ NATURE_IO_CRITTER_0_PORT5(16),
+
+ // End
+ NATURE_IO_ENTRIES_END,
+ },
+ },
+
+ // NATURE_ID_09
+ {
+ 0xC003, // PlayerIO Data
+ 0xC000, // Channel Mask
+ {
+ // Channel 0
+ NATURE_IO_STREAM_0_TYPE(NATURE_STREAM_RUSHING_WATER),
+ NATURE_IO_STREAM_0_PORT3(0),
+
+ // Channel 1
+ NATURE_IO_CRITTER_0_TYPE(NATURE_CRITTER_CRICKETS),
+ NATURE_IO_CRITTER_0_BEND_PITCH(0),
+ NATURE_IO_CRITTER_0_NUM_LAYERS(1),
+ NATURE_IO_CRITTER_0_PORT5(16),
+
+ // End
+ NATURE_IO_ENTRIES_END,
+ },
+ },
+
+ // NATURE_ID_WASTELAND
+ {
+ 0xC001, // PlayerIO Data
+ 0xC000, // Channel Mask
+ {
+ // Channel 0
+ NATURE_IO_STREAM_0_TYPE(NATURE_STREAM_SCREECHING_WIND),
+ NATURE_IO_STREAM_0_PORT3(0),
+ NATURE_IO_STREAM_0_PORT4(0),
+
+ // End
+ NATURE_IO_ENTRIES_END,
+ },
+ },
+
+ // NATURE_ID_COLOSSUS
+ {
+ 0xC02F, // PlayerIO Data
+ 0xC02E, // Channel Mask
+ {
+ // Channel 0
+ NATURE_IO_STREAM_0_TYPE(NATURE_STREAM_SCREECHING_WIND),
+ NATURE_IO_STREAM_0_PORT3(0),
+ NATURE_IO_STREAM_0_PORT4(0),
+
+ // Channel 1
+ NATURE_IO_CRITTER_0_TYPE(NATURE_CRITTER_SMALL_BIRD_CHIRPS),
+ NATURE_IO_CRITTER_0_BEND_PITCH(64),
+ NATURE_IO_CRITTER_0_NUM_LAYERS(0),
+ NATURE_IO_CRITTER_0_PORT5(32),
+
+ // Channel 2
+ NATURE_IO_CRITTER_1_TYPE(NATURE_CRITTER_BIRD_CALL),
+ NATURE_IO_CRITTER_1_BEND_PITCH(112),
+ NATURE_IO_CRITTER_1_NUM_LAYERS(1),
+ NATURE_IO_CRITTER_1_PORT5(48),
+
+ // Channel 3
+ NATURE_IO_CRITTER_2_TYPE(NATURE_CRITTER_HAWK_SCREECH),
+ NATURE_IO_CRITTER_2_BEND_PITCH(127),
+ NATURE_IO_CRITTER_2_NUM_LAYERS(0),
+ NATURE_IO_CRITTER_2_PORT5(16),
+
+ // Channel 5
+ NATURE_IO_CRITTER_4_TYPE(NATURE_CRITTER_CRICKETS),
+ NATURE_IO_CRITTER_4_BEND_PITCH(127),
+ NATURE_IO_CRITTER_4_NUM_LAYERS(0),
+ NATURE_IO_CRITTER_4_PORT5(16),
+
+ // End
+ NATURE_IO_ENTRIES_END,
+ },
+ },
+
+ // NATURE_ID_DEATH_MOUNTAIN_TRAIL
+ {
+ 0xC07F, // PlayerIO Data
+ 0xC07E, // Channel Mask
+ {
+ // Channel 0
+ NATURE_IO_STREAM_0_TYPE(NATURE_STREAM_RUSHING_WATER),
+ NATURE_IO_STREAM_0_PORT3(0),
+ NATURE_IO_STREAM_0_PORT4(0),
+
+ // Channel 1
+ NATURE_IO_CRITTER_0_TYPE(NATURE_CRITTER_SMALL_BIRD_CHIRPS),
+ NATURE_IO_CRITTER_0_BEND_PITCH(64),
+ NATURE_IO_CRITTER_0_NUM_LAYERS(0),
+ NATURE_IO_CRITTER_0_PORT5(32),
+
+ // Channel 2
+ NATURE_IO_CRITTER_1_TYPE(NATURE_CRITTER_BIRD_SCREECH),
+ NATURE_IO_CRITTER_1_BEND_PITCH(112),
+ NATURE_IO_CRITTER_1_NUM_LAYERS(1),
+ NATURE_IO_CRITTER_1_PORT5(48),
+
+ // Channel 3
+ NATURE_IO_CRITTER_2_TYPE(NATURE_CRITTER_BIRD_SONG),
+ NATURE_IO_CRITTER_2_BEND_PITCH(127),
+ NATURE_IO_CRITTER_2_NUM_LAYERS(0),
+ NATURE_IO_CRITTER_2_PORT5(16),
+
+ // Channel 4
+ NATURE_IO_CRITTER_3_TYPE(NATURE_CRITTER_LOUD_CHIRPING),
+ NATURE_IO_CRITTER_3_BEND_PITCH(0),
+ NATURE_IO_CRITTER_3_NUM_LAYERS(0),
+ NATURE_IO_CRITTER_3_PORT5(16),
+
+ // Channel 5
+ NATURE_IO_CRITTER_4_TYPE(NATURE_CRITTER_BIRD_CHIRP_1),
+ NATURE_IO_CRITTER_4_BEND_PITCH(0),
+ NATURE_IO_CRITTER_4_NUM_LAYERS(0),
+ NATURE_IO_CRITTER_4_PORT5(16),
+
+ // Channel 6
+ NATURE_IO_CRITTER_5_TYPE(NATURE_CRITTER_TAP),
+ NATURE_IO_CRITTER_5_BEND_PITCH(0),
+ NATURE_IO_CRITTER_5_NUM_LAYERS(0),
+ NATURE_IO_CRITTER_5_PORT5(16),
+
+ // End
+ NATURE_IO_ENTRIES_END,
+ },
+ },
+
+ // NATURE_ID_0D
+ {
+ 0xC003, // PlayerIO Data
+ 0xC000, // Channel Mask
+ {
+ // Channel 0
+ NATURE_IO_STREAM_0_TYPE(NATURE_STREAM_RUSHING_WATER),
+ NATURE_IO_STREAM_0_PORT3(0),
+
+ // Channel 1
+ NATURE_IO_CRITTER_0_TYPE(NATURE_CRITTER_CRICKETS),
+ NATURE_IO_CRITTER_0_BEND_PITCH(0),
+ NATURE_IO_CRITTER_0_NUM_LAYERS(1),
+ NATURE_IO_CRITTER_0_PORT5(16),
+
+ // End
+ NATURE_IO_ENTRIES_END,
+ },
+ },
+
+ // NATURE_ID_0E
+ {
+ 0xC003, // PlayerIO Data
+ 0xC000, // Channel Mask
+ {
+ // Channel 0
+ NATURE_IO_STREAM_0_TYPE(NATURE_STREAM_RUSHING_WATER),
+ NATURE_IO_STREAM_0_PORT3(0),
+
+ // Channel 1
+ NATURE_IO_CRITTER_0_TYPE(NATURE_CRITTER_CRICKETS),
+ NATURE_IO_CRITTER_0_BEND_PITCH(0),
+ NATURE_IO_CRITTER_0_NUM_LAYERS(1),
+ NATURE_IO_CRITTER_0_PORT5(16),
+
+ // End
+ NATURE_IO_ENTRIES_END,
+ },
+ },
+
+ // NATURE_ID_0F
+ {
+ 0xC01F, // PlayerIO Data
+ 0xC000, // Channel Mask
+ {
+ // Channel 0
+ NATURE_IO_STREAM_0_TYPE(NATURE_STREAM_RUSHING_WATER),
+ NATURE_IO_STREAM_0_PORT3(0),
+
+ // Channel 1
+ NATURE_IO_CRITTER_0_TYPE(NATURE_CRITTER_BIRD_CHIRP_1),
+ NATURE_IO_CRITTER_0_BEND_PITCH(80),
+ NATURE_IO_CRITTER_0_NUM_LAYERS(1),
+ NATURE_IO_CRITTER_0_PORT5(8),
+
+ // Channel 2
+ NATURE_IO_CRITTER_1_TYPE(NATURE_CRITTER_SMALL_BIRD_CHIRPS),
+ NATURE_IO_CRITTER_1_BEND_PITCH(80),
+ NATURE_IO_CRITTER_1_NUM_LAYERS(1),
+ NATURE_IO_CRITTER_1_PORT5(48),
+
+ // Channel 3
+ NATURE_IO_CRITTER_2_TYPE(NATURE_CRITTER_LOUD_CHIRPING),
+ NATURE_IO_CRITTER_2_BEND_PITCH(0),
+ NATURE_IO_CRITTER_2_NUM_LAYERS(0),
+ NATURE_IO_CRITTER_2_PORT5(0),
+
+ // Channel 4
+ NATURE_IO_CRITTER_3_TYPE(NATURE_CRITTER_BIRD_SCREECH),
+ NATURE_IO_CRITTER_3_BEND_PITCH(96),
+ NATURE_IO_CRITTER_3_NUM_LAYERS(0),
+ NATURE_IO_CRITTER_3_PORT5(32),
+
+ // End
+ NATURE_IO_ENTRIES_END,
+ },
+ },
+
+ // NATURE_ID_10
+ {
+ 0xC003, // PlayerIO Data
+ 0xC000, // Channel Mask
+ {
+ // Channel 0
+ NATURE_IO_STREAM_0_TYPE(NATURE_STREAM_RUSHING_WATER),
+ NATURE_IO_STREAM_0_PORT3(0),
+
+ // Channel 1
+ NATURE_IO_CRITTER_0_TYPE(NATURE_CRITTER_CRICKETS),
+ NATURE_IO_CRITTER_0_BEND_PITCH(0),
+ NATURE_IO_CRITTER_0_NUM_LAYERS(1),
+ NATURE_IO_CRITTER_0_PORT5(16),
+
+ // End
+ NATURE_IO_ENTRIES_END,
+ },
+ },
+
+ // NATURE_ID_11
+ {
+ 0xC003, // PlayerIO Data
+ 0xC000, // Channel Mask
+ {
+ // Channel 0
+ NATURE_IO_STREAM_0_TYPE(NATURE_STREAM_RUSHING_WATER),
+ NATURE_IO_STREAM_0_PORT3(0),
+
+ // Channel 1
+ NATURE_IO_CRITTER_0_TYPE(NATURE_CRITTER_CRICKETS),
+ NATURE_IO_CRITTER_0_BEND_PITCH(0),
+ NATURE_IO_CRITTER_0_NUM_LAYERS(1),
+ NATURE_IO_CRITTER_0_PORT5(16),
+
+ // End
+ NATURE_IO_ENTRIES_END,
+ },
+ },
+
+ // NATURE_ID_12
+ {
+ 0xC003, // PlayerIO Data
+ 0xC000, // Channel Mask
+ {
+ // Channel 0
+ NATURE_IO_STREAM_0_TYPE(NATURE_STREAM_RUSHING_WATER),
+ NATURE_IO_STREAM_0_PORT3(0),
+
+ // Channel 1
+ NATURE_IO_CRITTER_0_TYPE(NATURE_CRITTER_CRICKETS),
+ NATURE_IO_CRITTER_0_BEND_PITCH(0),
+ NATURE_IO_CRITTER_0_NUM_LAYERS(1),
+ NATURE_IO_CRITTER_0_PORT5(16),
+
+ // End
+ NATURE_IO_ENTRIES_END,
+ },
+ },
+
+ // NATURE_ID_NONE
+ // While there is data for this natureAmbienceId, it is identical to previous entries
+ // and the game treats it as no nature ambience
+ {
+ 0xC003, // PlayerIO Data
+ 0xC000, // Channel Mask
+ {
+ // Channel 0
+ NATURE_IO_STREAM_0_TYPE(NATURE_STREAM_RUSHING_WATER),
+ NATURE_IO_STREAM_0_PORT3(0),
+
+ // Channel 1
+ NATURE_IO_CRITTER_0_TYPE(NATURE_CRITTER_CRICKETS),
+ NATURE_IO_CRITTER_0_BEND_PITCH(0),
+ NATURE_IO_CRITTER_0_NUM_LAYERS(1),
+ NATURE_IO_CRITTER_0_PORT5(16),
+
+ // End
+ NATURE_IO_ENTRIES_END,
+ },
+ },
+};
+
+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;
+u16 sPlaybackNotePos = 0;
+u16 sStaffPlaybackPos = 0;
+u16 D_80130F4C = 0;
+u8 sDisplayedNoteValue = 0xFF; // Note to display on screen?
+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
+ {
+ { 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 },
+ },
+
+ // 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 },
+ },
+
+ // 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 },
+ },
+
+ // 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 },
+ },
+
+ // 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 },
+ },
+
+ // 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 },
+ },
+
+ // 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 },
+ },
+
+ // Epona
+ {
+ { 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 },
+ },
+
+ // 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 },
+ },
+
+ // 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 },
+ },
+
+ // Song of 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 },
+ },
+
+ // 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 },
+ },
+
+ // Scarecrow
+ {
+ { 2, 0, 3, 0, 0, 0, 0 },
+ { 0xFF, 0, 0, 255, 0, 0, 0 },
+ },
+
+ // Lost Woods Memory Game
+ {
+ { 2, 0, 3, 0, 0, 0, 0 },
+ { 0xFF, 0, 0, 0, 0, 0, 0 },
+ },
+};
+
+OcarinaNote* sPlaybackSong = sOcarinaSongs[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,
+};
+u8* gFrogsSongPtr = sFrogsSongNotes;
+u8 sRecordingState = 0;
+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 },
+};
+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
+ { 6,
+ {
+ OCARINA_NOTE_A,
+ OCARINA_NOTE_C_UP,
+ OCARINA_NOTE_C_LEFT,
+ OCARINA_NOTE_C_RIGHT,
+ OCARINA_NOTE_C_LEFT,
+ OCARINA_NOTE_C_RIGHT,
+ } },
+ // 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,
+ } },
+ // Serenade
+ { 5,
+ {
+ OCARINA_NOTE_A,
+ OCARINA_NOTE_C_DOWN,
+ OCARINA_NOTE_C_RIGHT,
+ OCARINA_NOTE_C_RIGHT,
+ OCARINA_NOTE_C_LEFT,
+ } },
+ // Requiem
+ { 6,
+ {
+ OCARINA_NOTE_A,
+ OCARINA_NOTE_C_DOWN,
+ OCARINA_NOTE_A,
+ OCARINA_NOTE_C_RIGHT,
+ OCARINA_NOTE_C_DOWN,
+ OCARINA_NOTE_A,
+ } },
+ // 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,
+ } },
+ // 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,
+ } },
+ // 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,
+ } },
+ // Epona
+ { 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,
+ } },
+ // 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,
+ } },
+ // 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,
+ } },
+ // Song of Time
+ { 6,
+ {
+ OCARINA_NOTE_C_RIGHT,
+ OCARINA_NOTE_A,
+ OCARINA_NOTE_C_DOWN,
+ OCARINA_NOTE_C_RIGHT,
+ OCARINA_NOTE_A,
+ OCARINA_NOTE_C_DOWN,
+ } },
+ // Storms
+ { 6,
+ {
+ OCARINA_NOTE_A,
+ OCARINA_NOTE_C_DOWN,
+ OCARINA_NOTE_C_UP,
+ OCARINA_NOTE_A,
+ OCARINA_NOTE_C_DOWN,
+ OCARINA_NOTE_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 } },
+};
+// clang-format on
+
+/**
+ * BSS
+ */
+u32 sAudioUpdateStartTime; // 8016B7A0
+u32 sAudioUpdateEndTime;
+f32 D_8016B7A8;
+f32 D_8016B7AC;
+f32 D_8016B7B0;
+f32 D_8016B7B4;
+FreqLerp sRiverFreqScaleLerp;
+FreqLerp sWaterfallFreqScaleLerp;
+f32 D_8016B7D8;
+s8 D_8016B7DC;
+f32 D_8016B7E0;
+u16 D_8016B7E4;
+struct {
+ s8 str[5];
+ u16 num;
+} sAudioScrPrtBuf[SCROLL_PRINT_BUF_SIZE];
+u8 D_8016B8B0;
+u8 D_8016B8B1;
+u8 D_8016B8B2;
+u8 D_8016B8B3;
+u8 sAudioGanonDistVol;
+SfxPlayerState sSfxChannelState[0x10];
+
+char sBinToStrBuf[0x20];
+u8 D_8016B9D8;
+u8 sAudioSpecPeakNumNotes[0x12];
+u8 D_8016B9F2;
+u8 D_8016B9F3;
+u8 D_8016B9F4;
+u16 D_8016B9F6;
+
+OcarinaStaff sPlayingStaff;
+OcarinaStaff sDisplayedStaff;
+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;
+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 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_SetGanonDistVol(u8 targetVol);
+
+void func_800EC960(u8 custom) {
+ if (!custom) {
+ 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;
+ } 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;
+ }
+}
+
+void Audio_GetOcaInput(void) {
+ Input inputs[4];
+ Input* input = &inputs[0];
+ u32 sp18;
+
+ 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;
+}
+
+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;
+ } else {
+ inpAdj = (inp * 128) / 64;
+ }
+ ret = gBendPitchTwoSemitonesFrequencies[inpAdj + 128];
+ return ret;
+}
+
+u8 Audio_OcaGetPlayingState(void) {
+ u8 ret;
+
+ if (D_80131878 != 0) {
+ ret = D_80131878 - 1;
+ D_80131878 = 0;
+ } else if (D_80130F3C != 0) {
+ ret = 0xFE;
+ } else {
+ ret = 0xFF;
+ }
+
+ return ret;
+}
+
+u8 Audio_OcaMapNoteValue(u8 arg0) {
+ u8 temp_v1;
+
+ temp_v1 = sNoteValueIndexMap[arg0 & 0x3F];
+ if (temp_v1 == 5) {
+ if (arg0 & 0x80) {
+ return 2;
+ }
+ return 3;
+ }
+ return temp_v1;
+}
+
+void func_800ECB7C(u8 songIdx) {
+ u8 savedSongIdx;
+ u8 scarecrowSongIdx;
+ u8 noteIdx;
+
+ 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];
+ }
+ }
+}
+
+// start ocarina.
+void func_800ECC04(u16 flg) {
+ u8 i;
+
+ if ((sOcarinaSongs[OCARINA_SONG_SCARECROW][1].volume != 0xFF) && ((flg & 0xFFF) == 0xFFF)) {
+ flg |= 0x1000;
+ }
+
+ if ((flg == 0xCFFF) && (sOcarinaSongs[OCARINA_SONG_SCARECROW][1].volume != 0xFF)) {
+ flg = 0xDFFF;
+ }
+
+ if ((flg == 0xFFF) && (sOcarinaSongs[OCARINA_SONG_SCARECROW][1].volume != 0xFF)) {
+ flg = 0x1FFF;
+ }
+
+ if (flg != 0xFFFF) {
+ D_80130F3C = 0x80000000 + (u32)flg;
+ sOcarinaSongNoteStartIdx = 0;
+ sOcarinaSongCnt = 0xE;
+ if (flg != 0xA000) {
+ sOcarinaSongCnt--;
+ }
+ 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;
+ }
+
+ if (flg & 0x8000) {
+ D_8013187C = 0;
+ }
+
+ if (flg & 0x4000) {
+ sOcarinaSongAppendPos = 0;
+ }
+
+ if (flg & 0xD000) {
+ func_800ECB7C(OCARINA_SONG_SCARECROW);
+ }
+ } else {
+ D_80130F3C = 0;
+ sOcarinaInpEnabled = 0;
+ }
+}
+
+void func_800ECDBC(void) {
+ if (sCurOcarinaBtnVal != 0xFF && sOcarinaHasStartedSong == 0) {
+ sOcarinaHasStartedSong = 1;
+ sLearnSongLastBtn = 0xFF;
+ }
+}
+
+void func_800ECDF8(void) {
+ u16 sh;
+ u16 pad;
+ u8 inputChanged = 0;
+ u16 pad2;
+ s8 sp57 = 0;
+ u8 i;
+ OcarinaNote* prevNote;
+ OcarinaNote* note;
+
+ func_800ECDBC();
+
+ if (sOcarinaHasStartedSong) {
+ if ((D_80130F2C < 0 ? -D_80130F2C : D_80130F2C) >= 0x15) {
+ D_80130F3C = 0;
+ return;
+ }
+
+ // clang-format off
+ if (sPrevOcarinaNoteVal == sCurOcarinaBtnVal || sCurOcarinaBtnVal == 0xFF) { inputChanged = 1; }
+ // clang-format on
+
+ for (i = sOcarinaSongNoteStartIdx; i < sOcarinaSongCnt; i++) {
+ sh = 1 << i;
+ if (sOcarinaAvailSongs & sh) {
+ D_8016BA50[i] = D_8016BA70[i] + 0x12;
+ if (inputChanged) {
+ // (pointless if check, this is always true)
+ if ((D_8016BA50[i] >= D_8016BA70[i] - 0x12) && (D_8016BA50[i] >= D_8016BA70[i] + 0x12) &&
+ (sOcarinaSongs[i][sLearnSongPos[i]].unk_02 == 0) &&
+ (sLearnSongLastBtn == sLearnSongExpectedNote[i])) {
+ D_80131878 = i + 1;
+ sOcarinaInpEnabled = 0;
+ D_80130F3C = 0;
+ }
+ } else if (D_8016BA50[i] >= (D_8016BA70[i] - 0x12)) {
+ if (sLearnSongLastBtn != 0xFF) {
+ if (sLearnSongLastBtn == sLearnSongExpectedNote[i]) {
+ if (i == 12) {
+ D_8016BA50[i] = 0;
+ }
+ } else {
+ sOcarinaAvailSongs ^= sh;
+ }
+ }
+
+ prevNote = &sOcarinaSongs[i][sLearnSongPos[i]];
+ note = &sOcarinaSongs[i][++sLearnSongPos[i]];
+ D_8016BA70[i] = prevNote->unk_02;
+ sLearnSongExpectedNote[i] = prevNote->noteIdx;
+
+ if (sCurOcarinaBtnVal != sLearnSongExpectedNote[i]) {
+ sOcarinaAvailSongs ^= sh;
+ }
+ while (prevNote->noteIdx == note->noteIdx ||
+ (note->noteIdx == OCARINA_NOTE_INVALID && note->unk_02 != 0)) {
+ D_8016BA70[i] += note->unk_02;
+ prevNote = &sOcarinaSongs[i][sLearnSongPos[i]];
+ note = &sOcarinaSongs[i][sLearnSongPos[i] + 1];
+ sLearnSongPos[i]++;
+ }
+ } else if (D_8016BA50[i] < 0xA) {
+ sp57 = -1;
+ D_8016BA50[i] = 0;
+ sLearnSongLastBtn = sCurOcarinaBtnVal;
+ } else {
+ sOcarinaAvailSongs ^= sh;
+ }
+ }
+
+ if (sOcarinaAvailSongs == 0 && sStaffPlayingPos >= D_8013187C) {
+ sOcarinaInpEnabled = 0;
+ if (CHECK_BTN_ANY(D_80130F3C, BTN_B) && sCurOcarinaBtnVal == sOcarinaSongs[i][0].noteIdx) {
+ D_80130F4C = D_80130F3C;
+ }
+ D_80130F3C = 0;
+ return;
+ }
+ }
+
+ if (!inputChanged) {
+ sLearnSongLastBtn = sCurOcarinaBtnVal;
+ sStaffPlayingPos += sp57 + 1;
+ }
+ }
+}
+
+void func_800ED200(void) {
+ u32 temp_v0;
+ u8 i;
+ u8 j;
+ u8 k;
+
+ if (CHECK_BTN_ANY(sCurOcarinaBtnPress, BTN_L) && CHECK_BTN_ANY(sCurOcarinaBtnPress, sOcarinaAllowedBtnMask)) {
+ func_800ECC04((u16)D_80130F3C);
+ return;
+ }
+
+ func_800ECDBC();
+
+ if (sOcarinaHasStartedSong) {
+ if ((sPrevOcarinaNoteVal != sCurOcarinaBtnVal) && (sCurOcarinaBtnVal != 0xFF)) {
+ sStaffPlayingPos++;
+ if (sStaffPlayingPos >= 9) {
+ sStaffPlayingPos = 1;
+ }
+
+ if (sOcarinaSongAppendPos == 8) {
+ for (i = 0; i < 7; i++) {
+ sCurOcarinaSong[i] = sCurOcarinaSong[i + 1];
+ }
+ } else {
+ sOcarinaSongAppendPos++;
+ }
+
+ if ((D_80130F2C < 0 ? -D_80130F2C : D_80130F2C) >= 0x15) {
+ sCurOcarinaSong[sOcarinaSongAppendPos - 1] = 0xFF;
+ } else {
+ sCurOcarinaSong[sOcarinaSongAppendPos - 1] = sCurOcarinaBtnVal;
+ }
+
+ for (i = sOcarinaSongNoteStartIdx; i < sOcarinaSongCnt; i++) {
+ if (sOcarinaAvailSongs & (u16)(1 << i)) {
+ for (j = 0, k = 0;
+ j < gOcarinaSongNotes[i].len && k == 0 && sOcarinaSongAppendPos >= gOcarinaSongNotes[i].len;) {
+ temp_v0 = sCurOcarinaSong[(sOcarinaSongAppendPos - gOcarinaSongNotes[i].len) + j];
+ if (temp_v0 == sOcarinaNoteValues[gOcarinaSongNotes[i].notesIdx[j]]) {
+ j++;
+ } else {
+ k++;
+ }
+ }
+
+ if (j == gOcarinaSongNotes[i].len) {
+ D_80131878 = i + 1;
+ sOcarinaInpEnabled = 0;
+ D_80130F3C = 0;
+ }
+ }
+ }
+ }
+ }
+}
+
+void func_800ED458(s32 arg0) {
+ u32 phi_v1_2;
+
+ if (D_80130F3C != 0 && D_80131880 != 0) {
+ D_80131880--;
+ return;
+ }
+
+ if ((D_8016BA10 == 0) ||
+ ((D_8016BA10 & sOcarinaAllowedBtnMask) != (sCurOcarinaBtnPress & sOcarinaAllowedBtnMask))) {
+ D_8016BA10 = 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;
+ } 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);
+ } else {
+ D_80130F2C = 0;
+ D_80130F24 = 1.0f;
+ }
+
+ 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, &D_801333D4, 4, &D_80130F24, &D_80130F28, &D_801333E8);
+ } else if ((sPrevOcarinaNoteVal != 0xFF) && (sCurOcarinaBtnVal == 0xFF)) {
+ Audio_StopSfxById(NA_SE_OC_OCARINA);
+ }
+ }
+}
+
+void func_800ED848(u8 inputEnabled) {
+ sOcarinaInpEnabled = inputEnabled;
+}
+
+void Audio_OcaSetInstrument(u8 arg0) {
+ if (D_80130F10 == arg0) {
+ 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_StopSfxById(NA_SE_OC_OCARINA);
+ Audio_SetSoundBanksMute(0);
+ sPlaybackState = 0;
+ sStaffPlaybackPos = 0;
+ sOcarinaInpEnabled = 0;
+ D_80130F3C = 0;
+ Audio_ClearBGMMute(SFX_PLAYER_CHANNEL_OCARINA);
+ } else {
+ sCurOcarinaBtnPress = 0;
+ Audio_GetOcaInput();
+ D_8016BA10 = sCurOcarinaBtnPress;
+ Audio_QueueSeqCmdMute(SFX_PLAYER_CHANNEL_OCARINA);
+ }
+}
+
+void Audio_OcaSetSongPlayback(s8 songIdxPlusOne, s8 playbackState) {
+ if (songIdxPlusOne == 0) {
+ sPlaybackState = 0;
+ Audio_StopSfxById(NA_SE_OC_OCARINA);
+ return;
+ }
+
+ if (songIdxPlusOne < 0xF) {
+ sPlaybackSong = sOcarinaSongs[songIdxPlusOne - 1];
+ } else {
+ sPlaybackSong = sPierresSong;
+ }
+
+ sPlaybackState = playbackState;
+ sNotePlaybackTimer = 0;
+ sDisplayedNoteValue = 0xFF;
+ sPlaybackNotePos = 0;
+ sStaffPlaybackPos = 0;
+ while (sPlaybackSong[sPlaybackNotePos].noteIdx == OCARINA_NOTE_INVALID) {
+ sPlaybackNotePos++;
+ }
+}
+
+void Audio_OcaPlayback(void) {
+ u32 noteTimerStep;
+ u32 nextNoteTimerStep;
+
+ if (sPlaybackState != 0) {
+ if (sStaffPlaybackPos == 0) {
+ noteTimerStep = 3;
+ } else {
+ noteTimerStep = D_8016BA04 - D_80130F68;
+ }
+
+ if (noteTimerStep < sNotePlaybackTimer) {
+ sNotePlaybackTimer -= noteTimerStep;
+ } else {
+ nextNoteTimerStep = noteTimerStep - sNotePlaybackTimer;
+ sNotePlaybackTimer = 0;
+ }
+
+ if (sNotePlaybackTimer == 0) {
+
+ sNotePlaybackTimer = sPlaybackSong[sPlaybackNotePos].unk_02;
+
+ if (sPlaybackNotePos == 1) {
+ sNotePlaybackTimer++;
+ }
+
+ if (sNotePlaybackTimer == 0) {
+ sPlaybackState--;
+ if (sPlaybackState != 0) {
+ sPlaybackNotePos = 0;
+ sStaffPlaybackPos = 0;
+ sDisplayedNoteValue = 0xFF;
+ } else {
+ Audio_StopSfxById(NA_SE_OC_OCARINA);
+ }
+ return;
+ } else {
+ sNotePlaybackTimer -= nextNoteTimerStep;
+ }
+
+ if (sNotePlaybackVolume != sPlaybackSong[sPlaybackNotePos].volume) {
+ sNotePlaybackVolume = sPlaybackSong[sPlaybackNotePos].volume;
+ sNormalizedNotePlaybackVolume = sNotePlaybackVolume / 127.0f;
+ }
+
+ if (sNotePlaybackVibrato != sPlaybackSong[sPlaybackNotePos].vibrato) {
+ sNotePlaybackVibrato = sPlaybackSong[sPlaybackNotePos].vibrato;
+ Audio_QueueCmdS8(0x6 << 24 | SEQ_PLAYER_SFX << 16 | 0xD06, sNotePlaybackVibrato);
+ }
+
+ if (sNotePlaybackTone != sPlaybackSong[sPlaybackNotePos].tone) {
+ sNotePlaybackTone = sPlaybackSong[sPlaybackNotePos].tone;
+ sNormalizedNotePlaybackTone = Audio_OcaAdjStick(sNotePlaybackTone);
+ }
+
+ if ((sPlaybackSong[sPlaybackNotePos].volume == sPlaybackSong[sPlaybackNotePos - 1].volume &&
+ (sPlaybackSong[sPlaybackNotePos].vibrato == sPlaybackSong[sPlaybackNotePos - 1].vibrato) &&
+ (sPlaybackSong[sPlaybackNotePos].tone == sPlaybackSong[sPlaybackNotePos - 1].tone))) {
+ sDisplayedNoteValue = 0xFE;
+ }
+
+ if (sDisplayedNoteValue != sPlaybackSong[sPlaybackNotePos].noteIdx) {
+ u8 tmp = sPlaybackSong[sPlaybackNotePos].noteIdx;
+
+ if (tmp == 0xA) {
+ sDisplayedNoteValue = tmp + sPlaybackSong[sPlaybackNotePos].semitone;
+ } else {
+ sDisplayedNoteValue = tmp;
+ }
+
+ if (sDisplayedNoteValue != 0xFF) {
+ sStaffPlaybackPos++;
+ Audio_QueueCmdS8(0x6 << 24 | SEQ_PLAYER_SFX << 16 | 0xD07, D_80130F10 - 1);
+ Audio_QueueCmdS8(0x6 << 24 | SEQ_PLAYER_SFX << 16 | 0xD05, sDisplayedNoteValue & 0x3F);
+ Audio_PlaySoundGeneral(NA_SE_OC_OCARINA, &D_801333D4, 4, &sNormalizedNotePlaybackTone,
+ &sNormalizedNotePlaybackVolume, &D_801333E8);
+ } else {
+ Audio_StopSfxById(NA_SE_OC_OCARINA);
+ }
+ }
+ sPlaybackNotePos++;
+ }
+ }
+}
+
+void func_800EDD68(u8 arg0) {
+ u16 i;
+ u16 i2;
+ u16 pad;
+ u8 lastNote;
+ OcarinaNote* note;
+ u8 j;
+ u8 k;
+ s32 t;
+ OcarinaNote* song;
+
+ if (sRecordingState == 1) {
+ song = gScarecrowCustomSongPtr;
+ } 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;
+ sRecordSongPos++;
+
+ if ((sRecordSongPos != 107) && (arg0 == 0)) {
+ return;
+ }
+
+ i = sRecordSongPos;
+ lastNote = 0xFF;
+ while (i != 0 && lastNote == 0xFF) {
+ i--;
+ lastNote = song[i].noteIdx;
+ }
+
+ if (1) {}
+
+ if (sRecordSongPos != (i + 1)) {
+ sRecordSongPos = i + 2;
+ song[sRecordSongPos - 1].unk_02 = 0;
+ }
+
+ song[sRecordSongPos].unk_02 = 0;
+
+ if (sRecordingState == 2) {
+ if (sStaffPlayingPos >= 8) {
+ for (i = 0; i < sRecordSongPos; i++) {
+ song[i] = song[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];
+ k++) {
+ ;
+ }
+
+ if (k == gOcarinaSongNotes[i].len) {
+ sRecordingState = 0xFF;
+ sOcarinaSongs[OCARINA_SONG_SCARECROW][1].volume = 0xFF;
+ return;
+ }
+ }
+ }
+
+ i = 1;
+ while (i < 8) {
+ if (gOcarinaSongNotes[OCARINA_SONG_SCARECROW].notesIdx[0] !=
+ gOcarinaSongNotes[OCARINA_SONG_SCARECROW].notesIdx[i]) {
+ i = 9;
+ } else {
+ i++;
+ }
+ }
+
+ if (i == 8) {
+ sRecordingState = 0xFF;
+ sOcarinaSongs[OCARINA_SONG_SCARECROW][1].volume = 0xFF;
+ return;
+ }
+
+ for (i = 0; i < sRecordSongPos; i++) {
+ sOcarinaSongs[OCARINA_SONG_SCARECROW][i] = sOcarinaSongs[OCARINA_SONG_MEMORY_GAME][i];
+ }
+
+ sOcarinaInpEnabled = 0;
+ } else {
+ sOcarinaSongs[OCARINA_SONG_SCARECROW][1].volume = 0xFF;
+ }
+ }
+ sRecordingState = 0;
+}
+
+// start custom song?
+/**
+ * recordingState = 1, start long scarecrows song
+ * recordingState = 0, end
+ * recordingState = 2, also scarecrows song
+ */
+void Audio_OcaSetRecordingState(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;
+ sRecordSongPos = 0;
+ sOcarinaInpEnabled = 1;
+ sStaffPlayingPos = 0;
+ D_8016BAA0 = sPierresSong[1];
+ } else {
+ if (sRecordSongPos == 0) {
+ sPierresSong[1] = D_8016BAA0;
+ } else {
+ if (sRecordingState == 2) {
+ sStaffPlayingPos = 1;
+ }
+
+ func_800EDD68(1);
+ }
+
+ sOcarinaInpEnabled = 0;
+ sStaffPlayingPos = 0;
+ }
+
+ sRecordingState = recordingState;
+}
+
+void Audio_OcaUpdateRecordingStaff(void) {
+ sRecordingStaff.state = sRecordingState;
+ sRecordingStaff.pos = sStaffPlayingPos;
+ if (sRecordingState == 0xFF) {
+ sRecordingState = 0;
+ }
+}
+
+void Audio_OcaUpdatePlayingStaff(void) {
+ sPlayingStaff.noteIdx = sCurOcarinaBtnIdx & 0x3F;
+ sPlayingStaff.state = Audio_OcaGetPlayingState();
+ sPlayingStaff.pos = sStaffPlayingPos;
+}
+
+void Audio_OcaUpdateDisplayedStaff(void) {
+ if ((sDisplayedNoteValue & 0x3F) < 0x10) {
+ sDisplayedStaff.noteIdx = Audio_OcaMapNoteValue(sDisplayedNoteValue);
+ }
+
+ sDisplayedStaff.state = sPlaybackState;
+
+ if (sPlaybackSong != sPierresSong) {
+ sDisplayedStaff.pos = sStaffPlaybackPos;
+ } else if (sStaffPlaybackPos == 0) {
+ sDisplayedStaff.pos = 0;
+ } else {
+ sDisplayedStaff.pos = ((sStaffPlaybackPos - 1) % 8) + 1;
+ }
+}
+
+OcarinaStaff* Audio_OcaGetRecordingStaff(void) {
+ return &sRecordingStaff;
+}
+
+OcarinaStaff* Audio_OcaGetPlayingStaff(void) {
+ if (sPlayingStaff.state < 0xFE) {
+ D_80130F3C = 0;
+ }
+ return &sPlayingStaff;
+}
+
+OcarinaStaff* Audio_OcaGetDisplayingStaff(void) {
+ return &sDisplayedStaff;
+}
+
+void func_800EE404(void) {
+ s32 noteChanged;
+
+ if ((sRecordingState != 0) && ((D_8016BA04 - D_80131860) >= 3)) {
+ noteChanged = false;
+ if (D_80131864 != sCurOcarinaBtnVal) {
+ if (sCurOcarinaBtnVal != 0xFF) {
+ sRecordingStaff.noteIdx = sCurOcarinaBtnIdx & 0x3F;
+ sStaffPlayingPos++;
+ } else if ((sRecordingState == 2) && (sStaffPlayingPos == 8)) {
+ func_800EDD68(1);
+ return;
+ }
+
+ if (sStaffPlayingPos > 8) {
+ if (sRecordingState == 2) {
+ // notes played are over 8 and in recording mode.
+ func_800EDD68(1);
+ return;
+ }
+ sStaffPlayingPos = true;
+ }
+
+ noteChanged = true;
+ } else if (D_80131868 != D_80130F30) {
+ noteChanged = true;
+ } else if (D_8013186C != D_80130F34) {
+ noteChanged = true;
+ } else if (D_80131870 != D_80130F2C) {
+ noteChanged = true;
+ }
+
+ if (noteChanged) {
+ func_800EDD68(0);
+ D_80131860 = D_8016BA04;
+ }
+ }
+}
+
+void Audio_OcaMemoryGameStart(u8 minigameRound) {
+ u8 i;
+
+ if (minigameRound > 2) {
+ minigameRound = 2;
+ }
+
+ sOcaMinigameAppendPos = 0;
+ sOcaMinigameEndPos = sOcaMinigameNoteCnts[minigameRound];
+
+ for (i = 0; i < 3; i++) {
+ Audio_OcaMemoryGameGenNote();
+ }
+}
+
+s32 Audio_OcaMemoryGameGenNote(void) {
+ u32 rnd;
+ u8 rndNote;
+
+ if (sOcaMinigameAppendPos == sOcaMinigameEndPos) {
+ return 1;
+ }
+
+ rnd = Audio_NextRandom();
+ rndNote = sOcarinaNoteValues[rnd % 5];
+
+ if (sOcarinaSongs[OCARINA_SONG_MEMORY_GAME][sOcaMinigameAppendPos - 1].noteIdx == rndNote) {
+ rndNote = sOcarinaNoteValues[(rnd + 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;
+
+ sOcaMinigameAppendPos++;
+
+ 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;
+ if (1) {}
+ return 0;
+}
+
+// input update?
+void func_800EE6F4(void) {
+ D_8016BA04 = gAudioContext.totalTaskCnt;
+ if (D_80130F10 != 0) {
+ if (sOcarinaInpEnabled == 1) {
+ Audio_GetOcaInput();
+ }
+ if ((sPlaybackState == 0) && (sOcarinaInpEnabled == 1)) {
+ func_800ED458(0);
+ }
+ if (D_80130F3C != 0) {
+ if (D_80130F3C & 0x4000) {
+ func_800ED200();
+ } else {
+ func_800ECDF8();
+ }
+ }
+
+ Audio_OcaPlayback();
+ D_80130F68 = D_8016BA04;
+
+ if (sPlaybackState == 0) {
+ func_800EE404();
+ }
+
+ if ((D_80130F3C != 0) && (sPrevOcarinaNoteVal != sCurOcarinaBtnVal)) {
+ D_80131880 = 1;
+ }
+
+ sPrevOcarinaNoteVal = sCurOcarinaBtnVal;
+ }
+
+ Audio_OcaUpdatePlayingStaff();
+ Audio_OcaUpdateDisplayedStaff();
+ Audio_OcaUpdateRecordingStaff();
+}
+
+void func_800EE824(void) {
+ static u8 D_80131C80 = 0;
+ static u8 D_80131C84 = 1;
+ static u16 D_80131C88 = 1200;
+
+ switch (D_80131C80) {
+ case 0:
+ if (D_80131C88-- == 0) {
+ if (D_80131C84 < 7) {
+ D_80131C80++;
+ } else {
+ D_80131C80 = 3;
+ Audio_OcaSetInstrument(0);
+ }
+ D_80131C88 = 1200;
+ }
+ break;
+ case 1:
+ Audio_SetSoundBanksMute(0);
+ Audio_OcaSetInstrument(D_80131C84);
+ Audio_OcaSetSongPlayback(OCARINA_SONG_SCARECROW_LONG + 1, 1);
+ D_80131C84++;
+ D_80131C80++;
+ break;
+ case 2:
+ if (Audio_OcaGetDisplayingStaff()->state == 0) {
+ D_80131C80 = 0;
+ }
+ break;
+ }
+}
+
+void func_800EE930(void) {
+ sPlayingStaff.noteIdx = OCARINA_NOTE_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;
+ sRecordingStaff.pos = 0;
+ D_80131880 = 0;
+}
+
+f32 D_80131C8C = 0.0f;
+
+// === Audio Debugging ===
+
+// These variables come between in-function statics in func_800EE824 and Audio_SplitBgmChannels
+
+f32 sAudioUpdateDuration = 0.0f;
+f32 sAudioUpdateDurationMax = 0.0f;
+u8 sAudioDebugEverOpened = 0;
+u8 sAudioSfxMuted = 0;
+u8 sAudioDebugPage = 0;
+u8 sAudioSndContSel = 0;
+u8 sAudioDebugTextColor = 7;
+char sAudioDebugPageNames[15][23] = {
+ "Non",
+ "Sound Control",
+ "Spec Info",
+ "Heap Info",
+ "Grp Track Info",
+ "Sub Track Info",
+ "Channel Info",
+ "Interface Info",
+ "SE Flag Swap",
+ "Block Change BGM",
+ "Natural Sound Control",
+ "Ocarina Test",
+ "SE Parameter Change",
+ "Scroll Print",
+ "Free Area",
+};
+u16 sAudioSndContWork[11] = { 0 };
+u16 sAudioSndContWorkLims[11] = { 128, 128, 7, 512, 4, 2, 16, 32, 2, 2, 2 };
+char sSoundBankNames[7][11] = { "PLAYER", "ITEM", "ENVIROMENT", "ENEMY", "SYSTEM", "OCARINA", "VOICE" };
+char sSoundModeNames[5][10] = { "W-STEREO", "HEADPHONE", "3D SOUND", "MONO", "" };
+s8 sAudioIntInfoX = 0;
+s8 sAudioIntInfoY = 0;
+s8 sAudioIntInfoSel = 0;
+s8 sAudioIntInfoBankPage[7] = { 0, 0, 2, 2, 0, 0, 0 };
+u8 sAudioScrPrtSel = 0;
+u8 sAudioScrPrtInd = 0;
+u8 sAudioScrPrtOverflow = 0;
+s8 sAudioScrPrtX = 26;
+s8 sAudioScrPrtY = 1;
+u8 sAudioScrPrtWork[11] = { 1, 19, 6, 0, 0, 0, 0, 0, 0, 0, 1 };
+u8 sAudioScrPrtWorkLims[11] = { 2, SCROLL_PRINT_BUF_SIZE, 8, 2, 2, 2, 2, 2, 2, 2, 2 };
+u8 sAudioSubTrackInfoSpec = 0;
+u8 sAudioSfxSwapIsEditing = 0;
+u8 sAudioSfxSwapSel = 0;
+u8 sAudioSfxSwapNibbleSel = 0;
+char sAudioSfxSwapModeNames[2][5] = { "SWAP", "ADD" };
+u8 sAudioSfxParamChgSel = 0;
+u8 sAudioSfxParamChgBitSel = 0;
+u16 sAudioSfxParamChgWork[4] = { 0 };
+u8 sAudioSubTrackInfoPlayerSel = SEQ_PLAYER_BGM_MAIN;
+u8 sAudioSubTrackInfoChannelSel = 0;
+u8 sSeqPlayerPeakNumLayers[20] = { 0 };
+char sAudioSceneNames[3][2] = { "A", "S", "X" };
+u8 sAudioBlkChgBgmWork[2] = { 0 };
+u8 sAudioBlkChgBgmSel = 0;
+char sBoolStrs[3][5] = { "OFF", "ON", "STBY" };
+u8 sAudioNatureFailed = false;
+u8 sPeakNumNotes = 0;
+
+void AudioDebug_SetInput(void) {
+ Input inputs[4];
+ u32 btn;
+
+ PadMgr_RequestPadData(&gPadMgr, inputs, 0);
+ btn = inputs[3].cur.button;
+ sDebugPadHold = btn & 0xFFFF;
+ sDebugPadPress = (btn ^ sDebugPadBtnLast) & btn;
+ sDebugPadBtnLast = btn;
+}
+
+char* AudioDebug_ToStringBinary(u32 num, u8 bits) {
+ u8 i;
+ u32 flg = 1;
+
+ for (i = 0; i < bits; flg *= 2, i++) {
+ if (num & flg) {
+ sBinToStrBuf[bits - i - 1] = '1';
+ } else {
+ sBinToStrBuf[bits - i - 1] = '0';
+ }
+ }
+
+ sBinToStrBuf[bits] = '\0';
+ return sBinToStrBuf;
+}
+
+void AudioDebug_Draw(GfxPrint* printer) {
+ s32 pad[3];
+ u8 i;
+ u8 j;
+ u8 ctr;
+ u8 ctr2;
+ s8 k;
+ s8 k2;
+ s8 ind;
+ u8 numEnabledNotes = 0;
+ char digitStr[2] = "1";
+
+#define SETCOL_COMMON(v, r, g, b) \
+ GfxPrint_SetColor(printer, ((v & 4) >> 2) * (r), ((v & 2) >> 1) * (g), (v & 1) * (b), 255)
+#define SETCOL(r, g, b) SETCOL_COMMON(sAudioDebugTextColor, r, g, b)
+#define SETCOL_SCROLLPRINT(r, g, b) SETCOL_COMMON(sAudioScrPrtWork[2], r, g, b)
+
+ sAudioDebugEverOpened = true;
+ GfxPrint_SetPos(printer, 3, 2);
+ SETCOL(255, 255, 255);
+ GfxPrint_Printf(printer, "Audio Debug Mode");
+
+ GfxPrint_SetPos(printer, 3, 3);
+ GfxPrint_Printf(printer, "- %s -", sAudioDebugPageNames[sAudioDebugPage]);
+
+ for (i = 0; i < gAudioSpecs[gAudioSpecId].numNotes; i++) {
+ if (gAudioContext.notes[i].noteSubEu.bitField0.enabled == 1) {
+ numEnabledNotes++;
+ }
+ }
+
+ if (sPeakNumNotes < numEnabledNotes) {
+ sPeakNumNotes = numEnabledNotes;
+ }
+ if (sAudioSpecPeakNumNotes[gAudioSpecId] < numEnabledNotes) {
+ sAudioSpecPeakNumNotes[gAudioSpecId] = numEnabledNotes;
+ }
+
+ if (sAudioScrPrtWork[0] != 0) {
+ GfxPrint_SetPos(printer, sAudioScrPrtX, sAudioScrPrtY);
+ SETCOL_SCROLLPRINT(200, 200, 200);
+ GfxPrint_Printf(printer, "Audio ScrPrt");
+
+ ind = sAudioScrPrtInd;
+ for (k = 0; k < sAudioScrPrtWork[1] + 1; k++) {
+ if (ind == 0) {
+ if (sAudioScrPrtOverflow == 1) {
+ ind = SCROLL_PRINT_BUF_SIZE - 1;
+ } else {
+ k = sAudioScrPrtWork[1] + 1; // "break;"
+ }
+ } else {
+ ind--;
+ }
+ if (k != sAudioScrPrtWork[1] + 1) {
+ if ((ind % 5) != 0) {
+ SETCOL_SCROLLPRINT(180, 180, 180);
+ } else {
+ SETCOL_SCROLLPRINT(120, 120, 120);
+ }
+ GfxPrint_SetPos(printer, 2 + sAudioScrPrtX, sAudioScrPrtY + sAudioScrPrtWork[1] + 1 - k);
+ GfxPrint_Printf(printer, "%s", sAudioScrPrtBuf[ind].str);
+
+ GfxPrint_SetPos(printer, 7 + sAudioScrPrtX, sAudioScrPrtY + sAudioScrPrtWork[1] + 1 - k);
+ GfxPrint_Printf(printer, "%04X", sAudioScrPrtBuf[ind].num);
+ }
+ }
+ }
+
+ switch (sAudioDebugPage) {
+ case PAGE_NON:
+ GfxPrint_SetPos(printer, 3, 4);
+ SETCOL(255, 64, 64);
+ GfxPrint_Printf(printer, "BGM CANCEL:%s", sBoolStrs[sAudioSndContWork[5]]);
+
+ GfxPrint_SetPos(printer, 3, 5);
+ GfxPrint_Printf(printer, "SE MUTE:%s", sBoolStrs[sAudioSfxMuted]);
+
+ GfxPrint_SetPos(printer, 18, 4);
+ SETCOL(255, 255, 255);
+ GfxPrint_Printf(printer, "PUSH CONT-4 A-BTN");
+
+ ind = (s8)sAudioSndContWork[2];
+ i = gSoundBanks[ind][0].next;
+ j = 0;
+ SETCOL(255, 255, 255);
+ GfxPrint_SetPos(printer, 3, 6);
+ GfxPrint_Printf(printer, "SE HANDLE:%s", sSoundBankNames[ind]);
+
+ while (i != 0xFF) {
+ GfxPrint_SetPos(printer, 3, 7 + j++);
+ GfxPrint_Printf(printer, "%02x %04x %02x %08x", i, gSoundBanks[ind][i].sfxId, gSoundBanks[ind][i].state,
+ gSoundBanks[ind][i].priority);
+ i = gSoundBanks[ind][i].next;
+ }
+ break;
+
+ case PAGE_SOUND_CONTROL:
+ GfxPrint_SetPos(printer, 2, 4 + sAudioSndContSel);
+ SETCOL(127, 255, 127);
+ GfxPrint_Printf(printer, "*");
+
+ SETCOL(255, 255, 255);
+ GfxPrint_SetPos(printer, 3, 4);
+ GfxPrint_Printf(printer, "Seq 0 : %2x", sAudioSndContWork[0]);
+
+ GfxPrint_SetPos(printer, 3, 5);
+ GfxPrint_Printf(printer, "Seq 1 : %2x", sAudioSndContWork[1]);
+
+ GfxPrint_SetPos(printer, 3, 6);
+ GfxPrint_Printf(printer, "SE HD : %2x %s", sAudioSndContWork[2], sSoundBankNames[sAudioSndContWork[2]]);
+
+ GfxPrint_SetPos(printer, 3, 7);
+ GfxPrint_Printf(printer, "SE No. :%3x", sAudioSndContWork[3]);
+
+ GfxPrint_SetPos(printer, 3, 8);
+ GfxPrint_Printf(printer, "S-Out : %2x %s", sAudioSndContWork[4], sSoundModeNames[sAudioSndContWork[4]]);
+
+ GfxPrint_SetPos(printer, 3, 9);
+ GfxPrint_Printf(printer, "BGM Ent: %2x", sAudioSndContWork[5]);
+
+ GfxPrint_SetPos(printer, 3, 10);
+ GfxPrint_Printf(printer, "Spec : %2x", sAudioSndContWork[6]);
+
+ GfxPrint_SetPos(printer, 3, 11);
+ GfxPrint_Printf(printer, "Na Snd : %2x", sAudioSndContWork[7]);
+
+ GfxPrint_SetPos(printer, 3, 12);
+ GfxPrint_Printf(printer, "Cam Wt : %s", sBoolStrs[sAudioSndContWork[8]]);
+
+ GfxPrint_SetPos(printer, 3, 13);
+ GfxPrint_Printf(printer, "Lnk Wt : %s", sBoolStrs[sAudioSndContWork[9]]);
+
+ GfxPrint_SetPos(printer, 3, 14);
+ GfxPrint_Printf(printer, "SE Ent : %2x", sAudioSndContWork[10]);
+ break;
+
+ case PAGE_INTERFACE_INFO:
+ ind = 0;
+ for (k = 0; k < 7; k++) {
+ if (k == sAudioIntInfoSel) {
+ SETCOL(255, 127, 127);
+ } else {
+ SETCOL(255, 255, 255);
+ }
+ GfxPrint_SetPos(printer, 2 + sAudioIntInfoX, 4 + ind + sAudioIntInfoY);
+ GfxPrint_Printf(printer, "%s <%d>", sSoundBankNames[k], sAudioIntInfoBankPage[k]);
+
+ for (k2 = 0; k2 < gChannelsPerBank[gSfxChannelLayout][k]; k2++) {
+#define entryIndex (gActiveSounds[k][k2].entryIndex)
+#define entry (&gSoundBanks[k][entryIndex])
+#define chan (gAudioContext.seqPlayers[SEQ_PLAYER_SFX].channels[entry->channelIdx])
+ GfxPrint_SetPos(printer, 2 + sAudioIntInfoX, 5 + ind + sAudioIntInfoY);
+ if (sAudioIntInfoBankPage[k] == 1) {
+ if ((entryIndex != 0xFF) &&
+ ((entry->state == SFX_STATE_PLAYING_1) || (entry->state == SFX_STATE_PLAYING_2))) {
+ GfxPrint_Printf(printer, "%2X %5d %5d %5d %02X %04X %04X", entryIndex, (s32)*entry->posX,
+ (s32)*entry->posY, (s32)*entry->posZ, entry->sfxImportance,
+ entry->sfxParams, entry->sfxId);
+ } else {
+ GfxPrint_Printf(printer, "FF ----- ----- ----- -- ---- ----");
+ }
+ } else if (sAudioIntInfoBankPage[k] == 2) {
+ if ((entryIndex != 0xFF) &&
+ ((entry->state == SFX_STATE_PLAYING_1) || (entry->state == SFX_STATE_PLAYING_2))) {
+ GfxPrint_Printf(printer, "%2X %5d %5d %5d %3d %3d %04X", entryIndex, (s32)*entry->posX,
+ (s32)*entry->posY, (s32)*entry->posZ, (s32)(chan->volume * 127.1f),
+ chan->newPan, entry->sfxId);
+ } else {
+ GfxPrint_Printf(printer, "FF ----- ----- ----- --- --- ----");
+ }
+ } else if (sAudioIntInfoBankPage[k] == 3) {
+ if ((entryIndex != 0xFF) &&
+ ((entry->state == SFX_STATE_PLAYING_1) || (entry->state == SFX_STATE_PLAYING_2))) {
+ GfxPrint_Printf(printer, "%2X %5d %5d %5d %3d %3d %04X", entryIndex, (s32)*entry->posX,
+ (s32)*entry->posY, (s32)*entry->posZ, (s32)(chan->freqScale * 100.0f),
+ chan->reverb, entry->sfxId);
+ } else {
+ GfxPrint_Printf(printer, "FF ----- ----- ----- --- --- ----");
+ }
+ } else if (sAudioIntInfoBankPage[k] == 4) {
+ if ((entryIndex != 0xFF) &&
+ ((entry->state == SFX_STATE_PLAYING_1) || (entry->state == SFX_STATE_PLAYING_2))) {
+ GfxPrint_Printf(printer, "%2X %04X", entryIndex, entry->sfxId);
+ } else {
+ GfxPrint_Printf(printer, "FF ----");
+ }
+ }
+#undef entryIndex
+#undef entry
+#undef chan
+
+ if (sAudioIntInfoBankPage[k] != 0) {
+ ind++;
+ }
+ }
+ ind++;
+ }
+ break;
+
+ case PAGE_SCROLL_PRINT:
+ GfxPrint_SetPos(printer, 2, 4 + sAudioScrPrtSel);
+ SETCOL(255, 255, 255);
+ GfxPrint_Printf(printer, "*");
+
+ SETCOL(255, 255, 255);
+ GfxPrint_SetPos(printer, 3, 4);
+ GfxPrint_Printf(printer, "Swicth : %d", sAudioScrPrtWork[0]);
+
+ GfxPrint_SetPos(printer, 3, 5);
+ GfxPrint_Printf(printer, "Lines : %d", sAudioScrPrtWork[1] + 1);
+
+ GfxPrint_SetPos(printer, 3, 6);
+ GfxPrint_Printf(printer, "Color : %d", sAudioScrPrtWork[2]);
+
+ GfxPrint_SetPos(printer, 3, 7);
+ GfxPrint_Printf(printer, "%s : %d", sSoundBankNames[0], sAudioScrPrtWork[3]);
+
+ GfxPrint_SetPos(printer, 3, 8);
+ GfxPrint_Printf(printer, "%s : %d", sSoundBankNames[1], sAudioScrPrtWork[4]);
+
+ GfxPrint_SetPos(printer, 3, 9);
+ GfxPrint_Printf(printer, "ENVRONM : %d", sAudioScrPrtWork[5]);
+
+ GfxPrint_SetPos(printer, 3, 10);
+ GfxPrint_Printf(printer, "%s : %d", sSoundBankNames[3], sAudioScrPrtWork[6]);
+
+ GfxPrint_SetPos(printer, 3, 11);
+ GfxPrint_Printf(printer, "%s : %d", sSoundBankNames[4], sAudioScrPrtWork[7]);
+
+ GfxPrint_SetPos(printer, 3, 12);
+ GfxPrint_Printf(printer, "%s : %d", sSoundBankNames[5], sAudioScrPrtWork[8]);
+
+ GfxPrint_SetPos(printer, 3, 13);
+ GfxPrint_Printf(printer, "%s : %d", sSoundBankNames[6], sAudioScrPrtWork[9]);
+
+ GfxPrint_SetPos(printer, 3, 14);
+ GfxPrint_Printf(printer, "SEQ ENT : %d", sAudioScrPrtWork[10]);
+ break;
+
+ case PAGE_SFX_SWAP:
+ GfxPrint_SetPos(printer, 3, 4);
+ SETCOL(255, 255, 255);
+ if (gAudioSfxSwapOff) {
+ GfxPrint_Printf(printer, "SWAP OFF");
+ }
+
+ if (sAudioSfxSwapIsEditing == 0) {
+ SETCOL(255, 255, 255);
+ } else {
+ SETCOL(127, 127, 127);
+ }
+ GfxPrint_SetPos(printer, 2, 6 + sAudioSfxSwapSel);
+ GfxPrint_Printf(printer, "*");
+
+ ctr = sAudioSfxSwapNibbleSel;
+ if (sAudioSfxSwapNibbleSel >= 4) {
+ ctr++;
+ }
+ if (sAudioSfxSwapIsEditing == 1) {
+ SETCOL(255, 255, 255);
+ GfxPrint_SetPos(printer, 3 + ctr, 5);
+ GfxPrint_Printf(printer, "V");
+ }
+
+ for (i = 0; i < 10; i++) {
+ if (i == sAudioSfxSwapSel) {
+ if (sAudioSfxSwapIsEditing == 0) {
+ SETCOL(192, 192, 192);
+ } else {
+ SETCOL(255, 255, 255);
+ }
+ } else if (sAudioSfxSwapIsEditing == 0) {
+ SETCOL(144, 144, 144);
+ } else {
+ SETCOL(96, 96, 96);
+ }
+ GfxPrint_SetPos(printer, 3, 6 + i);
+ GfxPrint_Printf(printer, "%04x %04x %s", gAudioSfxSwapSource[i], gAudioSfxSwapTarget[i],
+ sAudioSfxSwapModeNames[gAudioSfxSwapMode[i]]);
+ }
+ break;
+
+ case PAGE_SUB_TRACK_INFO:
+ GfxPrint_SetPos(printer, 3, 4);
+ SETCOL(255, 255, 255);
+ GfxPrint_Printf(printer, "Group Track:%d", sAudioSubTrackInfoPlayerSel);
+
+ GfxPrint_SetPos(printer, 3, 5);
+ GfxPrint_Printf(printer, "Sub Track :%d", sAudioSubTrackInfoChannelSel);
+
+ GfxPrint_SetPos(printer, 3, 6);
+ GfxPrint_Printf(printer, "TRK NO. ");
+
+ GfxPrint_SetPos(printer, 3, 7);
+ GfxPrint_Printf(printer, "ENTRY ");
+
+ GfxPrint_SetPos(printer, 3, 8);
+ GfxPrint_Printf(printer, "MUTE ");
+
+ GfxPrint_SetPos(printer, 3, 9);
+ GfxPrint_Printf(printer, "OPENNOTE");
+
+ ctr2 = 0;
+ for (i = 0; i < 16; i++) {
+ if (i == sAudioSubTrackInfoChannelSel) {
+ SETCOL(255, 255, 255);
+ } else {
+ SETCOL(200, 200, 200);
+ }
+ GfxPrint_SetPos(printer, 15 + i, 6);
+ GfxPrint_Printf(printer, "%1X", i);
+
+ GfxPrint_SetPos(printer, 15 + i, 7);
+ if (gAudioContext.seqPlayers[sAudioSubTrackInfoPlayerSel].channels[i]->enabled) {
+ GfxPrint_Printf(printer, "O");
+ } else {
+ GfxPrint_Printf(printer, "X");
+ }
+
+ GfxPrint_SetPos(printer, 15 + i, 8);
+ if (gAudioContext.seqPlayers[sAudioSubTrackInfoPlayerSel].channels[i]->stopSomething2) {
+ GfxPrint_Printf(printer, "O");
+ } else {
+ GfxPrint_Printf(printer, "X");
+ }
+
+ GfxPrint_SetPos(printer, 15 + i, 9);
+ ctr = 0;
+ for (j = 0; j < 4; j++) {
+ if (gAudioContext.seqPlayers[sAudioSubTrackInfoPlayerSel].channels[i]->layers[j] != NULL) {
+ ctr++;
+ }
+ }
+
+ GfxPrint_Printf(printer, "%1X", ctr);
+ ctr2 += ctr;
+ }
+
+ SETCOL(255, 255, 255);
+ if (sSeqPlayerPeakNumLayers[sAudioSubTrackInfoPlayerSel] < ctr2) {
+ sSeqPlayerPeakNumLayers[sAudioSubTrackInfoPlayerSel] = ctr2;
+ }
+ GfxPrint_SetPos(printer, 16 + i, 9);
+ GfxPrint_Printf(printer, "%2d,%2d", ctr2, sSeqPlayerPeakNumLayers[sAudioSubTrackInfoPlayerSel]);
+
+ GfxPrint_SetPos(printer, 3, 11);
+ GfxPrint_Printf(printer, "VOL ");
+
+ GfxPrint_SetPos(printer, 3, 12);
+ GfxPrint_Printf(printer, "E VOL ");
+
+ GfxPrint_SetPos(printer, 3, 13);
+ GfxPrint_Printf(printer, "BANK ID ");
+
+ GfxPrint_SetPos(printer, 3, 14);
+ GfxPrint_Printf(printer, "PROG ");
+
+ GfxPrint_SetPos(printer, 3, 15);
+ GfxPrint_Printf(printer, "PAN ");
+
+ GfxPrint_SetPos(printer, 3, 16);
+ GfxPrint_Printf(printer, "PANPOW ");
+
+ GfxPrint_SetPos(printer, 3, 17);
+ GfxPrint_Printf(printer, "FXMIX ");
+
+ GfxPrint_SetPos(printer, 3, 18);
+ GfxPrint_Printf(printer, "PRIO ");
+
+ GfxPrint_SetPos(printer, 3, 19);
+ GfxPrint_Printf(printer, "VIB PIT ");
+
+ GfxPrint_SetPos(printer, 3, 20);
+ GfxPrint_Printf(printer, "VIB DEP ");
+
+ GfxPrint_SetPos(printer, 3, 21);
+ GfxPrint_Printf(printer, "TUNE ");
+
+ GfxPrint_SetPos(printer, 3, 22);
+ GfxPrint_Printf(printer, "TUNE ");
+
+ for (i = 0; i < 8; i++) {
+ GfxPrint_SetPos(printer, 15 + 3 * i, 22);
+ GfxPrint_Printf(printer, "%02X ",
+ (u8)gAudioContext.seqPlayers[sAudioSubTrackInfoPlayerSel]
+ .channels[sAudioSubTrackInfoChannelSel]
+ ->soundScriptIO[i]);
+ }
+
+ if (gAudioContext.seqPlayers[sAudioSubTrackInfoPlayerSel].channels[sAudioSubTrackInfoChannelSel]->enabled) {
+ GfxPrint_SetPos(printer, 15, 11);
+ GfxPrint_Printf(printer, "%d",
+ (u8)(gAudioContext.seqPlayers[sAudioSubTrackInfoPlayerSel]
+ .channels[sAudioSubTrackInfoChannelSel]
+ ->volume *
+ 127.1));
+
+ GfxPrint_SetPos(printer, 15, 12);
+ GfxPrint_Printf(printer, "%d",
+ (u8)(gAudioContext.seqPlayers[sAudioSubTrackInfoPlayerSel]
+ .channels[sAudioSubTrackInfoChannelSel]
+ ->volumeScale *
+ 127.1));
+
+ GfxPrint_SetPos(printer, 15, 13);
+ GfxPrint_Printf(printer, "%X",
+ gAudioContext.seqPlayers[sAudioSubTrackInfoPlayerSel]
+ .channels[sAudioSubTrackInfoChannelSel]
+ ->fontId);
+
+ ctr = (u8)(gAudioContext.seqPlayers[sAudioSubTrackInfoPlayerSel]
+ .channels[sAudioSubTrackInfoChannelSel]
+ ->instOrWave);
+
+ if (ctr == 0) {
+ ctr2 = 0x7F;
+ } else if (ctr < 0x80) {
+ ctr2 = ctr - 1;
+ } else {
+ ctr2 = ctr;
+ }
+
+ GfxPrint_SetPos(printer, 15, 14);
+ GfxPrint_Printf(printer, "%d", ctr2);
+
+ GfxPrint_SetPos(printer, 15, 15);
+ GfxPrint_Printf(printer, "%d",
+ gAudioContext.seqPlayers[sAudioSubTrackInfoPlayerSel]
+ .channels[sAudioSubTrackInfoChannelSel]
+ ->newPan);
+
+ GfxPrint_SetPos(printer, 15, 16);
+ GfxPrint_Printf(printer, "%d",
+ gAudioContext.seqPlayers[sAudioSubTrackInfoPlayerSel]
+ .channels[sAudioSubTrackInfoChannelSel]
+ ->panChannelWeight);
+
+ GfxPrint_SetPos(printer, 15, 17);
+ GfxPrint_Printf(printer, "%d",
+ gAudioContext.seqPlayers[sAudioSubTrackInfoPlayerSel]
+ .channels[sAudioSubTrackInfoChannelSel]
+ ->reverb);
+
+ GfxPrint_SetPos(printer, 15, 18);
+ GfxPrint_Printf(printer, "%d",
+ gAudioContext.seqPlayers[sAudioSubTrackInfoPlayerSel]
+ .channels[sAudioSubTrackInfoChannelSel]
+ ->notePriority);
+
+ GfxPrint_SetPos(printer, 15, 19);
+ GfxPrint_Printf(printer, "%d",
+ (u8)(gAudioContext.seqPlayers[sAudioSubTrackInfoPlayerSel]
+ .channels[sAudioSubTrackInfoChannelSel]
+ ->vibratoRateTarget /
+ 32));
+
+ GfxPrint_SetPos(printer, 15, 20);
+ GfxPrint_Printf(printer, "%d",
+ (u8)(gAudioContext.seqPlayers[sAudioSubTrackInfoPlayerSel]
+ .channels[sAudioSubTrackInfoChannelSel]
+ ->vibratoExtentTarget /
+ 8));
+
+ GfxPrint_SetPos(printer, 15, 21);
+ GfxPrint_Printf(printer, "%d",
+ (u16)(gAudioContext.seqPlayers[sAudioSubTrackInfoPlayerSel]
+ .channels[sAudioSubTrackInfoChannelSel]
+ ->freqScale *
+ 100));
+ }
+ break;
+
+ case PAGE_HEAP_INFO:
+ SETCOL(255, 255, 255);
+ GfxPrint_SetPos(printer, 3, 4);
+ GfxPrint_Printf(printer, "TOTAL %d", D_8014A6C4.heapSize);
+
+ GfxPrint_SetPos(printer, 3, 5);
+ GfxPrint_Printf(printer, "DRIVER %05X / %05X",
+ gAudioContext.notesAndBuffersPool.cur - gAudioContext.notesAndBuffersPool.start,
+ gAudioContext.notesAndBuffersPool.size);
+
+ GfxPrint_SetPos(printer, 3, 6);
+ GfxPrint_Printf(
+ printer, "AT-SEQ %02X-%02X (%05X-%05X / %05X)", (u8)gAudioContext.seqCache.temporary.entries[0].id,
+ (u8)gAudioContext.seqCache.temporary.entries[1].id, gAudioContext.seqCache.temporary.entries[0].size,
+ gAudioContext.seqCache.temporary.entries[1].size, gAudioContext.seqCache.temporary.pool.size);
+
+ GfxPrint_SetPos(printer, 3, 7);
+ GfxPrint_Printf(
+ printer, "AT-BNK %02X-%02X (%05X-%05X / %05X)", (u8)gAudioContext.fontCache.temporary.entries[0].id,
+ (u8)gAudioContext.fontCache.temporary.entries[1].id, gAudioContext.fontCache.temporary.entries[0].size,
+ gAudioContext.fontCache.temporary.entries[1].size, gAudioContext.fontCache.temporary.pool.size);
+
+ GfxPrint_SetPos(printer, 3, 8);
+ GfxPrint_Printf(printer, "ST-SEQ %02Xseqs (%05X / %06X)", gAudioContext.seqCache.persistent.numEntries,
+ gAudioContext.seqCache.persistent.pool.cur - gAudioContext.seqCache.persistent.pool.start,
+ gAudioContext.seqCache.persistent.pool.size);
+
+ for (k = 0; (u32)k < gAudioContext.seqCache.persistent.numEntries; k++) {
+ GfxPrint_SetPos(printer, 3 + 3 * k, 9);
+ GfxPrint_Printf(printer, "%02x", gAudioContext.seqCache.persistent.entries[k].id);
+ }
+
+ GfxPrint_SetPos(printer, 3, 10);
+ GfxPrint_Printf(printer, "ST-BNK %02Xbanks (%05X / %06X)", gAudioContext.fontCache.persistent.numEntries,
+ gAudioContext.fontCache.persistent.pool.cur - gAudioContext.fontCache.persistent.pool.start,
+ gAudioContext.fontCache.persistent.pool.size);
+
+ for (k = 0; (u32)k < gAudioContext.fontCache.persistent.numEntries; k++) {
+ GfxPrint_SetPos(printer, 3 + 3 * k, 11);
+ GfxPrint_Printf(printer, "%02x", gAudioContext.fontCache.persistent.entries[k].id);
+ }
+
+ GfxPrint_SetPos(printer, 3, 12);
+ GfxPrint_Printf(printer, "E-MEM %05X / %05X",
+ gAudioContext.permanentPool.cur - gAudioContext.permanentPool.start,
+ gAudioContext.permanentPool.size);
+ break;
+
+ case PAGE_BLOCK_CHANGE_BGM:
+ SETCOL(255, 255, 255);
+ GfxPrint_SetPos(printer, 3, 4);
+ GfxPrint_Printf(printer, "BGM No. %02X", sAudioBlkChgBgmWork[0]);
+
+ GfxPrint_SetPos(printer, 3, 5);
+ GfxPrint_Printf(printer, "SCENE SET %02X %s", sAudioBlkChgBgmWork[1],
+ sAudioSceneNames[sAudioBlkChgBgmWork[1]]);
+
+ SETCOL(0x64, 255, 0x64);
+ GfxPrint_SetPos(printer, 2, 4 + sAudioBlkChgBgmSel);
+ GfxPrint_Printf(printer, "*");
+
+ SETCOL(255, 255, 255);
+ GfxPrint_SetPos(printer, 3, 7);
+ GfxPrint_Printf(printer, "NEXT SCENE %02X %s",
+ (u8)gAudioContext.seqPlayers[SEQ_PLAYER_BGM_MAIN].soundScriptIO[2],
+ sAudioSceneNames[(u8)gAudioContext.seqPlayers[SEQ_PLAYER_BGM_MAIN].soundScriptIO[2]]);
+
+ GfxPrint_SetPos(printer, 3, 8);
+ GfxPrint_Printf(printer, "NOW SCENE %02X %s",
+ (u8)gAudioContext.seqPlayers[SEQ_PLAYER_BGM_MAIN].soundScriptIO[4],
+ sAudioSceneNames[(u8)gAudioContext.seqPlayers[SEQ_PLAYER_BGM_MAIN].soundScriptIO[4]]);
+
+ GfxPrint_SetPos(printer, 3, 9);
+ GfxPrint_Printf(printer, "NOW BLOCK %02X",
+ (gAudioContext.seqPlayers[SEQ_PLAYER_BGM_MAIN].soundScriptIO[5] + 1) & 0xFF);
+
+ GfxPrint_SetPos(printer, 3, 11);
+ GfxPrint_Printf(printer, "PORT");
+
+ GfxPrint_SetPos(printer, 3, 12);
+ GfxPrint_Printf(printer, "%02X %02X %02X %02X",
+ (u8)gAudioContext.seqPlayers[SEQ_PLAYER_BGM_MAIN].soundScriptIO[0],
+ (u8)gAudioContext.seqPlayers[SEQ_PLAYER_BGM_MAIN].soundScriptIO[1],
+ (u8)gAudioContext.seqPlayers[SEQ_PLAYER_BGM_MAIN].soundScriptIO[2],
+ (u8)gAudioContext.seqPlayers[SEQ_PLAYER_BGM_MAIN].soundScriptIO[3]);
+
+ GfxPrint_SetPos(printer, 3, 13);
+ GfxPrint_Printf(printer, "%02X %02X %02X %02X",
+ (u8)gAudioContext.seqPlayers[SEQ_PLAYER_BGM_MAIN].soundScriptIO[4],
+ (u8)gAudioContext.seqPlayers[SEQ_PLAYER_BGM_MAIN].soundScriptIO[5],
+ (u8)gAudioContext.seqPlayers[SEQ_PLAYER_BGM_MAIN].soundScriptIO[6],
+ (u8)gAudioContext.seqPlayers[SEQ_PLAYER_BGM_MAIN].soundScriptIO[7]);
+ break;
+
+ 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_SetPos(printer, 3, 5);
+ GfxPrint_Printf(printer, "PLAY INFO : %2d %02x %d", sPlayingStaff.noteIdx, sPlayingStaff.state,
+ sPlayingStaff.pos);
+
+ GfxPrint_SetPos(printer, 3, 6);
+ GfxPrint_Printf(printer, "8note REC POINTER : %08x", gScarecrowSpawnSongPtr);
+
+ ctr = 0;
+ for (j = 0; j < 4; j++) {
+ for (i = 0; i < 8; i++) {
+ GfxPrint_SetPos(printer, 3 + 3 * i, 7 + j);
+ GfxPrint_Printf(printer, "%02x", gScarecrowSpawnSongPtr[ctr++]);
+ }
+ }
+
+ GfxPrint_SetPos(printer, 3, 24);
+ GfxPrint_Printf(printer, "OCA:%02x SEQ:%04x PLAY:%02x REC:%02x", D_80130F10, D_80130F3C, sPlaybackState,
+ sRecordingState);
+ break;
+
+ case PAGE_SFX_PARAMETER_CHANGE:
+ GfxPrint_SetPos(printer, 2, 4 + sAudioSfxParamChgSel);
+ SETCOL(127, 255, 127);
+ GfxPrint_Printf(printer, "*");
+
+ SETCOL(255, 255, 255);
+ GfxPrint_SetPos(printer, 3, 4);
+ GfxPrint_Printf(printer, "SE HD : %02x %s", sAudioSfxParamChgWork[0],
+ sSoundBankNames[sAudioSfxParamChgWork[0]]);
+
+ GfxPrint_SetPos(printer, 3, 5);
+ GfxPrint_Printf(printer, "SE No. : %02x", sAudioSfxParamChgWork[1]);
+
+ GfxPrint_SetPos(printer, 20, 6);
+ GfxPrint_Printf(printer, " : %04x",
+ gSoundParams[sAudioSfxParamChgWork[0]][sAudioSfxParamChgWork[1]].params);
+
+ GfxPrint_SetPos(printer, 3, 6);
+ GfxPrint_Printf(
+ printer, "SE SW %s",
+ AudioDebug_ToStringBinary(gSoundParams[sAudioSfxParamChgWork[0]][sAudioSfxParamChgWork[1]].params, 16));
+
+ SETCOL(127, 255, 127);
+ digitStr[0] = (char)('0' + ((gSoundParams[sAudioSfxParamChgWork[0]][sAudioSfxParamChgWork[1]].params >>
+ (15 - sAudioSfxParamChgBitSel)) &
+ 1));
+ GfxPrint_SetPos(printer, 12 + sAudioSfxParamChgBitSel, 6);
+ GfxPrint_Printf(printer, "%s", digitStr);
+
+ SETCOL(255, 255, 255);
+ GfxPrint_SetPos(printer, 3, 7);
+ GfxPrint_Printf(printer, "SE PR : %02x",
+ gSoundParams[sAudioSfxParamChgWork[0]][sAudioSfxParamChgWork[1]].importance);
+ break;
+
+ case PAGE_FREE_AREA:
+ GfxPrint_SetPos(printer, 3, 4);
+ SETCOL(255, 255, 255);
+ GfxPrint_Printf(printer, "env_fx %d code_fx %d SPEC %d", sAudioEnvReverb, sAudioCodeReverb, gAudioSpecId);
+
+ if (sAudioUpdateTaskStart == sAudioUpdateTaskEnd) {
+ sAudioUpdateDuration = OS_CYCLES_TO_NSEC(sAudioUpdateEndTime - sAudioUpdateStartTime) / (1e9f / 20);
+ if (sAudioUpdateDurationMax < sAudioUpdateDuration) {
+ sAudioUpdateDurationMax = sAudioUpdateDuration;
+ }
+ }
+
+ GfxPrint_SetPos(printer, 3, 6);
+ GfxPrint_Printf(printer, "SOUND GAME FRAME NOW %f", sAudioUpdateDuration);
+
+ GfxPrint_SetPos(printer, 3, 7);
+ GfxPrint_Printf(printer, "SOUND GAME FRAME MAX %f", sAudioUpdateDurationMax);
+
+ GfxPrint_SetPos(printer, 3, 9);
+ GfxPrint_Printf(printer, "SWITCH BGM MODE %d %d %d (FLAG %d)", sPrevSeqMode, sNumFramesStill,
+ sNumFramesMoving, sSeqModeInput);
+
+ GfxPrint_SetPos(printer, 3, 10);
+ GfxPrint_Printf(printer, "ENEMY DIST %f VOL %3d", sAudioEnemyDist, sAudioEnemyVol);
+
+ GfxPrint_SetPos(printer, 3, 11);
+ GfxPrint_Printf(printer, "GANON DIST VOL %3d", sAudioGanonDistVol);
+
+ GfxPrint_SetPos(printer, 3, 12);
+ GfxPrint_Printf(printer, "DEMO FLAG %d", sAudioCutsceneFlag);
+
+ GfxPrint_SetPos(printer, 3, 12);
+ if (sAudioHasMalonBgm == true) {
+ GfxPrint_Printf(printer, "MARON BGM DIST %f", sAudioMalonBgmDist);
+ sAudioHasMalonBgm = false;
+ }
+
+ GfxPrint_SetPos(printer, 3, 23);
+ if (sAudioNatureFailed != false) {
+ GfxPrint_Printf(printer, "NATURE FAILED %01x", sAudioNatureFailed);
+ }
+
+ GfxPrint_SetPos(printer, 3, 24);
+ if (sSariaBgmPtr != 0) {
+ GfxPrint_Printf(printer, "SARIA BGM PTR %08x", sSariaBgmPtr);
+ }
+
+ GfxPrint_SetPos(printer, 3, 25);
+ GfxPrint_Printf(printer, "POLI %d(%d)", sPeakNumNotes, numEnabledNotes);
+
+ for (i = 0; i < 11; i++) {
+ GfxPrint_SetPos(printer, 3 + 3 * i, 26);
+ GfxPrint_Printf(printer, "%d", sAudioSpecPeakNumNotes[i]);
+ }
+ break;
+ }
+#undef SETCOL_COMMON
+#undef SETCOL
+#undef SETCOL_SCROLLPRINT
+}
+
+void AudioDebug_ProcessInput_SndCont(void) {
+ u16 step = 1;
+
+ if (CHECK_BTN_ANY(sDebugPadHold, BTN_CDOWN)) {
+ if (sAudioSndContWorkLims[sAudioSndContSel] >= 16) {
+ step = 16;
+ }
+ } else if (CHECK_BTN_ANY(sDebugPadHold, BTN_CLEFT)) {
+ if (sAudioSndContWorkLims[sAudioSndContSel] >= 16) {
+ step = 8;
+ }
+ } else if (CHECK_BTN_ANY(sDebugPadHold, BTN_CUP)) {
+ sAudioSndContWork[sAudioSndContSel] = 0;
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_DUP)) {
+ if (sAudioSndContSel > 0) {
+ sAudioSndContSel--;
+ } else {
+ sAudioSndContSel = 10;
+ }
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_DDOWN)) {
+ if (sAudioSndContSel < 10) {
+ sAudioSndContSel++;
+ } else {
+ sAudioSndContSel = 0;
+ }
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_DLEFT)) {
+ if (sAudioSndContWork[sAudioSndContSel] >= step) {
+ if (1) {
+ sAudioSndContWork[sAudioSndContSel] -= step;
+ }
+ } else {
+ sAudioSndContWork[sAudioSndContSel] += sAudioSndContWorkLims[sAudioSndContSel] - step;
+ }
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_DRIGHT)) {
+ if (sAudioSndContWork[sAudioSndContSel] + step < sAudioSndContWorkLims[sAudioSndContSel]) {
+ sAudioSndContWork[sAudioSndContSel] += step;
+ } else {
+ sAudioSndContWork[sAudioSndContSel] += step - sAudioSndContWorkLims[sAudioSndContSel];
+ }
+ }
+
+ if (sAudioSndContSel == 8) {
+ if (sAudioSndContWork[sAudioSndContSel] != 0) {
+ Audio_SetExtraFilter(0x20);
+ } else {
+ Audio_SetExtraFilter(0);
+ }
+ }
+
+ if (sAudioSndContSel == 9) {
+ if (sAudioSndContWork[sAudioSndContSel] != 0) {
+ Audio_SetBaseFilter(0x20);
+ } else {
+ Audio_SetBaseFilter(0);
+ }
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_A)) {
+ switch (sAudioSndContSel) {
+ case 0:
+ case 1:
+ Audio_StartSeq(sAudioSndContSel, 0, sAudioSndContWork[sAudioSndContSel]);
+ break;
+ case 2:
+ case 3:
+ Audio_PlaySoundGeneral(((sAudioSndContWork[2] << 12) & 0xFFFF) + sAudioSndContWork[3] + SFX_FLAG,
+ &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
+ break;
+ case 4:
+ func_800F6700(sAudioSndContWork[sAudioSndContSel]);
+ break;
+ case 5:
+ Audio_SeqCmdE01(SEQ_PLAYER_BGM_MAIN, sAudioSndContWork[sAudioSndContSel]);
+ break;
+ case 6:
+ Audio_SeqCmdF(SEQ_PLAYER_BGM_MAIN, sAudioSndContWork[sAudioSndContSel]);
+ sAudioSubTrackInfoSpec = sAudioSndContWork[6];
+ if (sAudioSubTrackInfoPlayerSel > gAudioSpecs[sAudioSubTrackInfoSpec].numSequencePlayers - 1) {
+ sAudioSubTrackInfoPlayerSel = gAudioSpecs[sAudioSubTrackInfoSpec].numSequencePlayers - 1;
+ }
+ break;
+ case 7:
+ Audio_PlayNatureAmbienceSequence(sAudioSndContWork[sAudioSndContSel]);
+ break;
+ case 8:
+ case 9:
+ break;
+ case 10:
+ Audio_SetSoundBanksMute(sAudioSndContWork[sAudioSndContSel] * 0x7F);
+ break;
+ }
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_B)) {
+ switch (sAudioSndContSel) {
+ case 0:
+ case 1:
+ Audio_SeqCmd1(sAudioSndContSel, 0);
+ break;
+ case 7:
+ Audio_SeqCmd1(SEQ_PLAYER_BGM_MAIN, 0);
+ break;
+ case 2:
+ case 3:
+ Audio_StopSfxByBank(sAudioSndContWork[2]);
+ break;
+ }
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_CDOWN)) {
+ if (sAudioSndContSel == 0) {
+ if (1) {}
+ func_800F595C(sAudioSndContWork[sAudioSndContSel]);
+ }
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_CRIGHT)) {
+ if (sAudioSndContSel == 0) {
+ if (1) {}
+ func_800F5ACC(sAudioSndContWork[sAudioSndContSel]);
+ }
+ }
+}
+
+void AudioDebug_ProcessInput_IntInfo(void) {
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_CUP)) {
+ sAudioIntInfoY--;
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_CDOWN)) {
+ sAudioIntInfoY++;
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_CLEFT)) {
+ sAudioIntInfoX--;
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_CRIGHT)) {
+ sAudioIntInfoX++;
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_B)) {
+ sAudioIntInfoX = 0;
+ sAudioIntInfoY = 0;
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_DUP) && sAudioIntInfoSel > 0) {
+ sAudioIntInfoSel--;
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_DDOWN) && sAudioIntInfoSel < 6) {
+ sAudioIntInfoSel++;
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_DLEFT) && sAudioIntInfoBankPage[sAudioIntInfoSel] > 0) {
+ sAudioIntInfoBankPage[sAudioIntInfoSel]--;
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_DRIGHT) && sAudioIntInfoBankPage[sAudioIntInfoSel] < 4) {
+ sAudioIntInfoBankPage[sAudioIntInfoSel]++;
+ }
+}
+
+void AudioDebug_ProcessInput_ScrPrt(void) {
+ if (sAudioScrPrtWork[0] != 0) {
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_CUP)) {
+ sAudioScrPrtY--;
+ }
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_CDOWN)) {
+ sAudioScrPrtY++;
+ }
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_CLEFT)) {
+ sAudioScrPrtX--;
+ }
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_CRIGHT)) {
+ sAudioScrPrtX++;
+ }
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_A)) {
+ sAudioScrPrtX = 26;
+ sAudioScrPrtY = 1;
+ sAudioScrPrtWork[2] = 6;
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_B)) {
+ sAudioScrPrtInd = 0;
+ sAudioScrPrtOverflow = 0;
+ }
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_DUP)) {
+ if (sAudioScrPrtSel > 0) {
+ sAudioScrPrtSel--;
+ } else {
+ sAudioScrPrtSel = 10;
+ }
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_DDOWN)) {
+ if (sAudioScrPrtSel < 10) {
+ sAudioScrPrtSel++;
+ } else {
+ sAudioScrPrtSel = 0;
+ }
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_DLEFT)) {
+ if (sAudioScrPrtWork[sAudioScrPrtSel] > 0) {
+ sAudioScrPrtWork[sAudioScrPrtSel]--;
+ } else {
+ sAudioScrPrtWork[sAudioScrPrtSel] = sAudioScrPrtWorkLims[sAudioScrPrtSel] - 1;
+ }
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_DRIGHT)) {
+ if (sAudioScrPrtWork[sAudioScrPrtSel] < sAudioScrPrtWorkLims[sAudioScrPrtSel] - 1) {
+ sAudioScrPrtWork[sAudioScrPrtSel]++;
+ } else {
+ sAudioScrPrtWork[sAudioScrPrtSel] = 0;
+ }
+ }
+
+ D_801333F0 = sAudioScrPrtWork[3] + (sAudioScrPrtWork[4] * 2) + (sAudioScrPrtWork[5] * 4) +
+ (sAudioScrPrtWork[6] * 8) + (sAudioScrPrtWork[7] * 0x10) + (sAudioScrPrtWork[8] * 0x20);
+}
+
+void AudioDebug_ProcessInput_SfxSwap(void) {
+ s16 step;
+ u16 val;
+ u8 prev;
+
+ if (!sAudioSfxSwapIsEditing) {
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_DUP)) {
+ if (sAudioSfxSwapSel > 0) {
+ sAudioSfxSwapSel--;
+ } else {
+ sAudioSfxSwapSel = 9;
+ }
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_DDOWN)) {
+ if (sAudioSfxSwapSel < 9) {
+ sAudioSfxSwapSel++;
+ } else {
+ sAudioSfxSwapSel = 0;
+ }
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_A)) {
+ sAudioSfxSwapIsEditing = true;
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_B)) {
+ gAudioSfxSwapSource[sAudioSfxSwapSel] = 0;
+ gAudioSfxSwapTarget[sAudioSfxSwapSel] = 0;
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_START)) {
+ if (sAudioSfxSwapSel != 0) {
+ prev = sAudioSfxSwapSel - 1;
+ } else {
+ prev = 9;
+ }
+ gAudioSfxSwapSource[sAudioSfxSwapSel] = gAudioSfxSwapSource[prev];
+ gAudioSfxSwapTarget[sAudioSfxSwapSel] = gAudioSfxSwapTarget[prev];
+ }
+ } else {
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_DLEFT)) {
+ if (sAudioSfxSwapNibbleSel > 0) {
+ sAudioSfxSwapNibbleSel--;
+ } else {
+ sAudioSfxSwapNibbleSel = 7;
+ }
+ }
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_DRIGHT)) {
+ if (sAudioSfxSwapNibbleSel < 7) {
+ sAudioSfxSwapNibbleSel++;
+ } else {
+ sAudioSfxSwapNibbleSel = 0;
+ }
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_DUP) || CHECK_BTN_ANY(sDebugPadPress, BTN_DDOWN)) {
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_DUP)) {
+ step = CHECK_BTN_ANY(sDebugPadHold, BTN_CUP) ? 8 : 1;
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_DDOWN)) {
+ step = CHECK_BTN_ANY(sDebugPadHold, BTN_CUP) ? -8 : -1;
+ }
+
+ if (sAudioSfxSwapNibbleSel < 4) {
+ val = gAudioSfxSwapSource[sAudioSfxSwapSel] >> ((3 - sAudioSfxSwapNibbleSel) * 4);
+ val = (val + step) & 0xF;
+ gAudioSfxSwapSource[sAudioSfxSwapSel] =
+ (gAudioSfxSwapSource[sAudioSfxSwapSel] & ((0xF << ((3 - sAudioSfxSwapNibbleSel) * 4)) ^ 0xFFFF)) +
+ (val << ((3 - sAudioSfxSwapNibbleSel) * 4));
+ } else {
+ val = gAudioSfxSwapTarget[sAudioSfxSwapSel] >> ((7 - sAudioSfxSwapNibbleSel) * 4);
+ val = (val + step) & 0xF;
+ gAudioSfxSwapTarget[sAudioSfxSwapSel] =
+ (gAudioSfxSwapTarget[sAudioSfxSwapSel] & ((0xF << ((7 - sAudioSfxSwapNibbleSel) * 4)) ^ 0xFFFF)) +
+ (val << ((7 - sAudioSfxSwapNibbleSel) * 4));
+ }
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_A)) {
+ sAudioSfxSwapIsEditing = false;
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_B)) {
+ if (sAudioSfxSwapNibbleSel < 4) {
+ gAudioSfxSwapSource[sAudioSfxSwapSel] = 0;
+ } else {
+ gAudioSfxSwapTarget[sAudioSfxSwapSel] = 0;
+ }
+ }
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_CLEFT)) {
+ gAudioSfxSwapOff ^= 1;
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_CDOWN)) {
+ gAudioSfxSwapMode[sAudioSfxSwapSel] ^= 1;
+ }
+}
+
+void AudioDebug_ProcessInput_SubTrackInfo(void) {
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_DDOWN)) {
+ if (sAudioSubTrackInfoPlayerSel != 0) {
+ sAudioSubTrackInfoPlayerSel--;
+ } else {
+ sAudioSubTrackInfoPlayerSel = gAudioSpecs[sAudioSubTrackInfoSpec].numSequencePlayers - 1;
+ }
+ }
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_DUP)) {
+ if (sAudioSubTrackInfoPlayerSel < gAudioSpecs[sAudioSubTrackInfoSpec].numSequencePlayers - 1) {
+ sAudioSubTrackInfoPlayerSel++;
+ } else {
+ sAudioSubTrackInfoPlayerSel = SEQ_PLAYER_BGM_MAIN;
+ }
+ }
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_DLEFT)) {
+ sAudioSubTrackInfoChannelSel = (sAudioSubTrackInfoChannelSel - 1) & 0xF;
+ }
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_DRIGHT)) {
+ sAudioSubTrackInfoChannelSel = (sAudioSubTrackInfoChannelSel + 1) & 0xF;
+ }
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_START)) {
+ sSeqPlayerPeakNumLayers[sAudioSubTrackInfoPlayerSel] = SEQ_PLAYER_BGM_MAIN;
+ }
+}
+
+void AudioDebug_ProcessInput_HeapInfo(void) {
+}
+
+void AudioDebug_ProcessInput_BlkChgBgm(void) {
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_DUP)) {
+ if (sAudioBlkChgBgmSel > 0) {
+ sAudioBlkChgBgmSel--;
+ } else {
+ sAudioBlkChgBgmSel = 1;
+ }
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_DDOWN)) {
+ if (sAudioBlkChgBgmSel <= 0) {
+ sAudioBlkChgBgmSel++;
+ } else {
+ sAudioBlkChgBgmSel = 0;
+ }
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_DLEFT)) {
+ sAudioBlkChgBgmWork[sAudioBlkChgBgmSel]--;
+ if (sAudioBlkChgBgmSel == 1) {
+ Audio_SetSequenceMode(sAudioBlkChgBgmWork[1]);
+ ; // might be a fake match?
+ }
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_DRIGHT)) {
+ sAudioBlkChgBgmWork[sAudioBlkChgBgmSel]++;
+ if (sAudioBlkChgBgmSel == 1) {
+ Audio_SetSequenceMode(sAudioBlkChgBgmWork[1]);
+ }
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_A)) {
+ Audio_QueueCmdS8(MK_CMD(0x46, SEQ_PLAYER_BGM_MAIN, 0x00, 0x00), sAudioBlkChgBgmWork[1]);
+ Audio_QueueSeqCmd(sAudioBlkChgBgmWork[0] | 0x10000);
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_B)) {
+ Audio_QueueSeqCmd(0x100100FF);
+ }
+}
+
+void AudioDebug_ProcessInput_OcaTest(void) {
+}
+
+void AudioDebug_ProcessInput_SfxParamChg(void) {
+ s32 step;
+ u16 sfx;
+
+ if (CHECK_BTN_ANY(sDebugPadHold, BTN_CLEFT)) {
+ step = 8;
+ } else {
+ step = 1;
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_DUP)) {
+ if (sAudioSfxParamChgSel > 0) {
+ sAudioSfxParamChgSel--;
+ } else {
+ sAudioSfxParamChgSel = 3;
+ }
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_DDOWN)) {
+ if (sAudioSfxParamChgSel < 3) {
+ sAudioSfxParamChgSel++;
+ } else {
+ sAudioSfxParamChgSel = 0;
+ }
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_DLEFT)) {
+ if (sAudioSfxParamChgSel < 2) {
+ if (sAudioSfxParamChgSel == 0) {
+ if (sAudioSfxParamChgWork[sAudioSfxParamChgSel] > 0) {
+ sAudioSfxParamChgWork[sAudioSfxParamChgSel]--;
+ } else {
+ sAudioSfxParamChgWork[sAudioSfxParamChgSel] = sAudioSndContWorkLims[2] - 1;
+ }
+ } else {
+ sAudioSfxParamChgWork[sAudioSfxParamChgSel] -= step;
+ sAudioSfxParamChgWork[sAudioSfxParamChgSel] &= 0x1FF;
+ }
+ } else if (sAudioSfxParamChgSel == 3) {
+ gSoundParams[sAudioSfxParamChgWork[0]][sAudioSfxParamChgWork[1]].importance -= step;
+ } else {
+ sAudioSfxParamChgBitSel = (sAudioSfxParamChgBitSel - 1) & 0xF;
+ }
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_DRIGHT)) {
+ if (sAudioSfxParamChgSel < 2) {
+ if (sAudioSfxParamChgSel == 0) {
+ if (sAudioSfxParamChgWork[sAudioSfxParamChgSel] < (sAudioSndContWorkLims[2] - 1)) {
+ sAudioSfxParamChgWork[sAudioSfxParamChgSel]++;
+ } else {
+ sAudioSfxParamChgWork[sAudioSfxParamChgSel] = 0;
+ }
+ } else {
+ sAudioSfxParamChgWork[sAudioSfxParamChgSel] += step;
+ sAudioSfxParamChgWork[sAudioSfxParamChgSel] &= 0x1FF;
+ }
+ } else if (sAudioSfxParamChgSel == 3) {
+ gSoundParams[sAudioSfxParamChgWork[0]][sAudioSfxParamChgWork[1]].importance += step;
+ } else {
+ sAudioSfxParamChgBitSel = (sAudioSfxParamChgBitSel + 1) & 0xF;
+ }
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_A)) {
+ sfx = (u16)(sAudioSfxParamChgWork[0] << 12) + sAudioSfxParamChgWork[1] + SFX_FLAG;
+ Audio_PlaySoundGeneral(sfx, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_B)) {
+ Audio_StopSfxByBank(sAudioSfxParamChgWork[0]);
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_CDOWN)) {
+ if (sAudioSfxParamChgSel == 2) {
+ gSoundParams[sAudioSfxParamChgWork[0]][sAudioSfxParamChgWork[1]].params ^=
+ (1 << (0xF - sAudioSfxParamChgBitSel));
+ }
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_CUP)) {
+ if (sAudioSfxParamChgSel < 2) {
+ sAudioSfxParamChgWork[sAudioSfxParamChgSel] = 0;
+ }
+ }
+}
+
+void AudioDebug_ScrPrt(const s8* str, u16 num) {
+ u8 i = 0;
+
+ sAudioScrPrtBuf[sAudioScrPrtInd].num = num;
+
+ while (str[i] != 0) {
+ sAudioScrPrtBuf[sAudioScrPrtInd].str[i] = str[i];
+ i++;
+ }
+
+ while (i < 5) {
+ sAudioScrPrtBuf[sAudioScrPrtInd].str[i] = 0;
+ i++;
+ }
+
+ if (sAudioScrPrtInd < 25 - 1) {
+ sAudioScrPrtInd++;
+ } else {
+ sAudioScrPrtInd = 0;
+ sAudioScrPrtOverflow = 1;
+ }
+}
+
+void AudioDebug_ProcessInput(void) {
+ if (!sAudioDebugEverOpened) {
+ return;
+ }
+
+ if (sAudioSfxMuted) {
+ Audio_SetSoundBanksMute(0x6F);
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_L)) {
+ if (sAudioDebugPage < PAGE_MAX - 1) {
+ sAudioDebugPage++;
+ } else {
+ sAudioDebugPage = 0;
+ }
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_R)) {
+ if (sAudioDebugPage > 0) {
+ sAudioDebugPage--;
+ } else {
+ sAudioDebugPage = PAGE_MAX - 1;
+ }
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_Z)) {
+ sAudioDebugTextColor++;
+ sAudioDebugTextColor &= 7;
+ }
+
+ switch (sAudioDebugPage) {
+ case PAGE_NON:
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_A)) {
+ sAudioSndContWork[5] ^= 1;
+ Audio_SeqCmdE01(SEQ_PLAYER_BGM_MAIN, sAudioSndContWork[5]);
+ if (func_800FA0B4(SEQ_PLAYER_BGM_MAIN) != NA_BGM_NATURE_AMBIENCE) {
+ Audio_SeqCmd1(SEQ_PLAYER_BGM_MAIN, 0);
+ }
+ Audio_SeqCmd1(SEQ_PLAYER_FANFARE, 0);
+ Audio_SeqCmd1(SEQ_PLAYER_BGM_SUB, 0);
+ }
+
+ if (CHECK_BTN_ANY(sDebugPadPress, BTN_B)) {
+ sAudioSfxMuted ^= 1;
+ if (!sAudioSfxMuted) {
+ Audio_SetSoundBanksMute(0);
+ }
+ }
+ break;
+ case PAGE_SOUND_CONTROL:
+ AudioDebug_ProcessInput_SndCont();
+ break;
+ case PAGE_INTERFACE_INFO:
+ AudioDebug_ProcessInput_IntInfo();
+ break;
+ case PAGE_SCROLL_PRINT:
+ AudioDebug_ProcessInput_ScrPrt();
+ break;
+ case PAGE_SFX_SWAP:
+ AudioDebug_ProcessInput_SfxSwap();
+ break;
+ case PAGE_SUB_TRACK_INFO:
+ AudioDebug_ProcessInput_SubTrackInfo();
+ break;
+ case PAGE_HEAP_INFO:
+ AudioDebug_ProcessInput_HeapInfo();
+ break;
+ case PAGE_BLOCK_CHANGE_BGM:
+ AudioDebug_ProcessInput_BlkChgBgm();
+ break;
+ case PAGE_OCARINA_TEST:
+ AudioDebug_ProcessInput_OcaTest();
+ break;
+ case PAGE_SFX_PARAMETER_CHANGE:
+ AudioDebug_ProcessInput_SfxParamChg();
+ break;
+ case PAGE_FREE_AREA:
+ default:
+ break;
+ }
+
+ D_8013340C = sAudioScrPrtWork[10];
+}
+
+void func_800F4A70(void);
+void func_800F5CF8(void);
+
+void func_800F3054(void) {
+ if (func_800FAD34() == 0) {
+ sAudioUpdateTaskStart = gAudioContext.totalTaskCnt;
+ sAudioUpdateStartTime = osGetTime();
+ func_800EE6F4();
+ Audio_StepFreqLerp(&sRiverFreqScaleLerp);
+ Audio_StepFreqLerp(&sWaterfallFreqScaleLerp);
+ func_800F4A70();
+ func_800F56A8();
+ func_800F5CF8();
+ if (gAudioSpecId == 7) {
+ Audio_ClearSariaBgm();
+ }
+ Audio_ProcessSoundRequests();
+ Audio_ProcessSeqCmds();
+ func_800F8F88();
+ func_800FA3DC();
+ AudioDebug_SetInput();
+ AudioDebug_ProcessInput();
+ Audio_ScheduleProcessCmds();
+ sAudioUpdateTaskEnd = gAudioContext.totalTaskCnt;
+ sAudioUpdateEndTime = osGetTime();
+ }
+}
+
+void func_800F3138(UNK_TYPE arg0) {
+}
+
+void func_800F3140(UNK_TYPE arg0, UNK_TYPE arg1) {
+}
+
+void func_800F314C(s8 arg0) {
+ Audio_QueueCmdS32(0x82 << 24 | SEQ_PLAYER_BGM_MAIN << 16 | (((u8)arg0 & 0xFF) << 8), 1);
+}
+
+f32 Audio_ComputeSoundVolume(u8 bankId, u8 entryIdx) {
+ SoundBankEntry* bankEntry = &gSoundBanks[bankId][entryIdx];
+ f32 minDist;
+ f32 baseDist;
+ f32 ret;
+
+ if (bankEntry->sfxParams & 0x2000) {
+ return 1.0f;
+ }
+
+ if (bankEntry->dist > 10000.0f) {
+ ret = 0.0f;
+ } else {
+ switch (bankEntry->sfxParams & 3) {
+ case 1:
+ baseDist = 10000.0f / 15.0f;
+ break;
+ case 2:
+ baseDist = 10000.0f / 10.5f;
+ break;
+ case 3:
+ baseDist = 10000.0f / 2.6f;
+ break;
+ default:
+ baseDist = 10000.0f / 20.0f;
+ break;
+ }
+
+ minDist = baseDist / 5.0f;
+
+ // Volume grows as inverse square of distance. Linearly approximate
+ // the inverse part, then square.
+ if (bankEntry->dist < minDist) {
+ ret = 1.0f;
+ } else if (bankEntry->dist < baseDist) {
+ ret = ((((baseDist - minDist) - (bankEntry->dist - minDist)) / (baseDist - minDist)) * 0.19f) + 0.81f;
+ } else {
+ ret = (1.0f - ((bankEntry->dist - baseDist) / (10000.0f - baseDist))) * 0.81f;
+ }
+ ret = SQ(ret);
+ }
+
+ return ret;
+}
+
+s8 Audio_ComputeSoundReverb(u8 bankId, u8 entryIdx, u8 channelIdx) {
+ s8 distAdd = 0;
+ s32 scriptAdd = 0;
+ SoundBankEntry* entry = &gSoundBanks[bankId][entryIdx];
+ s32 reverb;
+
+ if (!(entry->sfxParams & 0x1000)) {
+ if (entry->dist < 2500.0f) {
+ distAdd = *entry->posZ > 0.0f ? (entry->dist / 2500.0f) * 70.0f : (entry->dist / 2500.0f) * 91.0f;
+ } else {
+ distAdd = 70;
+ }
+ }
+
+ if (IS_SEQUENCE_CHANNEL_VALID(gAudioContext.seqPlayers[SEQ_PLAYER_SFX].channels[channelIdx])) {
+ scriptAdd = gAudioContext.seqPlayers[SEQ_PLAYER_SFX].channels[channelIdx]->soundScriptIO[1];
+ if (gAudioContext.seqPlayers[SEQ_PLAYER_SFX].channels[channelIdx]->soundScriptIO[1] < 0) {
+ scriptAdd = 0;
+ }
+ }
+
+ reverb = *entry->reverbAdd + distAdd + scriptAdd;
+ if ((bankId != BANK_OCARINA) || !((entry->sfxId & 0x1FF) < 2)) {
+ reverb += sAudioEnvReverb + sAudioCodeReverb + sSpecReverb;
+ }
+
+ if (reverb > 0x7F) {
+ reverb = 0x7F;
+ }
+
+ return reverb;
+}
+
+s8 Audio_ComputeSoundPanSigned(f32 x, f32 z, u8 token) {
+ f32 absX;
+ f32 absZ;
+ f32 pan;
+
+ if (x < 0) {
+ absX = -x;
+ } else {
+ absX = x;
+ }
+ if (z < 0) {
+ absZ = -z;
+ } else {
+ absZ = z;
+ }
+
+ if (absX > 8000.0f) {
+ absX = 8000.0f;
+ }
+
+ if (absZ > 8000.0f) {
+ absZ = 8000.0f;
+ }
+
+ if ((x == 0.0f) && (z == 0.0f)) {
+ pan = 0.5f;
+ } else if (absZ <= absX) {
+ pan = (16000.0f - absX) / (3.3f * (16000.0f - absZ));
+ if (x >= 0.0f) {
+ pan = 1.0f - pan;
+ }
+ } else {
+ pan = (x / (5.0769234f * absZ)) + 0.5f; // about 66 / 13
+ }
+
+ if (absZ < 50.0f) {
+ if (absX < 50.0f) {
+ pan = ((pan - 0.5f) * SQ(absX / 50.0f)) + 0.5f;
+ }
+ }
+ return (s8)((pan * 127.0f) + 0.5f);
+}
+
+f32 Audio_ComputeSoundFreqScale(u8 bankId, u8 entryIdx) {
+ s32 phi_v0 = 0;
+ SoundBankEntry* entry = &gSoundBanks[bankId][entryIdx];
+ f32 unk1C;
+ f32 freq = 1.0f;
+
+ if (entry->sfxParams & 0x4000) {
+ freq = 1.0f - ((gAudioContext.audioRandom & 0xF) / 192.0f);
+ }
+
+ switch (bankId) {
+ case BANK_PLAYER:
+ case BANK_ITEM:
+ case BANK_VOICE:
+ if (sAudioBaseFilter2 != 0) {
+ phi_v0 = 1;
+ }
+ break;
+ case BANK_ENV:
+ case BANK_ENEMY:
+ if (sAudioExtraFilter2 != 0) {
+ phi_v0 = 1;
+ }
+ break;
+ case BANK_SYSTEM:
+ case BANK_OCARINA:
+ break;
+ }
+
+ if (phi_v0 == 1) {
+ if (!(entry->sfxParams & 0x800)) {
+ freq *= (1.0293 - ((gAudioContext.audioRandom & 0xF) / 144.0f));
+ }
+ }
+
+ unk1C = entry->dist;
+ if (!(entry->sfxParams & 0x2000)) {
+ if (!(entry->sfxParams & 0x8000)) {
+ if (unk1C >= 10000.0f) {
+ freq += 0.2f;
+ } else {
+ freq += (0.2f * (unk1C / 10000.0f));
+ }
+ }
+ }
+
+ if (entry->sfxParams & 0xC0) {
+ freq += (entry->unk_2F / 192.0f);
+ }
+
+ return freq;
+}
+
+u8 func_800F37B8(f32 behindScreenZ, SoundBankEntry* arg1, s8 arg2) {
+ s8 phi_v0;
+ u8 phi_v1;
+ f32 phi_f0;
+ f32 phi_f12;
+
+ if (*arg1->posZ < behindScreenZ) {
+ phi_v0 = arg2 < 65 ? arg2 : 0x7F - arg2;
+
+ if (phi_v0 < 30) {
+ phi_v1 = 0;
+ } else {
+ phi_v1 = (((phi_v0 & 0xFFFF) * 10) - 300) / 34;
+ if (phi_v1 != 0) {
+ phi_v1 = 0x10 - phi_v1;
+ }
+ }
+ } else {
+ phi_v1 = 0;
+ }
+
+ if (phi_v1 == 0) {
+ if (arg1->sfxParams & 0x200) {
+ phi_v1 = 0xF;
+ }
+ }
+
+ switch (arg1->sfxParams & 3) {
+ case 1:
+ phi_f0 = 12.0f;
+ break;
+ case 2:
+ phi_f0 = 9.0f;
+ break;
+ case 3:
+ phi_f0 = 6.0f;
+ break;
+ default:
+ phi_f0 = 15.0f;
+ break;
+ }
+
+ phi_f12 = CLAMP_MAX(arg1->dist, 10000.0f / 5.2f);
+
+ return (phi_v1 * 0x10) + (u8)((phi_f0 * phi_f12) / (10000.0f / 5.2f));
+}
+
+s8 func_800F3990(f32 arg0, u16 sfxParams) {
+ s8 ret = 0;
+
+ if (arg0 >= 0.0f) {
+ if (arg0 > 625.0f) {
+ ret = 127;
+ } else {
+ ret = (arg0 / 625.0f) * 126.0f;
+ }
+ }
+ return ret | 1;
+}
+
+void Audio_SetSoundProperties(u8 bankId, u8 entryIdx, u8 channelIdx) {
+ f32 vol = 1.0f;
+ s8 volS8;
+ s8 reverb = 0;
+ f32 freqScale = 1.0f;
+ s8 panSigned = 0x40;
+ u8 stereoBits = 0;
+ u8 filter = 0;
+ s8 sp38 = 0;
+ f32 behindScreenZ;
+ u8 baseFilter = 0;
+ SoundBankEntry* entry = &gSoundBanks[bankId][entryIdx];
+
+ switch (bankId) {
+ case BANK_PLAYER:
+ case BANK_ITEM:
+ case BANK_ENV:
+ case BANK_ENEMY:
+ case BANK_VOICE:
+ if (D_80130604 == 2) {
+ sp38 = func_800F3990(*entry->posY, entry->sfxParams);
+ }
+ // fallthrough
+ case BANK_OCARINA:
+ entry->dist = sqrtf(entry->dist);
+ vol = Audio_ComputeSoundVolume(bankId, entryIdx) * *entry->vol;
+ reverb = Audio_ComputeSoundReverb(bankId, entryIdx, channelIdx);
+ panSigned = Audio_ComputeSoundPanSigned(*entry->posX, *entry->posZ, entry->token);
+ freqScale = Audio_ComputeSoundFreqScale(bankId, entryIdx) * *entry->freqScale;
+ if (D_80130604 == 2) {
+ behindScreenZ = sBehindScreenZ[(entry->sfxParams & 0x400) >> 10];
+ if (!(entry->sfxParams & 0x800)) {
+ if (*entry->posZ < behindScreenZ) {
+ stereoBits = 0x10;
+ }
+
+ if ((sSfxChannelState[channelIdx].stereoBits ^ stereoBits) & 0x10) {
+ if (panSigned < 0x40) {
+ stereoBits = sSfxChannelState[channelIdx].stereoBits ^ 0x14;
+ } else {
+ stereoBits = sSfxChannelState[channelIdx].stereoBits ^ 0x18;
+ }
+ } else {
+ stereoBits = sSfxChannelState[channelIdx].stereoBits;
+ }
+ }
+ }
+ if (sAudioBaseFilter != 0) {
+ if ((bankId == BANK_ITEM) || (bankId == BANK_PLAYER) || (bankId == BANK_VOICE)) {
+ baseFilter = sAudioBaseFilter;
+ }
+ }
+
+ if ((baseFilter | sAudioExtraFilter) != 0) {
+ filter = (baseFilter | sAudioExtraFilter);
+ } else if (D_80130604 == 2 && (entry->sfxParams & 0x2000) == 0) {
+ filter = func_800F37B8(behindScreenZ, entry, panSigned);
+ }
+ break;
+ case BANK_SYSTEM:
+ break;
+ }
+
+ if (sSfxChannelState[channelIdx].vol != vol) {
+ volS8 = (u8)(vol * 127.0f);
+ sSfxChannelState[channelIdx].vol = vol;
+ } else {
+ volS8 = -1;
+ }
+
+ // CHAN_UPD_SCRIPT_IO (slot 2, sets volume)
+ Audio_QueueCmdS8(0x6 << 24 | SEQ_PLAYER_SFX << 16 | (channelIdx << 8) | 2, volS8);
+ if (reverb != sSfxChannelState[channelIdx].reverb) {
+ Audio_QueueCmdS8(0x5 << 24 | SEQ_PLAYER_SFX << 16 | (channelIdx << 8), reverb);
+ sSfxChannelState[channelIdx].reverb = reverb;
+ }
+ if (freqScale != sSfxChannelState[channelIdx].freqScale) {
+ Audio_QueueCmdF32(0x4 << 24 | SEQ_PLAYER_SFX << 16 | (channelIdx << 8), freqScale);
+ sSfxChannelState[channelIdx].freqScale = freqScale;
+ }
+ if (stereoBits != sSfxChannelState[channelIdx].stereoBits) {
+ Audio_QueueCmdS8(0xE << 24 | SEQ_PLAYER_SFX << 16 | (channelIdx << 8), stereoBits | 0x10);
+ sSfxChannelState[channelIdx].stereoBits = stereoBits;
+ }
+ if (filter != sSfxChannelState[channelIdx].filter) {
+ // CHAN_UPD_SCRIPT_IO (slot 3, sets filter)
+ Audio_QueueCmdS8(0x6 << 24 | SEQ_PLAYER_SFX << 16 | (channelIdx << 8) | 3, filter);
+ sSfxChannelState[channelIdx].filter = filter;
+ }
+ if (sp38 != sSfxChannelState[channelIdx].unk_0C) {
+ // CHAN_UPD_UNK_0F
+ Audio_QueueCmdS8(0xC << 24 | SEQ_PLAYER_SFX << 16 | (channelIdx << 8), 0x10);
+ // CHAN_UPD_UNK_20
+ Audio_QueueCmdU16(0xD << 24 | SEQ_PLAYER_SFX << 16 | (channelIdx << 8), ((u16)(sp38) << 8) + 0xFF);
+ sSfxChannelState[channelIdx].unk_0C = sp38;
+ }
+ if (panSigned != sSfxChannelState[channelIdx].panSigned) {
+ Audio_QueueCmdS8(0x3 << 24 | SEQ_PLAYER_SFX << 16 | (channelIdx << 8), panSigned);
+ sSfxChannelState[channelIdx].panSigned = panSigned;
+ }
+}
+
+void Audio_ResetSfxChannelState(void) {
+ u8 i;
+ SfxPlayerState* state;
+
+ for (i = 0; i < 16; i++) {
+ state = &sSfxChannelState[i];
+ state->vol = 1.0f;
+ state->freqScale = 1.0f;
+ state->reverb = 0;
+ state->panSigned = 0x40;
+ state->stereoBits = 0;
+ state->filter = 0xFF;
+ state->unk_0C = 0xFF;
+ }
+
+ sSfxChannelState[SFX_PLAYER_CHANNEL_OCARINA].unk_0C = 0;
+ sPrevSeqMode = 0;
+ sAudioCodeReverb = 0;
+}
+
+void func_800F3F3C(u8 arg0) {
+ if (gSoundBankMuted[0] != 1) {
+ Audio_StartSeq(SEQ_PLAYER_BGM_SUB, 0, NA_BGM_VARIOUS_SFX);
+ Audio_SeqCmd8(SEQ_PLAYER_BGM_SUB, 0, 0, arg0);
+ }
+}
+
+f32 func_800F3F84(f32 arg0) {
+ f32 ret = 1.0f;
+
+ if (arg0 > 6.0f) {
+ D_8016B7A8 = 1.0f;
+ D_8016B7B0 = 1.1f;
+ } else {
+ ret = arg0 / 6.0f;
+ D_8016B7A8 = (ret * 0.22500002f) + 0.775f;
+ D_8016B7B0 = (ret * 0.2f) + 0.9f;
+ }
+ return ret;
+}
+
+void func_800F4010(Vec3f* pos, u16 sfxId, f32 arg2) {
+ f32 sp24;
+ f32 phi_f0;
+ u8 phi_v0;
+ u16 sfxId2;
+
+ D_80131C8C = arg2;
+ sp24 = func_800F3F84(arg2);
+ Audio_PlaySoundGeneral(sfxId, pos, 4, &D_8016B7B0, &D_8016B7A8, &D_801333E8);
+
+ if ((sfxId & 0xF0) == 0xB0) {
+ phi_f0 = 0.3f;
+ phi_v0 = 1;
+ sp24 = 1.0f;
+ } else {
+ phi_f0 = 1.1f;
+ phi_v0 = gAudioContext.audioRandom % 2;
+ }
+
+ if ((phi_f0 < arg2) && (phi_v0 != 0)) {
+ if ((sfxId & 0x80) != 0) {
+ sfxId2 = NA_SE_PL_METALEFFECT_ADULT;
+ } else {
+ sfxId2 = NA_SE_PL_METALEFFECT_KID;
+ }
+ D_8016B7AC = (sp24 * 0.7) + 0.3;
+ Audio_PlaySoundGeneral(sfxId2, pos, 4, &D_8016B7B0, &D_8016B7AC, &D_801333E8);
+ }
+}
+
+void func_800F4138(Vec3f* pos, u16 sfxId, f32 arg2) {
+ func_800F3F84(arg2);
+ Audio_PlaySoundGeneral(sfxId, pos, 4, &D_8016B7B0, &D_8016B7A8, &D_801333E8);
+}
+
+void func_800F4190(Vec3f* pos, u16 sfxId) {
+ Audio_PlaySoundGeneral(sfxId, pos, 4, &D_801305B0, &D_801333E0, &D_801305B4);
+}
+void Audio_PlaySoundRandom(Vec3f* pos, u16 baseSfxId, u8 randLim) {
+ u8 offset = Audio_NextRandom() % randLim;
+
+ Audio_PlaySoundGeneral(baseSfxId + offset, pos, 4, &D_801333E0, &D_801333E0, &D_801333E8);
+}
+
+void func_800F4254(Vec3f* pos, u8 level) {
+ level &= 3;
+ if (level != sPrevChargeLevel) {
+ D_801305F4 = D_801305E4[level];
+ switch (level) {
+ case 1:
+ Audio_PlaySoundGeneral(NA_SE_PL_SWORD_CHARGE, pos, 4, &D_801305F4, &D_801333E0, &D_801333E8);
+ break;
+ case 2:
+ Audio_PlaySoundGeneral(NA_SE_PL_SWORD_CHARGE, pos, 4, &D_801305F4, &D_801333E0, &D_801333E8);
+ break;
+ }
+
+ sPrevChargeLevel = level;
+ }
+
+ if (level != 0) {
+ Audio_PlaySoundGeneral(NA_SE_IT_SWORD_CHARGE - SFX_FLAG, pos, 4, &D_801305F4, &D_801333E0, &D_801333E8);
+ }
+}
+
+void func_800F436C(Vec3f* pos, u16 sfxId, f32 arg2) {
+ if (arg2 < 0.75f) {
+ D_8016B7D8 = ((arg2 / 0.75f) * 0.25f) + 0.5f;
+ } else {
+ D_8016B7D8 = arg2;
+ }
+
+ if (D_8016B7D8 > 0.5f) {
+ Audio_PlaySoundGeneral(sfxId, pos, 4, &D_8016B7D8, &D_801333E0, &D_801333E8);
+ }
+}
+
+void func_800F4414(Vec3f* pos, u16 sfxId, f32 arg2) {
+ D_801305B8--;
+ if (D_801305B8 == 0) {
+ Audio_PlaySoundGeneral(sfxId, pos, 4, &D_8016B7D8, &D_801333E0, &D_801333E8);
+
+ if (arg2 > 2.0f) {
+ arg2 = 2.0f;
+ }
+ D_801305B8 = (s8)((D_801305C0 - D_801305BC) * (1.0f - arg2)) + D_801305C0;
+ }
+}
+
+void func_800F44EC(s8 arg0, s8 arg1) {
+ D_801305B8 = 1;
+ D_801305BC = arg1;
+ D_801305C0 = arg0;
+}
+
+void func_800F4524(Vec3f* pos, u16 sfxId, s8 arg2) {
+ D_8016B7DC = arg2;
+ Audio_PlaySoundGeneral(sfxId, pos, 4, &D_801333E0, &D_801333E0, &D_8016B7DC);
+}
+
+void func_800F4578(Vec3f* pos, u16 sfxId, f32 arg2) {
+ D_8016B7E0 = arg2;
+ Audio_PlaySoundGeneral(sfxId, pos, 4, &D_801333E0, &D_8016B7E0, &D_801333E8);
+}
+
+void func_800F45D0(f32 arg0) {
+ func_800F4414(&D_801333D4, NA_SE_IT_FISHING_REEL_SLOW - SFX_FLAG, arg0);
+ func_800F436C(&D_801333D4, 0, (0.15f * arg0) + 1.4f);
+}
+
+void Audio_PlaySoundRiver(Vec3f* pos, f32 freqScale) {
+ if (!Audio_IsSfxPlaying(NA_SE_EV_RIVER_STREAM - SFX_FLAG)) {
+ sRiverFreqScaleLerp.value = freqScale;
+ } else if (freqScale != sRiverFreqScaleLerp.value) {
+ sRiverFreqScaleLerp.target = freqScale;
+ sRiverFreqScaleLerp.remainingFrames = 40;
+ sRiverFreqScaleLerp.step = (sRiverFreqScaleLerp.target - sRiverFreqScaleLerp.value) / 40;
+ }
+ Audio_PlaySoundGeneral(NA_SE_EV_RIVER_STREAM - SFX_FLAG, pos, 4, &sRiverFreqScaleLerp.value, &D_801333E0,
+ &D_801333E8);
+}
+
+void Audio_PlaySoundWaterfall(Vec3f* pos, f32 freqScale) {
+ if (!Audio_IsSfxPlaying(NA_SE_EV_WATER_WALL_BIG - SFX_FLAG)) {
+ sWaterfallFreqScaleLerp.value = freqScale;
+ } else if (freqScale != sWaterfallFreqScaleLerp.value) {
+ sWaterfallFreqScaleLerp.target = freqScale;
+ sWaterfallFreqScaleLerp.remainingFrames = 40;
+ sWaterfallFreqScaleLerp.step = (sWaterfallFreqScaleLerp.target - sWaterfallFreqScaleLerp.value) / 40;
+ }
+ Audio_PlaySoundGeneral(NA_SE_EV_WATER_WALL_BIG - SFX_FLAG, pos, 4, &sWaterfallFreqScaleLerp.value,
+ &sWaterfallFreqScaleLerp.value, &D_801333E8);
+}
+
+void Audio_StepFreqLerp(FreqLerp* lerp) {
+ if (lerp->remainingFrames != 0) {
+ lerp->remainingFrames--;
+ if (lerp->remainingFrames != 0) {
+ lerp->value += lerp->step;
+ } else {
+ lerp->value = lerp->target;
+ }
+ }
+}
+
+void func_800F47BC(void) {
+ Audio_SetVolScale(SEQ_PLAYER_BGM_MAIN, 1, 0, 10);
+ Audio_SetVolScale(SEQ_PLAYER_BGM_SUB, 1, 0, 10);
+}
+
+void func_800F47FC(void) {
+ Audio_SetVolScale(SEQ_PLAYER_BGM_MAIN, 1, 0x7F, 3);
+ Audio_SetVolScale(SEQ_PLAYER_BGM_SUB, 1, 0x7F, 3);
+}
+
+void func_800F483C(u8 targetVol, u8 volFadeTimer) {
+ Audio_SetVolScale(SEQ_PLAYER_BGM_MAIN, 0, targetVol, volFadeTimer);
+}
+
+void func_800F4870(u8 arg0) {
+ s8 pan;
+ u8 i;
+
+ pan = 0;
+ if (arg0 == 0) {
+ pan = 0x7F;
+ }
+
+ for (i = 0; i < 16; i++) {
+ // CHAN_UPD_PAN_UNSIGNED
+ Audio_QueueCmdS8(
+ _SHIFTL(0x7, 24, 8) | _SHIFTL(SEQ_PLAYER_BGM_MAIN, 16, 8) | _SHIFTL(i, 8, 8) | _SHIFTL(0, 0, 8), pan);
+ }
+
+ if (arg0 == 7) {
+ D_80130600 = 2;
+ } else {
+ Audio_SetGanonDistVol(D_801305F8[arg0 & 7]);
+ }
+}
+
+// (name derived from debug strings, should probably update. used in ganon/ganon_boss scenes)
+s32 Audio_SetGanonDistVol(u8 targetVol)
+{
+ u8 phi_v0;
+ u16 phi_v0_2;
+ u8 i;
+
+ if (sAudioGanonDistVol != targetVol) {
+ Audio_SetVolScale(SEQ_PLAYER_BGM_MAIN, 0, targetVol, 2);
+ if (targetVol < 0x40) {
+ phi_v0 = 0x10;
+ } else {
+ phi_v0 = (((targetVol - 0x40) >> 2) + 1) << 4;
+ }
+
+ Audio_SeqCmd8(SEQ_PLAYER_BGM_MAIN, 4, 15, phi_v0);
+ for (i = 0; i < 0x10; i++) {
+ if (gAudioContext.seqPlayers[SEQ_PLAYER_BGM_MAIN].channels[i] != &gAudioContext.sequenceChannelNone) {
+ if ((u8)gAudioContext.seqPlayers[SEQ_PLAYER_BGM_MAIN].channels[i]->soundScriptIO[5] != 0xFF) {
+ // this looks like some kind of macro?
+ phi_v0_2 =
+ ((u16)gAudioContext.seqPlayers[SEQ_PLAYER_BGM_MAIN].channels[i]->soundScriptIO[5] - targetVol) +
+ 0x7F;
+ if (phi_v0_2 >= 0x80) {
+ phi_v0_2 = 0x7F;
+ }
+ // CHAN_UPD_REVERB
+ Audio_QueueCmdS8(_SHIFTL(0x5, 24, 8) | _SHIFTL(SEQ_PLAYER_BGM_MAIN, 16, 8) | _SHIFTL(i, 8, 8) |
+ _SHIFTL(0, 0, 8),
+ (u8)phi_v0_2);
+ }
+ }
+ }
+ sAudioGanonDistVol = targetVol;
+ }
+ return -1;
+}
+
+void func_800F4A54(u8 arg0) {
+ D_8016B8B0 = arg0;
+ D_8016B8B2 = 1;
+}
+
+void func_800F4A70(void) {
+ if (D_8016B8B2 == 1) {
+ if (D_8016B8B1 != D_8016B8B0) {
+ Audio_SetVolScale(SEQ_PLAYER_BGM_MAIN, 0, D_8016B8B0, 0xA);
+ D_8016B8B1 = D_8016B8B0;
+ D_8016B8B3 = 1;
+ }
+ D_8016B8B2 = 0;
+ } else if (D_8016B8B3 == 1 && D_80130608 == 0) {
+ Audio_SetVolScale(SEQ_PLAYER_BGM_MAIN, 0, 0x7F, 0xA);
+ D_8016B8B1 = 0x7F;
+ D_8016B8B3 = 0;
+ }
+
+ if (D_80130600 != 0) {
+ D_80130600--;
+ if (D_80130600 == 0) {
+ Audio_SetGanonDistVol(D_801305F8[7]);
+ }
+ }
+}
+
+void Audio_PlaySoundIncreasinglyTransposed(Vec3f* pos, s16 sfxId, u8* semitones) {
+ Audio_PlaySoundGeneral(sfxId, pos, 4, &gNoteFrequencies[semitones[sAudioIncreasingTranspose] + 39], &D_801333E0,
+ &D_801333E8);
+
+ if (sAudioIncreasingTranspose < 15) {
+ sAudioIncreasingTranspose++;
+ }
+}
+
+void Audio_ResetIncreasingTranspose(void) {
+ sAudioIncreasingTranspose = 0;
+}
+
+void Audio_PlaySoundTransposed(Vec3f* pos, u16 sfxId, s8 semitone) {
+ Audio_PlaySoundGeneral(sfxId, pos, 4, &gNoteFrequencies[semitone + 39], &D_801333E0, &D_801333E8);
+}
+
+void func_800F4C58(Vec3f* pos, u16 sfxId, u8 arg2) {
+ u8 phi_s1 = 0;
+ u8 i;
+ u8 bankId;
+
+ bankId = SFX_BANK_SHIFT(sfxId);
+ for (i = 0; i < bankId; i++) {
+ phi_s1 += gChannelsPerBank[gSfxChannelLayout][i];
+ }
+
+ for (i = 0; i < gChannelsPerBank[gSfxChannelLayout][bankId]; i++) {
+ if ((gActiveSounds[bankId][i].entryIndex != 0xFF) &&
+ (sfxId == gSoundBanks[bankId][gActiveSounds[bankId][i].entryIndex].sfxId)) {
+ Audio_QueueCmdS8(
+ _SHIFTL(0x6, 24, 8) | _SHIFTL(SEQ_PLAYER_SFX, 16, 8) | _SHIFTL(phi_s1, 8, 8) | _SHIFTL(6, 0, 8), arg2);
+ }
+ phi_s1++;
+ }
+ Audio_PlaySoundGeneral(sfxId, pos, 4, &D_801333E0, &D_801333E0, &D_801333E8);
+}
+
+void func_800F4E30(Vec3f* pos, f32 arg1) {
+ f32 phi_f22;
+ s8 phi_s4;
+ u8 i;
+
+ if (sSariaBgmPtr == NULL) {
+ sSariaBgmPtr = pos;
+ D_80130650 = arg1;
+ } else if (pos != sSariaBgmPtr) {
+ if (arg1 < D_80130650) {
+ sSariaBgmPtr = pos;
+ D_80130650 = arg1;
+ }
+ } else {
+ D_80130650 = arg1;
+ }
+
+ if (sSariaBgmPtr->x > 100.0f) {
+ phi_s4 = 0x7F;
+ } else if (sSariaBgmPtr->x < -100.0f) {
+ phi_s4 = 0;
+ } else {
+ phi_s4 = ((sSariaBgmPtr->x / 100.0f) * 64.0f) + 64.0f;
+ }
+
+ if (D_80130650 > 400.0f) {
+ phi_f22 = 0.1f;
+ } else if (D_80130650 < 120.0f) {
+ phi_f22 = 1.0f;
+ } else {
+ phi_f22 = ((1.0f - ((D_80130650 - 120.0f) / 280.0f)) * 0.9f) + 0.1f;
+ }
+
+ for (i = 0; i < 0x10; i++) {
+ if (i != 9) {
+ Audio_SeqCmd6(SEQ_PLAYER_BGM_MAIN, 2, i, (127.0f * phi_f22));
+ Audio_QueueCmdS8(0x3 << 24 | SEQ_PLAYER_BGM_MAIN << 16 | ((u8)((u32)i) << 8), phi_s4);
+ }
+ }
+}
+
+void Audio_ClearSariaBgm(void) {
+ if (sSariaBgmPtr != NULL) {
+ sSariaBgmPtr = NULL;
+ }
+}
+
+void Audio_ClearSariaBgmAtPos(Vec3f* pos) {
+ if (sSariaBgmPtr == pos) {
+ sSariaBgmPtr = NULL;
+ }
+}
+
+/**
+ * Turns on and off channels from both bgm players in a way that splits
+ * equally between the two bgm channels. Split based on note priority
+ */
+void Audio_SplitBgmChannels(s8 volSplit) {
+ u8 volume;
+ u8 notePriority;
+ u16 channelBits;
+ u8 bgmPlayers[2] = { SEQ_PLAYER_BGM_MAIN, SEQ_PLAYER_BGM_SUB };
+ u8 channelIdx;
+ u8 i;
+
+ if ((func_800FA0B4(SEQ_PLAYER_FANFARE) == NA_BGM_DISABLED) &&
+ (func_800FA0B4(SEQ_PLAYER_BGM_SUB) != NA_BGM_LONLON)) {
+ for (i = 0; i < ARRAY_COUNT(bgmPlayers); i++) {
+ if (i == 0) {
+ // Main Bgm SeqPlayer
+ volume = volSplit;
+ } else {
+ // Sub Bgm SeqPlayer
+ volume = 0x7F - volSplit;
+ }
+
+ if (volume > 100) {
+ notePriority = 11;
+ } else if (volume < 20) {
+ notePriority = 2;
+ } else {
+ notePriority = ((volume - 20) / 10) + 2;
+ }
+
+ channelBits = 0;
+ for (channelIdx = 0; channelIdx < 16; channelIdx++) {
+ if (notePriority > gAudioContext.seqPlayers[bgmPlayers[i]].channels[channelIdx]->notePriority) {
+ // If the note currently playing in the channel is a high enough priority,
+ // then keep the channel on by setting a channelBit
+ // If this condition fails, then the channel will be shut off
+ channelBits += (1 << channelIdx);
+ }
+ }
+
+ Audio_SeqCmdA(bgmPlayers[i], channelBits);
+ }
+ }
+}
+
+void Audio_PlaySariaBgm(Vec3f* pos, u16 seqId, u16 distMax) {
+ f32 absY;
+ f32 dist;
+ u8 vol;
+ f32 prevDist;
+
+ if (D_8016B9F3 != 0) {
+ D_8016B9F3--;
+ return;
+ }
+
+ dist = sqrtf(SQ(pos->z) + SQ(pos->x));
+ if (sSariaBgmPtr == NULL) {
+ sSariaBgmPtr = pos;
+ func_800F5E18(SEQ_PLAYER_BGM_SUB, seqId, 0, 7, 2);
+ } else {
+ prevDist = sqrtf(SQ(sSariaBgmPtr->z) + SQ(sSariaBgmPtr->x));
+ if (dist < prevDist) {
+ sSariaBgmPtr = pos;
+ } else {
+ dist = prevDist;
+ }
+ }
+
+ if (pos->y < 0.0f) {
+ absY = -pos->y;
+ } else {
+ absY = pos->y;
+ }
+
+ if ((distMax / 15.0f) < absY) {
+ vol = 0;
+ } else if (dist < distMax) {
+ vol = (1.0f - (dist / distMax)) * 127.0f;
+ } else {
+ vol = 0;
+ }
+
+ if (seqId != NA_BGM_GREAT_FAIRY) {
+ Audio_SplitBgmChannels(vol);
+ }
+
+ Audio_SetVolScale(SEQ_PLAYER_BGM_SUB, 3, vol, 0);
+ Audio_SetVolScale(SEQ_PLAYER_BGM_MAIN, 3, 0x7F - vol, 0);
+}
+
+void Audio_ClearSariaBgm2(void) {
+ sSariaBgmPtr = NULL;
+}
+
+void func_800F5510(u16 seqId) {
+ func_800F5550(seqId);
+ func_800F5E18(SEQ_PLAYER_BGM_MAIN, seqId, 0, 0, 1);
+}
+
+void func_800F5550(u16 seqId) {
+ u8 sp27 = 0;
+ u16 nv;
+
+ if (func_800FA0B4(SEQ_PLAYER_BGM_MAIN) != NA_BGM_WINDMILL) {
+ if (func_800FA0B4(SEQ_PLAYER_BGM_SUB) == NA_BGM_LONLON) {
+ func_800F9474(SEQ_PLAYER_BGM_SUB, 0);
+ Audio_QueueCmdS32(0xF8000000, 0);
+ }
+
+ if ((sSeqFlags[D_80130630] & 0x20) && sSeqFlags[(seqId & 0xFF) & 0xFF] & 0x10) {
+
+ if ((D_8013062C & 0x3F) != 0) {
+ sp27 = 0x1E;
+ }
+
+ func_800F5E18(SEQ_PLAYER_BGM_MAIN, seqId, sp27, 7, D_8013062C);
+
+ D_8013062C = 0;
+ } else {
+ nv = (sSeqFlags[(seqId & 0xFF) & 0xFF] & 0x40) ? 1 : 0xFF;
+ func_800F5E18(SEQ_PLAYER_BGM_MAIN, seqId, 0, 7, nv);
+ if (!(sSeqFlags[seqId] & 0x20)) {
+ D_8013062C = 0xC0;
+ }
+ }
+ D_80130630 = seqId & 0xFF;
+ }
+}
+
+void func_800F56A8(void) {
+ u16 temp_v0;
+ u8 bvar;
+
+ temp_v0 = func_800FA0B4(SEQ_PLAYER_BGM_MAIN);
+ bvar = temp_v0 & 0xFF;
+ if ((temp_v0 != NA_BGM_DISABLED) && (sSeqFlags[bvar] & 0x10)) {
+ if (D_8013062C != 0xC0) {
+ D_8013062C = gAudioContext.seqPlayers[SEQ_PLAYER_BGM_MAIN].soundScriptIO[3];
+ } else {
+ D_8013062C = 0;
+ }
+ }
+}
+
+void func_800F5718(void) {
+ if (func_800FA0B4(SEQ_PLAYER_BGM_MAIN) != NA_BGM_WINDMILL) {
+ Audio_StartSeq(SEQ_PLAYER_BGM_MAIN, 0, NA_BGM_WINDMILL);
+ }
+}
+
+void func_800F574C(f32 arg0, u8 arg2) {
+ if (arg0 == 1.0f) {
+ Audio_SeqCmdB40(SEQ_PLAYER_BGM_MAIN, arg2, 0);
+ } else {
+ Audio_SeqCmdC(SEQ_PLAYER_FANFARE, 0x30, arg2, arg0 * 100.0f);
+ }
+ Audio_SeqCmdC(SEQ_PLAYER_FANFARE, 0xA0, arg2, arg0 * 100.0f);
+}
+
+void func_800F5918(void) {
+ if (func_800FA0B4(SEQ_PLAYER_BGM_MAIN) == NA_BGM_TIMED_MINI_GAME && func_800FA11C(0, 0xF0000000)) {
+ Audio_SeqCmdB(SEQ_PLAYER_BGM_MAIN, 5, 0, 0xD2);
+ }
+}
+
+void func_800F595C(u16 arg0) {
+ u8 arg0b = arg0 & 0xFF;
+
+ if (sSeqFlags[arg0b] & 2) {
+ Audio_PlayFanfare(arg0);
+ } else if (sSeqFlags[arg0b] & 4) {
+ Audio_StartSeq(SEQ_PLAYER_FANFARE, 0, arg0);
+
+ } else {
+ func_800F5E18(SEQ_PLAYER_BGM_MAIN, arg0, 0, 7, -1);
+ Audio_SeqCmd1(SEQ_PLAYER_FANFARE, 0);
+ }
+}
+
+void func_800F59E8(u16 arg0) {
+ u8 arg0b = arg0 & 0xFF;
+
+ if (sSeqFlags[arg0b] & 2) {
+ Audio_SeqCmd1(SEQ_PLAYER_FANFARE, 0);
+ } else if (sSeqFlags[arg0b] & 4) {
+ Audio_SeqCmd1(SEQ_PLAYER_FANFARE, 0);
+ } else {
+ Audio_SeqCmd1(SEQ_PLAYER_BGM_MAIN, 0);
+ }
+}
+
+s32 func_800F5A58(u8 arg0) {
+ u8 phi_a1 = 0;
+
+ if (sSeqFlags[arg0 & 0xFF] & 2) {
+ phi_a1 = 1;
+ } else if (sSeqFlags[arg0 & 0xFF] & 4) {
+ phi_a1 = 1;
+ }
+
+ if (arg0 == (u8)func_800FA0B4(phi_a1)) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+/**
+ * Plays a sequence on the main bgm player, but stores the previous sequence to return to later
+ * Designed for the mini-boss sequence, but also used by mini-game 2 sequence
+ */
+void func_800F5ACC(u16 seqId) {
+ u16 curSeqId = func_800FA0B4(SEQ_PLAYER_BGM_MAIN);
+
+ if ((curSeqId & 0xFF) != NA_BGM_GANON_TOWER && (curSeqId & 0xFF) != NA_BGM_ESCAPE && curSeqId != seqId) {
+ Audio_SetSequenceMode(SEQ_MODE_IGNORE);
+ if (curSeqId != NA_BGM_DISABLED) {
+ sPrevMainBgmSeqId = curSeqId;
+ } else {
+ osSyncPrintf("Middle Boss BGM Start not stack \n");
+ }
+
+ Audio_StartSeq(SEQ_PLAYER_BGM_MAIN, 0, seqId);
+ }
+}
+
+/**
+ * Restores the previous sequence to the main bgm player before func_800F5ACC was called
+ */
+void func_800F5B58(void) {
+ if ((func_800FA0B4(SEQ_PLAYER_BGM_MAIN) != NA_BGM_DISABLED) && (sPrevMainBgmSeqId != NA_BGM_DISABLED) &&
+ (sSeqFlags[func_800FA0B4(SEQ_PLAYER_BGM_MAIN) & 0xFF] & 8)) {
+ if (sPrevMainBgmSeqId == NA_BGM_DISABLED) {
+ Audio_SeqCmd1(SEQ_PLAYER_BGM_MAIN, 0);
+ } else {
+ Audio_StartSeq(SEQ_PLAYER_BGM_MAIN, 0, sPrevMainBgmSeqId);
+ }
+
+ sPrevMainBgmSeqId = NA_BGM_DISABLED;
+ }
+}
+
+/**
+ * Plays the nature ambience sequence on the main bgm player, but stores the previous sequence to return to later
+ */
+void func_800F5BF0(u8 natureAmbienceId) {
+ u16 curSeqId = func_800FA0B4(SEQ_PLAYER_BGM_MAIN);
+
+ if (curSeqId != NA_BGM_NATURE_AMBIENCE) {
+ sPrevMainBgmSeqId = curSeqId;
+ }
+
+ Audio_PlayNatureAmbienceSequence(natureAmbienceId);
+}
+
+/**
+ * Restores the previous sequence to the main bgm player before func_800F5BF0 was called
+ */
+void func_800F5C2C(void) {
+ if (sPrevMainBgmSeqId != NA_BGM_DISABLED) {
+ Audio_StartSeq(SEQ_PLAYER_BGM_MAIN, 0, sPrevMainBgmSeqId);
+ }
+ sPrevMainBgmSeqId = NA_BGM_DISABLED;
+}
+
+void Audio_PlayFanfare(u16 seqId)
+{
+ u16 sp26;
+ u32 sp20;
+ u8* sp1C;
+ u8* sp18;
+
+ sp26 = func_800FA0B4(SEQ_PLAYER_FANFARE);
+ sp1C = func_800E5E84(sp26 & 0xFF, &sp20);
+ sp18 = func_800E5E84(seqId & 0xFF, &sp20);
+ if ((sp26 == NA_BGM_DISABLED) || (*sp1C == *sp18)) {
+ D_8016B9F4 = 1;
+ } else {
+ D_8016B9F4 = 5;
+ Audio_SeqCmd1(SEQ_PLAYER_FANFARE, 0);
+ }
+ D_8016B9F6 = seqId;
+}
+
+void func_800F5CF8(void) {
+ u16 sp26;
+ u16 pad;
+ u16 sp22;
+
+ if (D_8016B9F4 != 0) {
+ D_8016B9F4--;
+ if (D_8016B9F4 == 0) {
+ Audio_QueueCmdS32(0xE3000000, SEQUENCE_TABLE);
+ Audio_QueueCmdS32(0xE3000000, FONT_TABLE);
+ func_800FA0B4(SEQ_PLAYER_BGM_MAIN);
+ sp26 = func_800FA0B4(SEQ_PLAYER_FANFARE);
+ sp22 = func_800FA0B4(SEQ_PLAYER_BGM_SUB);
+ if (sp26 == NA_BGM_DISABLED) {
+ Audio_SetVolScale(SEQ_PLAYER_BGM_MAIN, 1, 0, 5);
+ Audio_SetVolScale(SEQ_PLAYER_BGM_SUB, 1, 0, 5);
+ Audio_SeqCmdC(SEQ_PLAYER_FANFARE, 0x80, 1, 0xA);
+ Audio_SeqCmdC(SEQ_PLAYER_FANFARE, 0x83, 1, 0xA);
+ Audio_SeqCmdC(SEQ_PLAYER_FANFARE, 0x90, 0, 0);
+ if (sp22 != NA_BGM_LONLON) {
+ Audio_SeqCmdC(SEQ_PLAYER_FANFARE, 0x93, 0, 0);
+ }
+ }
+ Audio_StartSeq(SEQ_PLAYER_FANFARE, 1, D_8016B9F6);
+ Audio_SeqCmdA(0, 0xFFFF);
+ if (sp22 != NA_BGM_LONLON) {
+ Audio_SeqCmdA(SEQ_PLAYER_BGM_SUB, 0xFFFF);
+ }
+ }
+ }
+}
+
+void func_800F5E18(u8 playerIdx, u16 seqId, u8 fadeTimer, s8 arg3, s8 arg4) {
+ Audio_SeqCmd7(playerIdx, arg3, arg4);
+ Audio_StartSeq(playerIdx, fadeTimer, seqId);
+}
+
+void Audio_SetSequenceMode(u8 seqMode) {
+ s32 volumeFadeInTimer;
+ u16 seqId;
+ u8 volumeFadeOutTimer;
+
+ sSeqModeInput = seqMode;
+ if (sPrevMainBgmSeqId == NA_BGM_DISABLED) {
+ if (sAudioCutsceneFlag) {
+ seqMode = SEQ_MODE_IGNORE;
+ }
+
+ seqId = D_8016E750[SEQ_PLAYER_BGM_MAIN].unk_254;
+
+ if (seqId == NA_BGM_FIELD_LOGIC && func_800FA0B4(SEQ_PLAYER_BGM_SUB) == (NA_BGM_ENEMY | 0x800)) {
+ seqMode = SEQ_MODE_IGNORE;
+ }
+
+ if ((seqId == NA_BGM_DISABLED) || (sSeqFlags[(u8)(seqId & 0xFF)] & 1) ||
+ ((sPrevSeqMode & 0x7F) == SEQ_MODE_ENEMY)) {
+ if (seqMode != (sPrevSeqMode & 0x7F)) {
+ if (seqMode == SEQ_MODE_ENEMY) {
+ // Start playing enemy bgm
+ if (D_8016E750[SEQ_PLAYER_BGM_SUB].volScales[1] - sAudioEnemyVol < 0) {
+ volumeFadeInTimer = -(D_8016E750[SEQ_PLAYER_BGM_SUB].volScales[1] - sAudioEnemyVol);
+ } else {
+ volumeFadeInTimer = D_8016E750[SEQ_PLAYER_BGM_SUB].volScales[1] - sAudioEnemyVol;
+ }
+
+ Audio_SetVolScale(SEQ_PLAYER_BGM_SUB, 3, sAudioEnemyVol, volumeFadeInTimer);
+ Audio_StartSeq(SEQ_PLAYER_BGM_SUB, 10, NA_BGM_ENEMY | 0x800);
+
+ if (seqId != NA_BGM_NATURE_AMBIENCE) {
+ Audio_SetVolScale(SEQ_PLAYER_BGM_MAIN, 3, (0x7F - sAudioEnemyVol) & 0xFF, 0xA);
+ Audio_SplitBgmChannels(sAudioEnemyVol);
+ }
+ } else if ((sPrevSeqMode & 0x7F) == SEQ_MODE_ENEMY) {
+ // Stop playing enemy bgm
+ Audio_SeqCmd1(SEQ_PLAYER_BGM_SUB, 10);
+ if (seqMode == SEQ_MODE_IGNORE) {
+ volumeFadeOutTimer = 0;
+ } else {
+ volumeFadeOutTimer = 10;
+ }
+
+ Audio_SetVolScale(SEQ_PLAYER_BGM_MAIN, 3, 0x7F, volumeFadeOutTimer);
+ Audio_SplitBgmChannels(0);
+ }
+
+ sPrevSeqMode = seqMode + 0x80;
+ }
+ } else {
+ // Hyrule Field will play slightly different bgm music depending on whether player is standing
+ // still or moving. This is the logic to determine the transition between those two states
+ if (seqMode == SEQ_MODE_DEFAULT) {
+ if (sPrevSeqMode == SEQ_MODE_STILL) {
+ sNumFramesMoving = 0;
+ }
+ sNumFramesStill = 0;
+ sNumFramesMoving++;
+ } else {
+ sNumFramesStill++;
+ }
+
+ if (seqMode == SEQ_MODE_STILL && sNumFramesStill < 30 && sNumFramesMoving > 20) {
+ seqMode = SEQ_MODE_DEFAULT;
+ }
+
+ sPrevSeqMode = seqMode;
+ Audio_SeqCmd7(SEQ_PLAYER_BGM_MAIN, 2, seqMode);
+ }
+ }
+}
+
+void Audio_SetBgmEnemyVolume(f32 dist) {
+ f32 adjDist;
+
+ if (sPrevSeqMode == (0x80 | SEQ_MODE_ENEMY)) {
+ if (dist != sAudioEnemyDist) {
+ if (dist < 150.0f) {
+ adjDist = 0.0f;
+ } else if (dist > 500.0f) {
+ adjDist = 350.0f;
+ } else {
+ adjDist = dist - 150.0f;
+ }
+
+ sAudioEnemyVol = ((350.0f - adjDist) * 127.0f) / 350.0f;
+ Audio_SetVolScale(SEQ_PLAYER_BGM_SUB, 3, sAudioEnemyVol, 10);
+ if (D_8016E750[SEQ_PLAYER_BGM_MAIN].unk_254 != NA_BGM_NATURE_AMBIENCE) {
+ Audio_SetVolScale(SEQ_PLAYER_BGM_MAIN, 3, (0x7F - sAudioEnemyVol), 10);
+ }
+ }
+ if (D_8016E750[SEQ_PLAYER_BGM_MAIN].unk_254 != NA_BGM_NATURE_AMBIENCE) {
+ Audio_SplitBgmChannels(sAudioEnemyVol);
+ }
+ }
+ sAudioEnemyDist = dist;
+}
+
+void func_800F6268(f32 dist, u16 arg1) {
+ s8 pad;
+ s8 phi_v1;
+ s16 temp_a0;
+
+ sAudioHasMalonBgm = true;
+ sAudioMalonBgmDist = dist;
+ if (D_8016B9F2 == 0) {
+ temp_a0 = (s8)(func_800FA0B4(SEQ_PLAYER_BGM_MAIN) & 0xFF);
+ if (temp_a0 == (arg1 & 0xFF)) {
+ if ((arg1 & 0xFF) == NA_BGM_LONLON) {
+
+ if (dist > 2000.0f) {
+ phi_v1 = 127;
+ } else if (dist < 200.0f) {
+ phi_v1 = 0;
+ } else {
+ phi_v1 = (s8)(((dist - 200.0f) * 127.0f) / 1800.0f);
+ }
+ // Transition volume of channels 0, 1 and 13 on seq player 0 over 3 frames
+ Audio_SeqCmd6(SEQ_PLAYER_BGM_MAIN, 3, 0, 127 - phi_v1);
+ Audio_SeqCmd6(SEQ_PLAYER_BGM_MAIN, 3, 1, 127 - phi_v1);
+ Audio_SeqCmd6(SEQ_PLAYER_BGM_MAIN, 3, 13, phi_v1);
+ if (D_8016B9D8 == 0) {
+ D_8016B9D8++;
+ }
+ }
+ } else if ((temp_a0 == NA_BGM_NATURE_AMBIENCE) && ((arg1 & 0xFF) == NA_BGM_LONLON)) {
+ temp_a0 = (s8)(func_800FA0B4(SEQ_PLAYER_BGM_SUB) & 0xFF);
+ if ((temp_a0 != (arg1 & 0xFF)) && (D_8016B9D8 < 10)) {
+ func_800F5E18(SEQ_PLAYER_BGM_SUB, NA_BGM_LONLON, 0, 0, 0);
+ Audio_SeqCmdA(SEQ_PLAYER_BGM_SUB, 0xFFFC);
+ D_8016B9D8 = 10;
+ }
+
+ if (dist > 2000.0f) {
+ phi_v1 = 127;
+ } else if (dist < 200.0f) {
+ phi_v1 = 0;
+ } else {
+ phi_v1 = (s8)(((dist - 200.0f) * 127.0f) / 1800.0f);
+ }
+ // Transition volume of channels 0 and 1 on seq player 0 over 3 frames
+ Audio_SeqCmd6(SEQ_PLAYER_BGM_SUB, 3, 0, 127 - phi_v1);
+ Audio_SeqCmd6(SEQ_PLAYER_BGM_SUB, 3, 1, 127 - phi_v1);
+ }
+
+ if (D_8016B9D8 < 10) {
+ D_8016B9D8++;
+ }
+ }
+}
+
+void func_800F64E0(u8 arg0) {
+ D_80130608 = arg0;
+ if (arg0 != 0) {
+ Audio_PlaySoundGeneral(NA_SE_SY_WIN_OPEN, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
+ Audio_QueueCmdS32(0xF1000000, 0);
+ } else {
+ Audio_PlaySoundGeneral(NA_SE_SY_WIN_CLOSE, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
+ Audio_QueueCmdS32(0xF2000000, 0);
+ }
+}
+
+void func_800F6584(u8 arg0) {
+ u8 playerIdx;
+ u16 sp34;
+
+ D_8016B9F2 = arg0;
+ if ((func_800FA0B4(SEQ_PLAYER_BGM_MAIN) & 0xFF) == NA_BGM_LONLON) {
+ playerIdx = SEQ_PLAYER_BGM_MAIN;
+ sp34 = 0;
+ } else if ((func_800FA0B4(SEQ_PLAYER_BGM_SUB) & 0xFF) == NA_BGM_LONLON) {
+ playerIdx = SEQ_PLAYER_BGM_SUB;
+ sp34 = 0xFFFC;
+ } else {
+ return;
+ }
+
+ if (arg0 != 0) {
+ Audio_SeqCmd6(playerIdx, 1, 0, 0);
+ Audio_SeqCmd6(playerIdx, 1, 1, 0);
+ if (playerIdx == SEQ_PLAYER_BGM_SUB) {
+ Audio_SeqCmdA(playerIdx, sp34 | 3);
+ }
+ } else {
+ if (playerIdx == SEQ_PLAYER_BGM_SUB) {
+ func_800F5E18(SEQ_PLAYER_BGM_SUB, NA_BGM_LONLON, 0, 0, 0);
+ }
+ Audio_SeqCmd6(playerIdx, 1, 0, 0x7F);
+ Audio_SeqCmd6(playerIdx, 1, 1, 0x7F);
+ if (playerIdx == SEQ_PLAYER_BGM_SUB) {
+ Audio_SeqCmdA(playerIdx, sp34);
+ }
+ }
+}
+
+void Audio_SetEnvReverb(s8 reverb) {
+ sAudioEnvReverb = reverb & 0x7F;
+}
+
+void Audio_SetCodeReverb(s8 reverb) {
+ if (reverb != 0) {
+ sAudioCodeReverb = reverb & 0x7F;
+ }
+}
+
+void func_800F6700(s8 arg0) {
+ s8 sp1F;
+
+ switch (arg0) {
+ case 0:
+ sp1F = 0;
+ D_80130604 = 0;
+ break;
+ case 1:
+ sp1F = 3;
+ D_80130604 = 3;
+ break;
+ case 2:
+ sp1F = 1;
+ D_80130604 = 1;
+ break;
+ case 3:
+ sp1F = 0;
+ D_80130604 = 2;
+ break;
+ }
+
+ Audio_SeqCmdE0(SEQ_PLAYER_BGM_MAIN, sp1F);
+}
+
+void Audio_SetBaseFilter(u8 filter) {
+ if (sAudioBaseFilter != filter) {
+ if (filter == 0) {
+ Audio_StopSfxById(NA_SE_PL_IN_BUBBLE);
+ } else if (sAudioBaseFilter == 0) {
+ Audio_PlaySoundGeneral(NA_SE_PL_IN_BUBBLE, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
+ }
+ }
+ sAudioBaseFilter = filter;
+ sAudioBaseFilter2 = filter;
+}
+
+void Audio_SetExtraFilter(u8 filter) {
+ u32 t;
+ u8 i;
+
+ sAudioExtraFilter2 = filter;
+ sAudioExtraFilter = filter;
+ if (D_8016E750[SEQ_PLAYER_BGM_MAIN].unk_254 == NA_BGM_NATURE_AMBIENCE) {
+ for (i = 0; i < 16; i++) {
+ t = i;
+ // CHAN_UPD_SCRIPT_IO (seq player 0, all channels, slot 6)
+ Audio_QueueCmdS8(0x6 << 24 | SEQ_PLAYER_BGM_MAIN << 16 | ((t & 0xFF) << 8) | 6, filter);
+ }
+ }
+}
+
+void Audio_SetCutsceneFlag(s8 flag) {
+ sAudioCutsceneFlag = flag;
+}
+
+void Audio_PlaySoundGeneralIfNotInCutscene(u16 sfxId, Vec3f* pos, u8 arg2, f32* freqScale, f32* arg4, s8* reverbAdd) {
+ if (!sAudioCutsceneFlag) {
+ Audio_PlaySoundGeneral(sfxId, pos, arg2, freqScale, arg4, reverbAdd);
+ }
+}
+
+void Audio_PlaySoundIfNotInCutscene(u16 sfxId) {
+ Audio_PlaySoundGeneralIfNotInCutscene(sfxId, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
+}
+
+void func_800F6964(u16 arg0) {
+ s32 skip;
+ u8 i;
+
+ Audio_SeqCmd1(SEQ_PLAYER_BGM_MAIN, (arg0 * 3) / 2);
+ Audio_SeqCmd1(SEQ_PLAYER_FANFARE, (arg0 * 3) / 2);
+ for (i = 0; i < 0x10; i++) {
+ skip = false;
+ switch (i) {
+ case 11:
+ case 12:
+ if (gAudioSpecId == 10) {
+ skip = true;
+ }
+ break;
+ case 13:
+ skip = true;
+ break;
+ }
+
+ if (!skip) {
+ Audio_SeqCmd6(SEQ_PLAYER_SFX, arg0 >> 1, i, 0);
+ }
+ }
+
+ Audio_SeqCmd1(SEQ_PLAYER_BGM_SUB, (arg0 * 3) / 2);
+}
+
+void func_800F6AB0(u16 arg0) {
+ Audio_SeqCmd1(SEQ_PLAYER_BGM_MAIN, arg0);
+ Audio_SeqCmd1(SEQ_PLAYER_FANFARE, arg0);
+ Audio_SeqCmd1(SEQ_PLAYER_BGM_SUB, arg0);
+ Audio_SetVolScale(SEQ_PLAYER_BGM_MAIN, 3, 0x7F, 0);
+ Audio_SetVolScale(SEQ_PLAYER_BGM_MAIN, 1, 0x7F, 0);
+}
+
+void func_800F6B3C(void) {
+ func_800F9280(SEQ_PLAYER_SFX, 0, 0xFF, 5);
+}
+
+void Audio_DisableAllSeq(void) {
+ Audio_DisableSeq(SEQ_PLAYER_BGM_MAIN, 0);
+ Audio_DisableSeq(SEQ_PLAYER_FANFARE, 0);
+ Audio_DisableSeq(SEQ_PLAYER_SFX, 0);
+ Audio_DisableSeq(SEQ_PLAYER_BGM_SUB, 0);
+ Audio_ScheduleProcessCmds();
+}
+
+s8 func_800F6BB8(void) {
+ return func_800E6680();
+}
+
+void func_800F6BDC(void) {
+ Audio_DisableAllSeq();
+ Audio_ScheduleProcessCmds();
+ while (true) {
+ if (!func_800F6BB8()) {
+ return;
+ }
+ }
+}
+
+void Audio_PreNMI(void) {
+ Audio_PreNMIInternal();
+}
+
+void func_800F6C34(void) {
+ sPrevSeqMode = 0;
+ D_8016B7A8 = 1.0f;
+ D_8016B7B0 = 1.0f;
+ sAudioBaseFilter = 0;
+ sAudioExtraFilter = 0;
+ sAudioBaseFilter2 = 0;
+ sAudioExtraFilter2 = 0;
+ Audio_OcaSetInstrument(0);
+ sRiverFreqScaleLerp.remainingFrames = 0;
+ sWaterfallFreqScaleLerp.remainingFrames = 0;
+ sRiverFreqScaleLerp.value = 1.0f;
+ sWaterfallFreqScaleLerp.value = 1.0f;
+ D_8016B7D8 = 1.0f;
+ D_8016B8B0 = 0x7F;
+ D_8016B8B1 = 0x7F;
+ D_8016B8B2 = 0;
+ D_8016B8B3 = 0;
+ sAudioGanonDistVol = 0xFF;
+ D_8016B9D8 = 0;
+ sSpecReverb = sSpecReverbs[gAudioSpecId];
+ D_80130608 = 0;
+ sPrevMainBgmSeqId = NA_BGM_DISABLED;
+ Audio_QueueCmdS8(0x46 << 24 | SEQ_PLAYER_BGM_MAIN << 16, -1);
+ sSariaBgmPtr = NULL;
+ D_8016B9F4 = 0;
+ D_8016B9F3 = 1;
+ D_8016B9F2 = 0;
+}
+
+void Audio_SetNatureAmbienceChannelIO(u8 channelIdxRange, u8 port, u8 val) {
+ u8 firstChannelIdx;
+ u8 lastChannelIdx;
+ u8 channelIdx;
+
+ if ((D_8016E750[SEQ_PLAYER_BGM_MAIN].unk_254 != NA_BGM_NATURE_AMBIENCE) && func_800FA11C(1, 0xF00000FF)) {
+ sAudioNatureFailed = true;
+ return;
+ }
+
+ // channelIdxRange = 01 on port 1
+ if (((channelIdxRange << 8) + port) == ((NATURE_CHANNEL_CRITTER_0 << 8) + CHANNEL_IO_PORT_1)) {
+ if (func_800FA0B4(SEQ_PLAYER_BGM_SUB) != NA_BGM_LONLON) {
+ D_8016B9D8 = 0;
+ }
+ }
+
+ firstChannelIdx = channelIdxRange >> 4;
+ lastChannelIdx = channelIdxRange & 0xF;
+
+ if (firstChannelIdx == 0) {
+ firstChannelIdx = channelIdxRange & 0xF;
+ }
+
+ for (channelIdx = firstChannelIdx; channelIdx <= lastChannelIdx; channelIdx++) {
+ Audio_SeqCmd8(SEQ_PLAYER_BGM_MAIN, port, channelIdx, val);
+ }
+}
+
+void Audio_StartNatureAmbienceSequence(u16 playerIO, u16 channelMask) {
+ u8 channelIdx;
+
+ if (func_800FA0B4(SEQ_PLAYER_BGM_MAIN) == NA_BGM_WINDMILL) {
+ func_800F3F3C(0xF);
+ return;
+ }
+
+ Audio_SeqCmd7(SEQ_PLAYER_BGM_MAIN, 0, 1);
+ Audio_SeqCmd7(SEQ_PLAYER_BGM_MAIN, 4, playerIO >> 8);
+ Audio_SeqCmd7(SEQ_PLAYER_BGM_MAIN, 5, playerIO & 0xFF);
+ Audio_SetVolScale(SEQ_PLAYER_BGM_MAIN, 0, 0x7F, 1);
+
+ channelIdx = false;
+ if (D_80133408 != 0) {
+ channelIdx = true;
+ Audio_SeqCmdE01(SEQ_PLAYER_BGM_MAIN, 0);
+ }
+
+ Audio_StartSeq(SEQ_PLAYER_BGM_MAIN, 0, NA_BGM_NATURE_AMBIENCE);
+
+ if (channelIdx) {
+ Audio_SeqCmdE01(SEQ_PLAYER_BGM_MAIN, 1);
+ }
+
+ for (channelIdx = 0; channelIdx < 16; channelIdx++) {
+ if (!(channelMask & (1 << channelIdx)) && (playerIO & (1 << channelIdx))) {
+ Audio_SeqCmd8(SEQ_PLAYER_BGM_MAIN, CHANNEL_IO_PORT_1, channelIdx, 1);
+ }
+ }
+}
+
+void Audio_PlayNatureAmbienceSequence(u8 natureAmbienceId) {
+ u8 i = 0;
+ u8 channelIdx;
+ u8 port;
+ u8 val;
+
+ if ((D_8016E750[SEQ_PLAYER_BGM_MAIN].unk_254 == NA_BGM_DISABLED) ||
+ !(sSeqFlags[((u8)D_8016E750[SEQ_PLAYER_BGM_MAIN].unk_254) & 0xFF] & 0x80)) {
+
+ Audio_StartNatureAmbienceSequence(sNatureAmbienceDataIO[natureAmbienceId].playerIO,
+ sNatureAmbienceDataIO[natureAmbienceId].channelMask);
+
+ while ((sNatureAmbienceDataIO[natureAmbienceId].channelIO[i] != 0xFF) && (i < 100)) {
+ // Probably a fake match, using Audio_SeqCmd8 doesn't work.
+ channelIdx = sNatureAmbienceDataIO[natureAmbienceId].channelIO[i++];
+ port = sNatureAmbienceDataIO[natureAmbienceId].channelIO[i++];
+ val = sNatureAmbienceDataIO[natureAmbienceId].channelIO[i++];
+ Audio_QueueSeqCmd(0x80000000 | (SEQ_PLAYER_BGM_MAIN << 24) | (port << 0x10) | (channelIdx << 8) | val);
+ }
+
+ Audio_SeqCmd8(SEQ_PLAYER_BGM_MAIN, CHANNEL_IO_PORT_7, NATURE_CHANNEL_UNK, D_80130604);
+ }
+}
+
+void Audio_Init(void) {
+ AudioLoad_Init(NULL, 0);
+}
+
+void Audio_InitSound(void) {
+ func_800F6C34();
+ func_800EE930();
+ Audio_ResetSfxChannelState();
+ func_800FAEB4();
+ Audio_ResetSounds();
+ func_800F9280(SEQ_PLAYER_SFX, 0, 0x70, 10);
+}
+
+void func_800F7170(void) {
+ func_800F9280(SEQ_PLAYER_SFX, 0, 0x70, 1);
+ Audio_QueueCmdS32(0xF2000000, 1);
+ Audio_ScheduleProcessCmds();
+ Audio_QueueCmdS32(0xF8000000, 0);
+}
+
+void func_800F71BC(s32 arg0) {
+ D_80133418 = 1;
+ func_800F6C34();
+ func_800EE930();
+ Audio_ResetSfxChannelState();
+ func_800FADF8();
+ Audio_ResetSounds();
+}
+
+void func_800F7208(void) {
+ func_800FADF8();
+ Audio_QueueCmdS32(0xF2000000, 1);
+ func_800F6C34();
+ Audio_ResetSfxChannelState();
+ func_800F9280(SEQ_PLAYER_SFX, 0, 0x70, 1);
+}