mirror of https://github.com/zeldaret/mm.git
140 lines
4.9 KiB
C
140 lines
4.9 KiB
C
#ifndef AUDIO_PLAYBACK_H
|
|
#define AUDIO_PLAYBACK_H
|
|
|
|
#include "synthesis.h"
|
|
#include "effects.h"
|
|
#include "list.h"
|
|
#include "PR/ultratypes.h"
|
|
#include "unk.h"
|
|
|
|
struct SequenceLayer;
|
|
struct Instrument;
|
|
struct TunedSample;
|
|
struct Drum;
|
|
struct SoundEffect;
|
|
|
|
#define AUDIO_ERROR(fontId, id, err) (((fontId << 8) + id) + (err << 24))
|
|
|
|
typedef enum AudioError {
|
|
/* 0x01 */ AUDIO_ERROR_NO_INST = 1,
|
|
/* 0x03 */ AUDIO_ERROR_INVALID_INST_ID = 3,
|
|
/* 0x04 */ AUDIO_ERROR_INVALID_DRUM_SFX_ID,
|
|
/* 0x05 */ AUDIO_ERROR_NO_DRUM_SFX,
|
|
/* 0x10 */ AUDIO_ERROR_FONT_NOT_LOADED = 0x10
|
|
} AudioError;
|
|
|
|
typedef union {
|
|
struct {
|
|
/* 0x0 */ u8 unused : 2;
|
|
/* 0x0 */ u8 type : 2;
|
|
/* 0x0 */ u8 strongRight : 1;
|
|
/* 0x0 */ u8 strongLeft : 1;
|
|
/* 0x0 */ u8 strongReverbRight : 1;
|
|
/* 0x0 */ u8 strongReverbLeft : 1;
|
|
};
|
|
/* 0x0 */ u8 asByte;
|
|
} StereoData; // size = 0x1
|
|
|
|
typedef struct NoteAttributes {
|
|
/* 0x00 */ u8 targetReverbVol;
|
|
/* 0x01 */ u8 gain; // Increases volume by a multiplicative scaling factor. Represented as a UQ4.4 number
|
|
/* 0x02 */ u8 pan;
|
|
/* 0x03 */ u8 surroundEffectIndex;
|
|
/* 0x04 */ StereoData stereoData;
|
|
/* 0x05 */ u8 combFilterSize;
|
|
/* 0x06 */ u16 combFilterGain;
|
|
/* 0x08 */ f32 freqScale;
|
|
/* 0x0C */ f32 velocity;
|
|
/* 0x10 */ s16* filter;
|
|
/* 0x14 */ s16* filterBuf;
|
|
} NoteAttributes; // size = 0x18
|
|
|
|
typedef enum NotePlaybackStatus {
|
|
/* 0 */ PLAYBACK_STATUS_0,
|
|
/* 1 */ PLAYBACK_STATUS_1,
|
|
/* 2 */ PLAYBACK_STATUS_2
|
|
} NotePlaybackStatus;
|
|
|
|
typedef struct NotePlaybackState {
|
|
/* 0x00 */ u8 priority;
|
|
/* 0x01 */ u8 waveId;
|
|
/* 0x02 */ u8 harmonicIndex; // the harmonic index for the synthetic wave contained in gWaveSamples (also matches the base 2 logarithm of the harmonic order)
|
|
/* 0x03 */ u8 fontId;
|
|
/* 0x04 */ u8 status;
|
|
/* 0x05 */ u8 stereoHeadsetEffects;
|
|
/* 0x06 */ s16 adsrVolScaleUnused;
|
|
/* 0x08 */ f32 portamentoFreqScale;
|
|
/* 0x0C */ f32 vibratoFreqScale;
|
|
/* 0x18 */ struct SequenceLayer* wantedParentLayer;
|
|
/* 0x14 */ struct SequenceLayer* parentLayer;
|
|
/* 0x10 */ struct SequenceLayer* prevParentLayer;
|
|
/* 0x1C */ NoteAttributes attributes;
|
|
/* 0x34 */ AdsrState adsr;
|
|
/* 0x54 */ Portamento portamento;
|
|
/* 0x60 */ VibratoState vibratoState;
|
|
/* 0x7C */ UNK_TYPE1 pad7C[0x4];
|
|
/* 0x80 */ u8 unk_80;
|
|
/* 0x84 */ u32 startSamplePos;
|
|
/* 0x88 */ UNK_TYPE1 unk_BC[0x1C];
|
|
} NotePlaybackState; // size = 0xA4
|
|
|
|
typedef struct NoteSampleState {
|
|
struct {
|
|
/* 0x00 */ vu8 enabled : 1;
|
|
/* 0x00 */ u8 needsInit : 1;
|
|
/* 0x00 */ u8 finished : 1;
|
|
/* 0x00 */ u8 unused : 1;
|
|
/* 0x00 */ u8 strongRight : 1;
|
|
/* 0x00 */ u8 strongLeft : 1;
|
|
/* 0x00 */ u8 strongReverbRight : 1;
|
|
/* 0x00 */ u8 strongReverbLeft : 1;
|
|
} bitField0;
|
|
struct {
|
|
/* 0x01 */ u8 reverbIndex : 3;
|
|
/* 0x01 */ u8 bookOffset : 2;
|
|
/* 0x01 */ u8 isSyntheticWave : 1;
|
|
/* 0x01 */ u8 hasTwoParts : 1;
|
|
/* 0x01 */ u8 useHaasEffect : 1;
|
|
} bitField1;
|
|
/* 0x02 */ u8 gain; // Increases volume by a multiplicative scaling factor. Represented as a UQ4.4 number
|
|
/* 0x03 */ u8 haasEffectLeftDelaySize;
|
|
/* 0x04 */ u8 haasEffectRightDelaySize;
|
|
/* 0x05 */ u8 targetReverbVol;
|
|
/* 0x06 */ u8 harmonicIndexCurAndPrev; // bits 3..2 store curHarmonicIndex, bits 1..0 store prevHarmonicIndex
|
|
/* 0x07 */ u8 combFilterSize;
|
|
/* 0x08 */ u16 targetVolLeft;
|
|
/* 0x0A */ u16 targetVolRight;
|
|
/* 0x0C */ u16 frequencyFixedPoint;
|
|
/* 0x0E */ u16 combFilterGain;
|
|
union {
|
|
/* 0x10 */ TunedSample* tunedSample;
|
|
/* 0x10 */ s16* waveSampleAddr; // used for synthetic waves
|
|
};
|
|
/* 0x14 */ s16* filter;
|
|
/* 0x18 */ UNK_TYPE1 unk_18;
|
|
/* 0x19 */ u8 surroundEffectIndex;
|
|
/* 0x1A */ UNK_TYPE1 unk_1A[0x6];
|
|
} NoteSampleState; // size = 0x20
|
|
|
|
typedef struct Note {
|
|
/* 0x00 */ AudioListItem listItem;
|
|
/* 0x10 */ NoteSynthesisState synthesisState;
|
|
/* 0x34 */ NotePlaybackState playbackState;
|
|
/* 0xD8 */ NoteSampleState sampleState;
|
|
} Note; // size = 0xF8
|
|
|
|
void AudioPlayback_NoteDisable(Note* note);
|
|
void AudioPlayback_ProcessNotes(void);
|
|
struct TunedSample* AudioPlayback_GetInstrumentTunedSample(struct Instrument* instrument, s32 semitone);
|
|
struct Instrument* AudioPlayback_GetInstrumentInner(s32 fontId, s32 instId);
|
|
struct Drum* AudioPlayback_GetDrum(s32 fontId, s32 drumId);
|
|
struct SoundEffect* AudioPlayback_GetSoundEffect(s32 fontId, s32 sfxId);
|
|
s32 AudioPlayback_SetFontInstrument(s32 instrumentType, s32 fontId, s32 index, void* value);
|
|
void AudioPlayback_SeqLayerNoteDecay(struct SequenceLayer* layer);
|
|
void AudioPlayback_SeqLayerNoteRelease(struct SequenceLayer* layer);
|
|
void AudioPlayback_InitSyntheticWave(Note* note, struct SequenceLayer* layer);
|
|
Note* AudioPlayback_AllocNote(struct SequenceLayer* layer);
|
|
void AudioPlayback_NoteInitAll(void);
|
|
|
|
#endif
|