mirror of
https://github.com/ACreTeam/ac-decomp
synced 2026-07-04 19:25:46 -04:00
359 lines
11 KiB
C
359 lines
11 KiB
C
#ifndef _JAUDIO_JAMMAIN_2_H
|
|
#define _JAUDIO_JAMMAIN_2_H
|
|
|
|
#include "types.h"
|
|
|
|
#include "jaudio_NES/audiostruct.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif // ifdef __cplusplus
|
|
|
|
//! NOTE from intns:
|
|
//! There's something iffy going on with the value 0xC0.
|
|
//! It appears in seqsetup with flags regarding opening tracks,
|
|
//! It appears to do with command id(s) for some reason
|
|
//! It's everywhere, but why? Why, J(esus)System?
|
|
|
|
typedef struct seqp_ seqp_;
|
|
typedef struct TrackPort_ TrackPort_;
|
|
typedef struct MoveParam_ MoveParam_;
|
|
typedef struct AInnerParam_ AInnerParam_;
|
|
typedef union TimedParam_ TimedParam_;
|
|
typedef struct OuterParam_ OuterParam_;
|
|
typedef struct RegisterParam_ RegisterParam_;
|
|
typedef union URegisterParam_ URegisterParam_;
|
|
|
|
typedef u32 (*CmdFunction)(); // TODO: Confirm return type
|
|
typedef u16 (*TrackCallback)(seqp_*, u16); // TODO: Confirm return type
|
|
|
|
typedef enum {
|
|
OuterParamFlag_None = 0,
|
|
OuterParamFlag_Volume = 1 << 0,
|
|
OuterParamFlag_Pitch = 1 << 1,
|
|
OuterParamFlag_Fxmix = 1 << 2,
|
|
OuterParamFlag_Pan = 1 << 3,
|
|
OuterParamFlag_Dolby = 1 << 4,
|
|
OuterParamFlag_DistFilt = 1 << 5,
|
|
OuterParamFlag_Tempo = 1 << 6,
|
|
OuterParamFlag_FIR8Filter = 1 << 7, // Probably related to FIR filter
|
|
|
|
OuterParamFlag_IIR0 = 1 << 12, // IIR0 filter
|
|
OuterParamFlag_IIR1 = 1 << 13, // IIR1 filter
|
|
OuterParamFlag_IIR2 = 1 << 14, // IIR2 filter
|
|
OuterParamFlag_IIR3 = 1 << 15, // IIR3 filter
|
|
OuterParamFlag_IIRFilter = (OuterParamFlag_IIR0 | OuterParamFlag_IIR1 | OuterParamFlag_IIR2 | OuterParamFlag_IIR3),
|
|
|
|
SEQTRACK_FLAG_MASTER_LEVEL = 1 << 17 // TODO: suspicious, unknown use
|
|
} OuterParamFlag;
|
|
|
|
typedef enum {
|
|
CMD_NONE_0 = 0, // 0
|
|
CMD_OPEN_TRACK, // 1
|
|
CMD_OPEN_TRACK_BROS, // 2
|
|
CMD_CALL, // 3
|
|
CMD_CALL_F, // 4
|
|
CMD_RETURN, // 5
|
|
CMD_RETURN_F, // 6
|
|
CMD_JUMP, // 7
|
|
CMD_JUMP_F, // 8
|
|
CMD_LOOP_START, // 9
|
|
CMD_LOOP_END, // 10
|
|
CMD_READ_PORT, // 11
|
|
CMD_WRITE_PORT, // 12
|
|
CMD_CHECK_PORT_IMPORT, // 13
|
|
CMD_CHECK_PORT_EXPORT, // 14
|
|
CMD_WAIT_REGISTER, // 15
|
|
CMD_CONNECT_NAME, // 16
|
|
CMD_PARENT_WRITE_PORT, // 17
|
|
CMD_CHILD_WRITE_PORT, // 18
|
|
CMD_NONE_1, // 19
|
|
CMD_SET_LAST_NOTE, // 20
|
|
CMD_TIME_RELATE, // 21
|
|
CMD_SIMPLE_OSC, // 22
|
|
CMD_SIMPLE_ENV, // 23
|
|
CMD_SIMPLE_ADSR, // 24
|
|
CMD_TRANSPOSE, // 25
|
|
CMD_CLOSE_TRACK, // 26
|
|
CMD_OUTPUT_SWITCH, // 27
|
|
CMD_UPDATE_SYNC, // 28
|
|
CMD_BUS_CONNECT, // 29
|
|
CMD_PAUSE_STATUS, // 30
|
|
CMD_SET_INTERRUPT, // 31
|
|
CMD_DISABLE_INTERRUPT, // 32
|
|
CMD_CLEAR_I, // 33
|
|
CMD_SET_I, // 34
|
|
CMD_RETURN_I, // 35
|
|
CMD_INTERRUPT_TIMER, // 36
|
|
CMD_CONNECT_OPEN, // 37
|
|
CMD_CONNECT_CLOSE, // 38
|
|
CMD_SYNC_CPU, // 39
|
|
CMD_FLUSH_ALL, // 40
|
|
CMD_FLUSH_RELEASE, // 41
|
|
CMD_WAIT_3, // 42
|
|
CMD_PAN_POWER_SET, // 43
|
|
CMD_IIR_SET, // 44
|
|
CMD_FIR_SET, // 45
|
|
CMD_EXT_SET, // 46
|
|
CMD_PAN_SWITCH_SET, // 47
|
|
CMD_OSC_ROUTE, // 48
|
|
CMD_IIR_CUTOFF, // 49
|
|
CMD_OSC_FULL, // 50
|
|
CMD_NONE_2, // 51
|
|
CMD_NONE_3, // 52
|
|
CMD_NONE_4, // 53
|
|
CMD_NONE_5, // 54
|
|
CMD_NONE_6, // 55
|
|
CMD_NONE_7, // 56
|
|
CMD_NONE_8, // 57
|
|
CMD_CHECK_WAVE, // 58
|
|
CMD_PRINTF, // 59
|
|
CMD_NOP, // 60
|
|
CMD_TEMPO, // 61
|
|
CMD_TIME_BASE, // 62
|
|
CMD_FINISH, // 63
|
|
CMD_COUNT // 64
|
|
} CommandID;
|
|
|
|
/**
|
|
* @brief This is an invented type of an unknown name.
|
|
*
|
|
* @note Size: 4
|
|
*/
|
|
struct TrackPort_ {
|
|
u8 importFlag; // _00
|
|
u8 exportFlag; // _01
|
|
u16 value; // _02
|
|
};
|
|
|
|
/**
|
|
* @brief Name borrowed from `JASTrack.h` from Pikmin 2.
|
|
*
|
|
* @note Size: 16
|
|
*/
|
|
struct MoveParam_ {
|
|
f32 currentValue; // _00
|
|
f32 targetValue; // _04
|
|
f32 duration; // _08
|
|
f32 stepSize; // _0C
|
|
};
|
|
|
|
/**
|
|
* @brief Name borrowed from `JASTrack.h` from Pikmin 2.
|
|
*
|
|
* @note Size: 0x120
|
|
*/
|
|
struct AInnerParam_ {
|
|
MoveParam_ volume; // _00
|
|
MoveParam_ pitch; // _10
|
|
MoveParam_ fxmix; // _20
|
|
MoveParam_ pan; // _30
|
|
MoveParam_ dolby; // _40
|
|
MoveParam_ distFilter; // _50
|
|
MoveParam_ osc0Width; // _60
|
|
MoveParam_ osc0Rate; // _70
|
|
MoveParam_ osc0Vertex; // _80
|
|
MoveParam_ osc1Width; // _90
|
|
MoveParam_ osc1Rate; // _A0
|
|
MoveParam_ osc1Vertex; // _B0
|
|
MoveParam_ IIRs[4]; // _C0
|
|
MoveParam_ _100; // _100
|
|
MoveParam_ _110; // _110
|
|
};
|
|
|
|
union TimedParam_ {
|
|
AInnerParam_ inner; // Get individual params by member name
|
|
MoveParam_ move[18]; // Get individual params by index
|
|
};
|
|
|
|
/**
|
|
* @brief Name borrowed from `JASTrack.h` from Pikmin 2.
|
|
*
|
|
* @note Size: 0x40.
|
|
*/
|
|
struct OuterParam_ {
|
|
BOOL isAssigned; // _00
|
|
u32 refCount; // _04
|
|
u16 flags; // _08
|
|
u16 updateFlags; // _0A
|
|
f32 volume; // _0C
|
|
f32 fxMix; // _10
|
|
f32 dolby; // _14
|
|
f32 pitch; // _18
|
|
f32 pan; // _1C
|
|
f32 tempo; // _20
|
|
s16 firCoefficients[8]; // _24
|
|
u8 _34[0x40 - 0x34]; // _34
|
|
};
|
|
|
|
/**
|
|
* @brief Name borrowed from `JASRegisterParam.h` from Pikmin 2.
|
|
*
|
|
* @note Size: 0x40.
|
|
*/
|
|
struct RegisterParam_ {
|
|
u8 _00[0x06 - 0x00]; // _00, 00 - 02
|
|
u16 value; // _06, 03
|
|
u8 _08[0x0C - 0x08]; // _08, 04 - 05
|
|
u16 bankNumber; // _0C, 06
|
|
u16 pitchScale; // _0E, 07
|
|
u16 arguments[5]; // _10, 08 - 12, Exact length confirmed: `Cmd_PanPowSet`.
|
|
u16 basePriority; // _1A, 13
|
|
u8 _1C[0x20 - 0x1C]; // _1C, 14
|
|
u32 _20[4]; // _20, 15 - 22, Exact length semi-confirmed; Pikmin 2 also says 4.
|
|
u8 _30[0x40 - 0x30]; // _1C, 23 - 31
|
|
};
|
|
|
|
/**
|
|
* @brief Invented struct necessitated by behavior in `seqsetup.c`.
|
|
*
|
|
* @note Size: 0x40.
|
|
*/
|
|
union URegisterParam_ {
|
|
RegisterParam_ param;
|
|
u16 reg[32];
|
|
};
|
|
|
|
/**
|
|
* @brief This struct is analogous to `JASTrack` of later JAudio.
|
|
*
|
|
* @note Size: 0x434 (Confirmed by `Jaf_HandleToSeq`).
|
|
*/
|
|
struct seqp_ {
|
|
u8* baseData; // _000
|
|
u32 programCounter; // _004
|
|
u32 callStackDepth; // _008
|
|
u32 callStack[2]; // _00C, Exact length unknown, but it is an array.
|
|
u8 _10[0x02c - 0x014]; // _008
|
|
u16 loopCounters[2]; // _02C, Exact length unknown, but it is an array.
|
|
u8 _30[0x03c - 0x030]; // _030
|
|
u8 trackState; // _03C, Confirmed unsigned by switch cases
|
|
u8 dataSourceMode; // _03D
|
|
u8 fileHandle; // _03E
|
|
u8 flags; // _03F
|
|
seqp_* parent; // _040
|
|
seqp_* children[16]; // _044
|
|
u32 connectionId; // _084
|
|
u32 trackId; // _088
|
|
s32 waitTimer; // _08C
|
|
u32 _90; // _090
|
|
u8 _94[8]; // _094
|
|
jc_* channels[8]; // _09C
|
|
u16 activeSoundIds[8]; // _0BC
|
|
u8 _CC; // _0CC
|
|
u8 _CD; // _0CD
|
|
u8 _CE[0x0d0 - 0x0ce]; // _0CE
|
|
u32 _D0; // _0D0
|
|
u8 _D4; // _0D4
|
|
u8 _D5; // _0D5
|
|
u8 _D6; // _0D6, boolean-like
|
|
u8 _D7[0x0d8 - 0x0d7]; // _0D7
|
|
jcs_ parentController; // _0D8
|
|
TimedParam_ timedParam; // _14C
|
|
URegisterParam_ regParam; // _26C
|
|
OuterParam_* outerParams; // _2AC
|
|
OuterParam_* childOuterParams[16]; // _2B0
|
|
TrackPort_ trackPort[16]; // _2F0
|
|
f32 tempoAccumulator; // _330
|
|
f32 tempoFactor; // _334
|
|
u16 timeBase; // _338
|
|
u16 tempo; // _33A
|
|
u8 timeRelationMode; // _33C
|
|
u8 _33D; // _33D
|
|
Osc_ oscillators[2]; // _340
|
|
u8 oscillatorRouting[2]; // _370
|
|
s16 adsTable[12]; // _372
|
|
s16 relTable[6]; // _38A
|
|
s8 transpose; // _396
|
|
u8 finalTranspose; // _397
|
|
s32 tickCounter; // _398
|
|
u8 isPaused; // _39C, boolean-like
|
|
u8 pauseStatus; // _39D
|
|
u8 isMuted; // _39E, boolean-like
|
|
u8 _39F[0x3a0 - 0x39f]; // _39F
|
|
u16 childMuteMask; // _3A0
|
|
u8 _3A2[0x3a4 - 0x3a2]; // _3A2
|
|
u8 interruptActive; // _3A4
|
|
u8 interruptPending; // _3A5
|
|
u8 interruptEnable; // _3A6
|
|
u8 timerCount; // _3A7
|
|
u32 interruptAddresses[8]; // _3A8
|
|
u32 savedProgramCounter; // _3C8
|
|
u32 _3CC; // _3CC, to do with timers (CMD_IntTimer)
|
|
u32 timer; // _3D0, to do with timers (CMD_IntTimer)
|
|
u32 maxTime; // _3D4, to do with timers (CMD_IntTimer)
|
|
u32 updateFlags; // _3D8, see `SEQTRACK_FLAG_*` defines
|
|
u8 panCalcTypes[3]; // _3DC
|
|
u8 parentPanCalcTypes[3]; // _3DF
|
|
u8 isRegistered; // _3E2
|
|
u8 doChangeTempo; // _3E3, boolean-like
|
|
u8 _3E4; // _3E4
|
|
u8 _3E5[0x3e8 - 0x3e5]; // _3E5
|
|
Oscbuf_ oscillatorParams[2]; // _3E8
|
|
u8 _418[0x434 - 0x418]; // _400
|
|
};
|
|
|
|
extern s16 CUTOFF_TO_IIR_TABLE[128][4];
|
|
|
|
void* Jam_OfsToAddr(seqp_*, u32);
|
|
void Jam_WriteRegDirect(seqp_*, u8, u16);
|
|
void Jam_WriteRegParam(seqp_*, u8);
|
|
u16 Jam_ReadRegDirect(seqp_*, u8);
|
|
u32 Jam_ReadReg32(seqp_* track, u8 index);
|
|
void Jam_WriteRegXY(seqp_* track, u32 param_2);
|
|
void Jam_WritePortApp(void);
|
|
void Jam_ReadPortApp(void);
|
|
void Jam_CheckExportApp(void);
|
|
void Jam_CheckImportApp(void);
|
|
void Jam_WritePortIndirect(void);
|
|
void Jam_ReadPortIndirect(void);
|
|
void Jam_CheckPortIndirect(void);
|
|
BOOL Jam_WritePortAppDirect(seqp_*, u32, u16);
|
|
BOOL Jam_ReadPortAppDirect(seqp_*, u32, u16*);
|
|
BOOL Jam_CheckPortAppDirect(seqp_*, u32, u16);
|
|
void Jam_WritePort(void);
|
|
void Jam_ReadPort(void);
|
|
void Jam_WritePortChild(void);
|
|
void Jam_WritePortBros(void);
|
|
void Jam_InitRegistTrack(void);
|
|
void Jam_UnRegistTrack(seqp_*);
|
|
seqp_* Jam_GetTrackHandle(u32);
|
|
void Jam_InitExtBuffer(OuterParam_*);
|
|
BOOL Jam_AssignExtBuffer(seqp_*, OuterParam_*);
|
|
BOOL Jam_AssignExtBufferP(seqp_*, u8, OuterParam_*);
|
|
void Jam_SetExtFirFilterD(OuterParam_*, s16*);
|
|
void Jam_SetExtParamD(f32, OuterParam_*, u8);
|
|
void Jam_OnExtSwitchD(OuterParam_*, u16);
|
|
void Jam_OffExtSwitchD(OuterParam_*, u16);
|
|
void Jam_SetExtSwitchDirectD(void);
|
|
void Jam_SetExtFirFilter(void);
|
|
void Jam_SetExtParam(f32, seqp_*, u8);
|
|
void Jam_OnExtSwitch(seqp_*, u16);
|
|
void Jam_OffExtSwitch(seqp_*, u16);
|
|
void Jam_SetExtSwitchDirect(void);
|
|
void Jam_SetExtFirFilterP(void);
|
|
void Jam_SetExtParamP(f32, seqp_*, u8, u8);
|
|
void Jam_OnExtSwitchP(seqp_*, u8, u16);
|
|
void Jam_OffExtSwitchP(seqp_*, u8, u16);
|
|
void Jam_SetExtSwitchDirectP(void);
|
|
void Jam_CheckRunningCounter(void);
|
|
BOOL Jam_RegisterTrackCallback(TrackCallback);
|
|
void Jam_SetTrackExtPanPower(void);
|
|
void Jam_UpdateTrackAll(seqp_*);
|
|
void Jam_UpdateTrack(seqp_*, u32);
|
|
void Jam_UpdateTempo(seqp_*);
|
|
void Jam_MuteTrack(seqp_*, u8);
|
|
void Jam_MuteChildTracks(void);
|
|
void Jam_PauseTrack(seqp_*, u8);
|
|
void Jam_UnPauseTrack(seqp_*, u8);
|
|
void Jam_SetInterrupt(seqp_*, u16);
|
|
BOOL Jam_TryInterrupt(seqp_*);
|
|
s32 Jam_SeqmainNote(seqp_*, u8);
|
|
void SeqUpdate(seqp_*, u32);
|
|
|
|
#ifdef __cplusplus
|
|
};
|
|
#endif // ifdef __cplusplus
|
|
|
|
#endif
|