diff --git a/src/audio.h b/src/audio.h index f119506edc..35f9fbe8e5 100644 --- a/src/audio.h +++ b/src/audio.h @@ -71,6 +71,9 @@ typedef u8* WaveData; // converts an 8-bit volume to a 32-bit volume. only valid for vol != 0. #define AU_VOL_8_TO_32(vol) (((vol) << 0x18) | 0xFFFFFF) +// maximum number of instrument presets for a BGM file +#define BGM_MAX_INSTRUMNETS 0x80 + #define BGM_DEFAULT_TICKS_PER_BEAT 48 // fixed scale for update counter to avoid precision loss of fractional frames; 1 unit = 0.001 audio frame @@ -87,7 +90,7 @@ typedef u8* WaveData; // default masterTempo for BGMPlayer, derived from BGM_DEFAULT_BPM #define BGM_DEFAULT_TEMPO (BGM_DEFAULT_BPM * BGM_TEMPO_SCALE) -// just over 100x the default tempo, seemingly chosen for to make each tick = 256 audio samples +// just over 100x the default tempo, seemingly chosen to make each tick = 256 audio samples // solves (AUDIO_SAMPLES * BGM_MFRAMES_PER_MINUTE) / (BGM_DEFAULT_TICKS_PER_BEAT * x) = 256 // --> (184 * 10434782) / (48 * x) = 256 // --> x = (184 * 10434782) / (48 * 256) @@ -110,6 +113,8 @@ typedef u8* WaveData; #define ENV_VOL_MAX 0x80 // for 7-bit volumes, 128 (1 << 7) represents full volume #define ENV_VOL_SHIFT 7 // Shift required to divide by 128 (normalize 7-bit volumes after a multiply) +#define PRG_MAX_COUNT 0x40 + // Multiplies two 7-bit volume values and normalizes the result. #define VOL_MULT_2(a, b) ((a)*(b) >> ENV_VOL_SHIFT) diff --git a/src/audio/bgm_player.c b/src/audio/bgm_player.c index 0f1bce1332..3c8580eda3 100644 --- a/src/audio/bgm_player.c +++ b/src/audio/bgm_player.c @@ -757,7 +757,7 @@ void au_bgm_player_initialize(BGMPlayer* player) { au_bgm_reset_all_voices(player); player->playbackRate = 128.0f; // set to 1.0 later om... player->masterTempo = BGM_DEFAULT_TEMPO; - player->masterTempoBPM = player->masterTempo / 100; + player->masterTempoBPM = BGM_DEFAULT_BPM; player->unused_21E = 0x80; player->masterVolume = AU_MAX_VOLUME_8 << 24; player->pushSongName = 0; @@ -1690,21 +1690,21 @@ void au_BGMCmd_F4_SubTrackRandomPan(BGMPlayer* player, BGMPlayerTrack* track) { void au_BGMCmd_F5_UseInstrument(BGMPlayer* player, BGMPlayerTrack* track) { BGMInstrumentInfo* instrument; s32 volume; - u32 voiceIndex; + u32 insIndex; u32 patch; u32 bank; - voiceIndex = player->seqCmdArgs.UseInstrument.index; - if (voiceIndex < 0x80) { - if (voiceIndex < player->bgmInstrumentCount) { - instrument = &player->instrumentsInfo[voiceIndex]; + insIndex = player->seqCmdArgs.UseInstrument.index; + if (insIndex < BGM_MAX_INSTRUMNETS) { + if (insIndex < player->bgmInstrumentCount) { + instrument = &player->instrumentsInfo[insIndex]; } else { instrument = &player->globals->defaultPRGEntry; } } else { - voiceIndex -= 0x80; - if (voiceIndex < 0x40) { - instrument = &player->globals->dataPRG[voiceIndex]; + insIndex -= BGM_MAX_INSTRUMNETS; + if (insIndex < PRG_MAX_COUNT) { + instrument = &player->globals->dataPRG[insIndex]; } else { instrument = &player->globals->defaultPRGEntry; } diff --git a/src/audio/core/engine.c b/src/audio/core/engine.c index abb3376ee4..66e9455e76 100644 --- a/src/audio/core/engine.c +++ b/src/audio/core/engine.c @@ -66,7 +66,7 @@ void au_engine_init(s32 outputRate) { globals->dataSEF = alHeapAlloc(alHeap, 1, 0x5200); globals->defaultInstrument = alHeapAlloc(alHeap, 1, sizeof(Instrument)); globals->dataPER = alHeapAlloc(alHeap, 1, 6 * sizeof(PEREntry)); - globals->dataPRG = alHeapAlloc(alHeap, 1, 64 * sizeof(BGMInstrumentInfo)); + globals->dataPRG = alHeapAlloc(alHeap, 1, PRG_MAX_COUNT * sizeof(BGMInstrumentInfo)); globals->musicEventQueue = alHeapAlloc(alHeap, 1, MUS_QUEUE_SIZE * sizeof(MusicEventTrigger)); globals->outputRate = outputRate; au_reset_instrument(globals->defaultInstrument); @@ -845,12 +845,12 @@ void au_load_PRG(AuGlobals* globals, s32 romAddr) { au_read_rom(romAddr, &header, sizeof(header)); dataRomAddr = romAddr + sizeof(header); size = header.mdata.size - sizeof(header); - if (size > 0x200) { - size = 0x200; + if (size > PRG_MAX_COUNT * sizeof(BGMInstrumentInfo)) { + size = PRG_MAX_COUNT * sizeof(BGMInstrumentInfo); } au_read_rom(dataRomAddr, globals->dataPRG, size); numItems = size / sizeof(BGMInstrumentInfo); - numItemsLeft = 0x40 - numItems; + numItemsLeft = PRG_MAX_COUNT - numItems; if (numItemsLeft > 0) { end = &globals->dataPRG[numItems]; au_copy_words(&globals->defaultPRGEntry, end, sizeof(BGMInstrumentInfo));