Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
engine.c File Reference

Go to the source code of this file.

Macros

#define SBN_ROM_OFFSET   0xF00000
 
#define TUNE_SCALING_ARR_AMPLIFY_FINE   0
 
#define TUNE_SCALING_ARR_AMPLIFY_COARSE   128
 
#define TUNE_SCALING_ARR_ATTENUATE_FINE   160
 
#define TUNE_SCALING_ARR_ATTENUATE_COARSE   288
 
#define SBN_EXTRA_LOOKUP(i, fmt, e)   (au_fetch_SBN_file(globals->extraFileList[AmbientSoundIDtoMSEQFileIndex[i]], fmt, &e))
 
#define AL_HEADER_SIG_BK   0x424B
 
#define AL_HEADER_SIG_CR   0x4352
 
#define AL_HEADER_SIG_DR   0x4452
 
#define AL_HEADER_SIG_SR   0x5352
 

Enumerations

enum  BKParseState {
  BK_READ_DONE = 0 , BK_READ_FETCH_HEADER = 11 , BK_READ_FETCH_DATA = 21 , BK_READ_SWIZZLE = 31 ,
  BK_READ_PROCESS_CR = 101 , BK_READ_SWIZZLE_CR = 111 , BK_READ_PROCESS_DR = 201 , BK_READ_UNK_DR = 211 ,
  BK_READ_PROCESS_SR = 301 , BK_READ_UNK_SR = 311
}
 

Functions

void au_release_voice (u8 index)
 
void au_engine_init (s32 outputRate)
 
void au_update_clients_for_audio_frame (void)
 Called exactly once per audio frame (every 5.75ms at 32kHz).
 
void au_update_clients_for_video_frame (void)
 this is called once per video frame update (50 or 60 times per second)
 
void au_syn_begin_audio_frame (AuGlobals *globals)
 
void au_reset_nonfree_voice (AuVoice *voice, u8 index)
 
void au_reset_voice (AuVoice *voice, u8 voiceIdx)
 
f32 au_compute_pitch_ratio (s32 tuning)
 Converts a linear pitch value (in cents) into a frequency ratio suitable for adjusting playback speed.
 
void au_fade_init (Fade *fade, s32 time, s32 startValue, s32 endValue)
 
void au_fade_clear (Fade *fade)
 
void au_fade_update (Fade *fade)
 
void au_fade_set_volume (u8 busID, u16 volume, s32 busVolume)
 
void au_fade_flush (Fade *fade)
 
void au_fade_set_envelope (Fade *fade, s16 value)
 
void au_fade_calc_envelope (Fade *fade, u32 duration, s32 target)
 
void au_fade_update_envelope (Fade *fade)
 
Instrumentau_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 raw access into AuGlobals::bankSets.
 
void au_get_bgm_player_and_file (u32 playerIndex, BGMHeader **outFile, BGMPlayer **outPlayer)
 
void au_get_bgm_player (u32 playerIndex, BGMPlayer **outPlayer)
 
AuResult au_load_song_files (u32 songID, BGMHeader *bgmFile, BGMPlayer *player)
 
AuResult au_reload_song_files (s32 songID, BGMHeader *bgmFile)
 
BGMPlayerau_get_snapshot_by_index (s32 index)
 
AuResult au_ambient_load (u32 ambSoundID)
 
BGMPlayerau_get_client_by_priority (u8 priority)
 
void au_load_INIT (AuGlobals *globals, s32 romAddr, ALHeap *heap)
 
AuResult au_fetch_SBN_file (u32 fileIdx, AuFileFormat format, SBNFileEntry *outEntry)
 
void au_load_PER (AuGlobals *globals, s32 romAddr)
 
void au_load_PRG (AuGlobals *globals, s32 romAddr)
 
s32 au_load_BGM (s32 arg0)
 
InstrumentBankau_get_BK_instruments (BankSet bankSet, u32 bankIndex)
 
BKFileBufferau_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.
 
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 RAM pointers.
 
BKFileBufferau_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), and sets up instrument pointers.
 
s32 au_load_aux_bank (s32 bkFileOffset, s32 bankIndex)
 
void au_clear_instrument_group (s32 bankIndex, BankSet bankSet)
 unused. resets all instruments in (bankIndex, bankSet) to default
 
void au_set_bus_volume_level (s32 soundTypeFlags, u32 volPreset)
 
s32 au_set_reverb_type (s32 soundTypeFlags, s32 reverbType)
 
void au_sync_channel_delay_enabled (u32 bMonoSound)
 
void au_read_rom (s32 romAddr, void *buffer, u32 size)
 
void au_memset (void *dst, s32 size, u8 value)
 
void au_copy_bytes (s8 *src, s8 *dest, s32 size)
 
void au_copy_words (void *src, void *dst, s32 size)
 

Variables

AuCallback BeginSoundUpdateCallback
 
BGMPlayergBGMPlayerA
 
BGMPlayergBGMPlayerB
 
BGMPlayergBGMPlayerC
 
SoundManagergSoundManager
 
AuGlobalsgSoundGlobals
 
AmbienceManagergAuAmbienceManager
 
u16 PerceptualVolumeLevels [9]
 Volume steps use squared values so each level represents linear power increase, matching loudness perception.
 
u8 EnvelopePressDefault []
 
u8 EnvelopeReleaseDefault []
 
f32 AlTuneScaling []
 

Macro Definition Documentation

◆ SBN_ROM_OFFSET

#define SBN_ROM_OFFSET   0xF00000

Definition at line 30 of file engine.c.

Referenced by au_engine_init().

◆ TUNE_SCALING_ARR_AMPLIFY_FINE

#define TUNE_SCALING_ARR_AMPLIFY_FINE   0

Definition at line 405 of file engine.c.

Referenced by au_compute_pitch_ratio().

◆ TUNE_SCALING_ARR_AMPLIFY_COARSE

#define TUNE_SCALING_ARR_AMPLIFY_COARSE   128

Definition at line 406 of file engine.c.

Referenced by au_compute_pitch_ratio().

◆ TUNE_SCALING_ARR_ATTENUATE_FINE

#define TUNE_SCALING_ARR_ATTENUATE_FINE   160

Definition at line 407 of file engine.c.

Referenced by au_compute_pitch_ratio().

◆ TUNE_SCALING_ARR_ATTENUATE_COARSE

#define TUNE_SCALING_ARR_ATTENUATE_COARSE   288

Definition at line 408 of file engine.c.

Referenced by au_compute_pitch_ratio().

◆ SBN_EXTRA_LOOKUP

#define SBN_EXTRA_LOOKUP ( i,
fmt,
e )   (au_fetch_SBN_file(globals->extraFileList[AmbientSoundIDtoMSEQFileIndex[i]], fmt, &e))

Definition at line 663 of file engine.c.

Referenced by au_ambient_load().

◆ AL_HEADER_SIG_BK

#define AL_HEADER_SIG_BK   0x424B

Definition at line 938 of file engine.c.

Referenced by au_load_BK_to_bank(), and au_load_static_BK_to_bank().

◆ AL_HEADER_SIG_CR

#define AL_HEADER_SIG_CR   0x4352

Definition at line 939 of file engine.c.

Referenced by au_load_BK_to_bank(), and au_load_static_BK_to_bank().

◆ AL_HEADER_SIG_DR

#define AL_HEADER_SIG_DR   0x4452

Definition at line 940 of file engine.c.

Referenced by au_load_BK_to_bank().

◆ AL_HEADER_SIG_SR

#define AL_HEADER_SIG_SR   0x5352

Definition at line 941 of file engine.c.

Referenced by au_load_BK_to_bank().

Enumeration Type Documentation

◆ BKParseState

Enumerator
BK_READ_DONE 
BK_READ_FETCH_HEADER 
BK_READ_FETCH_DATA 
BK_READ_SWIZZLE 
BK_READ_PROCESS_CR 
BK_READ_SWIZZLE_CR 
BK_READ_PROCESS_DR 
BK_READ_UNK_DR 
BK_READ_PROCESS_SR 
BK_READ_UNK_SR 

Definition at line 925 of file engine.c.

925 {
926 BK_READ_DONE = 0,
929 BK_READ_SWIZZLE = 31,
930 BK_READ_PROCESS_CR = 101,
931 BK_READ_SWIZZLE_CR = 111,
932 BK_READ_PROCESS_DR = 201,
933 BK_READ_UNK_DR = 211,
934 BK_READ_PROCESS_SR = 301,
935 BK_READ_UNK_SR = 311,
936};
@ 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

Function Documentation

◆ au_release_voice()

void au_release_voice ( u8 index)

Definition at line 33 of file engine.c.

33 {
35
36 voice->cmdPtr = nullptr;
37 voice->priority = AU_PRIORITY_FREE;
38}
BSS s32 PopupMenu_SelectedIndex
AuVoice voices[24]
Definition audio.h:1075
@ AU_PRIORITY_FREE
Definition audio.h:133
u8 * cmdPtr
Definition audio.h:846
AuGlobals * gSoundGlobals
Definition engine.c:10

Referenced by au_pull_voice().

◆ au_engine_init()

void au_engine_init ( s32 outputRate)

Definition at line 40 of file engine.c.

40 {
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}
f32 outputRate
Definition audio.h:1027
u8 channelDelayPending
Definition audio.h:1041
InstrumentBank defaultBankSet[1]
Definition audio.h:1063
InstrumentBank bankSet5[16]
Definition audio.h:1068
SoundManager * soundManager
Definition audio.h:1140
@ AU_FX_NONE
Definition audio.h:155
InstrumentBank bankSet2[16]
Definition audio.h:1066
#define MUS_QUEUE_SIZE
Definition audio.h:107
Instrument * defaultInstrument
Definition audio.h:1028
BKFileBuffer * auxBanks[3]
Definition audio.h:1073
MusicEventTrigger * musicEventQueue
Definition audio.h:1058
struct MSEQHeader * dataMSEQ[2]
Definition audio.h:1048
@ AU_DELAY_CHANNEL_NONE
Definition audio.h:241
AuCallback audioThreadCallbacks[2]
Definition audio.h:1062
InstrumentBank auxBankSet[4]
Definition audio.h:1065
u8 channelDelayBusID
Definition audio.h:1042
@ 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
BGMInstrumentInfo * dataPRG
Definition audio.h:1046
InstrumentBank bankSet6[4]
Definition audio.h:1069
InstrumentBank bankSet4[16]
Definition audio.h:1067
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
AuSynDriver * gSynDriverPtr
Definition syn_driver.c:15
#define PRG_MAX_COUNT
Definition audio.h:119
u8 channelDelaySide
Definition audio.h:1044
Instrument * instrument
Definition audio.h:837
struct BGMHeader * dataBGM[2]
Definition audio.h:1047
PEREntry * dataPER
Definition audio.h:1045
BGMInstrumentInfo defaultPRGEntry
Definition audio.h:1030
struct BGMPlayer * bgmPlayer
Definition audio.h:1020
InstrumentBank * bankSets[8]
Definition audio.h:1070
@ AU_PRIORITY_BGM_PLAYER_MAIN
Definition audio.h:134
@ AU_PRIORITY_MSEQ_MANAGER
Definition audio.h:137
@ AU_PRIORITY_SFX_MANAGER
Definition audio.h:136
@ AU_PRIORITY_BGM_PLAYER_AUX
Definition audio.h:135
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
SEFHeader * dataSEF
Definition audio.h:1061
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
void au_bgm_player_init(BGMPlayer *player, s32 priority, s32 busID, AuGlobals *globals)
Definition bgm_player.c:523
void au_bgm_set_effect_indices(BGMPlayer *player, u8 *list)
Definition bgm_player.c:601
u32 MusicEventTrigger
void au_pvoice_set_bus(u8 voiceIdx, s8 busID)
Definition syn_driver.c:316
void au_init_voices(AuGlobals *globals)
Initializes all voices in the audio system.
Definition voice.c:19
void au_syn_set_wavetable(u8 voiceIdx, Instrument *table)
Definition syn_driver.c:420
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
BGMPlayer * gBGMPlayerB
Definition engine.c:7
void au_load_PRG(AuGlobals *globals, s32 romAddr)
Definition engine.c:836
SoundManager * gSoundManager
Definition engine.c:9
void au_load_INIT(AuGlobals *globals, s32 romAddr, ALHeap *heap)
Definition engine.c:745
#define SBN_ROM_OFFSET
Definition engine.c:30
void au_read_rom(s32 romAddr, void *buffer, u32 size)
Definition engine.c:1207
AuResult au_fetch_SBN_file(u32 fileIdx, AuFileFormat format, SBNFileEntry *outEntry)
Definition engine.c:795
BGMPlayer * gBGMPlayerA
Definition engine.c:6
BGMPlayer * gBGMPlayerC
Definition engine.c:8
void au_load_PER(AuGlobals *globals, s32 romAddr)
Definition engine.c:817
AmbienceManager * gAuAmbienceManager
Definition engine.c:11
@ AU_FMT_PRG
Definition enums.h:1783
@ AU_FMT_PER
Definition enums.h:1782
@ AU_FMT_SEF
Definition enums.h:1780
@ AU_RESULT_OK
Definition enums.h:1759
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_sfx_load_groups_from_SEF(SoundManager *sndMgr)
Definition sfx_player.c:551
void au_sfx_init(SoundManager *manager, u8 arg1, u8 arg2, AuGlobals *arg3, u8 arg4)
Definition sfx_player.c:466
void snd_notify_engine_ready(ALHeap *heap)
void snd_song_clear_music_events(void)
#define ARRAY_COUNT(arr)
Definition macros.h:39

Referenced by create_audio_system().

◆ au_update_clients_for_audio_frame()

void au_update_clients_for_audio_frame ( void )

Called exactly once per audio frame (every 5.75ms at 32kHz).

this is called per audio frame generated by alAudioFrame (every 184 audio samples) there will be multiuple of these per video frame

Updates MSEQ, SFX, and BGM players for the current audio frame.

Definition at line 214 of file engine.c.

214 {
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}
s32 songPlayingCounter
video frames (60 fps)
Definition audio.h:1145
s16 baseTicks
Definition audio.h:508
s32 songName
Definition audio.h:1146
s32 nextUpdateCounter
update counter threshold for a single tick
Definition audio.h:1143
s32 nextUpdateStep
Definition audio.h:1141
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
Fade fadeInfo
Definition audio.h:1150
b32 resumeRequested
Definition audio.h:1053
s16 prevUpdateResult
Definition audio.h:1157
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_update_fade(BGMPlayer *player)
Definition bgm_player.c:622
void au_update_voices(AuGlobals *globals)
Main envelope system update, called once per frame.
Definition voice.c:37
void au_fade_update(Fade *fade)
Definition engine.c:442
void au_fade_set_volume(u8 busID, u16 volume, s32 busVolume)
Definition engine.c:457
void au_syn_begin_audio_frame(AuGlobals *globals)
Definition engine.c:312
void au_fade_update_envelope(Fade *fade)
Definition engine.c:493
void au_mseq_manager_audio_frame_update(AmbienceManager *manager)
s16 au_sfx_manager_audio_frame_update(SoundManager *manager)

Referenced by alAudioFrame().

◆ au_update_clients_for_video_frame()

void au_update_clients_for_video_frame ( void )

this is called once per video frame update (50 or 60 times per second)

Definition at line 290 of file engine.c.

290 {
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}
s32 flushMusicEventQueue
Definition audio.h:1060
void au_bgm_begin_video_frame(BGMPlayer *player)
Definition bgm_player.c:23
AuCallback BeginSoundUpdateCallback
Definition engine.c:5
void au_sfx_begin_video_frame(SoundManager *manager)
Definition sfx_player.c:618

Referenced by alAudioFrame().

◆ au_syn_begin_audio_frame()

void au_syn_begin_audio_frame ( AuGlobals * globals)

Definition at line 312 of file engine.c.

312 {
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}
@ AU_DELAY_CHANNEL_LEFT
Definition audio.h:242
@ AU_DELAY_CHANNEL_RIGHT
Definition audio.h:243
@ 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 syncFlags
Definition audio.h:863
u8 channelDelayState
Definition audio.h:1071
@ 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
void au_disable_channel_delay(void)
Definition syn_driver.c:726
void au_syn_stop_voice(u8 voiceIdx)
Definition syn_driver.c:323
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_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

Referenced by au_update_clients_for_audio_frame().

◆ au_reset_nonfree_voice()

void au_reset_nonfree_voice ( AuVoice * voice,
u8 index )

Definition at line 388 of file engine.c.

388 {
389 if (voice->priority != AU_PRIORITY_FREE) {
390 voice->cmdPtr = nullptr;
391 voice->donePending = true;
392 voice->syncFlags = 0;
394 }
395}
#define AUDIO_SAMPLES
Definition audio.h:16
void au_syn_set_volume_delta(u8 voiceIdx, s16 arg1, s32 arg2)
Definition syn_driver.c:527

◆ au_reset_voice()

void au_reset_voice ( AuVoice * voice,
u8 voiceIdx )

Definition at line 397 of file engine.c.

397 {
398 voice->cmdPtr = nullptr;
399 voice->donePending = true;
400 voice->syncFlags = 0;
402}

Referenced by au_bgm_player_update_playing(), au_bgm_reset_all_voices(), au_BGMCmd_FC_Branch(), au_mseq_player_stop(), au_mseq_player_update(), and au_mseq_restore_voices().

◆ au_compute_pitch_ratio()

f32 au_compute_pitch_ratio ( s32 tuning)

Converts a linear pitch value (in cents) into a frequency ratio suitable for adjusting playback speed.

This function computes the playback rate corresponding to a pitch shift (up or down) in cents. Positive values increase pitch (higher frequency), and negative values decrease it. Recall 100 cents = 1 semitone, and therefore 1200 cents = 1 octave.

Parameters
tuningThe pitch offset in cents, from +4095 (~ 40.95 semitones up) to -16383 (~ 163.83 semitones down)
Returns
Floating point output rate multiplier. Multiply this with the base sample rate to apply the pitch.

Definition at line 410 of file engine.c.

410 {
411 if (tuning >= 0) {
414 } else {
415 tuning = -tuning;
418 }
419}
#define TUNE_SCALING_ARR_AMPLIFY_COARSE
Definition engine.c:406
#define TUNE_SCALING_ARR_ATTENUATE_COARSE
Definition engine.c:408
#define TUNE_SCALING_ARR_ATTENUATE_FINE
Definition engine.c:407
f32 AlTuneScaling[]
Definition sfx_player.c:378
#define TUNE_SCALING_ARR_AMPLIFY_FINE
Definition engine.c:405

Referenced by au_bgm_player_update_playing(), au_mseq_player_update(), and au_mseq_restore_voices().

◆ au_fade_init()

void au_fade_init ( Fade * fade,
s32 time,
s32 startValue,
s32 endValue )

Definition at line 421 of file engine.c.

421 {
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}
#define AU_FRAME_USEC
Definition audio.h:27

Referenced by au_bgm_process_init_song(), au_bgm_restore_copied_player(), and au_sfx_init().

◆ au_fade_clear()

void au_fade_clear ( Fade * fade)

Definition at line 436 of file engine.c.

436 {
437 fade->baseTicks = 0;
438 fade->baseStep = 0;
439 fade->onCompleteCallback = nullptr;
440}

◆ au_fade_update()

void au_fade_update ( Fade * fade)

Definition at line 442 of file engine.c.

442 {
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}

Referenced by au_update_clients_for_audio_frame().

◆ au_fade_set_volume()

void au_fade_set_volume ( u8 busID,
u16 volume,
s32 busVolume )

Definition at line 457 of file engine.c.

457 {
458 au_bus_set_volume(busID, (u32)(volume * busVolume) / AU_MAX_BUS_VOLUME);
459}
#define AU_MAX_BUS_VOLUME
Definition audio.h:40
void au_bus_set_volume(u8 busID, u16 value)
Definition syn_driver.c:289

Referenced by au_bgm_update_bus_volumes(), au_sfx_init(), and au_update_clients_for_audio_frame().

◆ au_fade_flush()

void au_fade_flush ( Fade * fade)

Definition at line 461 of file engine.c.

461 {
462 if (fade->baseTicks == 0) {
463 fade->baseTicks = 1;
464 fade->baseStep = 0;
465 fade->baseTarget = ((u32)fade->baseVolume >> 16);
466 }
467}

Referenced by au_set_bus_volume_level().

◆ au_fade_set_envelope()

void au_fade_set_envelope ( Fade * fade,
s16 value )

Definition at line 469 of file engine.c.

469 {
470 fade->envelopeVolume = value << 16;
471 fade->envelopeTarget = value;
472 fade->envelopeTicks = 0;
473 fade->envelopeStep = 0;
474}

Referenced by au_bgm_player_init().

◆ au_fade_calc_envelope()

void au_fade_calc_envelope ( Fade * fade,
u32 duration,
s32 target )

Definition at line 476 of file engine.c.

476 {
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}

Referenced by au_bgm_adjust_volume().

◆ au_fade_update_envelope()

void au_fade_update_envelope ( Fade * fade)

Definition at line 493 of file engine.c.

493 {
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}

Referenced by au_update_clients_for_audio_frame().

◆ au_get_instrument()

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 raw access into AuGlobals::bankSets.

This does not affect values above 3, but 1 and 2 differ.

Definition at line 506 of file engine.c.

506 {
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}
EnvelopeOffset offsets[1]
Definition audio.h:670
u16 offsetPress
Definition audio.h:663
#define AU_FILE_RELATIVE(base, offset)
Definition audio.h:43
EnvelopePreset * envelopes
Definition audio.h:696
u16 offsetRelease
Definition audio.h:664
u8 EnvelopePressDefault[]
Definition sfx_player.c:317

Referenced by au_bgm_player_update_playing(), au_BGMCmd_E8_TrackOverridePatch(), au_BGMCmd_F5_UseInstrument(), and au_mseq_player_update().

◆ au_get_bgm_player_and_file()

void au_get_bgm_player_and_file ( u32 playerIndex,
BGMHeader ** outFile,
BGMPlayer ** outPlayer )

Definition at line 522 of file engine.c.

522 {
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}

Referenced by snd_song_load().

◆ au_get_bgm_player()

void au_get_bgm_player ( u32 playerIndex,
BGMPlayer ** outPlayer )

Definition at line 545 of file engine.c.

545 {
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}

◆ au_load_song_files()

AuResult au_load_song_files ( u32 songID,
BGMHeader * bgmFile,
BGMPlayer * player )

Definition at line 562 of file engine.c.

562 {
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}
s32 baseRomOffset
Definition audio.h:1031
InitSongEntry * songList
Definition audio.h:1035
SBNFileEntry * sbnFileList
Definition audio.h:1032
s32 name
Definition audio.h:882
s32 songListLength
copied from INIT to the audio heap
Definition audio.h:1036
b32 au_bgm_player_is_active(BGMPlayer *player)
Definition bgm_player.c:279
s32 au_load_aux_bank(s32 bkFileOffset, s32 bankIndex)
Definition engine.c:1148
@ AU_FMT_BGM
Definition enums.h:1779
@ AU_FMT_BK
Definition enums.h:1781
AuResult
Definition enums.h:1758
@ AU_ERROR_151
Definition enums.h:1774
@ AU_ERROR_201
Definition enums.h:1775

Referenced by snd_song_load().

◆ au_reload_song_files()

AuResult au_reload_song_files ( s32 songID,
BGMHeader * bgmFile )

Definition at line 618 of file engine.c.

618 {
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}
s32 offset
Definition audio.h:916
@ AU_ERROR_SBN_FORMAT_MISMATCH
Definition enums.h:1773

Referenced by au_bgm_process_resume().

◆ au_get_snapshot_by_index()

BGMPlayer * au_get_snapshot_by_index ( s32 index)

Definition at line 656 of file engine.c.

656 {
657 if (index == BGM_SNAPSHOT_0) {
659 }
660 return nullptr;
661}
@ BGM_SNAPSHOT_0
Definition audio.h:192

Referenced by au_bgm_process_resume(), and au_bgm_process_suspend().

◆ au_ambient_load()

AuResult au_ambient_load ( u32 ambSoundID)

Definition at line 665 of file engine.c.

665 {
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}
#define SBN_EXTRA_LOOKUP(i, fmt, e)
Definition engine.c:663
@ AMBIENT_RADIO
Definition enums.h:1921
@ AU_FMT_MSEQ
Definition enums.h:1784

Referenced by snd_load_ambient().

◆ au_get_client_by_priority()

BGMPlayer * au_get_client_by_priority ( u8 priority)

Definition at line 732 of file engine.c.

732 {
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}

Referenced by au_bgm_process_resume().

◆ au_load_INIT()

void au_load_INIT ( AuGlobals * globals,
s32 romAddr,
ALHeap * heap )

Definition at line 745 of file engine.c.

745 {
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}
#define ALIGN16_(val)
Definition audio.h:42
s32 bkFileListOffset
Definition audio.h:1037
s32 bkListLength
Definition audio.h:1038
s32 fileListLength
copied from SBN to the audio heap
Definition audio.h:1033

Referenced by au_engine_init().

◆ au_fetch_SBN_file()

AuResult au_fetch_SBN_file ( u32 fileIdx,
AuFileFormat format,
SBNFileEntry * outEntry )

Definition at line 795 of file engine.c.

795 {
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}
@ AU_ERROR_SBN_INDEX_OUT_OF_RANGE
Definition enums.h:1772

Referenced by au_engine_init(), au_load_BK_headers(), au_load_song_files(), and au_reload_song_files().

◆ au_load_PER()

void au_load_PER ( AuGlobals * globals,
s32 romAddr )

Definition at line 817 of file engine.c.

817 {
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}
AUFileMetadata mdata
Definition audio.h:976
void au_copy_words(void *src, void *dst, s32 size)
Definition engine.c:1271

Referenced by au_engine_init().

◆ au_load_PRG()

void au_load_PRG ( AuGlobals * globals,
s32 romAddr )

Definition at line 836 of file engine.c.

836 {
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}

Referenced by au_engine_init().

◆ au_load_BGM()

s32 au_load_BGM ( s32 arg0)

Definition at line 860 of file engine.c.

860 {
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}
u16 bkFileIndex[3]
Definition audio.h:964

◆ au_get_BK_instruments()

InstrumentBank * au_get_BK_instruments ( BankSet bankSet,
u32 bankIndex )

Definition at line 894 of file engine.c.

894 {
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}
@ 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
Instrument * InstrumentBank[16]
Definition audio.h:699

Referenced by au_clear_instrument_group(), au_load_BK_to_bank(), and au_load_static_BK_to_bank().

◆ au_load_BK_to_bank()

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.

Instruments in the bank will be configured to use DMA streaming for sample/codebook data. This is the standard loader for streamed instrument banks.

Definition at line 946 of file engine.c.

946 {
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}
u16 format
Definition audio.h:989
u16 loopStatesLength
Definition audio.h:995
u16 signature
Definition audio.h:985
u16 predictorsLength
Definition audio.h:997
u16 instrumetsLength
Definition audio.h:993
u16 envelopesLength
Definition audio.h:999
s32 size
Definition audio.h:987
u16 instruments[16]
Definition audio.h:992
#define AL_HEADER_SIG_BK
Definition engine.c:938
InstrumentBank * au_get_BK_instruments(BankSet bankSet, u32 bankIndex)
Definition engine.c:894
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
#define AL_HEADER_SIG_SR
Definition engine.c:941

Referenced by au_load_aux_bank(), and au_load_BK_headers().

◆ au_swizzle_BK_instruments()

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 RAM pointers.

Sets whether each instrument uses DMA streaming or not, and updates pitch ratios to match output rate. Replaces nullptr instruments with a default instrument to ensure all loaded patches point to valid data.

Definition at line 1041 of file engine.c.

1041 {
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}
ADPCM_STATE * loopState
Definition audio.h:677
s16 * predictor
Definition audio.h:681
b8 useDma
Definition audio.h:689
u8 swizzled
Definition audio.h:990
u8 * wavData
Definition audio.h:675

Referenced by au_load_BK_to_bank(), and au_load_static_BK_to_bank().

◆ au_load_static_BK_to_bank()

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), and sets up instrument pointers.

Instruments are configured to always bypass DMA: sample and codebook data is assumed to be already present in RAM. Use this only for banks whose sample data is guaranteed to be preloaded, not for standard streaming.

Definition at line 1078 of file engine.c.

1078 {
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}

◆ au_load_aux_bank()

s32 au_load_aux_bank ( s32 bkFileOffset,
s32 bankIndex )

Definition at line 1148 of file engine.c.

1148 {
1150 return AU_RESULT_OK;
1151}
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

Referenced by au_ambient_load(), au_load_BGM(), au_load_song_files(), and au_reload_song_files().

◆ au_clear_instrument_group()

void au_clear_instrument_group ( s32 bankIndex,
BankSet bankSet )

unused. resets all instruments in (bankIndex, bankSet) to default

Definition at line 1154 of file engine.c.

1154 {
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}

◆ au_set_bus_volume_level()

void au_set_bus_volume_level ( s32 soundTypeFlags,
u32 volPreset )

Definition at line 1167 of file engine.c.

1167 {
1175 }
1179 }
1180 }
1181}
@ AUDIO_TYPE_BGM
Definition audio.h:398
@ AUDIO_TYPE_SFX
Definition audio.h:399
Fade fadeInfo
Definition audio.h:792
s32 busVolume
Definition audio.h:793
s32 busVolume
Definition audio.h:1151
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

Referenced by snd_set_bgm_volume(), and snd_set_sfx_volume().

◆ au_set_reverb_type()

s32 au_set_reverb_type ( s32 soundTypeFlags,
s32 reverbType )

Definition at line 1183 of file engine.c.

1183 {
1186 }
1187 return 0;
1188}
s32 au_sfx_set_reverb_type(SoundManager *manager, s32 arg1)
Definition sfx_player.c:719

Referenced by snd_set_sfx_reverb_type().

◆ au_sync_channel_delay_enabled()

void au_sync_channel_delay_enabled ( u32 bMonoSound)

Definition at line 1190 of file engine.c.

1190 {
1191 if (bMonoSound % 2 == 1) {
1192 // mono sound
1195 }
1196 } else {
1197 // stereo sound
1201 }
1202 }
1203}

Referenced by snd_set_mono(), and snd_set_stereo().

◆ au_read_rom()

void au_read_rom ( s32 romAddr,
void * buffer,
u32 size )

Definition at line 1207 of file engine.c.

1207 {
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}

Referenced by au_ambient_load(), au_engine_init(), au_load_BK_headers(), au_load_BK_to_bank(), au_load_INIT(), au_load_PER(), au_load_PRG(), au_load_song_files(), au_load_static_BK_to_bank(), and au_reload_song_files().

◆ au_memset()

void au_memset ( void * dst,
s32 size,
u8 value )

Definition at line 1224 of file engine.c.

1224 {
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}

Referenced by au_mseq_manager_init(), and au_mseq_play_sequence().

◆ au_copy_bytes()

void au_copy_bytes ( s8 * src,
s8 * dest,
s32 size )

Definition at line 1263 of file engine.c.

1263 {
1264 if (size > 0) {
1265 while (size-- != 0) {
1266 *dest++ = *src++;
1267 }
1268 }
1269}

◆ au_copy_words()

void au_copy_words ( void * src,
void * dst,
s32 size )

Definition at line 1271 of file engine.c.

1271 {
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}

Referenced by au_bgm_process_suspend(), au_bgm_restore_copied_player(), au_load_PER(), and au_load_PRG().

Variable Documentation

◆ BeginSoundUpdateCallback

AuCallback BeginSoundUpdateCallback

Definition at line 5 of file engine.c.

Referenced by au_update_clients_for_video_frame().

◆ gBGMPlayerA

◆ gBGMPlayerB

◆ gBGMPlayerC

BGMPlayer* gBGMPlayerC

Definition at line 8 of file engine.c.

Referenced by au_engine_init().

◆ gSoundManager

◆ gSoundGlobals

◆ gAuAmbienceManager

◆ PerceptualVolumeLevels

u16 PerceptualVolumeLevels[9]
extern

Volume steps use squared values so each level represents linear power increase, matching loudness perception.

This makes each step sound evenly spaced.

Definition at line 299 of file sfx_player.c.

299 {
300 [VOL_LEVEL_MUTE] 0, // 0.0 %
301 [VOL_LEVEL_1] AU_MAX_BUS_VOLUME * SQ(0.125), // 1.5625 %
302 [VOL_LEVEL_2] AU_MAX_BUS_VOLUME * SQ(0.250), // 6.25 %
303 [VOL_LEVEL_3] AU_MAX_BUS_VOLUME * SQ(0.375), // 14.0625 %
304 [VOL_LEVEL_4] AU_MAX_BUS_VOLUME * SQ(0.500), // 25.0 %
305 [VOL_LEVEL_5] AU_MAX_BUS_VOLUME * SQ(0.625), // 39.0625 %
306 [VOL_LEVEL_6] AU_MAX_BUS_VOLUME * SQ(0.750), // 56.25 %
307 [VOL_LEVEL_7] AU_MAX_BUS_VOLUME * SQ(0.875), // 76.5625 %
309};
@ VOL_LEVEL_FULL
Definition enums.h:1822
@ VOL_LEVEL_5
Definition enums.h:1819
@ VOL_LEVEL_2
Definition enums.h:1816
@ VOL_LEVEL_4
Definition enums.h:1818
@ VOL_LEVEL_MUTE
Definition enums.h:1814
@ VOL_LEVEL_6
Definition enums.h:1820
@ VOL_LEVEL_3
Definition enums.h:1817
@ VOL_LEVEL_7
Definition enums.h:1821
@ VOL_LEVEL_1
Definition enums.h:1815
#define SQ(x)
Definition macros.h:177

Referenced by au_set_bus_volume_level().

◆ EnvelopePressDefault

u8 EnvelopePressDefault[]
extern

Definition at line 317 of file sfx_player.c.

317 {
318 ENV_TIME_280MS, 127,
319 ENV_CMD_END, 0
320};
@ ENV_CMD_END
Definition audio.h:257
@ ENV_TIME_280MS
Definition audio.h:322

Referenced by au_get_instrument().

◆ EnvelopeReleaseDefault

u8 EnvelopeReleaseDefault[]
extern

Definition at line 322 of file sfx_player.c.

322 {
324 ENV_CMD_END, 0
325};
@ ENV_TIME_550MS
Definition audio.h:313

◆ AlTuneScaling

f32 AlTuneScaling[]
extern

Definition at line 378 of file sfx_player.c.

378 {
379 // ---------------------------------------------------------
380 // TUNE_SCALING_ARR_AMPLIFY_FINE (offset 0, size 128)
381 // ---------------------------------------------------------
382 // Pitch scaling for fine positive tuning.
383 // Each increment represents a pitch increase of 1 cent (1/100 semitone).
384 //
385 // Formula: 2^((i / 100) / 12) = 2^(i / 1200)
386 // i.e., 1 semitone of amplification at i = 100 (2^(1/12) ~ 1.059463)
387 1.00000000f, 1.00057781f, 1.00115597f, 1.00173450f, 1.00231326f, 1.00289237f, 1.00347185f, 1.00405169f,
388 1.00463188f, 1.00521231f, 1.00579309f, 1.00637424f, 1.00695574f, 1.00753760f, 1.00811982f, 1.00870228f,
389 1.00928509f, 1.00986826f, 1.01045179f, 1.01103568f, 1.01161981f, 1.01220429f, 1.01278913f, 1.01337433f,
390 1.01395988f, 1.01454580f, 1.01513207f, 1.01571858f, 1.01630545f, 1.01689267f, 1.01748025f, 1.01806819f,
391 1.01865649f, 1.01924503f, 1.01983392f, 1.02042317f, 1.02101278f, 1.02160275f, 1.02219307f, 1.02278376f,
392 1.02337468f, 1.02396595f, 1.02455759f, 1.02514958f, 1.02574193f, 1.02633464f, 1.02692771f, 1.02752113f,
393 1.02811480f, 1.02870882f, 1.02930319f, 1.02989793f, 1.03049302f, 1.03108847f, 1.03168428f, 1.03228045f,
394 1.03287685f, 1.03347361f, 1.03407073f, 1.03466821f, 1.03526604f, 1.03586423f, 1.03646278f, 1.03706169f,
395 1.03766096f, 1.03826058f, 1.03886044f, 1.03946066f, 1.04006124f, 1.04066217f, 1.04126346f, 1.04186511f,
396 1.04246712f, 1.04306948f, 1.04367220f, 1.04427528f, 1.04487872f, 1.04548252f, 1.04608655f, 1.04669094f,
397 1.04729569f, 1.04790080f, 1.04850626f, 1.04911208f, 1.04971826f, 1.05032480f, 1.05093169f, 1.05153894f,
398 1.05214655f, 1.05275452f, 1.05336285f, 1.05397153f, 1.05458057f, 1.05518997f, 1.05579972f, 1.05640972f,
399 1.05702007f, 1.05763078f, 1.05824184f, 1.05885327f, 1.05946505f, 1.06007719f, 1.06068969f, 1.06130254f,
400 1.06191576f, 1.06252933f, 1.06314325f, 1.06375754f, 1.06437218f, 1.06498718f, 1.06560254f, 1.06621826f,
401 1.06683433f, 1.06745076f, 1.06806755f, 1.06868470f, 1.06930220f, 1.06992006f, 1.07053828f, 1.07115686f,
402 1.07177579f, 1.07239509f, 1.07301474f, 1.07363474f, 1.07425511f, 1.07487583f, 1.07549691f, 1.07611835f,
403 // ---------------------------------------------------------
404 // TUNE_SCALING_ARR_AMPLIFY_COARSE (offset 128, size 32)
405 // ---------------------------------------------------------
406 // Pitch scaling for coarse positive tuning.
407 // Each increment represents a pitch increase of 128 cents (1.28 semitones)
408 //
409 // Formula: 2^((128 * i / 100) / 12)
410 1.00000000f, 1.07674015f, 1.15936935f, 1.24833953f, 1.34413731f, 1.44728661f, 1.55835164f, 1.67793977f,
411 1.80670512f, 1.94535196f, 2.09463859f, 2.25538135f, 2.42845964f, 2.61482000f, 2.81548166f, 3.03154206f,
412 3.26418304f, 3.51467681f, 3.78439355f, 4.07480860f, 4.38750982f, 4.72420788f, 5.08674431f, 5.47710180f,
413 5.89741516f, 6.34998369f, 6.83728218f, 7.36197615f, 7.92693520f, 8.53524971f, 9.19024563f, 9.89550686f,
414 // ---------------------------------------------------------
415 // TUNE_SCALING_ARR_ATTENUATE_FINE (offset 160, size 128)
416 // ---------------------------------------------------------
417 // Pitch scaling for fine downward tuning.
418 // Each increment represents a pitch decrease of 1 cent (1/100 semitone).
419 //
420 // Formula: 2^(-(i / 100) / 12)
421 1.00000000f, 0.99942255f, 0.99884546f, 0.99826866f, 0.99769223f, 0.99711609f, 0.99654031f, 0.99596488f,
422 0.99538976f, 0.99481499f, 0.99424052f, 0.99366641f, 0.99309260f, 0.99251914f, 0.99194598f, 0.99137318f,
423 0.99080074f, 0.99022859f, 0.98965681f, 0.98908532f, 0.98851418f, 0.98794335f, 0.98737288f, 0.98680270f,
424 0.98623288f, 0.98566335f, 0.98509419f, 0.98452532f, 0.98395681f, 0.98338860f, 0.98282075f, 0.98225319f,
425 0.98168600f, 0.98111910f, 0.98055255f, 0.97998631f, 0.97942042f, 0.97885484f, 0.97828960f, 0.97772467f,
426 0.97716010f, 0.97659582f, 0.97603190f, 0.97546828f, 0.97490501f, 0.97434205f, 0.97377944f, 0.97321713f,
427 0.97265512f, 0.97209346f, 0.97153211f, 0.97097111f, 0.97041041f, 0.96985006f, 0.96929002f, 0.96873033f,
428 0.96817094f, 0.96761185f, 0.96705312f, 0.96649468f, 0.96593660f, 0.96537882f, 0.96482134f, 0.96426421f,
429 0.96370739f, 0.96315092f, 0.96259475f, 0.96203887f, 0.96148336f, 0.96092814f, 0.96037328f, 0.95981872f,
430 0.95926446f, 0.95871055f, 0.95815694f, 0.95760363f, 0.95705068f, 0.95649803f, 0.95594567f, 0.95539367f,
431 0.95484197f, 0.95429057f, 0.95373952f, 0.95318878f, 0.95263839f, 0.95208830f, 0.95153850f, 0.95098901f,
432 0.95043987f, 0.94989103f, 0.94934249f, 0.94879431f, 0.94824642f, 0.94769883f, 0.94715160f, 0.94660467f,
433 0.94605803f, 0.94551176f, 0.94496578f, 0.94442010f, 0.94387472f, 0.94332969f, 0.94278497f, 0.94224054f,
434 0.94169647f, 0.94115269f, 0.94060922f, 0.94006604f, 0.93952322f, 0.93898070f, 0.93843848f, 0.93789655f,
435 0.93735498f, 0.93681371f, 0.93627274f, 0.93573207f, 0.93519175f, 0.93465173f, 0.93411201f, 0.93357259f,
436 0.93303353f, 0.93249476f, 0.93195629f, 0.93141812f, 0.93088025f, 0.93034273f, 0.92980552f, 0.92926860f,
437 // ---------------------------------------------------------
438 // TUNE_SCALING_ARR_ATTENUATE_COARSE (offset 288, size 128)
439 // ---------------------------------------------------------
440 // Pitch scaling for coarse downward tuning.
441 // Each increment represents a pitch decrease of 128 cents (1.28 semitones)
442 //
443 // Formula: 2^(-(128 * i / 100) / 12)
444 1.00000000f, 0.92873198f, 0.86254311f, 0.80107135f, 0.74398059f, 0.69095856f, 0.64171529f, 0.59598154f,
445 0.55350709f, 0.51405972f, 0.47742370f, 0.44339865f, 0.41179851f, 0.38245043f, 0.35519394f, 0.32987997f,
446 0.30637008f, 0.28453568f, 0.26425737f, 0.24542427f, 0.22793336f, 0.21168900f, 0.19660234f, 0.18259089f,
447 0.16957800f, 0.15749252f, 0.14626834f, 0.13584408f, 0.12616274f, 0.11717137f, 0.10882080f, 0.10106535f,
448 0.09386262f, 0.08717322f, 0.08096056f, 0.07519066f, 0.06983197f, 0.06485518f, 0.06023308f, 0.05594039f,
449 0.05195362f, 0.04825099f, 0.04481224f, 0.04161856f, 0.03865249f, 0.03589780f, 0.03333944f, 0.03096340f,
450 0.02875670f, 0.02670727f, 0.02480390f, 0.02303617f, 0.02139443f, 0.01986969f, 0.01845361f, 0.01713846f,
451 0.01591704f, 0.01478266f, 0.01372913f, 0.01275068f, 0.01184197f, 0.01099801f, 0.01021421f, 0.00948626f,
452 0.00881019f, 0.00818231f, 0.00759917f, 0.00705759f, 0.00655461f, 0.00608748f, 0.00565364f, 0.00525071f,
453 0.00487650f, 0.00452897f, 0.00420620f, 0.00390643f, 0.00362802f, 0.00336946f, 0.00312933f, 0.00290631f,
454 0.00269918f, 0.00250681f, 0.00232816f, 0.00216224f, 0.00200814f, 0.00186502f, 0.00173211f, 0.00160866f,
455 0.00149402f, 0.00138754f, 0.00128865f, 0.00119681f, 0.00111152f, 0.00103230f, 0.00095873f, 0.00089041f,
456 0.00082695f, 0.00076801f, 0.00071328f, 0.00066244f, 0.00061523f, 0.00057139f, 0.00053067f, 0.00049285f,
457 0.00045772f, 0.00042510f, 0.00039480f, 0.00036667f, 0.00034054f, 0.00031627f, 0.00029373f, 0.00027279f,
458 0.00025335f, 0.00023530f, 0.00021853f, 0.00020295f, 0.00018849f, 0.00017506f, 0.00016258f, 0.00015099f,
459 0.00014023f, 0.00013024f, 0.00012096f, 0.00011234f, 0.00010433f, 0.00009689f, 0.00008999f, 0.00008358f
460};

Referenced by au_compute_pitch_ratio().