Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
engine.c
Go to the documentation of this file.
1#include "audio.h"
2#include "audio/core.h"
3#include "ld_addrs.h"
4
12
13static void au_reset_instrument(Instrument* instrument);
14static void au_reset_drum_entry(BGMDrumInfo* arg0);
15static void au_reset_instrument_entry(BGMInstrumentInfo* arg0);
16
17// data
21extern f32 AlTuneScaling[];
22
23#ifdef SHIFT
24#define SBN_ROM_OFFSET (s32) audio_ROM_START
25#elif VERSION_JP
26#define SBN_ROM_OFFSET 0xFC0000
27#elif VERSION_PAL
28#define SBN_ROM_OFFSET 0x13A0000
29#else
30#define SBN_ROM_OFFSET 0xF00000
31#endif
32
33void au_release_voice(u8 index) {
35
36 voice->cmdPtr = nullptr;
37 voice->priority = AU_PRIORITY_FREE;
38}
39
40void au_engine_init(s32 outputRate) {
41 AuGlobals* globals;
45 u8 effects[4];
46 u32 i;
47
50
58
59 globals = gSoundGlobals;
60 dummyTrackData = alHeapAlloc(alHeap, 1, 0x8000);
61 globals->dataBGM[0] = (BGMHeader*) &dummyTrackData[0];
62 globals->dataBGM[1] = (BGMHeader*) &dummyTrackData[0x1400];
63 globals->dataMSEQ[0] = (MSEQHeader*) &dummyTrackData[0x1C00];
64 globals->dataMSEQ[1] = (MSEQHeader*) &dummyTrackData[0x1400];
65
66 for (i = 0; i < ARRAY_COUNT(globals->snapshots); i++) {
67 globals->snapshots[i].bgmPlayer = alHeapAlloc(alHeap, 1, sizeof(BGMPlayer));
68 }
69
70 globals->dataSEF = alHeapAlloc(alHeap, 1, 0x5200);
71 globals->defaultInstrument = alHeapAlloc(alHeap, 1, sizeof(Instrument));
72 globals->dataPER = alHeapAlloc(alHeap, 1, 6 * sizeof(PEREntry));
75 globals->outputRate = outputRate;
76 au_reset_instrument(globals->defaultInstrument);
77 au_reset_drum_entry(&globals->defaultDrumEntry);
78 au_reset_instrument_entry(&globals->defaultPRGEntry);
80
81 globals->audioThreadCallbacks[0] = nullptr;
82 globals->audioThreadCallbacks[1] = nullptr;
83
84 for (i = 0; i < ARRAY_COUNT(globals->snapshots); i++) {
85 globals->snapshots[i].assigned = 0;
86 globals->snapshots[i].priority = 0;
87 }
88
89 for (i = 0; i < ARRAY_COUNT(globals->effectChanges); i++) {
90 globals->effectChanges[i].type = AU_FX_NONE;
91 globals->effectChanges[i].changed = false;
92 }
93
94 for (i = 0; i < ARRAY_COUNT(globals->voices); i++) {
98 voice = &globals->voices[i];
99 voice->instrument = nullptr;
100 voice->pitchRatio = 0;
101 voice->volume = -1;
102 voice->pan = 0xFF;
103 voice->reverb = 0xFF;
104 voice->busID = 0;
105 voice->donePending = false;
106 voice->syncFlags = 0;
107 voice->clientPriority = AU_PRIORITY_FREE;
108 voice->priority = AU_PRIORITY_FREE;
109 }
110
112
113 for (i = 0; i < ARRAY_COUNT(globals->auxBanks); i++) {
114 globals->auxBanks[i] = alHeapAlloc(alHeap, 1, sizeof(BKFileBuffer));
115 }
116
120 effects[2] = -1;
121 effects[3] = -1;
123
125 effects[0] = FX_BUS_BGMB;
126 effects[1] = -1;
127 effects[2] = -1;
128 effects[3] = -1;
130
133 au_init_voices(globals);
134 au_load_BK_headers(globals, alHeap);
136 au_read_rom(fileEntry.offset, globals->dataSEF, fileEntry.data & 0xFFFFFF);
137 }
140 au_load_PER(globals, fileEntry.offset);
141 }
143 au_load_PRG(globals, fileEntry.offset);
144 }
145
146 globals->bankSets[BANK_SET_IDX_0] = globals->auxBankSet;
147 globals->bankSets[BANK_SET_IDX_1] = globals->bankSet2;
148 globals->bankSets[BANK_SET_IDX_2] = globals->defaultBankSet;
149 globals->bankSets[BANK_SET_IDX_3] = globals->musicBankSet;
150 globals->bankSets[BANK_SET_IDX_4] = globals->bankSet4;
151 globals->bankSets[BANK_SET_IDX_5] = globals->bankSet5;
152 globals->bankSets[BANK_SET_IDX_6] = globals->bankSet6;
153 globals->bankSets[BANK_SET_IDX_7] = globals->auxBankSet;
154
156 globals->channelDelayTime = 0;
157 globals->channelDelayBusID = 0;
158 globals->channelDelayPending = false;
159
162}
163
165static void au_reset_instrument(Instrument* instrument) {
166 instrument->wavData = DummyInstrumentWavData;
167 instrument->wavDataLength = sizeof(DummyInstrumentWavData);
169 instrument->codebookSize = sizeof(DummyInstrumentCodebook);
170 instrument->keyBase = DEFAULT_KEYBASE;
171 instrument->loopState = nullptr;
172 instrument->loopStart = 0;
173 instrument->loopEnd = 0;
174 instrument->loopCount = 0;
175 instrument->type = 0;
176 instrument->useDma = false;
177 instrument->envelopes = &DummyInstrumentEnvelope;
178 instrument->unused_26 = 0;
179 instrument->unused_27 = 0;
180 instrument->unused_28 = 0;
181 instrument->unused_29 = 0;
182 instrument->unused_2A = 0;
183 instrument->unused_2B = 0;
184 instrument->pitchRatio = 0.5f;
185}
186
188static void au_reset_drum_entry(BGMDrumInfo* info) {
189 // @bug index 0x10 will overflow defaultBankSet and choose first instrument from musicBankSet instead?
190 info->bankPatch = (BANK_SET_IDX_2 << 12) | 0x10;
191 info->keyBase = DEFAULT_KEYBASE;
192 info->volume = AU_MAX_VOLUME_8;
193 info->pan = 64;
194 info->reverb = 0;
195 info->randTune = 0;
196 info->randVolume = 0;
197 info->randPan = 0;
198 info->randReverb = 0;
199}
200
202static void au_reset_instrument_entry(BGMInstrumentInfo* info) {
203 // @bug index 0x10 will overflow defaultBankSet and choose first instrument from musicBankSet instead?
204 info->bankPatch = (BANK_SET_IDX_2 << 12) | 0x10;
205 info->volume = AU_MAX_VOLUME_8;
206 info->pan = 64;
207 info->reverb = 0;
208 info->coarseTune = 0;
209 info->fineTune = 0;
210}
211
215 AuGlobals* globals = gSoundGlobals;
218 BGMPlayer* bgmPlayer;
219
221
222 // Update ambience manager every other frame
223 ambManager->nextUpdateCounter -= ambManager->nextUpdateStep;
224 if (ambManager->nextUpdateCounter <= 0) {
225 ambManager->nextUpdateCounter += ambManager->nextUpdateInterval;
227 }
228
229 // Update volume fade for SFX bus
230 if (sfxManager->fadeInfo.baseTicks != 0) {
231 au_fade_update(&sfxManager->fadeInfo);
232 au_fade_set_volume(sfxManager->busID, sfxManager->fadeInfo.baseVolume >> 16, sfxManager->busVolume);
233 }
234
235 // Periodic SFX manager update
236 sfxManager->nextUpdateCounter -= sfxManager->nextUpdateStep;
237 if (sfxManager->nextUpdateCounter <= 0) {
238 sfxManager->nextUpdateCounter += sfxManager->nextUpdateInterval;
240 }
241
242 // Update gBGMPlayerB
244 bgmPlayer = gBGMPlayerB;
245 if (bgmPlayer->fadeInfo.baseTicks != 0) {
246 au_bgm_update_fade(bgmPlayer);
247 }
248 if (bgmPlayer->songName != 0) {
249 bgmPlayer->songPlayingCounter++;
250 }
251
252 bgmPlayer->nextUpdateCounter -= bgmPlayer->nextUpdateStep;
253 if (bgmPlayer->nextUpdateCounter <= 0) {
254 bgmPlayer->nextUpdateCounter += bgmPlayer->tickUpdateInterval;
256 }
257 }
258
259 // Update gBGMPlayerA
261 if (globals->resumeRequested) {
263 }
264 bgmPlayer = gBGMPlayerA;
265 if (bgmPlayer->fadeInfo.envelopeTicks != 0) {
267 if (bgmPlayer->fadeInfo.baseTicks == 0) {
268 au_bgm_update_bus_volumes(bgmPlayer);
269 } else {
270 au_bgm_update_fade(bgmPlayer);
271 }
272 } else if (bgmPlayer->fadeInfo.baseTicks != 0) {
273 au_bgm_update_fade(bgmPlayer);
274 }
275 if (bgmPlayer->songName != 0) {
276 bgmPlayer->songPlayingCounter++;
277 }
278
279 bgmPlayer->nextUpdateCounter -= bgmPlayer->nextUpdateStep;
280 if (bgmPlayer->nextUpdateCounter <= 0) {
281 bgmPlayer->nextUpdateCounter += bgmPlayer->tickUpdateInterval;
283 }
284 }
285
286 // With all clients updated, now update all voices
287 au_update_voices(globals);
288}
289
291 AuGlobals* globals = gSoundGlobals;
292 BGMPlayer* player = gBGMPlayerA;
294
295 if (globals->flushMusicEventQueue) {
297 }
298
300 if (BeginSoundUpdateCallback != nullptr) {
302 }
303
305
306 player = gBGMPlayerB;
308
310}
311
313 u32 i;
314
318 }
319
320 if (globals->channelDelayPending && (globals->channelDelayState == AU_DELAY_STATE_ON)) {
321 switch (globals->channelDelaySide) {
325 globals->channelDelayPending = false;
326 break;
330 globals->channelDelayPending = false;
331 break;
332 default:
334 globals->channelDelayPending = false;
335 break;
336 }
337 }
338
339 // handle effect bus changes
340 if (globals->effectChanges[FX_BUS_BGMA_MAIN].changed) {
342 globals->effectChanges[FX_BUS_BGMA_MAIN].changed = false;
343 }
344 if (globals->effectChanges[FX_BUS_SOUND].changed) {
346 globals->effectChanges[FX_BUS_SOUND].changed = false;
347
348 } if (globals->effectChanges[FX_BUS_BGMB].changed) {
350 globals->effectChanges[FX_BUS_BGMB].changed = false;
351 }
352 if (globals->effectChanges[FX_BUS_BGMA_AUX].changed) {
354 globals->effectChanges[FX_BUS_BGMA_AUX].changed = false;
355 }
356
357 for (i = 0; i < ARRAY_COUNT(globals->voices); i++) {
358 AuVoice* voice = &globals->voices[i];
360
361 if (voice->donePending) {
363 voice->donePending = false;
364 voice->cmdPtr = nullptr;
365 voice->priority = AU_PRIORITY_FREE;
366 }
367
369 au_voice_start(voice, &voice->envelope);
370 au_syn_start_voice_params(i, voice->busID, voice->instrument, voice->pitchRatio, voice->volume, voice->pan, voice->reverb, voice->delta);
371 // priority may be AU_PRIORITY_FREE if this voice was stolen and reset
372 voice->priority = voice->clientPriority;
373 } else {
375 au_syn_set_pitch(i, voice->pitchRatio);
376 }
377
379 au_syn_set_mixer_params(i, voice->volume, voice->delta, voice->pan, voice->reverb);
381 au_syn_set_pan_fxmix(i, voice->pan, voice->reverb);
382 }
383 }
384 voice->syncFlags = 0;
385 }
386}
387
389 if (voice->priority != AU_PRIORITY_FREE) {
390 voice->cmdPtr = nullptr;
391 voice->donePending = true;
392 voice->syncFlags = 0;
394 }
395}
396
398 voice->cmdPtr = nullptr;
399 voice->donePending = true;
400 voice->syncFlags = 0;
402}
403
404// array offsets into AlTuneScaling
405#define TUNE_SCALING_ARR_AMPLIFY_FINE 0
406#define TUNE_SCALING_ARR_AMPLIFY_COARSE 128
407#define TUNE_SCALING_ARR_ATTENUATE_FINE 160
408#define TUNE_SCALING_ARR_ATTENUATE_COARSE 288
409
411 if (tuning >= 0) {
414 } else {
415 tuning = -tuning;
418 }
419}
420
422 fade->baseVolume = startValue << 16;
423 fade->baseTarget = endValue;
424
425 if (time != 0) {
426 fade->baseTicks = (time * 1000) / AU_FRAME_USEC;
427 fade->baseStep = ((endValue << 16) - fade->baseVolume) / fade->baseTicks;
428 } else {
429 fade->baseTicks = 1;
430 fade->baseStep = 0;
431 }
432
433 fade->onCompleteCallback = nullptr;
434}
435
437 fade->baseTicks = 0;
438 fade->baseStep = 0;
439 fade->onCompleteCallback = nullptr;
440}
441
443 fade->baseTicks--;
444
445 if ((fade->baseTicks << 16) != 0) {
446 fade->baseVolume += fade->baseStep;
447 } else {
448 fade->baseVolume = fade->baseTarget << 16;
449 if (fade->onCompleteCallback != nullptr) {
450 fade->onCompleteCallback();
451 fade->baseStep = 0;
452 fade->onCompleteCallback = nullptr;
453 }
454 }
455}
456
457void au_fade_set_volume(u8 busID, u16 volume, s32 busVolume) {
458 au_bus_set_volume(busID, (u32)(volume * busVolume) / AU_MAX_BUS_VOLUME);
459}
460
462 if (fade->baseTicks == 0) {
463 fade->baseTicks = 1;
464 fade->baseStep = 0;
465 fade->baseTarget = ((u32)fade->baseVolume >> 16);
466 }
467}
468
470 fade->envelopeVolume = value << 16;
471 fade->envelopeTarget = value;
472 fade->envelopeTicks = 0;
473 fade->envelopeStep = 0;
474}
475
477 s16 ticks;
478 s32 delta;
479
480 if (duration >= 250 && duration <= 100000) {
481 ticks = (s32)(duration * 1000) / AU_FRAME_USEC;
482 delta = (target << 16) - fade->envelopeVolume;
483
484 fade->envelopeTarget = target;
485 fade->envelopeTicks = ticks;
486 fade->envelopeStep = delta / ticks;
487 } else {
488 fade->envelopeTicks = 0;
489 fade->envelopeStep = 0;
490 }
491}
492
494 fade->envelopeTicks--;
495
496 if (fade->envelopeTicks != 0) {
497 fade->envelopeVolume += fade->envelopeStep;
498 } else {
499 fade->envelopeStep = 0;
500 fade->envelopeVolume = fade->envelopeTarget << 16;
501 }
502}
503
507 // note that patch here can be up to 255, selecting from a maximum of 16 instruments and 16 banks per group
508 Instrument* instrument = (*globals->bankSets[(bank & 0x70) >> 4])[patch];
509 EnvelopePreset* envelope = instrument->envelopes;
510 u32 envelopeIdx = bank & 3;
511
512 if (envelopeIdx < envelope->count) {
513 envData->cmdListPress = AU_FILE_RELATIVE(envelope, envelope->offsets[envelopeIdx].offsetPress);
514 envData->cmdListRelease = AU_FILE_RELATIVE(envelope, envelope->offsets[envelopeIdx].offsetRelease);
515 } else {
516 envData->cmdListPress = EnvelopePressDefault;
517 envData->cmdListRelease = &EnvelopePressDefault[4]; //EnvelopeReleaseDefault;
518 }
519 return instrument;
520}
521
523 AuGlobals* globals = gSoundGlobals;
524
525 switch (playerIndex) {
526 case 0:
527 *outFile = globals->dataBGM[0];
529 break;
530 case 1:
531 *outFile = globals->dataBGM[1];
533 break;
534 case 2:
535 *outFile = globals->dataBGM[0];
537 break;
538 default:
539 *outFile = nullptr;
540 *outPlayer = nullptr;
541 break;
542 }
543}
544
546 switch (playerIndex) {
547 case 0:
549 break;
550 case 1:
552 break;
553 case 2:
555 break;
556 default:
557 *outPlayer = nullptr;
558 break;
559 }
560}
561
563 AuResult status;
566 AuGlobals* globals = gSoundGlobals;
568 s32 i;
569 u16 bkFileIndex;
570 s32 bgmFileIndex;
571 u32 data;
572 u32 offset;
575 s32 cond;
576
577 // needed to match
578 cond = songID < globals->songListLength;
579 playerCopy = player;
580 fileCopy = bgmFile;
581
582 if (cond) {
583 songInfo = &globals->songList[songID];
584 status = au_fetch_SBN_file(songInfo->bgmFileIndex, AU_FMT_BGM, &fileEntry);
585 if (status != AU_RESULT_OK) {
586 return status;
587 }
588
590 return AU_ERROR_201;
591 }
592
593 au_read_rom(fileEntry.offset, fileCopy, fileEntry.data & 0xFFFFFF);
594
595 for (i = 0; i < ARRAY_COUNT(songInfo->bkFileIndex); i++) {
596 bkFileIndex = songInfo->bkFileIndex[i];
597 if (bkFileIndex != 0) {
598 bkFileEntry = &globals->sbnFileList[bkFileIndex];
599
600 offset = (bkFileEntry->offset & 0xFFFFFF) + globals->baseRomOffset;
601 data = bkFileEntry->data;
602
603 if ((data >> 0x18) == AU_FMT_BK) {
604 au_load_aux_bank(offset, i);
605 }
606 }
607 }
608 bgmFileIndex = songInfo->bgmFileIndex;
609 playerCopy->songID = songID;
610 playerCopy->bgmFile = bgmFile;
611 playerCopy->bgmFileIndex = bgmFileIndex;
612 return fileCopy->name;
613 } else {
614 return AU_ERROR_151;
615 }
616}
617
619 AuResult status;
623 AuGlobals* globals;
625 s32 i;
626 u16 bkFileIndex;
627
628 globals = gSoundGlobals;
629 songInfo = &globals->songList[songID];
630 status = au_fetch_SBN_file(songInfo->bgmFileIndex, AU_FMT_BGM, &sbnEntry);
631 if (status == AU_RESULT_OK) {
632 // load BGM file
633 au_read_rom(sbnEntry.offset, bgmFile, sbnEntry.data & 0xFFFFFF);
634
635 // load any auxiliary banks required by this BGM
636 for (i = 0; i < ARRAY_COUNT(songInfo->bkFileIndex); i++) {
637 bkFileIndex = songInfo->bkFileIndex[i];
638 if (bkFileIndex != 0) {
639 bkFileEntry = &globals->sbnFileList[bkFileIndex];
640
641 fileEntry.offset = (bkFileEntry->offset & 0xFFFFFF) + globals->baseRomOffset;
642 fileEntry.data = bkFileEntry->data;
643
644 if ((fileEntry.data >> 0x18) == AU_FMT_BK) {
645 au_load_aux_bank(fileEntry.offset, i);
646 } else {
648 }
649 }
650 }
651 }
652
653 return status;
654}
655
657 if (index == BGM_SNAPSHOT_0) {
659 }
660 return nullptr;
661}
662
663#define SBN_EXTRA_LOOKUP(i,fmt,e) (au_fetch_SBN_file(globals->extraFileList[AmbientSoundIDtoMSEQFileIndex[i]], fmt, &e))
664
668 AuGlobals* globals;
669 MSEQHeader* mseqFile;
670 u32 i;
671
672 globals = gSoundGlobals;
675 if (manager->players[0].mseqName == 0) {
677 au_read_rom(fileEntry.offset, globals->dataMSEQ[0], fileEntry.data & 0xFFFFFF);
678 manager->mseqFiles[0] = globals->dataMSEQ[0];
679 for (i = 1; i < ARRAY_COUNT(manager->mseqFiles); i++) {
680 manager->mseqFiles[i] = nullptr;
681 }
682 manager->numActivePlayers = 1;
683 }
684 }
685 } else if (ambSoundID == AMBIENT_RADIO
686 && manager->players[0].mseqName == 0
687 && manager->players[1].mseqName == 0
688 && manager->players[2].mseqName == 0
689 ) {
690 manager->numActivePlayers = 0;
691 for (i = 0; i < ARRAY_COUNT(manager->mseqFiles); i++) {
692 manager->mseqFiles[i] = nullptr;
693 }
694
695 mseqFile = globals->dataMSEQ[1];
697 au_read_rom(fileEntry.offset, mseqFile, fileEntry.data & 0xFFFFFF);
698 manager->mseqFiles[0] = mseqFile;
699
700 mseqFile = AU_FILE_RELATIVE(mseqFile, (fileEntry.data + 0x40) & 0xFFFFFF);
702 au_read_rom(fileEntry.offset, mseqFile, fileEntry.data & 0xFFFFFF);
703 manager->mseqFiles[1] = mseqFile;
704
705 mseqFile = AU_FILE_RELATIVE(mseqFile, (fileEntry.data + 0x40) & 0xFFFFFF);
707 au_read_rom(fileEntry.offset, mseqFile, fileEntry.data & 0xFFFFFF);
708 manager->mseqFiles[2] = mseqFile;
709
710 mseqFile = AU_FILE_RELATIVE(mseqFile, (fileEntry.data + 0x40) & 0xFFFFFF);
712 au_read_rom(fileEntry.offset, mseqFile, fileEntry.data & 0xFFFFFF);
713 manager->mseqFiles[3] = mseqFile;
714
715 manager->numActivePlayers = 4;
717 // @bug perhaps meant to be 3?
718 // the index here corresponds to an entry in gSoundGlobals->banks
719 // 0-2 are used for the extra banks which may be loaded for BGM files
720 // there exists an unused 4th entry this could plausibly be intended for
721 au_load_aux_bank(fileEntry.offset, 2);
722 }
723 }
724 }
725 }
726 }
727 }
728
729 return AU_RESULT_OK;
730}
731
733 switch (priority) {
735 return gBGMPlayerA;
737 return gBGMPlayerB;
739 return (BGMPlayer*)gSoundManager; // TODO: why return pointer to SoundManager?
740 default:
741 return nullptr;
742 }
743}
744
745void au_load_INIT(AuGlobals* globals, s32 romAddr, ALHeap* heap) {
750 s32 songListOffset, mseqListOffset;
751 s32 numEntries;
752 s32* romPtr = &globals->baseRomOffset;
753
755 numEntries = sbnHeader.numEntries;
756 fileListSize = numEntries * sizeof(SBNFileEntry);
757 globals->baseRomOffset = romAddr;
758 globals->fileListLength = sbnHeader.numEntries;
759 globals->sbnFileList = alHeapAlloc(heap, 1, fileListSize);
760 au_read_rom(globals->baseRomOffset + sbnHeader.fileListOffset, globals->sbnFileList, fileListSize);
761
762 entry = globals->sbnFileList;
763 while (sbnHeader.numEntries--) {
764 if ((entry->offset & 0xFFFFFF) == 0) {
765 break;
766 }
767
768 // 16-byte align size
769 size = entry->data;
770 entry->data = (entry->data + 0xF) & ~0xF;
771 entry++;
772 }
773
774 if (sbnHeader.INIToffset != 0) {
775 initBase = *romPtr + sbnHeader.INIToffset;
777
778 songListOffset = initBase + initHeader.songListOffset;
779 size = ALIGN16_(initHeader.songListSize);
780 globals->songList = alHeapAlloc(heap, 1, size);
781 au_read_rom(songListOffset, globals->songList, size);
782
783 mseqListOffset = initBase + initHeader.mseqListOffset;
784 size = ALIGN16_(initHeader.mseqListSize);
785 globals->extraFileList = alHeapAlloc(heap, 1, size);
786 au_read_rom(mseqListOffset, globals->extraFileList, size);
787
788 globals->bkFileListOffset = initBase + initHeader.bankListOffset;
789 globals->bkListLength = ALIGN16_(initHeader.bankListSize);
790
791 globals->songListLength = initHeader.songListSize / sizeof(InitSongEntry) - 1;
792 }
793}
794
797 s32 status = AU_RESULT_OK;
798
799 if (fileIdx < gSoundGlobals->fileListLength) {
801 s32 offset = (entry->offset & 0xFFFFFF) + gSoundGlobals->baseRomOffset;
802
803 fileEntry.offset = offset;
804 fileEntry.data = entry->data;
805 if ((fileEntry.data >> 0x18) == format) {
806 outEntry->offset = offset;
807 outEntry->data = fileEntry.data;
808 } else {
810 }
811 } else {
813 }
814 return status;
815}
816
818 PERHeader header;
819 u32 size;
821 s32 numItems;
822 void* end;
823
824 au_read_rom(romAddr, &header, sizeof(header));
825 size = header.mdata.size - sizeof(header);
826 au_read_rom(romAddr + sizeof(header), globals->dataPER, size);
827 numItems = size / sizeof(PEREntry);
828 numItemsLeft = 6 - numItems;
829 if (numItemsLeft > 0) {
830 end = &globals->dataPER[numItems];
831 au_copy_words(&globals->defaultDrumEntry, end, sizeof(BGMDrumInfo));
832 au_copy_words(end, end + sizeof(BGMDrumInfo), numItemsLeft * sizeof(PEREntry) - sizeof(BGMDrumInfo));
833 }
834}
835
837 PERHeader header;
838 u32 size;
840 s32 numItems;
842 void* end;
843
844 au_read_rom(romAddr, &header, sizeof(header));
845 dataRomAddr = romAddr + sizeof(header);
846 size = header.mdata.size - sizeof(header);
847 if (size > PRG_MAX_COUNT * sizeof(BGMInstrumentInfo)) {
848 size = PRG_MAX_COUNT * sizeof(BGMInstrumentInfo);
849 }
850 au_read_rom(dataRomAddr, globals->dataPRG, size);
851 numItems = size / sizeof(BGMInstrumentInfo);
852 numItemsLeft = PRG_MAX_COUNT - numItems;
853 if (numItemsLeft > 0) {
854 end = &globals->dataPRG[numItems];
855 au_copy_words(&globals->defaultPRGEntry, end, sizeof(BGMInstrumentInfo));
856 au_copy_words(end, end + sizeof(BGMInstrumentInfo), numItemsLeft * sizeof(BGMInstrumentInfo) - sizeof(BGMInstrumentInfo));
857 }
858}
859
861 AuGlobals* globals = gSoundGlobals;
862 InitSongEntry* song = globals->songList;
864 s32 i;
865
866 while (true) {
867 if (song->bgmFileIndex == 0xFFFF) {
868 return ret;
869 }
870
871 if (song->bgmFileIndex == arg0) {
872 for (i = 0; i < ARRAY_COUNT(song->bkFileIndex); i++) {
873 u16 bkFileIndex = song->bkFileIndex[i];
874 if (bkFileIndex != 0) {
875 SBNFileEntry* bkFileEntry = &globals->sbnFileList[bkFileIndex];
877
878 fileEntry.offset = (bkFileEntry->offset & 0xFFFFFF) + globals->baseRomOffset;
879 fileEntry.data = bkFileEntry->data;
880 if ((fileEntry.data >> 0x18) == AU_FMT_BK) {
881 au_load_aux_bank(fileEntry.offset, i);
882 } else {
884 }
885 }
886 }
887
888 return ret;
889 }
890 song++;
891 }
892}
893
895 InstrumentBank* ret = nullptr;
896 AuGlobals* globals = gSoundGlobals;
897
898 // TODO fake match - this multiplying the bankIndex by 16 and then dividing it right after is dumb
899 bankIndex *= 16;
900
901 switch (bankSet) {
902 case BANK_SET_AUX:
903 ret = &globals->auxBankSet[bankIndex / 16];
904 break;
905 case BANK_SET_2:
906 ret = &globals->bankSet2[bankIndex / 16];
907 break;
908 case BANK_SET_4:
909 ret = &globals->bankSet4[bankIndex / 16];
910 break;
911 case BANK_SET_5:
912 ret = &globals->bankSet5[bankIndex / 16];
913 break;
914 case BANK_SET_6:
915 ret = &globals->bankSet6[bankIndex / 16];
916 break;
917 case BANK_SET_MUSIC:
918 ret = &globals->musicBankSet[bankIndex / 16];
919 break;
920 }
921
922 return ret;
923}
924
937
938#define AL_HEADER_SIG_BK 0x424B
939#define AL_HEADER_SIG_CR 0x4352
940#define AL_HEADER_SIG_DR 0x4452
941#define AL_HEADER_SIG_SR 0x5352
942
947 ALHeap* heap = gSynDriverPtr->heap;
949 BKHeader* header = &localHeader;
952 s32 instrumentCount;
955 s32 size;
956 u32 i;
957
958 au_read_rom(bkFileOffset, header, sizeof(*header));
960 keepReading = true;
961
962 while (keepReading) {
963 switch (readState) {
964 case BK_READ_DONE:
965 keepReading = false;
966 break;
968 if (header->signature != AL_HEADER_SIG_BK) {
969 keepReading = false;
970 } else if (header->size == 0) {
971 keepReading = false;
972 } else {
974 }
975 break;
977 if (header->format == AL_HEADER_SIG_CR) {
979 } else if (header->format == AL_HEADER_SIG_DR) {
981 } else if (header->format == AL_HEADER_SIG_SR) {
983 } else {
984 keepReading = false;
985 }
986 break;
987
989 size = ALIGN16_(header->instrumetsLength)
990 + ALIGN16_(header->loopStatesLength)
991 + ALIGN16_(header->predictorsLength)
992 + ALIGN16_(header->envelopesLength)
993 + sizeof(*header);
994 if (bkFile == nullptr) {
995 bkFile = alHeapAlloc(heap, 1, size);
996 }
998
999 group = au_get_BK_instruments(bankSet, bankIndex);
1000 inst = (*group);
1001 instrumentCount = 0;
1002
1003 for (i = 0; i < ARRAY_COUNT(header->instruments); inst++, i++) {
1004 u16 instOffset = header->instruments[i];
1005 if (instOffset != 0) {
1006 instrumentCount++;
1008 } else {
1009 *inst = nullptr;
1010 }
1011 }
1012
1013 if (instrumentCount != 0) {
1015 } else {
1016 keepReading = false;
1017 }
1018 break;
1019 case BK_READ_SWIZZLE_CR:
1022 break;
1023
1024 // inferred states
1025 case BK_READ_PROCESS_DR:
1026 case BK_READ_UNK_DR:
1027 case BK_READ_PROCESS_SR:
1028 case BK_READ_UNK_SR:
1029 default:
1030 keepReading = false;
1031 break;
1032 }
1033 }
1034
1035 return bkFile;
1036}
1037
1041void au_swizzle_BK_instruments(s32 bkFileOffset, BKFileBuffer* file, InstrumentBank instruments, u32 instrumentCount, u8 useDma) {
1042 Instrument* defaultInstrument = gSoundGlobals->defaultInstrument;
1043 BKHeader* header = &file->header;
1044 f32 outputRate = gSoundGlobals->outputRate;
1045 s32 i;
1046
1047 if (!header->swizzled) {
1048 for (i = 0; i < instrumentCount; i++) {
1049 Instrument* instrument = instruments[i];
1050
1051 if (instrument != nullptr) {
1052 if (instrument->wavData != 0) {
1053 instrument->wavData += bkFileOffset;
1054 }
1055 if (instrument->loopState != nullptr) {
1056 instrument->loopState = AU_FILE_RELATIVE(file, instrument->loopState);
1057 }
1058 if (instrument->predictor != nullptr) {
1059 instrument->predictor = AU_FILE_RELATIVE(file, instrument->predictor);
1060 }
1061 if (instrument->envelopes != nullptr) {
1062 instrument->envelopes = AU_FILE_RELATIVE(file, instrument->envelopes);
1063 }
1064 instrument->useDma = useDma;
1065 instrument->pitchRatio = instrument->sampleRate / outputRate;
1066 } else {
1067 instruments[i] = defaultInstrument;
1068 }
1069 }
1070 header->swizzled = true;
1071 }
1072}
1073
1079 ALHeap* heap = gSynDriverPtr->heap;
1082 BKHeader* header = &localHeader;
1084 Instrument** inst;
1085 s32 instrumentCount;
1087 u32 readState;
1088 u32 i;
1089 s32 useDma = false;
1090
1092 keepReading = true;
1093
1094 while (keepReading) {
1095 switch (readState) {
1096 case BK_READ_DONE:
1097 keepReading = false;
1098 break;
1101 if (header->signature != AL_HEADER_SIG_BK) {
1102 keepReading = false;
1103 } else if (header->size == 0) {
1104 keepReading = false;
1105 } else if (header->format != AL_HEADER_SIG_CR) {
1106 keepReading = false;
1107 } else {
1109 }
1110 break;
1111 case BK_READ_FETCH_DATA:
1112 if (bkFile == nullptr) {
1113 bkFile = alHeapAlloc(heap, 1, header->size);
1114 }
1115 au_read_rom(*inAddr, bkFile, header->size);
1116
1117 instrumentCount = 0;
1118 group = au_get_BK_instruments(bankSet, bankIndex);
1119 inst = (*group);
1120 for (i = 0; i < ARRAY_COUNT(header->instruments); inst++, i++) {
1121 u16 instOffset = header->instruments[i];
1122 if (instOffset != 0) {
1123 instrumentCount++;
1125 } else {
1126 *inst = nullptr;
1127 }
1128 }
1129
1130 if (instrumentCount != 0) {
1132 } else {
1133 keepReading = false;
1134 }
1135 break;
1136 case BK_READ_SWIZZLE:
1139 break;
1140 default:
1141 keepReading = false;
1142 break;
1143 }
1144 }
1145 return bkFile;
1146}
1147
1152
1154void au_clear_instrument_group(s32 bankIndex, BankSet bankSet) {
1156 InstrumentBank* group = au_get_BK_instruments(bankSet, bankIndex);
1157 Instrument** ptr = *group;
1158 u32 i;
1159
1160 if (group != nullptr) {
1161 for (i = 0; i < ARRAY_COUNT(*group); i++) {
1162 *ptr++ = instrument;
1163 }
1164 }
1165}
1166
1182
1189
1191 if (bMonoSound % 2 == 1) {
1192 // mono sound
1195 }
1196 } else {
1197 // stereo sound
1201 }
1202 }
1203}
1204
1205// probable split
1206
1207void au_read_rom(s32 romAddr, void* buffer, u32 size) {
1208 s32 nchunks = size / 0x2000;
1209 s32 offset = 0;
1210
1211 if (nchunks != 0) {
1212 while (nchunks--) {
1213 nuPiReadRom(romAddr + offset, buffer + offset, 0x2000);
1214 offset += 0x2000;
1215 }
1216 }
1217
1218 size %= 0x2000;
1219 if (size != 0) {
1220 nuPiReadRom(romAddr + offset, buffer + offset, size);
1221 }
1222}
1223
1224void au_memset(void* dst, s32 size, u8 value) {
1225 s32 count;
1226 s32 intValue;
1227
1228 if (size == 0) {
1229 return;
1230 }
1231
1232 if (size < 1024) {
1233 while (size--) {
1234 *(u8*)dst++ = value;
1235 }
1236 } else {
1237 count = (u32)dst & 0x3;
1238 if (count != 0) {
1239 count = 4 - count;
1240 size -= count;
1241 while (count--) {
1242 *(u8*)dst++ = value;
1243 }
1244 }
1245
1246 count = size >> 2;
1247 intValue = (value << 8) + value;
1248 intValue = (intValue << 16) + intValue;
1249 while (count--) {
1250 *(u32*)dst = intValue;
1251 dst += 4;
1252 }
1253
1254 count = size & 3;
1255 if (count != 0) {
1256 while (count--) {
1257 *(u8*)dst++ = value;
1258 }
1259 }
1260 }
1261}
1262
1263void au_copy_bytes(s8* src, s8* dest, s32 size) {
1264 if (size > 0) {
1265 while (size-- != 0) {
1266 *dest++ = *src++;
1267 }
1268 }
1269}
1270
1271void au_copy_words(void* src, void* dst, s32 size) {
1272 size /= 4;
1273
1274 if (size > 0) {
1275 if (!(((s32) src | (s32) dst) & 3)) {
1276 s32* srcIt = src;
1277 s32* dstIt = dst;
1278
1279 size--;
1280 do {
1281 *dstIt++ = *srcIt++;
1282 } while (size-- != 0);
1283 }
1284 }
1285}
BSS s32 PopupMenu_SelectedIndex
u16 format
Definition audio.h:989
f32 outputRate
Definition audio.h:1027
u8 channelDelayPending
Definition audio.h:1041
InstrumentBank defaultBankSet[1]
Definition audio.h:1063
u16 bkFileIndex[3]
Definition audio.h:964
ADPCM_STATE * loopState
Definition audio.h:677
InstrumentBank bankSet5[16]
Definition audio.h:1068
s16 * predictor
Definition audio.h:681
u8 randVolume
Definition audio.h:894
s32 baseRomOffset
Definition audio.h:1031
SoundManager * soundManager
Definition audio.h:1140
u16 bankPatch
Definition audio.h:888
AuVoice voices[24]
Definition audio.h:1075
s32 songPlayingCounter
video frames (60 fps)
Definition audio.h:1145
@ AU_FX_NONE
Definition audio.h:155
InstrumentBank bankSet2[16]
Definition audio.h:1066
u16 loopStatesLength
Definition audio.h:995
s16 baseTicks
Definition audio.h:508
#define MUS_QUEUE_SIZE
Definition audio.h:107
InitSongEntry * songList
Definition audio.h:1035
Instrument * defaultInstrument
Definition audio.h:1028
b8 useDma
Definition audio.h:689
s32 songName
Definition audio.h:1146
u8 reverb
Definition audio.h:892
EnvelopePreset DummyInstrumentEnvelope
Definition sfx_player.c:312
BKFileBuffer * auxBanks[3]
Definition audio.h:1073
MusicEventTrigger * musicEventQueue
Definition audio.h:1058
u16 signature
Definition audio.h:985
#define ALIGN16_(val)
Definition audio.h:42
s32 loopEnd
Definition audio.h:679
u16 predictorsLength
Definition audio.h:997
struct MSEQHeader * dataMSEQ[2]
Definition audio.h:1048
@ AU_DELAY_CHANNEL_LEFT
Definition audio.h:242
@ AU_DELAY_CHANNEL_RIGHT
Definition audio.h:243
@ AU_DELAY_CHANNEL_NONE
Definition audio.h:241
s32 flushMusicEventQueue
Definition audio.h:1060
EnvelopeOffset offsets[1]
Definition audio.h:670
AuCallback audioThreadCallbacks[2]
Definition audio.h:1062
u16 offsetPress
Definition audio.h:663
@ AUDIO_TYPE_BGM
Definition audio.h:398
@ AUDIO_TYPE_SFX
Definition audio.h:399
s32 nextUpdateCounter
update counter threshold for a single tick
Definition audio.h:1143
u16 keyBase
Definition audio.h:889
#define AUDIO_SAMPLES
Definition audio.h:16
#define AU_FILE_RELATIVE(base, offset)
Definition audio.h:43
s16 DummyInstrumentCodebook[32]
Definition sfx_player.c:69
s32 bkFileListOffset
Definition audio.h:1037
InstrumentBank auxBankSet[4]
Definition audio.h:1065
u8 swizzled
Definition audio.h:990
s32 bkListLength
Definition audio.h:1038
u8 channelDelayBusID
Definition audio.h:1042
BankSetIndex
The bank indices used by audio assets when choosing an intrument.
Definition audio.h:385
@ BANK_SET_IDX_5
Definition audio.h:391
@ BANK_SET_IDX_6
Definition audio.h:392
@ BANK_SET_IDX_7
Definition audio.h:393
@ BANK_SET_IDX_0
Definition audio.h:386
@ BANK_SET_IDX_3
Definition audio.h:389
@ BANK_SET_IDX_1
Definition audio.h:387
@ BANK_SET_IDX_2
Definition audio.h:388
@ BANK_SET_IDX_4
Definition audio.h:390
u32 wavDataLength
Definition audio.h:676
BGMInstrumentInfo * dataPRG
Definition audio.h:1046
#define AU_MAX_VOLUME_8
Definition audio.h:61
BankSet
corresponds with bank group IDs from INIT file bank list (InitBankEntry.bankSet)
Definition audio.h:374
@ BANK_SET_2
Definition audio.h:376
@ BANK_SET_AUX
Definition audio.h:375
@ BANK_SET_MUSIC
Definition audio.h:377
@ BANK_SET_6
Definition audio.h:380
@ BANK_SET_5
Definition audio.h:379
@ BANK_SET_4
Definition audio.h:378
s32 loopCount
Definition audio.h:680
SBNFileEntry * sbnFileList
Definition audio.h:1032
s8 unused_2A
Definition audio.h:694
InstrumentBank bankSet6[4]
Definition audio.h:1069
Fade fadeInfo
Definition audio.h:792
@ AU_VOICE_SYNC_FLAG_PARAMS
Definition audio.h:149
@ AU_VOICE_SYNC_FLAG_PAN_FXMIX
Definition audio.h:151
@ AU_VOICE_SYNC_FLAG_PITCH
Definition audio.h:150
@ AU_VOICE_SYNC_FLAG_ALL
Definition audio.h:148
u8 randPan
Definition audio.h:895
s32 busVolume
Definition audio.h:793
s32 name
Definition audio.h:882
s32 fileListLength
copied from SBN to the audio heap
Definition audio.h:1033
InstrumentBank bankSet4[16]
Definition audio.h:1067
s32 nextUpdateStep
Definition audio.h:1141
s32 loopStart
Definition audio.h:678
s8 unused_2B
Definition audio.h:695
BGMPlayerSnapshot snapshots[1]
Definition audio.h:1049
ALHeap * heap
Definition audio.h:641
@ FX_BUS_BGMA_MAIN
Definition audio.h:234
@ FX_BUS_BGMA_AUX
Definition audio.h:237
@ FX_BUS_SOUND
Definition audio.h:235
@ FX_BUS_BGMB
Definition audio.h:236
s32 PreventBGMPlayerUpdate
While true, the audio thread skips BGM player updates.
s16 envelopeTicks
Definition audio.h:513
s32 tickUpdateInterval
update counter amount to add per audio frame
Definition audio.h:1142
u8 volume
Definition audio.h:890
u16 instrumetsLength
Definition audio.h:993
u8 syncFlags
Definition audio.h:863
AuSynDriver * gSynDriverPtr
Definition syn_driver.c:15
s32 songListLength
copied from INIT to the audio heap
Definition audio.h:1036
s32 busVolume
Definition audio.h:1151
#define PRG_MAX_COUNT
Definition audio.h:119
Fade fadeInfo
Definition audio.h:1150
u8 * wavData
Definition audio.h:675
#define AU_FRAME_USEC
Definition audio.h:27
@ BGM_SNAPSHOT_0
Definition audio.h:192
u8 channelDelaySide
Definition audio.h:1044
#define DEFAULT_KEYBASE
Definition audio.h:59
Instrument * instrument
Definition audio.h:837
struct BGMHeader * dataBGM[2]
Definition audio.h:1047
EnvelopePreset * envelopes
Definition audio.h:696
PEREntry * dataPER
Definition audio.h:1045
BGMInstrumentInfo defaultPRGEntry
Definition audio.h:1030
Instrument * InstrumentBank[16]
Definition audio.h:699
u16 envelopesLength
Definition audio.h:999
s8 unused_27
Definition audio.h:691
s8 unused_26
Definition audio.h:690
s32 offset
Definition audio.h:916
u16 keyBase
Definition audio.h:683
struct BGMPlayer * bgmPlayer
Definition audio.h:1020
u16 codebookSize
Definition audio.h:682
u8 channelDelayState
Definition audio.h:1071
u8 DummyInstrumentWavData[190]
Definition sfx_player.c:76
u16 offsetRelease
Definition audio.h:664
InstrumentBank * bankSets[8]
Definition audio.h:1070
u8 randReverb
Definition audio.h:896
@ AU_PRIORITY_BGM_PLAYER_MAIN
Definition audio.h:134
@ AU_PRIORITY_MSEQ_MANAGER
Definition audio.h:137
@ AU_PRIORITY_FREE
Definition audio.h:133
@ AU_PRIORITY_SFX_MANAGER
Definition audio.h:136
@ AU_PRIORITY_BGM_PLAYER_AUX
Definition audio.h:135
s8 unused_28
Definition audio.h:692
u8 randTune
Definition audio.h:893
AuEffectChange effectChanges[4]
copied from INIT to the audio heap, seems to exist only to find SEF, PER, and PRG
Definition audio.h:1040
AuGlobals * globals
Definition audio.h:1367
s8 unused_29
Definition audio.h:693
#define AU_MAX_BUS_VOLUME
Definition audio.h:40
@ AU_DELAY_STATE_OFF
channel delay is enabled (though not necessarily applied)
Definition audio.h:248
@ AU_DELAY_STATE_ON
Definition audio.h:247
@ AU_DELAY_STATE_REQUEST_OFF
channel delay is disabled
Definition audio.h:249
b32 resumeRequested
Definition audio.h:1053
s32 size
Definition audio.h:987
u16 instruments[16]
Definition audio.h:992
s16 prevUpdateResult
Definition audio.h:1157
u8 type
Definition audio.h:688
SEFHeader * dataSEF
Definition audio.h:1061
AUFileMetadata mdata
Definition audio.h:976
u8 * cmdPtr
Definition audio.h:846
u16 * extraFileList
Definition audio.h:1039
InstrumentBank musicBankSet[16]
Definition audio.h:1064
u8 channelDelayTime
Definition audio.h:1043
BGMDrumInfo defaultDrumEntry
Definition audio.h:1029
Represents a dummy BK file large enough to hold everything except the wave data.
Definition audio.h:1008
Structure for volume fading for SFX and BGM. Has independent controls for base and envelope volumes.
Definition audio.h:504
s32 au_bgm_player_audio_frame_update(BGMPlayer *player)
Definition bgm_player.c:661
void au_bgm_update_bus_volumes(BGMPlayer *player)
Definition bgm_player.c:644
void au_bgm_restore_copied_player(AuGlobals *globals)
Definition bgm_player.c:473
void au_bgm_player_init(BGMPlayer *player, s32 priority, s32 busID, AuGlobals *globals)
Definition bgm_player.c:523
b32 au_bgm_player_is_active(BGMPlayer *player)
Definition bgm_player.c:279
void au_bgm_begin_video_frame(BGMPlayer *player)
Definition bgm_player.c:23
void au_bgm_set_effect_indices(BGMPlayer *player, u8 *list)
Definition bgm_player.c:601
void au_bgm_update_fade(BGMPlayer *player)
Definition bgm_player.c:622
u32 MusicEventTrigger
void(* AuCallback)(void)
void au_pvoice_set_bus(u8 voiceIdx, s8 busID)
Definition syn_driver.c:316
void au_disable_channel_delay(void)
Definition syn_driver.c:726
void au_init_voices(AuGlobals *globals)
Initializes all voices in the audio system.
Definition voice.c:19
void au_syn_set_volume_delta(u8 voiceIdx, s16 arg1, s32 arg2)
Definition syn_driver.c:527
void au_syn_stop_voice(u8 voiceIdx)
Definition syn_driver.c:323
void au_update_voices(AuGlobals *globals)
Main envelope system update, called once per frame.
Definition voice.c:37
void au_syn_set_wavetable(u8 voiceIdx, Instrument *table)
Definition syn_driver.c:420
void au_delay_left_channel(u8 arg0)
Definition syn_driver.c:696
void au_delay_right_channel(u8 arg0)
Definition syn_driver.c:711
void au_syn_start_voice_params(u8 index, u8 reverbType, Instrument *table, f32 pitch, s16 vol, u8 pan, u8 fxMix, s32 delta)
Definition syn_driver.c:357
void au_syn_set_pan_fxmix(u8 voiceIdx, u8 arg1, u8 arg2)
Definition syn_driver.c:497
void au_voice_start(AuVoice *voice, EnvelopeData *envData)
Starts a new voice with the given envelope data.
Definition voice.c:187
void au_bus_set_volume(u8 busID, u16 value)
Definition syn_driver.c:289
void au_bus_set_effect(u8 busID, u8 effectID)
Definition syn_driver.c:301
void au_set_delay_time(s32 arg0)
Definition syn_driver.c:684
void au_syn_set_pitch(u8 voiceIdx, f32 pitchRatio)
Definition syn_driver.c:458
void au_syn_set_mixer_params(u8 voiceIdx, s16 volume, s32 arg2, u8 arg3, u8 arg4)
Definition syn_driver.c:464
void * alHeapAlloc(ALHeap *heap, s32 count, s32 size)
Definition syn_driver.c:765
void au_init_delay_channel(s16 arg0)
Definition syn_driver.c:732
u8 EnvelopeReleaseDefault[]
Definition sfx_player.c:322
u8 EnvelopePressDefault[]
Definition sfx_player.c:317
void au_reset_voice(AuVoice *voice, u8 voiceIdx)
Definition engine.c:397
void au_fade_set_envelope(Fade *fade, s16 value)
Definition engine.c:469
#define AL_HEADER_SIG_BK
Definition engine.c:938
BGMPlayer * gBGMPlayerB
Definition engine.c:7
AuResult au_reload_song_files(s32 songID, BGMHeader *bgmFile)
Definition engine.c:618
void au_copy_bytes(s8 *src, s8 *dest, s32 size)
Definition engine.c:1263
void au_get_bgm_player_and_file(u32 playerIndex, BGMHeader **outFile, BGMPlayer **outPlayer)
Definition engine.c:522
void au_fade_calc_envelope(Fade *fade, u32 duration, s32 target)
Definition engine.c:476
BKFileBuffer * au_load_static_BK_to_bank(s32 *inAddr, void *outAddr, s32 bankIndex, BankSet bankSet)
UNUSED Loads an instrument bank file from ROM to a given buffer (allocates if needed),...
Definition engine.c:1078
#define TUNE_SCALING_ARR_AMPLIFY_COARSE
Definition engine.c:406
#define TUNE_SCALING_ARR_ATTENUATE_COARSE
Definition engine.c:408
void au_load_PRG(AuGlobals *globals, s32 romAddr)
Definition engine.c:836
#define TUNE_SCALING_ARR_ATTENUATE_FINE
Definition engine.c:407
void au_fade_update(Fade *fade)
Definition engine.c:442
s32 au_load_aux_bank(s32 bkFileOffset, s32 bankIndex)
Definition engine.c:1148
SoundManager * gSoundManager
Definition engine.c:9
AuGlobals * gSoundGlobals
Definition engine.c:10
void au_load_INIT(AuGlobals *globals, s32 romAddr, ALHeap *heap)
Definition engine.c:745
void au_engine_init(s32 outputRate)
Definition engine.c:40
void au_clear_instrument_group(s32 bankIndex, BankSet bankSet)
unused. resets all instruments in (bankIndex, bankSet) to default
Definition engine.c:1154
Instrument * au_get_instrument(AuGlobals *globals, BankSetIndex bank, s32 patch, EnvelopeData *envData)
Note that bank is supplied as BankSetIndex and not BankSet, which means it will be used to perform a ...
Definition engine.c:506
#define SBN_EXTRA_LOOKUP(i, fmt, e)
Definition engine.c:663
f32 au_compute_pitch_ratio(s32 tuning)
Converts a linear pitch value (in cents) into a frequency ratio suitable for adjusting playback speed...
Definition engine.c:410
void au_get_bgm_player(u32 playerIndex, BGMPlayer **outPlayer)
Definition engine.c:545
#define SBN_ROM_OFFSET
Definition engine.c:30
void au_fade_set_volume(u8 busID, u16 volume, s32 busVolume)
Definition engine.c:457
u16 PerceptualVolumeLevels[9]
Volume steps use squared values so each level represents linear power increase, matching loudness per...
Definition sfx_player.c:299
void au_fade_flush(Fade *fade)
Definition engine.c:461
void au_read_rom(s32 romAddr, void *buffer, u32 size)
Definition engine.c:1207
void au_update_clients_for_video_frame(void)
this is called once per video frame update (50 or 60 times per second)
Definition engine.c:290
BGMPlayer * au_get_snapshot_by_index(s32 index)
Definition engine.c:656
AuResult au_load_song_files(u32 songID, BGMHeader *bgmFile, BGMPlayer *player)
Definition engine.c:562
f32 AlTuneScaling[]
Definition sfx_player.c:378
AuResult au_fetch_SBN_file(u32 fileIdx, AuFileFormat format, SBNFileEntry *outEntry)
Definition engine.c:795
BGMPlayer * gBGMPlayerA
Definition engine.c:6
void au_memset(void *dst, s32 size, u8 value)
Definition engine.c:1224
AuResult au_ambient_load(u32 ambSoundID)
Definition engine.c:665
s32 au_load_BGM(s32 arg0)
Definition engine.c:860
void au_fade_init(Fade *fade, s32 time, s32 startValue, s32 endValue)
Definition engine.c:421
s32 au_set_reverb_type(s32 soundTypeFlags, s32 reverbType)
Definition engine.c:1183
void au_update_clients_for_audio_frame(void)
Called exactly once per audio frame (every 5.75ms at 32kHz).
Definition engine.c:214
BGMPlayer * au_get_client_by_priority(u8 priority)
Definition engine.c:732
#define TUNE_SCALING_ARR_AMPLIFY_FINE
Definition engine.c:405
BKFileBuffer * au_load_BK_to_bank(s32 bkFileOffset, BKFileBuffer *bkFile, s32 bankIndex, BankSet bankSet)
Loads an instrument bank file from ROM, allocates memory if needed, and sets up instrument pointers.
Definition engine.c:946
BGMPlayer * gBGMPlayerC
Definition engine.c:8
InstrumentBank * au_get_BK_instruments(BankSet bankSet, u32 bankIndex)
Definition engine.c:894
AuCallback BeginSoundUpdateCallback
Definition engine.c:5
void au_load_PER(AuGlobals *globals, s32 romAddr)
Definition engine.c:817
void au_swizzle_BK_instruments(s32 bkFileOffset, BKFileBuffer *file, InstrumentBank instruments, u32 instrumentCount, u8 useDma)
Fixes up (swizzles) instrument pointers in a loaded bank, converting file-relative offsets to valid R...
Definition engine.c:1041
#define AL_HEADER_SIG_DR
Definition engine.c:940
#define AL_HEADER_SIG_CR
Definition engine.c:939
void au_sync_channel_delay_enabled(u32 bMonoSound)
Definition engine.c:1190
BKParseState
Definition engine.c:925
@ BK_READ_SWIZZLE_CR
Definition engine.c:931
@ BK_READ_PROCESS_DR
Definition engine.c:932
@ BK_READ_FETCH_HEADER
Definition engine.c:927
@ BK_READ_UNK_DR
Definition engine.c:933
@ BK_READ_PROCESS_SR
Definition engine.c:934
@ BK_READ_FETCH_DATA
Definition engine.c:928
@ BK_READ_PROCESS_CR
Definition engine.c:930
@ BK_READ_SWIZZLE
Definition engine.c:929
@ BK_READ_DONE
Definition engine.c:926
@ BK_READ_UNK_SR
Definition engine.c:935
#define AL_HEADER_SIG_SR
Definition engine.c:941
void au_release_voice(u8 index)
Definition engine.c:33
void au_syn_begin_audio_frame(AuGlobals *globals)
Definition engine.c:312
void au_set_bus_volume_level(s32 soundTypeFlags, u32 volPreset)
Definition engine.c:1167
void au_copy_words(void *src, void *dst, s32 size)
Definition engine.c:1271
void au_fade_clear(Fade *fade)
Definition engine.c:436
void au_reset_nonfree_voice(AuVoice *voice, u8 index)
Definition engine.c:388
AmbienceManager * gAuAmbienceManager
Definition engine.c:11
void au_fade_update_envelope(Fade *fade)
Definition engine.c:493
@ AMBIENT_RADIO
Definition enums.h:1921
AuFileFormat
Definition enums.h:1778
@ AU_FMT_PRG
Definition enums.h:1783
@ AU_FMT_PER
Definition enums.h:1782
@ AU_FMT_BGM
Definition enums.h:1779
@ AU_FMT_SEF
Definition enums.h:1780
@ AU_FMT_BK
Definition enums.h:1781
@ AU_FMT_MSEQ
Definition enums.h:1784
AuResult
Definition enums.h:1758
@ AU_ERROR_SBN_INDEX_OUT_OF_RANGE
Definition enums.h:1772
@ AU_ERROR_SBN_FORMAT_MISMATCH
Definition enums.h:1773
@ AU_ERROR_151
Definition enums.h:1774
@ AU_RESULT_OK
Definition enums.h:1759
@ AU_ERROR_201
Definition enums.h:1775
void au_load_BK_headers(AuGlobals *globals, ALHeap *heap)
Definition load_banks.c:4
void au_mseq_manager_init(AmbienceManager *manager, s8 priority, s8 busID, AuGlobals *globals)
Definition mseq_player.c:44
void au_mseq_manager_audio_frame_update(AmbienceManager *manager)
s16 au_sfx_manager_audio_frame_update(SoundManager *manager)
void au_sfx_load_groups_from_SEF(SoundManager *sndMgr)
Definition sfx_player.c:551
s32 au_sfx_set_reverb_type(SoundManager *manager, s32 arg1)
Definition sfx_player.c:719
void au_sfx_init(SoundManager *manager, u8 arg1, u8 arg2, AuGlobals *arg3, u8 arg4)
Definition sfx_player.c:466
void au_sfx_begin_video_frame(SoundManager *manager)
Definition sfx_player.c:618
void snd_notify_engine_ready(ALHeap *heap)
void snd_song_clear_music_events(void)
#define ARRAY_COUNT(arr)
Definition macros.h:39