14static void au_bgm_stop_player(
BGMPlayer* player);
21static u8 au_bgm_get_random_reverb(
s32 arg0,
u8 arg1,
u8 arg2);
82 if (compOffset == 0) {
83 compOffset =
bgmData->compositions[0];
103 if (
bgmData->instruments != 0) {
112 if (player->
unk_58 != 0) {
117 au_bgm_stop_player(player);
148 variation =
request->variation;
152 if (player !=
NULL) {
233 if (player !=
NULL) {
235 au_bgm_stop_player(player);
252static void au_bgm_stop_player(
BGMPlayer* player) {
267 if (player !=
NULL) {
268 result = (songName == player->
songName);
298 if (player !=
NULL) {
352 if (player !=
NULL) {
372 au_bgm_stop_player(player);
414 if (player !=
NULL) {
459 if (player !=
NULL) {
511 if (player !=
NULL) {
553 player->
busID = busID;
571 track->delayTime = 0;
572 track->insCoarseDetune = 0;
573 track->insFineDetune = 0;
575 track->insReverb = 0;
579 track->pressOverride = 0;
592 note->randDetune = 0;
638 au_bgm_stop_player(player);
712 track->insPan = 0x40;
713 track->insReverb = 0;
715 track->insCoarseDetune = 0;
716 track->insFineDetune = 0;
718 track->pressOverride = 0;
722 track->detourLength = 0;
724 track->tremoloDepth = 0;
725 track->tremoloDelay = 0;
726 track->tremoloRate = 0;
727 track->insVolumeStep = 0;
728 track->insVolumeTarget = 0;
729 track->insVolumeTicks = 0;
730 track->proxVolumeStep = 0;
731 track->proxVolumeTarget = 0;
732 track->proxVolumeTicks = 0;
737 track->polyVoiceCount = 0;
738 track->polyphonicIdx = 0;
739 track->randomPanAmount = 0;
741 track->linkedTrackID = 0;
750 note->pitchRatio = 2.0f;
751 note->randDetune = 0;
754 note->tremoloDepth = 0;
822 for (i = 0; i < 9; i++) {
925 }
else if (depth < 4) {
962 track->linkedTrackID = 0;
971 track->delayTime = 1;
983 track->polyVoiceCount = count;
984 track->firstVoice = curVoice;
986 track->lastVoice = curVoice;
989 track->delayTime = 1;
1018#define POST_BGM_READ() \
1019if (track->detourLength != 0) {\
1020 track->detourLength--;\
1021 if (track->detourLength == 0) {\
1022 track->bgmReadPos = track->savedPos;\
1085 if (
track->bgmReadPos != 0) {
1102 if (
track->bgmReadPos != 0) {
1119 if (
track->insVolumeTicks != 0) {
1120 track->insVolumeTicks--;
1121 if (
track->insVolumeTicks == 0) {
1128 if (
track->proxVolumeTicks != 0) {
1129 track->proxVolumeTicks--;
1130 if (
track->proxVolumeTicks == 0) {
1131 track->proxVolume =
track->proxVolumeTarget << 16;
1138 if (
track->delayTime <= 0) {
1140 while (
track->delayTime == 0) {
1146 if (
track->prevReadPos != 0) {
1148 track->prevReadPos = 0;
1177 if (!
track->muted) {
1205 if (
note->length == 0) {
1259 if (
track->isDrumTrack) {
1278 voice->clientVolume = ((
1280 * (
track->insVolume >> 21)
1281 * (
track->proxVolume >> 21)) >> 20)
1282 * (
track->volume *
note->volume)) >> 16;
1285 +
track->insCoarseDetune
1286 +
track->insFineDetune
1287 -
note->ins->keyBase;
1314 * (
track->insVolume >> 21)
1315 * (
track->proxVolume >> 21)) >> 20)
1316 * (
track->volume *
note->velocity)) >> 9;
1320 +
track->insCoarseDetune
1322 +
track->insFineDetune
1323 -
note->ins->keyBase;
1328 *
track->instrument->pitchRatio;
1330 if (
track->randomPanAmount != 0) {
1331 voice->pan = au_bgm_get_random_pan(player,
track->insPan,
track->randomPanAmount);
1337 if (
track->pressOverride != 0) {
1340 voice->envelope.cmdListPress =
track->envelope.cmdListPress;
1342 voice->envelope.cmdListRelease =
track->envelope.cmdListRelease;
1347 if (
note->length > 1) {
1349 note->tremoloDepth =
track->tremoloDepth;
1350 note->tremoloPhase = 0;
1351 note->tremoloDelay =
track->tremoloDelay;
1391 if (!
track->muted) {
1395 if (!
note->pendingTick) {
1396 if (
note->length > 0) {
1398 if (
note->length == 0) {
1402 if (
track->isDrumTrack) {
1403 if (
track->changed.tune || (player->
detune != 0)) {
1405 if (
voice->pitchRatio !=
note->pitchRatio) {
1410 if (
track->changed.volume) {
1418 voice->clientVolume = (
1420 * (
track->insVolume >> 21))
1421 * (
track->proxVolume >> 21)) >> 20)
1422 * (
track->volume *
note->volume)) >> 16;
1427 if (
note->tremoloDepth != 0) {
1428 if (
note->tremoloDelay != 0) {
1429 note->tremoloDelay--;
1432 note->tremoloPhase +=
track->tremoloRate;
1457 if (
voice->pitchRatio !=
note->pitchRatio) {
1462 }
else if (
track->changed.tune || (player->
detune != 0)) {
1465 if (
voice->pitchRatio !=
note->pitchRatio) {
1470 if (
track->changed.volume) {
1480 * (
track->insVolume >> 21)
1481 * (
track->proxVolume >> 21)) >> 20)
1482 * (
track->volume *
note->velocity) >> 9;
1487 }
else if (
track->changed.pan ||
track->changed.reverb) {
1506static const f32 padding[] = {0.0f};
1513 tempo = au_bgm_bpm_to_tempo(player,
bpm);
1527 if (maxTempo <
ret) {
1529 }
else if (
ret == 0) {
1540 volume = volume << 24;
1564 if ((index < 4) && (busID < 0x80)) {
1591 volume = volume << 24;
1609 s8_24 volume =
arg0->seqCmdArgs.InstrumentVolume.value & 0x7F;
1612 volume = volume << 24;
1615 track->insVolume = volume;
1624 volume = volume << 24;
1627 if (volume !=
track->insVolume) {
1632 track->insVolumeTicks = time;
1633 track->insVolumeTarget = volume;
1634 track->insVolumeStep = (volume -
track->insVolume) / time;
1640 track->randomPanAmount = 0;
1682 track->tremoloDepth = 0;
1714 volume = instrument->
volume & 0x7F;
1715 track->patch = patch;
1720 track->insVolume = volume;
1721 track->insPan = instrument->
pan & 0x7F;
1725 track->changed.all |= 0x10101;
1733 track->busID = busID;
1749 track->bgmReadPos = readPos;
1765 track->isDrumTrack = args[2];
1767 if (
track->proxMixSetChanged) {
1769 track->proxVolume = 0;
1770 for (i =
track->firstVoice; i <
track->lastVoice; i++) {
1777 if (
track->proxMixValChanged) {
1782 track->insCoarseDetune = 0;
1783 track->insFineDetune = 0;
1784 track->pressOverride = 0;
1786 track->tremoloDepth = 0;
1787 track->insVolumeTicks = 0;
1788 track->randomPanAmount = 0;
1807 delayTime = arg2 & 0xF;
1847 track->pressOverride = arg1;
1849 track->pressOverride = 0;
1869 if (
track->proxMixValChanged) {
1887 track->proxVol1 = arg1;
1888 track->proxVol2 = arg2;
1981 if (songName != 0) {
2004 }
else if (
rate < 0.25) {
2029 if (
track->bgmReadPos != 0) {
2045 if (duration <= 0) {
2047 }
else if (duration > 1000) {
2051 track->proxVolumeTicks = 0;
2054 track->proxVolumeTicks = duration;
2083 if (songName != 0) {
2085 if (player !=
NULL) {
2089 if (
track->linkedTrackID != 0) {
2112 if (!
track->muted) {
BSS s32 PopupMenu_SelectedIndex
BGMInstrumentInfo * instrumentsInfo
struct BGMHeader * bgmFile
#define BGM_TEMPO_TO_UPDATE_UNITS(tempo)
struct SeqArgs::@74 TrackTremoloDepth
SoundManagerMusicEvent bgmSounds[4]
struct SeqArgs::@67 InstrumentReverb
s8 volumeChanged
Current write position for each custom envelope.
u8 cmdBufPending
Buffer for an unused (legacy) system for controlling the BGMPlayer from the main thread.
#define BGM_MFRAMES_PER_MINUTE
SoundManager * soundManager
struct SeqArgs::@81 Detour
struct SeqArgs::@79 Branch
struct SeqArgs::@72 TrackTremolo
s32 songPlayingCounter
video frames (60 fps)
#define BGM_DEFAULT_TICKS_PER_BEAT
s16 customPressEnvelopes[8][9]
#define AU_SEMITONE_CENTS
#define BGM_DEFAULT_TEMPO
AuCallback onCompleteCallback
s32 frameCounter
current update counter value
s32 nextUpdateCounter
update counter threshold for a single tick
#define AU_FILE_RELATIVE(base, offset)
struct BGMPlayer * resumeCopyTo
struct SeqArgs::@69 InstrumentCoarseTune
struct SeqArgs::@62 MasterVolumeFade
@ BGM_SPECIAL_PROX_MIX_OVERRIDE
@ BGM_SPECIAL_SEEK_CUSTOM_ENV
@ BGM_SPECIAL_USE_CUSTOM_ENV
@ BGM_SPECIAL_WRITE_CUSTOM_ENV
@ BGM_SPECIAL_TRIGGER_SOUND
@ BGM_SPECIAL_SET_STEREO_DELAY
BGMInstrumentInfo * dataPRG
struct BGMPlayer * resumeCopyFrom
@ AU_VOICE_SYNC_FLAG_PAN_FXMIX
@ AU_VOICE_SYNC_FLAG_PITCH
struct SeqArgs::@59 MasterPitchShift
u8 * trackVolsConfig
Dynamically customizable press envelopes.
struct SeqArgs::@64 OverridePatch
struct SeqArgs::@80 EventTrigger
BGMPlayerSnapshot snapshots[1]
struct SeqArgs::@75 RandomPan
u8 effectValues[4]
No means to modify value is implemented.
struct SeqArgs::@63 MasterEffect
u8 customEnvelopeWritePos[8]
Currently active (for writing) custom envelope.
s32 tickUpdateInterval
update counter amount to add per audio frame
#define BGM_DEFAULT_UPDATE_STEP
struct SeqArgs::@77 TrackVolumeFade
struct SeqArgs::@82 Special
@ BGM_COMP_END_COND_LOOP_FALSE
@ BGM_COMP_END_COND_LOOP_TRUE
struct SeqArgs::@78 ReverbType
struct SeqArgs::@73 TrackTremoloRate
struct BGMHeader * dataBGM[2]
BGMInstrumentInfo defaultPRGEntry
u8 priority
Used to mute any linked tracks after the first one encountered.
struct SeqArgs::@58 MasterVolume
BGMPlayerTrack tracks[16]
struct SeqArgs::@76 UseInstrument
struct SeqArgs::@68 TrackVolume
struct SeqArgs::@57 MasterTempo
SegData * compActiveLoopEndPos[4]
struct SeqArgs::@60 UnkCmdE3
SegData * compLoopStartLabels[32]
struct SeqArgs::@61 MasterTempoFade
AuEffectChange effectChanges[4]
copied from INIT to the audio heap, seems to exist only to find SEF, PER, and PRG
#define BGM_MAX_INSTRUMNETS
#define AU_MAX_BUS_VOLUME
@ AU_VOICE_ENV_FLAG_KEY_RELEASED
@ AU_VOICE_ENV_FLAG_VOL_CHANGED
#define AU_VOL_8_TO_16(vol)
struct SeqArgs::@71 TrackDetune
struct SeqArgs::@70 InstrumentFineTune
struct SeqArgs::@66 InstrumentPan
void au_bgm_load_phrase(BGMPlayer *player, u32 cmd)
s32 au_bgm_player_audio_frame_update(BGMPlayer *player)
void au_bgm_player_update_stop(BGMPlayer *player)
void au_bgm_update_bus_volumes(BGMPlayer *player)
void au_bgm_player_read_composition(BGMPlayer *player)
void au_BGMCmd_F1_TrackTremoloRate(BGMPlayer *player, BGMPlayerTrack *track)
void au_bgm_set_proximity_mix(s32 songName, u32 mix)
void au_BGMCmd_F7_ReverbType(BGMPlayer *player, BGMPlayerTrack *track)
void au_BGMCmd_FF_Special(BGMPlayer *player, BGMPlayerTrack *track)
void au_BGMCmd_FD_EventTrigger(BGMPlayer *player, BGMPlayerTrack *track)
AuResult au_bgm_set_linked_tracks(SongSwapLinkedRequest *request)
BGMPlayer * au_bgm_get_player_with_song_name(s32 songString)
AuResult au_bgm_is_song_playing(s32 songName)
void au_BGMCmd_FC_Branch(BGMPlayer *player, BGMPlayerTrack *track)
void au_BGMCmd_FE_Detour(BGMPlayer *player, BGMPlayerTrack *track)
void au_bgm_set_prox_mix_fade(BGMPlayer *player, BGMPlayerTrack *track, s32 target, s32 duration)
AuResult au_bgm_process_suspend(SongSuspendRequest *request, b32 skipStop)
void au_BGMCmd_F4_SubTrackRandomPan(BGMPlayer *player, BGMPlayerTrack *track)
void(* SefCmdHandlers[])(SoundManager *, SoundPlayer *)
void au_BGMCmd_E3(BGMPlayer *player, BGMPlayerTrack *track)
void au_BGMCmd_EA_InstrumentPan(BGMPlayer *player, BGMPlayerTrack *track)
void au_BGMCmd_ED_InstrumentCoarseTune(BGMPlayer *player, BGMPlayerTrack *track)
u8 EnvelopeReleaseDefaultFast[]
void au_BGMCmd_EC_TrackVolume(BGMPlayer *player, BGMPlayerTrack *track)
void au_BGMCmd_E2_MasterDetune(BGMPlayer *player, BGMPlayerTrack *track)
void au_BGMCmd_E5_MasterVolumeFade(BGMPlayer *player, BGMPlayerTrack *track)
void au_bgm_change_track_volume(BGMPlayer *player, s32 trackIdx, s16 time, u8 volume)
void au_bgm_player_update_playing(BGMPlayer *player)
play next tick
void au_bgm_set_track_volumes(BGMPlayer *player, u8 *trackVols, s32 mode)
void au_bgm_end_composition_loop(BGMPlayer *player, u32 cmd)
void au_bgm_restore_copied_player(AuGlobals *globals)
u8 BgmCustomEnvLookup[40]
void au_bgm_set_tick_resolution(BGMPlayer *player, s32 mBeatsPerMinute, u32 ticksPerBeat)
AuResult au_bgm_process_fade_out(SongFadeOutRequest *request)
void au_bgm_player_init(BGMPlayer *player, s32 priority, s32 busID, AuGlobals *globals)
void au_BGMCmd_E0_MasterTempo(BGMPlayer *player, BGMPlayerTrack *track)
BSS void(* CurrentSeqCmdHandler)(BGMPlayer *, BGMPlayerTrack *)
b32 au_bgm_player_is_active(BGMPlayer *player)
AuResult au_bgm_process_resume(SongResumeRequest *request)
void au_bgm_begin_video_frame(BGMPlayer *player)
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_EE_InstrumentFineTune(BGMPlayer *player, BGMPlayerTrack *track)
void au_BGMCmd_F5_UseInstrument(BGMPlayer *player, BGMPlayerTrack *track)
void au_BGMCmd_EC_TrackDetune(BGMPlayer *player, BGMPlayerTrack *track)
void au_BGMCmd_NOP(BGMPlayer *player, BGMPlayerTrack *track)
void au_bgm_stop_all(void)
void au_BGMCmd_F2_TrackTremoloDepth(BGMPlayer *player, BGMPlayerTrack *track)
void au_BGMCmd_E6_MasterEffect(BGMPlayer *player, BGMPlayerTrack *track)
void au_bgm_set_playback_rate(BGMPlayer *player, f32 rate)
void(* SeqCmdHandlers[])(BGMPlayer *, BGMPlayerTrack *)
void au_bgm_clear_custom_note_press(BGMPlayer *player, s32 index)
AuResult au_bgm_adjust_volume(SongStartRequest *request)
void au_bgm_reset_all_voices(BGMPlayer *player)
void au_bgm_player_set_detune(BGMPlayer *player, s32 detune)
void au_BGMCmd_EB_InstrumentReverb(BGMPlayer *player, BGMPlayerTrack *track)
AuResult au_bgm_process_init_song(SongStartRequest *request)
void au_BGMCmd_E9_InstrumentVolume(BGMPlayer *arg0, BGMPlayerTrack *track)
void au_BGMCmd_F6_InstrumentVolumeLerp(BGMPlayer *player, BGMPlayerTrack *track)
void au_BGMCmd_E1_MasterVolume(BGMPlayer *player, BGMPlayerTrack *track)
AuResult au_bgm_complete_push(s32 songName)
void au_BGMCmd_F3_TrackTremoloStop(BGMPlayer *player, BGMPlayerTrack *track)
void au_BGMCmd_E4_MasterTempoFade(BGMPlayer *player, BGMPlayerTrack *track)
void au_reset_voice(AuVoice *voice, u8 voiceIdx)
AuResult au_reload_song_files(s32 songID, BGMHeader *arg1)
void au_fade_set_envelope(Fade *fade, s16 value)
f32 au_compute_pitch_ratio(s32 tuning)
Converts a linear pitch value (in cents) into a frequency ratio suitable for adjusting playback speed...
Instrument * au_get_instrument(AuGlobals *globals, BankSetIndex bank, s32 patch, EnvelopeData *arg3)
Note that bank is supplied as BankSetIndex and not BankSet, which means it will be used to perform a ...
BGMPlayer * au_get_snapshot_by_index(s32 index)
BGMPlayer * au_get_client_by_priority(u8 arg0)
void au_fade_init(Fade *fade, s32 time, s32 startValue, s32 endValue)
void au_fade_calc_envelope(Fade *fade, u32 arg1, s32 target)
void au_fade_set_volume(u8 arg0, u16 arg1, s32 arg2)
void au_copy_words(void *src, void *dst, s32 size)
void au_fade_clear(Fade *fade)
@ AU_ERROR_NULL_SONG_NAME
@ AU_ERROR_SONG_NOT_PLAYING
@ AU_ERROR_INVALID_SONG_DURATION
void snd_bgm_clear_legacy_commands(BGMPlayer *player)
Part of an unused system for inter-thread communication with a BGM player using commands.
void snd_song_trigger_music_event(s32 playerID, s32 trackIndex, s32 eventInfo)