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

Go to the source code of this file.

Macros

#define POST_BGM_READ()
 

Functions

void au_bgm_begin_video_frame (BGMPlayer *player)
 
BGMPlayerau_bgm_get_player_with_song_name (s32 songString)
 
AuResult au_bgm_process_init_song (SongStartRequest *request)
 
AuResult au_bgm_stop_song (s32 songName)
 
void au_bgm_stop_all (void)
 
AuResult au_bgm_is_song_playing (s32 songName)
 
b32 au_bgm_player_is_active (BGMPlayer *player)
 
AuResult au_bgm_process_fade_out (SongFadeOutRequest *request)
 
AuResult au_bgm_complete_push (s32 songName)
 
AuResult au_bgm_process_suspend (SongSuspendRequest *request, b32 skipStop)
 
AuResult au_bgm_process_resume (SongResumeRequest *request)
 
void au_bgm_restore_copied_player (AuGlobals *globals)
 
AuResult au_bgm_adjust_volume (SongStartRequest *request)
 
void au_bgm_player_init (BGMPlayer *player, s32 priority, s32 busID, AuGlobals *globals)
 
void au_bgm_set_effect_indices (BGMPlayer *player, u8 *list)
 
void au_bgm_update_fade (BGMPlayer *player)
 
void au_bgm_update_bus_volumes (BGMPlayer *player)
 
s32 au_bgm_player_audio_frame_update (BGMPlayer *player)
 
void au_bgm_player_initialize (BGMPlayer *player)
 
void au_bgm_clear_custom_note_press (BGMPlayer *player, s32 index)
 
void au_bgm_set_tick_resolution (BGMPlayer *player, s32 mBeatsPerMinute, u32 ticksPerBeat)
 
void au_bgm_player_read_composition (BGMPlayer *player)
 
void au_bgm_end_composition_loop (BGMPlayer *player, u32 cmd)
 
void au_bgm_load_phrase (BGMPlayer *player, u32 cmd)
 
void au_bgm_player_update_stop (BGMPlayer *player)
 
void au_bgm_player_update_playing (BGMPlayer *player)
 play next tick
 
void au_BGMCmd_E0_MasterTempo (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_E1_MasterVolume (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_E2_MasterDetune (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_E3 (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_E6_MasterEffect (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_E4_MasterTempoFade (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_E5_MasterVolumeFade (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_E8_TrackOverridePatch (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_E9_InstrumentVolume (BGMPlayer *arg0, BGMPlayerTrack *track)
 
void au_BGMCmd_F6_InstrumentVolumeLerp (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_EA_InstrumentPan (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_EB_InstrumentReverb (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_EC_TrackVolume (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_ED_InstrumentCoarseTune (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_EE_InstrumentFineTune (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_EC_TrackDetune (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_F0_TrackTremolo (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_F1_TrackTremoloRate (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_F2_TrackTremoloDepth (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_F3_TrackTremoloStop (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_F4_SubTrackRandomPan (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_F5_UseInstrument (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_F7_ReverbType (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_FD_EventTrigger (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_FE_Detour (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_FC_Branch (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_FF_Special (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_BGMCmd_NOP (BGMPlayer *player, BGMPlayerTrack *track)
 
void au_bgm_set_proximity_mix (s32 songName, u32 mix)
 
void au_bgm_set_playback_rate (BGMPlayer *player, f32 rate)
 
void au_bgm_player_set_detune (BGMPlayer *player, s32 detune)
 
void au_bgm_change_track_volume (BGMPlayer *player, s32 trackIdx, s16 time, u8 volume)
 
void au_bgm_set_track_volumes (BGMPlayer *player, u8 *trackVols, s32 mode)
 
void au_bgm_set_prox_mix_fade (BGMPlayer *player, BGMPlayerTrack *track, s32 target, s32 duration)
 
void au_bgm_reset_all_voices (BGMPlayer *player)
 
AuResult au_bgm_set_linked_tracks (SongSwapLinkedRequest *request)
 

Variables

BSS void(* CurrentSeqCmdHandler )(BGMPlayer *, BGMPlayerTrack *)
 
u8 EnvelopeReleaseDefaultFast []
 
u8 BgmTicksRates [8]
 
u8 BgmCustomEnvLookup [40]
 
void(* SefCmdHandlers [])(SoundManager *, SoundPlayer *)
 
void(* SeqCmdHandlers [])(BGMPlayer *, BGMPlayerTrack *)
 
u8 SeqCmdArgCounts []
 

Macro Definition Documentation

◆ POST_BGM_READ

#define POST_BGM_READ ( )
Value:
if (track->detourLength != 0) {\
track->detourLength--;\
if (track->detourLength == 0) {\
track->bgmReadPos = track->savedPos;\
}\
}
BSS s32 PopupMenu_SelectedIndex

Definition at line 1018 of file bgm_player.c.

1018#define POST_BGM_READ() \
1019if (track->detourLength != 0) {\
1020 track->detourLength--;\
1021 if (track->detourLength == 0) {\
1022 track->bgmReadPos = track->savedPos;\
1023 }\
1024}

Referenced by au_bgm_player_update_playing().

Function Documentation

◆ au_bgm_begin_video_frame()

void au_bgm_begin_video_frame ( BGMPlayer * player)

Definition at line 23 of file bgm_player.c.

23 {
24 BGMHeader* bgmFile;
27 u32 compID;
28 s32 compOffset;
29 u32 value;
31 u8 var_a1;
32 u8 pos;
33 u32 i;
34
35 compID = 0;
36 unkType = -1;
37 player->frameCounter++;
38
39 if (player->cmdBufPending != 0) {
40 if (player->cmdBufPending < ARRAY_COUNT(player->cmdBufData)) {
41 pos = player->cmdBufReadPos;
42 for (var_a1 = 0; var_a1 < player->cmdBufPending; var_a1++) {
43 value = player->cmdBufData[pos];
44 if (value != 0) {
45 if (value < 16) {
46 unkType = value & 3;
47 compID = value >> 2;
48 }
49 pos++;
50 if (pos >= ARRAY_COUNT(player->cmdBufData)) {
51 pos = 0;
52 }
53 }
54 }
55 consumed = player->cmdBufWritePos - player->cmdBufReadPos;
56 if (consumed < 0) {
58 }
59 player->cmdBufPending -= consumed;
60 player->cmdBufReadPos = player->cmdBufWritePos;
61 } else {
62 player->cmdBufPending = 0;
63 }
64
65 if (unkType != -1) {
66 if (unkType != 0) {
67 if (unkType != player->unk_58) {
68 player->unk_58 = unkType & 0xFF;
69 player->unk_5A = unkType & 0xFF;
72 if (unkType == 2) {
73 bgmFile = player->globals->dataBGM[1];
74 } else {
75 bgmFile = player->globals->dataBGM[0];
76 }
77 player->bgmFile = bgmFile;
78 bgmData = &bgmFile->info;
80
81 compOffset = bgmData->compositions[compID];
82 if (compOffset == 0) {
83 compOffset = bgmData->compositions[0];
84 }
85 player->compStartPos = AU_FILE_RELATIVE(bgmFile, compOffset << 2);
86 player->compReadPos = AU_FILE_RELATIVE(bgmFile, compOffset << 2);
87
88 if (bgmData->drums != 0) {
89 player->drumsInfo = AU_FILE_RELATIVE(player->bgmFile, bgmData->drums << 2);
90 player->bgmDrumCount = bgmData->drumCount;
91 for (i = 0; i < player->bgmDrumCount; i++) {
92 BGMDrumInfo* drum = &player->drumsInfo[i];
93 player->drums[i] = drum;
94 }
95 for (; i < ARRAY_COUNT(player->drums); i++) {
96 player->drums[i] = player->drums[0];
97 }
98 } else {
99 player->drumsInfo = nullptr;
100 player->bgmDrumCount = 0;
101 }
102
103 if (bgmData->instruments != 0) {
104 player->instrumentsInfo = AU_FILE_RELATIVE(player->bgmFile, bgmData->instruments << 2);
105 player->bgmInstrumentCount = bgmData->instrumentCount;
106 return;
107 }
108 player->instrumentsInfo = nullptr;
109 player->bgmInstrumentCount = 0;
110 }
111 } else {
112 if (player->unk_58 != 0) {
114 player->nextUpdateCounter = 1;
115 player->nextUpdateStep = 1;
116 } else {
117 au_bgm_stop_player(player);
118 }
119 }
120 }
121 }
122}
BGMInstrumentInfo * instrumentsInfo
Definition audio.h:1166
u16 unk_5A
Definition audio.h:1156
struct BGMHeader * bgmFile
Definition audio.h:1160
u8 cmdBufPending
Buffer for an unused (legacy) system for controlling the BGMPlayer from the main thread.
Definition audio.h:1213
u8 * tickRatePtr
Definition audio.h:1164
u16 unk_58
Definition audio.h:1155
SegData * compReadPos
Definition audio.h:1161
s32 frameCounter
current update counter value
Definition audio.h:1144
BGMDrumInfo * drumsInfo
Definition audio.h:1165
AuGlobals * globals
Definition audio.h:1139
u8 bgmDrumCount
Definition audio.h:1196
s32 nextUpdateCounter
update counter threshold for a single tick
Definition audio.h:1143
#define AU_FILE_RELATIVE(base, offset)
Definition audio.h:43
BGMFileInfo info
Definition audio.h:884
BGMDrumInfo * drums[12]
Definition audio.h:1167
SegData * compStartPos
Definition audio.h:1162
@ BGM_PLAY_STATE_STOP
Definition audio.h:211
@ BGM_PLAY_STATE_INIT
Definition audio.h:210
s32 nextUpdateStep
Definition audio.h:1141
u8 bgmInstrumentCount
Definition audio.h:1197
#define BGM_DEFAULT_UPDATE_STEP
Definition audio.h:97
s32 cmdBufData[8]
Definition audio.h:1212
u8 cmdBufWritePos
Definition audio.h:1215
struct BGMHeader * dataBGM[2]
Definition audio.h:1047
u8 cmdBufReadPos
Definition audio.h:1214
u8 masterState
Definition audio.h:1201
u8 BgmTicksRates[8]
Definition sfx_player.c:279
void au_bgm_set_tick_resolution(BGMPlayer *player, s32 mBeatsPerMinute, u32 ticksPerBeat)
Definition bgm_player.c:827
Vec3s pos
Definition demo_api.c:17
#define ARRAY_COUNT(arr)
Definition macros.h:39

Referenced by au_update_clients_for_video_frame().

◆ au_bgm_get_player_with_song_name()

BGMPlayer * au_bgm_get_player_with_song_name ( s32 songString)

Definition at line 124 of file bgm_player.c.

124 {
127 return gBGMPlayerB;
128 }
129 } else {
130 return gBGMPlayerA;
131 }
132 return nullptr;
133}
BGMPlayer * gBGMPlayerB
Definition engine.c:7
s32 name
Definition audio.h:882
BGMPlayer * gBGMPlayerA
Definition engine.c:6

Referenced by au_bgm_adjust_volume(), au_bgm_is_song_playing(), au_bgm_process_fade_out(), au_bgm_process_init_song(), au_bgm_process_resume(), au_bgm_process_suspend(), au_bgm_set_linked_tracks(), au_bgm_set_proximity_mix(), and au_bgm_stop_song().

◆ au_bgm_process_init_song()

AuResult au_bgm_process_init_song ( SongStartRequest * request)

Definition at line 135 of file bgm_player.c.

135 {
136 BGMPlayer* player;
138 s32 songName;
139 s32 variation;
140 s32 duration;
141 s32 volume0;
142 s32 volume1;
143 AuResult status;
144 u32 i;
145
146 status = AU_RESULT_OK;
147 songName = request->songName;
148 variation = request->variation;
149
150 if (songName != 0) {
151 player = au_bgm_get_player_with_song_name(songName);
152 if (player != nullptr) {
153 fileInfo = &player->bgmFile->info;
154 duration = request->duration;
155 if (duration != 0) {
156 if (duration > SND_MAX_DURATION) {
157 duration = SND_MAX_DURATION;
158 } else if (duration < SND_MIN_DURATION) {
159 duration = SND_MIN_DURATION;
160 }
161 }
162 volume0 = request->startVolume;
163 if (volume0 > AU_MAX_VOLUME_8) {
165 }
166 if (volume0 != 0) {
168 }
169 volume1 = request->finalVolume;
170 if (volume1 > AU_MAX_VOLUME_8) {
172 }
173 if (volume1 != 0) {
175 } else {
177 }
178
179 au_fade_init(&player->fadeInfo, duration, volume0, volume1);
181 player->fadeInfo.envelopeTicks = 1;
183
184 if (variation < BGM_VARIATION_0 || variation > BGM_VARIATION_3 || fileInfo->compositions[variation] == 0) {
185 variation = BGM_VARIATION_0;
186 }
187 player->curVariation = variation;
188
189 player->compStartPos = AU_FILE_RELATIVE(player->bgmFile, fileInfo->compositions[variation] << 2);
190 player->compReadPos = player->compStartPos;
191
192 if (fileInfo->drums != 0) {
193 player->drumsInfo = AU_FILE_RELATIVE(player->bgmFile, fileInfo->drums << 2);
194 player->bgmDrumCount = fileInfo->drumCount;
195
196 for (i = 0; i < player->bgmDrumCount; i++) {
197 BGMDrumInfo* drum = &player->drumsInfo[i];
198 player->drums[i] = drum;
199 }
200 for (; i < ARRAY_COUNT(player->drums); i++) {
201 player->drums[i] = player->drums[0];
202 }
203 } else {
204 player->drumsInfo = nullptr;
205 player->bgmDrumCount = 0;
206 }
207
208 if (fileInfo->instruments != 0) {
209 player->instrumentsInfo = AU_FILE_RELATIVE(player->bgmFile, fileInfo->instruments << 2);
210 player->bgmInstrumentCount = fileInfo->instrumentCount;
211 } else {
212 player->instrumentsInfo = nullptr;
213 player->bgmInstrumentCount = 0;
214 }
215
216 player->songName = songName;
218 } else {
220 }
221 } else {
223 }
224 return status;
225}
s32 songName
Definition audio.h:1146
#define AU_MAX_VOLUME_8
Definition audio.h:61
s16 envelopeTarget
Definition audio.h:512
s16 envelopeTicks
Definition audio.h:513
#define SND_MIN_DURATION
Definition audio.h:102
Fade fadeInfo
Definition audio.h:1150
#define SND_MAX_DURATION
Definition audio.h:103
#define AU_MAX_VOLUME_16
Definition audio.h:62
#define AU_VOL_8_TO_16(vol)
Definition audio.h:70
s32 curVariation
Definition audio.h:1159
BGMPlayer * au_bgm_get_player_with_song_name(s32 songString)
Definition bgm_player.c:124
void au_bgm_player_initialize(BGMPlayer *player)
Definition bgm_player.c:702
void au_fade_init(Fade *fade, s32 time, s32 startValue, s32 endValue)
Definition engine.c:421
@ BGM_VARIATION_0
Definition enums.h:1805
@ BGM_VARIATION_3
Definition enums.h:1808
AuResult
Definition enums.h:1758
@ AU_ERROR_NULL_SONG_NAME
Definition enums.h:1766
@ AU_RESULT_OK
Definition enums.h:1759
@ AU_ERROR_SONG_NOT_PLAYING
Definition enums.h:1764

Referenced by snd_song_request_fade_in(), snd_song_request_fade_in_default(), snd_song_request_play(), and snd_song_request_play_default().

◆ au_bgm_stop_song()

AuResult au_bgm_stop_song ( s32 songName)

Definition at line 227 of file bgm_player.c.

227 {
228 BGMPlayer* player;
229 AuResult status = AU_RESULT_OK;
230
231 if (songName != 0) {
232 player = au_bgm_get_player_with_song_name(songName);
233 if (player != nullptr) {
234 if (songName == player->songName) {
235 au_bgm_stop_player(player);
236 }
237 } else {
239 }
240 } else {
242 }
243
244 return status;
245}

Referenced by snd_song_stop().

◆ au_bgm_stop_all()

void au_bgm_stop_all ( void )

Definition at line 247 of file bgm_player.c.

247 {
248 au_bgm_stop_player(gBGMPlayerA);
249 au_bgm_stop_player(gBGMPlayerB);
250}

Referenced by snd_song_stop_all().

◆ au_bgm_is_song_playing()

AuResult au_bgm_is_song_playing ( s32 songName)

Definition at line 261 of file bgm_player.c.

261 {
262 BGMPlayer* player;
263 AuResult result = AU_RESULT_OK;
264
265 if (songName != 0) {
266 player = au_bgm_get_player_with_song_name(songName);
267 if (player != nullptr) {
268 result = (songName == player->songName);
269 } else {
271 }
272 } else {
274 }
275
276 return result;
277}

Referenced by snd_song_is_playing().

◆ au_bgm_player_is_active()

b32 au_bgm_player_is_active ( BGMPlayer * player)

Definition at line 279 of file bgm_player.c.

279 {
280 if (player->songName != 0 && player->masterState != 0) {
281 return true;
282 } else {
283 return false;
284 }
285}

Referenced by au_bgm_process_resume(), and au_load_song_files().

◆ au_bgm_process_fade_out()

AuResult au_bgm_process_fade_out ( SongFadeOutRequest * request)

Definition at line 287 of file bgm_player.c.

287 {
288 AuResult status;
289 BGMPlayer* player;
290 u32 songName = request->songName;
291 u32 duration = request->duration;
292 s16 volume = request->finalVolume;
293
294 status = AU_RESULT_OK;
295 if (songName != 0) {
296 if (duration >= SND_MIN_DURATION && duration <= SND_MAX_DURATION) {
297 player = au_bgm_get_player_with_song_name(songName);
298 if (player != nullptr) {
299 if (player->songName == songName) {
300 if (player->masterState != BGM_PLAY_STATE_IDLE) {
301 if (!player->paused) {
302 player->fadeInfo.baseTarget = volume;
303 player->fadeInfo.baseTicks = (duration * 1000) / AU_FRAME_USEC;
304 player->fadeInfo.baseStep = ((volume << 0x10) - player->fadeInfo.baseVolume) / player->fadeInfo.baseTicks;
305 player->fadeInfo.onCompleteCallback = request->doneCallback;
306 if (request->onPush == 1) {
307 player->pushSongName = songName;
308 }
309 }
310 }
311 }
312 } else {
314 }
315 } else {
317 }
318 } else {
320 }
321 return status;
322}
s16 baseTicks
Definition audio.h:508
AuCallback onCompleteCallback
Definition audio.h:509
s32 baseStep
Definition audio.h:506
u8 paused
Definition audio.h:1200
s16 baseTarget
Definition audio.h:507
@ BGM_PLAY_STATE_IDLE
Definition audio.h:207
s32 pushSongName
Definition audio.h:1147
#define AU_FRAME_USEC
Definition audio.h:27
s16_16 baseVolume
Definition audio.h:505
@ AU_ERROR_INVALID_SONG_DURATION
Definition enums.h:1768

Referenced by snd_song_request_fade_out(), and snd_song_request_push_fade_out().

◆ au_bgm_complete_push()

AuResult au_bgm_complete_push ( s32 songName)

Definition at line 324 of file bgm_player.c.

324 {
326
327 s.songName = songName;
328 s.duration = 0;
329 s.startVolume = 0;
330 s.finalVolume = 0;
332 s.pauseMode = false;
333
334 return au_bgm_process_suspend(&s, 0); // force stop
335}
@ BGM_SNAPSHOT_0
Definition audio.h:192
AuResult au_bgm_process_suspend(SongSuspendRequest *request, b32 skipStop)
Definition bgm_player.c:337

Referenced by au_bgm_update_fade().

◆ au_bgm_process_suspend()

AuResult au_bgm_process_suspend ( SongSuspendRequest * request,
b32 skipStop )

Definition at line 337 of file bgm_player.c.

337 {
338 AuResult status;
339 BGMPlayer* player;
341 s32 songName;
342 s32 index;
343 u32 i;
344 u32 j;
345
346 songName = request->songName;
347 index = request->index;
348 status = AU_RESULT_OK;
349
350 if (songName != 0) {
351 player = au_bgm_get_player_with_song_name(songName);
352 if (player != nullptr) {
353 if (!request->pauseMode) {
355 if (snapshot != nullptr) {
356 if (songName == player->songName) {
357 if (!skipStop) {
358 for (i = 0; i < ARRAY_COUNT(player->tracks); i++) {
359 BGMPlayerTrack* track = &player->tracks[i];
360 if (track->bgmReadPos != nullptr) {
361 for (j = track->firstVoice; j < track->lastVoice; j++) {
362 track->changed.all = 0;
363 }
364 }
365 }
366 }
367 player->globals->snapshots[index].priority = player->priority;
368 player->globals->snapshots[index].assigned = 1;
369 player->pushSongName = 0;
370 au_copy_words(player, snapshot, sizeof(*player));
371 if (!skipStop) {
372 au_bgm_stop_player(player);
373 }
374 }
375 } else {
377 }
378 } else {
379 if (songName == player->songName) {
380 if (player->masterState != BGM_PLAY_STATE_IDLE) {
381 player->paused = true;
383 }
384 }
385 }
386 } else {
388 }
389 } else {
391 }
392 return status;
393}
SoundPlayChange changed
Definition audio.h:1097
BGMPlayerSnapshot snapshots[1]
Definition audio.h:1049
u8 priority
Used to mute any linked tracks after the first one encountered.
Definition audio.h:1209
BGMPlayerTrack tracks[16]
Definition audio.h:1217
void au_bgm_reset_all_voices(BGMPlayer *player)
BGMPlayer * au_get_snapshot_by_index(s32 index)
Definition engine.c:656
void au_copy_words(void *src, void *dst, s32 size)
Definition engine.c:1271

Referenced by au_bgm_complete_push(), snd_song_push_stop(), snd_song_request_pause(), and snd_song_request_snapshot().

◆ au_bgm_process_resume()

AuResult au_bgm_process_resume ( SongResumeRequest * request)

Definition at line 395 of file bgm_player.c.

395 {
396 AuResult status;
397 BGMPlayer* player;
399 s32 index;
400 s32 songName;
401 s32 volume0;
402 s32 volume1;
403 s32 duration;
404
405 songName = request->songName;
406 index = request->index;
407 status = AU_RESULT_OK;
408
409 if (songName != 0) {
410 if (!request->pauseMode) {
412 if (snapshot != nullptr && snapshot->globals->snapshots[index].assigned == 1) {
413 player = au_get_client_by_priority(snapshot->globals->snapshots[index].priority);
414 if (player != nullptr) {
415 if (!au_bgm_player_is_active(player)) {
416 status = au_reload_song_files(snapshot->songID, snapshot->bgmFile);
417 duration = request->duration;
418 if (duration != 0) {
419 if (duration > SND_MAX_DURATION) {
420 duration = SND_MAX_DURATION;
421 } else if (duration < SND_MIN_DURATION) {
422 duration = SND_MIN_DURATION;
423 }
424 }
425 volume0 = request->startVolume;
426 if (volume0 > AU_MAX_VOLUME_8) {
428 }
429 if (volume0 != 0) {
431 }
432 volume1 = request->finalVolume;
433 if (volume1 > AU_MAX_VOLUME_8) {
435 }
436 if (volume1 != 0) {
438 } else {
440 }
441 player->globals->resumeCopyTo = player;
443 player->globals->resumeSongName = songName;
444 player->globals->resumeFadeTime = duration;
446 player->globals->resumeFadeEnd = volume1;
447 player->globals->resumeRequested = true;
448 } else {
449 status = AU_ERROR_7;
450 }
451 } else {
452 status = AU_ERROR_6;
453 }
454 } else {
456 }
457 } else {
458 player = au_bgm_get_player_with_song_name(songName);
459 if (player != nullptr) {
460 if (songName == player->songName) {
461 if (player->paused) {
462 player->paused = false;
463 }
464 }
465 }
466 }
467 } else {
469 }
470 return status;
471}
struct BGMPlayer * resumeCopyTo
Definition audio.h:1050
struct BGMPlayer * resumeCopyFrom
Definition audio.h:1051
s32 resumeFadeEnd
Definition audio.h:1056
s32 resumeFadeStart
Definition audio.h:1055
s32 resumeSongName
Definition audio.h:1052
s32 resumeFadeTime
Definition audio.h:1054
b32 resumeRequested
Definition audio.h:1053
b32 au_bgm_player_is_active(BGMPlayer *player)
Definition bgm_player.c:279
AuResult au_reload_song_files(s32 songID, BGMHeader *arg1)
Definition engine.c:618
BGMPlayer * au_get_client_by_priority(u8 arg0)
Definition engine.c:732
@ AU_ERROR_7
Definition enums.h:1770
@ AU_ERROR_6
Definition enums.h:1769

Referenced by snd_song_request_pop(), and snd_song_request_unpause().

◆ au_bgm_restore_copied_player()

void au_bgm_restore_copied_player ( AuGlobals * globals)

Definition at line 473 of file bgm_player.c.

473 {
474 BGMPlayer* player;
476 SeqNote* note;
477 u32 i;
478 u32 j;
479 s32 k;
480
481 player = globals->resumeCopyTo;
482 au_copy_words(globals->resumeCopyFrom, globals->resumeCopyTo, sizeof(*player));
483 if (globals->resumeSongName == player->songName) {
484 for (i = 0; i < ARRAY_COUNT(player->tracks); i++) {
485 track = &player->tracks[i];
486 if (track->bgmReadPos != nullptr) {
487 for (j = track->firstVoice; j < track->lastVoice; j++) {
488 note = &player->notes[j];
489 note->length = 0;
490 }
491 }
492 }
493 for (k = 0; k < ARRAY_COUNT(player->effectIndices); k++) {
494 if (player->effectIndices[k] != 0xFF) {
495 player->seqCmdArgs.MasterEffect.index = player->effectIndices[k];
496 player->seqCmdArgs.MasterEffect.value = player->effectValues[k];
498 }
499 }
500 au_fade_init(&player->fadeInfo, globals->resumeFadeTime, globals->resumeFadeStart, globals->resumeFadeEnd);
501 }
502 globals->resumeRequested = false;
503}
SeqNote notes[24]
Definition audio.h:1218
u8 effectIndices[4]
Definition audio.h:1152
SeqArgs seqCmdArgs
Definition audio.h:1177
u8 effectValues[4]
No means to modify value is implemented.
Definition audio.h:1204
struct SeqArgs::@63 MasterEffect
s32 length
Definition audio.h:1129
void au_BGMCmd_E6_MasterEffect(BGMPlayer *player, BGMPlayerTrack *track)

Referenced by au_update_clients_for_audio_frame().

◆ au_bgm_adjust_volume()

AuResult au_bgm_adjust_volume ( SongStartRequest * request)

Definition at line 505 of file bgm_player.c.

505 {
506 BGMPlayer* player;
507 AuResult status = AU_RESULT_OK;
508
509 if (request->songName != 0) {
510 player = au_bgm_get_player_with_song_name(request->songName);
511 if (player != nullptr) {
512 au_fade_calc_envelope(&player->fadeInfo, request->duration, request->finalVolume);
513 }
514 else {
516 }
517 } else {
519 }
520 return status;
521}
void au_fade_calc_envelope(Fade *fade, u32 arg1, s32 target)
Definition engine.c:476

Referenced by snd_song_set_volume_full(), and snd_song_set_volume_quiet().

◆ au_bgm_player_init()

void au_bgm_player_init ( BGMPlayer * player,
s32 priority,
s32 busID,
AuGlobals * globals )

Definition at line 523 of file bgm_player.c.

523 {
524 s16 i;
525
526 player->globals = globals;
530 player->masterVolume = AU_MAX_VOLUME_8 << 24;
531 player->frameCounter = 0;
532 player->songPlayingCounter = 0;
533 player->songName = 0;
534 player->pushSongName = 0;
535 player->unk_58 = 0;
536 player->unk_5A = 0;
537 player->compReadPos = nullptr;
538 player->compStartPos = nullptr;
539 player->phraseStartPos = 0;
540 player->masterTempoTicks = 0;
541 player->masterTempoTarget = 0;
542 player->masterTempoStep = 0;
543 player->masterVolumeTicks = 0;
544 player->masterVolumeTarget = 0;
545 player->masterVolumeStep = 0;
546 player->masterPitchShift = 0;
547 player->detune = 0;
548 player->paused = false;
549 player->trackVolsConfig = nullptr;
550 player->bFadeConfigSetsVolume = false;
552 player->priority = priority;
553 player->busID = busID;
554 *(s32*)player->compLoopCounters = 0;
555 player->unused_222 = 0;
556 player->conditionalLoopFlags = 0;
557 player->playbackRate = 1.0f;
558 player->polyphonyCounts[BGM_POLYPHONY_0] = 0;
559 player->polyphonyCounts[BGM_POLYPHONY_1] = 1;
563 player->polyphonyCounts[BGM_POLYPHONY_2] = 2;
564 player->polyphonyCounts[BGM_POLYPHONY_3] = 3;
565 player->polyphonyCounts[BGM_POLYPHONY_4] = 4;
566
567 for (i = 0; i < ARRAY_COUNT(player->tracks); i++) {
568 BGMPlayerTrack* track = &player->tracks[i];
569
570 track->insVolume = 0;
571 track->delayTime = 0;
572 track->insCoarseDetune = 0;
573 track->insFineDetune = 0;
574 track->insPan = 0;
575 track->insReverb = 0;
576 track->patch = 0;
577 track->isDrumTrack = false;
578 track->volume = AU_MAX_VOLUME_8;
579 track->pressOverride = 0;
580
581 if (i < ARRAY_COUNT(player->cmdBufData)) {
582 player->cmdBufData[i] = 0;
583 }
584 }
585
586 for (i = 0; i < ARRAY_COUNT(player->notes); i++) {
587 SeqNote* note = &player->notes[i];
588
589 note->volume = 0;
590 note->detune = 0;
591 note->length = 0;
592 note->randDetune = 0;
593 note->velocity = 0;
594 note->pendingTick = false;
595 }
596
599}
s32 songPlayingCounter
video frames (60 fps)
Definition audio.h:1145
#define BGM_DEFAULT_TICKS_PER_BEAT
Definition audio.h:77
s32 masterVolumeTicks
Definition audio.h:1175
#define BGM_DEFAULT_TEMPO
Definition audio.h:91
s32 masterVolumeTarget
Definition audio.h:1174
u8 busID
Definition audio.h:1210
s32 masterTempo
Definition audio.h:1168
s8_24 masterVolume
Definition audio.h:1172
u8 unused_222
Definition audio.h:1202
s8_24 insVolume
Definition audio.h:1084
s32 masterTempoStep
Definition audio.h:1169
s32 masterTempoTarget
Definition audio.h:1170
SegData * phraseStartPos
Definition audio.h:1163
u8 * trackVolsConfig
Dynamically customizable press envelopes.
Definition audio.h:1186
s16 volume
Definition audio.h:1127
u16 masterPitchShift
Definition audio.h:1189
s32 busVolume
Definition audio.h:1151
u8 bFadeConfigSetsVolume
Definition audio.h:1207
u8 conditionalLoopFlags
Definition audio.h:1203
s32 masterTempoTicks
Definition audio.h:1171
s32 masterVolumeStep
Definition audio.h:1173
@ BGM_POLYPHONY_UNUSED_A
Definition audio.h:198
@ BGM_POLYPHONY_4
Definition audio.h:203
@ BGM_POLYPHONY_UNUSED_C
Definition audio.h:200
@ BGM_POLYPHONY_2
Definition audio.h:201
@ BGM_POLYPHONY_1
Definition audio.h:197
@ BGM_POLYPHONY_0
Definition audio.h:196
@ BGM_POLYPHONY_UNUSED_B
Definition audio.h:199
@ BGM_POLYPHONY_3
Definition audio.h:202
f32 playbackRate
Definition audio.h:1176
#define AU_MAX_BUS_VOLUME
Definition audio.h:40
u8 compLoopCounters[4]
Definition audio.h:1180
u8 polyphonyCounts[8]
Definition audio.h:1206
s16 detune
Definition audio.h:1190
void au_fade_set_envelope(Fade *fade, s16 value)
Definition engine.c:469
void snd_bgm_clear_legacy_commands(BGMPlayer *player)
Part of an unused system for inter-thread communication with a BGM player using commands.

Referenced by au_engine_init().

◆ au_bgm_set_effect_indices()

void au_bgm_set_effect_indices ( BGMPlayer * player,
u8 * list )

Definition at line 601 of file bgm_player.c.

601 {
602 s32 i;
604
605 for (i = 0; i < ARRAY_COUNT(player->effectIndices); i++) {
606 s8 idx = *list++;
607
608 if (idx < 0) {
609 break;
610 }
611 player->effectIndices[i] = idx;
612 }
613
614 remaining = ARRAY_COUNT(player->effectIndices) - i;
615 if (remaining > 0) {
616 while (remaining-- != 0) {
617 player->effectIndices[i++] = -1;
618 }
619 }
620}

Referenced by au_engine_init().

◆ au_bgm_update_fade()

void au_bgm_update_fade ( BGMPlayer * player)

Definition at line 622 of file bgm_player.c.

622 {
623 player->fadeInfo.baseTicks--;
624
625 if (player->fadeInfo.baseTicks != 0) {
626 player->fadeInfo.baseVolume += player->fadeInfo.baseStep;
627 } else {
628 player->fadeInfo.baseVolume = player->fadeInfo.baseTarget << 16;
629
630 if (player->fadeInfo.onCompleteCallback != nullptr) {
632 }
633
634 // Was this fade tagged as a push?
635 if (player->pushSongName != 0) {
637 } else if (player->fadeInfo.baseVolume == 0) {
638 au_bgm_stop_player(player);
639 }
640 }
642}
void au_bgm_update_bus_volumes(BGMPlayer *player)
Definition bgm_player.c:644
AuResult au_bgm_complete_push(s32 songName)
Definition bgm_player.c:324

Referenced by au_update_clients_for_audio_frame().

◆ au_bgm_update_bus_volumes()

void au_bgm_update_bus_volumes ( BGMPlayer * player)

Definition at line 644 of file bgm_player.c.

644 {
645 u16 volume = (
646 ((u32)player->fadeInfo.baseVolume >> 16) *
647 ((u32)player->fadeInfo.envelopeVolume >> 16)
648 ) >> 15;
649 s32 i;
650
651 for (i = 0; i < ARRAY_COUNT(player->effectIndices); i++) {
652 s8 busID = player->effectIndices[i];
653
654 if (busID < 0) {
655 return;
656 }
657 au_fade_set_volume(busID, volume, player->busVolume);
658 }
659}
s16_16 envelopeVolume
Definition audio.h:510
void au_fade_set_volume(u8 arg0, u16 arg1, s32 arg2)
Definition engine.c:457

Referenced by au_bgm_update_fade(), and au_update_clients_for_audio_frame().

◆ au_bgm_player_audio_frame_update()

s32 au_bgm_player_audio_frame_update ( BGMPlayer * player)

Definition at line 661 of file bgm_player.c.

661 {
662 u16 hasMore = true;
663 s32 retVal = false;
664
665 // update pseudorandom numbers with fast 'good enough' method
666 player->randomValue1 = (player->randomValue1 & 0xFFFF) + (player->songPlayingCounter & 0xFFFF) + (player->frameCounter & 0xFFFF);
667 player->randomValue2 = (player->randomValue2 & 0xFFFF) + ((player->songPlayingCounter << 4) & 0xFFFF) + ((player->frameCounter >> 4) & 0xFFFF);
668 do {
669 switch (player->masterState) {
671 hasMore = false;
672 break;
674 if (!player->paused) {
676 if (player->masterState == BGM_PLAY_STATE_ACTIVE) {
677 hasMore = false;
678 }
679 } else {
680 hasMore = false;
681 }
682 break;
685 break;
688 hasMore = false;
689 break;
692 break;
693 default:
694 retVal = true;
695 hasMore = false;
696 break;
697 }
698 } while (hasMore);
699 return retVal;
700}
s32 randomValue2
Definition audio.h:1154
s32 randomValue1
Definition audio.h:1153
@ BGM_PLAY_STATE_FETCH
Definition audio.h:209
@ BGM_PLAY_STATE_ACTIVE
Definition audio.h:208
void au_bgm_player_update_stop(BGMPlayer *player)
void au_bgm_player_read_composition(BGMPlayer *player)
Definition bgm_player.c:859
void au_bgm_player_update_playing(BGMPlayer *player)
play next tick

Referenced by au_update_clients_for_audio_frame().

◆ au_bgm_player_initialize()

void au_bgm_player_initialize ( BGMPlayer * player)

Definition at line 702 of file bgm_player.c.

702 {
703 s32* buf;
704 s32 cmd;
706 s32 i;
707
708 for (i = 0; i < ARRAY_COUNT(player->tracks); i++) {
709 BGMPlayerTrack* track = &player->tracks[i];
711 track->insVolume = AU_MAX_VOLUME_16 << 16; // @bug? incorrect format for 8.24 fixed, should be (AU_MAX_VOLUME_8 << 24)
712 track->insPan = 0x40;
713 track->insReverb = 0;
714 track->patch = 0;
715 track->insCoarseDetune = 0;
716 track->insFineDetune = 0;
717 track->volume = AU_MAX_VOLUME_8;
718 track->pressOverride = 0;
719 track->proxVolume = AU_MAX_VOLUME_16 << 16;
720 track->savedPos = nullptr;
721 track->prevReadPos = nullptr;
722 track->detourLength = 0;
723 track->detune = 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;
733 track->proxMixSetChanged = false;
734 track->proxMixValChanged = false;
735 track->proxVol1 = 0;
736 track->proxVol2 = 0;
737 track->polyVoiceCount = 0;
738 track->polyphonicIdx = 0;
739 track->randomPanAmount = 0;
740 track->isDrumTrack = false;
741 track->linkedTrackID = 0;
742 track->muted = false;
743 track->busID = player->busID;
744 track->index = i;
745 }
746
747 for (i = 0; i < ARRAY_COUNT(player->notes); i++) {
748 SeqNote* note = &player->notes[i];
750 note->pitchRatio = 2.0f;
751 note->randDetune = 0;
752 note->velocity = 0;
753 note->length = 0;
754 note->tremoloDepth = 0;
755 }
756
758 player->playbackRate = 128.0f; // set to 1.0 later om...
761 player->unused_21E = 0x80;
762 player->masterVolume = AU_MAX_VOLUME_8 << 24;
763 player->pushSongName = 0;
764 player->tickRatePtr = nullptr;
765 player->masterTempoTarget = 0;
766 player->masterPitchShift = 0;
767 player->detune = 0;
768 player->masterVolumeTicks = 0;
769 player->masterVolumeTarget = 0;
770 player->masterVolumeStep = 0;
771 player->proxMixValue = 0;
772 player->proxMixID = 0;
773 player->proxMixVolume = 0;
774 player->compActiveLoopEndPos[3] = nullptr;
775 player->compActiveLoopEndPos[2] = nullptr;
776 player->compActiveLoopEndPos[1] = nullptr;
777 player->compActiveLoopEndPos[0] = nullptr;
778 *(s32*)player->compLoopCounters = 0;
779 player->compLoopDepth = 0;
780 player->unused_222 = 0;
781 player->conditionalLoopFlags = 0;
782 player->trackVolsConfig = nullptr;
783 player->bFadeConfigSetsVolume = false;
784 player->initLinkMute = true;
785 player->writingCustomEnvelope = 0;
786 player->playbackRate = 1.0f;
787
788 for (i = 0; i < ARRAY_COUNT(player->customEnvelopeWritePos); i++) {
790 }
791
792 for (i = 0; i < ARRAY_COUNT(player->effectValues); i++) {
793 player->effectValues[i] = 0;
794 }
795
796 player->paused = false;
797 player->songPlayingCounter = 0;
798 for (i = 0; i < ARRAY_COUNT(player->compLoopStartLabels); i++) {
799 player->compLoopStartLabels[i] = player->compReadPos;
800 }
801
802 // find labels
803 buf = player->compReadPos;
804 keepReading = true;
805 while (keepReading) {
806 cmd = *buf++;
807 if (cmd == 0) {
808 keepReading = false;
809 } else if ((cmd & 0xF0000000) == BGM_COMP_START_LOOP << 28) {
810 player->compLoopStartLabels[cmd & 0x1F] = buf;
811 }
812 }
813
815}
u8 initLinkMute
Definition audio.h:1208
#define NO_INSTRUMENT
Definition audio.h:14
u8 unused_21E
Definition audio.h:1198
u8 proxMixID
Definition audio.h:1182
u16 masterTempoBPM
Definition audio.h:1187
#define BGM_DEFAULT_BPM
Definition audio.h:89
u8 customEnvelopeWritePos[8]
Currently active (for writing) custom envelope.
Definition audio.h:1193
@ BGM_COMP_START_LOOP
Definition audio.h:217
u8 writingCustomEnvelope
Definition audio.h:1192
SegData * compActiveLoopEndPos[4]
Definition audio.h:1179
SegData * compLoopStartLabels[32]
Definition audio.h:1178
Instrument * ins
Definition audio.h:1125
u8 compLoopDepth
Definition audio.h:1191
Instrument * instrument
Definition audio.h:1082
s32 proxMixValue
Definition audio.h:1181
u8 proxMixVolume
Definition audio.h:1183
void au_bgm_clear_custom_note_press(BGMPlayer *player, s32 index)
Definition bgm_player.c:817

Referenced by au_bgm_player_audio_frame_update(), and au_bgm_process_init_song().

◆ au_bgm_clear_custom_note_press()

void au_bgm_clear_custom_note_press ( BGMPlayer * player,
s32 index )

Definition at line 817 of file bgm_player.c.

817 {
818 s32 i;
819 u16* pos = player->customPressEnvelopes[index];
820 player->customEnvelopeWritePos[index] = 0;
821
822 for (i = 0; i < 9; i++) {
823 *pos++ = 0xFF00;
824 }
825}
s16 customPressEnvelopes[8][9]
Definition audio.h:1185

Referenced by au_bgm_player_initialize(), and au_BGMCmd_FF_Special().

◆ au_bgm_set_tick_resolution()

void au_bgm_set_tick_resolution ( BGMPlayer * player,
s32 mBeatsPerMinute,
u32 ticksPerBeat )

Definition at line 827 of file bgm_player.c.

827 {
828 // compute how many audio frames before the next tick
830
831 // Clamp samples per tick to stay in a valid range
832 if (mFramesPerTick > 500000) {
833 mFramesPerTick = 500000;
834 } else if (mFramesPerTick < 80000) {
835 mFramesPerTick = 80000;
836 }
837
838 // Clamp to sample rate
841 }
842
843 // breakdown of units:
844 //
845 // tickUpdateInterval / nextUpdateStep = framesPerTick
846 //
847 // 1000 x frames beat min frames
848 // ------------- x ------ x --------------- = ------
849 // min tick 1000 x beat tick
850
854
856}
#define BGM_MFRAMES_PER_MINUTE
Definition audio.h:86
u16 maxTempo
Definition audio.h:1188
s32 tickUpdateInterval
update counter amount to add per audio frame
Definition audio.h:1142
#define BGM_UPDATE_SCALE
Definition audio.h:81

Referenced by au_bgm_begin_video_frame(), au_bgm_player_init(), and au_bgm_process_init_song().

◆ au_bgm_player_read_composition()

void au_bgm_player_read_composition ( BGMPlayer * player)

Definition at line 859 of file bgm_player.c.

859 {
860 u16 continueReading = true;
861 u32 cmd;
862
863 player->masterTempoStep = 0;
864 player->masterTempoTicks = 0;
865
866 while (continueReading) {
867 cmd = *player->compReadPos++;
868 if (cmd == BGM_COMP_END) {
870 continueReading = false;
871 } else {
872 switch (cmd >> 12) {
873 case BGM_COMP_PLAY_PHRASE << 16:
874 au_bgm_load_phrase(player, cmd);
876 continueReading = false;
877 break;
878 case BGM_COMP_START_LOOP << 16:
879 break;
880 case BGM_COMP_WAIT << 16:
881 continueReading = false;
882 break;
883 case BGM_COMP_END_LOOP << 16:
885 break;
887 if (!(player->conditionalLoopFlags & 1)) {
889 }
890 break;
892 if (player->conditionalLoopFlags & 1) {
894 }
895 break;
896 default:
897 continueReading = false;
898 break;
899 }
900 }
901 }
902}
@ BGM_COMP_PLAY_PHRASE
Definition audio.h:216
@ BGM_COMP_END
Definition audio.h:215
@ BGM_COMP_END_COND_LOOP_FALSE
Definition audio.h:220
@ BGM_COMP_END_COND_LOOP_TRUE
Definition audio.h:221
@ BGM_COMP_WAIT
Definition audio.h:218
@ BGM_COMP_END_LOOP
Definition audio.h:219
void au_bgm_load_phrase(BGMPlayer *player, u32 cmd)
Definition bgm_player.c:939
void au_bgm_end_composition_loop(BGMPlayer *player, u32 cmd)
Definition bgm_player.c:904

Referenced by au_bgm_player_audio_frame_update().

◆ au_bgm_end_composition_loop()

void au_bgm_end_composition_loop ( BGMPlayer * player,
u32 cmd )

Definition at line 904 of file bgm_player.c.

904 {
905 s32 labelIndex = cmd & 0x1F; // 01F (bits 0-4)
906 s32 iterCount = (cmd >> 5) & 0x7F; // FE0 (bits 5-11)
907 u32 depth;
908
909 depth = player->compLoopDepth;
910 if (player->compActiveLoopEndPos[depth] != nullptr) {
911 if (player->compActiveLoopEndPos[depth] == player->compReadPos) {
912 if (player->compLoopCounters[depth] != 0) {
913 player->compLoopCounters[depth]--;
914 if ((player->compLoopCounters[depth]) == 0) {
915 player->compActiveLoopEndPos[depth] = nullptr;
916 if (depth > 0) {
917 depth--;
918 }
919 } else {
920 player->compReadPos = player->compLoopStartLabels[labelIndex];
921 }
922 } else {
923 player->compReadPos = player->compLoopStartLabels[labelIndex];
924 }
925 } else if (depth < 4) {
926 depth++;
927 player->compActiveLoopEndPos[depth] = player->compReadPos;
928 player->compLoopCounters[depth] = iterCount;
929 player->compReadPos = player->compLoopStartLabels[labelIndex];
930 }
931 } else {
932 player->compActiveLoopEndPos[depth] = player->compReadPos;
933 player->compLoopCounters[depth] = iterCount;
934 player->compReadPos = player->compLoopStartLabels[labelIndex];
935 }
936 player->compLoopDepth = depth;
937}

Referenced by au_bgm_player_read_composition().

◆ au_bgm_load_phrase()

void au_bgm_load_phrase ( BGMPlayer * player,
u32 cmd )

Definition at line 939 of file bgm_player.c.

939 {
942 s32* trackList;
944 s32 count;
945 s32 curVoice;
947 s32 i;
948
949 curVoice = 0;
950 bFoundLinkedTrack = false;
951 player->phraseStartPos = AU_FILE_RELATIVE(player->compStartPos, (cmd & 0xFFFF) << 2);
952 trackList = player->phraseStartPos;
953 for (i = 0; i < ARRAY_COUNT(player->tracks); i++) {
954 track = &player->tracks[i];
955 trackInfo = *trackList++;
956 track->bgmReadPos = (AuFilePos) (trackInfo >> 0x10);
957 if (track->bgmReadPos != nullptr) {
958 if ((trackInfo & 0x100) == 0) {
959 track->polyphonicIdx = (trackInfo & (0x7 << 0xD)) >> 0xD;
960 track->isDrumTrack = (trackInfo >> 7) & 1;
961 linkedID = (trackInfo & (0xF << 9)) >> 9;
962 track->linkedTrackID = 0;
963 if (linkedID != 0) {
964 BGMPlayerTrack* linkedTrack = &player->tracks[linkedID - 1];
965 if ((linkedID - 1) < i) {
966 track->polyVoiceCount = linkedTrack->polyVoiceCount;
967 track->firstVoice = linkedTrack->firstVoice;
968 track->lastVoice = linkedTrack->lastVoice;
969
970 track->bgmReadPos = (track->bgmReadPos + (s32)player->phraseStartPos);
971 track->delayTime = 1;
972
973 track->linkedTrackID = linkedID;
974 if (player->initLinkMute) {
975 track->muted = true;
976 }
977 bFoundLinkedTrack = true;
978 } else {
979 track->bgmReadPos = nullptr;
980 }
981 } else {
982 count = player->polyphonyCounts[track->polyphonicIdx];
983 track->polyVoiceCount = count;
984 track->firstVoice = curVoice;
985 curVoice += count;
986 track->lastVoice = curVoice;
987
988 track->bgmReadPos = (track->bgmReadPos + (s32)player->phraseStartPos);
989 track->delayTime = 1;
990 }
991 } else {
992 track->bgmReadPos = nullptr;
993 }
994 }
995 }
996 player->totalVoices = curVoice;
997 if (bFoundLinkedTrack) {
998 player->initLinkMute = false;
999 }
1000}
u8 polyVoiceCount
Definition audio.h:1109
AuFilePos bgmReadPos
Definition audio.h:1079
u8 * AuFilePos
Definition audio.h:11
u8 totalVoices
Definition audio.h:1195

Referenced by au_bgm_player_read_composition().

◆ au_bgm_player_update_stop()

void au_bgm_player_update_stop ( BGMPlayer * player)

Definition at line 1002 of file bgm_player.c.

1002 {
1003 s32 i;
1004
1005 player->paused = false;
1006 player->songName = 0;
1007 player->pushSongName = 0;
1008 player->unk_58 = 0;
1009 player->unk_5A = 0;
1010 for (i = 0; i < ARRAY_COUNT(player->tracks); i++) {
1011 player->tracks[i].bgmReadPos = nullptr;
1012 }
1016}

Referenced by au_bgm_player_audio_frame_update().

◆ au_bgm_player_update_playing()

void au_bgm_player_update_playing ( BGMPlayer * player)

play next tick

Definition at line 1027 of file bgm_player.c.

1027 {
1029 u8 sp1F;
1030 s16 notePitch;
1031 u8 bFinished;
1032
1033 AuVoice* voice;
1036 SeqNote* note;
1037 s32 temp;
1040 u8 opcode;
1043 u32 i;
1044 u8 voiceIdx;
1045 bVolumeFading = false;
1046 bFinished = false;
1047
1048 if (player->masterTempoTicks != 0) {
1049 player->masterTempoTicks--;
1050 if (player->masterTempoTicks == 0) {
1051 player->masterTempo = player->masterTempoTarget;
1052 player->masterTempoTarget = 0;
1053 player->masterTempoStep = 0;
1054 } else {
1055 player->masterTempo += player->masterTempoStep;
1056 }
1058 }
1059 if (player->masterVolumeTicks != 0) {
1060 player->masterVolumeTicks--;
1061 if (player->masterVolumeTicks == 0) {
1062 player->masterVolume = player->masterVolumeTarget;
1063 player->masterVolumeTarget = 0;
1064 player->masterVolumeStep = 0;
1065 } else {
1066 player->masterVolume += player->masterVolumeStep;
1067 }
1068 bVolumeFading = true;
1069 }
1070 player->volumeChanged = false;
1071 if (player->trackVolsConfig != nullptr) {
1072 if (player->bFadeConfigSetsVolume) {
1073 // setting track volumes
1074 s32 lenLimit = 16;
1075 while (lenLimit-- != 0) {
1076 i = *player->trackVolsConfig++;
1077 if (i == 0) {
1078 break;
1079 }
1080 track = &player->tracks[i - 1];
1081 player->seqCmdArgs.TrackVolumeFade.time = 48;
1082 player->seqCmdArgs.TrackVolumeFade.value = *(player->trackVolsConfig++);
1083 if (track->bgmReadPos != 0) {
1085 }
1086 }
1087 }
1088 else {
1089 // clearing track volumes
1090 s32 lenLimit = 16;
1091 while (lenLimit-- != 0) {
1092 i = *player->trackVolsConfig++;
1093 if (i == 0) {
1094 break;
1095 }
1096 track = &player->tracks[i - 1];
1097 player->seqCmdArgs.TrackVolumeFade.time = 48;
1098 player->trackVolsConfig++; // ignore arg
1099 player->seqCmdArgs.TrackVolumeFade.value = 0;
1100 if (track->bgmReadPos != 0) {
1102 }
1103 }
1104 }
1105 player->trackVolsConfig = nullptr;
1106 player->bFadeConfigSetsVolume = false;
1107 }
1108 for (i = 0; i < ARRAY_COUNT(player->tracks); i++) {
1109 track = &player->tracks[i];
1110 if (track->bgmReadPos != nullptr) {
1111 track->changed.all = 0;
1112 if (bVolumeFading || player->volumeChanged) {
1113 track->changed.volume = true;
1114 } else {
1115 track->changed.volume = false;
1116 }
1117 if (track->insVolumeTicks != 0) {
1118 track->insVolumeTicks--;
1119 if (track->insVolumeTicks == 0) {
1120 track->insVolume = track->insVolumeTarget;
1121 } else {
1122 track->insVolume += track->insVolumeStep;
1123 }
1124 track->changed.volume = true;
1125 }
1126 if (track->proxVolumeTicks != 0) {
1127 track->proxVolumeTicks--;
1128 if (track->proxVolumeTicks == 0) {
1129 track->proxVolume = track->proxVolumeTarget << 16;
1130 } else {
1131 track->proxVolume += track->proxVolumeStep;
1132 }
1133 track->changed.volume = true;
1134 }
1135 track->delayTime--;
1136 if (track->delayTime <= 0) {
1137 sp1F = track->firstVoice;
1138 while (track->delayTime == 0) {
1139 opcode = *(track->bgmReadPos++);
1140 POST_BGM_READ();
1141
1142 if (opcode < 0x80) {
1143 if (opcode == 0) {
1144 if (track->prevReadPos != 0) {
1145 track->bgmReadPos = track->prevReadPos;
1146 track->prevReadPos = 0;
1147 } else {
1148 bFinished = true;
1149 break;
1150 }
1151 } else {
1152 if (opcode >= 0x78) {
1153 // long delay
1154 track->delayTime = (((opcode & 7) << 8) + *(track->bgmReadPos++)) + 0x78;
1155 POST_BGM_READ();
1156
1157 } else {
1158 // delay
1159 track->delayTime = opcode;
1160 }
1161 }
1162 } else {
1163 // note
1164 if (opcode < 0xD4) {
1165 notePitch = (opcode & 0x7F);
1166 noteVelocity = *(track->bgmReadPos++);
1167 POST_BGM_READ();
1168 noteLength = *(track->bgmReadPos++);
1169 POST_BGM_READ();
1170 if (!(noteLength < 0xC0)) {
1171 noteLength = (((u8)noteLength & ~0xC0) << 8) + *(track->bgmReadPos++) + 0xC0;
1172 POST_BGM_READ();
1173 }
1174 bAcquiredVoiceIdx = false;
1175 if (!track->muted) {
1176 // find first free voice
1177 for (voiceIdx = sp1F; voiceIdx < track->lastVoice; voiceIdx++) {
1178 voice = &player->globals->voices[voiceIdx];
1179 sp1F++;
1180 if (voice->priority == AU_PRIORITY_FREE) {
1181 bAcquiredVoiceIdx = true;
1182 break;
1183 }
1184 }
1185
1186 if (!bAcquiredVoiceIdx) {
1187 if (track->polyphonicIdx >= BGM_POLYPHONY_2) {
1188 // try stealing a voice with lower priority
1189 for (voiceIdx = track->firstVoice; voiceIdx < track->lastVoice; voiceIdx++) {
1190 voice = &player->globals->voices[voiceIdx];
1191 if (voice->priority < player->priority) {
1193 bAcquiredVoiceIdx = true;
1194 break;
1195 }
1196 }
1197 // try stealing a voice with equal priority and zero note length
1198 if (!bAcquiredVoiceIdx) {
1199 for (voiceIdx = track->firstVoice; voiceIdx < track->lastVoice; voiceIdx++) {
1200 voice = &player->globals->voices[voiceIdx];
1201 if (voice->priority == player->priority) {
1202 note = &player->notes[voiceIdx];
1203 if (note->length == 0) {
1205 bAcquiredVoiceIdx = true;
1206 break;
1207 }
1208 }
1209 }
1210 }
1211 // try stealing a voice with equal priority and lowest note length
1212 if (!bAcquiredVoiceIdx) {
1213 s32 shortestLength = 0xFFFF;
1214 u8 voice_it;
1215 AuVoice* curVoice;
1217 for (voice_it = track->firstVoice; voice_it < track->lastVoice; voice_it++) {
1218 curVoice = &player->globals->voices[voice_it];
1219 if (curVoice->priority == player->priority) {
1220 curNote = &player->notes[voice_it];
1221 if (!curNote->pendingTick && curNote->length < shortestLength) {
1223 voice = curVoice;
1224 note = curNote;
1226 bAcquiredVoiceIdx = true;
1227 }
1228 }
1229 }
1230 if (bAcquiredVoiceIdx) {
1231 note->length = 0;
1233 }
1234 }
1235
1236 } else {
1237 voiceIdx = track->firstVoice;
1238 voice = &player->globals->voices[voiceIdx];
1239 note = &player->notes[voiceIdx];
1240 note->length = 0;
1241 if (voice->priority <= player->priority) {
1243 bAcquiredVoiceIdx = true;
1244 }
1245 }
1246 }
1247 }
1248 if (bAcquiredVoiceIdx) {
1249 note = &player->notes[voiceIdx];
1250 note->tremoloDepth = 0;
1251 if (noteVelocity > 0) {
1252 note->velocity = noteVelocity + 1;
1253 } else {
1254 note->velocity = 0;
1255 }
1256 note->length = noteLength;
1257 if (track->isDrumTrack) {
1258 if (notePitch < 72) { // = 6 * 12
1259 drumInfo = &player->globals->dataPER->drums[notePitch];
1260 } else {
1261 drumInfo = player->drums[notePitch - 72]; // = 6 * 12
1262 }
1263 note->ins = au_get_instrument(player->globals, drumInfo->bankPatch >> 8, drumInfo->bankPatch & 0xFF, &voice->envelope);
1264 if (drumInfo->randVolume != 0) {
1265 note->volume = note->velocity * au_bgm_get_random_vol(player->randomValue1, drumInfo->volume, drumInfo->randVolume);
1266 } else {
1267 note->volume = note->velocity * drumInfo->volume;
1268 }
1269 // combining formats: 7.24 * 7.24 * 15.16 * 7.0 * 15.0 --> 16.16
1270 // first step, shifting fractional factors by 21:
1271 // 7.24 * 7.24 * 15.16 --> 7.3 * 7.3 * 10.0 --> 24.6
1272 // shifting this down by 20 transforms 24.6 --> 10.0
1273 // now for the second step with whole:
1274 // 10.0 * 7.0 * 15.0 --> 32.0
1275 // and a final shift by 16 transforms 32.0 --> 16.16
1276 voice->clientVolume = ((
1277 ((player->masterVolume >> 21) // 7.24 --> 7.3
1278 * (track->insVolume >> 21) // 7.24 --> 7.3
1279 * (track->proxVolume >> 21)) >> 20) // 15.16 --> 10.0 (fractional part truncated?)
1280 * (track->volume * note->volume)) >> 16;
1281 note->detune =
1282 drumInfo->keyBase
1283 + track->insCoarseDetune
1284 + track->insFineDetune
1285 - note->ins->keyBase;
1286 temp = (note->detune + track->detune) + player->detune;
1287 if (drumInfo->randTune != 0) {
1288 note->randDetune = au_bgm_get_random_pitch(player->randomValue1, temp, drumInfo->randTune);
1289 temp = note->randDetune;
1290 }
1291 note->pitchRatio = au_compute_pitch_ratio(temp) * note->ins->pitchRatio;
1292 if (drumInfo->randPan != 0) {
1293 voice->pan = au_bgm_get_random_pan(player, drumInfo->pan, drumInfo->randPan);
1294 } else {
1295 voice->pan = drumInfo->pan;
1296 }
1297 if (drumInfo->randReverb != 0) {
1298 voice->reverb = au_bgm_get_random_reverb(player->randomValue1, drumInfo->reverb, drumInfo->randReverb);
1299 } else {
1300 voice->reverb = drumInfo->reverb;
1301 }
1302 } else {
1303 // combining formats: 7.24 * 7.24 * 15.16 * 7.0 * 15.0 --> 16.16
1304 // first step, shifting fractional factors by 21:
1305 // 7.24 * 7.24 * 15.16 --> 7.3 * 7.3 * 10.0 --> 24.6
1306 // shifting this down by 20 transforms 24.6 --> 10.0
1307 // now for the second step with whole:
1308 // 10.0 * 7.0 * 7.0 --> 24.0
1309 // and a final shift by 9 transforms 24.0 --> 15.16
1310 voice->clientVolume = note->volume = ((
1311 ((player->masterVolume >> 21) // 7.24 --> 7.3
1312 * (track->insVolume >> 21) // 7.24 --> 7.3
1313 * (track->proxVolume >> 21)) >> 20) // 15.16 --> 10.0 (fractional part truncated?)
1314 * (track->volume * note->velocity)) >> 9;
1315 note->ins = track->instrument;
1316 note->detune =
1317 (notePitch * 100)
1318 + track->insCoarseDetune
1319 + player->masterPitchShift
1320 + track->insFineDetune
1321 - note->ins->keyBase;
1322 note->pitchRatio = au_compute_pitch_ratio(
1323 note->detune
1324 + track->detune
1325 + player->detune)
1326 * track->instrument->pitchRatio;
1327
1328 if (track->randomPanAmount != 0) {
1329 voice->pan = au_bgm_get_random_pan(player, track->insPan, track->randomPanAmount);
1330 } else {
1331 voice->pan = track->insPan;
1332 }
1333 voice->reverb = track->insReverb;
1334
1335 if (track->pressOverride != 0) {
1336 voice->envelope.cmdListPress = (u8*) player->customPressEnvelopes[track->pressOverride - 1];
1337 } else {
1338 voice->envelope.cmdListPress = track->envelope.cmdListPress;
1339 }
1340 voice->envelope.cmdListRelease = track->envelope.cmdListRelease;
1341 }
1342 voice->instrument = note->ins;
1343 voice->pitchRatio = note->pitchRatio;
1344 voice->busID = track->busID;
1345 if (note->length > 1) {
1346 note->pendingTick = true;
1347 note->tremoloDepth = track->tremoloDepth;
1348 note->tremoloPhase = 0;
1349 note->tremoloDelay = track->tremoloDelay;
1350 voice->syncFlags = AU_VOICE_SYNC_FLAG_ALL;
1351 voice->priority = player->priority;
1352 voice->clientPriority = voice->priority;
1353 }
1354 }
1355 } else {
1356 //TODO variable is nargs, but reusing temp is required to match
1357 temp = SeqCmdArgCounts[opcode - 0xE0];
1358 if (temp != 0) {
1359 player->seqCmdArgs.raw[0] = *(track->bgmReadPos++);
1360 POST_BGM_READ();
1361 } else {
1362 goto bgm_args_done;
1363 }
1364 if (temp > 1) {
1365 player->seqCmdArgs.raw[1] = *(track->bgmReadPos++);
1366 POST_BGM_READ();
1367 } else {
1368 goto bgm_args_done;
1369 }
1370 if (temp > 2) {
1371 player->seqCmdArgs.raw[2] = *(track->bgmReadPos++);
1372 POST_BGM_READ();
1373 } else {
1374 goto bgm_args_done;
1375 }
1376 if (temp > 3) {
1377 player->seqCmdArgs.raw[3] = *(track->bgmReadPos++);
1378 POST_BGM_READ();
1379 }
1382 CurrentSeqCmdHandler(player, track);
1383 }
1384 }
1385 } // end while
1386 }
1387
1388 for (voiceIdx = track->firstVoice; voiceIdx < track->lastVoice; voiceIdx++) {
1389 if (!track->muted) {
1390 voice = &player->globals->voices[voiceIdx];
1391 if (voice->priority == player->priority) {
1392 note = &player->notes[voiceIdx];
1393 if (!note->pendingTick) {
1394 if (note->length > 0) {
1395 note->length--;
1396 if (note->length == 0) {
1397 voice->envelopeFlags |= AU_VOICE_ENV_FLAG_KEY_RELEASED;
1398 }
1399 }
1400 if (track->isDrumTrack) {
1401 if (track->changed.tune || (player->detune != 0)) {
1402 note->pitchRatio = au_compute_pitch_ratio(((note->detune + note->randDetune) + track->detune) + player->detune) * note->ins->pitchRatio;
1403 if (voice->pitchRatio != note->pitchRatio) {
1404 voice->pitchRatio = note->pitchRatio;
1405 voice->syncFlags |= AU_VOICE_SYNC_FLAG_PITCH;
1406 }
1407 }
1408 if (track->changed.volume) {
1409 // combining formats: 7.24 * 7.24 * 15.16 * 7.0 * 15.0 --> 16.16
1410 // first step, shifting fractional factors by 21:
1411 // 7.24 * 7.24 * 15.16 --> 7.3 * 7.3 * 10.0 --> 24.6
1412 // shifting this down by 20 transforms 24.6 --> 10.0
1413 // now for the second step with whole:
1414 // 10.0 * 7.0 * 15.0 --> 32.0
1415 // and a final shift by 16 transforms 32.0 --> 16.16
1416 voice->clientVolume = (
1417 ((((player->masterVolume >> 21) // 7.24 --> 7.3
1418 * (track->insVolume >> 21)) // 7.24 --> 7.3
1419 * (track->proxVolume >> 21)) >> 20) // 15.16 --> 10.0 (fractional part truncated?)
1420 * (track->volume * note->volume)) >> 16;
1421 voice->envelopeFlags |= AU_VOICE_ENV_FLAG_VOL_CHANGED;
1422 }
1423 } else {
1424 // Modulate pitch using a triange wave for tremolo effect
1425 if (note->tremoloDepth != 0) {
1426 if (note->tremoloDelay != 0) {
1427 note->tremoloDelay--;
1428 } else {
1429 u8 quadrant;
1430 note->tremoloPhase += track->tremoloRate;
1431 opcode = (note->tremoloPhase << 2) + 3; // +3 just to fill lower 2 bits
1432
1433 // Determine what part of the triangle wave we are in (using top 2 bits of u8)
1434 quadrant = note->tremoloPhase >> 6;
1435
1436 // Invert the triangle for quadrants 1 and 3 (ugly code required to match)
1437 /* visualized: //// --> /\/\ */
1438 if ((quadrant == 1) || (quadrant == 3)) {
1439 u8 temp2 = ~opcode;
1440 tremoloDetune = temp2 + 1;
1441 } else {
1443 }
1444
1445 // Scale by depth
1446 tremoloDetune = (tremoloDetune * track->tremoloDepth) >> 8;
1447
1448 // Invert sign for the second half of triangle wave
1449 if ((quadrant == 2) || (quadrant == 3)) {
1451 }
1452
1453 // Apply pitch detune from tremolo
1454 note->pitchRatio = au_compute_pitch_ratio(tremoloDetune + ((note->detune + track->detune) + player->detune)) * note->ins->pitchRatio;
1455 if (voice->pitchRatio != note->pitchRatio) {
1456 voice->pitchRatio = note->pitchRatio;
1457 voice->syncFlags |= AU_VOICE_SYNC_FLAG_PITCH;
1458 }
1459 }
1460 } else if (track->changed.tune || (player->detune != 0)) {
1461
1462 note->pitchRatio = au_compute_pitch_ratio((note->detune + track->detune) + player->detune) * note->ins->pitchRatio;
1463 if (voice->pitchRatio != note->pitchRatio) {
1464 voice->pitchRatio = note->pitchRatio;
1465 voice->syncFlags |= AU_VOICE_SYNC_FLAG_PITCH;
1466 }
1467 }
1468 if (track->changed.volume) {
1469 // combining formats: 7.24 * 7.24 * 15.16 * 7.0 * 15.0 --> 16.16
1470 // first step, shifting fractional factors by 21:
1471 // 7.24 * 7.24 * 15.16 --> 7.3 * 7.3 * 10.0 --> 24.6
1472 // shifting this down by 20 transforms 24.6 --> 10.0
1473 // now for the second step with whole:
1474 // 10.0 * 7.0 * 7.0 --> 24.0
1475 // and a final shift by 9 transforms 24.0 --> 15.16
1476 note->volume = ((
1477 (player->masterVolume >> 21) // 7.24 --> 7.3
1478 * (track->insVolume >> 21) // 7.24 --> 7.3
1479 * (track->proxVolume >> 21)) >> 20)
1480 * (track->volume * note->velocity) >> 9;
1481 voice->clientVolume = note->volume;
1482 voice->envelopeFlags |= AU_VOICE_ENV_FLAG_VOL_CHANGED;
1483 voice->pan = track->insPan;
1484 voice->reverb = track->insReverb;
1485 } else if (track->changed.pan || track->changed.reverb) {
1486 voice->pan = track->insPan;
1487 voice->reverb = track->insReverb;
1488 voice->syncFlags |= AU_VOICE_SYNC_FLAG_PAN_FXMIX;
1489 }
1490 }
1491 }
1492 note->pendingTick = false;
1493 }
1494 }
1495 }
1496 }
1497 }
1498
1499 if (bFinished) {
1501 }
1502}
#define BGM_TEMPO_TO_UPDATE_UNITS(tempo)
Definition audio.h:100
s8 volumeChanged
Current write position for each custom envelope.
Definition audio.h:1194
AuVoice voices[24]
Definition audio.h:1075
u8 raw[4]
Definition audio.h:407
BGMDrumInfo drums[12]
Definition audio.h:981
@ 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
struct SeqArgs::@77 TrackVolumeFade
u8 tremoloDepth
Definition audio.h:1131
PEREntry * dataPER
Definition audio.h:1045
@ AU_PRIORITY_FREE
Definition audio.h:133
@ AU_VOICE_ENV_FLAG_KEY_RELEASED
Definition audio.h:143
@ AU_VOICE_ENV_FLAG_VOL_CHANGED
Definition audio.h:144
u8 priority
Definition audio.h:865
u8 SeqCmdArgCounts[]
Definition sfx_player.c:272
#define POST_BGM_READ()
BSS void(* CurrentSeqCmdHandler)(BGMPlayer *, BGMPlayerTrack *)
Definition bgm_player.c:4
void(* SeqCmdHandlers[])(BGMPlayer *, BGMPlayerTrack *)
Definition sfx_player.c:237
void au_BGMCmd_F6_InstrumentVolumeLerp(BGMPlayer *player, BGMPlayerTrack *track)
void au_reset_voice(AuVoice *voice, u8 voiceIdx)
Definition engine.c:397
f32 au_compute_pitch_ratio(s32 tuning)
Converts a linear pitch value (in cents) into a frequency ratio suitable for adjusting playback speed...
Definition engine.c:410
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 ...
Definition engine.c:506

Referenced by au_bgm_player_audio_frame_update().

◆ au_BGMCmd_E0_MasterTempo()

void au_BGMCmd_E0_MasterTempo ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1505 of file bgm_player.c.

1505 {
1506 u32 bpm = player->seqCmdArgs.MasterTempo.value;
1507 s32 tempo;
1508
1509 player->masterTempoBPM = bpm;
1510 tempo = au_bgm_bpm_to_tempo(player, bpm);
1511 player->masterTempo = tempo;
1513 player->masterTempoTicks = 0;
1514 player->masterTempoTarget = 0;
1515 player->masterTempoStep = 0;
1516}
struct SeqArgs::@57 MasterTempo

◆ au_BGMCmd_E1_MasterVolume()

void au_BGMCmd_E1_MasterVolume ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1533 of file bgm_player.c.

1533 {
1534 s8_24 volume = player->seqCmdArgs.MasterVolume.value & 0x7F;
1535
1536 if (volume != 0) {
1537 volume = volume << 24;
1538 }
1539
1540 player->masterVolume = volume;
1541 player->masterVolumeTicks = 0;
1542 player->masterVolumeTarget = 0;
1543 player->masterVolumeStep = 0;
1544 player->volumeChanged = true;
1545 track->changed.volume = true;
1546}
struct SeqArgs::@58 MasterVolume
s32 s8_24
Definition audio.h:8

◆ au_BGMCmd_E2_MasterDetune()

void au_BGMCmd_E2_MasterDetune ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1548 of file bgm_player.c.

1548 {
1549 player->masterPitchShift = (s8)player->seqCmdArgs.MasterPitchShift.cent * 100;
1550}
struct SeqArgs::@59 MasterPitchShift

◆ au_BGMCmd_E3()

void au_BGMCmd_E3 ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1552 of file bgm_player.c.

1552 {
1553 player->globals->effectChanges[player->busID].type = player->seqCmdArgs.UnkCmdE3.effectType;
1554 player->globals->effectChanges[player->busID].changed = true;
1555}
struct SeqArgs::@60 UnkCmdE3
AuEffectChange effectChanges[4]
copied from INIT to the audio heap, seems to exist only to find SEF, PER, and PRG
Definition audio.h:1040

◆ au_BGMCmd_E6_MasterEffect()

void au_BGMCmd_E6_MasterEffect ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1557 of file bgm_player.c.

1557 {
1558 u8 index = player->seqCmdArgs.MasterEffect.index;
1559 u32 busID = player->effectIndices[index];
1560
1561 if ((index < 4) && (busID < 0x80)) {
1562 if (player->globals->effectChanges[busID].type != player->seqCmdArgs.MasterEffect.value) {
1563 player->globals->effectChanges[busID].type = player->seqCmdArgs.MasterEffect.value;
1564 player->globals->effectChanges[busID].changed = true;
1565 }
1566 player->effectValues[index] = player->seqCmdArgs.MasterEffect.value;
1567 }
1568}

Referenced by au_bgm_restore_copied_player().

◆ au_BGMCmd_E4_MasterTempoFade()

void au_BGMCmd_E4_MasterTempoFade ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1570 of file bgm_player.c.

1570 {
1571 s32 time = player->seqCmdArgs.MasterTempoFade.time;
1572 s32 tempo = au_bgm_bpm_to_tempo(player, player->seqCmdArgs.MasterTempoFade.value);
1573
1574 if (time <= 0) {
1575 time = 1;
1576 }
1577
1578 player->masterTempoTicks = time;
1579 player->masterTempoTarget = tempo;
1580 player->masterTempoStep = (tempo - player->masterTempo) / time;
1581}
struct SeqArgs::@61 MasterTempoFade

◆ au_BGMCmd_E5_MasterVolumeFade()

void au_BGMCmd_E5_MasterVolumeFade ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1583 of file bgm_player.c.

1583 {
1584 s32 time = player->seqCmdArgs.MasterVolumeFade.time;
1585 s8_24 volume = player->seqCmdArgs.MasterVolumeFade.value & 0x7F;
1586
1587 if (volume != 0) {
1588 volume = volume << 24;
1589 }
1590
1591 if (time <= 0) {
1592 time = 1;
1593 }
1594
1595 player->masterVolumeTicks = time;
1596 player->masterVolumeTarget = volume;
1597 player->masterVolumeStep = (volume - player->masterVolume) / time;
1598}
struct SeqArgs::@62 MasterVolumeFade

◆ au_BGMCmd_E8_TrackOverridePatch()

void au_BGMCmd_E8_TrackOverridePatch ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1600 of file bgm_player.c.

1600 {
1601 track->patch = player->seqCmdArgs.OverridePatch.patch;
1602 track->instrument = au_get_instrument(player->globals, player->seqCmdArgs.OverridePatch.bank, track->patch, &track->envelope);
1603}
struct SeqArgs::@64 OverridePatch

◆ au_BGMCmd_E9_InstrumentVolume()

void au_BGMCmd_E9_InstrumentVolume ( BGMPlayer * arg0,
BGMPlayerTrack * track )

Definition at line 1605 of file bgm_player.c.

1605 {
1606 s8_24 volume = arg0->seqCmdArgs.InstrumentVolume.value & 0x7F;
1607
1608 if (volume != 0) {
1609 volume = volume << 24;
1610 }
1611
1612 track->insVolume = volume;
1613 track->changed.volume = true;
1614}

Referenced by au_bgm_set_linked_tracks().

◆ au_BGMCmd_F6_InstrumentVolumeLerp()

void au_BGMCmd_F6_InstrumentVolumeLerp ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1616 of file bgm_player.c.

1616 {
1617 s32 time = player->seqCmdArgs.TrackVolumeFade.time;
1618 s8_24 volume = player->seqCmdArgs.TrackVolumeFade.value & 0x7F;
1619
1620 if (volume != 0) {
1621 volume = volume << 24;
1622 }
1623
1624 if (volume != track->insVolume) {
1625 if (time <= 0) {
1626 time = 1;
1627 }
1628
1629 track->insVolumeTicks = time;
1630 track->insVolumeTarget = volume;
1631 track->insVolumeStep = (volume - track->insVolume) / time;
1632 }
1633}

Referenced by au_bgm_change_track_volume(), au_bgm_player_update_playing(), and au_bgm_set_linked_tracks().

◆ au_BGMCmd_EA_InstrumentPan()

void au_BGMCmd_EA_InstrumentPan ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1635 of file bgm_player.c.

1635 {
1636 track->insPan = player->seqCmdArgs.InstrumentPan.value & 0x7F;
1637 track->randomPanAmount = 0;
1638 track->changed.pan = true;
1639}
struct SeqArgs::@66 InstrumentPan

◆ au_BGMCmd_EB_InstrumentReverb()

void au_BGMCmd_EB_InstrumentReverb ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1641 of file bgm_player.c.

1641 {
1642 track->insReverb = player->seqCmdArgs.InstrumentReverb.value & 0x7F;
1643 track->changed.reverb = true;
1644}
struct SeqArgs::@67 InstrumentReverb

◆ au_BGMCmd_EC_TrackVolume()

void au_BGMCmd_EC_TrackVolume ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1646 of file bgm_player.c.

1646 {
1647 track->volume = player->seqCmdArgs.TrackVolume.value & 0x7F;
1648 track->changed.volume = true;
1649}
struct SeqArgs::@68 TrackVolume

◆ au_BGMCmd_ED_InstrumentCoarseTune()

void au_BGMCmd_ED_InstrumentCoarseTune ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1651 of file bgm_player.c.

1651 {
1652 track->insCoarseDetune = player->seqCmdArgs.InstrumentCoarseTune.semitone * AU_SEMITONE_CENTS;
1653}
#define AU_SEMITONE_CENTS
Definition audio.h:111
struct SeqArgs::@69 InstrumentCoarseTune

◆ au_BGMCmd_EE_InstrumentFineTune()

void au_BGMCmd_EE_InstrumentFineTune ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1655 of file bgm_player.c.

1655 {
1656 track->insFineDetune = player->seqCmdArgs.InstrumentFineTune.cent;
1657}
struct SeqArgs::@70 InstrumentFineTune

◆ au_BGMCmd_EC_TrackDetune()

void au_BGMCmd_EC_TrackDetune ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1659 of file bgm_player.c.

1659 {
1660 track->detune = player->seqCmdArgs.TrackDetune.cents;
1661 track->changed.tune = true;
1662}
struct SeqArgs::@71 TrackDetune

◆ au_BGMCmd_F0_TrackTremolo()

void au_BGMCmd_F0_TrackTremolo ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1664 of file bgm_player.c.

1664 {
1665 track->tremoloDelay = player->seqCmdArgs.TrackTremolo.delay;
1666 track->tremoloRate = player->seqCmdArgs.TrackTremolo.speed;
1667 track->tremoloDepth = player->seqCmdArgs.TrackTremolo.depth;
1668}
struct SeqArgs::@72 TrackTremolo

◆ au_BGMCmd_F1_TrackTremoloRate()

void au_BGMCmd_F1_TrackTremoloRate ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1670 of file bgm_player.c.

1670 {
1671 track->tremoloRate = player->seqCmdArgs.TrackTremoloRate.value;
1672}
struct SeqArgs::@73 TrackTremoloRate

◆ au_BGMCmd_F2_TrackTremoloDepth()

void au_BGMCmd_F2_TrackTremoloDepth ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1674 of file bgm_player.c.

1674 {
1675 track->tremoloDepth = player->seqCmdArgs.TrackTremoloDepth.value;
1676}
struct SeqArgs::@74 TrackTremoloDepth

◆ au_BGMCmd_F3_TrackTremoloStop()

void au_BGMCmd_F3_TrackTremoloStop ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1678 of file bgm_player.c.

1678 {
1679 track->tremoloDepth = 0;
1680}

◆ au_BGMCmd_F4_SubTrackRandomPan()

void au_BGMCmd_F4_SubTrackRandomPan ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1682 of file bgm_player.c.

1682 {
1683 track->insPan = player->seqCmdArgs.RandomPan.pan0 & 0x7F;
1684 track->randomPanAmount = player->seqCmdArgs.RandomPan.pan1 & 0x7F;
1685}
struct SeqArgs::@75 RandomPan

◆ au_BGMCmd_F5_UseInstrument()

void au_BGMCmd_F5_UseInstrument ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1687 of file bgm_player.c.

1687 {
1688 BGMInstrumentInfo* instrument;
1689 s32 volume;
1690 u32 insIndex;
1691 u32 patch;
1692 u32 bank;
1693
1694 insIndex = player->seqCmdArgs.UseInstrument.index;
1696 if (insIndex < player->bgmInstrumentCount) {
1697 instrument = &player->instrumentsInfo[insIndex];
1698 } else {
1699 instrument = &player->globals->defaultPRGEntry;
1700 }
1701 } else {
1703 if (insIndex < PRG_MAX_COUNT) {
1704 instrument = &player->globals->dataPRG[insIndex];
1705 } else {
1706 instrument = &player->globals->defaultPRGEntry;
1707 }
1708 }
1709 bank = instrument->bankPatch >> 8;
1710 patch = (u8)instrument->bankPatch;
1711 volume = instrument->volume & 0x7F;
1712 track->patch = patch;
1713 track->instrument = au_get_instrument(player->globals, bank, patch, &track->envelope);
1714 if (volume != 0) {
1715 volume <<= 24;
1716 }
1717 track->insVolume = volume;
1718 track->insPan = instrument->pan & 0x7F;
1719 track->insReverb = instrument->reverb & 0x7F;
1720 track->insCoarseDetune = instrument->coarseTune * AU_SEMITONE_CENTS;
1721 track->insFineDetune = instrument->fineTune;
1722 track->changed.all |= 0x10101; // volume, pan, and reverb
1723}
BGMInstrumentInfo * dataPRG
Definition audio.h:1046
#define PRG_MAX_COUNT
Definition audio.h:119
BGMInstrumentInfo defaultPRGEntry
Definition audio.h:1030
struct SeqArgs::@76 UseInstrument
#define BGM_MAX_INSTRUMNETS
Definition audio.h:75

◆ au_BGMCmd_F7_ReverbType()

void au_BGMCmd_F7_ReverbType ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1725 of file bgm_player.c.

1725 {
1726 u8 index = player->seqCmdArgs.ReverbType.index;
1727 s8 busID = player->effectIndices[index];
1728
1729 if ((index < ARRAY_COUNT(player->effectIndices)) && (busID >= 0)) {
1730 track->busID = busID;
1731 } else {
1732 track->busID = player->busID;
1733 }
1734}
struct SeqArgs::@78 ReverbType

◆ au_BGMCmd_FD_EventTrigger()

void au_BGMCmd_FD_EventTrigger ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1736 of file bgm_player.c.

1736 {
1737 snd_song_trigger_music_event(player->priority, track->index, player->seqCmdArgs.EventTrigger.eventInfo >> 8);
1738}
struct SeqArgs::@80 EventTrigger
void snd_song_trigger_music_event(s32 playerID, s32 trackIndex, s32 eventInfo)

◆ au_BGMCmd_FE_Detour()

void au_BGMCmd_FE_Detour ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1741 of file bgm_player.c.

1741 {
1742 AuFilePos readPos = AU_FILE_RELATIVE(player->bgmFile, player->seqCmdArgs.Detour.offset);
1743
1744 track->detourLength = player->seqCmdArgs.Detour.length;
1745 track->savedPos = track->bgmReadPos;
1746 track->bgmReadPos = readPos;
1747}
struct SeqArgs::@81 Detour

◆ au_BGMCmd_FC_Branch()

void au_BGMCmd_FC_Branch ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1750 of file bgm_player.c.

1750 {
1751 AuFilePos args;
1752 u32 i;
1753
1754 // get jump table
1755 args = AU_FILE_RELATIVE(player->bgmFile, player->seqCmdArgs.Branch.offset);
1756 if (player->proxMixID < player->seqCmdArgs.Branch.tableCount) {
1757 args += player->proxMixID * 3;
1758 }
1759 // read new position from jump table
1760 track->prevReadPos = track->bgmReadPos;
1761 track->bgmReadPos = AU_FILE_RELATIVE(player->bgmFile, (args[0] << 8) + args[1]);
1762 track->isDrumTrack = args[2];
1763
1764 if (track->proxMixSetChanged) {
1765 track->proxMixSetChanged = false;
1766 track->proxVolume = 0;
1767 for (i = track->firstVoice; i < track->lastVoice; i++) {
1768 AuVoice* voice = &player->globals->voices[i];
1769 if ((voice->priority == player->priority) && (voice->cmdPtr != nullptr)) {
1771 }
1772 }
1773 }
1774 if (track->proxMixValChanged) {
1775 track->proxMixValChanged = false;
1776 au_bgm_set_prox_mix_fade(player, track, player->proxMixVolume, 144);
1777 }
1778 // reset an odd subset of parameters
1779 track->insCoarseDetune = 0;
1780 track->insFineDetune = 0;
1781 track->pressOverride = 0;
1782 track->detune = 0;
1783 track->tremoloDepth = 0;
1784 track->insVolumeTicks = 0;
1785 track->randomPanAmount = 0;
1786 track->busID = player->busID;
1787}
struct SeqArgs::@79 Branch
void au_bgm_set_prox_mix_fade(BGMPlayer *player, BGMPlayerTrack *track, s32 target, s32 duration)

◆ au_BGMCmd_FF_Special()

void au_BGMCmd_FF_Special ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1789 of file bgm_player.c.

1789 {
1790 u32 writePos;
1791 u8 delaySide;
1792 u8 delayTime;
1793 u32 i;
1794
1795 u32 type = player->seqCmdArgs.Special.type;
1796 u32 arg1 = player->seqCmdArgs.Special.arg1;
1797 u32 arg2 = player->seqCmdArgs.Special.arg2;
1798
1799 switch (type) {
1801 if ((arg1 < ARRAY_COUNT(player->effectIndices)) && ((s8)player->effectIndices[arg1] >= 0)) {
1802 player->globals->channelDelayBusID = player->effectIndices[arg1];
1803 if (arg2 != 0) {
1804 delayTime = arg2 & 0xF;
1805 delaySide = ((arg2 >> 4) & 1) + 1;
1806 if ((player->globals->channelDelayTime != delayTime) || (player->globals->channelDelaySide != delaySide)) {
1807 player->globals->channelDelayTime = delayTime;
1809 player->globals->channelDelayPending = true;
1810 }
1811 } else {
1814 player->globals->channelDelayPending = true;
1815 }
1816 }
1817 }
1818 break;
1820 if (arg1 - 1 < ARRAY_COUNT(player->customPressEnvelopes)) {
1821 player->writingCustomEnvelope = arg1;
1822 au_bgm_clear_custom_note_press(player, arg1 - 1);
1823 } else {
1824 player->writingCustomEnvelope = 0;
1825 }
1826 break;
1828 i = player->writingCustomEnvelope;
1829 if (i - 1 < ARRAY_COUNT(player->customPressEnvelopes)) {
1830 i--; // convert ID --> array index, needed to match
1831 writePos = player->customEnvelopeWritePos[i];
1832 if (writePos < ARRAY_COUNT(player->customPressEnvelopes[i]) - 1) {
1833 if (arg1 >= ARRAY_COUNT(BgmCustomEnvLookup)) {
1834 player->customPressEnvelopes[i][writePos] = (arg1 << 8) + arg2;
1835 } else {
1836 player->customPressEnvelopes[i][writePos] = (BgmCustomEnvLookup[arg1] << 8) + arg2;
1837 }
1838 player->customEnvelopeWritePos[i] = writePos + 1;
1839 }
1840 }
1841 break;
1843 if (arg1 <= ARRAY_COUNT(player->customPressEnvelopes)) {
1844 track->pressOverride = arg1;
1845 } else {
1846 track->pressOverride = 0;
1847 }
1848 break;
1850 if (player->soundManager != nullptr) {
1851 for (i = 0; i < ARRAY_COUNT(player->soundManager->bgmSounds); i++) {
1852 if ((player->soundManager->bgmSounds[i].index) == 0) {
1853 player->soundManager->bgmSounds[i].index = arg1;
1854 player->soundManager->bgmSounds[i].volume =
1855 ((s32)(
1856 ((u32)player->fadeInfo.baseVolume >> 16) *
1857 ((u32)player->fadeInfo.envelopeVolume >> 16)
1858 ) + AU_MAX_VOLUME_16) >> 0x17;
1859 break;
1860 }
1861 }
1862 }
1863 break;
1865 if (arg1 == 0) {
1866 if (track->proxMixValChanged) {
1867 track->proxMixValChanged = false;
1868 for (i = 0; i < ARRAY_COUNT(player->tracks); i++) {
1869 BGMPlayerTrack* otherTrack = &player->tracks[i];
1870 if (player->proxMixVolume == AU_MAX_VOLUME_8) {
1871 if (otherTrack->proxVol1 != 0) {
1873 au_bgm_set_prox_mix_fade(player, otherTrack, otherTrack->proxVol1, 72);
1874 }
1875 } else {
1876 if (otherTrack->proxVol2 != 0) {
1877 otherTrack->proxMixValChanged = false;
1878 au_bgm_set_prox_mix_fade(player, otherTrack, otherTrack->proxVol2, 72);
1879 }
1880 }
1881 }
1882 }
1883 } else {
1884 track->proxVol1 = arg1;
1885 track->proxVol2 = arg2;
1886 }
1887 break;
1888 }
1889}
u8 channelDelayPending
Definition audio.h:1041
SoundManagerMusicEvent bgmSounds[4]
Definition audio.h:800
SoundManager * soundManager
Definition audio.h:1140
u8 proxMixValChanged
Definition audio.h:1106
@ AU_DELAY_CHANNEL_NONE
Definition audio.h:241
u8 channelDelayBusID
Definition audio.h:1042
@ BGM_SPECIAL_PROX_MIX_OVERRIDE
Definition audio.h:230
@ BGM_SPECIAL_SEEK_CUSTOM_ENV
Definition audio.h:226
@ BGM_SPECIAL_USE_CUSTOM_ENV
Definition audio.h:228
@ BGM_SPECIAL_WRITE_CUSTOM_ENV
Definition audio.h:227
@ BGM_SPECIAL_TRIGGER_SOUND
Definition audio.h:229
@ BGM_SPECIAL_SET_STEREO_DELAY
Definition audio.h:225
struct SeqArgs::@82 Special
u8 channelDelaySide
Definition audio.h:1044
u8 channelDelayTime
Definition audio.h:1043
u8 BgmCustomEnvLookup[40]
Definition sfx_player.c:335

◆ au_BGMCmd_NOP()

void au_BGMCmd_NOP ( BGMPlayer * player,
BGMPlayerTrack * track )

Definition at line 1891 of file bgm_player.c.

1891 {
1892}

◆ au_bgm_set_proximity_mix()

void au_bgm_set_proximity_mix ( s32 songName,
u32 mix )

Definition at line 1971 of file bgm_player.c.

1971 {
1972 BGMPlayer* player;
1974 s32 changed = false;
1975 u8 mixID = mix & 0xFF;
1976 s32 i;
1977
1978 if (songName != 0) {
1979 player = au_bgm_get_player_with_song_name(songName);
1980 if ((player != nullptr) && (player->proxMixValue != mix)) {
1981 player->proxMixValue = mix;
1982 if (player->proxMixID != mixID) {
1983 player->proxMixID = mixID;
1984 changed = true;
1985 }
1986 player->proxMixVolume = (mix >> 0x18) & 0x7F;
1987 for (i = 0; i < ARRAY_COUNT(player->tracks); i++) {
1988 track = &player->tracks[i];
1989 if (changed) {
1990 track->proxMixSetChanged = true;
1991 }
1992 track->proxMixValChanged = true;
1993 }
1994 }
1995 }
1996}
u8 proxMixSetChanged
Definition audio.h:1105

Referenced by snd_song_set_proximity_mix_far(), snd_song_set_proximity_mix_full(), and snd_song_set_proximity_mix_near().

◆ au_bgm_set_playback_rate()

void au_bgm_set_playback_rate ( BGMPlayer * player,
f32 rate )

Definition at line 1998 of file bgm_player.c.

1998 {
1999 if (rate > 2.0) {
2000 rate = 2.0f;
2001 } else if (rate < 0.25) {
2002 rate = 0.25f;
2003 }
2004
2005 player->playbackRate = rate;
2006 player->masterTempo = au_bgm_bpm_to_tempo(player, player->masterTempoBPM);
2008 player->masterTempoTicks = 0;
2009 player->masterTempoTarget = 0;
2010 player->masterTempoStep = 0;
2011}

Referenced by snd_song_set_playback_rate().

◆ au_bgm_player_set_detune()

void au_bgm_player_set_detune ( BGMPlayer * player,
s32 detune )

Definition at line 2013 of file bgm_player.c.

2013 {
2014 if (detune > AU_OCTAVE_CENTS) {
2015 detune = AU_OCTAVE_CENTS;
2016 } else if (detune < -2 * AU_OCTAVE_CENTS) {
2017 detune = -2 * AU_OCTAVE_CENTS;
2018 }
2019
2020 player->detune = detune;
2021}
#define AU_OCTAVE_CENTS
Definition audio.h:114

Referenced by snd_song_set_detune().

◆ au_bgm_change_track_volume()

void au_bgm_change_track_volume ( BGMPlayer * player,
s32 trackIdx,
s16 time,
u8 volume )

Definition at line 2023 of file bgm_player.c.

2023 {
2024 BGMPlayerTrack* track = &player->tracks[trackIdx];
2025
2026 if (track->bgmReadPos != 0) {
2027 player->seqCmdArgs.TrackVolumeFade.time = time;
2028 player->seqCmdArgs.TrackVolumeFade.value = volume;
2030 }
2031}

◆ au_bgm_set_track_volumes()

void au_bgm_set_track_volumes ( BGMPlayer * player,
u8 * trackVols,
s32 mode )

Definition at line 2033 of file bgm_player.c.

2033 {
2034 player->trackVolsConfig = trackVols;
2035 player->bFadeConfigSetsVolume = mode;
2036}

Referenced by snd_song_clear_track_volumes(), and snd_song_set_track_volumes().

◆ au_bgm_set_prox_mix_fade()

void au_bgm_set_prox_mix_fade ( BGMPlayer * player,
BGMPlayerTrack * track,
s32 target,
s32 duration )

Definition at line 2038 of file bgm_player.c.

2038 {
2039 if (target != 0) {
2041 }
2042 if (duration <= 0) {
2043 duration = 1;
2044 } else if (duration > 1000) {
2045 duration = 1000;
2046 }
2047 if (target == track->proxVolume) {
2048 track->proxVolumeTicks = 0;
2049 return;
2050 }
2051 track->proxVolumeTicks = duration;
2052 track->proxVolumeTarget = target;
2053 track->proxVolumeStep = ((target << 0x10) - track->proxVolume) / duration;
2054}

Referenced by au_BGMCmd_FC_Branch(), and au_BGMCmd_FF_Special().

◆ au_bgm_reset_all_voices()

void au_bgm_reset_all_voices ( BGMPlayer * player)

Definition at line 2056 of file bgm_player.c.

2056 {
2057 u8 i;
2058
2059 for (i = 0; i < ARRAY_COUNT(player->globals->voices); i++) {
2060 AuVoice* voice = &player->globals->voices[i];
2061 if (voice->priority == player->priority) {
2063 }
2064 }
2065}

Referenced by au_bgm_player_initialize(), au_bgm_player_update_stop(), and au_bgm_process_suspend().

◆ au_bgm_set_linked_tracks()

AuResult au_bgm_set_linked_tracks ( SongSwapLinkedRequest * request)

Definition at line 2067 of file bgm_player.c.

2067 {
2068 BGMPlayer* player;
2071 AuVoice* voice;
2072 s32 trackIdx;
2073 s32 voiceIdx;
2074 s8 oldVolume;
2075
2076 s32 songName = request->songName;
2077 b32 enabled = request->enabled;
2078 AuResult status = AU_RESULT_OK;
2079
2080 if (songName != 0) {
2081 player = au_bgm_get_player_with_song_name(songName);
2082 if (player != nullptr) {
2083 for (trackIdx = 0; trackIdx < ARRAY_COUNT(player->tracks); trackIdx++) {
2084 track = &player->tracks[trackIdx];
2085 if (track->bgmReadPos != nullptr) {
2086 if (track->linkedTrackID != 0) {
2087 linkTrack = &player->tracks[track->linkedTrackID - 1];
2088 if (enabled) {
2089 if (track->muted) {
2090 track->muted = false;
2091 linkTrack->muted = true;
2092 // release all voices for linked track
2093 for (voiceIdx = linkTrack->firstVoice; voiceIdx < linkTrack->lastVoice; voiceIdx++) {
2094 voice = &player->globals->voices[voiceIdx];
2095 if (voice->priority == player->priority) {
2097 voice->envelopeFlags |= AU_VOICE_ENV_FLAG_KEY_RELEASED;
2098 }
2099 }
2100 // fade in main track
2101 oldVolume = track->insVolume >> 24;
2103 player->seqCmdArgs.raw[0] = 0;
2104 player->seqCmdArgs.TrackVolumeFade.time = 96;
2105 player->seqCmdArgs.TrackVolumeFade.value = oldVolume;
2107 }
2108 } else {
2109 if (!track->muted) {
2110 track->muted = true;
2111 linkTrack->muted = false;
2112 // release all voices for main track
2113 for (voiceIdx = track->firstVoice; voiceIdx < track->lastVoice; voiceIdx++) {
2114 voice = &player->globals->voices[voiceIdx];
2115 if (voice->priority == player->priority) {
2117 voice->envelopeFlags |= AU_VOICE_ENV_FLAG_KEY_RELEASED;
2118 }
2119 }
2120 // fade in linked track
2121 oldVolume = linkTrack->insVolume >> 24;
2123 player->seqCmdArgs.raw[0] = 0;
2124 player->seqCmdArgs.TrackVolumeFade.time = 96;
2125 player->seqCmdArgs.TrackVolumeFade.value = oldVolume;
2127 }
2128 }
2129 }
2130 }
2131 }
2132 } else {
2134 }
2135 } else {
2136 status = AU_ERROR_NULL_SONG_NAME;
2137 }
2138
2139 return status;
2140}
u8 * cmdListRelease
Definition audio.h:659
EnvelopeData envelope
Definition audio.h:845
u8 EnvelopeReleaseDefaultFast[]
Definition sfx_player.c:327
void au_BGMCmd_E9_InstrumentVolume(BGMPlayer *arg0, BGMPlayerTrack *track)
s32 b32

Referenced by snd_song_set_linked_mode().

Variable Documentation

◆ CurrentSeqCmdHandler

BSS void(* CurrentSeqCmdHandler) (BGMPlayer *, BGMPlayerTrack *) ( BGMPlayer * ,
BGMPlayerTrack *  )

Definition at line 4 of file bgm_player.c.

Referenced by au_bgm_player_update_playing().

◆ EnvelopeReleaseDefaultFast

u8 EnvelopeReleaseDefaultFast[]
extern

Definition at line 327 of file sfx_player.c.

327 {
329 ENV_CMD_END, 0
330};
@ ENV_CMD_END
Definition audio.h:257
@ ENV_TIME_2UNITS
Definition audio.h:353

Referenced by au_bgm_set_linked_tracks().

◆ BgmTicksRates

u8 BgmTicksRates[8]
extern

Definition at line 279 of file sfx_player.c.

279 {
280 48, 24, 32, 40, 48, 56, 64, 48,
281 0, 0, 0, 0, 0, 0, 0, 0
282};

Referenced by au_bgm_begin_video_frame(), and au_bgm_process_init_song().

◆ BgmCustomEnvLookup

u8 BgmCustomEnvLookup[40]
extern

Definition at line 335 of file sfx_player.c.

335 {
336 0x5E, 0x5D, 0x5C, 0x5B, 0x5A, 0x58, 0x56, 0x53,
337 0x51, 0x4F, 0x4A, 0x45, 0x40, 0x3B, 0x37, 0x35,
338 0x33, 0x31, 0x2F, 0x2D, 0x2B, 0x29, 0x27, 0x26,
339 0x25, 0x23, 0x21, 0x20, 0x1F, 0x1E, 0x1D, 0x1C,
340 0x1B, 0x1A, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14
341};

Referenced by au_BGMCmd_FF_Special().

◆ SefCmdHandlers

void(* SefCmdHandlers[])(SoundManager *, SoundPlayer *) ( SoundManager * ,
SoundPlayer *  )
extern

Definition at line 200 of file sfx_player.c.

200 {
201 au_SEFCmd_00_SetVolume,
202 au_SEFCmd_01_SetPan,
203 au_SEFCmd_02_SetInstrument,
204 au_SEFCmd_03_SetReverb,
205 au_SEFCmd_04_SetEnvelope,
206 au_SEFCmd_05_CoarseTune,
207 au_SEFCmd_06_FineTune,
208 au_SEFCmd_07_WaitForEnd,
209 au_SEFCmd_08_PitchSweep,
210 au_SEFCmd_09_StartLoop,
211 au_SEFCmd_0A_EndLoop,
212 au_SEFCmd_0B_WaitForRelease,
213 au_SEFCmd_0C_SetCurrentVolume,
214 au_SEFCmd_0D_VolumeRamp,
215 au_SEFCmd_0E_SetAlternativeSound,
216 au_SEFCmd_0F_Stop,
217 au_SEFCmd_10_Jump,
218 au_SEFCmd_11_Restart,
219 au_SEFCmd_12_NOP,
220 au_SEFCmd_13_SetRandomPitch,
221 au_SEFCmd_14_SetRandomVelocity,
222 au_SEFCmd_15_SetRandomUnused,
223 au_SEFCmd_16_SetEnvelopePress,
224 au_SEFCmd_17_PlaySound,
225 au_SEFCmd_18_SetAlternativeVolume
226};

◆ SeqCmdHandlers

void(* SeqCmdHandlers[])(BGMPlayer *, BGMPlayerTrack *) ( BGMPlayer * ,
BGMPlayerTrack *  )
extern

Definition at line 237 of file sfx_player.c.

237 {
270};
void au_BGMCmd_F1_TrackTremoloRate(BGMPlayer *player, BGMPlayerTrack *track)
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)
void au_BGMCmd_FC_Branch(BGMPlayer *player, BGMPlayerTrack *track)
void au_BGMCmd_FE_Detour(BGMPlayer *player, BGMPlayerTrack *track)
void au_BGMCmd_F4_SubTrackRandomPan(BGMPlayer *player, BGMPlayerTrack *track)
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)
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_BGMCmd_E0_MasterTempo(BGMPlayer *player, BGMPlayerTrack *track)
void au_BGMCmd_E8_TrackOverridePatch(BGMPlayer *player, BGMPlayerTrack *track)
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_BGMCmd_F2_TrackTremoloDepth(BGMPlayer *player, BGMPlayerTrack *track)
void au_BGMCmd_EB_InstrumentReverb(BGMPlayer *player, BGMPlayerTrack *track)
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)

Referenced by au_bgm_player_update_playing().

◆ SeqCmdArgCounts

u8 SeqCmdArgCounts[]
extern

Definition at line 272 of file sfx_player.c.

272 {
273 2, 1, 1, 1, 4, 3, 2, 0,
274 2, 1, 1, 1, 1, 1, 1, 2,
275 3, 1, 1, 0, 2, 1, 3, 1,
276 0, 0, 0, 0, 3, 3, 3, 3
277};

Referenced by au_bgm_player_update_playing().