minor prg notes

This commit is contained in:
z64a 2025-06-10 14:41:47 -04:00
parent b37fa6a05b
commit b2796df912
3 changed files with 19 additions and 14 deletions

View File

@ -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)

View File

@ -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;
}

View File

@ -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));