summaryrefslogtreecommitdiff
path: root/src/audio/lib/seqplayer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/audio/lib/seqplayer.c')
-rw-r--r--src/audio/lib/seqplayer.c154
1 files changed, 79 insertions, 75 deletions
diff --git a/src/audio/lib/seqplayer.c b/src/audio/lib/seqplayer.c
index 008bedea6..620f7a453 100644
--- a/src/audio/lib/seqplayer.c
+++ b/src/audio/lib/seqplayer.c
@@ -259,7 +259,7 @@ void AudioSeq_InitSequenceChannel(SequenceChannel* channel) {
channel->enabled = false;
channel->finished = false;
channel->stopScript = false;
- channel->stopSomething2 = false;
+ channel->muted = false;
channel->hasInstrument = false;
channel->stereoHeadsetEffects = false;
channel->transposition = 0;
@@ -274,7 +274,7 @@ void AudioSeq_InitSequenceChannel(SequenceChannel* channel) {
channel->gateTimeRandomVariance = 0;
channel->noteUnused = NULL;
channel->reverbIndex = 0;
- channel->reverb = 0;
+ channel->targetReverbVol = 0;
channel->gain = 0;
channel->notePriority = 3;
channel->someOtherPriority = 1;
@@ -284,20 +284,20 @@ void AudioSeq_InitSequenceChannel(SequenceChannel* channel) {
channel->adsr.sustain = 0;
channel->vibratoRateTarget = 0x800;
channel->vibratoRateStart = 0x800;
- channel->vibratoExtentTarget = 0;
- channel->vibratoExtentStart = 0;
+ channel->vibratoDepthTarget = 0;
+ channel->vibratoDepthStart = 0;
channel->vibratoRateChangeDelay = 0;
- channel->vibratoExtentChangeDelay = 0;
+ channel->vibratoDepthChangeDelay = 0;
channel->vibratoDelay = 0;
channel->filter = NULL;
- channel->unk_20 = 0;
- channel->unk_0F = 0;
+ channel->combFilterGain = 0;
+ channel->combFilterSize = 0;
channel->volume = 1.0f;
channel->volumeScale = 1.0f;
channel->freqScale = 1.0f;
- for (i = 0; i < ARRAY_COUNT(channel->soundScriptIO); i++) {
- channel->soundScriptIO[i] = SEQ_IO_VAL_NONE;
+ for (i = 0; i < ARRAY_COUNT(channel->seqScriptIO); i++) {
+ channel->seqScriptIO[i] = SEQ_IO_VAL_NONE;
}
channel->unused = false;
@@ -326,7 +326,7 @@ s32 AudioSeq_SeqChannelSetLayer(SequenceChannel* channel, s32 layerIndex) {
layer->adsr.decayIndex = 0;
layer->enabled = true;
layer->finished = false;
- layer->stopSomething = false;
+ layer->muted = false;
layer->continuousNotes = false;
layer->bit3 = false;
layer->ignoreDrumPan = false;
@@ -530,9 +530,9 @@ void AudioSeq_SeqLayerProcessScript(SequenceLayer* layer) {
if (layer->delay > 1) {
layer->delay--;
- if (!layer->stopSomething && layer->delay <= layer->gateDelay) {
+ if (!layer->muted && (layer->delay <= layer->gateDelay)) {
Audio_SeqLayerNoteDecay(layer);
- layer->stopSomething = true;
+ layer->muted = true;
}
return;
}
@@ -555,7 +555,7 @@ void AudioSeq_SeqLayerProcessScript(SequenceLayer* layer) {
AudioSeq_SeqLayerProcessScriptStep5(layer, cmd);
}
- if (layer->stopSomething == true) {
+ if (layer->muted == true) {
if ((layer->note != NULL) || layer->continuousNotes) {
Audio_SeqLayerNoteDecay(layer);
}
@@ -579,9 +579,9 @@ void AudioSeq_SeqLayerProcessScriptStep1(SequenceLayer* layer) {
s32 AudioSeq_SeqLayerProcessScriptStep5(SequenceLayer* layer, s32 sameTunedSample) {
Note* note;
- if (!layer->stopSomething && layer->tunedSample != NULL &&
- layer->tunedSample->sample->codec == CODEC_S16_INMEMORY && layer->tunedSample->sample->medium != MEDIUM_RAM) {
- layer->stopSomething = true;
+ if (!layer->muted && (layer->tunedSample != NULL) && (layer->tunedSample->sample->codec == CODEC_S16_INMEMORY) &&
+ (layer->tunedSample->sample->medium != MEDIUM_RAM)) {
+ layer->muted = true;
return PROCESS_SCRIPT_END;
}
@@ -812,7 +812,7 @@ s32 AudioSeq_SeqLayerProcessScriptStep4(SequenceLayer* layer, s32 cmd) {
drum = Audio_GetDrum(channel->fontId, semitone);
if (drum == NULL) {
- layer->stopSomething = true;
+ layer->muted = true;
layer->delay2 = layer->delay;
return PROCESS_SCRIPT_END;
}
@@ -834,7 +834,7 @@ s32 AudioSeq_SeqLayerProcessScriptStep4(SequenceLayer* layer, s32 cmd) {
soundEffect = Audio_GetSoundEffect(channel->fontId, sfxId);
if (soundEffect == NULL) {
- layer->stopSomething = true;
+ layer->muted = true;
layer->delay2 = layer->delay + 1;
return PROCESS_SCRIPT_END;
}
@@ -850,7 +850,7 @@ s32 AudioSeq_SeqLayerProcessScriptStep4(SequenceLayer* layer, s32 cmd) {
layer->semitone = semitone;
if (semitone >= 0x80) {
- layer->stopSomething = true;
+ layer->muted = true;
return PROCESS_SCRIPT_END;
}
@@ -903,12 +903,12 @@ s32 AudioSeq_SeqLayerProcessScriptStep4(SequenceLayer* layer, s32 cmd) {
portamento->extent = (freqScale2 / freqScale) - 1.0f;
if (PORTAMENTO_IS_SPECIAL(*portamento)) {
- speed = seqPlayer->tempo * 0x8000 / gAudioCtx.tempoInternalToExternal;
+ speed = seqPlayer->tempo * 0x8000 / gAudioCtx.maxTempo;
if (layer->delay != 0) {
speed = speed * 0x100 / (layer->delay * layer->portamentoTime);
}
} else {
- speed = 0x20000 / (layer->portamentoTime * gAudioCtx.audioBufferParameters.updatesPerFrame);
+ speed = 0x20000 / (layer->portamentoTime * gAudioCtx.audioBufferParameters.ticksPerUpdate);
}
if (speed >= 0x7FFF) {
@@ -964,7 +964,7 @@ s32 AudioSeq_SeqLayerProcessScriptStep4(SequenceLayer* layer, s32 cmd) {
// (It's a bit unclear if 'portamento' has actually always been
// set when this is reached...)
if (PORTAMENTO_IS_SPECIAL(*portamento)) {
- speed2 = seqPlayer->tempo * 0x8000 / gAudioCtx.tempoInternalToExternal;
+ speed2 = seqPlayer->tempo * 0x8000 / gAudioCtx.maxTempo;
speed2 = speed2 * 0x100 / (layer->delay * layer->portamentoTime);
if (speed2 >= 0x7FFF) {
speed2 = 0x7FFF;
@@ -989,12 +989,12 @@ s32 AudioSeq_SeqLayerProcessScriptStep3(SequenceLayer* layer, s32 cmd) {
if (cmd == 0xC0) {
layer->delay = AudioSeq_ScriptReadCompressedU16(state);
- layer->stopSomething = true;
+ layer->muted = true;
layer->bit1 = false;
return PROCESS_SCRIPT_END;
}
- layer->stopSomething = false;
+ layer->muted = false;
if (channel->largeNotes == true) {
switch (cmd & 0xC0) {
@@ -1078,13 +1078,13 @@ s32 AudioSeq_SeqLayerProcessScriptStep3(SequenceLayer* layer, s32 cmd) {
}
if ((seqPlayer->muted && (channel->muteBehavior & (MUTE_BEHAVIOR_STOP_NOTES | MUTE_BEHAVIOR_4))) ||
- channel->stopSomething2) {
- layer->stopSomething = true;
+ channel->muted) {
+ layer->muted = true;
return PROCESS_SCRIPT_END;
}
if (seqPlayer->skipTicks != 0) {
- layer->stopSomething = true;
+ layer->muted = true;
return PROCESS_SCRIPT_END;
}
@@ -1329,9 +1329,9 @@ void AudioSeq_SequenceChannelProcessScript(SequenceChannel* channel) {
case 0xD8:
cmd = (u8)cmdArgs[0];
- channel->vibratoExtentTarget = cmd * 8;
- channel->vibratoExtentStart = 0;
- channel->vibratoExtentChangeDelay = 0;
+ channel->vibratoDepthTarget = cmd * 8;
+ channel->vibratoDepthStart = 0;
+ channel->vibratoDepthChangeDelay = 0;
break;
case 0xD7:
@@ -1343,11 +1343,11 @@ void AudioSeq_SequenceChannelProcessScript(SequenceChannel* channel) {
case 0xE2:
cmd = (u8)cmdArgs[0];
- channel->vibratoExtentStart = cmd * 8;
+ channel->vibratoDepthStart = cmd * 8;
cmd = (u8)cmdArgs[1];
- channel->vibratoExtentTarget = cmd * 8;
+ channel->vibratoDepthTarget = cmd * 8;
cmd = (u8)cmdArgs[2];
- channel->vibratoExtentChangeDelay = cmd * 16;
+ channel->vibratoDepthChangeDelay = cmd * 16;
break;
case 0xE1:
@@ -1366,7 +1366,7 @@ void AudioSeq_SequenceChannelProcessScript(SequenceChannel* channel) {
case 0xD4:
cmd = (u8)cmdArgs[0];
- channel->reverb = cmd;
+ channel->targetReverbVol = cmd;
break;
case 0xC6:
@@ -1483,7 +1483,7 @@ void AudioSeq_SequenceChannelProcessScript(SequenceChannel* channel) {
data += 4;
channel->newPan = data[-3];
channel->panChannelWeight = data[-2];
- channel->reverb = data[-1];
+ channel->targetReverbVol = data[-1];
channel->reverbIndex = data[0];
//! @bug: Not marking reverb state as changed
channel->changes.s.pan = true;
@@ -1497,16 +1497,16 @@ void AudioSeq_SequenceChannelProcessScript(SequenceChannel* channel) {
channel->transposition = (s8)AudioSeq_ScriptReadU8(scriptState);
channel->newPan = AudioSeq_ScriptReadU8(scriptState);
channel->panChannelWeight = AudioSeq_ScriptReadU8(scriptState);
- channel->reverb = AudioSeq_ScriptReadU8(scriptState);
+ channel->targetReverbVol = AudioSeq_ScriptReadU8(scriptState);
channel->reverbIndex = AudioSeq_ScriptReadU8(scriptState);
//! @bug: Not marking reverb state as changed
channel->changes.s.pan = true;
break;
case 0xEC:
- channel->vibratoExtentTarget = 0;
- channel->vibratoExtentStart = 0;
- channel->vibratoExtentChangeDelay = 0;
+ channel->vibratoDepthTarget = 0;
+ channel->vibratoDepthStart = 0;
+ channel->vibratoDepthChangeDelay = 0;
channel->vibratoRateTarget = 0;
channel->vibratoRateStart = 0;
channel->vibratoRateChangeDelay = 0;
@@ -1515,8 +1515,8 @@ void AudioSeq_SequenceChannelProcessScript(SequenceChannel* channel) {
channel->adsr.sustain = 0;
channel->velocityRandomVariance = 0;
channel->gateTimeRandomVariance = 0;
- channel->unk_0F = 0;
- channel->unk_20 = 0;
+ channel->combFilterSize = 0;
+ channel->combFilterGain = 0;
channel->bookOffset = 0;
channel->freqScale = 1.0f;
break;
@@ -1578,7 +1578,7 @@ void AudioSeq_SequenceChannelProcessScript(SequenceChannel* channel) {
break;
case 0xBD:
- temp2 = Audio_NextRandom();
+ temp2 = AudioThread_NextRandom();
channel->unk_22 = (cmdArgs[0] == 0) ? (temp2 & 0xFFFF) : (temp2 % cmdArgs[0]);
channel->unk_22 += cmdArgs[1];
temp2 = (channel->unk_22 / 0x100) + 0x80;
@@ -1595,8 +1595,8 @@ void AudioSeq_SequenceChannelProcessScript(SequenceChannel* channel) {
break;
case 0xBB:
- channel->unk_0F = cmdArgs[0];
- channel->unk_20 = cmdArgs[1];
+ channel->combFilterSize = cmdArgs[0];
+ channel->combFilterGain = cmdArgs[1];
break;
case 0xBC:
@@ -1642,7 +1642,7 @@ void AudioSeq_SequenceChannelProcessScript(SequenceChannel* channel) {
break;
case 0x70:
- channel->soundScriptIO[lowBits] = scriptState->value;
+ channel->seqScriptIO[lowBits] = scriptState->value;
break;
case 0x78:
@@ -1664,26 +1664,26 @@ void AudioSeq_SequenceChannelProcessScript(SequenceChannel* channel) {
case 0x10:
if (lowBits < 8) {
- channel->soundScriptIO[lowBits] = SEQ_IO_VAL_NONE;
- if (AudioLoad_SlowLoadSample(channel->fontId, scriptState->value,
- &channel->soundScriptIO[lowBits]) == -1) {}
+ channel->seqScriptIO[lowBits] = SEQ_IO_VAL_NONE;
+ if (AudioLoad_SlowLoadSample(channel->fontId, scriptState->value, &channel->seqScriptIO[lowBits]) ==
+ -1) {}
} else {
lowBits -= 8;
- channel->soundScriptIO[lowBits] = SEQ_IO_VAL_NONE;
+ channel->seqScriptIO[lowBits] = SEQ_IO_VAL_NONE;
if (AudioLoad_SlowLoadSample(channel->fontId, channel->unk_22 + 0x100,
- &channel->soundScriptIO[lowBits]) == -1) {}
+ &channel->seqScriptIO[lowBits]) == -1) {}
}
break;
case 0x60:
- scriptState->value = channel->soundScriptIO[lowBits];
+ scriptState->value = channel->seqScriptIO[lowBits];
if (lowBits < 2) {
- channel->soundScriptIO[lowBits] = SEQ_IO_VAL_NONE;
+ channel->seqScriptIO[lowBits] = SEQ_IO_VAL_NONE;
}
break;
case 0x50:
- scriptState->value -= channel->soundScriptIO[lowBits];
+ scriptState->value -= channel->seqScriptIO[lowBits];
break;
case 0x20:
@@ -1693,12 +1693,12 @@ void AudioSeq_SequenceChannelProcessScript(SequenceChannel* channel) {
case 0x30:
cmd = AudioSeq_ScriptReadU8(scriptState);
- seqPlayer->channels[lowBits]->soundScriptIO[cmd] = scriptState->value;
+ seqPlayer->channels[lowBits]->seqScriptIO[cmd] = scriptState->value;
break;
case 0x40:
cmd = AudioSeq_ScriptReadU8(scriptState);
- scriptState->value = seqPlayer->channels[lowBits]->soundScriptIO[cmd];
+ scriptState->value = seqPlayer->channels[lowBits]->seqScriptIO[cmd];
break;
}
}
@@ -1743,14 +1743,18 @@ void AudioSeq_SequencePlayerProcessSequence(SequencePlayer* seqPlayer) {
}
seqPlayer->scriptCounter++;
- seqPlayer->tempoAcc += seqPlayer->tempo;
- seqPlayer->tempoAcc += (s16)seqPlayer->unk_0C;
- if (seqPlayer->tempoAcc < gAudioCtx.tempoInternalToExternal) {
+ // Apply the tempo by controlling the number of updates run on the .seq script.
+ // Processing the .seq script every possible update will result in a tempo = maxTempo
+ // Processing the .seq script a fraction of the updates will result in a `tempo = fraction * maxTempo`
+ // where `fraction = (tempo + tempoChange) / maxTempo`
+ // This algorithm uses `tempoAcc` to discretize `(tempo + tempoChange) / maxTempo`
+ seqPlayer->tempoAcc += seqPlayer->tempo;
+ seqPlayer->tempoAcc += (s16)seqPlayer->tempoChange;
+ if (seqPlayer->tempoAcc < gAudioCtx.maxTempo) {
return;
}
-
- seqPlayer->tempoAcc -= (u16)gAudioCtx.tempoInternalToExternal;
+ seqPlayer->tempoAcc -= (u16)gAudioCtx.maxTempo;
if (seqPlayer->stopScript == true) {
return;
@@ -1810,9 +1814,9 @@ void AudioSeq_SequencePlayerProcessSequence(SequencePlayer* seqPlayer) {
break;
case 0xDD:
- seqPlayer->tempo = AudioSeq_ScriptReadU8(seqScript) * TATUMS_PER_BEAT;
- if (seqPlayer->tempo > gAudioCtx.tempoInternalToExternal) {
- seqPlayer->tempo = (u16)gAudioCtx.tempoInternalToExternal;
+ seqPlayer->tempo = AudioSeq_ScriptReadU8(seqScript) * SEQTICKS_PER_BEAT;
+ if (seqPlayer->tempo > gAudioCtx.maxTempo) {
+ seqPlayer->tempo = (u16)gAudioCtx.maxTempo;
}
if ((s16)seqPlayer->tempo <= 0) {
@@ -1821,7 +1825,7 @@ void AudioSeq_SequencePlayerProcessSequence(SequencePlayer* seqPlayer) {
break;
case 0xDC:
- seqPlayer->unk_0C = (s8)AudioSeq_ScriptReadU8(seqScript) * TATUMS_PER_BEAT;
+ seqPlayer->tempoChange = (s8)AudioSeq_ScriptReadU8(seqScript) * SEQTICKS_PER_BEAT;
break;
case 0xDA:
@@ -1982,17 +1986,17 @@ void AudioSeq_SequencePlayerProcessSequence(SequencePlayer* seqPlayer) {
break;
case 0x50:
- seqScript->value -= seqPlayer->soundScriptIO[cmdLowBits];
+ seqScript->value -= seqPlayer->seqScriptIO[cmdLowBits];
break;
case 0x70:
- seqPlayer->soundScriptIO[cmdLowBits] = seqScript->value;
+ seqPlayer->seqScriptIO[cmdLowBits] = seqScript->value;
break;
case 0x80:
- seqScript->value = seqPlayer->soundScriptIO[cmdLowBits];
+ seqScript->value = seqPlayer->seqScriptIO[cmdLowBits];
if (cmdLowBits < 2) {
- seqPlayer->soundScriptIO[cmdLowBits] = SEQ_IO_VAL_NONE;
+ seqPlayer->seqScriptIO[cmdLowBits] = SEQ_IO_VAL_NONE;
}
break;
@@ -2014,14 +2018,14 @@ void AudioSeq_SequencePlayerProcessSequence(SequencePlayer* seqPlayer) {
cmd = AudioSeq_ScriptReadU8(seqScript);
temp = AudioSeq_ScriptReadS16(seqScript);
data2 = &seqPlayer->seqData[temp];
- AudioLoad_SlowLoadSeq(cmd, data2, &seqPlayer->soundScriptIO[cmdLowBits]);
+ AudioLoad_SlowLoadSeq(cmd, data2, &seqPlayer->seqScriptIO[cmdLowBits]);
break;
case 0x60:
cmd = AudioSeq_ScriptReadU8(seqScript);
value = cmd;
temp = AudioSeq_ScriptReadU8(seqScript);
- AudioLoad_ScriptLoad(value, temp, &seqPlayer->soundScriptIO[cmdLowBits]);
+ AudioLoad_ScriptLoad(value, temp, &seqPlayer->seqScriptIO[cmdLowBits]);
break;
}
}
@@ -2038,7 +2042,7 @@ void AudioSeq_ProcessSequences(s32 arg0) {
SequencePlayer* seqPlayer;
u32 i;
- gAudioCtx.noteSubEuOffset = (gAudioCtx.audioBufferParameters.updatesPerFrame - arg0 - 1) * gAudioCtx.numNotes;
+ gAudioCtx.noteSubEuOffset = (gAudioCtx.audioBufferParameters.ticksPerUpdate - arg0 - 1) * gAudioCtx.numNotes;
for (i = 0; i < (u32)gAudioCtx.audioBufferParameters.numSequencePlayers; i++) {
seqPlayer = &gAudioCtx.seqPlayers[i];
@@ -2069,8 +2073,8 @@ void AudioSeq_ResetSequencePlayer(SequencePlayer* seqPlayer) {
seqPlayer->fadeTimer = 0;
seqPlayer->fadeTimerUnkEu = 0;
seqPlayer->tempoAcc = 0;
- seqPlayer->tempo = 120 * TATUMS_PER_BEAT; // 120 BPM
- seqPlayer->unk_0C = 0;
+ seqPlayer->tempo = 120 * SEQTICKS_PER_BEAT; // 120 BPM
+ seqPlayer->tempoChange = 0;
seqPlayer->transposition = 0;
seqPlayer->noteAllocPolicy = 0;
seqPlayer->shortNoteVelocityTable = gDefaultShortNoteVelocityTable;
@@ -2122,8 +2126,8 @@ void AudioSeq_InitSequencePlayer(SequencePlayer* seqPlayer) {
seqPlayer->seqDmaInProgress = false;
seqPlayer->applyBend = false;
- for (j = 0; j < ARRAY_COUNT(seqPlayer->soundScriptIO); j++) {
- seqPlayer->soundScriptIO[j] = SEQ_IO_VAL_NONE;
+ for (j = 0; j < ARRAY_COUNT(seqPlayer->seqScriptIO); j++) {
+ seqPlayer->seqScriptIO[j] = SEQ_IO_VAL_NONE;
}
seqPlayer->muteBehavior = MUTE_BEHAVIOR_SOFTEN | MUTE_BEHAVIOR_STOP_NOTES;