mm/include/audio/playback.h

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