mirror of https://github.com/PrimeDecomp/prime.git
965 lines
32 KiB
C
965 lines
32 KiB
C
#ifndef _MUSYX_MUSYX_PRIV
|
|
#define _MUSYX_MUSYX_PRIV
|
|
|
|
#include "musyx/musyx.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
typedef struct SND_STUDIO_INPUT {
|
|
// total size: 0x4
|
|
unsigned char vol; // offset 0x0, size 0x1
|
|
unsigned char volA; // offset 0x1, size 0x1
|
|
unsigned char volB; // offset 0x2, size 0x1
|
|
unsigned char srcStudio; // offset 0x3, size 0x1
|
|
} SND_STUDIO_INPUT;
|
|
|
|
typedef struct SYNTH_VOICELIST {
|
|
// total size: 0x4
|
|
u8 prev; // offset 0x0, size 0x1
|
|
u8 next; // offset 0x1, size 0x1
|
|
u16 user; // offset 0x2, size 0x2
|
|
} SYNTH_VOICELIST;
|
|
extern SYNTH_VOICELIST voicePrioSortVoices[64];
|
|
extern u8 voicePrioSortVoicesRoot[256];
|
|
extern SYNTH_VOICELIST voicePrioSortVoices[64];
|
|
|
|
typedef struct SYNTH_ROOTLIST {
|
|
// total size: 0x4
|
|
unsigned short next; // offset 0x0, size 0x2
|
|
unsigned short prev; // offset 0x2, size 0x2
|
|
} SYNTH_ROOTLIST;
|
|
|
|
extern SYNTH_ROOTLIST voicePrioSortRootList[256];
|
|
|
|
typedef struct synthInfo {
|
|
u32 mixFrq;
|
|
u32 numSamples;
|
|
SND_PLAYBACKINFO pbInfo;
|
|
u8 voiceNum;
|
|
u8 maxMusic;
|
|
u8 maxSFX;
|
|
u8 studioNum;
|
|
} SynthInfo;
|
|
|
|
typedef struct ADSR_VARS {
|
|
u8 mode;
|
|
u8 state;
|
|
u32 cnt;
|
|
s32 currentVolume;
|
|
s32 currentIndex;
|
|
s32 currentDelta;
|
|
|
|
union data {
|
|
struct _dls {
|
|
u32 aTime;
|
|
u32 dTime;
|
|
u16 sLevel;
|
|
u32 rTime;
|
|
u16 cutOff;
|
|
u8 aMode;
|
|
} dls;
|
|
|
|
struct _linear {
|
|
u32 aTime;
|
|
u32 dTime;
|
|
u16 sLevel;
|
|
u32 rTime;
|
|
} linear;
|
|
} data;
|
|
} ADSR_VARS;
|
|
|
|
typedef struct _PBMIX {
|
|
// total size: 0x24
|
|
unsigned short vL; // offset 0x0, size 0x2
|
|
unsigned short vDeltaL; // offset 0x2, size 0x2
|
|
unsigned short vR; // offset 0x4, size 0x2
|
|
unsigned short vDeltaR; // offset 0x6, size 0x2
|
|
unsigned short vAuxAL; // offset 0x8, size 0x2
|
|
unsigned short vDeltaAuxAL; // offset 0xA, size 0x2
|
|
unsigned short vAuxAR; // offset 0xC, size 0x2
|
|
unsigned short vDeltaAuxAR; // offset 0xE, size 0x2
|
|
unsigned short vAuxBL; // offset 0x10, size 0x2
|
|
unsigned short vDeltaAuxBL; // offset 0x12, size 0x2
|
|
unsigned short vAuxBR; // offset 0x14, size 0x2
|
|
unsigned short vDeltaAuxBR; // offset 0x16, size 0x2
|
|
unsigned short vAuxBS; // offset 0x18, size 0x2
|
|
unsigned short vDeltaAuxBS; // offset 0x1A, size 0x2
|
|
unsigned short vS; // offset 0x1C, size 0x2
|
|
unsigned short vDeltaS; // offset 0x1E, size 0x2
|
|
unsigned short vAuxAS; // offset 0x20, size 0x2
|
|
unsigned short vDeltaAuxAS; // offset 0x22, size 0x2
|
|
} _PBMIX;
|
|
|
|
typedef struct _PBITD {
|
|
// total size: 0xE
|
|
unsigned short flag; // offset 0x0, size 0x2
|
|
unsigned short bufferHi; // offset 0x2, size 0x2
|
|
unsigned short bufferLo; // offset 0x4, size 0x2
|
|
unsigned short shiftL; // offset 0x6, size 0x2
|
|
unsigned short shiftR; // offset 0x8, size 0x2
|
|
unsigned short targetShiftL; // offset 0xA, size 0x2
|
|
unsigned short targetShiftR; // offset 0xC, size 0x2
|
|
} _PBITD;
|
|
|
|
typedef struct _PBUPDATE {
|
|
// total size: 0xE
|
|
unsigned short updNum[5]; // offset 0x0, size 0xA
|
|
unsigned short dataHi; // offset 0xA, size 0x2
|
|
unsigned short dataLo; // offset 0xC, size 0x2
|
|
} _PBUPDATE;
|
|
|
|
typedef struct _PBDPOP {
|
|
// total size: 0x12
|
|
unsigned short aL; // offset 0x0, size 0x2
|
|
unsigned short aAuxAL; // offset 0x2, size 0x2
|
|
unsigned short aAuxBL; // offset 0x4, size 0x2
|
|
unsigned short aR; // offset 0x6, size 0x2
|
|
unsigned short aAuxAR; // offset 0x8, size 0x2
|
|
unsigned short aAuxBR; // offset 0xA, size 0x2
|
|
unsigned short aS; // offset 0xC, size 0x2
|
|
unsigned short aAuxAS; // offset 0xE, size 0x2
|
|
unsigned short aAuxBS; // offset 0x10, size 0x2
|
|
} _PBDPOP;
|
|
|
|
typedef struct _PBVE {
|
|
// total size: 0x4
|
|
unsigned short currentVolume; // offset 0x0, size 0x2
|
|
unsigned short currentDelta; // offset 0x2, size 0x2
|
|
} _PBVE;
|
|
|
|
typedef struct _PBFIR {
|
|
// total size: 0x6
|
|
unsigned short numCoefs; // offset 0x0, size 0x2
|
|
unsigned short coefsHi; // offset 0x2, size 0x2
|
|
unsigned short coefsLo; // offset 0x4, size 0x2
|
|
} _PBFIR;
|
|
|
|
typedef struct _PBADDR {
|
|
// total size: 0x10
|
|
unsigned short loopFlag; // offset 0x0, size 0x2
|
|
unsigned short format; // offset 0x2, size 0x2
|
|
unsigned short loopAddressHi; // offset 0x4, size 0x2
|
|
unsigned short loopAddressLo; // offset 0x6, size 0x2
|
|
unsigned short endAddressHi; // offset 0x8, size 0x2
|
|
unsigned short endAddressLo; // offset 0xA, size 0x2
|
|
unsigned short currentAddressHi; // offset 0xC, size 0x2
|
|
unsigned short currentAddressLo; // offset 0xE, size 0x2
|
|
} _PBADDR;
|
|
|
|
typedef struct _PBADPCM {
|
|
// total size: 0x28
|
|
unsigned short a[8][2]; // offset 0x0, size 0x20
|
|
unsigned short gain; // offset 0x20, size 0x2
|
|
unsigned short pred_scale; // offset 0x22, size 0x2
|
|
unsigned short yn1; // offset 0x24, size 0x2
|
|
unsigned short yn2; // offset 0x26, size 0x2
|
|
} _PDADPCM;
|
|
|
|
typedef struct _PBSRC {
|
|
// total size: 0xE
|
|
unsigned short ratioHi; // offset 0x0, size 0x2
|
|
unsigned short ratioLo; // offset 0x2, size 0x2
|
|
unsigned short currentAddressFrac; // offset 0x4, size 0x2
|
|
unsigned short last_samples[4]; // offset 0x6, size 0x8
|
|
} _PBSRC;
|
|
|
|
typedef struct _PBADPCMLOOP {
|
|
// total size: 0x6
|
|
unsigned short loop_pred_scale; // offset 0x0, size 0x2
|
|
unsigned short loop_yn1; // offset 0x2, size 0x2
|
|
unsigned short loop_yn2; // offset 0x4, size 0x2
|
|
} _PBADPCMLOOP;
|
|
|
|
typedef struct _PB {
|
|
// total size: 0xBC
|
|
unsigned short nextHi; // offset 0x0, size 0x2
|
|
unsigned short nextLo; // offset 0x2, size 0x2
|
|
unsigned short currHi; // offset 0x4, size 0x2
|
|
unsigned short currLo; // offset 0x6, size 0x2
|
|
unsigned short srcSelect; // offset 0x8, size 0x2
|
|
unsigned short coefSelect; // offset 0xA, size 0x2
|
|
unsigned short mixerCtrl; // offset 0xC, size 0x2
|
|
unsigned short state; // offset 0xE, size 0x2
|
|
unsigned short loopType; // offset 0x10, size 0x2
|
|
struct _PBMIX mix; // offset 0x12, size 0x24
|
|
struct _PBITD itd; // offset 0x36, size 0xE
|
|
struct _PBUPDATE update; // offset 0x44, size 0xE
|
|
struct _PBDPOP dpop; // offset 0x52, size 0x12
|
|
struct _PBVE ve; // offset 0x64, size 0x4
|
|
struct _PBFIR fir; // offset 0x68, size 0x6
|
|
struct _PBADDR addr; // offset 0x6E, size 0x10
|
|
struct _PBADPCM adpcm; // offset 0x7E, size 0x28
|
|
struct _PBSRC src; // offset 0xA6, size 0xE
|
|
struct _PBADPCMLOOP adpcmLoop; // offset 0xB4, size 0x6
|
|
unsigned short streamLoopCnt; // offset 0xBA, size 0x2
|
|
} _PB;
|
|
|
|
typedef struct SAMPLE_INFO {
|
|
// total size: 0x20
|
|
u32 info; // offset 0x0, size 0x4
|
|
void* addr; // offset 0x4, size 0x4
|
|
void* extraData; // offset 0x8, size 0x4
|
|
u32 offset; // offset 0xC, size 0x4
|
|
u32 length; // offset 0x10, size 0x4
|
|
u32 loop; // offset 0x14, size 0x4
|
|
u32 loopLength; // offset 0x18, size 0x4
|
|
u8 compType; // offset 0x1C, size 0x1
|
|
} SAMPLE_INFO;
|
|
|
|
typedef struct GROUP_DATA {
|
|
// total size: 0x28
|
|
unsigned long nextOff; // offset 0x0, size 0x4
|
|
unsigned short id; // offset 0x4, size 0x2
|
|
unsigned short type; // offset 0x6, size 0x2
|
|
unsigned long macroOff; // offset 0x8, size 0x4
|
|
unsigned long sampleOff; // offset 0xC, size 0x4
|
|
unsigned long curveOff; // offset 0x10, size 0x4
|
|
unsigned long keymapOff; // offset 0x14, size 0x4
|
|
unsigned long layerOff; // offset 0x18, size 0x4
|
|
union {
|
|
struct fx {
|
|
// total size: 0x4
|
|
unsigned long tableOff; // offset 0x0, size 0x4
|
|
} fx;
|
|
struct song {
|
|
// total size: 0xC
|
|
unsigned long normpageOff; // offset 0x0, size 0x4
|
|
unsigned long drumpageOff; // offset 0x4, size 0x4
|
|
unsigned long midiSetupOff; // offset 0x8, size 0x4
|
|
} song;
|
|
} data; // offset 0x1C, size 0xC
|
|
} GROUP_DATA;
|
|
|
|
typedef struct SAMPLE_HEADER {
|
|
// total size: 0x10
|
|
unsigned long info; // offset 0x0, size 0x4
|
|
unsigned long length; // offset 0x4, size 0x4
|
|
unsigned long loopOffset; // offset 0x8, size 0x4
|
|
unsigned long loopLength; // offset 0xC, size 0x4
|
|
} SAMPLE_HEADER;
|
|
|
|
typedef struct SDIR_DATA {
|
|
// total size: 0x20
|
|
unsigned short id; // offset 0x0, size 0x2
|
|
unsigned short ref_cnt; // offset 0x2, size 0x2
|
|
unsigned long offset; // offset 0x4, size 0x4
|
|
void* addr; // offset 0x8, size 0x4
|
|
struct SAMPLE_HEADER header; // offset 0xC, size 0x10
|
|
unsigned long extraData; // offset 0x1C, size 0x4
|
|
} SDIR_DATA;
|
|
|
|
typedef struct SDIR_TAB {
|
|
// total size: 0xC
|
|
struct SDIR_DATA* data; // offset 0x0, size 0x4
|
|
void* base; // offset 0x4, size 0x4
|
|
unsigned short numSmp; // offset 0x8, size 0x2
|
|
unsigned short res; // offset 0xA, size 0x2
|
|
} SDIR_TAB;
|
|
|
|
typedef struct DATA_TAB {
|
|
// total size: 0x8
|
|
void* data; // offset 0x0, size 0x4
|
|
unsigned short id; // offset 0x4, size 0x2
|
|
unsigned short refCount; // offset 0x6, size 0x2
|
|
} DATA_TAB;
|
|
|
|
typedef struct LAYER_TAB {
|
|
// total size: 0xC
|
|
void* data; // offset 0x0, size 0x4
|
|
unsigned short id; // offset 0x4, size 0x2
|
|
unsigned short num; // offset 0x6, size 0x2
|
|
unsigned short refCount; // offset 0x8, size 0x2
|
|
unsigned short reserved; // offset 0xA, size 0x2
|
|
} LAYER_TAB;
|
|
|
|
typedef struct MAC_MAINTAB {
|
|
// total size: 0x4
|
|
unsigned short num; // offset 0x0, size 0x2
|
|
unsigned short subTabIndex; // offset 0x2, size 0x2
|
|
} MAC_MAINTAB;
|
|
|
|
typedef struct MAC_SUBTAB {
|
|
// total size: 0x8
|
|
void* data; // offset 0x0, size 0x4
|
|
unsigned short id; // offset 0x4, size 0x2
|
|
unsigned short refCount; // offset 0x6, size 0x2
|
|
} MAC_SUBTAB;
|
|
|
|
typedef struct GSTACK {
|
|
// total size: 0xC
|
|
struct GROUP_DATA* gAddr; // offset 0x0, size 0x4
|
|
struct SDIR_DATA* sdirAddr; // offset 0x4, size 0x4
|
|
void* prjAddr; // offset 0x8, size 0x4
|
|
} GSTACK;
|
|
|
|
typedef struct VSampleInfo {
|
|
// total size: 0xC
|
|
void* loopBufferAddr; // offset 0x0, size 0x4
|
|
u32 loopBufferLength; // offset 0x4, size 0x4
|
|
u8 inLoopBuffer; // offset 0x8, size 0x1
|
|
} VSampleInfo;
|
|
|
|
typedef struct DSPvoice {
|
|
struct _PB* pb;
|
|
void* patchData;
|
|
void* itdBuffer;
|
|
struct DSPvoice* next;
|
|
struct DSPvoice* prev;
|
|
struct DSPvoice* nextAlien;
|
|
u32 mesgCallBackUserValue;
|
|
u32 prio;
|
|
u32 currentAddr;
|
|
u32 changed[5];
|
|
u32 pitch[5];
|
|
u16 volL;
|
|
u16 volR;
|
|
u16 volS;
|
|
u16 volLa;
|
|
u16 volRa;
|
|
u16 volSa;
|
|
u16 volLb;
|
|
u16 volRb;
|
|
u16 volSb;
|
|
u16 lastVolL;
|
|
u16 lastVolR;
|
|
u16 lastVolS;
|
|
u16 lastVolLa;
|
|
u16 lastVolRa;
|
|
u16 lastVolSa;
|
|
u16 lastVolLb;
|
|
u16 lastVolRb;
|
|
u16 lastVolSb;
|
|
u16 smp_id;
|
|
SAMPLE_INFO smp_info;
|
|
VSampleInfo vSampleInfo;
|
|
u8 streamLoopPS;
|
|
ADSR_VARS adsr;
|
|
u16 srcTypeSelect;
|
|
u16 srcCoefSelect;
|
|
u16 itdShiftL;
|
|
u16 itdShiftR;
|
|
u8 singleOffset;
|
|
struct {
|
|
u32 posHi;
|
|
u32 posLo;
|
|
u32 pitch;
|
|
} playInfo;
|
|
|
|
struct {
|
|
u8 pitch;
|
|
u8 vol;
|
|
u8 volA;
|
|
u8 volB;
|
|
} lastUpdate;
|
|
|
|
u32 virtualSampleID;
|
|
u8 state;
|
|
u8 postBreak;
|
|
u8 startupBreak;
|
|
u8 studio;
|
|
u32 flags;
|
|
} DSPvoice;
|
|
|
|
typedef struct VID_LIST {
|
|
struct VID_LIST* next;
|
|
struct VID_LIST* prev;
|
|
u32 vid;
|
|
u32 root;
|
|
} VID_LIST;
|
|
|
|
typedef enum {
|
|
MAC_STATE_RUNNABLE = 0,
|
|
MAC_STATE_YIELDED,
|
|
MAC_STATE_STOPPED,
|
|
} MAC_STATE;
|
|
|
|
typedef struct MSTEP {
|
|
u32 para[2];
|
|
} MSTEP;
|
|
|
|
typedef struct CALLSTACK {
|
|
struct MSTEP* addr;
|
|
struct MSTEP* curAddr;
|
|
} CALLSTACK;
|
|
|
|
typedef struct SYNTH_QUEUE {
|
|
struct SYNTH_QUEUE* next;
|
|
struct SYNTH_QUEUE* prev;
|
|
u8 voice;
|
|
u8 jobTabIndex;
|
|
} SYNTH_QUEUE;
|
|
|
|
typedef enum {
|
|
SYNTH_JOBTYPE_LOW = 0,
|
|
SYNTH_JOBTYPE_ZERO = 1,
|
|
SYNTH_JOBTYPE_EVENT = 2,
|
|
} SYNTH_JOBTYPE;
|
|
|
|
typedef struct {
|
|
// total size: 0xC
|
|
SYNTH_QUEUE* lowPrecision; // offset 0x0, size 0x4
|
|
SYNTH_QUEUE* event; // offset 0x4, size 0x4
|
|
SYNTH_QUEUE* zeroOffset; // offset 0x8, size 0x4
|
|
} SYNTH_JOBTAB;
|
|
|
|
typedef struct SYNTH_LFO {
|
|
u32 time;
|
|
u32 period;
|
|
s16 value;
|
|
s16 lastValue;
|
|
} SYNTH_LFO;
|
|
|
|
typedef struct SYNTHMasterFader {
|
|
// total size: 0x30
|
|
float volume; // offset 0x0, size 0x4
|
|
float target; // offset 0x4, size 0x4
|
|
float start; // offset 0x8, size 0x4
|
|
float time; // offset 0xC, size 0x4
|
|
float deltaTime; // offset 0x10, size 0x4
|
|
float pauseVol; // offset 0x14, size 0x4
|
|
float pauseTarget; // offset 0x18, size 0x4
|
|
float pauseStart; // offset 0x1C, size 0x4
|
|
float pauseTime; // offset 0x20, size 0x4
|
|
float pauseDeltaTime; // offset 0x24, size 0x4
|
|
unsigned long seqId; // offset 0x28, size 0x4
|
|
unsigned char seqMode; // offset 0x2C, size 0x1
|
|
unsigned char type; // offset 0x2D, size 0x1
|
|
} SYNTHMasterFader;
|
|
|
|
typedef struct CTRL_SOURCE {
|
|
u8 midiCtrl;
|
|
u8 combine;
|
|
long scale;
|
|
} CTRL_SOURCE;
|
|
|
|
typedef struct CTRL_DEST {
|
|
CTRL_SOURCE source[4];
|
|
u16 oldValue;
|
|
u8 numSource;
|
|
} CTRL_DEST;
|
|
|
|
typedef struct SND_VIRTUALSAMPLE_INFO {
|
|
// total size: 0x14
|
|
unsigned short smpID; // offset 0x0, size 0x2
|
|
unsigned short instID; // offset 0x2, size 0x2
|
|
union vsData {
|
|
struct vsUpdate {
|
|
// total size: 0x10
|
|
unsigned long off1; // offset 0x0, size 0x4
|
|
unsigned long len1; // offset 0x4, size 0x4
|
|
unsigned long off2; // offset 0x8, size 0x4
|
|
unsigned long len2; // offset 0xC, size 0x4
|
|
} update;
|
|
} data;
|
|
} SND_VIRTUALSAMPLE_INFO;
|
|
|
|
typedef struct VS_BUFFER {
|
|
// total size: 0x24
|
|
unsigned char state; // offset 0x0, size 0x1
|
|
unsigned char hwId; // offset 0x1, size 0x1
|
|
unsigned char smpType; // offset 0x2, size 0x1
|
|
unsigned char voice; // offset 0x3, size 0x1
|
|
unsigned long last; // offset 0x4, size 0x4
|
|
unsigned long finalGoodSamples; // offset 0x8, size 0x4
|
|
unsigned long finalLast; // offset 0xC, size 0x4
|
|
SND_VIRTUALSAMPLE_INFO info; // offset 0x10, size 0x14
|
|
} VS_BUFFER;
|
|
|
|
typedef struct _VS {
|
|
// total size: 0x950
|
|
unsigned char numBuffers; // offset 0x0, size 0x1
|
|
unsigned long bufferLength; // offset 0x4, size 0x4
|
|
VS_BUFFER streamBuffer[64]; // offset 0x8, size 0x900
|
|
unsigned char voices[64]; // offset 0x908, size 0x40
|
|
unsigned short nextInstID; // offset 0x948, size 0x2
|
|
unsigned long (*callback)(unsigned char,
|
|
struct SND_VIRTUALSAMPLE_INFO*); // offset 0x94C, size 0x4
|
|
} VS;
|
|
|
|
extern VS vs;
|
|
|
|
#pragma push
|
|
#pragma pack(4)
|
|
typedef struct SYNTH_VOICE {
|
|
SYNTH_QUEUE lowPrecisionJob;
|
|
SYNTH_QUEUE zeroOffsetJob; // offset 0xC, size 0xC
|
|
SYNTH_QUEUE eventJob; // offset 0x18, size 0xC
|
|
u64 lastLowCallTime;
|
|
u64 lastZeroCallTime;
|
|
MSTEP* addr;
|
|
MSTEP* curAddr;
|
|
struct SYNTH_VOICE* nextMacActive;
|
|
struct SYNTH_VOICE* prevMacActive;
|
|
struct SYNTH_VOICE* nextTimeQueueMacro;
|
|
struct SYNTH_VOICE* prevTimeQueueMacro;
|
|
MAC_STATE state;
|
|
MSTEP* trapEventAddr[3];
|
|
MSTEP* trapEventCurAddr[3];
|
|
u8 trapEventAny;
|
|
CALLSTACK callStack[4];
|
|
u8 callStackEntryNum;
|
|
u8 callStackIndex;
|
|
u64 macStartTime;
|
|
u64 wait;
|
|
u64 waitTime;
|
|
u8 timeUsedByInput;
|
|
u16 loop;
|
|
long local_vars[16];
|
|
u32 child;
|
|
u32 parent;
|
|
u32 id;
|
|
VID_LIST* vidList;
|
|
VID_LIST* vidMasterList;
|
|
u16 allocId;
|
|
u16 macroId;
|
|
u8 keyGroup;
|
|
u32 lastVID;
|
|
u8 prio;
|
|
u16 ageSpeed;
|
|
u32 age;
|
|
u64 cFlags;
|
|
u8 block;
|
|
u8 fxFlag;
|
|
u8 vGroup;
|
|
u8 studio;
|
|
u8 track;
|
|
u8 midi;
|
|
u8 midiSet;
|
|
u8 section;
|
|
u32 sInfo;
|
|
u32 playFrq;
|
|
u16 curNote;
|
|
s8 curDetune;
|
|
u8 orgNote;
|
|
u8 lastNote;
|
|
u8 portType;
|
|
u16 portLastCtrlState;
|
|
u32 portDuration;
|
|
u32 portCurPitch;
|
|
u32 portTime; // offset 0x13C, size 0x4
|
|
u8 vibKeyRange; // offset 0x140, size 0x1
|
|
u8 vibCentRange; // offset 0x141, size 0x1
|
|
u32 vibPeriod; // offset 0x144, size 0x4
|
|
u32 vibCurTime; // offset 0x148, size 0x4
|
|
long vibCurOffset; // offset 0x14C, size 0x4
|
|
s16 vibModAddScale; // offset 0x150, size 0x2
|
|
u32 volume; // offset 0x154, size 0x4
|
|
u32 orgVolume; // offset 0x158, size 0x4
|
|
float lastVolFaderScale; // offset 0x15C, size 0x4
|
|
u32 lastPan; // offset 0x160, size 0x4
|
|
u32 lastSPan; // offset 0x164, size 0x4
|
|
float treCurScale; // offset 0x168, size 0x4
|
|
u16 treScale; // offset 0x16C, size 0x2
|
|
u16 treModAddScale; // offset 0x16E, size 0x2
|
|
u32 panning[2]; // offset 0x170, size 0x8
|
|
long panDelta[2]; // offset 0x178, size 0x8
|
|
u32 panTarget[2]; // offset 0x180, size 0x8
|
|
u32 panTime[2]; // offset 0x188, size 0x8
|
|
u8 revVolScale; // offset 0x190, size 0x1
|
|
u8 revVolOffset; // offset 0x191, size 0x1
|
|
u8 volTable; // offset 0x192, size 0x1
|
|
u8 itdMode; // offset 0x193, size 0x1
|
|
long envDelta; // offset 0x194, size 0x4
|
|
u32 envTarget; // offset 0x198, size 0x4
|
|
u32 envCurrent; // offset 0x19C, size 0x4
|
|
u32 sweepOff[2]; // offset 0x1A0, size 0x8
|
|
long sweepAdd[2]; // offset 0x1A8, size 0x8
|
|
long sweepCnt[2]; // offset 0x1B0, size 0x8
|
|
u8 sweepNum[2]; // offset 0x1B8, size 0x2
|
|
struct SYNTH_LFO lfo[2]; // offset 0x1BC, size 0x18
|
|
u8 lfoUsedByInput[2]; // offset 0x1D4, size 0x2
|
|
u8 pbLowerKeyRange; // offset 0x1D6, size 0x1
|
|
u8 pbUpperKeyRange; // offset 0x1D7, size 0x1
|
|
u16 pbLast; // offset 0x1D8, size 0x2
|
|
struct ADSR_VARS pitchADSR; // offset 0x1DC, size 0x28
|
|
s16 pitchADSRRange; // offset 0x204, size 0x2
|
|
u16 curPitch; // offset 0x206, size 0x2
|
|
struct setup {
|
|
u8 vol; // offset 0x0, size 0x1
|
|
u8 pan; // offset 0x1, size 0x1
|
|
u8 midi; // offset 0x2, size 0x1
|
|
u8 midiSet; // offset 0x3, size 0x1
|
|
u8 section; // offset 0x4, size 0x1
|
|
u8 track; // offset 0x5, size 0x1
|
|
u8 vGroup; // offset 0x6, size 0x1
|
|
u8 studio; // offset 0x7, size 0x1
|
|
u8 itdMode; // offset 0x8, size 0x1
|
|
} setup; // offset 0x208, size 0x9
|
|
u32 midiDirtyFlags; // offset 0x214, size 0x4
|
|
CTRL_DEST inpVolume; // offset 0x218, size 0x24
|
|
CTRL_DEST inpPanning; // offset 0x23C, size 0x24
|
|
CTRL_DEST inpSurroundPanning; // offset 0x260, size 0x24
|
|
CTRL_DEST inpPitchBend; // offset 0x284, size 0x24
|
|
CTRL_DEST inpDoppler; // offset 0x2A8, size 0x24
|
|
CTRL_DEST inpModulation; // offset 0x2CC, size 0x24
|
|
CTRL_DEST inpPedal; // offset 0x2F0, size 0x24
|
|
CTRL_DEST inpPortamento; // offset 0x314, size 0x24
|
|
CTRL_DEST inpPreAuxA; // offset 0x338, size 0x24
|
|
CTRL_DEST inpReverb; // offset 0x35C, size 0x24
|
|
CTRL_DEST inpPreAuxB; // offset 0x380, size 0x24
|
|
CTRL_DEST inpPostAuxB; // offset 0x3A4, size 0x24
|
|
CTRL_DEST inpTremolo; // offset 0x3C8, size 0x24
|
|
u8 mesgNum; // offset 0x3EC, size 0x1
|
|
u8 mesgRead; // offset 0x3ED, size 0x1
|
|
u8 mesgWrite; // offset 0x3EE, size 0x1
|
|
long mesgQueue[4]; // offset 0x3F0, size 0x10
|
|
u16 curOutputVolume; // offset 0x400, size 0x2
|
|
} SYNTH_VOICE;
|
|
|
|
typedef struct synthITDInfo {
|
|
// total size: 0x2
|
|
unsigned char music; // offset 0x0, size 0x1
|
|
unsigned char sfx; // offset 0x1, size 0x1
|
|
} synthITDInfo;
|
|
|
|
#pragma pop
|
|
|
|
typedef struct LAYER {
|
|
// total size: 0xC
|
|
unsigned short id; // offset 0x0, size 0x2
|
|
unsigned char keyLow; // offset 0x2, size 0x1
|
|
unsigned char keyHigh; // offset 0x3, size 0x1
|
|
signed char transpose; // offset 0x4, size 0x1
|
|
unsigned char volume; // offset 0x5, size 0x1
|
|
signed short prioOffset; // offset 0x6, size 0x2
|
|
unsigned char panning; // offset 0x8, size 0x1
|
|
unsigned char reserved[3]; // offset 0x9, size 0x3
|
|
} LAYER;
|
|
|
|
typedef struct KEYMAP {
|
|
// total size: 0x8
|
|
unsigned short id; // offset 0x0, size 0x2
|
|
signed char transpose; // offset 0x2, size 0x1
|
|
unsigned char panning; // offset 0x3, size 0x1
|
|
signed short prioOffset; // offset 0x4, size 0x2
|
|
unsigned char reserved[2]; // offset 0x6, size 0x2
|
|
} KEYMAP;
|
|
|
|
typedef struct MEM_DATA {
|
|
// total size: 0x408
|
|
unsigned long nextOff; // offset 0x0, size 0x4
|
|
unsigned short id; // offset 0x4, size 0x2
|
|
unsigned short reserved; // offset 0x6, size 0x2
|
|
union {
|
|
struct {
|
|
// total size: 0x10
|
|
unsigned long num; // offset 0x0, size 0x4
|
|
LAYER entry[1]; // offset 0x4, size 0xC
|
|
} layer;
|
|
KEYMAP map[128];
|
|
unsigned char tab[1];
|
|
MSTEP cmd[1][2];
|
|
} data; // offset 0x8, size 0x400
|
|
} MEM_DATA;
|
|
|
|
typedef struct POOL_DATA {
|
|
// total size: 0x10
|
|
u32 macroOff; // offset 0x0, size 0x4
|
|
u32 curveOff; // offset 0x4, size 0x4
|
|
u32 keymapOff; // offset 0x8, size 0x4
|
|
u32 layerOff; // offset 0xC, size 0x4
|
|
} POOL_DATA;
|
|
|
|
typedef struct SAL_VOLINFO {
|
|
// total size: 0x24
|
|
float volL; // offset 0x0, size 0x4
|
|
float volR; // offset 0x4, size 0x4
|
|
float volS; // offset 0x8, size 0x4
|
|
float volAuxAL; // offset 0xC, size 0x4
|
|
float volAuxAR; // offset 0x10, size 0x4
|
|
float volAuxAS; // offset 0x14, size 0x4
|
|
float volAuxBL; // offset 0x18, size 0x4
|
|
float volAuxBR; // offset 0x1C, size 0x4
|
|
float volAuxBS; // offset 0x20, size 0x4
|
|
} SAL_VOLINFO;
|
|
|
|
typedef struct SAL_PANINFO {
|
|
// total size: 0x30
|
|
u32 pan_i; // offset 0x0, size 0x4
|
|
u32 pan_im; // offset 0x4, size 0x4
|
|
u32 span_i; // offset 0x8, size 0x4
|
|
u32 span_im; // offset 0xC, size 0x4
|
|
u32 rpan_i; // offset 0x10, size 0x4
|
|
u32 rpan_im; // offset 0x14, size 0x4
|
|
float pan_f; // offset 0x18, size 0x4
|
|
float pan_fm; // offset 0x1C, size 0x4
|
|
float span_f; // offset 0x20, size 0x4
|
|
float span_fm; // offset 0x24, size 0x4
|
|
float rpan_f; // offset 0x28, size 0x4
|
|
float rpan_fm; // offset 0x2C, size 0x4
|
|
} SAL_PANINFO;
|
|
|
|
typedef struct _SPB {
|
|
// total size: 0x36
|
|
unsigned short dpopLHi; // offset 0x0, size 0x2
|
|
unsigned short dpopLLo; // offset 0x2, size 0x2
|
|
unsigned short dpopLDelta; // offset 0x4, size 0x2
|
|
unsigned short dpopRHi; // offset 0x6, size 0x2
|
|
unsigned short dpopRLo; // offset 0x8, size 0x2
|
|
unsigned short dpopRDelta; // offset 0xA, size 0x2
|
|
unsigned short dpopSHi; // offset 0xC, size 0x2
|
|
unsigned short dpopSLo; // offset 0xE, size 0x2
|
|
unsigned short dpopSDelta; // offset 0x10, size 0x2
|
|
unsigned short dpopALHi; // offset 0x12, size 0x2
|
|
unsigned short dpopALLo; // offset 0x14, size 0x2
|
|
unsigned short dpopALDelta; // offset 0x16, size 0x2
|
|
unsigned short dpopARHi; // offset 0x18, size 0x2
|
|
unsigned short dpopARLo; // offset 0x1A, size 0x2
|
|
unsigned short dpopARDelta; // offset 0x1C, size 0x2
|
|
unsigned short dpopASHi; // offset 0x1E, size 0x2
|
|
unsigned short dpopASLo; // offset 0x20, size 0x2
|
|
unsigned short dpopASDelta; // offset 0x22, size 0x2
|
|
unsigned short dpopBLHi; // offset 0x24, size 0x2
|
|
unsigned short dpopBLLo; // offset 0x26, size 0x2
|
|
unsigned short dpopBLDelta; // offset 0x28, size 0x2
|
|
unsigned short dpopBRHi; // offset 0x2A, size 0x2
|
|
unsigned short dpopBRLo; // offset 0x2C, size 0x2
|
|
unsigned short dpopBRDelta; // offset 0x2E, size 0x2
|
|
unsigned short dpopBSHi; // offset 0x30, size 0x2
|
|
unsigned short dpopBSLo; // offset 0x32, size 0x2
|
|
unsigned short dpopBSDelta; // offset 0x34, size 0x2
|
|
} _SPB;
|
|
|
|
typedef struct DSPhostDPop {
|
|
// total size: 0x24
|
|
long l; // offset 0x0, size 0x4
|
|
long r; // offset 0x4, size 0x4
|
|
long s; // offset 0x8, size 0x4
|
|
long lA; // offset 0xC, size 0x4
|
|
long rA; // offset 0x10, size 0x4
|
|
long sA; // offset 0x14, size 0x4
|
|
long lB; // offset 0x18, size 0x4
|
|
long rB; // offset 0x1C, size 0x4
|
|
long sB; // offset 0x20, size 0x4
|
|
} DSPhostDPop;
|
|
|
|
typedef struct DSPinput {
|
|
// total size: 0xC
|
|
unsigned char studio; // offset 0x0, size 0x1
|
|
unsigned short vol; // offset 0x2, size 0x2
|
|
unsigned short volA; // offset 0x4, size 0x2
|
|
unsigned short volB; // offset 0x6, size 0x2
|
|
struct SND_STUDIO_INPUT* desc; // offset 0x8, size 0x4
|
|
} DSPinput;
|
|
|
|
typedef struct DSPstudioinfo {
|
|
// total size: 0xBC
|
|
struct _SPB* spb; // offset 0x0, size 0x4
|
|
struct DSPhostDPop hostDPopSum; // offset 0x4, size 0x24
|
|
long* main[2]; // offset 0x28, size 0x8
|
|
long* auxA[3]; // offset 0x30, size 0xC
|
|
long* auxB[3]; // offset 0x3C, size 0xC
|
|
struct DSPvoice* voiceRoot; // offset 0x48, size 0x4
|
|
struct DSPvoice* alienVoiceRoot; // offset 0x4C, size 0x4
|
|
unsigned char state; // offset 0x50, size 0x1
|
|
unsigned char isMaster; // offset 0x51, size 0x1
|
|
unsigned char numInputs; // offset 0x52, size 0x1
|
|
SND_STUDIO_TYPE type; // offset 0x54, size 0x4
|
|
struct DSPinput in[7]; // offset 0x58, size 0x54
|
|
SND_AUX_CALLBACK auxAHandler; // offset 0xAC, size 0x4
|
|
SND_AUX_CALLBACK auxBHandler; // offset 0xB0, size 0x4
|
|
void* auxAUser; // offset 0xB4, size 0x4
|
|
void* auxBUser; // offset 0xB8, size 0x4
|
|
} DSPstudioinfo;
|
|
|
|
extern DSPstudioinfo dspStudio[8];
|
|
|
|
extern SYNTH_VOICE* synthVoice;
|
|
|
|
extern DSPvoice* dspVoice;
|
|
typedef s32 (*SND_COMPARE)(void*, void*);
|
|
|
|
typedef struct FX_TAB {
|
|
// total size: 0xA
|
|
unsigned short id; // offset 0x0, size 0x2
|
|
unsigned short macro; // offset 0x2, size 0x2
|
|
unsigned char maxVoices; // offset 0x4, size 0x1
|
|
unsigned char priority; // offset 0x5, size 0x1
|
|
unsigned char volume; // offset 0x6, size 0x1
|
|
unsigned char panning; // offset 0x7, size 0x1
|
|
unsigned char key; // offset 0x8, size 0x1
|
|
unsigned char vGroup; // offset 0x9, size 0x1
|
|
} FX_TAB;
|
|
|
|
typedef struct FX_DATA {
|
|
// total size: 0xE
|
|
unsigned short num; // offset 0x0, size 0x2
|
|
unsigned short reserverd; // offset 0x2, size 0x2
|
|
struct FX_TAB fx[1]; // offset 0x4, size 0xA
|
|
} FX_DATA;
|
|
|
|
typedef struct FX_GROUP {
|
|
// total size: 0x8
|
|
unsigned short gid; // offset 0x0, size 0x2
|
|
unsigned short fxNum; // offset 0x2, size 0x2
|
|
struct FX_TAB * fxTab; // offset 0x4, size 0x4
|
|
} FX_GROUP;
|
|
|
|
typedef struct PAGE {
|
|
// total size: 0x6
|
|
unsigned short macro; // offset 0x0, size 0x2
|
|
unsigned char prio; // offset 0x2, size 0x1
|
|
unsigned char maxVoices; // offset 0x3, size 0x1
|
|
unsigned char index; // offset 0x4, size 0x1
|
|
unsigned char reserved; // offset 0x5, size 0x1
|
|
} PAGE;
|
|
|
|
typedef struct MIDI_CHANNEL_SETUP {
|
|
// total size: 0x5
|
|
unsigned char program; // offset 0x0, size 0x1
|
|
unsigned char volume; // offset 0x1, size 0x1
|
|
unsigned char panning; // offset 0x2, size 0x1
|
|
unsigned char reverb; // offset 0x3, size 0x1
|
|
unsigned char chorus; // offset 0x4, size 0x1
|
|
} MIDI_CHANNEL_SETUP;
|
|
|
|
typedef struct MIDISETUP {
|
|
// total size: 0x54
|
|
u16 songId; // offset 0x0, size 0x2
|
|
u16 reserved; // offset 0x2, size 0x2
|
|
MIDI_CHANNEL_SETUP channel[16]; // offset 0x4, size 0x50
|
|
} MIDISETUP;
|
|
|
|
void dataInit(u32, u32); /* extern */
|
|
void dataInitStack(); /* extern */
|
|
u32 dataInsertSDir(SDIR_DATA* sdir, void* smp_data);
|
|
u32 dataRemoveSDir(SDIR_DATA* sdir);
|
|
u32 dataInsertMacro(u16 mid, void* macroaddr);
|
|
u32 dataRemoveMacro(u16 mid);
|
|
u32 dataInsertCurve(u16 cid, void* curvedata);
|
|
u32 dataRemoveCurve(u16 sid);
|
|
u32 dataAddSampleReference(u16 sid);
|
|
u32 dataRemoveSampleReference(u16 sid);
|
|
u32 dataInsertKeymap(u16 cid, void* keymapdata);
|
|
u32 dataRemoveKeymap(u16 sid);
|
|
u32 dataInsertLayer(u16 cid, void* layerdata, u16 size);
|
|
u32 dataRemoveLayer(u16 sid);
|
|
u32 dataInsertFX(u16 gid, FX_TAB* fx, u16 fxNum);
|
|
FX_TAB* dataGetFX(u16 fid);
|
|
s32 hwInit(u32* frq, u16 numVoices, u16 numStudios, u32 flags); /* extern */
|
|
void hwEnableIrq();
|
|
void hwDisableIrq();
|
|
void* hwTransAddr(void* samples);
|
|
|
|
void seqInit(); /* extern */
|
|
unsigned long seqStartPlay(PAGE* norm, PAGE* drum, MIDISETUP* midiSetup, u32* song,
|
|
SND_PLAYPARA* para, u8 studio, u16 sgid);
|
|
void streamInit(); /* extern */
|
|
void vsInit(); /* extern */
|
|
void hwExit();
|
|
void dataExit();
|
|
void s3dInit(s32); /* extern */
|
|
void s3dKillEmitterByFXID(FX_TAB* fxTab, unsigned long num);
|
|
void s3dExit();
|
|
void synthInit(u32, u8); /* extern */
|
|
extern u16 voicePrioSortRootListRoot;
|
|
extern u8 voiceMusicRunning;
|
|
extern u8 voiceFxRunning;
|
|
extern u8 voiceListInsert;
|
|
extern u8 voiceListRoot;
|
|
|
|
u32 synthGetTicksPerSecond(SYNTH_VOICE* svoice);
|
|
void synthKillVoicesByMacroReferences(u16* ref);
|
|
void synthExit();
|
|
u16 sndRand(void);
|
|
s16 sndSin(u16 angle);
|
|
void* sndBSearch(void* key, void* base, s32 num, s32 len, SND_COMPARE cmp);
|
|
void sndConvertMs(u32* time);
|
|
void sndConvertTicks(u32* out, SYNTH_VOICE* svoice);
|
|
u32 sndConvert2Ms(u32 time);
|
|
void hwActivateStudio(unsigned char studio, unsigned long isMaster, SND_STUDIO_TYPE type);
|
|
void hwDeactivateStudio(u8);
|
|
u32 hwIsActive(u32);
|
|
|
|
u32 sndGetPitch(u8 key, u32 sInfo);
|
|
extern SND_HOOKS salHooks;
|
|
extern u8 sndActive;
|
|
extern u8 synthIdleWaitActive;
|
|
extern SynthInfo synthInfo;
|
|
typedef s32 (*SND_MESSAGE_CALLBACK)(u32, u32);
|
|
typedef void (*SND_SOME_CALLBACK)();
|
|
|
|
extern SND_MESSAGE_CALLBACK salMessageCallback;
|
|
/* Math */
|
|
void salApplyMatrix(const SND_FMATRIX* a, const SND_FVECTOR* b, SND_FVECTOR* out);
|
|
float salNormalizeVector(SND_FVECTOR* vec);
|
|
void salCrossProduct(SND_FVECTOR* out, const SND_FVECTOR* a, const SND_FVECTOR* b);
|
|
void salInvertMatrix(SND_FMATRIX* out, const SND_FMATRIX* in);
|
|
|
|
/* hardware */
|
|
u32 salInitAi(SND_SOME_CALLBACK, u32, u32*);
|
|
u32 salInitDsp(u32);
|
|
u32 salInitDspCtrl(u8 numVoices, u8 numStudios, u32 defaultStudioDPL2);
|
|
u32 salStartAi();
|
|
void salInitHRTFBuffer();
|
|
void salActivateVoice(DSPvoice* dsp_vptr, u8 studio);
|
|
void salDeactivateVoice(DSPvoice* dsp_vptr);
|
|
void salActivateStudio(u8 studio, u32 isMaster, SND_STUDIO_TYPE type);
|
|
void salDeactivateStudio(unsigned char studio);
|
|
void salActivateVoice(DSPvoice* dsp_vptr, u8 studio);
|
|
void salCalcVolume(u8 voltab_index, SAL_VOLINFO* vi, float vol, u32 pan, u32 span, float auxa,
|
|
float auxb, u32 itd, u32 dpl2);
|
|
void salReconnectVoice(DSPvoice* dsp_vptr, u8 studio);
|
|
void* salMalloc(u32 len);
|
|
void salFree(void* addr);
|
|
|
|
#define SAL_MAX_STUDIONUM 8
|
|
extern u8 salMaxStudioNum;
|
|
extern u8 salNumVoices;
|
|
|
|
/* Stream */
|
|
typedef s32 (*SND_STREAM_UPDATE_CALLBACK)(void* buffer1, u32 len1, void* buffer2, u32 len2,
|
|
void* user);
|
|
typedef struct SND_STREAM_INFO {
|
|
u32 x0_;
|
|
u32 x4_;
|
|
u32 x8_;
|
|
u8 xc_;
|
|
char data2[0x10 - 0xd];
|
|
SND_STREAM_UPDATE_CALLBACK updateCb;
|
|
char data3[0x4C - 0x14];
|
|
SND_VOICEID voiceId;
|
|
void* user;
|
|
char data4[0x64 - 0x54];
|
|
} SND_STREAM_INFO;
|
|
|
|
void streamOutputModeChanged();
|
|
unsigned short inpGetMidiCtrl(unsigned char ctrl, unsigned char channel, unsigned char set);
|
|
/* TODO: Figure out what `unk` is */
|
|
void hwSetSRCType(u32 v, u8 salSRCType);
|
|
void hwSetITDMode(u32 v, u8 mode);
|
|
void hwSetPolyPhaseFilter(unsigned long v, unsigned char salCoefSel);
|
|
bool hwAddInput(u8 studio, SND_STUDIO_INPUT* in_desc);
|
|
bool hwRemoveInput(u8 studio, SND_STUDIO_INPUT* in_desc);
|
|
void hwChangeStudio(u32 v, u8 studio);
|
|
void hwDisableHRTF();
|
|
|
|
extern u32 dspHRTFOn;
|
|
|
|
extern u16* dspCmdList;
|
|
extern u16 dspCmdFirstSize;
|
|
|
|
extern u8 dspScale2IndexTab[1024];
|
|
|
|
typedef void* (*ARAMUploadCallback)(u32, u32);
|
|
|
|
u32 aramGetStreamBufferAddress(unsigned char id, unsigned long* len);
|
|
void aramUploadData(void* mram, unsigned long aram, unsigned long len, unsigned long highPrio,
|
|
void (*callback)(unsigned long), unsigned long user);
|
|
void aramFreeStreamBuffer(u8 id);
|
|
void* aramStoreData(void* src, unsigned long len);
|
|
void aramRemoveData(void* aram, unsigned long len);
|
|
|
|
void macMakeInactive(SYNTH_VOICE* svoice, MAC_STATE);
|
|
|
|
void sndProfUpdateMisc(SND_PROFILE_INFO* info);
|
|
void sndProfResetPMC(SND_PROFILE_DATA* info);
|
|
void sndProfStartPMC(SND_PROFILE_DATA* info);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif // _MUSYX_MUSYX_PRIV
|