diff --git a/include/functions.h b/include/functions.h index 53f6af07f6..1b1548c159 100644 --- a/include/functions.h +++ b/include/functions.h @@ -912,106 +912,6 @@ void Audio_ResetForAudioHeapStep2(void); void Audio_ResetForAudioHeapStep1(s32 specId); void Audio_PreNMI(void); -void AudioOcarina_SetSongStartingPos(void); -void AudioOcarina_StartAtSongStartingPos(u32 ocarinaFlags); -void AudioOcarina_StartForSongCheck(u32 ocarinaFlags, u8 ocarinaStaffPlayingPosStart); -void AudioOcarina_StartWithSongNoteLengths(u32 ocarinaFlags); -void AudioOcarina_StartDefault(u32 ocarinaFlags); -u8 func_8019B5AC(void); -void AudioOcarina_ResetAndReadInput(void); -void AudioOcarina_SetOcarinaDisableTimer(u8 unused, u8 timer); -void AudioOcarina_SetInstrument(u8 ocarinaInstrumentId); -void AudioOcarina_SetPlaybackSong(s8 songIndexPlusOne, u8 playbackState); -void AudioOcarina_SetRecordingState(u8 recordingState); -OcarinaStaff* AudioOcarina_GetRecordingStaff(void); -OcarinaStaff* AudioOcarina_GetPlayingStaff(void); -OcarinaStaff* AudioOcarina_GetPlaybackStaff(void); -void AudioOcarina_TerminaWallGenerateNotes(void); -void AudioOcarina_PlayLongScarecrowSong(void); - -void AudioSfx_SetProperties(u8 bankId, u8 entryIndex, u8 channelIndex); -void AudioSfx_LowerSfxSettingsReverb(Vec3f* pos, s8 isReverbLowered); -void AudioSfx_SetChannelIO(Vec3f* pos, u16 sfxId, u8 ioData); - -void Audio_PlayObjSoundBgm(Vec3f* pos, s8 seqId); -void Audio_PlayObjSoundFanfare(Vec3f* pos, s8 seqId); -void Audio_PlaySubBgmAtPos(Vec3f* pos, u8 seqId, f32 maxDist); -void Audio_PlaySubBgmAtPosWithFilter(Vec3f* pos, u8 seqId, f32 maxDist); -void Audio_PlaySequenceAtDefaultPos(u8 seqPlayerIndex, u16 seqId); -void Audio_PlaySequenceAtPos(u8 seqPlayerIndex, Vec3f* pos, u16 seqId, f32 maxDist); -void Audio_PlayMorningSceneSequence(u16 seqId, u8 dayMinusOne); -void Audio_PlaySceneSequence(u16 seqId, u8 dayMinusOne); -void Audio_PlaySubBgm(u16 seqId); -void Audio_PlaySequenceInCutscene(u16 seqId); -void Audio_PlayBgm_StorePrevBgm(u16 seqId); -void Audio_PlayFanfareWithPlayerIOPort7(u16 seqId, u8 ioData); -void Audio_PlayFanfare(u16 seqId); -void Audio_PlayFanfareWithPlayerIOCustomPort(u16 seqId, s8 ioPort, u8 ioData); -void Audio_PlaySequenceWithSeqPlayerIO(s8 seqPlayerIndex, u16 seqId, u8 fadeInDuration, s8 ioPort, u8 ioData); -void Audio_PlayAmbience(u8 ambienceId); - -void Audio_StopSequenceAtDefaultPos(void); -void Audio_StopSubBgm(void); -void Audio_StopSequenceInCutscene(u16 seqId); -void Audio_StopFanfare(u16 duration); - -void Audio_SetBgmVolumeOff(void); -void Audio_SetBgmVolumeOn(void); -void Audio_SetMainBgmVolume(u8 targetVolume, u8 volumeFadeTimer); -void Audio_SetSequenceMode(u8 seqMode); -void Audio_SetPauseState(u8 isPauseMenuOpen); -void Audio_SetEnvReverb(s8 reverb); -void Audio_SetCodeReverb(s8 reverb); -void Audio_SetFileSelectSettings(s8 audioSetting); -void Audio_SetBaseFilter(u8 filter); -void Audio_SetExtraFilter(u8 filter); -void Audio_SetCutsceneFlag(s8 flag); -void Audio_SetSpec(u8 specId); -void Audio_SetAmbienceChannelIO(u8 channelIndexRange, u8 ioPort, u8 ioData); -void Audio_SetSeqTempoAndFreq(u8 seqPlayerIndex, f32 freqTempoScale, u8 duration); - -void Audio_MuteSeqPlayerBgmSub(u8 isMuted); -void Audio_MuteAllSeqExceptSystemAndOcarina(u16 duration); -void Audio_MuteSfxAndAmbienceSeqExceptSysAndOca(u16 duration); - -void func_801A0204(s8 seqId); -void func_801A246C(u8 seqPlayerIndex, u8 type); -s32 Audio_IsSequencePlaying(u8 seqId); -void Audio_RestorePrevBgm(void); -void Audio_UpdateEnemyBgmVolume(f32 dist); -u8 func_801A3950(u8 seqPlayerIndex, u8 resetChannelIO); -u8 func_801A39F8(void); -s32 func_801A46F8(void); - -void AudioSfx_MuteBanks(u16 muteMask); -void AudioSfx_LowerBgmVolume(u8 channelIndex); -void AudioSfx_RestoreBgmVolume(u8 channelIndex); -void AudioSfx_PlaySfx(u16 sfxId, Vec3f* pos, u8 token, f32* freqScale, f32* volume, s8* reverbAdd); -void AudioSfx_ProcessRequest(void); -void AudioSfx_StopByBank(u8 bankId); -void AudioSfx_StopByPosAndBank(u8 bankId, Vec3f* pos); -void AudioSfx_StopByPos(Vec3f* pos); -void AudioSfx_StopByPosAndId(Vec3f* pos, u16 sfxId); -void AudioSfx_StopByTokenAndId(u8 token, u16 sfxId); -void AudioSfx_StopById(u32 sfxId); -void AudioSfx_ProcessRequests(void); -void AudioSfx_ProcessActiveSfx(void); -u8 AudioSfx_IsPlaying(u32 sfxId); -void AudioSfx_Reset(void); - -void AudioSeq_StartSequence(u8 seqPlayerIndex, u8 seqId, u8 seqArgs, u16 fadeInDuration); -void AudioSeq_StopSequence(u8 seqPlayerIndex, u16 fadeOutDuration); -void AudioSeq_QueueSeqCmd(u32 cmd); -void AudioSeq_ProcessSeqCmds(void); -u16 AudioSeq_GetActiveSeqId(u8 seqPlayerIndex); -s32 AudioSeq_IsSeqCmdNotQueued(u32 cmdVal, u32 cmdMask); -void AudioSeq_SetVolumeScale(u8 seqPlayerIndex, u8 scaleIndex, u8 targetVol, u8 volFadeTimer); -void AudioSeq_UpdateActiveSequences(void); -u8 AudioSeq_UpdateAudioHeapReset(void); -u8 AudioSeq_ResetReverb(void); -void AudioSeq_ResetActiveSequences(void); -void AudioSeq_ResetActiveSequencesAndVolume(void); - void Regs_InitData(PlayState* play); #endif diff --git a/include/sequence.h b/include/sequence.h index c9f1aa3f89..2dcecee506 100644 --- a/include/sequence.h +++ b/include/sequence.h @@ -1,6 +1,9 @@ #ifndef SEQUENCE_H #define SEQUENCE_H +#include "PR/ultratypes.h" +#include "z64math.h" + // For the defines below, the names in quotes come from the official soundtrack, // and the names in parentheses are internal names that come from MM3D. #define NA_BGM_GENERAL_SFX 0x00 // General Sound Effects @@ -137,7 +140,7 @@ #define SEQ_FLAG_ASYNC 0x8000 -typedef enum { +typedef enum SequencePlayerId { /* 0 */ SEQ_PLAYER_BGM_MAIN, /* 1 */ SEQ_PLAYER_FANFARE, /* 2 */ SEQ_PLAYER_SFX, @@ -147,25 +150,25 @@ typedef enum { /* 0xFF */ SEQ_PLAYER_INVALID = 0xFF } SequencePlayerId; -typedef enum { +typedef enum SequenceMode { /* 0 */ SEQ_MODE_DEFAULT, /* 1 */ SEQ_MODE_ENEMY, /* 2 */ SEQ_MODE_STILL, // Not moving or first-person view /* 3 */ SEQ_MODE_IGNORE } SequenceMode; -typedef enum { - /* 0x0 */ CHANNEL_IO_PORT_0, - /* 0x1 */ CHANNEL_IO_PORT_1, - /* 0x2 */ CHANNEL_IO_PORT_2, - /* 0x3 */ CHANNEL_IO_PORT_3, - /* 0x4 */ CHANNEL_IO_PORT_4, - /* 0x5 */ CHANNEL_IO_PORT_5, - /* 0x6 */ CHANNEL_IO_PORT_6, - /* 0x7 */ CHANNEL_IO_PORT_7 +typedef enum ChannelIOPort { + /* 0 */ CHANNEL_IO_PORT_0, + /* 1 */ CHANNEL_IO_PORT_1, + /* 2 */ CHANNEL_IO_PORT_2, + /* 3 */ CHANNEL_IO_PORT_3, + /* 4 */ CHANNEL_IO_PORT_4, + /* 5 */ CHANNEL_IO_PORT_5, + /* 6 */ CHANNEL_IO_PORT_6, + /* 7 */ CHANNEL_IO_PORT_7 } ChannelIOPort; -typedef enum { +typedef enum VolumeScaleIndex { /* 0 */ VOL_SCALE_INDEX_BGM_MAIN, /* 1 */ VOL_SCALE_INDEX_FANFARE, /* 2 */ VOL_SCALE_INDEX_SFX, @@ -173,7 +176,7 @@ typedef enum { /* 4 */ VOL_SCALE_INDEX_MAX } VolumeScaleIndex; // May be worth using SequencePlayerId instead -typedef enum { +typedef enum AmbienceChannelIndex { /* 0x0 */ AMBIENCE_CHANNEL_STREAM_0, /* 0x1 */ AMBIENCE_CHANNEL_CRITTER_0, /* 0x2 */ AMBIENCE_CHANNEL_CRITTER_1, @@ -189,7 +192,7 @@ typedef enum { /* 0xF */ AMBIENCE_CHANNEL_LIGHTNING } AmbienceChannelIndex; // seqPlayerIndex = SEQ_PLAYER_AMBIENCE -typedef enum { +typedef enum AmbienceId { /* 0x00 */ AMBIENCE_ID_00, /* 0x01 */ AMBIENCE_ID_01, /* 0x02 */ AMBIENCE_ID_02, @@ -213,14 +216,14 @@ typedef enum { /* 0xFF */ AMBIENCE_ID_DISABLED = 0xFF } AmbienceId; // seqPlayerIndex = SEQ_PLAYER_AMBIENCE -typedef enum { - /* 0x00 */ AMBIENCE_STREAM_0, - /* 0x01 */ AMBIENCE_STREAM_1, - /* 0x02 */ AMBIENCE_STREAM_2, - /* 0x03 */ AMBIENCE_STREAM_3 +typedef enum AmbienceStreamId { + /* 0 */ AMBIENCE_STREAM_0, + /* 1 */ AMBIENCE_STREAM_1, + /* 2 */ AMBIENCE_STREAM_2, + /* 3 */ AMBIENCE_STREAM_3 } AmbienceStreamId; -typedef enum { +typedef enum AmbienceCritterId { /* 0x00 */ AMBIENCE_CRITTER_00, /* 0x01 */ AMBIENCE_CRITTER_01, /* 0x02 */ AMBIENCE_CRITTER_02, @@ -290,4 +293,123 @@ typedef enum { #define AMBIENCE_IO_ENTRIES_END 0xFF +typedef struct { + /* 0x00 */ f32 volCur; + /* 0x04 */ f32 volTarget; + /* 0x08 */ f32 volStep; + /* 0x0C */ f32 freqScaleCur; + /* 0x10 */ f32 freqScaleTarget; + /* 0x14 */ f32 freqScaleStep; + /* 0x18 */ u16 volTimer; + /* 0x1A */ u16 freqScaleTimer; +} ActiveSequenceChannelData; // size = 0x1C + +typedef struct { + /* 0x000 */ ActiveSequenceChannelData channelData[16]; // SEQ_NUM_CHANNELS + /* 0x1C0 */ f32 volCur; + /* 0x1C4 */ f32 volTarget; + /* 0x1C8 */ f32 volStep; + /* 0x1CC */ u32 tempoCmd; + /* 0x1D0 */ f32 tempoCur; + /* 0x1D4 */ f32 tempoTarget; + /* 0x1D8 */ f32 tempoStep; + /* 0x1DC */ u32 setupCmd[8]; // setup commands + /* 0x1FC */ u32 startAsyncSeqCmd; // temporarily stores the seqCmd used in SEQCMD_PLAY_SEQUENCE, to be called again once the font is reloaded in + /* 0x200 */ u16 volTimer; + /* 0x202 */ u16 tempoOriginal; + /* 0x204 */ u16 tempoTimer; + /* 0x206 */ u16 freqScaleChannelFlags; + /* 0x208 */ u16 volChannelFlags; + /* 0x20A */ u16 seqId; + /* 0x20C */ u16 prevSeqId; // last seqId played on a player + /* 0x20E */ u16 channelPortMask; + /* 0x210 */ u8 isWaitingForFonts; + /* 0x211 */ u8 fontId; + /* 0x212 */ u8 volScales[VOL_SCALE_INDEX_MAX]; + /* 0x216 */ u8 volFadeTimer; + /* 0x217 */ u8 fadeVolUpdate; + /* 0x218 */ u8 setupCmdTimer; + /* 0x219 */ u8 setupCmdNum; // number of setup commands + /* 0x21A */ u8 setupFadeTimer; + /* 0x21B */ u8 isSeqPlayerInit; +} ActiveSequence; // size = 0x21C + +typedef struct { + /* 0x0 */ u8 seqId; + /* 0x1 */ u8 priority; +} SeqRequest; // size = 0x2 + +// functions in sequence.c + +void AudioSeq_StartSequence(u8 seqPlayerIndex, u8 seqId, u8 seqArgs, u16 fadeInDuration); +void AudioSeq_StopSequence(u8 seqPlayerIndex, u16 fadeOutDuration); +void AudioSeq_QueueSeqCmd(u32 cmd); +void AudioSeq_ProcessSeqCmds(void); +u16 AudioSeq_GetActiveSeqId(u8 seqPlayerIndex); +s32 AudioSeq_IsSeqCmdNotQueued(u32 cmdVal, u32 cmdMask); +void AudioSeq_SetVolumeScale(u8 seqPlayerIndex, u8 scaleIndex, u8 targetVol, u8 volFadeTimer); +void AudioSeq_UpdateActiveSequences(void); +u8 AudioSeq_UpdateAudioHeapReset(void); +u8 AudioSeq_ResetReverb(void); +void AudioSeq_ResetActiveSequences(void); +void AudioSeq_ResetActiveSequencesAndVolume(void); + +// functions in code_8019AF00.c + +void Audio_PlayObjSoundBgm(Vec3f* pos, s8 seqId); +void Audio_PlayObjSoundFanfare(Vec3f* pos, s8 seqId); +void Audio_PlaySubBgmAtPos(Vec3f* pos, u8 seqId, f32 maxDist); +void Audio_PlaySubBgmAtPosWithFilter(Vec3f* pos, u8 seqId, f32 maxDist); +void Audio_PlaySequenceAtDefaultPos(u8 seqPlayerIndex, u16 seqId); +void Audio_PlaySequenceAtPos(u8 seqPlayerIndex, Vec3f* pos, u16 seqId, f32 maxDist); +void Audio_PlayMorningSceneSequence(u16 seqId, u8 dayMinusOne); +void Audio_PlaySceneSequence(u16 seqId, u8 dayMinusOne); +void Audio_PlaySubBgm(u16 seqId); +void Audio_PlaySequenceInCutscene(u16 seqId); +void Audio_PlayBgm_StorePrevBgm(u16 seqId); +void Audio_PlayFanfareWithPlayerIOPort7(u16 seqId, u8 ioData); +void Audio_PlayFanfare(u16 seqId); +void Audio_PlayFanfareWithPlayerIOCustomPort(u16 seqId, s8 ioPort, u8 ioData); +void Audio_PlaySequenceWithSeqPlayerIO(s8 seqPlayerIndex, u16 seqId, u8 fadeInDuration, s8 ioPort, u8 ioData); +void Audio_PlayAmbience(u8 ambienceId); + +void Audio_StopSequenceAtDefaultPos(void); +void Audio_StopSubBgm(void); +void Audio_StopSequenceInCutscene(u16 seqId); +void Audio_StopFanfare(u16 duration); + +void Audio_SetBgmVolumeOff(void); +void Audio_SetBgmVolumeOn(void); +void Audio_SetMainBgmVolume(u8 targetVolume, u8 volumeFadeTimer); +void Audio_SetSequenceMode(u8 seqMode); + +void Audio_SetPauseState(u8 isPauseMenuOpen); +void Audio_SetEnvReverb(s8 reverb); +void Audio_SetCodeReverb(s8 reverb); +void Audio_SetFileSelectSettings(s8 audioSetting); +void Audio_SetBaseFilter(u8 filter); +void Audio_SetExtraFilter(u8 filter); +void Audio_SetCutsceneFlag(s8 flag); +void Audio_SetSpec(u8 specId); +void Audio_SetAmbienceChannelIO(u8 channelIndexRange, u8 ioPort, u8 ioData); +void Audio_SetSeqTempoAndFreq(u8 seqPlayerIndex, f32 freqTempoScale, u8 duration); + +void Audio_MuteSeqPlayerBgmSub(u8 isMuted); +void Audio_MuteAllSeqExceptSystemAndOcarina(u16 duration); +void Audio_MuteSfxAndAmbienceSeqExceptSysAndOca(u16 duration); + +void func_801A0204(s8 seqId); +void func_801A246C(u8 seqPlayerIndex, u8 type); +s32 Audio_IsSequencePlaying(u8 seqId); +void Audio_RestorePrevBgm(void); +void Audio_UpdateEnemyBgmVolume(f32 dist); +u8 func_801A3950(u8 seqPlayerIndex, u8 resetChannelIO); +u8 func_801A39F8(void); +s32 func_801A46F8(void); + +extern SeqRequest sSeqRequests[][5]; +extern u8 sNumSeqRequests[5]; +extern u32 sAudioSeqCmds[0xB0]; +extern ActiveSequence gActiveSeqs[]; + #endif diff --git a/include/sfx.h b/include/sfx.h index 98192ec58a..bfb42119d8 100644 --- a/include/sfx.h +++ b/include/sfx.h @@ -1,6 +1,7 @@ #ifndef SFX_H #define SFX_H +#include "PR/ultratypes.h" #include "z64math.h" /** @@ -2361,6 +2362,153 @@ typedef enum SfxPauseMenu { /* 1 */ SFX_PAUSE_MENU_OPEN } SfxPauseMenu; +typedef enum SfxBankType { + /* 0 */ BANK_PLAYER, + /* 1 */ BANK_ITEM, + /* 2 */ BANK_ENV, + /* 3 */ BANK_ENEMY, + /* 4 */ BANK_SYSTEM, + /* 5 */ BANK_OCARINA, + /* 6 */ BANK_VOICE +} SfxBankType; + +typedef enum SfxState { + /* 0 */ SFX_STATE_EMPTY, + /* 1 */ SFX_STATE_QUEUED, + /* 2 */ SFX_STATE_READY, + /* 3 */ SFX_STATE_PLAYING_REFRESH, + /* 4 */ SFX_STATE_PLAYING, + /* 5 */ SFX_STATE_PLAYING_ONE_FRAME +} SfxState; + +typedef struct { + /* 0x00 */ f32* posX; + /* 0x04 */ f32* posY; + /* 0x08 */ f32* posZ; + /* 0x0C */ f32* freqScale; + /* 0x10 */ f32* volume; + /* 0x14 */ s8* reverbAdd; + /* 0x18 */ f32 dist; + /* 0x1C */ u32 priority; // lower is more prioritized + /* 0x20 */ u16 sfxParams; + /* 0x22 */ u16 sfxId; + /* 0x25 */ u8 sfxFlags; + /* 0x24 */ u8 sfxImportance; + /* 0x26 */ u8 state; // uses SfxState enum + /* 0x27 */ u8 freshness; + /* 0x28 */ u8 prev; + /* 0x29 */ u8 next; + /* 0x2A */ u8 channelIndex; + /* 0x2B */ u8 randFreq; + /* 0x2C */ u8 token; +} SfxBankEntry; // size = 0x30 + +#define SFX_BANK_SHIFT(sfxId) (((sfxId) >> 12) & 0xFF) + +#define SFX_BANK_MASK(sfxId) ((sfxId) & 0xF000) + +#define SFX_INDEX(sfxId) ((sfxId) & 0x3FF) +#define SFX_BANK(sfxId) SFX_BANK_SHIFT(SFX_BANK_MASK(sfxId)) + +typedef struct { + /* 0x0 */ u32 priority; // lower is more prioritized + /* 0x4 */ u8 entryIndex; +} ActiveSfx; // size = 0x08 + +// SfxParams bit-packing + +// Slows the decay of volume with distance (a 3-bit number ranging from 0-7) +#define SFX_PARAM_DIST_RANGE_SHIFT 0 +#define SFX_PARAM_DIST_RANGE_MASK_UPPER (4 << SFX_PARAM_DIST_RANGE_SHIFT) +#define SFX_PARAM_DIST_RANGE_MASK (7 << SFX_PARAM_DIST_RANGE_SHIFT) + +// Lower SEQ_PLAYER_BGM_MAIN and SEQ_PLAYER_BGM_SUB while the sfx is playing +#define SFX_FLAG_LOWER_VOLUME_BGM (1 << 3) + +// Sfx priority is not raised with distance (making it more likely to be ejected) +#define SFX_FLAG_PRIORITY_NO_DIST (1 << 4) + +// If a new sfx is requested at both the same position with the same importance, +// Block that new sfx from replacing the current sfx +// Note: Only 1 sfx can be played at a specific position at once +#define SFX_FLAG_BLOCK_EQUAL_IMPORTANCE (1 << 5) + +// Applies increasingly random offsets to frequency (a 2-bit number ranging from 0-3) +#define SFX_PARAM_RAND_FREQ_RAISE_SHIFT 6 +#define SFX_PARAM_RAND_FREQ_RAISE_MASK (3 << SFX_PARAM_RAND_FREQ_RAISE_SHIFT) + +// Sets a flag to ioPort 5 +#define SFX_FLAG_8 (1 << 8) + +// Use lowpass filter on surround sound +#define SFX_FLAG_SURROUND_LOWPASS_FILTER (1 << 9) + +// Unused remnant of OoT +#define SFX_FLAG_BEHIND_SCREEN_Z_INDEX_SHIFT 10 +#define SFX_FLAG_BEHIND_SCREEN_Z_INDEX (1 << SFX_FLAG_BEHIND_SCREEN_Z_INDEX_SHIFT) + +// Randomly scale base frequency each frame through mutiplicative offset +#define SFX_PARAM_RAND_FREQ_SCALE (1 << 11) + +// Sfx reverb is not raised with distance +#define SFX_FLAG_REVERB_NO_DIST (1 << 12) + +// Sfx volume is not lowered with distance +#define SFX_FLAG_VOLUME_NO_DIST (1 << 13) + +// SFX_FLAG_VIBRATO +// Randomly lower base frequency each frame through additive offset +#define SFX_PARAM_RAND_FREQ_LOWER (1 << 14) + +// Sfx frequency is not raised with distance +#define SFX_FLAG_FREQ_NO_DIST (1 << 15) + +// Force the sfx to reset from the beginning when requested again +#define SFX_FLAG2_FORCE_RESET (1 << 0) + +// Unused +#define SFX_FLAG2_UNUSED2 (1 << 2) +#define SFX_FLAG2_UNUSED4 (1 << 4) + +// Do not use highpass filter on surround sound +#define SFX_FLAG2_SURROUND_NO_HIGHPASS_FILTER (1 << 5) + +// Unused +#define SFX_FLAG2_UNUSED6 (1 << 6) + +// Apply a low-pass filter with a lowPassCutoff of 4 +#define SFX_FLAG2_APPLY_LOWPASS_FILTER (1 << 7) + +typedef struct { + /* 0x0 */ u8 importance; + /* 0x1 */ u8 flags; + /* 0x2 */ u16 params; +} SfxParams; // size = 0x4 + +// functions in sfx.c + +void AudioSfx_MuteBanks(u16 muteMask); +void AudioSfx_LowerBgmVolume(u8 channelIndex); +void AudioSfx_RestoreBgmVolume(u8 channelIndex); +void AudioSfx_PlaySfx(u16 sfxId, Vec3f* pos, u8 token, f32* freqScale, f32* volume, s8* reverbAdd); +void AudioSfx_ProcessRequest(void); +void AudioSfx_StopByBank(u8 bankId); +void AudioSfx_StopByPosAndBank(u8 bankId, Vec3f* pos); +void AudioSfx_StopByPos(Vec3f* pos); +void AudioSfx_StopByPosAndId(Vec3f* pos, u16 sfxId); +void AudioSfx_StopByTokenAndId(u8 token, u16 sfxId); +void AudioSfx_StopById(u32 sfxId); +void AudioSfx_ProcessRequests(void); +void AudioSfx_ProcessActiveSfx(void); +u8 AudioSfx_IsPlaying(u32 sfxId); +void AudioSfx_Reset(void); + +// functions in code_8019AF00.c + +void AudioSfx_SetProperties(u8 bankId, u8 entryIndex, u8 channelIndex); +void AudioSfx_LowerSfxSettingsReverb(Vec3f* pos, s8 isReverbLowered); +void AudioSfx_SetChannelIO(Vec3f* pos, u16 sfxId, u8 ioData); + // Various wrappers to AudioSfx_PlaySfx void Audio_PlaySfx(u16 sfxId); void Audio_PlaySfx_2(u16 sfxId); @@ -2396,4 +2544,18 @@ void Audio_SetSfxTimerLerpInterval(s8 timerLerpRange1, s8 timerLerpRange2); void Audio_SetSfxVolumeTransition(f32* volume, f32 volumeTarget, u16 duration); void Audio_SetSfxReverbIndexExceptOcarinaBank(u8 reverbIndex); +extern ActiveSfx gActiveSfx[7][3]; + +extern u8 gIsLargeSfxBank[7]; +extern u8 D_801D6608[7]; +extern u8 gChannelsPerBank[4][7]; +extern u8 gUsedChannelsPerBank[4][7]; +extern f32 gSfxVolume; +extern SfxParams* gSfxParams[7]; +extern SfxBankEntry* gSfxBanks[7]; +extern u8 gSfxChannelLayout; +extern Vec3f gSfxDefaultPos; +extern f32 gSfxDefaultFreqAndVolScale; +extern s8 gSfxDefaultReverb; + #endif diff --git a/include/variables.h b/include/variables.h index 22be0d7aef..2db27bd1e9 100644 --- a/include/variables.h +++ b/include/variables.h @@ -183,19 +183,7 @@ extern f32 gStereoPanVolume[]; extern f32 gDefaultPanVolume[]; extern s32 gAudioCtxInitalized; extern u8 D_801D6200[0x400]; -extern u8 gIsLargeSfxBank[7]; -extern u8 D_801D6608[7]; -extern u8 gChannelsPerBank[4][7]; -extern u8 gUsedChannelsPerBank[4][7]; -extern f32 gSfxVolume; -extern u8* gScarecrowSpawnSongPtr; -extern OcarinaSongButtons gOcarinaSongButtons[24]; -extern SfxParams* gSfxParams[7]; -extern SfxBankEntry* gSfxBanks[7]; -extern u8 gSfxChannelLayout; -extern Vec3f gSfxDefaultPos; -extern f32 gSfxDefaultFreqAndVolScale; -extern s8 gSfxDefaultReverb; + extern u8 gAudioSpecId; extern u8 gAudioHeapResetState; extern AudioSpec gAudioSpecs[21]; @@ -1551,11 +1539,6 @@ extern MtxF* sCurrentMatrix; extern s32 D_801FD120; -extern ActiveSfx gActiveSfx[7][3]; -extern SeqRequest sSeqRequests[][5]; -extern u8 sNumSeqRequests[5]; -extern u32 sAudioSeqCmds[0xB0]; -extern ActiveSequence gActiveSeqs[]; extern u8 sResetAudioHeapTimer; extern u16 sResetAudioHeapFadeReverbVolume; extern u16 sResetAudioHeapFadeReverbVolumeStep; diff --git a/include/z64audio.h b/include/z64audio.h index 9ab609ea65..3a9915e77e 100644 --- a/include/z64audio.h +++ b/include/z64audio.h @@ -662,185 +662,6 @@ typedef struct { /* 0x1A */ u16 combFilterGain; } NoteSubAttributes; // size = 0x1A -typedef struct { - /* 0x00 */ f32 volCur; - /* 0x04 */ f32 volTarget; - /* 0x08 */ f32 volStep; - /* 0x0C */ f32 freqScaleCur; - /* 0x10 */ f32 freqScaleTarget; - /* 0x14 */ f32 freqScaleStep; - /* 0x18 */ u16 volTimer; - /* 0x1A */ u16 freqScaleTimer; -} ActiveSequenceChannelData; // size = 0x1C - -typedef struct { - /* 0x000 */ ActiveSequenceChannelData channelData[SEQ_NUM_CHANNELS]; - /* 0x1C0 */ f32 volCur; - /* 0x1C4 */ f32 volTarget; - /* 0x1C8 */ f32 volStep; - /* 0x1CC */ u32 tempoCmd; - /* 0x1D0 */ f32 tempoCur; - /* 0x1D4 */ f32 tempoTarget; - /* 0x1D8 */ f32 tempoStep; - /* 0x1DC */ u32 setupCmd[8]; // setup commands - /* 0x1FC */ u32 startAsyncSeqCmd; // temporarily stores the seqCmd used in SEQCMD_PLAY_SEQUENCE, to be called again once the font is reloaded in - /* 0x200 */ u16 volTimer; - /* 0x202 */ u16 tempoOriginal; - /* 0x204 */ u16 tempoTimer; - /* 0x206 */ u16 freqScaleChannelFlags; - /* 0x208 */ u16 volChannelFlags; - /* 0x20A */ u16 seqId; - /* 0x20C */ u16 prevSeqId; // last seqId played on a player - /* 0x20E */ u16 channelPortMask; - /* 0x210 */ u8 isWaitingForFonts; - /* 0x211 */ u8 fontId; - /* 0x212 */ u8 volScales[VOL_SCALE_INDEX_MAX]; - /* 0x216 */ u8 volFadeTimer; - /* 0x217 */ u8 fadeVolUpdate; - /* 0x218 */ u8 setupCmdTimer; - /* 0x219 */ u8 setupCmdNum; // number of setup commands - /* 0x21A */ u8 setupFadeTimer; - /* 0x21B */ u8 isSeqPlayerInit; -} ActiveSequence; // size = 0x21C - -typedef struct { - /* 0x0 */ u8 seqId; - /* 0x1 */ u8 priority; -} SeqRequest; // size = 0x02 - -typedef enum { - /* 0 */ BANK_PLAYER, - /* 1 */ BANK_ITEM, - /* 2 */ BANK_ENV, - /* 3 */ BANK_ENEMY, - /* 4 */ BANK_SYSTEM, - /* 5 */ BANK_OCARINA, - /* 6 */ BANK_VOICE -} SfxBankType; - -typedef enum { - /* 0 */ SFX_STATE_EMPTY, - /* 1 */ SFX_STATE_QUEUED, - /* 2 */ SFX_STATE_READY, - /* 3 */ SFX_STATE_PLAYING_REFRESH, - /* 4 */ SFX_STATE_PLAYING, - /* 5 */ SFX_STATE_PLAYING_ONE_FRAME -} SfxState; - -typedef struct { - /* 0x00 */ f32* posX; - /* 0x04 */ f32* posY; - /* 0x08 */ f32* posZ; - /* 0x0C */ f32* freqScale; - /* 0x10 */ f32* volume; - /* 0x14 */ s8* reverbAdd; - /* 0x18 */ f32 dist; - /* 0x1C */ u32 priority; // lower is more prioritized - /* 0x20 */ u16 sfxParams; - /* 0x22 */ u16 sfxId; - /* 0x25 */ u8 sfxFlags; - /* 0x24 */ u8 sfxImportance; - /* 0x26 */ u8 state; // uses SfxState enum - /* 0x27 */ u8 freshness; - /* 0x28 */ u8 prev; - /* 0x29 */ u8 next; - /* 0x2A */ u8 channelIndex; - /* 0x2B */ u8 randFreq; - /* 0x2C */ u8 token; -} SfxBankEntry; // size = 0x30 - -/* - * SfxId: - * - * & 03FF 0000000111111111 index - * & 0400 0000010000000000 unused flag - * & 0800 0000100000000000 SFX_FLAG - * & 0C00 0000110000000000 Flag Mask - * & F000 1111000000000000 observed in audio code - */ - -#define SFX_BANK_SHIFT(sfxId) (((sfxId) >> 12) & 0xFF) - -#define SFX_BANK_MASK(sfxId) ((sfxId) & 0xF000) - -#define SFX_INDEX(sfxId) ((sfxId) & 0x3FF) -#define SFX_BANK(sfxId) SFX_BANK_SHIFT(SFX_BANK_MASK(sfxId)) - -typedef struct { - /* 0x0 */ u32 priority; // lower is more prioritized - /* 0x4 */ u8 entryIndex; -} ActiveSfx; // size = 0x08 - -// SfxParams bit-packing - -// Slows the decay of volume with distance (a 3-bit number ranging from 0-7) -#define SFX_PARAM_DIST_RANGE_SHIFT 0 -#define SFX_PARAM_DIST_RANGE_MASK_UPPER (4 << SFX_PARAM_DIST_RANGE_SHIFT) -#define SFX_PARAM_DIST_RANGE_MASK (7 << SFX_PARAM_DIST_RANGE_SHIFT) - -// Lower SEQ_PLAYER_BGM_MAIN and SEQ_PLAYER_BGM_SUB while the sfx is playing -#define SFX_FLAG_LOWER_VOLUME_BGM (1 << 3) - -// Sfx priority is not raised with distance (making it more likely to be ejected) -#define SFX_FLAG_PRIORITY_NO_DIST (1 << 4) - -// If a new sfx is requested at both the same position with the same importance, -// Block that new sfx from replacing the current sfx -// Note: Only 1 sfx can be played at a specific position at once -#define SFX_FLAG_BLOCK_EQUAL_IMPORTANCE (1 << 5) - -// Applies increasingly random offsets to frequency (a 2-bit number ranging from 0-3) -#define SFX_PARAM_RAND_FREQ_RAISE_SHIFT 6 -#define SFX_PARAM_RAND_FREQ_RAISE_MASK (3 << SFX_PARAM_RAND_FREQ_RAISE_SHIFT) - -// Sets a flag to ioPort 5 -#define SFX_FLAG_8 (1 << 8) - -// Use lowpass filter on surround sound -#define SFX_FLAG_SURROUND_LOWPASS_FILTER (1 << 9) - -// Unused remnant of OoT -#define SFX_FLAG_BEHIND_SCREEN_Z_INDEX_SHIFT 10 -#define SFX_FLAG_BEHIND_SCREEN_Z_INDEX (1 << SFX_FLAG_BEHIND_SCREEN_Z_INDEX_SHIFT) - -// Randomly scale base frequency each frame through mutiplicative offset -#define SFX_PARAM_RAND_FREQ_SCALE (1 << 11) - -// Sfx reverb is not raised with distance -#define SFX_FLAG_REVERB_NO_DIST (1 << 12) - -// Sfx volume is not lowered with distance -#define SFX_FLAG_VOLUME_NO_DIST (1 << 13) - -// SFX_FLAG_VIBRATO -// Randomly lower base frequency each frame through additive offset -#define SFX_PARAM_RAND_FREQ_LOWER (1 << 14) - -// Sfx frequency is not raised with distance -#define SFX_FLAG_FREQ_NO_DIST (1 << 15) - -// Force the sfx to reset from the beginning when requested again -#define SFX_FLAG2_FORCE_RESET (1 << 0) - -// Unused -#define SFX_FLAG2_UNUSED2 (1 << 2) -#define SFX_FLAG2_UNUSED4 (1 << 4) - -// Do not use highpass filter on surround sound -#define SFX_FLAG2_SURROUND_NO_HIGHPASS_FILTER (1 << 5) - -// Unused -#define SFX_FLAG2_UNUSED6 (1 << 6) - -// Apply a low-pass filter with a lowPassCutoff of 4 -#define SFX_FLAG2_APPLY_LOWPASS_FILTER (1 << 7) - -typedef struct { - /* 0x0 */ u8 importance; - /* 0x1 */ u8 flags; - /* 0x2 */ u16 params; -} SfxParams; // size = 0x4 - typedef void (*AudioCustomUpdateFunction)(void); typedef u32 (*AudioCustomSeqFunction)(s8 value, SequenceChannel* channel); typedef void* (*AudioCustomReverbFunction)(Sample*, s32, s8, s32); diff --git a/include/z64ocarina.h b/include/z64ocarina.h index 5d1aea26ac..be5b6578c2 100644 --- a/include/z64ocarina.h +++ b/include/z64ocarina.h @@ -1,9 +1,9 @@ #ifndef Z64OCARINA_H #define Z64OCARINA_H -#include "ultra64.h" +#include "PR/ultratypes.h" -typedef enum { +typedef enum OcarinaSongId { /* 0 */ OCARINA_SONG_SONATA, /* 1 */ OCARINA_SONG_GORON_LULLABY, /* 2 */ OCARINA_SONG_NEW_WAVE, @@ -32,7 +32,7 @@ typedef enum { /* 24 */ OCARINA_SONG_SCARECROW_LONG = OCARINA_SONG_MAX // anything larger than 24 is considered the long scarecrow's song } OcarinaSongId; -typedef enum { +typedef enum OcarinaSongActionId { /* 0x00 */ OCARINA_ACTION_0, // acts like free play but never set /* 0x01 */ OCARINA_ACTION_FREE_PLAY, /* 0x02 */ OCARINA_ACTION_DEMONSTRATE_SONATA, // Song demonstrated/previewed by another actor/teacher @@ -117,7 +117,7 @@ typedef enum { /* 0x51 */ OCARINA_ACTION_TIMED_PROMPT_STORMS } OcarinaSongActionId; -typedef enum { +typedef enum OcarinaMode { /* 0x00 */ OCARINA_MODE_NONE, /* 0x01 */ OCARINA_MODE_ACTIVE, /* 0x02 */ OCARINA_MODE_WARP, @@ -163,7 +163,7 @@ typedef enum { /* 0x2A */ OCARINA_MODE_PLAYED_FULL_EVAN_SONG } OcarinaMode; -typedef enum { +typedef enum OcarinaButtonIndex { /* 0 */ OCARINA_BTN_A, /* 1 */ OCARINA_BTN_C_DOWN, /* 2 */ OCARINA_BTN_C_RIGHT, @@ -175,7 +175,7 @@ typedef enum { // Uses scientific pitch notation relative to middle C // https://en.wikipedia.org/wiki/Scientific_pitch_notation -typedef enum { +typedef enum OcarinaPitch { /* 0x0 */ OCARINA_PITCH_C4, /* 0x1 */ OCARINA_PITCH_DFLAT4, /* 0x2 */ OCARINA_PITCH_D4, @@ -192,11 +192,10 @@ typedef enum { /* 0xD */ OCARINA_PITCH_DFLAT5, /* 0xE */ OCARINA_PITCH_D5, /* 0xF */ OCARINA_PITCH_EFLAT5, - /* -1 */ OCARINA_PITCH_NONE = 0xFF + /* -1 */ OCARINA_PITCH_NONE = 0xFF } OcarinaPitch; -// Mainly set by func_80152CAC in z_message.c -typedef enum { +typedef enum OcarinaInstrumentId { /* 0 */ OCARINA_INSTRUMENT_OFF, /* 1 */ OCARINA_INSTRUMENT_DEFAULT, /* 2 */ OCARINA_INSTRUMENT_FEMALE_VOICE, @@ -216,14 +215,14 @@ typedef enum { /* 16 */ OCARINA_INSTRUMENT_AMPLIFIED_GUITAR // Related to WEEKEVENTREG_41_20 } OcarinaInstrumentId; -typedef enum { - /* 0 */ OCARINA_RECORD_OFF, - /* 1 */ OCARINA_RECORD_SCARECROW_LONG, - /* 2 */ OCARINA_RECORD_SCARECROW_SPAWN, +typedef enum OcarinaRecordingState { + /* 0 */ OCARINA_RECORD_OFF, + /* 1 */ OCARINA_RECORD_SCARECROW_LONG, + /* 2 */ OCARINA_RECORD_SCARECROW_SPAWN, /* -1 */ OCARINA_RECORD_REJECTED = 0xFF } OcarinaRecordingState; -typedef enum { +typedef enum OcarinaError { /* 0 */ OCARINA_ERROR_NONE, /* 1 */ OCARINA_ERROR_1, /* 2 */ OCARINA_ERROR_2, @@ -268,4 +267,24 @@ typedef struct OcarinaStaff { /* 0x2 */ u8 pos; // original name: "locate" } OcarinaStaff; // size = 0x3 +void AudioOcarina_SetSongStartingPos(void); +void AudioOcarina_StartAtSongStartingPos(u32 ocarinaFlags); +void AudioOcarina_StartForSongCheck(u32 ocarinaFlags, u8 ocarinaStaffPlayingPosStart); +void AudioOcarina_StartWithSongNoteLengths(u32 ocarinaFlags); +void AudioOcarina_StartDefault(u32 ocarinaFlags); +u8 func_8019B5AC(void); +void AudioOcarina_ResetAndReadInput(void); +void AudioOcarina_SetOcarinaDisableTimer(u8 unused, u8 timer); +void AudioOcarina_SetInstrument(u8 ocarinaInstrumentId); +void AudioOcarina_SetPlaybackSong(s8 songIndexPlusOne, u8 playbackState); +void AudioOcarina_SetRecordingState(u8 recordingState); +OcarinaStaff* AudioOcarina_GetRecordingStaff(void); +OcarinaStaff* AudioOcarina_GetPlayingStaff(void); +OcarinaStaff* AudioOcarina_GetPlaybackStaff(void); +void AudioOcarina_TerminaWallGenerateNotes(void); +void AudioOcarina_PlayLongScarecrowSong(void); + +extern u8* gScarecrowSpawnSongPtr; +extern OcarinaSongButtons gOcarinaSongButtons[OCARINA_SONG_MAX]; + #endif diff --git a/src/code/z_play.c b/src/code/z_play.c index 83a2d25cee..bd19cbc940 100644 --- a/src/code/z_play.c +++ b/src/code/z_play.c @@ -1,4 +1,3 @@ -#include "prevent_bss_reordering.h" #include "z64.h" #include "regs.h" #include "functions.h"