13static void au_bgm_stop_player(
BGMPlayer* player);
 
  101                    if (
bgmData->instruments != 0) {
 
  110                if (player->
unk_58 != 0) {
 
  115                    au_bgm_stop_player(player);
 
 
  145    songName = 
event->songName;
 
  146    variation = 
event->variation;
 
  149        if (player != 
NULL) {
 
  151            duration = 
event->duration;
 
 
  228        if (player != 
NULL) {
 
  230                au_bgm_stop_player(player);
 
 
  247static void au_bgm_stop_player(
BGMPlayer* player) {
 
  262        if (player != 
NULL) {
 
  263            result = (songName == player->
songName);
 
 
  293            if (player != 
NULL) {
 
 
  341    variation = 
update->variation;
 
  350                    if (songName == 
playerA->songName) {
 
  354                                if (
track->bgmReadPos != 0) {
 
  361                        playerA->globals->unk_globals_6C[variation].unk_5 = 
playerA->priority;
 
  362                        playerA->globals->unk_globals_6C[variation].unk_4 = 1;
 
  373                if (songName == 
playerA->songName) {
 
 
  400    variation = 
update->variation;
 
  411                        duration = 
update->duration;
 
  437                        playerB->globals->unkSongName = songName;
 
  438                        playerB->globals->unkFadeTime = duration;
 
  454                if (songName == 
playerB->songName) {
 
 
  503    if (
update->songName != 0) {
 
  505        if (player != 
NULL) {
 
 
  547    player->
busId = busId;
 
  566        temp->subTrackCoarseTune = 0;
 
  567        temp->subTrackFineTune = 0;
 
  568        temp->subTrackPan = 0;
 
  569        temp->subTrackReverb = 0;
 
  572        temp->segTrackVolume = 0x7F;
 
  584        note->adjustedPitch = 0;
 
  585        note->noteLength = 0;
 
  587        note->noteVelocity = 0;
 
  588        note->unk_note_17 = 0;
 
 
  625            player->
fadeInfo.onCompleteCallback();
 
  631            au_bgm_stop_player(player);
 
 
  638    u16 
mult = (
arg0->fadeInfo.curVolume.u16 * 
arg0->fadeInfo.volScale.u16) >> 15;
 
  642        s8 busId = 
arg0->effectIndices[i];
 
 
  701        track->subTrackVolume = 0x7FFF0000;
 
  702        track->subTrackPan = 0x40;
 
  703        track->subTrackReverb = 0;
 
  705        track->subTrackCoarseTune = 0;
 
  706        track->subTrackFineTune = 0;
 
  707        track->segTrackVolume = 0x7F;
 
  709        track->unkVolume = 0x7FFF0000;
 
  712        track->detourLength = 0;
 
  713        track->segTrackTune = 0;
 
  714        track->trackTremoloTime = 0;
 
  715        track->trackTremoloAmount = 0;
 
  716        track->trackTremoloSpeed = 0;
 
  717        track->subTrackVolumeStep = 0;
 
  718        track->subTrackVolumeTarget = 0;
 
  719        track->subTrackVolumeTime = 0;
 
  720        track->unkVolumeStep = 0;
 
  721        track->unkVolumeTarget = 0;
 
  722        track->unkVolumeTime = 0;
 
  728        track->polyphonicIdx = 0;
 
  731        track->parentTrackIdx = 0;
 
  740        note->pitchRatio = 2.0f;
 
  742        note->noteVelocity = 0;
 
  743        note->noteLength = 0;
 
  744        note->tremoloTime = 0;
 
 
  812    for (i = 0; i < 9; i++) {
 
 
  825    } 
else if (
A < 80000) {
 
 
  903        } 
else if (
depth < 4) {
 
 
  940                track->parentTrackIdx = 0;
 
  949                        track->delayTime = 1;
 
  961                    track->unk_51 = count;
 
  967                    track->delayTime = 1;
 
 
  996#define POST_BGM_READ() \ 
  997if (track->detourLength != 0) {\ 
  998    track->detourLength--;\ 
  999    if (track->detourLength == 0) {\ 
 1000        track->bgmReadPos = track->savedPos;\ 
 
 1062                if (
track->bgmReadPos != 0) {
 
 1079                if (
track->bgmReadPos != 0) {
 
 1092                track->changed.volume = 1;
 
 1094                track->changed.volume = 0;
 
 1096            if (
track->subTrackVolumeTime != 0) {
 
 1097                track->subTrackVolumeTime--;
 
 1098                if (
track->subTrackVolumeTime == 0) {
 
 1099                    track->subTrackVolume = 
track->subTrackVolumeTarget;
 
 1101                    track->subTrackVolume += 
track->subTrackVolumeStep;
 
 1103                track->changed.volume = 1;
 
 1105            if (
track->unkVolumeTime != 0) {
 
 1106                track->unkVolumeTime--;
 
 1107                if (
track->unkVolumeTime == 0) {
 
 1108                    track->unkVolume = 
track->unkVolumeTarget << 0x10;
 
 1112                track->changed.volume = 1;
 
 1115            if (
track->delayTime <= 0) {
 
 1117                while (
track->delayTime == 0) {
 
 1123                            if (
track->prevReadPos != 0) {
 
 1125                                track->prevReadPos = 0;
 
 1145                            noteVelocity = *(
track->bgmReadPos++);
 
 1147                            noteLength = *(
track->bgmReadPos++);
 
 1149                            if (!(noteLength < 0xC0)) {
 
 1150                                noteLength = (((
u8)noteLength & ~0xC0) << 8) + *(
track->bgmReadPos++) + 0xC0;
 
 1154                            if (
track->unk_5A == 0) {
 
 1166                                    if (
track->polyphonicIdx >= 5) { 
 
 1182                                                    if (
note->noteLength == 0) {
 
 1210                                                note->noteLength = 0;
 
 1230                                if (noteVelocity > 0) {
 
 1231                                    note->noteVelocity = noteVelocity + 1;
 
 1233                                    note->noteVelocity = 0;
 
 1235                                note->noteLength = noteLength;
 
 1236                                if (
track->isDrumTrack) {
 
 1248                                    voice->clientVolume = ((
 
 1250                                        * (
track->segTrackVolume * 
note->volume)) >> 0x10;
 
 1251                                    note->adjustedPitch =
 
 1253                                        + 
track->subTrackCoarseTune
 
 1254                                        + 
track->subTrackFineTune
 
 1255                                        - 
note->ins->keyBase;
 
 1275                                        * (
track->segTrackVolume * 
note->noteVelocity)) >> 9;
 
 1278                                    note->adjustedPitch =
 
 1280                                        + 
track->subTrackCoarseTune
 
 1282                                        + 
track->subTrackFineTune
 
 1283                                        - 
note->ins->keyBase;
 
 1286                                        + 
track->segTrackTune
 
 1288                                        * 
track->instrument->pitchRatio;
 
 1290                                    if (
track->unk_57 != 0) {
 
 1291                                        voice->pan = au_bgm_get_random_pan(player, 
track->subTrackPan, 
track->unk_57);
 
 1297                                    if (
track->unk_4C != 0) {
 
 1300                                        voice->envelope.cmdListPress = 
track->envelope.cmdListPress;
 
 1302                                    voice->envelope.cmdListRelease = 
track->envelope.cmdListRelease;
 
 1307                                if (
note->noteLength >= 2) {
 
 1308                                    note->unk_note_17 = 1;
 
 1309                                    note->tremoloTime = 
track->trackTremoloTime;
 
 1311                                    note->tremoloAmount = 
track->trackTremoloAmount;
 
 1351                if (
track->unk_5A == 0) {
 
 1355                        if (
note->unk_note_17 == 0) {
 
 1356                            if (
note->noteLength > 0) {
 
 1358                                if (
note->noteLength == 0) {
 
 1362                            if (
track->isDrumTrack) {
 
 1363                                if (
track->changed.tune || (player->
detune != 0)) {
 
 1365                                    if (
voice->pitchRatio != 
note->pitchRatio) {
 
 1370                                if (
track->changed.volume) {
 
 1371                                    voice->clientVolume = (
 
 1373                                        * (
track->subTrackVolume >> 0x15))
 
 1374                                        * (
track->unkVolume >> 0x15)) >> 0x14)
 
 1375                                        * (
track->segTrackVolume * 
note->volume)) >> 0x10;
 
 1379                                if (
note->tremoloTime != 0) {
 
 1380                                    if (
note->tremoloAmount != 0) {
 
 1381                                        note->tremoloAmount--;
 
 1385                                        note->unk_13 += 
track->trackTremoloSpeed;
 
 1403                                        if (
voice->pitchRatio != 
note->pitchRatio) {
 
 1408                                } 
else if (
track->changed.tune || (player->
detune != 0)) {
 
 1411                                    if (
voice->pitchRatio != 
note->pitchRatio) {
 
 1416                                if (
track->changed.volume) {
 
 1423                                } 
else if (
track->changed.pan || 
track->changed.reverb) {
 
 1430                        note->unk_note_17 = 0;
 
 
 1442static const f32 padding[] = {0.0f}; 
 
 1449    tempo = snd_bpm_to_tempo(player, 
bpm);
 
 
 1463    if (maxTempo < 
ret) {
 
 1465    } 
else if (
ret == 0) {
 
 1476        volume = volume << 0x18;
 
 
 1500    if ((index < 4) && (busId < 0x80)) {
 
 
 1527        volume = volume << 0x18;
 
 
 1545    u32 volume = 
arg0->seqCmdArgs.SubTrackVolume.value & 0x7F;
 
 1548        volume = volume << 0x18;
 
 1551    track->subTrackVolume = volume;
 
 
 1560        volume = volume << 0x18;
 
 1563    if (volume != 
track->subTrackVolume) {
 
 1568        track->subTrackVolumeTime = time;
 
 1569        track->subTrackVolumeTarget = volume;
 
 1570        track->subTrackVolumeStep = (volume - 
track->subTrackVolume) / time;
 
 
 1618    track->trackTremoloTime = 0;
 
 
 1650    volume = instrument->
volume & 0x7F;
 
 1651    track->patch = patch;
 
 1656    track->subTrackVolume = volume;
 
 1657    track->subTrackPan = instrument->
pan & 0x7F;
 
 1658    track->subTrackReverb = instrument->
reverb & 0x7F;
 
 1661    track->changed.all |= 0x10101;
 
 
 1668    if ((index < 4) && (busId >= 0)) {
 
 1669        track->subtrackBusId = busId;
 
 
 1685    track->bgmReadPos = readPos;
 
 
 1701    track->isDrumTrack = args[2];
 
 1703    if (
track->unk_4D != 0) {
 
 1705        track->unkVolume = 0;
 
 1706        for (i = 
track->unk_52; i < 
track->unk_53; i++) {
 
 1713    if (
track->unk_4E != 0) {
 
 1717    track->subTrackCoarseTune = 0;
 
 1718    track->subTrackFineTune = 0;
 
 1720    track->segTrackTune = 0;
 
 1721    track->trackTremoloTime = 0;
 
 1722    track->subTrackVolumeTime = 0;
 
 
 1800                if (
track->unk_4E != 0) {
 
 
 1838    s32 
lo = (
seed >> 8) & 0x3F; 
 
 1839    s32 
hi = (
seed << 4) & 0xC0; 
 
 1851    } 
else if (
retPan >= 0x80) {
 
 1866    s32 
lo = (
seed >> 6) & 0xF;  
 
 1867    s32 
hi = (
seed << 2) & 0xF0; 
 
 1885    s32 
lo = (
seed >> 8) & 0x1F; 
 
 1898    s32 
lo = (
seed >> 7) & 7;    
 
 1899    s32 
hi = (
seed << 3) & 0xF8; 
 
 1908    s32 changed = 
FALSE;
 
 1912    if (songName != 0) {
 
 
 1935    } 
else if (rate < 0.25) {
 
 
 1948    if (detune > 1200) {
 
 1950    } 
else if (detune < -2400) {
 
 
 1960    if (
track->bgmReadPos != 0) {
 
 
 1976    if (duration <= 0) {
 
 1978    } 
else if (duration > 1000) {
 
 1982        track->unkVolumeTime = 0;
 
 1985    track->unkVolumeTime = duration;
 
 
 2010    s32 songName = 
update->songName;
 
 2011    s32 variation = 
update->variation;
 
 2014    if (songName != 0) {
 
 2016        if (player != 
NULL) {
 
 2020                    if (
track->parentTrackIdx != 0) {
 
 2022                        if (variation != 0) {
 
 2023                            if (
track->unk_5A != 0) {
 
 2041                            if (
track->unk_5A == 0) {
 
 
void au_BGMCmd_EB_SubTrackReverb(BGMPlayer *player, BGMPlayerTrack *track)
void func_8004E880(BGMPlayer *player, s32 sampleRate, s32 divisor)
void au_BGMCmd_F6_TrackVolumeFade(BGMPlayer *player, BGMPlayerTrack *track)
void au_bgm_player_update_stop(BGMPlayer *player)
void au_BGMCmd_F4(BGMPlayer *player, BGMPlayerTrack *track)
void au_bgm_set_proximity_mix(s32 songName, u32 mix)
AuResult au_bgm_dispatch_player_event(SongUpdateEvent *event)
void au_BGMCmd_FD_EventTrigger(BGMPlayer *player, BGMPlayerTrack *track)
void au_BGMCmd_F7_SubTrackReverbType(BGMPlayer *player, BGMPlayerTrack *track)
void func_80050900(BGMPlayer *player)
void au_BGMCmd_FC_Jump(BGMPlayer *player, BGMPlayerTrack *track)
void au_BGMCmd_EE_SubTrackFineTune(BGMPlayer *player, BGMPlayerTrack *track)
BGMPlayer * au_bgm_get_player_with_song_name(s32 songString)
AuResult au_bgm_is_song_playing(s32 songName)
void au_BGMCmd_FE_Detour(BGMPlayer *player, BGMPlayerTrack *track)
AuResult func_8004DC80(s32 songName)
void(* SefCmdHandlers[])(SoundManager *, SoundPlayer *)
void au_BGMCmd_E3(BGMPlayer *player, BGMPlayerTrack *track)
void au_BGMCmd_EA_SubTrackPan(BGMPlayer *player, BGMPlayerTrack *track)
void au_BGMCmd_F2_TrackTremoloTime(BGMPlayer *player, BGMPlayerTrack *track)
u8 EnvelopeReleaseDefaultFast[]
void au_bgm_load_subsegment(BGMPlayer *player, u32 cmd)
void func_8004DFD4(AuGlobals *globals)
void au_bgm_update_main(BGMPlayer *player)
void au_BGMCmd_E5_MasterVolumeFade(BGMPlayer *player, BGMPlayerTrack *track)
void func_8004E844(BGMPlayer *player, s32 arg1)
void au_bgm_change_track_volume(BGMPlayer *player, s32 trackIdx, s16 time, u8 volume)
void func_8004E444(BGMPlayer *arg0)
AuResult func_8004DCB8(SongUpdateEvent *update, s32 clearChanged)
AuResult func_8004E0F4(SongUpdateEvent *update)
void au_bgm_player_read_segment(BGMPlayer *player)
void au_bgm_player_update_playing(BGMPlayer *player)
void au_bgm_set_track_volumes(BGMPlayer *player, u8 *trackVols, s32 mode)
void au_BGMCmd_F1_TrackTremoloSpeed(BGMPlayer *player, BGMPlayerTrack *track)
void au_BGMCmd_E0_MasterTempo(BGMPlayer *player, BGMPlayerTrack *track)
BSS void(* CurrentSeqCmdHandler)(BGMPlayer *, BGMPlayerTrack *)
void au_bgm_set_effect_indices(BGMPlayer *player, u8 *list)
AuResult au_bgm_stop_song(s32 songName)
void au_bgm_update_fade(BGMPlayer *player)
void au_BGMCmd_E8_TrackOverridePatch(BGMPlayer *player, BGMPlayerTrack *track)
void au_bgm_player_initialize(BGMPlayer *player)
void au_BGMCmd_F0_TrackTremolo(BGMPlayer *player, BGMPlayerTrack *track)
void au_BGMCmd_EC_SegTrackVolume(BGMPlayer *player, BGMPlayerTrack *track)
void au_BGMCmd_E9_SubTrackVolume(BGMPlayer *arg0, BGMPlayerTrack *track)
void au_BGMCmd_NOP(BGMPlayer *player, BGMPlayerTrack *track)
AuResult func_8004DB4C(SongUpdateEvent *s)
AuResult func_8004DE2C(SongUpdateEvent *update)
void au_bgm_stop_all(void)
void au_BGMCmd_E2_MasterPitchShift(BGMPlayer *player, BGMPlayerTrack *track)
void au_BGMCmd_F5_TrackVoice(BGMPlayer *player, BGMPlayerTrack *track)
void au_bgm_end_segment_loop(BGMPlayer *player, u32 cmd)
void au_BGMCmd_E6_MasterEffect(BGMPlayer *player, BGMPlayerTrack *track)
AuResult func_80050970(SongUpdateEvent *update)
void au_BGMCmd_FF(BGMPlayer *player, BGMPlayerTrack *track)
s32 func_8004DB28(BGMPlayer *player)
void au_bgm_set_playback_rate(BGMPlayer *player, f32 rate)
s32 au_bgm_player_update_main(BGMPlayer *player)
void(* SeqCmdHandlers[])(BGMPlayer *, BGMPlayerTrack *)
void au_BGMCmd_ED_SubTrackCoarseTune(BGMPlayer *player, BGMPlayerTrack *track)
void func_80050888(BGMPlayer *player, BGMPlayerTrack *track, s32 target, s32 duration)
void au_bgm_player_set_detune(BGMPlayer *player, s32 detune)
void au_bgm_player_init(BGMPlayer *player, s32 priority, s32 busId, AuGlobals *globals)
void au_BGMCmd_E1_MasterVolume(BGMPlayer *player, BGMPlayerTrack *track)
void au_BGMCmd_F3_TrackTremoloStop(BGMPlayer *player, BGMPlayerTrack *track)
void au_BGMCmd_E4_MasterTempoFade(BGMPlayer *player, BGMPlayerTrack *track)
void au_BGMCmd_EF_SegTrackTune(BGMPlayer *player, BGMPlayerTrack *track)
void au_reset_voice(AuVoice *voice, u8 voiceIdx)
Instrument * au_get_instrument(AuGlobals *globals, u32 bank, u32 patch, EnvelopeData *envData)
void func_80053B04(Fade *fade, u32 arg1, s32 target)
AuResult func_80053E58(s32 songID, BGMHeader *bgmFile)
void au_fade_set_volume(u8 busId, u16 volume, s32 busVolume)
f32 au_compute_pitch_ratio(s32 pitch)
BGMPlayer * func_80053F64(s32 arg0)
BGMPlayer * func_80054248(u8 arg0)
void au_fade_init(Fade *fade, s32 time, s32 startValue, s32 endValue)
void au_copy_words(void *src, void *dst, s32 size)
void au_fade_clear(Fade *fade)
void au_fade_set_vol_scale(Fade *fade, s16 value)
void func_80055110(BGMPlayer *player)
void bgm_trigger_music_event(s32 playerID, s32 trackIndex, s32 eventInfo)
BSS s32 PopupMenu_SelectedIndex
struct SeqArgs::@80 SubTrackReverbType
BGMInstrumentInfo * instrumentsInfo
struct BGMHeader * bgmFile
struct SeqArgs::@64 MasterVolumeFade
SoundManager * soundManager
struct SeqArgs::@82 EventTrigger
struct SeqArgs::@61 MasterPitchShift
struct SeqArgs::@66 TrackOverridePatch
struct SeqArgs::@74 TrackTremolo
#define BGM_DEFAULT_TEMPO
struct SeqArgs::@68 SubTrackPan
struct SeqArgs::@75 TrackTremoloSpeed
struct SeqArgs::@71 SubTrackCoarseTune
struct SeqArgs::@70 SegTrackVolume
SoundManager90 bgmSounds[4]
struct SeqArgs::@73 SegTrackTune
struct SeqArgs::@59 MasterTempo
#define AU_FILE_RELATIVE(base, offset)
SegData * subSegmentStartPos
BGMInstrumentInfo * dataPRG
struct BGMPlayer * unk_74
struct SeqArgs::@69 SubTrackReverb
@ AU_VOICE_SYNC_FLAG_PAN_FXMIX
@ AU_VOICE_SYNC_FLAG_PITCH
@ BGM_PLAY_STATE_NEXT_SUBSEG
struct SeqArgs::@79 TrackVolumeFade
#define BGM_SEGMENT_LABEL
struct SeqArgs::@83 Detour
struct SeqArgs::@84 UnkCmdFF
struct BGMHeader * dataBGM[2]
BGMInstrumentInfo defaultPRGEntry
struct BGMPlayer * unk_78
struct SeqArgs::@77 UnkCmdF4
struct SeqArgs::@65 MasterEffect
struct SeqArgs::@62 UnkCmdE3
SegData * segActiveLoopEndPos[4]
BGMPlayerTrack tracks[16]
struct SeqArgs::@76 TrackTremoloTime
SegData * segmentStartPos
AuEffectChange effectChanges[4]
struct SeqArgs::@60 MasterVolume
@ AU_VOICE_ENV_FLAG_KEY_RELEASED
@ AU_VOICE_ENV_FLAG_VOL_CHANGED
SegData * segLoopStartLabels[32]
struct SeqArgs::@78 SetTrackVoice
struct SeqArgs::@63 MasterTempoFade
struct SeqArgs::@72 SubTrackFineTune
@ AU_ERROR_NULL_SONG_NAME
@ AU_ERROR_SONG_NOT_PLAYING
@ AU_ERROR_INVALID_SONG_DURATION