sm64pc/src/audio/synthesis.h

76 lines
2.3 KiB
C
Raw Normal View History

2019-12-02 02:52:53 +00:00
#ifndef AUDIO_SYNTHESIS_H
#define AUDIO_SYNTHESIS_H
2019-08-25 04:46:40 +00:00
#include "internal.h"
2019-12-02 02:52:53 +00:00
#define DEFAULT_LEN_1CH 0x140
#define DEFAULT_LEN_2CH 0x280
2020-02-03 05:51:26 +00:00
#ifdef VERSION_EU
#define MAX_UPDATES_PER_FRAME 5
#else
2019-08-25 04:46:40 +00:00
#define MAX_UPDATES_PER_FRAME 4
2020-02-03 05:51:26 +00:00
#endif
2019-08-25 04:46:40 +00:00
2019-11-03 19:36:27 +00:00
struct ReverbRingBufferItem
2019-08-25 04:46:40 +00:00
{
2019-11-03 19:36:27 +00:00
s16 numSamplesAfterDownsampling;
2019-08-25 04:46:40 +00:00
s16 chunkLen; // never read
2019-11-03 19:36:27 +00:00
s16 *toDownsampleLeft;
s16 *toDownsampleRight; // data pointed to by left and right are adjacent in memory
s32 startPos; // start pos in ring buffer
s16 lengths[2]; // first length in ring buffer (max until end) and second length in ring buffer (from pos 0)
2019-08-25 04:46:40 +00:00
}; // size = 0x14
2019-11-03 19:36:27 +00:00
struct SynthesisReverb
2019-08-25 04:46:40 +00:00
{
2020-02-03 05:51:26 +00:00
/*0x00, 0x00*/ u8 resampleFlags;
/*0x01, 0x01*/ u8 useReverb;
/*0x02, 0x02*/ u8 framesLeftToIgnore;
/*0x03, 0x03*/ u8 curFrame;
#ifdef VERSION_EU
/* 0x04*/ u8 downsampleRate;
/* 0x06*/ u16 windowSize; // same as bufSizePerChannel
#endif
/*0x04, 0x08*/ u16 reverbGain;
/*0x06, 0x0A*/ u16 resampleRate;
/*0x08, 0x0C*/ s32 nextRingBufferPos;
/*0x0C, 0x10*/ s32 unkC; // never read
/*0x10, 0x14*/ s32 bufSizePerChannel;
2019-08-25 04:46:40 +00:00
struct
{
2019-11-03 19:36:27 +00:00
s16 *left;
s16 *right;
} ringBuffer;
2020-02-03 05:51:26 +00:00
/*0x1C, 0x20*/ s16 *resampleStateLeft;
/*0x20, 0x24*/ s16 *resampleStateRight;
/*0x24, 0x28*/ s16 *unk24; // never read
/*0x28, 0x2C*/ s16 *unk28; // never read
/*0x2C, 0x30*/ struct ReverbRingBufferItem items[2][MAX_UPDATES_PER_FRAME];
#ifdef VERSION_EU
u8 pad[16];
#endif
2019-08-25 04:46:40 +00:00
}; // 0xCC <= size <= 0x100
2020-02-03 05:51:26 +00:00
#if defined(VERSION_EU)
extern struct SynthesisReverb gSynthesisReverbs[4];
extern s8 gNumSynthesisReverbs;
extern struct NoteSubEu *gNoteSubsEu;
extern f32 gLeftVolRampings[3][1024];
extern f32 gRightVolRampings[3][1024];
extern f32 *gCurrentLeftVolRamping; // Points to any of the three left buffers above
extern f32 *gCurrentRightVolRamping; // Points to any of the three right buffers above
#else
2019-11-03 19:36:27 +00:00
extern struct SynthesisReverb gSynthesisReverb;
2020-02-03 05:51:26 +00:00
#endif
2019-08-25 04:46:40 +00:00
2019-11-03 19:36:27 +00:00
u64 *synthesis_execute(u64 *cmdBuf, s32 *writtenCmds, u16 *aiBuf, s32 bufLen);
2020-02-03 05:51:26 +00:00
#ifndef VERSION_EU
2019-08-25 04:46:40 +00:00
void note_init_volume(struct Note *note);
void note_set_vel_pan_reverb(struct Note *note, f32 velocity, f32 pan, u8 reverb);
void note_set_frequency(struct Note *note, f32 frequency);
void note_enable(struct Note *note);
void note_disable(struct Note *note);
2020-02-03 05:51:26 +00:00
#endif
2019-08-25 04:46:40 +00:00
2019-12-02 02:52:53 +00:00
#endif /* AUDIO_SYNTHESIS_H */