diff --git a/include/functions.h b/include/functions.h index 14744a9dee..2d94268bab 100644 --- a/include/functions.h +++ b/include/functions.h @@ -3562,16 +3562,12 @@ void Audio_WritebackDCache(void* buf, size_t size); // void func_801964F8(void); // void func_801965F0(void); // void func_801968C4(void); -// void func_80196A00(void); -// void func_80196BC8(void); -// void func_80196D20(void); -// void func_80196D7C(void); -// void func_80196DB4(void); -// void func_80196FEC(void); -// void func_80197048(void); -// void func_80197138(void); -// void func_80197164(void); -// void func_80197188(void); +void AudioEffects_SequencePlayerProcessSound(SequencePlayer* seqPlayer); +void AudioEffects_NoteVibratoUpdate(Note* note); +void AudioEffects_NoteVibratoInit(Note* note); +void AudioEffects_NotePortamentoInit(Note* note); +void AudioEffects_AdsrInit(AdsrState* adsr, AdsrEnvelope* envelope, s16* volOut); +f32 AudioEffects_AdsrUpdate(AdsrState* adsr); // void func_801974D0(void); // void func_80197538(void); // void func_80197714(void); @@ -3583,7 +3579,7 @@ void Audio_WritebackDCache(void* buf, size_t size); // void func_80197C0C(void); // void func_80197C8C(void); // void func_80197D24(void); -// void func_80197D4C(void); +void AudioSeq_SequencePlayerDisable(SequencePlayer* seqPlayer); // void func_80197E08(void); // void func_80197E48(void); // void func_80197E88(void); diff --git a/include/variables.h b/include/variables.h index cabe5d09e4..32983d58c4 100644 --- a/include/variables.h +++ b/include/variables.h @@ -1642,10 +1642,10 @@ extern MtxF gIdentityMtxF; // extern UNK_TYPE1 D_801D4790; // extern UNK_TYPE1 D_801D4990; // extern UNK_TYPE1 D_801D4B90; -extern UNK_PTR D_801D4D90; +extern s16* gWaveSamples[9]; extern UNK_PTR D_801D4D98; extern UNK_PTR D_801D4DB0; -// extern UNK_TYPE1 D_801D4DB4; +extern f32 gBendPitchOneOctaveFrequencies[256]; // extern UNK_TYPE1 D_801D4FB4; // extern UNK_TYPE4 D_801D51B4; // extern UNK_TYPE4 D_801D53B4; @@ -3623,131 +3623,7 @@ extern SoundRequest D_801FE7C0[1]; // extern UNK_TYPE1 D_80200BCC; // extern UNK_TYPE1 D_80200BCE; // extern UNK_TYPE1 D_80200BD0; -// extern UNK_TYPE1 D_80200C70; -// extern UNK_TYPE1 D_80200C71; -// extern UNK_TYPE1 D_80200C76; -// extern UNK_TYPE1 D_80200C78; -// extern UNK_TYPE1 D_80200C7C; -// extern UNK_TYPE1 D_80200C80; -// extern UNK_TYPE1 D_80200C92; -// extern UNK_TYPE1 D_80200C94; -// extern UNK_TYPE1 D_80200C98; -// extern UNK_TYPE1 D_80200C9A; -// extern UNK_TYPE1 D_80200C9E; -// extern UNK_TYPE1 D_80200CA0; -// extern UNK_TYPE1 D_80200CF0; -// extern UNK_TYPE1 D_80200D38; -// extern UNK_TYPE1 D_80200D70; -// extern UNK_TYPE1 D_802011F0; -// extern UNK_TYPE1 D_8020178C; -// extern UNK_TYPE1 D_802017B0; -// extern UNK_TYPE1 D_80201D68; -// extern UNK_TYPE1 D_80201D6C; -// extern UNK_TYPE1 D_802023FC; -// extern UNK_TYPE1 D_80202878; -// extern UNK_TYPE1 D_80202880; -// extern UNK_TYPE1 D_802028BC; -extern OSMesgQueue D_80202980; -// extern UNK_TYPE1 D_802029D8; -extern OSMesgQueue D_80202AB0; -extern OSMesg D_80202AC8[0x10]; -extern OSMesgQueue D_80202B08; -extern OSMesg D_80202B20[0x10]; -extern OSMesgQueue D_80202B60; -extern OSMesg D_80202B78[0x40]; -extern OSMesgQueue D_80203278; -extern OSMesg D_80203290[1]; -// extern UNK_TYPE1 D_80203294; -// extern UNK_TYPE1 D_802034C0; -// extern UNK_TYPE1 D_802034C4; -// extern UNK_TYPE1 D_802034C8; -// extern UNK_TYPE4 D_802034D0; -// extern UNK_TYPE1 D_802034D4; -// extern UNK_TYPE1 D_802034D8; -// extern UNK_TYPE1 D_802034DC; -// extern UNK_TYPE1 D_802034E8; -// extern UNK_TYPE2 D_802034F0; -// extern UNK_TYPE1 D_802034F8; -// extern UNK_TYPE1 D_802034FC; -// extern UNK_TYPE1 D_80203500; -// extern UNK_TYPE4 D_80203528; -// extern UNK_TYPE1 D_8020352C; -// extern UNK_TYPE1 D_8020352E; -// extern UNK_TYPE1 D_80203530; -// extern UNK_TYPE4 D_8020360C; -// extern UNK_TYPE1 D_80203618; -// extern UNK_TYPE1 D_8020361C; -// extern UNK_TYPE1 D_80203620; -// extern UNK_TYPE1 D_80203624; -// extern UNK_TYPE1 D_80203628; -// extern UNK_TYPE1 D_80203630; -// extern UNK_TYPE1 D_80203640; -// extern UNK_TYPE1 D_80203650; -// extern UNK_TYPE1 D_80203660; -// extern UNK_TYPE1 D_80203690; -// extern UNK_TYPE1 D_802036A0; -// extern UNK_TYPE1 D_802036B0; -// extern UNK_TYPE1 D_802036C0; -// extern UNK_TYPE1 D_802036C4; -// extern UNK_TYPE1 D_80203794; -// extern UNK_TYPE1 D_80203798; -// extern UNK_TYPE1 D_802037D0; -// extern UNK_TYPE1 D_802037D4; -// extern UNK_TYPE1 D_802038A4; -// extern UNK_TYPE1 D_802038A8; -// extern UNK_TYPE1 D_802038C2; -// extern UNK_TYPE1 D_802038CE; -// extern UNK_TYPE1 D_802038E0; -// extern UNK_TYPE1 D_802038E4; -// extern UNK_TYPE1 D_80203970; -// extern UNK_TYPE1 D_802039B4; -// extern UNK_TYPE1 D_802039B8; -// extern UNK_TYPE1 D_802039D2; -// extern UNK_TYPE1 D_802039DE; -// extern UNK_TYPE1 D_802039F0; -// extern UNK_TYPE1 D_802039FC; -// extern UNK_TYPE1 D_80203B80; -// extern UNK_TYPE1 D_80203B88; -// extern UNK_TYPE1 D_80203B90; -// extern UNK_TYPE1 D_80204590; -// extern UNK_TYPE1 D_80204594; -// extern UNK_TYPE1 D_80204598; -// extern UNK_TYPE1 D_802045A4; -// extern UNK_TYPE1 D_80204FA4; -// extern UNK_TYPE1 D_80204FA8; -// extern UNK_TYPE1 D_80204FB4; -// extern UNK_TYPE1 D_80204FB8; -// extern UNK_TYPE1 D_80204FC0; -// extern UNK_TYPE1 D_80204FCC; -// extern UNK_TYPE1 D_80204FD8; -// extern UNK_TYPE1 D_80205008; -// extern UNK_TYPE1 D_80205038; -// extern UNK_TYPE1 D_802050B9; -// extern UNK_TYPE1 D_802050C0; -// extern UNK_TYPE1 D_802050C4; -// extern UNK_TYPE4 D_802050CC; -// extern UNK_TYPE4 D_802050D0; -// extern UNK_TYPE1 D_80205228; -// extern UNK_TYPE1 D_8020522B; -// extern UNK_TYPE1 D_80205390; -// extern UNK_TYPE1 D_802053C8; -// extern UNK_TYPE1 D_802057B0; -// extern UNK_TYPE1 D_80205830; -// extern UNK_TYPE1 D_802084B0; -// extern UNK_TYPE1 D_80208530; -// extern UNK_TYPE1 D_80208598; -// extern UNK_TYPE1 D_802085A8; -// extern UNK_TYPE1 D_802085B8; -// extern UNK_TYPE1 D_802085C8; -// extern UNK_TYPE1 D_802085D8; -// extern UNK_TYPE1 D_802085F8; -// extern UNK_TYPE1 D_802085FC; -// extern UNK_TYPE1 D_80208604; -// extern UNK_TYPE1 D_8020861C; -// extern UNK_TYPE1 D_80208634; -// extern UNK_TYPE1 D_8020864C; -// extern UNK_TYPE1 D_80208650; -// extern UNK_TYPE1 D_80208654; +extern AudioContext gAudioContext; // at 0x80200C70 // extern UNK_TYPE4 D_80208E68; // extern UNK_TYPE4 D_80208E6C; // extern UNK_TYPE4 D_80208E70; diff --git a/include/z64audio.h b/include/z64audio.h index bc6d81a712..06f70b81b5 100644 --- a/include/z64audio.h +++ b/include/z64audio.h @@ -11,6 +11,8 @@ #define MAX_CHANNELS_PER_BANK 3 +#define AUDIO_LERPIMP(v0, v1, t) (v0 + ((v1 - v0) * t)) + #define ADSR_DISABLE 0 #define ADSR_HANG -1 #define ADSR_GOTO -2 @@ -154,10 +156,10 @@ typedef struct NotePool { // extrapolates exponentially in the wrong direction in that case, but that // doesn't prevent seqplayer from doing it, AFAICT. typedef struct { - /* 0x00 */ u8 mode; // bit 0x80 denotes something; the rest are an index 0-5 - /* 0x02 */ u16 cur; - /* 0x04 */ u16 speed; - /* 0x08 */ f32 extent; + /* 0x0 */ u8 mode; // bit 0x80 denotes something; the rest are an index 0-5 + /* 0x2 */ u16 cur; + /* 0x4 */ u16 speed; + /* 0x8 */ f32 extent; } Portamento; // size = 0xC typedef struct { @@ -298,7 +300,7 @@ typedef struct { /* 0x000 */ u8 fontDmaInProgress : 1; /* 0x000 */ u8 recalculateVolume : 1; /* 0x000 */ u8 stopScript : 1; - /* 0x000 */ u8 unk_0b1 : 1; + /* 0x000 */ u8 applyBend : 1; /* 0x001 */ u8 state; /* 0x002 */ u8 noteAllocPolicy; /* 0x003 */ u8 muteBehavior; @@ -324,7 +326,7 @@ typedef struct { /* 0x028 */ f32 muteVolumeScale; /* 0x02C */ f32 fadeVolumeScale; /* 0x030 */ f32 appliedFadeVolume; - /* 0x034 */ f32 unk_34; + /* 0x034 */ f32 bend; /* 0x038 */ struct SequenceChannel* channels[16]; /* 0x078 */ SeqScriptState scriptState; /* 0x094 */ u8* shortNoteVelocityTable; @@ -402,17 +404,6 @@ typedef struct VibratoSubStruct { /* 0xC */ u16 vibratoDelay; } VibratoSubStruct; // size = 0xE -typedef struct SequenceChannelSubStruct { - /* 0x0 */ u8 enabled : 1; - /* 0x0 */ u8 finished : 1; - /* 0x0 */ u8 stopScript : 1; - /* 0x0 */ u8 stopSomething2 : 1; // sets SequenceLayer.stopSomething - /* 0x0 */ u8 hasInstrument : 1; - /* 0x0 */ u8 stereoHeadsetEffects : 1; - /* 0x0 */ u8 largeNotes : 1; // notes specify duration and velocity - /* 0x0 */ u8 unused : 1; -} SequenceChannelSubStruct; // size = 0x1 - // Also known as a SubTrack, according to sm64 debug strings. typedef struct SequenceChannel { /* 0x00 */ u8 enabled : 1; @@ -530,7 +521,7 @@ typedef struct SequenceLayer { /* 0x30 */ Portamento portamento; /* 0x3C */ struct Note* note; /* 0x40 */ f32 freqScale; - /* 0x44 */ f32 unk_34; + /* 0x44 */ f32 bend; /* 0x48 */ f32 velocitySquare2; /* 0x4C */ f32 velocitySquare; // not sure which one of those corresponds to the sm64 original /* 0x50 */ f32 noteVelocity; diff --git a/spec b/spec index de71a0e4f2..2215b88ab0 100644 --- a/spec +++ b/spec @@ -635,7 +635,6 @@ beginseg include "build/data/code/code_80194790.data.o" include "build/src/code/audio/audio_playback.o" include "build/src/code/audio/audio_effects.o" - include "build/data/code/audio_effects.data.o" include "build/src/code/audio/audio_seqplayer.o" include "build/data/code/audio_seqplayer.data.o" include "build/data/code/audio_dramStack.data.o" diff --git a/src/code/audio/audio_effects.c b/src/code/audio/audio_effects.c index e795d5e9f7..2dcef2237a 100644 --- a/src/code/audio/audio_effects.c +++ b/src/code/audio/audio_effects.c @@ -1,21 +1,341 @@ #include "global.h" -#pragma GLOBAL_ASM("asm/non_matchings/code/audio_effects/func_80196A00.s") +void AudioEffects_SequenceChannelProcessSound(SequenceChannel* channel, s32 recalculateVolume, s32 applyBend) { + f32 channelVolume; + f32 chanFreqScale; + s32 i; -#pragma GLOBAL_ASM("asm/non_matchings/code/audio_effects/func_80196BC8.s") + if (channel->changes.s.volume || recalculateVolume) { + channelVolume = channel->volume * channel->volumeScale * channel->seqPlayer->appliedFadeVolume; + if (channel->seqPlayer->muted && (channel->muteBehavior & 0x20)) { + channelVolume = channel->seqPlayer->muteVolumeScale * channelVolume; + } + channel->appliedVolume = channelVolume * channelVolume; + } -#pragma GLOBAL_ASM("asm/non_matchings/code/audio_effects/func_80196D20.s") + if (channel->changes.s.pan) { + channel->pan = channel->newPan * channel->panChannelWeight; + } -#pragma GLOBAL_ASM("asm/non_matchings/code/audio_effects/func_80196D7C.s") + chanFreqScale = channel->freqScale; + if (applyBend) { + chanFreqScale *= channel->seqPlayer->bend; + channel->changes.s.freqScale = true; + } -#pragma GLOBAL_ASM("asm/non_matchings/code/audio_effects/func_80196DB4.s") + for (i = 0; i < ARRAY_COUNT(channel->layers); i++) { + SequenceLayer* layer = channel->layers[i]; -#pragma GLOBAL_ASM("asm/non_matchings/code/audio_effects/func_80196FEC.s") + if (layer != NULL && layer->enabled && layer->note != NULL) { + if (layer->notePropertiesNeedInit) { + layer->noteFreqScale = layer->freqScale * chanFreqScale; + layer->noteVelocity = layer->velocitySquare2 * channel->appliedVolume; + layer->notePan = (channel->pan + layer->pan * (0x80 - channel->panChannelWeight)) >> 7; + layer->notePropertiesNeedInit = false; + } else { + if (channel->changes.s.freqScale) { + layer->noteFreqScale = layer->freqScale * chanFreqScale; + } + if (channel->changes.s.volume || recalculateVolume) { + layer->noteVelocity = layer->velocitySquare2 * channel->appliedVolume; + } + if (channel->changes.s.pan) { + layer->notePan = (channel->pan + layer->pan * (0x80 - channel->panChannelWeight)) >> 7; + } + } + } + } + channel->changes.asByte = 0; +} -#pragma GLOBAL_ASM("asm/non_matchings/code/audio_effects/func_80197048.s") +void AudioEffects_SequencePlayerProcessSound(SequencePlayer* seqPlayer) { + s32 i; -#pragma GLOBAL_ASM("asm/non_matchings/code/audio_effects/func_80197138.s") + if ((seqPlayer->fadeTimer != 0) && (seqPlayer->skipTicks == 0)) { + seqPlayer->fadeVolume += seqPlayer->fadeVelocity; + seqPlayer->recalculateVolume = true; -#pragma GLOBAL_ASM("asm/non_matchings/code/audio_effects/func_80197164.s") + if (seqPlayer->fadeVolume > 1.0f) { + seqPlayer->fadeVolume = 1.0f; + } + if (seqPlayer->fadeVolume < 0.0f) { + seqPlayer->fadeVolume = 0.0f; + } -#pragma GLOBAL_ASM("asm/non_matchings/code/audio_effects/func_80197188.s") + seqPlayer->fadeTimer--; + if (seqPlayer->fadeTimer == 0 && seqPlayer->state == 2) { + AudioSeq_SequencePlayerDisable(seqPlayer); + return; + } + } + + if (seqPlayer->recalculateVolume) { + seqPlayer->appliedFadeVolume = seqPlayer->fadeVolume * seqPlayer->fadeVolumeScale; + } + + for (i = 0; i < ARRAY_COUNT(seqPlayer->channels); i++) { + if (seqPlayer->channels[i]->enabled == true) { + AudioEffects_SequenceChannelProcessSound(seqPlayer->channels[i], seqPlayer->recalculateVolume, + seqPlayer->applyBend); + } + } + + seqPlayer->recalculateVolume = false; +} + +f32 AudioEffects_GetPortamentoFreqScale(Portamento* portamento) { + u32 loResCur; + f32 portamentoFreq; + + portamento->cur += portamento->speed; + loResCur = (portamento->cur >> 8) & 0xFF; + + if (loResCur >= 127) { + loResCur = 127; + portamento->mode = 0; + } + + portamentoFreq = AUDIO_LERPIMP(1.0f, gBendPitchOneOctaveFrequencies[loResCur + 128], portamento->extent); + + return portamentoFreq; +} + +s16 AudioEffects_GetVibratoPitchChange(VibratoState* vib) { + s32 index; + + vib->time += (s32)vib->rate; + index = (vib->time >> 10) & 0x3F; + return vib->curve[index]; +} + +f32 AudioEffects_GetVibratoFreqScale(VibratoState* vib) { + static f32 activeVibratoFreqScaleSum = 0.0f; + static s32 activeVibratoCount = 0; + f32 pitchChange; + f32 extent; + f32 invExtent; + f32 result; + f32 scaledExtent; + VibratoSubStruct* subVib = vib->vibSubStruct; + + if (vib->delay != 0) { + vib->delay--; + return 1.0f; + } + + if (subVib != NULL) { + if (vib->extentChangeTimer) { + if (vib->extentChangeTimer == 1) { + vib->extent = (s32)subVib->vibratoExtentTarget; + } else { + vib->extent += ((s32)subVib->vibratoExtentTarget - vib->extent) / (s32)vib->extentChangeTimer; + } + + vib->extentChangeTimer--; + } else if (subVib->vibratoExtentTarget != (s32)vib->extent) { + if ((vib->extentChangeTimer = subVib->vibratoExtentChangeDelay) == 0) { + vib->extent = (s32)subVib->vibratoExtentTarget; + } + } + + if (vib->rateChangeTimer) { + if (vib->rateChangeTimer == 1) { + vib->rate = (s32)subVib->vibratoRateTarget; + } else { + vib->rate += ((s32)subVib->vibratoRateTarget - vib->rate) / (s32)vib->rateChangeTimer; + } + + vib->rateChangeTimer--; + } else if (subVib->vibratoRateTarget != (s32)vib->rate) { + if ((vib->rateChangeTimer = subVib->vibratoRateChangeDelay) == 0) { + vib->rate = (s32)subVib->vibratoRateTarget; + } + } + } + + if (vib->extent == 0.0f) { + return 1.0f; + } + + pitchChange = AudioEffects_GetVibratoPitchChange(vib) + 32768.0f; + scaledExtent = vib->extent / 4096.0f; + extent = scaledExtent + 1.0f; + invExtent = 1.0f / extent; + + // inverse linear interpolation + result = 1.0f / ((extent - invExtent) * pitchChange / 65536.0f + invExtent); + + activeVibratoFreqScaleSum += result; + activeVibratoCount++; + + return result; +} + +void AudioEffects_NoteVibratoUpdate(Note* note) { + if (note->playbackState.portamento.mode != 0) { + note->playbackState.portamentoFreqScale = AudioEffects_GetPortamentoFreqScale(¬e->playbackState.portamento); + } + if (note->playbackState.vibratoState.active) { + note->playbackState.vibratoFreqScale = AudioEffects_GetVibratoFreqScale(¬e->playbackState.vibratoState); + } +} + +void AudioEffects_NoteVibratoInit(Note* note) { + NotePlaybackState* playbackState = ¬e->playbackState; + VibratoState* vib = &playbackState->vibratoState; + VibratoSubStruct* subVib; + + vib->active = true; + vib->curve = gWaveSamples[2]; + + if (playbackState->parentLayer->unk_0A.s.bit_3 == 1) { + vib->vibSubStruct = &playbackState->parentLayer->channel->vibrato; + } else { + vib->vibSubStruct = &playbackState->parentLayer->vibrato; + } + + subVib = vib->vibSubStruct; + + if ((vib->extentChangeTimer = subVib->vibratoExtentChangeDelay) == 0) { + vib->extent = (s32)subVib->vibratoExtentTarget; + } else { + vib->extent = (s32)subVib->vibratoExtentStart; + } + + if ((vib->rateChangeTimer = subVib->vibratoRateChangeDelay) == 0) { + vib->rate = (s32)subVib->vibratoRateTarget; + } else { + vib->rate = (s32)subVib->vibratoRateStart; + } + + playbackState->vibratoFreqScale = 1.0f; + vib->time = 0; + vib->delay = subVib->vibratoDelay; +} + +void AudioEffects_NotePortamentoInit(Note* note) { + note->playbackState.portamentoFreqScale = 1.0f; + note->playbackState.portamento = note->playbackState.parentLayer->portamento; +} + +void AudioEffects_AdsrInit(AdsrState* adsr, AdsrEnvelope* envelope, s16* volOut) { + adsr->action.asByte = 0; + adsr->delay = 0; + adsr->envelope = envelope; + adsr->sustain = 0.0f; + adsr->current = 0.0f; + adsr->velocity = 0.0f; + // (An older versions of the audio engine used in Super Mario 64 did + // adsr->volOut = volOut. That line and associated struct member were + // removed, but the function parameter was forgotten and remains.) +} + +f32 AudioEffects_AdsrUpdate(AdsrState* adsr) { + u8 state = adsr->action.s.state; + + switch (state) { + case ADSR_STATE_DISABLED: + return 0.0f; + + case ADSR_STATE_INITIAL: + if (adsr->action.s.hang) { + adsr->action.s.state = ADSR_STATE_HANG; + break; + } + // fallthrough + + case ADSR_STATE_START_LOOP: + adsr->envIndex = 0; + adsr->action.s.state = ADSR_STATE_LOOP; + // fallthrough + + retry: + case ADSR_STATE_LOOP: + adsr->delay = adsr->envelope[adsr->envIndex].delay; + switch (adsr->delay) { + case ADSR_DISABLE: + adsr->action.s.state = ADSR_STATE_DISABLED; + break; + case ADSR_HANG: + adsr->action.s.state = ADSR_STATE_HANG; + break; + case ADSR_GOTO: + adsr->envIndex = adsr->envelope[adsr->envIndex].arg; + goto retry; + case ADSR_RESTART: + adsr->action.s.state = ADSR_STATE_INITIAL; + break; + + default: + adsr->delay *= gAudioContext.audioBufferParameters.unk_24; + if (adsr->delay == 0) { + adsr->delay = 1; + } + adsr->target = adsr->envelope[adsr->envIndex].arg / 32767.0f; + adsr->target = adsr->target * adsr->target; + adsr->velocity = (adsr->target - adsr->current) / adsr->delay; + adsr->action.s.state = ADSR_STATE_FADE; + adsr->envIndex++; + break; + } + if (adsr->action.s.state != ADSR_STATE_FADE) { + break; + } + // fallthrough + + case ADSR_STATE_FADE: + adsr->current += adsr->velocity; + if (--adsr->delay <= 0) { + adsr->action.s.state = ADSR_STATE_LOOP; + } + // fallthrough + + case ADSR_STATE_HANG: + break; + + case ADSR_STATE_DECAY: + case ADSR_STATE_RELEASE: + adsr->current -= adsr->fadeOutVel; + if (adsr->sustain != 0.0f && state == ADSR_STATE_DECAY) { + if (adsr->current < adsr->sustain) { + adsr->current = adsr->sustain; + adsr->delay = 128; + adsr->action.s.state = ADSR_STATE_SUSTAIN; + } + break; + } + + if (adsr->current < 0.00001f) { + adsr->current = 0.0f; + adsr->action.s.state = ADSR_STATE_DISABLED; + } + break; + + case ADSR_STATE_SUSTAIN: + adsr->delay--; + if (adsr->delay == 0) { + adsr->action.s.state = ADSR_STATE_RELEASE; + } + break; + } + + if (adsr->action.s.decay) { + adsr->action.s.state = ADSR_STATE_DECAY; + adsr->action.s.decay = false; + } + + if (adsr->action.s.release) { + adsr->action.s.state = ADSR_STATE_RELEASE; + adsr->action.s.release = false; + } + + if (adsr->current < 0.0f) { + return 0.0f; + } + + if (adsr->current > 1.0f) { + return 1.0f; + } + + return adsr->current; +} diff --git a/src/code/audio/audio_seqplayer.c b/src/code/audio/audio_seqplayer.c index e3841a50a6..ec43757967 100644 --- a/src/code/audio/audio_seqplayer.c +++ b/src/code/audio/audio_seqplayer.c @@ -22,7 +22,7 @@ #pragma GLOBAL_ASM("asm/non_matchings/code/audio_seqplayer/func_80197D24.s") -#pragma GLOBAL_ASM("asm/non_matchings/code/audio_seqplayer/func_80197D4C.s") +#pragma GLOBAL_ASM("asm/non_matchings/code/audio_seqplayer/AudioSeq_SequencePlayerDisable.s") #pragma GLOBAL_ASM("asm/non_matchings/code/audio_seqplayer/func_80197E08.s") diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt index a251e77989..f0caa1238f 100644 --- a/tools/disasm/functions.txt +++ b/tools/disasm/functions.txt @@ -3757,16 +3757,16 @@ 0x801964F8:("func_801964F8",), 0x801965F0:("func_801965F0",), 0x801968C4:("func_801968C4",), - 0x80196A00:("func_80196A00",), - 0x80196BC8:("func_80196BC8",), - 0x80196D20:("func_80196D20",), - 0x80196D7C:("func_80196D7C",), - 0x80196DB4:("func_80196DB4",), - 0x80196FEC:("func_80196FEC",), - 0x80197048:("func_80197048",), - 0x80197138:("func_80197138",), - 0x80197164:("func_80197164",), - 0x80197188:("func_80197188",), + 0x80196A00:("AudioEffects_SequenceChannelProcessSound",), + 0x80196BC8:("AudioEffects_SequencePlayerProcessSound",), + 0x80196D20:("AudioEffects_GetPortamentoFreqScale",), + 0x80196D7C:("AudioEffects_GetVibratoPitchChange",), + 0x80196DB4:("AudioEffects_GetVibratoFreqScale",), + 0x80196FEC:("AudioEffects_NoteVibratoUpdate",), + 0x80197048:("AudioEffects_NoteVibratoInit",), + 0x80197138:("AudioEffects_NotePortamentoInit",), + 0x80197164:("AudioEffects_AdsrInit",), + 0x80197188:("AudioEffects_AdsrUpdate",), 0x801974D0:("func_801974D0",), 0x80197538:("func_80197538",), 0x80197714:("func_80197714",), @@ -3778,7 +3778,7 @@ 0x80197C0C:("func_80197C0C",), 0x80197C8C:("func_80197C8C",), 0x80197D24:("func_80197D24",), - 0x80197D4C:("func_80197D4C",), + 0x80197D4C:("AudioSeq_SequencePlayerDisable",), 0x80197E08:("func_80197E08",), 0x80197E48:("func_80197E48",), 0x80197E88:("func_80197E88",), diff --git a/tools/disasm/variables.txt b/tools/disasm/variables.txt index f1bbbb8d15..6c8568e840 100644 --- a/tools/disasm/variables.txt +++ b/tools/disasm/variables.txt @@ -2261,10 +2261,10 @@ 0x801D4790:("D_801D4790","UNK_TYPE1","",0x1), 0x801D4990:("D_801D4990","UNK_TYPE1","",0x1), 0x801D4B90:("D_801D4B90","UNK_TYPE1","",0x1), - 0x801D4D90:("D_801D4D90","UNK_PTR","",0x4), + 0x801D4D90:("gWaveSamples","UNK_PTR","",0x4), 0x801D4D98:("D_801D4D98","UNK_PTR","",0x4), 0x801D4DB0:("D_801D4DB0","UNK_PTR","",0x4), - 0x801D4DB4:("D_801D4DB4","f32","[256]",0x400), + 0x801D4DB4:("gBendPitchOneOctaveFrequencies","f32","[256]",0x400), 0x801D51B4:("D_801D51B4","f32","[256]",0x400), 0x801D55B4:("D_801D55B4","f32","[128]",0x200), 0x801D57B4:("D_801D57B4","UNK_TYPE1","",0x1), @@ -4420,131 +4420,7 @@ 0x80200BCC:("D_80200BCC","UNK_TYPE1","",0x1), 0x80200BCE:("D_80200BCE","UNK_TYPE1","",0x1), 0x80200BD0:("D_80200BD0","UNK_TYPE1","",0x1), - 0x80200C70:("D_80200C70","UNK_TYPE1","",0x1), - 0x80200C71:("D_80200C71","UNK_TYPE1","",0x1), - 0x80200C76:("D_80200C76","UNK_TYPE1","",0x1), - 0x80200C78:("D_80200C78","UNK_TYPE1","",0x1), - 0x80200C7C:("D_80200C7C","UNK_TYPE1","",0x1), - 0x80200C80:("D_80200C80","UNK_TYPE1","",0x1), - 0x80200C92:("D_80200C92","UNK_TYPE1","",0x1), - 0x80200C94:("D_80200C94","UNK_TYPE1","",0x1), - 0x80200C98:("D_80200C98","UNK_TYPE1","",0x1), - 0x80200C9A:("D_80200C9A","UNK_TYPE1","",0x1), - 0x80200C9E:("D_80200C9E","UNK_TYPE1","",0x1), - 0x80200CA0:("D_80200CA0","UNK_TYPE1","",0x1), - 0x80200CF0:("D_80200CF0","UNK_TYPE1","",0x1), - 0x80200D38:("D_80200D38","UNK_TYPE1","",0x1), - 0x80200D70:("D_80200D70","UNK_TYPE1","",0x1), - 0x802011F0:("D_802011F0","UNK_TYPE1","",0x1), - 0x8020178C:("D_8020178C","UNK_TYPE1","",0x1), - 0x802017B0:("D_802017B0","UNK_TYPE1","",0x1), - 0x80201D68:("D_80201D68","UNK_TYPE1","",0x1), - 0x80201D6C:("D_80201D6C","UNK_TYPE1","",0x1), - 0x802023FC:("D_802023FC","UNK_TYPE1","",0x1), - 0x80202878:("D_80202878","UNK_TYPE1","",0x1), - 0x80202880:("D_80202880","UNK_TYPE1","",0x1), - 0x802028BC:("D_802028BC","UNK_TYPE1","",0x1), - 0x80202980:("D_80202980","OSMesgQueue","",0x18), - 0x802029D8:("D_802029D8","UNK_TYPE1","",0x1), - 0x80202AB0:("D_80202AB0","OSMesgQueue","",0x18), - 0x80202AC8:("D_80202AC8","OSMesg","[16]",0x40), - 0x80202B08:("D_80202B08","OSMesgQueue","",0x18), - 0x80202B20:("D_80202B20","OSMesg","[16]",0x40), - 0x80202B60:("D_80202B60","OSMesgQueue","",0x18), - 0x80202B78:("D_80202B78","OSMesg","[64]",0x100), - 0x80203278:("D_80203278","OSMesgQueue","",0x18), - 0x80203290:("D_80203290","OSMesg","[1]",0x4), - 0x80203294:("D_80203294","UNK_TYPE1","",0x1), - 0x802034C0:("D_802034C0","UNK_TYPE1","",0x1), - 0x802034C4:("D_802034C4","UNK_TYPE1","",0x1), - 0x802034C8:("D_802034C8","UNK_TYPE1","",0x1), - 0x802034D0:("D_802034D0","UNK_TYPE4","",0x4), - 0x802034D4:("D_802034D4","UNK_TYPE1","",0x1), - 0x802034D8:("D_802034D8","UNK_TYPE1","",0x1), - 0x802034DC:("D_802034DC","UNK_TYPE1","",0x1), - 0x802034E8:("D_802034E8","UNK_TYPE1","",0x1), - 0x802034F0:("D_802034F0","UNK_TYPE2","",0x2), - 0x802034F8:("D_802034F8","UNK_TYPE1","",0x1), - 0x802034FC:("D_802034FC","UNK_TYPE1","",0x1), - 0x80203500:("D_80203500","UNK_TYPE1","",0x1), - 0x80203528:("D_80203528","UNK_TYPE4","",0x4), - 0x8020352C:("D_8020352C","UNK_TYPE1","",0x1), - 0x8020352E:("D_8020352E","UNK_TYPE1","",0x1), - 0x80203530:("D_80203530","UNK_TYPE1","",0x1), - 0x8020360C:("D_8020360C","UNK_TYPE4","",0x4), - 0x80203618:("D_80203618","UNK_TYPE1","",0x1), - 0x8020361C:("D_8020361C","UNK_TYPE1","",0x1), - 0x80203620:("D_80203620","UNK_TYPE1","",0x1), - 0x80203624:("D_80203624","UNK_TYPE1","",0x1), - 0x80203628:("D_80203628","UNK_TYPE1","",0x1), - 0x80203630:("D_80203630","UNK_TYPE1","",0x1), - 0x80203640:("D_80203640","UNK_TYPE1","",0x1), - 0x80203650:("D_80203650","UNK_TYPE1","",0x1), - 0x80203660:("D_80203660","UNK_TYPE1","",0x1), - 0x80203690:("D_80203690","UNK_TYPE1","",0x1), - 0x802036A0:("D_802036A0","UNK_TYPE1","",0x1), - 0x802036B0:("D_802036B0","UNK_TYPE1","",0x1), - 0x802036C0:("D_802036C0","UNK_TYPE1","",0x1), - 0x802036C4:("D_802036C4","UNK_TYPE1","",0x1), - 0x80203794:("D_80203794","UNK_TYPE1","",0x1), - 0x80203798:("D_80203798","UNK_TYPE1","",0x1), - 0x802037D0:("D_802037D0","UNK_TYPE1","",0x1), - 0x802037D4:("D_802037D4","UNK_TYPE1","",0x1), - 0x802038A4:("D_802038A4","UNK_TYPE1","",0x1), - 0x802038A8:("D_802038A8","UNK_TYPE1","",0x1), - 0x802038C2:("D_802038C2","UNK_TYPE1","",0x1), - 0x802038CE:("D_802038CE","UNK_TYPE1","",0x1), - 0x802038E0:("D_802038E0","UNK_TYPE1","",0x1), - 0x802038E4:("D_802038E4","UNK_TYPE1","",0x1), - 0x80203970:("D_80203970","UNK_TYPE1","",0x1), - 0x802039B4:("D_802039B4","UNK_TYPE1","",0x1), - 0x802039B8:("D_802039B8","UNK_TYPE1","",0x1), - 0x802039D2:("D_802039D2","UNK_TYPE1","",0x1), - 0x802039DE:("D_802039DE","UNK_TYPE1","",0x1), - 0x802039F0:("D_802039F0","UNK_TYPE1","",0x1), - 0x802039FC:("D_802039FC","UNK_TYPE1","",0x1), - 0x80203B80:("D_80203B80","UNK_TYPE1","",0x1), - 0x80203B88:("D_80203B88","UNK_TYPE1","",0x1), - 0x80203B90:("D_80203B90","UNK_TYPE1","",0x1), - 0x80204590:("D_80204590","UNK_TYPE1","",0x1), - 0x80204594:("D_80204594","UNK_TYPE1","",0x1), - 0x80204598:("D_80204598","UNK_TYPE1","",0x1), - 0x802045A4:("D_802045A4","UNK_TYPE1","",0x1), - 0x80204FA4:("D_80204FA4","UNK_TYPE1","",0x1), - 0x80204FA8:("D_80204FA8","UNK_TYPE1","",0x1), - 0x80204FB4:("D_80204FB4","UNK_TYPE1","",0x1), - 0x80204FB8:("D_80204FB8","UNK_TYPE1","",0x1), - 0x80204FC0:("D_80204FC0","UNK_TYPE1","",0x1), - 0x80204FCC:("D_80204FCC","UNK_TYPE1","",0x1), - 0x80204FD8:("D_80204FD8","UNK_TYPE1","",0x1), - 0x80205008:("D_80205008","UNK_TYPE1","",0x1), - 0x80205038:("D_80205038","UNK_TYPE1","",0x1), - 0x802050B9:("D_802050B9","UNK_TYPE1","",0x1), - 0x802050C0:("D_802050C0","UNK_TYPE1","",0x1), - 0x802050C4:("D_802050C4","UNK_TYPE1","",0x1), - 0x802050CC:("D_802050CC","UNK_TYPE4","",0x4), - 0x802050D0:("D_802050D0","UNK_TYPE4","",0x4), - 0x80205228:("D_80205228","UNK_TYPE1","",0x1), - 0x8020522B:("D_8020522B","UNK_TYPE1","",0x1), - 0x80205390:("D_80205390","UNK_TYPE1","",0x1), - 0x802053C8:("D_802053C8","UNK_TYPE1","",0x1), - 0x802057B0:("D_802057B0","UNK_TYPE1","",0x1), - 0x80205830:("D_80205830","UNK_TYPE1","",0x1), - 0x802084B0:("D_802084B0","UNK_TYPE1","",0x1), - 0x80208530:("D_80208530","UNK_TYPE1","",0x1), - 0x80208598:("D_80208598","UNK_TYPE1","",0x1), - 0x802085A8:("D_802085A8","UNK_TYPE1","",0x1), - 0x802085B8:("D_802085B8","UNK_TYPE1","",0x1), - 0x802085C8:("D_802085C8","UNK_TYPE1","",0x1), - 0x802085D8:("D_802085D8","UNK_TYPE1","",0x1), - 0x802085F8:("D_802085F8","UNK_TYPE1","",0x1), - 0x802085FC:("D_802085FC","UNK_TYPE1","",0x1), - 0x80208604:("D_80208604","UNK_TYPE1","",0x1), - 0x8020861C:("D_8020861C","UNK_TYPE1","",0x1), - 0x80208634:("D_80208634","UNK_TYPE1","",0x1), - 0x8020864C:("D_8020864C","UNK_TYPE1","",0x1), - 0x80208650:("D_80208650","UNK_TYPE1","",0x1), - 0x80208654:("D_80208654","UNK_TYPE1","",0x1), + 0x80200C70:("gAudioContext","AudioContext","",0x81F8), 0x80208E68:("D_80208E68","UNK_TYPE4","",0x4), 0x80208E6C:("D_80208E6C","UNK_TYPE4","",0x4), 0x80208E70:("D_80208E70","UNK_TYPE4","",0x4), diff --git a/tools/sizes/code_functions.csv b/tools/sizes/code_functions.csv index ea6a1c6b87..31ad65d9fc 100644 --- a/tools/sizes/code_functions.csv +++ b/tools/sizes/code_functions.csv @@ -3275,16 +3275,16 @@ asm/non_matchings/code/audio_playback/func_80196494.s,func_80196494,0x80196494,0 asm/non_matchings/code/audio_playback/func_801964F8.s,func_801964F8,0x801964F8,0x3E asm/non_matchings/code/audio_playback/func_801965F0.s,func_801965F0,0x801965F0,0xB5 asm/non_matchings/code/audio_playback/func_801968C4.s,func_801968C4,0x801968C4,0x4F -asm/non_matchings/code/audio_effects/func_80196A00.s,func_80196A00,0x80196A00,0x72 -asm/non_matchings/code/audio_effects/func_80196BC8.s,func_80196BC8,0x80196BC8,0x56 -asm/non_matchings/code/audio_effects/func_80196D20.s,func_80196D20,0x80196D20,0x17 -asm/non_matchings/code/audio_effects/func_80196D7C.s,func_80196D7C,0x80196D7C,0xE -asm/non_matchings/code/audio_effects/func_80196DB4.s,func_80196DB4,0x80196DB4,0x8E -asm/non_matchings/code/audio_effects/func_80196FEC.s,func_80196FEC,0x80196FEC,0x17 -asm/non_matchings/code/audio_effects/func_80197048.s,func_80197048,0x80197048,0x3C -asm/non_matchings/code/audio_effects/func_80197138.s,func_80197138,0x80197138,0xB -asm/non_matchings/code/audio_effects/func_80197164.s,func_80197164,0x80197164,0x9 -asm/non_matchings/code/audio_effects/func_80197188.s,func_80197188,0x80197188,0xD2 +asm/non_matchings/code/audio_effects/AudioEffects_SequenceChannelProcessSound.s,AudioEffects_SequenceChannelProcessSound,0x80196A00,0x72 +asm/non_matchings/code/audio_effects/AudioEffects_SequencePlayerProcessSound.s,AudioEffects_SequencePlayerProcessSound,0x80196BC8,0x56 +asm/non_matchings/code/audio_effects/AudioEffects_GetPortamentoFreqScale.s,AudioEffects_GetPortamentoFreqScale,0x80196D20,0x17 +asm/non_matchings/code/audio_effects/AudioEffects_GetVibratoPitchChange.s,AudioEffects_GetVibratoPitchChange,0x80196D7C,0xE +asm/non_matchings/code/audio_effects/AudioEffects_GetVibratoFreqScale.s,AudioEffects_GetVibratoFreqScale,0x80196DB4,0x8E +asm/non_matchings/code/audio_effects/AudioEffects_NoteVibratoUpdate.s,AudioEffects_NoteVibratoUpdate,0x80196FEC,0x17 +asm/non_matchings/code/audio_effects/AudioEffects_NoteVibratoInit.s,AudioEffects_NoteVibratoInit,0x80197048,0x3C +asm/non_matchings/code/audio_effects/AudioEffects_NotePortamentoInit.s,AudioEffects_NotePortamentoInit,0x80197138,0xB +asm/non_matchings/code/audio_effects/AudioEffects_AdsrInit.s,AudioEffects_AdsrInit,0x80197164,0x9 +asm/non_matchings/code/audio_effects/AudioEffects_AdsrUpdate.s,AudioEffects_AdsrUpdate,0x80197188,0xD2 asm/non_matchings/code/audio_seqplayer/func_801974D0.s,func_801974D0,0x801974D0,0x1A asm/non_matchings/code/audio_seqplayer/func_80197538.s,func_80197538,0x80197538,0x77 asm/non_matchings/code/audio_seqplayer/func_80197714.s,func_80197714,0x80197714,0x5B @@ -3296,7 +3296,7 @@ asm/non_matchings/code/audio_seqplayer/func_80197B14.s,func_80197B14,0x80197B14, asm/non_matchings/code/audio_seqplayer/func_80197C0C.s,func_80197C0C,0x80197C0C,0x20 asm/non_matchings/code/audio_seqplayer/func_80197C8C.s,func_80197C8C,0x80197C8C,0x26 asm/non_matchings/code/audio_seqplayer/func_80197D24.s,func_80197D24,0x80197D24,0xA -asm/non_matchings/code/audio_seqplayer/func_80197D4C.s,func_80197D4C,0x80197D4C,0x2F +asm/non_matchings/code/audio_seqplayer/AudioSeq_SequencePlayerDisable.s,AudioSeq_SequencePlayerDisable,0x80197D4C,0x2F asm/non_matchings/code/audio_seqplayer/func_80197E08.s,func_80197E08,0x80197E08,0x10 asm/non_matchings/code/audio_seqplayer/func_80197E48.s,func_80197E48,0x80197E48,0x10 asm/non_matchings/code/audio_seqplayer/func_80197E88.s,func_80197E88,0x80197E88,0x28