From 641ea57db95ec48ffd05e49f7afe7d373f5d97a6 Mon Sep 17 00:00:00 2001 From: Sonic Dreamcaster Date: Sat, 30 Nov 2024 15:27:35 -0300 Subject: [PATCH 1/6] Disable reverb inits --- src/audio/heap.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/audio/heap.c b/src/audio/heap.c index edb2440f5..229240a26 100644 --- a/src/audio/heap.c +++ b/src/audio/heap.c @@ -663,6 +663,9 @@ void audio_reset_session(void) { for (var_s5 = 0; var_s5 < 4; var_s5++) { gSynthesisReverbs[var_s5].useReverb = 0; } + + // LTODO: Reverbs are causing distortion. + #if 0 gNumSynthesisReverbs = temp_s6->numReverbs; for (var_s5 = 0; var_s5 < gNumSynthesisReverbs; var_s5++) { reverb = &gSynthesisReverbs[var_s5]; @@ -695,6 +698,8 @@ void audio_reset_session(void) { } } } + #endif + func_800BB030(gMaxSimultaneousNotes); osWritebackDCacheAll(); } From 0cfb6b3c6266b943c336afd76370bc468e4f51b4 Mon Sep 17 00:00:00 2001 From: Sonic Dreamcaster Date: Sat, 30 Nov 2024 15:30:08 -0300 Subject: [PATCH 2/6] SAMPLE_HIGH 448 SAMPLE_LOW 432 --- src/port/Engine.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/port/Engine.h b/src/port/Engine.h index 429bace4f..36d78d1fe 100644 --- a/src/port/Engine.h +++ b/src/port/Engine.h @@ -10,8 +10,8 @@ #include #include "libultraship/src/Context.h" -#define SAMPLES_HIGH 454 -#define SAMPLES_LOW 438 +#define SAMPLES_HIGH 448 +#define SAMPLES_LOW 432 #define AUDIO_FRAMES_PER_UPDATE 2 #define NUM_AUDIO_CHANNELS 2 #define SAMPLES_PER_FRAME (SAMPLES_HIGH * NUM_AUDIO_CHANNELS * 2) From 91620199e55740698129fc098d5f92ffb9e2fd69 Mon Sep 17 00:00:00 2001 From: KiritoDv Date: Sat, 30 Nov 2024 13:16:31 -0600 Subject: [PATCH 3/6] Fixed mixer differences and reenabled reverb --- src/audio/heap.c | 5 +---- src/audio/mixer.c | 3 ++- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/audio/heap.c b/src/audio/heap.c index 229240a26..3e88dbf1e 100644 --- a/src/audio/heap.c +++ b/src/audio/heap.c @@ -663,9 +663,7 @@ void audio_reset_session(void) { for (var_s5 = 0; var_s5 < 4; var_s5++) { gSynthesisReverbs[var_s5].useReverb = 0; } - - // LTODO: Reverbs are causing distortion. - #if 0 + gNumSynthesisReverbs = temp_s6->numReverbs; for (var_s5 = 0; var_s5 < gNumSynthesisReverbs; var_s5++) { reverb = &gSynthesisReverbs[var_s5]; @@ -698,7 +696,6 @@ void audio_reset_session(void) { } } } - #endif func_800BB030(gMaxSimultaneousNotes); osWritebackDCacheAll(); diff --git a/src/audio/mixer.c b/src/audio/mixer.c index de780c7ea..a1154886e 100644 --- a/src/audio/mixer.c +++ b/src/audio/mixer.c @@ -274,7 +274,7 @@ void aResampleImpl(uint8_t flags, uint16_t pitch, RESAMPLE_STATE state) { void aEnvSetup1Impl(uint8_t initial_vol_wet, uint16_t rate_wet, uint16_t rate_left, uint16_t rate_right) { rspa.vol_wet = (uint16_t)(initial_vol_wet << 8); - rspa.rate_wet = rate_wet; + rspa.rate_wet = 0; rspa.rate[0] = rate_left; rspa.rate[1] = rate_right; } @@ -289,6 +289,7 @@ void aEnvMixerImpl(uint16_t in_addr, uint16_t n_samples, bool swap_reverb, uint16_t dry_left_addr, uint16_t dry_right_addr, uint16_t wet_left_addr, uint16_t wet_right_addr) { + swap_reverb = false; int16_t *in = BUF_S16(in_addr); int16_t *dry[2] = {BUF_S16(dry_left_addr), BUF_S16(dry_right_addr)}; int16_t *wet[2] = {BUF_S16(wet_left_addr), BUF_S16(wet_right_addr)}; From 5e2c338fc7de5dbeb7248bf54a13d96354922753 Mon Sep 17 00:00:00 2001 From: KiritoDv Date: Sat, 30 Nov 2024 14:44:14 -0600 Subject: [PATCH 4/6] Documented sequences and move them into the Course system --- include/sounds.h | 34 +++++++++++++++++++++++++ src/audio/external.c | 24 ++++++++--------- src/audio/external.h | 4 +-- src/engine/Engine.h | 2 ++ src/engine/World.h | 1 + src/engine/courses/BansheeBoardwalk.cpp | 1 + src/engine/courses/BigDonut.cpp | 1 + src/engine/courses/BlockFort.cpp | 1 + src/engine/courses/BowsersCastle.cpp | 1 + src/engine/courses/ChocoMountain.cpp | 1 + src/engine/courses/Course.cpp | 1 + src/engine/courses/Course.h | 1 + src/engine/courses/DKJungle.cpp | 1 + src/engine/courses/DoubleDeck.cpp | 1 + src/engine/courses/FrappeSnowland.cpp | 1 + src/engine/courses/KalimariDesert.cpp | 1 + src/engine/courses/KoopaTroopaBeach.cpp | 1 + src/engine/courses/LuigiRaceway.cpp | 1 + src/engine/courses/MarioRaceway.cpp | 1 + src/engine/courses/MooMooFarm.cpp | 1 + src/engine/courses/PodiumCeremony.cpp | 1 + src/engine/courses/RainbowRoad.cpp | 1 + src/engine/courses/RoyalRaceway.cpp | 1 + src/engine/courses/SherbetLand.cpp | 1 + src/engine/courses/Skyscraper.cpp | 1 + src/engine/courses/TestCourse.cpp | 1 + src/engine/courses/ToadsTurnpike.cpp | 1 + src/engine/courses/WarioStadium.cpp | 1 + src/engine/courses/YoshiValley.cpp | 1 + src/menus.c | 12 ++++----- src/racing/race_logic.c | 30 ++++------------------ yamls/us/sound/sequences.yml | 10 ++++---- 32 files changed, 91 insertions(+), 50 deletions(-) diff --git a/include/sounds.h b/include/sounds.h index b164bd17e..82875b361 100644 --- a/include/sounds.h +++ b/include/sounds.h @@ -115,4 +115,38 @@ // Hey, you're very good. See you next time! #define SOUND_CREDITS_FAREWELL SOUND_ARG_LOAD(0x49, 0x00, 0x80, 0x26) +enum MusicSeq { + MUSIC_SEQ_UNKNOWN = -1, + MUSIC_SEQ_00, + MUSIC_SEQ_TITLE_SCREEN, + MUSIC_SEQ_MAIN_MENU, + MUSIC_SEQ_RACEWAYS_WARIO_STADIUM, + MUSIC_SEQ_MOO_MOO_FARM_YOSHI_VALLEY, + MUSIC_SEQ_CHOCO_MOUNTAIN, + MUSIC_SEQ_KOOPA_TROOPA_BEACH, + MUSIC_SEQ_BANSHEE_BOARDWALK, + MUSIC_SEQ_FRAPPE_SNOWLAND, + MUSIC_SEQ_BOWSERS_CASTLE, + MUSIC_SEQ_KALIMARI_DESERT, + MUSIC_SEQ_START_GRID_GP_VS, + MUSIC_SEQ_FINAL_LAP_FANFARE, + MUSIC_SEQ_FINISH_1ST_PLACE, + MUSIC_SEQ_FINISH_2ND_4TH_PLACE, + MUSIC_SEQ_FINISH_5TH_8TH_PLACE, + MUSIC_SEQ_16, + MUSIC_SEQ_STAR_JINGLE, + MUSIC_SEQ_RAINBOW_ROAD, + MUSIC_SEQ_DK_JUNGLE, + MUSIC_SEQ_GAME_OVER, + MUSIC_SEQ_TOADS_TURNPIKE, + MUSIC_SEQ_START_GIRD_TIME_ATTACK, + MUSIC_SEQ_VS_BATTLE_RESULTS, + MUSIC_SEQ_LOSING_RESULTS, + MUSIC_SEQ_BATTLE_ARENAS, + MUSIC_SEQ_AWARD_CEREMONY_BUILDUP, + MUSIC_SEQ_AWARD_CEREMONY_1ST_3RD, + MUSIC_SEQ_STAFF_ROLL, + MUSIC_SEQ_AWARD_CEREMONY_4TH_8TH, +}; + #endif // SOUNDS_H diff --git a/src/audio/external.c b/src/audio/external.c index ec4ed3846..032e25c19 100644 --- a/src/audio/external.c +++ b/src/audio/external.c @@ -92,7 +92,7 @@ f32 D_800EA120[] = { 0.0f, 0.0f, 0.0f, 0.0f }; f32 D_800EA130[] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }; f32 D_800EA150 = 1.4f; u8 D_800EA154[] = { 2, 2, 88, 90, 3, 48, 88, 48 }; -u16 D_800EA15C = 0; +u16 gCurrentMusicSeq = 0; u16 D_800EA160 = 0; u8 D_800EA164 = 0; s8 D_800EA168 = 0; @@ -565,7 +565,7 @@ void func_800C2474(void) { D_800EA16C = 0; func_800CBBB8(0xF2000000U, 0); D_800EA16C = 0; - D_800EA15C = 0; + gCurrentMusicSeq = 0; D_800EA160 = 0; D_800EA164 = 0; D_800EA178 = 1.0f; @@ -2834,9 +2834,9 @@ void play_sound2(s32 soundBits) { play_sound(soundBits, &D_800EA1C8, 4, &D_800EA1D4, &D_800EA1D4, &D_800EA1DC); } -void func_800C8EAC(u16 arg0) { +void play_sequence(u16 arg0) { func_800C3448(arg0 | 0x10000); - D_800EA15C = arg0; + gCurrentMusicSeq = arg0; } void func_800C8EF8(u16 arg0) { @@ -3284,7 +3284,7 @@ void func_800CA49C(u8 arg0) { func_800C3448(0x100100FF); // 0x19000000 func_800C3448(0x110100FF); func_800C8EF8(0xC); - func_800C3448(D_800EA15C | 0xC1500000); + func_800C3448(gCurrentMusicSeq | 0xC1500000); func_800C3448(0xC130017D); } D_8018FC08 = D_8018FC08 + 1; @@ -3334,20 +3334,20 @@ void func_800CA730(u8 arg0) { if (D_8018FC08 != 0) { if (((u32) (gSequencePlayers[1].enabled)) == 0) { func_800C3608(1, 5); - func_800C8EAC(D_800EA15C); + play_sequence(gCurrentMusicSeq); func_800C3448(0xB001307DU); } else if ((func_800C3508(1) == 0xC) || (func_800C357C(0x0101000C) == 0)) { func_800C3448(0xC1F00000U); - func_800C3448(D_800EA15C | 0xC1500000); + func_800C3448(gCurrentMusicSeq | 0xC1500000); func_800C3448(0xC130017DU); } else { func_800C3448(0x110100FFU); - func_800C8EAC(D_800EA15C); + play_sequence(gCurrentMusicSeq); func_800C3448(0xB001307DU); } } else { func_800C3448(0x110100FFU); - func_800C8EAC(D_800EA15C); + play_sequence(gCurrentMusicSeq); } } D_800EA164 = 0; @@ -3512,11 +3512,11 @@ void func_800CB14C() { if (D_800EA174 != 0) { D_800EA174++; if (D_800EA174 == 3) { - func_800C8EAC(0x001AU); + play_sequence(MUSIC_SEQ_AWARD_CEREMONY_BUILDUP); func_800C3448(0x4000007F); } if (D_800EA174 == 0x012C) { - func_800C8EAC(0x001BU); + play_sequence(MUSIC_SEQ_AWARD_CEREMONY_1ST_3RD); func_800C3448(0x4000007F); func_800C8EF8(0x001DU); func_800C3448(0x41000000); @@ -3541,7 +3541,7 @@ void func_800CB14C() { func_800C3448(0x110100FF); } if (D_800EA174 == 0x04CE) { - func_800C8EAC(0x0014U); + play_sequence(MUSIC_SEQ_GAME_OVER); func_800C3448(0x4000007F); } } diff --git a/src/audio/external.h b/src/audio/external.h index b11bf6d02..f09f456ed 100644 --- a/src/audio/external.h +++ b/src/audio/external.h @@ -271,7 +271,7 @@ void func_800C8AE4(void); void func_800C8C7C(u8); void func_800C8CCC(void); void play_sound2(s32); -void func_800C8EAC(u16); +void play_sequence(u16); void func_800C8EF8(u16); void func_800C8F44(u8); void func_800C8F80(u8, u32); @@ -399,7 +399,7 @@ extern f32 D_800EA120[4]; extern f32 D_800EA130[8]; extern f32 D_800EA150; // = 1.4f; extern u8 D_800EA154[]; -extern u16 D_800EA15C; +extern u16 gCurrentMusicSeq; extern u16 D_800EA160; extern u8 D_800EA164; extern s8 D_800EA168; diff --git a/src/engine/Engine.h b/src/engine/Engine.h index 9a220c1a4..5af480c23 100644 --- a/src/engine/Engine.h +++ b/src/engine/Engine.h @@ -6,6 +6,7 @@ #include "objects.h" #include "path_spawn_metadata.h" #include "waypoints.h" +#include "sounds.h" typedef struct { RGB8 TopRight; @@ -44,6 +45,7 @@ typedef struct { s32 MinimapFinishlineX; s32 MinimapFinishlineY; SkyboxColours Skybox; + enum MusicSeq Sequence; } CProperties; #endif // __ENGINE_H__ \ No newline at end of file diff --git a/src/engine/World.h b/src/engine/World.h index a5d9770a5..703404c0f 100644 --- a/src/engine/World.h +++ b/src/engine/World.h @@ -66,6 +66,7 @@ class World { int32_t MinimapFinishlineX; int32_t MinimapFinishlineY; SkyboxColours Skybox; + MusicSeq Sequence; } Properties; typedef struct { diff --git a/src/engine/courses/BansheeBoardwalk.cpp b/src/engine/courses/BansheeBoardwalk.cpp index 2211b3294..f1dc8287c 100644 --- a/src/engine/courses/BansheeBoardwalk.cpp +++ b/src/engine/courses/BansheeBoardwalk.cpp @@ -101,6 +101,7 @@ BansheeBoardwalk::BansheeBoardwalk() { Props.Skybox.FloorBottomRight = {0, 0, 0}; Props.Skybox.FloorBottomLeft = {0, 0, 0}; Props.Skybox.FloorTopLeft = {0, 0, 0}; + Props.Sequence = MusicSeq::MUSIC_SEQ_BANSHEE_BOARDWALK; } void BansheeBoardwalk::Load() { diff --git a/src/engine/courses/BigDonut.cpp b/src/engine/courses/BigDonut.cpp index f01930c7b..56ff61a66 100644 --- a/src/engine/courses/BigDonut.cpp +++ b/src/engine/courses/BigDonut.cpp @@ -96,6 +96,7 @@ BigDonut::BigDonut() { Props.Skybox.FloorBottomRight = {0, 0, 0}; Props.Skybox.FloorBottomLeft = {0, 0, 0}; Props.Skybox.FloorTopLeft = {0, 0, 0}; + Props.Sequence = MusicSeq::MUSIC_SEQ_BATTLE_ARENAS; } void BigDonut::Load() { diff --git a/src/engine/courses/BlockFort.cpp b/src/engine/courses/BlockFort.cpp index d6ebf2263..a61e26280 100644 --- a/src/engine/courses/BlockFort.cpp +++ b/src/engine/courses/BlockFort.cpp @@ -99,6 +99,7 @@ BlockFort::BlockFort() { Props.Skybox.FloorBottomRight = {0, 0, 0}; Props.Skybox.FloorBottomLeft = {0, 0, 0}; Props.Skybox.FloorTopLeft = {216, 232, 248}; + Props.Sequence = MusicSeq::MUSIC_SEQ_CHOCO_MOUNTAIN; } void BlockFort::Load() { diff --git a/src/engine/courses/BowsersCastle.cpp b/src/engine/courses/BowsersCastle.cpp index a12b233a8..9098c62e9 100644 --- a/src/engine/courses/BowsersCastle.cpp +++ b/src/engine/courses/BowsersCastle.cpp @@ -101,6 +101,7 @@ BowsersCastle::BowsersCastle() { Props.Skybox.FloorBottomRight = {0, 0, 0}; Props.Skybox.FloorBottomLeft = {0, 0, 0}; Props.Skybox.FloorTopLeft = {0, 0, 0}; + Props.Sequence = MusicSeq::MUSIC_SEQ_BOWSERS_CASTLE; } void BowsersCastle::Load() { diff --git a/src/engine/courses/ChocoMountain.cpp b/src/engine/courses/ChocoMountain.cpp index bc88bf645..71e147f2d 100644 --- a/src/engine/courses/ChocoMountain.cpp +++ b/src/engine/courses/ChocoMountain.cpp @@ -101,6 +101,7 @@ ChocoMountain::ChocoMountain() { Props.Skybox.FloorBottomRight = {255, 255, 255}; Props.Skybox.FloorBottomLeft = {255, 255, 255}; Props.Skybox.FloorTopLeft = {255, 255, 255}; + Props.Sequence = MusicSeq::MUSIC_SEQ_CHOCO_MOUNTAIN; } void ChocoMountain::Load() { diff --git a/src/engine/courses/Course.cpp b/src/engine/courses/Course.cpp index 6cef03d6b..022ee016e 100644 --- a/src/engine/courses/Course.cpp +++ b/src/engine/courses/Course.cpp @@ -73,6 +73,7 @@ Course::Course() { Props.CloudList = NULL; Props.MinimapFinishlineX = 0; Props.MinimapFinishlineY = 0; + Props.Sequence = MusicSeq::MUSIC_SEQ_UNKNOWN; } void Course::Load(Vtx* vtx, Gfx* gfx) { diff --git a/src/engine/courses/Course.h b/src/engine/courses/Course.h index 3d3335854..e711dd510 100644 --- a/src/engine/courses/Course.h +++ b/src/engine/courses/Course.h @@ -75,6 +75,7 @@ public: int32_t MinimapFinishlineX; int32_t MinimapFinishlineY; SkyboxColours Skybox; + MusicSeq Sequence; } Properties; Properties Props; diff --git a/src/engine/courses/DKJungle.cpp b/src/engine/courses/DKJungle.cpp index 4c3d6797c..479c23b02 100644 --- a/src/engine/courses/DKJungle.cpp +++ b/src/engine/courses/DKJungle.cpp @@ -104,6 +104,7 @@ DKJungle::DKJungle() { Props.Skybox.FloorBottomRight = {0, 0, 0}; Props.Skybox.FloorBottomLeft = {0, 0, 0}; Props.Skybox.FloorTopLeft = {22, 145, 22}; + Props.Sequence = MusicSeq::MUSIC_SEQ_DK_JUNGLE; } void DKJungle::Load() { diff --git a/src/engine/courses/DoubleDeck.cpp b/src/engine/courses/DoubleDeck.cpp index 7d07cdc43..74fb7e714 100644 --- a/src/engine/courses/DoubleDeck.cpp +++ b/src/engine/courses/DoubleDeck.cpp @@ -99,6 +99,7 @@ DoubleDeck::DoubleDeck() { Props.Skybox.FloorBottomRight = {0, 0, 0}; Props.Skybox.FloorBottomLeft = {0, 0, 0}; Props.Skybox.FloorTopLeft = {255, 224, 240}; + Props.Sequence = MusicSeq::MUSIC_SEQ_CHOCO_MOUNTAIN; } void DoubleDeck::Load() { diff --git a/src/engine/courses/FrappeSnowland.cpp b/src/engine/courses/FrappeSnowland.cpp index 90fa51e6c..a0e698152 100644 --- a/src/engine/courses/FrappeSnowland.cpp +++ b/src/engine/courses/FrappeSnowland.cpp @@ -102,6 +102,7 @@ FrappeSnowland::FrappeSnowland() { Props.Skybox.FloorBottomRight = {0, 0, 0}; Props.Skybox.FloorBottomLeft = {0, 0, 0}; Props.Skybox.FloorTopLeft = {0, 99, 164}; + Props.Sequence = MusicSeq::MUSIC_SEQ_FRAPPE_SNOWLAND; } void FrappeSnowland::Load() { diff --git a/src/engine/courses/KalimariDesert.cpp b/src/engine/courses/KalimariDesert.cpp index cfb7316e5..2562ab8f8 100644 --- a/src/engine/courses/KalimariDesert.cpp +++ b/src/engine/courses/KalimariDesert.cpp @@ -102,6 +102,7 @@ KalimariDesert::KalimariDesert() { Props.Skybox.FloorBottomRight = {0, 0, 0}; Props.Skybox.FloorBottomLeft = {0, 0, 0}; Props.Skybox.FloorTopLeft = {255, 192, 0}; + Props.Sequence = MusicSeq::MUSIC_SEQ_KALIMARI_DESERT; } void KalimariDesert::Load() { diff --git a/src/engine/courses/KoopaTroopaBeach.cpp b/src/engine/courses/KoopaTroopaBeach.cpp index 66bf99005..48f8c8b77 100644 --- a/src/engine/courses/KoopaTroopaBeach.cpp +++ b/src/engine/courses/KoopaTroopaBeach.cpp @@ -102,6 +102,7 @@ KoopaTroopaBeach::KoopaTroopaBeach() { Props.Skybox.FloorBottomRight = {0, 0, 0}; Props.Skybox.FloorBottomLeft = {0, 0, 0}; Props.Skybox.FloorTopLeft = {48, 152, 120}; + Props.Sequence = MusicSeq::MUSIC_SEQ_KOOPA_TROOPA_BEACH; } void KoopaTroopaBeach::Load() { diff --git a/src/engine/courses/LuigiRaceway.cpp b/src/engine/courses/LuigiRaceway.cpp index 72b6617c2..f98ceab21 100644 --- a/src/engine/courses/LuigiRaceway.cpp +++ b/src/engine/courses/LuigiRaceway.cpp @@ -105,6 +105,7 @@ LuigiRaceway::LuigiRaceway() { Props.Skybox.FloorBottomRight = {0, 0, 0}; Props.Skybox.FloorBottomLeft = {0, 0, 0}; Props.Skybox.FloorTopLeft = {216, 232, 248}; + Props.Sequence = MusicSeq::MUSIC_SEQ_RACEWAYS_WARIO_STADIUM; } void LuigiRaceway::Load() { diff --git a/src/engine/courses/MarioRaceway.cpp b/src/engine/courses/MarioRaceway.cpp index ea8593e17..bde10370d 100644 --- a/src/engine/courses/MarioRaceway.cpp +++ b/src/engine/courses/MarioRaceway.cpp @@ -102,6 +102,7 @@ MarioRaceway::MarioRaceway() { Props.Skybox.FloorBottomRight = {0, 0, 0}; Props.Skybox.FloorBottomLeft = {0, 0, 0}; Props.Skybox.FloorTopLeft = {0, 0, 0}; + Props.Sequence = MusicSeq::MUSIC_SEQ_RACEWAYS_WARIO_STADIUM; } void MarioRaceway::Load() { diff --git a/src/engine/courses/MooMooFarm.cpp b/src/engine/courses/MooMooFarm.cpp index 6517eab82..d1b401342 100644 --- a/src/engine/courses/MooMooFarm.cpp +++ b/src/engine/courses/MooMooFarm.cpp @@ -102,6 +102,7 @@ MooMooFarm::MooMooFarm() { Props.Skybox.FloorBottomRight = {0, 0, 0}; Props.Skybox.FloorBottomLeft = {0, 0, 0}; Props.Skybox.FloorTopLeft = {255, 184, 99}; + Props.Sequence = MusicSeq::MUSIC_SEQ_MOO_MOO_FARM_YOSHI_VALLEY; } void MooMooFarm::Load() { diff --git a/src/engine/courses/PodiumCeremony.cpp b/src/engine/courses/PodiumCeremony.cpp index 9488b8b21..86bf403b3 100644 --- a/src/engine/courses/PodiumCeremony.cpp +++ b/src/engine/courses/PodiumCeremony.cpp @@ -96,6 +96,7 @@ PodiumCeremony::PodiumCeremony() { Props.Skybox.FloorBottomRight = {0, 0, 0}; Props.Skybox.FloorBottomLeft = {0, 0, 0}; Props.Skybox.FloorTopLeft = {255, 224, 240}; + Props.Sequence = MusicSeq::MUSIC_SEQ_UNKNOWN; } void PodiumCeremony::Load() { diff --git a/src/engine/courses/RainbowRoad.cpp b/src/engine/courses/RainbowRoad.cpp index 4836611fb..b8e9865c6 100644 --- a/src/engine/courses/RainbowRoad.cpp +++ b/src/engine/courses/RainbowRoad.cpp @@ -99,6 +99,7 @@ RainbowRoad::RainbowRoad() { Props.Skybox.FloorBottomRight = {0, 0, 0}; Props.Skybox.FloorBottomLeft = {0, 0, 0}; Props.Skybox.FloorTopLeft = {0, 0, 0}; + Props.Sequence = MusicSeq::MUSIC_SEQ_RAINBOW_ROAD; } void RainbowRoad::Load() { diff --git a/src/engine/courses/RoyalRaceway.cpp b/src/engine/courses/RoyalRaceway.cpp index ded9ec464..c2f6b3c62 100644 --- a/src/engine/courses/RoyalRaceway.cpp +++ b/src/engine/courses/RoyalRaceway.cpp @@ -100,6 +100,7 @@ RoyalRaceway::RoyalRaceway() { Props.Skybox.FloorBottomRight = {0, 0, 0}; Props.Skybox.FloorBottomLeft = {0, 0, 0}; Props.Skybox.FloorTopLeft = {255, 224, 240}; + Props.Sequence = MusicSeq::MUSIC_SEQ_RACEWAYS_WARIO_STADIUM; } void RoyalRaceway::Load() { diff --git a/src/engine/courses/SherbetLand.cpp b/src/engine/courses/SherbetLand.cpp index 19bfa573e..b22b31e48 100644 --- a/src/engine/courses/SherbetLand.cpp +++ b/src/engine/courses/SherbetLand.cpp @@ -100,6 +100,7 @@ SherbetLand::SherbetLand() { Props.Skybox.FloorBottomRight = {128, 184, 248}; Props.Skybox.FloorBottomLeft = {128, 184, 248}; Props.Skybox.FloorTopLeft = {216, 232, 248}; + Props.Sequence = MusicSeq::MUSIC_SEQ_FRAPPE_SNOWLAND; } void SherbetLand::Load() { diff --git a/src/engine/courses/Skyscraper.cpp b/src/engine/courses/Skyscraper.cpp index df26ceccb..7af4fd53f 100644 --- a/src/engine/courses/Skyscraper.cpp +++ b/src/engine/courses/Skyscraper.cpp @@ -99,6 +99,7 @@ Skyscraper::Skyscraper() { Props.Skybox.FloorBottomRight = {0, 0, 0}; Props.Skybox.FloorBottomLeft = {0, 0, 0}; Props.Skybox.FloorTopLeft = {0, 0, 0}; + Props.Sequence = MusicSeq::MUSIC_SEQ_BATTLE_ARENAS; } void Skyscraper::Load() { diff --git a/src/engine/courses/TestCourse.cpp b/src/engine/courses/TestCourse.cpp index 05f6c9ed2..742dc6735 100644 --- a/src/engine/courses/TestCourse.cpp +++ b/src/engine/courses/TestCourse.cpp @@ -112,6 +112,7 @@ TestCourse::TestCourse() { Props.Skybox.FloorBottomRight = {0, 0, 0}; Props.Skybox.FloorBottomLeft = {0, 0, 0}; Props.Skybox.FloorTopLeft = {0, 0, 0}; + Props.Sequence = MusicSeq::MUSIC_SEQ_RACEWAYS_WARIO_STADIUM; } void TestCourse::Load() { diff --git a/src/engine/courses/ToadsTurnpike.cpp b/src/engine/courses/ToadsTurnpike.cpp index 257b6c990..7a19a54dc 100644 --- a/src/engine/courses/ToadsTurnpike.cpp +++ b/src/engine/courses/ToadsTurnpike.cpp @@ -104,6 +104,7 @@ ToadsTurnpike::ToadsTurnpike() { Props.Skybox.FloorBottomRight = {0, 0, 0}; Props.Skybox.FloorBottomLeft = {0, 0, 0}; Props.Skybox.FloorTopLeft = {209, 65, 23}; + Props.Sequence = MusicSeq::MUSIC_SEQ_TOADS_TURNPIKE; } void ToadsTurnpike::Load() { diff --git a/src/engine/courses/WarioStadium.cpp b/src/engine/courses/WarioStadium.cpp index f074fb31e..62c75143a 100644 --- a/src/engine/courses/WarioStadium.cpp +++ b/src/engine/courses/WarioStadium.cpp @@ -103,6 +103,7 @@ WarioStadium::WarioStadium() { Props.Skybox.FloorBottomRight = {0, 0, 0}; Props.Skybox.FloorBottomLeft = {0, 0, 0}; Props.Skybox.FloorTopLeft = {0, 0, 0}; + Props.Sequence = MusicSeq::MUSIC_SEQ_RACEWAYS_WARIO_STADIUM; } void WarioStadium::Load() { diff --git a/src/engine/courses/YoshiValley.cpp b/src/engine/courses/YoshiValley.cpp index 3c0a195f4..6bbf50590 100644 --- a/src/engine/courses/YoshiValley.cpp +++ b/src/engine/courses/YoshiValley.cpp @@ -100,6 +100,7 @@ YoshiValley::YoshiValley() { Props.Skybox.FloorBottomRight = {0, 0, 0}; Props.Skybox.FloorBottomLeft = {0, 0, 0}; Props.Skybox.FloorTopLeft = {95, 40, 15}; + Props.Sequence = MusicSeq::MUSIC_SEQ_MOO_MOO_FARM_YOSHI_VALLEY; } void YoshiValley::Load() { diff --git a/src/menus.c b/src/menus.c index 9bbd14332..a42e86c96 100644 --- a/src/menus.c +++ b/src/menus.c @@ -60,7 +60,7 @@ s8 D_8018EE0C; struct_8018EE10_entry D_8018EE10[2]; /** Data **/ -s32 gMenuSelection = START_MENU; +s32 gMenuSelection = LOGO_INTRO_MENU; s32 D_800E86A4 = 0; s8 gCharacterSelections[4] = { MARIO, LUIGI, YOSHI, TOAD }; @@ -1851,7 +1851,7 @@ void func_800B3F74(s32 menuSelection) { } D_8018EDF1 = D_800F2BE0[gPlayerCount - 1]; func_800CA008(0, 0); - func_800C8EAC(1); + play_sequence(MUSIC_SEQ_TITLE_SCREEN); D_8018EDFC = 0; break; } @@ -1868,13 +1868,13 @@ void func_800B3F74(s32 menuSelection) { func_800CB2C4(); gGamestate = 0; gGamestateNext = 0; - func_800C8EAC(2); + play_sequence(MUSIC_SEQ_MAIN_MENU); } switch (D_8018EDE0) { case 0: { gMainMenuSelectionDepth = PLAYER_NUM_SELECTION; - func_800C8EAC(2); + play_sequence(MUSIC_SEQ_MAIN_MENU); gPlayerCount = 1; if (gScreenModeSelection >= NUM_SCREEN_MODES || gScreenModeSelection < 0) { gScreenModeSelection = SCREEN_MODE_1P; @@ -1926,7 +1926,7 @@ void func_800B3F74(s32 menuSelection) { func_800CB2C4(); gGamestate = 0; gGamestateNext = 0; - func_800C8EAC(2); + play_sequence(MUSIC_SEQ_MAIN_MENU); for (i = 0; i < ARRAY_COUNT(D_8018EDE8); i++) { D_8018EDE8[i] = false; } @@ -1966,7 +1966,7 @@ void func_800B3F74(s32 menuSelection) { func_800CB2C4(); gGamestate = 0; gGamestateNext = 0; - func_800C8EAC(2); + play_sequence(MUSIC_SEQ_MAIN_MENU); } play_sound2(SOUND_MENU_SELECT_MAP); D_8018EE0A = 0; diff --git a/src/racing/race_logic.c b/src/racing/race_logic.c index 7565b4f5c..025b50d79 100644 --- a/src/racing/race_logic.c +++ b/src/racing/race_logic.c @@ -21,6 +21,7 @@ #include "effects.h" #include "math.h" #include "menus.h" +#include "sounds.h" #include "port/Game.h" #pragma intrinsic(sqrtf) @@ -423,31 +424,10 @@ void func_8028EC98(s32 arg0) { func_800029B0(); - if (GetCourse() == GetMarioRaceway() || GetCourse() == GetRoyalRaceway() || GetCourse() == GetLuigiRaceway() || - GetCourse() == GetWarioStadium()) { - func_800C8EAC(3); - } else if (GetCourse() == GetToadsTurnpike()) { - func_800C8EAC(21); - } else if (GetCourse() == GetYoshiValley() || GetCourse() == GetMooMooFarm()) { - func_800C8EAC(4); - } else if (GetCourse() == GetChocoMountain() || GetCourse() == GetBlockFort() || GetCourse() == GetDoubleDeck()) { - func_800C8EAC(5); - } else if (GetCourse() == GetKalimariDesert()) { - func_800C8EAC(10); - } else if (GetCourse() == GetKoopaTroopaBeach()) { - func_800C8EAC(6); - } else if (GetCourse() == GetBowsersCastle()) { - func_800C8EAC(9); - } else if (GetCourse() == GetBansheeBoardwalk()) { - func_800C8EAC(7); - } else if (GetCourse() == GetFrappeSnowland() || GetCourse() == GetSherbetLand()) { - func_800C8EAC(8); - } else if (GetCourse() == GetRainbowRoad()) { - func_800C8EAC(18); - } else if (GetCourse() == GetDkJungle()) { - func_800C8EAC(19); - } else if (GetCourse() == GetSkyscraper() || GetCourse() == GetBigDonut()) { - func_800C8EAC(25); + enum MusicSeq sequence = CourseManager_GetProps()->Sequence; + + if(sequence != MUSIC_SEQ_UNKNOWN){ + play_sequence(sequence); } } diff --git a/yamls/us/sound/sequences.yml b/yamls/us/sound/sequences.yml index d34c7a86c..f57a42051 100644 --- a/yamls/us/sound/sequences.yml +++ b/yamls/us/sound/sequences.yml @@ -30,7 +30,7 @@ raceways_wario_stadium: banks: - sound/banks/bank_3 -moo_moo_fame_yoshi_valley: +moo_moo_farm_yoshi_valley: type: NAUDIO:V0:SEQUENCE id: 4 size: 0x1CA0 @@ -62,7 +62,7 @@ banshee_boardwalk: banks: - sound/banks/bank_7 -seq_08: +frappe_snowland: type: NAUDIO:V0:SEQUENCE id: 8 size: 0x23D0 @@ -70,7 +70,7 @@ seq_08: banks: - sound/banks/bank_8 -seq_09: +bowsers_castle: type: NAUDIO:V0:SEQUENCE id: 9 size: 0x1800 @@ -126,7 +126,7 @@ finish_5th_8th_place: banks: - sound/banks/bank_11 -seq_10: +seq_16: type: NAUDIO:V0:SEQUENCE id: 16 size: 0x1410 @@ -150,7 +150,7 @@ rainbow_road: banks: - sound/banks/bank_15 -maybe_boo_item: +dk_jungle: type: NAUDIO:V0:SEQUENCE id: 19 size: 0x06C0 From 1bcfb17f8b9664dbce8d232f291544e7a280bbca Mon Sep 17 00:00:00 2001 From: KiritoDv Date: Sat, 30 Nov 2024 22:46:29 -0600 Subject: [PATCH 5/6] Implemented audio sliders --- src/audio/effects.c | 2 +- src/audio/external.c | 5 ++ src/audio/external.h | 2 + src/audio/internal.h | 1 + src/audio/load.c | 6 +++ src/audio/playback.c | 4 ++ src/port/ui/ImguiUI.cpp | 110 ++++++++++++++++++++-------------------- 7 files changed, 74 insertions(+), 56 deletions(-) diff --git a/src/audio/effects.c b/src/audio/effects.c index 4a5c2dcc3..822ca29be 100644 --- a/src/audio/effects.c +++ b/src/audio/effects.c @@ -12,7 +12,7 @@ void sequence_channel_process_sound(struct SequenceChannel* seqChannel, s32 reca s32 i; if (seqChannel->changes.as_bitfields.volume || recalculateVolume) { - channelVolume = seqChannel->volume * seqChannel->volumeScale * seqChannel->seqPlayer->appliedFadeVolume; + channelVolume = (seqChannel->volume * (seqChannel->volumeScale * seqChannel->seqPlayer->fadeVolume)) * seqChannel->seqPlayer->gameVolume; if (seqChannel->seqPlayer->muted && (seqChannel->muteBehavior & MUTE_BEHAVIOR_SOFTEN) != 0) { channelVolume = seqChannel->seqPlayer->muteVolumeScale * channelVolume; } diff --git a/src/audio/external.c b/src/audio/external.c index 032e25c19..e840e478d 100644 --- a/src/audio/external.c +++ b/src/audio/external.c @@ -3547,6 +3547,11 @@ void func_800CB14C() { } } +void audio_set_player_volume(u8 player, f32 volume) { + gSequencePlayers[player].gameVolume = volume; + gSequencePlayers[player].recalculateVolume = 1; +} + // run audio? void func_800CB2C4() { func_800C1F8C(); diff --git a/src/audio/external.h b/src/audio/external.h index f09f456ed..01022cd8f 100644 --- a/src/audio/external.h +++ b/src/audio/external.h @@ -322,6 +322,8 @@ void func_800CB14C(void); void func_800CB2C4(void); void func_800CBC24(void); +extern void audio_set_player_volume(u8 player, f32 volume); + // This is some from other file, its definitely not part of audio's data/bss extern s8 D_801657E5; diff --git a/src/audio/internal.h b/src/audio/internal.h index 9b7fb37b4..8d0dfbc17 100644 --- a/src/audio/internal.h +++ b/src/audio/internal.h @@ -228,6 +228,7 @@ struct SequencePlayer { /*0x130, 0x13C*/ u8* bankDmaCurrMemAddr; /*0x138, 0x140*/ uintptr_t bankDmaCurrDevAddr; /*0x13C, 0x144*/ size_t bankDmaRemaining; + f32 gameVolume; }; // size = 0x140, 0x148 on EU, 0x14C on SH struct AdsrSettings { diff --git a/src/audio/load.c b/src/audio/load.c index 0a3a15536..4ed6ed5a4 100644 --- a/src/audio/load.c +++ b/src/audio/load.c @@ -5,6 +5,7 @@ #include "audio/data.h" #include "audio/heap.h" #include "audio/internal.h" +#include "audio/external.h" #include "audio/playback.h" #include "audio/synthesis.h" #include "audio/seqplayer.h" @@ -803,6 +804,11 @@ void audio_init(void) { sound_alloc_pool_init(&gUnkPool1.pool, soundAlloc(&gAudioInitPool, (u32) D_800EA5D8), (u32) D_800EA5D8); init_sequence_players(); gAudioLoadLock = 0x76557364; + + audio_set_player_volume(SEQ_PLAYER_LEVEL, CVarGetFloat("gMainMusicVolume", 1.0f)); + audio_set_player_volume(SEQ_PLAYER_ENV, CVarGetFloat("gEnvironmentVolume", 1.0f)); + audio_set_player_volume(SEQ_PLAYER_SFX, CVarGetFloat("gSFXMusicVolume", 1.0f)); + } #else #ifdef VERSION_EU diff --git a/src/audio/playback.c b/src/audio/playback.c index 671a38260..30dcb388d 100644 --- a/src/audio/playback.c +++ b/src/audio/playback.c @@ -71,6 +71,10 @@ void note_set_vel_pan_reverb(struct Note* note, f32 velocity, u8 pan, u8 reverbV velocity = 1.0f; } + float master_vol = CVarGetFloat("gGameMasterVolume", 1.0f); + volLeft *= master_vol; + volRight *= master_vol; + sub->targetVolLeft = ((s32) (velocity * volLeft * 4095.999f)); sub->targetVolRight = ((s32) (velocity * volRight * 4095.999f)); diff --git a/src/port/ui/ImguiUI.cpp b/src/port/ui/ImguiUI.cpp index 2284346bb..95d862a83 100644 --- a/src/port/ui/ImguiUI.cpp +++ b/src/port/ui/ImguiUI.cpp @@ -18,6 +18,7 @@ extern "C" { extern s32 gGamestateNext; extern s32 gMenuSelection; + #include "audio/external.h" #include "defines.h" } @@ -125,61 +126,60 @@ static const char* filters[3] = { void DrawSettingsMenu() { if (UIWidgets::BeginMenu("Settings")) { - // if (UIWidgets::BeginMenu("Audio")) { - // UIWidgets::CVarSliderFloat("Master Volume", "gGameMasterVolume", 0.0f, 1.0f, 1.0f, { - // .format = "%.0f%%", - // .isPercentage = true, - // }); - // if (UIWidgets::CVarSliderFloat("Main Music Volume", "gMainMusicVolume", 0.0f, 1.0f, 1.0f, - // { - // .format = "%.0f%%", - // .isPercentage = true, - // })) { - // audio_set_player_volume(SEQ_PLAYER_LEVEL, CVarGetFloat("gMainMusicVolume", 1.0f)); - // } - // if (UIWidgets::CVarSliderFloat("Sound Effects Volume", "gSFXMusicVolume", - // 0.0f, 1.0f, 1.0f, { - // .format = "%.0f%%", - // .isPercentage = true, - // })) { - // audio_set_player_volume(SEQ_PLAYER_SFX, CVarGetFloat("gSFXMusicVolume", 1.0f)); - // } - // if (UIWidgets::CVarSliderFloat("Environment Volume", "gEnvironmentVolume", - // 0.0f, 1.0f, 1.0f, { - // .format = "%.0f%%", - // .isPercentage = true, - // })) { - // audio_set_player_volume(SEQ_PLAYER_ENV, CVarGetFloat("gEnvironmentVolume", 1.0f)); - // } - // - // static std::unordered_map audioBackendNames = { - // { Ship::AudioBackend::WASAPI, "Windows Audio Session API" }, - // { Ship::AudioBackend::PULSE, "PulseAudio" }, - // { Ship::AudioBackend::SDL, "SDL" }, - // }; - // - // ImGui::Text("Audio API (Needs reload)"); - // auto currentAudioBackend = Ship::Context::GetInstance()->GetAudio()->GetAudioBackend(); - // - // if (Ship::Context::GetInstance()->GetAudio()->GetAvailableAudioBackends()->size() <= 1) { - // UIWidgets::DisableComponent(ImGui::GetStyle().Alpha * 0.5f); - // } - // if (ImGui::BeginCombo("##AApi", audioBackendNames[currentAudioBackend])) { - // for (uint8_t i = 0; i < - // Ship::Context::GetInstance()->GetAudio()->GetAvailableAudioBackends()->size(); i++) { - // auto backend = Ship::Context::GetInstance()->GetAudio()->GetAvailableAudioBackends()->data()[i]; - // if (ImGui::Selectable(audioBackendNames[backend], backend == currentAudioBackend)) { - // Ship::Context::GetInstance()->GetAudio()->SetAudioBackend(backend); - // } - // } - // ImGui::EndCombo(); - // } - // if (Ship::Context::GetInstance()->GetAudio()->GetAvailableAudioBackends()->size() <= 1) { - // UIWidgets::ReEnableComponent(""); - // } - // - // ImGui::EndMenu(); - // } + if (UIWidgets::BeginMenu("Audio")) { + UIWidgets::CVarSliderFloat("Master Volume", "gGameMasterVolume", 0.0f, 1.0f, 1.0f, { + .format = "%.0f%%", + .isPercentage = true, + }); + if (UIWidgets::CVarSliderFloat("Main Music Volume", "gMainMusicVolume", 0.0f, 1.0f, 1.0f, + { + .format = "%.0f%%", + .isPercentage = true, + })) { + audio_set_player_volume(SEQ_PLAYER_LEVEL, CVarGetFloat("gMainMusicVolume", 1.0f)); + } + if (UIWidgets::CVarSliderFloat("Sound Effects Volume", "gSFXMusicVolume", + 0.0f, 1.0f, 1.0f, { + .format = "%.0f%%", + .isPercentage = true, + })) { + audio_set_player_volume(SEQ_PLAYER_SFX, CVarGetFloat("gSFXMusicVolume", 1.0f)); + } + if (UIWidgets::CVarSliderFloat("Environment Volume", "gEnvironmentVolume", + 0.0f, 1.0f, 1.0f, { + .format = "%.0f%%", + .isPercentage = true, + })) { + audio_set_player_volume(SEQ_PLAYER_ENV, CVarGetFloat("gEnvironmentVolume", 1.0f)); + } + + static std::unordered_map audioBackendNames = { + { Ship::AudioBackend::WASAPI, "Windows Audio Session API" }, + { Ship::AudioBackend::SDL, "SDL" }, + }; + + ImGui::Text("Audio API (Needs reload)"); + auto currentAudioBackend = Ship::Context::GetInstance()->GetAudio()->GetCurrentAudioBackend(); + + if (Ship::Context::GetInstance()->GetAudio()->GetAvailableAudioBackends()->size() <= 1) { + UIWidgets::DisableComponent(ImGui::GetStyle().Alpha * 0.5f); + } + if (ImGui::BeginCombo("##AApi", audioBackendNames[currentAudioBackend])) { + for (uint8_t i = 0; i < + Ship::Context::GetInstance()->GetAudio()->GetAvailableAudioBackends()->size(); i++) { + auto backend = Ship::Context::GetInstance()->GetAudio()->GetAvailableAudioBackends()->data()[i]; + if (ImGui::Selectable(audioBackendNames[backend], backend == currentAudioBackend)) { + Ship::Context::GetInstance()->GetAudio()->SetCurrentAudioBackend(backend); + } + } + ImGui::EndCombo(); + } + if (Ship::Context::GetInstance()->GetAudio()->GetAvailableAudioBackends()->size() <= 1) { + UIWidgets::ReEnableComponent(""); + } + + ImGui::EndMenu(); + } UIWidgets::Spacer(0); From 0caf53c48d0423549faa050e3e2f147e49bdb476 Mon Sep 17 00:00:00 2001 From: KiritoDv Date: Sat, 30 Nov 2024 22:46:44 -0600 Subject: [PATCH 6/6] Added support for current XML factories --- src/port/Engine.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/port/Engine.cpp b/src/port/Engine.cpp index d9e420bf7..59d76cfb9 100644 --- a/src/port/Engine.cpp +++ b/src/port/Engine.cpp @@ -86,10 +86,17 @@ GameEngine::GameEngine() { "Texture", static_cast(LUS::ResourceType::Texture), 0); loader->RegisterResourceFactory(std::make_shared(), RESOURCE_FORMAT_BINARY, "Texture", static_cast(LUS::ResourceType::Texture), 1); + loader->RegisterResourceFactory(std::make_shared(), RESOURCE_FORMAT_BINARY, "Vertex", static_cast(LUS::ResourceType::Vertex), 0); + loader->RegisterResourceFactory(std::make_shared(), RESOURCE_FORMAT_XML, + "Vertex", static_cast(LUS::ResourceType::Vertex), 0); + loader->RegisterResourceFactory(std::make_shared(), RESOURCE_FORMAT_BINARY, "DisplayList", static_cast(LUS::ResourceType::DisplayList), 0); + loader->RegisterResourceFactory(std::make_shared(), RESOURCE_FORMAT_XML, + "DisplayList", static_cast(LUS::ResourceType::DisplayList), 0); + loader->RegisterResourceFactory(std::make_shared(), RESOURCE_FORMAT_BINARY, "Matrix", static_cast(LUS::ResourceType::Matrix), 0); loader->RegisterResourceFactory(std::make_shared(), RESOURCE_FORMAT_BINARY,