diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..08e6ec97 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "extern/musyx"] + path = extern/musyx + url = git@github.com:AxioDL/musyx.git diff --git a/configure.py b/configure.py index 5bb55aca..de73d9bf 100755 --- a/configure.py +++ b/configure.py @@ -157,6 +157,7 @@ cflags_base = [ "-str reuse", "-nosyspath", "-i include", + "-i extern/musyx/include", "-i libc", f"-i build/{config.version}/include", "-DPRIME1", @@ -187,7 +188,7 @@ cflags_retro = [ "-gccinc", "-inline deferred,noauto", "-common on", - "-DMUSY_TARGET=MUSY_TARGET_DOLPHIN" + "-DMUSY_TARGET=MUSY_TARGET_DOLPHIN", ] cflags_musyx = [ @@ -195,6 +196,7 @@ cflags_musyx = [ "-nodefaults", "-nosyspath", "-i include", + "-i extern/musyx/include", "-i libc", "-inline auto", "-O4,p", @@ -203,7 +205,7 @@ cflags_musyx = [ "-Cpp_exceptions off", "-str reuse,pool,readonly", "-fp_contract off", - "-DMUSY_TARGET=MUSY_TARGET_DOLPHIN" + "-DMUSY_TARGET=MUSY_TARGET_DOLPHIN", ] cflags_musyx_debug = [ @@ -212,13 +214,14 @@ cflags_musyx_debug = [ "-nodefaults", "-nosyspath", "-i include", + "-i extern/musyx/include", "-i libc", "-g", "-sym on", "-D_DEBUG=1", "-enum int", "-Cpp_exceptions off", - "-DMUSY_TARGET=MUSY_TARGET_DOLPHIN" + "-DMUSY_TARGET=MUSY_TARGET_DOLPHIN", ] # REL flags @@ -1176,45 +1179,47 @@ config.libs = [ ], }, MusyX( - #debug=True, - #mw_version="GC/1.2.5", - #major=1, - #minor=5, - #patch=3, + # debug=True, + # mw_version="GC/1.2.5", + # major=1, + # minor=5, + # patch=3, objects=[ - Object(Matching, "musyx/runtime/seq.c"), - Object(Matching, "musyx/runtime/synth.c"), - Object(Matching, "musyx/runtime/seq_api.c"), - Object(Matching, "musyx/runtime/snd_synthapi.c"), - Object(NonMatching, "musyx/runtime/stream.c"), - Object(Matching, "musyx/runtime/synthdata.c"), - Object(NonMatching, "musyx/runtime/synthmacros.c"), - Object(Matching, "musyx/runtime/synthvoice.c"), - Object(Matching, "musyx/runtime/synth_ac.c"), - Object(Matching, "musyx/runtime/synth_adsr.c"), - Object(Matching, "musyx/runtime/synth_vsamples.c"), - Object(Matching, "musyx/runtime/synth_dbtab.c"), - Object(Matching, "musyx/runtime/s_data.c"), - Object(NonMatching, "musyx/runtime/hw_dspctrl.c"), - Object(Matching, "musyx/runtime/hw_volconv.c"), - Object(Matching, "musyx/runtime/snd3d.c"), - Object(Matching, "musyx/runtime/snd_init.c"), - Object(Matching, "musyx/runtime/snd_math.c"), - Object(NonMatching, "musyx/runtime/snd_midictrl.c"), - Object(Matching, "musyx/runtime/snd_service.c"), - Object(Matching, "musyx/runtime/hardware.c"), - Object(Matching, "musyx/runtime/hw_aramdma.c"), - Object(Matching, "musyx/runtime/dsp_import.c"), - Object(Matching, "musyx/runtime/hw_dolphin.c"), - Object(Matching, "musyx/runtime/hw_memory.c"), - Object(Matching, "musyx/runtime/hw_lib_dummy.c"), - Object(Matching, "musyx/runtime/CheapReverb/creverb_fx.c"), - Object(Matching, "musyx/runtime/CheapReverb/creverb.c"), - Object(Matching, "musyx/runtime/StdReverb/reverb_fx.c"), - Object(Matching, "musyx/runtime/StdReverb/reverb.c"), - Object(Matching, "musyx/runtime/Delay/delay_fx.c"), - Object(Matching, "musyx/runtime/Chorus/chorus_fx.c"), - Object(Matching, "musyx/runtime/dolphin/profile.c"), + Object( + Matching, "musyx/runtime/seq.c", source="extern/musyx/runtime/seq.c" + ), + Object(Matching, "musyx/runtime/synth.c", source="extern/musyx/synth.c"), + Object(Matching, "musyx/runtime/seq_api.c", source="extern/musyx/seq_api.c"), + Object(Matching, "musyx/runtime/snd_synthapi.c", source="extern/musyx/snd_synthapi.c"), + Object(NonMatching, "musyx/runtime/stream.c", source="extern/musyx/stream.c"), + Object(Matching, "musyx/runtime/synthdata.c", source="extern/musyx/synthdata.c"), + Object(NonMatching, "musyx/runtime/synthmacros.c", source="extern/musyx/synthmacros.c"), + Object(Matching, "musyx/runtime/synthvoice.c", source="extern/musyx/synthvoice.c"), + Object(Matching, "musyx/runtime/synth_ac.c", source="extern/musyx/synth_ac.c"), + Object(Matching, "musyx/runtime/synth_adsr.c", source="extern/musyx/synth_adsr.c"), + Object(Matching, "musyx/runtime/synth_vsamples.c", source="extern/musyx/synth_vsamples.c"), + Object(Matching, "musyx/runtime/synth_dbtab.c", source="extern/musyx/synth_dbtab.c"), + Object(Matching, "musyx/runtime/s_data.c", source="extern/musyx/s_data.c"), + Object(NonMatching, "musyx/runtime/hw_dspctrl.c", source="extern/musyx/hw_dspctrl.c"), + Object(Matching, "musyx/runtime/hw_volconv.c", source="extern/musyx/hw_volconv.c"), + Object(Matching, "musyx/runtime/snd3d.c", source="extern/musyx/snd3d.c"), + Object(Matching, "musyx/runtime/snd_init.c", source="extern/musyx/snd_init.c"), + Object(Matching, "musyx/runtime/snd_math.c", source="extern/musyx/snd_math.c"), + Object(NonMatching, "musyx/runtime/snd_midictrl.c", source="extern/musyx/snd_midictrl.c"), + Object(Matching, "musyx/runtime/snd_service.c", source="extern/musyx/snd_service.c"), + Object(Matching, "musyx/runtime/hardware.c", source="extern/musyx/hardware.c"), + Object(Matching, "musyx/runtime/hw_aramdma.c", source="extern/musyx/hw_aramdma.c"), + Object(Matching, "musyx/runtime/dsp_import.c", source="extern/musyx/dsp_import.c"), + Object(Matching, "musyx/runtime/hw_dolphin.c", source="extern/musyx/hw_dolphin.c"), + Object(Matching, "musyx/runtime/hw_memory.c", source="extern/musyx/hw_memory.c"), + Object(Matching, "musyx/runtime/hw_lib_dummy.c", source="extern/musyx/hw_lib_dummy.c"), + Object(Matching, "musyx/runtime/CheapReverb/creverb_fx.c", source="extern/musyx/creverb_fx.c"), + Object(Matching, "musyx/runtime/CheapReverb/creverb.c", source="extern/musyx/creverb.c"), + Object(Matching, "musyx/runtime/StdReverb/reverb_fx.c", source="extern/musyx/reverb_fx.c"), + Object(Matching, "musyx/runtime/StdReverb/reverb.c", source="extern/musyx/reverb.c"), + Object(Matching, "musyx/runtime/Delay/delay_fx.c", source="extern/musyx/delay_fx.c"), + Object(Matching, "musyx/runtime/Chorus/chorus_fx.c", source="extern/musyx/chorus_fx.c"), + Object(Matching, "musyx/runtime/profile.c", source="extern/musyx/profile.c"), ], ), { diff --git a/extern/musyx b/extern/musyx new file mode 160000 index 00000000..6f76370d --- /dev/null +++ b/extern/musyx @@ -0,0 +1 @@ +Subproject commit 6f76370d3614c260b43cbd6cc875ac9de885359d diff --git a/include/musyx/adsr.h b/include/musyx/adsr.h deleted file mode 100644 index 0fb9dff0..00000000 --- a/include/musyx/adsr.h +++ /dev/null @@ -1,64 +0,0 @@ -#ifndef ADSR_H -#define ADSR_H - -#include "musyx/musyx.h" -typedef struct ADSR_INFO { - // total size: 0x14 - union ai_data { - struct { - // total size: 0x14 - s32 atime; // offset 0x0, size 0x4 - s32 dtime; // offset 0x4, size 0x4 - u16 slevel; // offset 0x8, size 0x2 - u16 rtime; // offset 0xA, size 0x2 - s32 ascale; // offset 0xC, size 0x4 - s32 dscale; // offset 0x10, size 0x4 - } dls; - struct { - // total size: 0x8 - u16 atime; // offset 0x0, size 0x2 - u16 dtime; // offset 0x2, size 0x2 - u16 slevel; // offset 0x4, size 0x2 - u16 rtime; // offset 0x6, size 0x2 - } linear; - } data; // offset 0x0, size 0x14 -} ADSR_INFO; - -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; - -#ifdef __cplusplus -extern "C" { -#endif -u32 adsrHandleLowPrecision(ADSR_VARS* adsr, u16* adsr_start, u16* adsr_delta); -bool adsrRelease(ADSR_VARS* adsr); -u32 adsrConvertTimeCents(s32 tc); -#ifdef __cplusplus -} -#endif - -#endif // ADSR_H diff --git a/include/musyx/assert.h b/include/musyx/assert.h deleted file mode 100644 index b0e6a824..00000000 --- a/include/musyx/assert.h +++ /dev/null @@ -1,105 +0,0 @@ -#ifndef _ASSERT -#define _ASSERT -#include "musyx/platform.h" -#include "musyx/version.h" - - -#if MUSY_TARGET == MUSY_TARGET_DOLPHIN -extern void OSPanic(const char* file, int line, const char* msg, ...); -extern void OSReport(const char* msg, ...); - -#ifndef MUSY_PANIC -#define MUSY_PANIC OSPanic -#endif -#ifndef MUSY_REPORT -#define MUSY_REPORT OSReport -#endif -#elif MUSY_TARGET == MUSY_TARGET_PC -#include -#include -#include -#include - -static inline void panic(const char* file, int line, const char* msg, ...) { - va_list list; - va_start(list); - vprintf(msg, list); - va_end(list); - printf(" in \"%s\" on line %d.\n", file, line); - abort(); -} - -#ifndef MUSY_PANIC -#define MUSY_PANIC panic -#endif -#ifndef MUSY_REPORT -#define MUSY_REPORT printf -#endif -#endif - -// TODO: Cleanup -static inline unsigned __SOME_ASSERT_DERP1() { return 0; } - -static inline unsigned __SOME_ASSERT_DERP2() { return __SOME_ASSERT_DERP1(); } - -static inline void __SOME_ASSERT_DERP() { __SOME_ASSERT_DERP2() != 0; } - -#ifndef MUSY_ASSERT -#ifdef _DEBUG -#define MUSY_ASSERT(cond) \ - do { \ - if (!(cond)) { \ - MUSY_PANIC(__FILE__, __LINE__, "Failed assertion " #cond); \ - } \ - __SOME_ASSERT_DERP(); \ - } while (0) -#else -#define MUSY_ASSERT(cond) -#endif -#endif - -#ifndef MUSY_ASSERT_MSG -#ifdef _DEBUG -#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 0) -#define MUSY_ASSERT_MSG(cond, msg) \ - do { \ - s32 tmp = 1; \ - s32 tmp2; \ - if (!(cond)) { \ - MUSY_PANIC(__FILE__, __LINE__, msg); \ - tmp2 = 0; \ - if (tmp2 == 0) { \ - tmp = 0; \ - } \ - } \ - } while (0) -#else -#define MUSY_ASSERT_MSG(cond, msg) \ - do { \ - if (!(cond)) { \ - MUSY_PANIC(__FILE__, __LINE__, msg); \ - } \ - } while (0) -#endif -#else -#define MUSY_ASSERT_MSG(cond, msg) -#endif -#endif - -#ifndef MUSY_DEBUG -#ifdef _DEBUG -#define MUSY_DEBUG MUSY_REPORT -#else -#define MUSY_DEBUG -#endif -#endif - -#ifndef MUSY_FATAL -#ifdef _DEBUG -#define MUSY_FATAL(msg) MUSY_PANIC(__FILE__, __LINE__, msg) -#else -#define MUSY_FATAL -#endif -#endif - -#endif // _ASSERT diff --git a/include/musyx/dsp_import.h b/include/musyx/dsp_import.h deleted file mode 100644 index b009d756..00000000 --- a/include/musyx/dsp_import.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef _MUSYX_DSP_IMPORT -#define _MUSYX_DSP_IMPORT - -#include "musyx/platform.h" -#if MUSY_TARGET == MUSY_TARGET_DOLPHIN -#include "musyx/musyx.h" - -#ifdef __cplusplus -extern "C" { -#endif - -extern char dspSlave[]; -extern u16 dspSlaveLength; - -#ifdef __cplusplus -} -#endif - -#endif - -#endif // _MUSYX_DSP_IMPORT diff --git a/include/musyx/dspvoice.h b/include/musyx/dspvoice.h deleted file mode 100644 index 71790238..00000000 --- a/include/musyx/dspvoice.h +++ /dev/null @@ -1,114 +0,0 @@ -#ifndef DSPVOICE_H -#define DSPVOICE_H - -#include "musyx/musyx.h" - -#include "musyx/voice.h" -#include "musyx/synthdata.h" - -typedef struct DSPvoice { - _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 DSPhostDPop { - // total size: 0x24 - s32 l; // offset 0x0, size 0x4 - s32 r; // offset 0x4, size 0x4 - s32 s; // offset 0x8, size 0x4 - s32 lA; // offset 0xC, size 0x4 - s32 rA; // offset 0x10, size 0x4 - s32 sA; // offset 0x14, size 0x4 - s32 lB; // offset 0x18, size 0x4 - s32 rB; // offset 0x1C, size 0x4 - s32 sB; // offset 0x20, size 0x4 -} DSPhostDPop; - -typedef struct DSPinput { - // total size: 0xC - u8 studio; // offset 0x0, size 0x1 - u16 vol; // offset 0x2, size 0x2 - u16 volA; // offset 0x4, size 0x2 - u16 volB; // offset 0x6, size 0x2 - SND_STUDIO_INPUT* desc; // offset 0x8, size 0x4 -} DSPinput; - -typedef struct DSPstudioinfo { - // total size: 0xBC - _SPB* spb; // offset 0x0, size 0x4 - DSPhostDPop hostDPopSum; // offset 0x4, size 0x24 - s32* main[2]; // offset 0x28, size 0x8 - s32* auxA[3]; // offset 0x30, size 0xC - s32* auxB[3]; // offset 0x3C, size 0xC - DSPvoice* voiceRoot; // offset 0x48, size 0x4 - DSPvoice* alienVoiceRoot; // offset 0x4C, size 0x4 - u8 state; // offset 0x50, size 0x1 - u8 isMaster; // offset 0x51, size 0x1 - u8 numInputs; // offset 0x52, size 0x1 - SND_STUDIO_TYPE type; // offset 0x54, size 0x4 - 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 DSPvoice* dspVoice; - -#endif \ No newline at end of file diff --git a/include/musyx/hardware.h b/include/musyx/hardware.h deleted file mode 100644 index 72a4ab36..00000000 --- a/include/musyx/hardware.h +++ /dev/null @@ -1,103 +0,0 @@ -#ifndef _MUSYX_HARDWARE -#define _MUSYX_HARDWARE - -#include "musyx/musyx.h" -#include - -#ifdef __cplusplus -extern "C" { -#endif -typedef void* (*ARAMUploadCallback)(u32, u32); -typedef u32 (*SND_MESSAGE_CALLBACK)(u32, u32); - -extern SND_MESSAGE_CALLBACK salMessageCallback; -extern SND_HOOKS salHooks; - -extern u32 dspHRTFOn; - -extern s16* dspCmdList; -extern u16 dspCmdFirstSize; -extern u8 dspScale2IndexTab[1024]; - -u32 hwFrq2Pitch(u32 frq); -void hwOff(s32 vid); -bool hwIsStudioActive(u8 studio); -void* hwGetStreamPlayBuffer(u8 hwStreamHandle); -s32 hwInit(u32* frq, u16 numVoices, u16 numStudios, u32 flags); /* extern */ -void hwExit(); -void hwInitSamplePlayback(u32 v, u16 smpID, void* newsmp, u32 set_defadsr, u32 prio, - u32 callbackUserValue, u32 setSRC, u8 itdMode); -void hwSetVolume(u32 v, u8 table, float vol, u32 pan, u32 span, float auxa, float auxb); -void hwSetPitch(u32 v, u16 speed); -void hwInitIrq(); -void hwExitIrq(); -void hwEnableIrq(); -void hwDisableIrq(); -void* hwTransAddr(void* samples); -void hwExitStream(u8 id); -void hwSaveSample(void* header, void* data); -void hwRemoveSample(void* header, void* data); -u32 hwGetVirtualSampleState(u32 voice); -bool hwVoiceInStartup(u32 v); -void hwBreak(s32 vid); -u32 hwGetPos(u32 v); -void hwInitSampleMem(u32 baseAddr, u32 length); -void hwExitSampleMem(); -void hwSetVirtualSampleLoopBuffer(u32 voice, void* addr, u32 len); -u16 hwGetSampleID(u32 voice); -u8 hwGetSampleType(u32 voice); -void hwChangeStudioMix(u8 studio, u32 isMaster); -void hwSetStreamLoopPS(u32 voice, u8 ps); -void hwFlushStream(void* base, u32 offset, u32 bytes, u8 hwStreamHandle, void (*callback)(size_t), - u32 user); -void hwSetSaveSampleCallback(ARAMUploadCallback callback, unsigned long chunckSize); -void hwSyncSampleMem(); -void hwSetAUXProcessingCallbacks(u8 studio, SND_AUX_CALLBACK auxA, void* userA, - SND_AUX_CALLBACK auxB, void* userB); -void hwSetMesgCallback(SND_MESSAGE_CALLBACK callback); -#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 3) -void hwSetFilter(u32 v, unsigned char mode, unsigned short coefA, unsigned short coefB); -void hwLowPassFrqToCoef(u32 frq, unsigned short* _a0, unsigned short* _b1); -#endif -void hwSetSRCType(u32 v, u8 salSRCType); -void hwSetITDMode(u32 v, u8 mode); -void hwSetPolyPhaseFilter(u32 v, u8 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(); -void hwStart(u32 v, u8 studio); -void hwKeyOff(u32 v); -void hwFrameDone(); -void hwActivateStudio(u8 studio, bool isMaster, SND_STUDIO_TYPE type); -void hwDeactivateStudio(u8); -void hwSetPriority(u32 v, u32 prio); -u32 hwIsActive(u32); -u32 hwGlobalActivity(); -void hwSetAUXProcessingCallbacks(u8 studio, SND_AUX_CALLBACK auxA, void* userA, - SND_AUX_CALLBACK auxB, void* userB); -u8 hwInitStream(u32 len); -u8 hwGetTimeOffset(); -u32 hwGetVirtualSampleID(u32 v); -void hwIRQEnterCritical(); -void hwIRQLeaveCritical(); - -extern u32 aramSize; -extern u8* aramBase; -void aramInit(u32 length); -void aramExit(); -size_t aramGetStreamBufferAddress(u8 id, size_t* len); -void aramUploadData(void* mram, u32 aram, u32 len, u32 highPrio, void (*callback)(size_t), u32 user); -void aramFreeStreamBuffer(u8 id); -void* aramStoreData(void* src, u32 len); -void aramRemoveData(void* aram, u32 len); -u8 aramAllocateStreamBuffer(u32 len); -unsigned long aramGetZeroBuffer(); -void aramSetUploadCallback(ARAMUploadCallback callback, u32 chunckSize); -void aramSyncTransferQueue(); - -#ifdef __cplusplus -} -#endif - -#endif // _MUSYX_HARDWARE diff --git a/include/musyx/macros.h b/include/musyx/macros.h deleted file mode 100644 index c5bb2d68..00000000 --- a/include/musyx/macros.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef _MUSYX_MACROS -#define _MUSYX_MACROS - -#include "musyx/musyx.h" -#include "musyx/synth.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void macInit(); -bool macPostMessage(SND_VOICEID vid, s32 mesg); -u32 macStart(u16 macid, u8 priority, u8 maxVoices, u16 allocId, u8 key, u8 vol, u8 panning, u8 midi, - u8 midiSet, u8 section, u16 step, u16 trackid, u8 new_vid, u8 vGroup, u8 studio, - u32 itd); -void macHandle(u32 deltaTime); -void macMakeInactive(SYNTH_VOICE* svoice, MAC_STATE); -void macSetPedalState(SYNTH_VOICE* svoice, u32 state); -void macSetExternalKeyoff(SYNTH_VOICE* svoice); -void macSampleEndNotify(SYNTH_VOICE* sv); - -#ifdef __cplusplus -} -#endif - -#endif \ No newline at end of file diff --git a/include/musyx/musyx.h b/include/musyx/musyx.h deleted file mode 100644 index a8b9ff89..00000000 --- a/include/musyx/musyx.h +++ /dev/null @@ -1,833 +0,0 @@ -#ifndef _MUSYX_MUSYX -#define _MUSYX_MUSYX - -#include "musyx/platform.h" -#include "musyx/version.h" - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#if MUSY_TARGET == MUSY_TARGET_DOLPHIN -typedef signed char s8; -typedef unsigned char u8; -typedef signed short s16; -typedef unsigned short u16; -typedef signed long s32; -typedef unsigned long u32; -typedef unsigned long long u64; -typedef float f32; -typedef double f64; -#elif MUSY_TARGET == MUSY_TARGET_PC -typedef signed char s8; -typedef unsigned char u8; -typedef signed short s16; -typedef unsigned short u16; -typedef signed int s32; -typedef unsigned int u32; -typedef unsigned long long u64; -typedef float f32; -typedef double f64; -#endif - -#ifndef NULL -#define NULL 0 -#endif - -#ifndef bool8 -typedef unsigned char bool8; -#endif -#ifndef __cplusplus -#if __STDC_VERSION__ <= 199901L -typedef unsigned long bool; -#endif - -#ifndef FALSE -#define FALSE 0 -#endif -#ifndef TRUE -#define TRUE 1 -#endif -#endif - -#define SND_STUDIO_MAXNUM 8 - -#define SND_STUDIO_DEFAULT 0 -#define SND_STUDIO_NONE 0xFF - -#define SYNTH_MAX_VOICES 64 - -typedef u32 SND_SEQID; -typedef u32 SND_VOICEID; -typedef u32 SND_STREAMID; -typedef u16 SND_GROUPID; -typedef u16 SND_SONGID; -typedef u16 SND_FXID; - -typedef enum { - SND_OUTPUTMODE_MONO = 0, - SND_OUTPUTMODE_STEREO, - SND_OUTPUTMODE_SURROUND -} SND_OUTPUTMODE; - -typedef struct SND_PLAYBACKINFO { - u32 frq; - u8 stereo; - u8 bits; - s8 deviceName[256]; - s8 versionText[256]; -} SND_PLAYBACKINFO; - -typedef struct SND_SEQVOLDEF { - u8 track; - u8 volGroup; -} SND_SEQVOLDEF; - -#define SND_PLAYPARA_DEFAULT 0x00000000 -#define SND_PLAYPARA_TRACKMUTE 0x00000001 -#define SND_PLAYPARA_SPEED 0x00000002 -#define SND_PLAYPARA_VOLUME 0x00000004 -#define SND_PLAYPARA_SEQVOLDEF 0x00000008 -#define SND_PLAYPARA_PAUSE 0x00000010 - -typedef struct SND_PLAYPARA { - u32 flags; // Enable features by using these flags - u32 trackMute[2]; // Initial mute settings - u16 speed; // Initial speed factor (0x100 = 1:1) - struct { // Start volume information - u16 time; - u8 target; - } volume; - u8 numSeqVolDef; // Number of non-standart volume group tracks - SND_SEQVOLDEF* seqVolDef; // List of tracks and the volume groups to be assigned to them - u8 numFaded; // Number of entries to the fade list - u8* faded; // Array of u8s containing the volume group IDs that should be affected by the initial - // volume setting (default will always be affected) -} SND_PLAYPARA; - -#define SND_CROSSFADE_STOP 0 // Stop old song after fadedown -#define SND_CROSSFADE_PAUSE 1 // Pause old song after fadedown -#define SND_CROSSFADE_CONTINUE 2 // Continue previously paused song as new one -#define SND_CROSSFADE_START 0 // Start new song (no continue) -#define SND_CROSSFADE_SYNC 4 // Crossfade should start syncronized by sync-controller (104) -#define SND_CROSSFADE_PAUSENEW 8 // Pause new song before even starting it -#define SND_CROSSFADE_TRACKMUTE 16 // Use trackmute informtion -#define SND_CROSSFADE_SPEED 32 // Use speed informtion -#define SND_CROSSFADE_MUTE 64 // Old song continues playing & gets muted after fade down -#define SND_CROSSFADE_MUTENEW 128 // Mute new song after starting it - -#define SND_CROSSFADE_DEFAULT 0 - -typedef struct SND_CROSSFADE { - SND_SEQID seqId1; - u16 time1; - - SND_SEQID seqId2; - u16 time2; - void* arr2; - SND_GROUPID gid2; - SND_SONGID sid2; - u8 vol2; - u8 studio2; - - u32 trackMute2[2]; // Mute bits (see sndMute()) - u16 speed2; // Initial speed (of new song) - - u8 flags; -} SND_CROSSFADE; - -#define SND_ID_ERROR 0xFFFFFFFF // ID is invalid - -#define SND_USERMUSIC_VOLGROUPS 0xFA -#define SND_USERFX_VOLGROUPS 0xFB -#define SND_USERALL_VOLGROUPS 0xFC -#define SND_MUSIC_VOLGROUPS 0xFD -#define SND_FX_VOLGROUPS 0xFE -#define SND_ALL_VOLGROUPS 0xFF - -#define SND_MAX_USER_VOLGROUP 20 - -bool sndPushGroup(void* prj_data, SND_GROUPID gid, void* samples, void* sampdir, void* pool); -bool sndPopGroup(void); - -void sndSetSampleDataUploadCallback(void* (*callback)(u32 offset, u32 bytes), u32 chunkSize); - -typedef struct SND_HOOKS { - void* (*malloc)(size_t addr); - void (*free)(void* addr); -} SND_HOOKS; - -void sndSetHooks(SND_HOOKS* hooks); - -// Misc flags to influence the way the sound system works internally -// (support may vary from platform to platform) - -#define SND_FLAGS_DEFAULT 0x00000000 -#define SND_FLAGS_DEFAULT_STUDIO_DPL2 0x00000001 // Use DPL2 encoding for default studio -#define SND_FLAGS_EMITTERGROUPSUSEMAXVOICES \ - 0x00000002 // define this to enable usage of max. voices from FX table for emitter group start - // management - -// Platform dependend flags : PC - -#define SND_FLAGS_PC_USE_TIMER \ - 0x00000000 // Use timer driven update system (less performance hit, larger latency) -#define SND_FLAGS_PC_USE_THREAD \ - 0x00010000 // Use thread driven update system (larger performance hit, shorter latency) -#define SND_FLAGS_PC_USE_PRIMARY 0x00020000 // Use a primary sound buffer for mixing (Win95/98 only) - -#define SND_FLAGS_PC_LATENCY0 0x00000000 // Latency values (see documentation) -#define SND_FLAGS_PC_LATENCY1 0x10000000 -#define SND_FLAGS_PC_LATENCY2 0x20000000 -#define SND_FLAGS_PC_LATENCY3 0x30000000 -#define SND_FLAGS_PC_LATENCY4 0x40000000 -#define SND_FLAGS_PC_LATENCY5 0x50000000 -#define SND_FLAGS_PC_LATENCY6 0x60000000 -#define SND_FLAGS_PC_LATENCY7 0x70000000 - -s32 sndInit(u8 voices, u8 music, u8 sfx, u8 studios, u32 flags, u32 aramSize); -void sndQuit(void); - -bool sndIsInstalled(void); -bool sndIsIdle(void); -SND_PLAYBACKINFO* sndGetPlayBackInfo(void); - -void sndSetMaxVoices(u8 music, u8 sfx); - -void sndVolume(u8 volume, u16 time, u8 volGroup); -void sndMasterVolume(u8 volume, u16 time, u8 music, u8 fx); -void sndOutputMode(SND_OUTPUTMODE mode); -void sndSilence(void); - -#define SND_PAUSEVOL_NORMAL 127 - -void sndPauseVolume(u8 mute_vol, u16 time, u8 volGroup); - -#define SND_MIDICTRL_MODULATION 0x01 -#define SND_MIDICTRL_VOLUME 0x07 -#define SND_MIDICTRL_PANNING 0x0A -#define SND_MIDICTRL_PEDAL 0x40 -#define SND_MIDICTRL_PORTAMENTO 0x41 -#define SND_MIDICTRL_REVERB 0x5B -#define SND_MIDICTRL_CHORUS 0x5D - -#define SND_MIDICTRL_PITCHBEND 0x80 -#define SND_MIDICTRL_SPANNING 0x83 -#define SND_MIDICTRL_DOPPLER 0x84 - -#define SND_SEQVOL_CONTINUE 0 -#define SND_SEQVOL_STOP 1 -#define SND_SEQVOL_PAUSE 2 -#define SND_SEQVOL_MUTE 3 -#define SND_SEQVOL_MODEMASK 0xF - -#define SND_ID_ERROR 0xFFFFFFFF // ID is invalid - -#define SND_MAX_SEQINSTANCES 8 -#define SND_SEQ_ERROR_ID 0xFFFFFFFF -#define SND_SEQ_CROSSFADE_ID 0x80000000 - -#define SND_PAUSEVOL_NORMAL 127 -#define SND_SEQVOL_CONTINUE 0 -#define SND_SEQVOL_STOP 1 -#define SND_SEQVOL_PAUSE 2 -#define SND_SEQVOL_MUTE 3 - -#define sndSeqPlay(sgid, sid, arrfile, para) \ - sndSeqPlayEx(sgid, sid, arrfile, para, SND_STUDIO_DEFAULT) -SND_SEQID sndSeqPlayEx(SND_GROUPID sgid, SND_SONGID sid, void* arrfile, SND_PLAYPARA* para, - u8 studio); - -void sndSeqStop(SND_SEQID seqId); -void sndSeqPause(SND_SEQID seqId); -void sndSeqContinue(SND_SEQID seqId); -void sndSeqMute(SND_SEQID seqId, u32 mask1, u32 mask2); -void sndSeqSpeed(SND_SEQID seqId, u16 speed); -bool sndSeqLoop(SND_SEQID seqId, bool on); -bool sndSeqLoopEx(SND_SEQID seqId, u8 track, bool on); -u16 sndSeqGetLoopCnt(SND_SEQID seqId); -u16 sndSeqGetLoopCntEx(SND_SEQID seqId, u8 track); -bool sndSeqGetValid(SND_SEQID seqId); -u8 sndSeqGetMidiCtrl(SND_SEQID seqId, u8 channel, u8 ctrl); -u16 sndSeqGetMidiCtrl14(SND_SEQID seqId, u8 channel, u8 ctrl); -bool sndSeqSetMidiCtrl(SND_SEQID seqId, u8 channel, u8 ctrl, u8 value); -bool sndSeqSetMidiCtrl14(SND_SEQID seqId, u8 channel, u8 ctrl, u16 value); - -void sndSeqVolume(u8 volume, u16 time, SND_SEQID seqId, u8 mode); -u8 sndSeqGetVolGroup(SND_SEQID seqId); -bool sndSeqAssignVolGroup2Track(SND_SEQID seqId, u8 track, u8 vGroup); -void sndSeqCrossFade(SND_CROSSFADE* ci, SND_SEQID* new_seqId); -bool sndSeqCrossFadeDone(SND_SEQID* new_seqId); - -typedef struct SND_PARAMETER { - u8 ctrl; - union _paraData { - u8 value7; - u16 value14; - } paraData; -} SND_PARAMETER; - -typedef struct SND_PARAMETER_INFO { - u8 numPara; // How many MIDI controller values (ID,value - value may be 8-bit or 16-bit!) - SND_PARAMETER* paraArray; // Parameter data... -} SND_PARAMETER_INFO; - -#define SND_FX_DEFVOL 0xFF -#define SND_FX_DEFPAN 0xFF - -#define sndFXStart(fid, vol, pan) sndFXStartEx(fid, vol, pan, SND_STUDIO_DEFAULT) -SND_VOICEID sndFXStartEx(SND_FXID fid, u8 vol, u8 pan, u8 studio); -SND_VOICEID sndFXStartPara(SND_FXID fid, u8 vol, u8 pan, u8 studio, u8 numPara, ...); -SND_VOICEID sndFXStartParaInfo(SND_FXID fid, u8 vol, u8 pan, u8 studio, - SND_PARAMETER_INFO* paraInfo); -SND_VOICEID sndFXCheck(SND_VOICEID vid); -bool sndFXKeyOff(SND_VOICEID vid); -bool sndFXCtrl(SND_VOICEID vid, u8 ctrl, u8 value); -bool sndFXCtrl14(SND_VOICEID vid, u8 ctrl, u16 value); - -#define SND_MIDICTRL_MODULATION 0x01 -#define SND_MIDICTRL_VOLUME 0x07 -#define SND_MIDICTRL_PANNING 0x0A -#define SND_MIDICTRL_PEDAL 0x40 -#define SND_MIDICTRL_PORTAMENTO 0x41 -#define SND_MIDICTRL_REVERB 0x5B -#define SND_MIDICTRL_CHORUS 0x5D - -#define SND_MIDICTRL_PITCHBEND 0x80 -#define SND_MIDICTRL_SPANNING 0x83 -#define SND_MIDICTRL_DOPPLER 0x84 - -#define sndFXPitchBend(vid, pb) sndFXCtrl14(vid, SND_MIDICTRL_PITCHBEND, pb) -#define sndFXModulation(vid, modu) sndFXCtrl14(vid, SND_MIDICTRL_MODULATION, modu) -#define sndFXDoppler(vid, doppler) sndFXCtrl14(vid, SND_MIDICTRL_DOPPLER, doppler) - -#define sndFXReverb(vid, reverb) sndFXCtrl(vid, SND_MIDICTRL_REVERB, reverb) -#define sndFXChorus(vid, chorus) sndFXCtrl(vid, SND_MIDICTRL_CHORUS, chorus) -#define sndFXPedal(vid, pedal) sndFXCtrl(vid, SND_MIDICTRL_PEDAL, pedal) -#define sndFXVolume(vid, vol) sndFXCtrl(vid, SND_MIDICTRL_VOLUME, vol) -#define sndFXPanning(vid, pan) sndFXCtrl(vid, SND_MIDICTRL_PANNING, pan) -#define sndFXSurroundPanning(vid, span) sndFXCtrl(vid, SND_MIDICTRL_SPANNING, span) - -bool sndFXAssignVolGroup2FXId(SND_FXID fid, u8 vGroup); - -// -------------------------------------------------------- - -s32 sndReadFlag(u8 num); -s32 sndWriteFlag(u8 num, s32 value); - -bool sndSendMessage(SND_VOICEID vid, s32 mesg); -void sndSetReceiveMessageCallback(void (*callback)(SND_VOICEID vid, s32 mesg)); - -// -------------------------------------------------------- - -// Flags -#define SND_STREAM_DEFAULT 0x00000000 // Default stream buffer (PCM16) -#define SND_STREAM_ADPCM 0x00000001 // ADPCM stream buffer -#define SND_STREAM_INACTIVE 0x00010000 // Allocate stream, but do not start it yet -#define SND_STREAM_MANUALARAMUPD 0x00020000 // Application will provide manual ARAM buffer updates - -#define SND_STREAM_ADPCM_BLKBYTES 8 // Bytes per ADPCM block -#define SND_STREAM_ADPCM_BLKSIZE 14 // Samples per ADPCM block - -// ADPCM info structure -typedef struct SND_ADPCMSTREAM_INFO { - s16 coefTab[8][2]; // Table of coef. pairs -} SND_ADPCMSTREAM_INFO; - -#define sndStreamAlloc(prio, buffer, size, frq, vol, pan, span, fxvol, updateFunction, user) \ - sndStreamAllocEx(prio, buffer, size, frq, vol, pan, span, fxvol, 0, SND_STUDIO_DEFAULT, \ - SND_STREAM_DEFAULT, updateFunction, user, NULL) -SND_STREAMID sndStreamAllocEx(u8 prio, void* buffer, u32 samples, u32 frq, u8 vol, u8 pan, u8 span, - u8 auxa, u8 auxb, u8 studio, u32 flags, - u32 (*updateFunction)(void* buffer1, u32 len1, void* buffer2, - u32 len2, u32 user), - u32 user, SND_ADPCMSTREAM_INFO* adpcmInfo); -SND_STREAMID sndStreamAllocStereo(u8 prio, void* lBuffer, void* rBuffer, u32 samples, u32 frq, - u8 vol, u8 pan, u8 span, u8 auxa, u8 auxb, u8 studio, u32 flags, - u32 (*updateFunction)(void* buffer1, u32 len1, void* buffer2, - u32 len2, u32 user), - u32 lUser, u32 rUser, SND_ADPCMSTREAM_INFO* adpcmInfoL, - SND_ADPCMSTREAM_INFO* adpcmInfoR); -u32 sndStreamAllocLength(u32 num, u32 flags); -void sndStreamFree(SND_STREAMID stid); -void sndStreamMixParameter(SND_STREAMID stid, u8 vol, u8 pan, u8 span, u8 fxvol); -void sndStreamMixParameterEx(SND_STREAMID stid, u8 vol, u8 pan, u8 span, u8 auxa, u8 auxb); -void sndStreamADPCMParameter(SND_STREAMID stid, SND_ADPCMSTREAM_INFO* adpcmInfo); -void sndStreamFrq(SND_STREAMID stid, u32 frq); -bool sndStreamActivate(SND_STREAMID stid); -void sndStreamDeactivate(SND_STREAMID stid); -void sndStreamARAMUpdate(SND_STREAMID stid, u32 off1, u32 len1, u32 off2, u32 len2); -u32 sndStreamCallbackFrq(u32 msTime); - -// -------------------------------------------------------- - -#define SND_VIRTUALSAMPLE_DEFAULT 0x00000000 - -bool sndVirtualSampleAllocateBuffers(u8 numInstances, u32 numSamples, u32 flags); -void sndVirtualSampleFreeBuffers(void); - -typedef u16 SND_VSID; // Virtual sample ID -typedef u16 SND_INSTID; // Virtual sample instance ID - -typedef struct SND_VIRTUALSAMPLE_INFO { - SND_VSID smpID; // ID of sample to be streamed - SND_INSTID instID; // ID of this instance of the stream - - union vsData { - struct vsUpdate { // Buffer update info - u32 off1; - u32 len1; - u32 off2; - u32 len2; - } update; - } data; -} SND_VIRTUALSAMPLE_INFO; - -#define SND_VIRTUALSAMPLE_REASON_INIT 0 // Virtual sample just started playback -#define SND_VIRTUALSAMPLE_REASON_UPDATE 1 // Virtual sample is within stream buffer and needs data -#define SND_VIRTUALSAMPLE_REASON_STOP 2 // Virtual sample just has been stopped -#define SND_VIRTUALSAMPLE_REASON_ARAMDMADONE \ - 3 // Last ARAM update initiated for this virtual sample has finished - -void sndVirtualSampleSetCallback(u32 (*callback)(u8 reason, const SND_VIRTUALSAMPLE_INFO* info)); - -void sndVirtualSampleARAMUpdate(SND_INSTID instID, void* base, u32 off1, u32 len1, u32 off2, - u32 len2); - -void sndVirtualSampleEndPlayback(SND_INSTID instID, bool sampleEndedNormally); - -#define SND_AUX_BLOCKSIZE 160 // Size of block passed to the AUX FX hanler (in samples) - -#define SND_AUX_REASON_BUFFERUPDATE 0 -#define SND_AUX_REASON_PARAMETERUPDATE 1 - -#define SND_MIDI_NONE 0xFF - -#define SND_AUX_NUMPARAMETERS 4 - -typedef struct SND_AUX_INFO { - union SND_AUX_DATA { - struct SND_AUX_BUFFERUPDATE { - s32* left; - s32* right; - s32* surround; - } bufferUpdate; - struct SND_AUX_PARAMETERUPDATE { - u16 para[SND_AUX_NUMPARAMETERS]; - } parameterUpdate; - } data; -} SND_AUX_INFO; - -void sndSetAuxProcessingCallbacks(u8 studio, - void (*auxA)(u8 reason, SND_AUX_INFO* info, void* user), - void* userA, u8 midiA, SND_SEQID seqIDA, - void (*auxB)(u8 reason, SND_AUX_INFO* info, void* user), - void* userB, u8 midiB, SND_SEQID seqIDB); - -#define SND_AUXA_PARAMETERS 0 -#define SND_AUXB_PARAMETERS 1 - -void sndUpdateAuxParameter(u8 studio, u16 para[SND_AUX_NUMPARAMETERS], u8 auxBus); - -typedef enum { - SND_STUDIO_TYPE_STD = 0, - SND_STUDIO_TYPE_DPL2, - SND_STUDIO_TYPE_RESERVED1, - SND_STUDIO_TYPE_RESERVED2 -} SND_STUDIO_TYPE; - -#define sndActivateStudio(studio, isMaster) \ - sndActivateStudioEx(studio, isMaster, SND_STUDIO_TYPE_STD) -void sndActivateStudioEx(u8 studio, bool isMaster, SND_STUDIO_TYPE type); -void sndChangeStudioMasterMix(u8 studio, bool isMaster); -void sndDeactivateStudio(u8 studio); -void sndSetITDDefault(u8 studio, bool musicITD, bool sfxITD); - -// Standard Quality Reverb AUX FX - -typedef struct _SND_REVSTD_DELAYLINE { - s32 inPoint; - s32 outPoint; - s32 length; - f32* inputs; - f32 lastOutput; -} _SND_REVSTD_DELAYLINE; - -typedef struct _SND_REVSTD_WORK { - _SND_REVSTD_DELAYLINE AP[6]; - _SND_REVSTD_DELAYLINE C[6]; - f32 allPassCoeff; - f32 combCoef[6]; - f32 lpLastout[3]; - f32 level; - f32 damping; - s32 preDelayTime; - f32* preDelayLine[3]; - f32* preDelayPtr[3]; -} _SND_REVSTD_WORK; - -typedef struct SND_AUX_REVERBSTD { - _SND_REVSTD_WORK rv; - bool8 tempDisableFX; - - f32 coloration; - f32 mix; - f32 time; - f32 damping; - f32 preDelay; -} SND_AUX_REVERBSTD; - -typedef void (*SND_AUX_CALLBACK)(u8 reason, SND_AUX_INFO* info, void* user); -void sndAuxCallbackReverbSTD(u8 reason, SND_AUX_INFO* info, void* user); -bool sndAuxCallbackPrepareReverbSTD(SND_AUX_REVERBSTD* rev); -bool sndAuxCallbackShutdownReverbSTD(SND_AUX_REVERBSTD* rev); -bool sndAuxCallbackUpdateSettingsReverbSTD(SND_AUX_REVERBSTD* rev); - -// High Quality Reverb AUX FX -// -typedef struct _SND_REVHI_DELAYLINE { - s32 inPoint; - s32 outPoint; - s32 length; - f32* inputs; - f32 lastOutput; -} _SND_REVHI_DELAYLINE; - -typedef struct _SND_REVHI_WORK { - _SND_REVHI_DELAYLINE AP[9]; - _SND_REVHI_DELAYLINE C[9]; - f32 allPassCoeff; - f32 combCoef[9]; - f32 lpLastout[3]; - f32 level; - f32 damping; - s32 preDelayTime; - f32 crosstalk; - f32* preDelayLine[3]; - f32* preDelayPtr[3]; -} _SND_REVHI_WORK; - -typedef struct SND_AUX_REVERBHI { - _SND_REVHI_WORK rv; - bool8 tempDisableFX; - - f32 coloration; - f32 mix; - f32 time; - f32 damping; - f32 preDelay; - f32 crosstalk; -} SND_AUX_REVERBHI; - -void sndAuxCallbackReverbHI(u8 reason, SND_AUX_INFO* info, void* user); -bool sndAuxCallbackPrepareReverbHI(SND_AUX_REVERBHI* rev); -bool sndAuxCallbackShutdownReverbHI(SND_AUX_REVERBHI* rev); -bool sndAuxCallbackUpdateSettingsReverbHI(SND_AUX_REVERBHI* rev); - -// Delay AUX FX -// -typedef struct SND_AUX_DELAY { - u32 currentSize[3]; - u32 currentPos[3]; - u32 currentFeedback[3]; - u32 currentOutput[3]; - - s32* left; - s32* right; - s32* sur; - - // - - - - - - - - - - - - - u32 delay[3]; // Delay buffer length in ms per channel - u32 feedback[3]; // Feedback volume in % per channel - u32 output[3]; // Output volume in % per channel -} SND_AUX_DELAY; - -void sndAuxCallbackDelay(u8 reason, SND_AUX_INFO* info, void* user); -bool sndAuxCallbackPrepareDelay(SND_AUX_DELAY* delay); -bool sndAuxCallbackShutdownDelay(SND_AUX_DELAY* delay); -bool sndAuxCallbackUpdateSettingsDelay(SND_AUX_DELAY* delay); - -// Chorus AUX FX - -typedef struct _SND_CHORUS_SRCINFO { - s32* dest; - s32* smpBase; - s32* old; - u32 posLo; - u32 posHi; - u32 pitchLo; - u32 pitchHi; - u32 trigger; - u32 target; -} _SND_CHORUS_SRCINFO; - -#define _SND_CHORUS_NUM_BLOCKS 3 - -typedef struct _SND_CHORUS_WORK { - s32* lastLeft[_SND_CHORUS_NUM_BLOCKS]; - s32* lastRight[_SND_CHORUS_NUM_BLOCKS]; - s32* lastSur[_SND_CHORUS_NUM_BLOCKS]; - u8 currentLast; - s32 oldLeft[4]; - s32 oldRight[4]; - s32 oldSur[4]; - - u32 currentPosLo; - u32 currentPosHi; - - s32 pitchOffset; - u32 pitchOffsetPeriodCount; - u32 pitchOffsetPeriod; - - _SND_CHORUS_SRCINFO src; -} _SND_CHORUS_WORK; - -typedef struct SND_AUX_CHORUS { - _SND_CHORUS_WORK work; - - u32 baseDelay; // Base delay of chorus effect in ms - u32 variation; // Variation of base delay in ms - u32 period; // Period of variational oscilation in ms -} SND_AUX_CHORUS; - -void sndAuxCallbackChorus(u8 reason, SND_AUX_INFO* info, void* user); -bool sndAuxCallbackPrepareChorus(SND_AUX_CHORUS* ch); -bool sndAuxCallbackShutdownChorus(SND_AUX_CHORUS* ch); -bool sndAuxCallbackUpdateSettingsChorus(SND_AUX_CHORUS* ch); - -// Studio linkage -typedef struct SND_STUDIO_INPUT { - u8 vol; - u8 volA; - u8 volB; - u8 srcStudio; -} SND_STUDIO_INPUT; - -bool sndAddStudioInput(u8 studio, SND_STUDIO_INPUT* in_desc); -bool sndRemoveStudioInput(u8 studio, SND_STUDIO_INPUT* in_desc); - -// 3D API - -typedef struct SND_FVECTOR { - f32 x; - f32 y; - f32 z; -} SND_FVECTOR; - -typedef struct SND_FMATRIX { - f32 m[3][3]; - f32 t[3]; -} SND_FMATRIX; - -typedef struct SND_ROOM { - struct SND_ROOM* next; - struct SND_ROOM* prev; - - u32 flags; - SND_FVECTOR pos; // World "position" of room - f32 distance; // Average distance to listeners (squared) - - u8 studio; - - void (*activateReverb)(u8 studio, void* para); // Callbacks to activate/deactivate "reverb" (AuxA) - void (*deActivateReverb)(u8 studio); // (NULL -> none) - void* user; // Pointer to user data (e.g. "reverb" parameters) - - u32 curMVol; // Current master mix volume (7.16) -} SND_ROOM; - -typedef struct SND_DOOR { - struct SND_DOOR* next; - struct SND_DOOR* prev; - - SND_FVECTOR pos; // Position of door - - f32 open; // State (0=closed, 1=open) - f32 dampen; // Dampening when closed (0=none, 1=full) - u8 fxVol; // FX mix volume of this door (0-127) - - u8 destStudio; // When active: Studio the input is linked to - - SND_ROOM* a; // Rooms to be linked - SND_ROOM* b; - - u32 flags; // Flags - - s16 filterCoef[4]; // Coefs of the 4 tab FIR filter (0x7FFF = 1.0) - SND_STUDIO_INPUT input; // Input info (when active) -} SND_DOOR; - -#define SND_DOOR_A2B 0x00000000 // Door leads from A to B -#define SND_DOOR_B2A 0x00000001 // Door leads from B to A - -#define SND_DOOR_DEFAULT SND_DOOR_A2B - -typedef struct SND_LISTENER { - struct SND_LISTENER* next; - struct SND_LISTENER* prev; - SND_ROOM* room; - - u32 flags; - SND_FVECTOR pos; - f32 volPosOff; // (reserved for future use) - SND_FVECTOR dir; // Speed in units/second - SND_FVECTOR heading; - SND_FVECTOR right; - SND_FVECTOR up; - SND_FMATRIX mat; - f32 surroundDisFront; - f32 surroundDisBack; - f32 soundSpeed; - f32 vol; -} SND_LISTENER; - -#define SND_LISTENER_DEFAULT 0x00000000 // No special features are activated -#define SND_LISTENER_DOPPLERFX \ - 0x00000001 // Listener is supposed to be moving fast enough to display Dopller effects - -typedef struct SND_EMITTER { - struct SND_EMITTER* next; - struct SND_EMITTER* prev; - SND_ROOM* room; - - SND_PARAMETER_INFO* paraInfo; - - u32 flags; - SND_FVECTOR pos; - SND_FVECTOR dir; // Speed in units/second - f32 maxDis; - f32 maxVol; - f32 minVol; - f32 volPush; // -1.0f = 1/square -> 0.0 = linear -> 1.0 = square - SND_VOICEID vid; - u32 group; // Group ID (by default FXID | 0x80000000) used to do volume priorities for continous - // emitters - SND_FXID fxid; - - u8 studio; - - u8 maxVoices; // Max. voices of the assigned FX - - u16 VolLevelCnt; // Used during continous emitter allocation process - f32 fade; // Used to fade-in of continous emitters - -} SND_EMITTER; - -#define SND_EMITTER_DEFAULTKEY 0xFF -#define SND_EMITTER_DEFAULTVOL 0xFF - -#define SND_EMITTER_DEFAULT 0x00000000 // No special features are activated -#define SND_EMITTER_CONTINOUS \ - 0x00000001 // Parameters should be updated over time (they will be set just once if not set) -#define SND_EMITTER_CONTINUOUS \ - 0x00000001 // Parameters should be updated over time (they will be set just once if not set) -#define SND_EMITTER_RESTARTABLE \ - 0x00000002 // If the used voice is reallocated, the sound should be restarted as soon as possible -#define SND_EMITTER_PAUSABLE \ - 0x00000004 // The sound may be stopped if it is no longer audible (and restarted if the above flag - // is set as soon as it's audibel again) -#define SND_EMITTER_DOPPLERFX \ - 0x00000008 // Emitter is supposed to be moving fast enough to display Doppler effects -#define SND_EMITTER_ITD \ - 0x00000010 // Enable ITD per default. The macro controlling the voice may still overwrite this - // setting -#define SND_EMITTER_HARDSTART \ - 0x00000020 // By default continous emitters are quickly faded in at startup to avoid pop sounds at - // restart. This disables this behavior -#define SND_EMITTER_NOSILENTSTART \ - 0x00000040 // Do not start emitter if the volume would be zero (it will be removed from the active - // list in this case) - -// -// Setup / Change logical rooms -// -void sndSetup3DStudios(u8 first, u8 num); - -bool sndAddRoom(SND_ROOM* room, SND_FVECTOR* pos, void (*activateReverb)(u8 studio, void* para), - void (*deActivateReverb)(u8 studio)); -bool sndRemoveRoom(SND_ROOM* room); -bool sndUpdateRoom(SND_ROOM* room, SND_FVECTOR* pos); - -bool sndAddDoor(SND_DOOR* door, SND_ROOM* a, SND_ROOM* b, SND_FVECTOR* pos, f32 dampen, f32 open, - u8 fxVol, s16 filterCoef[4], u32 flags); -bool sndRemoveDoor(SND_DOOR* door); - -// -// Functions to add emitters to logical rooms -// -SND_VOICEID sndAddEmitter(SND_EMITTER* em, SND_FVECTOR* pos, SND_FVECTOR* dir, f32 maxDis, f32 comp, - u32 flags, SND_FXID fxid, u8 maxVol, u8 minVol, SND_ROOM* room); -SND_VOICEID sndAddEmitterEx(SND_EMITTER* em_buffer, SND_FVECTOR* pos, SND_FVECTOR* dir, f32 maxDis, - f32 comp, u32 flags, SND_FXID fxid, u16 groupid, u8 maxVol, u8 minVol, - SND_ROOM* room); -SND_VOICEID sndAddEmitterPara(SND_EMITTER* em, SND_FVECTOR* pos, SND_FVECTOR* dir, f32 maxDis, - f32 comp, u32 flags, SND_FXID fxid, u8 maxVol, u8 minVol, - SND_ROOM* room, SND_PARAMETER_INFO* para); -SND_VOICEID sndAddEmitterParaEx(SND_EMITTER* em_buffer, SND_FVECTOR* pos, SND_FVECTOR* dir, - f32 maxDis, f32 comp, u32 flags, SND_FXID fxid, u16 groupid, - u8 maxVol, u8 minVol, SND_ROOM* room, SND_PARAMETER_INFO* para); - -// -// Listener related functions -// -bool sndAddListener(SND_LISTENER* li, SND_FVECTOR* pos, SND_FVECTOR* dir, SND_FVECTOR* heading, - SND_FVECTOR* up, f32 front_sur, f32 back_sur, f32 soundSpeed, u32 flags, u8 vol, - SND_ROOM* room); -bool sndAddListenerEx(SND_LISTENER* li, SND_FVECTOR* pos, SND_FVECTOR* dir, SND_FVECTOR* heading, - SND_FVECTOR* up, f32 front_sur, f32 back_sur, f32 soundSpeed, - f32 volPosOffset, u32 flags, u8 vol, SND_ROOM* room); -bool sndUpdateListener(SND_LISTENER* li, SND_FVECTOR* pos, SND_FVECTOR* dir, SND_FVECTOR* heading, - SND_FVECTOR* up, u8 vol, SND_ROOM* room); -bool sndRemoveListener(SND_LISTENER* li); -// -// Functions to add emitters directly to a studio -// -SND_VOICEID sndAddEmitter2Studio(SND_EMITTER* em, SND_FVECTOR* pos, SND_FVECTOR* dir, f32 maxDis, - f32 comp, u32 flags, SND_FXID fxid, u8 maxVol, u8 minVol, - u8 studio); -SND_VOICEID sndAddEmitter2StudioEx(SND_EMITTER* em_buffer, SND_FVECTOR* pos, SND_FVECTOR* dir, - f32 maxDis, f32 comp, u32 flags, SND_FXID fxid, u16 groupid, - u8 maxVol, u8 minVol, u8 studio); -SND_VOICEID sndAddEmitter2StudioPara(SND_EMITTER* em, SND_FVECTOR* pos, SND_FVECTOR* dir, - f32 maxDis, f32 comp, u32 flags, SND_FXID fxid, u8 maxVol, - u8 minVol, u8 studio, SND_PARAMETER_INFO* para); -SND_VOICEID sndAddEmitter2StudioParaEx(SND_EMITTER* em_buffer, SND_FVECTOR* pos, SND_FVECTOR* dir, - f32 maxDis, f32 comp, u32 flags, SND_FXID fxid, u16 groupid, - u8 maxVol, u8 minVol, u8 studio, SND_PARAMETER_INFO* para); -// -// Maintain emitters -// -bool sndUpdateEmitter(SND_EMITTER* em, SND_FVECTOR* pos, SND_FVECTOR* dir, u8 maxVol, - SND_ROOM* room); - -bool sndRemoveEmitter(SND_EMITTER* em); - -// -// Misc. 3D functions -// -bool sndCheckEmitter(SND_EMITTER* em); -SND_VOICEID sndEmitterVoiceID(SND_EMITTER* em); - -typedef struct SND_3DINFO { - u8 vol; - u8 pan; - u8 span; - u16 doppler; -} SND_3DINFO; - -void sndGet3DParameters(SND_3DINFO* info, SND_FVECTOR* pos, SND_FVECTOR* dir, f32 maxDis, f32 comp, - u8 maxVol, u8 minVol, SND_ROOM* room); - -// ------------------------- Debug Functions ----------------------- - -u8 sndDbgGetActiveVoices(void); -void* sndConvert32BitSDIRTo64BitSDIR(void* sdir_int); - -#ifdef __cplusplus -} -#endif -#endif // _MUSYX_MUSYX diff --git a/include/musyx/platform.h b/include/musyx/platform.h deleted file mode 100644 index 42b35559..00000000 --- a/include/musyx/platform.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef _MUSYX_PLATFORM -#define _MUSYX_PLATFORM - - -#define MUSY_TARGET_PC 0 -#define MUSY_TARGET_DOLPHIN 1 - -#ifndef MUSY_TARGET -#define MUSY_TARGET MUSY_TARGET_PC -#endif - -#ifndef ATTRIBUTE_ALIGN -#if defined(__MWERKS__) || defined(__GNUC__) -#define ATTRIBUTE_ALIGN(num) __attribute__((aligned(num))) -#elif defined(_MSC_VER) -#define ATTRIBUTE_ALIGN(num) -#else -#error unknown compiler -#endif -#endif - -#if MUSY_TARGET == MUSY_TARGET_PC -#ifndef MUSY_CACHED_TO_UNCACHED_ADDR -#define MUSY_CACHED_TO_UNCACHED_ADDR(addr) addr -#endif -#elif MUSY_TARGET == MUSY_TARGET_DOLPHIN -#ifndef MUSY_CACHED_TO_UNCACHED_ADDR -#define MUSY_CACHED_TO_UNCACHED_ADDR(addr) OSCachedToUncached(addr) -#endif -#endif -#endif diff --git a/include/musyx/s3d.h b/include/musyx/s3d.h deleted file mode 100644 index 81030bcc..00000000 --- a/include/musyx/s3d.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef _MUSYX_S3D -#define _MUSYX_S3D - -#include "musyx/musyx.h" - -#include "musyx/synthdata.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void s3dKillAllEmitter(); -void s3dInit(u32); /* extern */ -void s3dKillEmitterByFXID(FX_TAB* fxTab, u32 num); -void s3dExit(); -void s3dHandle(); - -#ifdef __cplusplus -} -#endif - -#endif \ No newline at end of file diff --git a/include/musyx/sal.h b/include/musyx/sal.h deleted file mode 100644 index af17263c..00000000 --- a/include/musyx/sal.h +++ /dev/null @@ -1,92 +0,0 @@ -#ifndef SAL_H -#define SAL_H - -#include "musyx/dspvoice.h" -#include "musyx/musyx.h" -typedef void (*SND_SOME_CALLBACK)(); - -#define CLAMP(value, min, max) ((value) > (max) ? (max) : (value) < (min) ? (min) : (value)) -// TODO matching hack -#define CLAMP_INV(value, min, max) ((value) < (min) ? (min) : (value) > (max) ? (max) : (value)) - -#ifdef __cplusplus -extern "C" { -#endif -typedef struct SAL_VOLINFO { - // total size: 0x24 - f32 volL; // offset 0x0, size 0x4 - f32 volR; // offset 0x4, size 0x4 - f32 volS; // offset 0x8, size 0x4 - f32 volAuxAL; // offset 0xC, size 0x4 - f32 volAuxAR; // offset 0x10, size 0x4 - f32 volAuxAS; // offset 0x14, size 0x4 - f32 volAuxBL; // offset 0x18, size 0x4 - f32 volAuxBR; // offset 0x1C, size 0x4 - f32 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 - f32 pan_f; // offset 0x18, size 0x4 - f32 pan_fm; // offset 0x1C, size 0x4 - f32 span_f; // offset 0x20, size 0x4 - f32 span_fm; // offset 0x24, size 0x4 - f32 rpan_f; // offset 0x28, size 0x4 - f32 rpan_fm; // offset 0x2C, size 0x4 -} SAL_PANINFO; - -bool salInitAi(SND_SOME_CALLBACK, u32, u32*); -bool salInitDsp(u32); -bool salInitDspCtrl(u8 numVoices, u8 numStudios, u32 defaultStudioDPL2); -bool salExitDsp(); -bool salExitDspCtrl(); -bool salExitAi(); -bool salStartAi(); -void* salAiGetDest(); - -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(u8 studio); -bool salAddStudioInput(DSPstudioinfo* stp, SND_STUDIO_INPUT* desc); -bool salRemoveStudioInput(DSPstudioinfo* stp, SND_STUDIO_INPUT* desc); -void salActivateVoice(DSPvoice* dsp_vptr, u8 studio); -void salCalcVolume(u8 voltab_index, SAL_VOLINFO* vi, f32 vol, u32 pan, u32 span, f32 auxa, f32 auxb, - u32 itd, u32 dpl2); -void salReconnectVoice(DSPvoice* dsp_vptr, u8 studio); -void* salMalloc(u32 len); -void salFree(void* addr); -void salBuildCommandList(signed short* dest, unsigned long nsDelay); -void salStartDsp(s16* cmdList); -void salCtrlDsp(s16* dest); -void salHandleAuxProcessing(); - -#define SAL_MAX_STUDIONUM 8 -extern u8 salMaxStudioNum; -extern u8 salNumVoices; - -void salApplyMatrix(const SND_FMATRIX* a, const SND_FVECTOR* b, SND_FVECTOR* out); -f32 salNormalizeVector(SND_FVECTOR* vec); -void salCrossProduct(SND_FVECTOR* out, const SND_FVECTOR* a, const SND_FVECTOR* b); - -#define SAL_CROSS_PRODUCT(out, a, b) \ - do { \ - out.x = (a.y * b.z) - (a.z * b.y); \ - out.y = (a.z * b.x) - (a.x * b.z); \ - out.z = (a.x * b.y) - (a.y * b.x); \ - } while (0) - -void salInvertMatrix(SND_FMATRIX* out, const SND_FMATRIX* in); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/include/musyx/seq.h b/include/musyx/seq.h deleted file mode 100644 index f955d7e5..00000000 --- a/include/musyx/seq.h +++ /dev/null @@ -1,271 +0,0 @@ -#ifndef _MUSYX_SEQ -#define _MUSYX_SEQ - -#include "musyx/musyx.h" -#include "musyx/voice.h" - -#ifdef __cplusplus -extern "C" { -#endif -typedef struct PAGE { - // total size: 0x6 - u16 macro; // offset 0x0, size 0x2 - u8 prio; // offset 0x2, size 0x1 - u8 maxVoices; // offset 0x3, size 0x1 - u8 index; // offset 0x4, size 0x1 - u8 reserved; // offset 0x5, size 0x1 -} PAGE; - -typedef struct ARR { - // total size: 0x58 - u32 tTab; // offset 0x0, size 0x4 - u32 pTab; // offset 0x4, size 0x4 - u32 tmTab; // offset 0x8, size 0x4 - u32 mTrack; // offset 0xC, size 0x4 - u32 info; // offset 0x10, size 0x4 - u32 loopPoint[16]; // offset 0x14, size 0x40 - u32 tsTab; // offset 0x54, size 0x4 -} ARR; - -#define ARR_GET(arr, offset) ((void*)(offset + (uintptr_t)arr)) -#define ARR_GET_TYPE(arr, offset, ty) ((ty)ARR_GET(arr, offset)) - -typedef struct TENTRY { - // total size: 0xC - u32 time; // offset 0x0, size 0x4 - u8 prgChange; // offset 0x4, size 0x1 - u8 velocity; // offset 0x5, size 0x1 - u8 res[2]; // offset 0x6, size 0x2 - u16 pattern; // offset 0x8, size 0x2 - s8 transpose; // offset 0xA, size 0x1 - s8 velocityAdd; // offset 0xB, size 0x1 -} TENTRY; - -typedef struct TRACK { - // total size: 0x8 - struct TENTRY* base; // offset 0x0, size 0x4 - struct TENTRY* addr; // offset 0x4, size 0x4 -} TRACK; - -typedef struct NOTE { - // total size: 0x14 - struct NOTE* next; // offset 0x0, size 0x4 - struct NOTE* prev; // offset 0x4, size 0x4 - u32 id; // offset 0x8, size 0x4 - s32 endTime; // offset 0xC, size 0x4 - u8 section; // offset 0x10, size 0x1 - u8 timeIndex; // offset 0x11, size 0x1 - u8 reserved[2]; // offset 0x12, size 0x2 -} NOTE; - -typedef struct NOTE_DATA { - // total size: 0x6 - u16 time; // offset 0x0, size 0x2 - u8 key; // offset 0x2, size 0x1 - u8 velocity; // offset 0x3, size 0x1 - u16 length; // offset 0x4, size 0x2 -} NOTE_DATA; - -typedef struct PRG_STATE { - // total size: 0x4 (>=2.0: 0x6) - u16 macId; // offset 0x0, size 0x2 - u8 priority; // offset 0x2, size 0x1 - u8 maxVoices; // offset 0x3, size 0x1 -#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 1) - u8 program; // offset 0x4, size 0x1 -#endif -} PRG_STATE; - -typedef struct SEQ_STREAM { - // total size: 0xC - u8* nextAddr; // offset 0x0, size 0x4 - u16 value; // offset 0x4, size 0x2 - s16 nextDelta; // offset 0x6, size 0x2 - u32 nextTime; // offset 0x8, size 0x4 -} SEQ_STREAM; - -typedef struct CPAT { - // total size: 0x2C - u32 lTime; // offset 0x0, size 0x4 - u32 baseTime; // offset 0x4, size 0x4 - NOTE_DATA* addr; // offset 0x8, size 0x4 - TENTRY* patternInfo; // offset 0xC, size 0x4 - SEQ_STREAM pitchBend; // offset 0x10, size 0xC - SEQ_STREAM modulation; // offset 0x1C, size 0xC - u8 midi; // offset 0x28, size 0x1 -} CPAT; - -typedef struct SEQ_EVENT { - // total size: 0x18 - struct SEQ_EVENT* next; // offset 0x0, size 0x4 - struct SEQ_EVENT* prev; // offset 0x4, size 0x4 - u32 time; // offset 0x8, size 0x4 - union evInfo { - TENTRY* trackAddr; - struct { - // total size: 0x8 - NOTE_DATA* addr; // offset 0x0, size 0x4 - CPAT* base; // offset 0x4, size 0x4 - } pattern; - } info; // offset 0xC, size 0x8 - u8 type; // offset 0x14, size 0x1 - u8 trackId; // offset 0x15, size 0x1 -} SEQ_EVENT; - -typedef struct MTRACK_DATA { - // total size: 0x8 - volatile u32 time; // offset 0x0, size 0x4 - u32 bpm; // offset 0x4, size 0x4 -} MTRACK_DATA; - -typedef struct MTRACK { - // total size: 0x8 - MTRACK_DATA* base; // offset 0x0, size 0x4 - MTRACK_DATA* addr; // offset 0x4, size 0x4 -} MTRACK; - -typedef struct TICKS { - // total size: 0x8 - u32 low; // offset 0x0, size 0x4 - s32 high; // offset 0x4, size 0x4 -} TICKS; - -typedef struct SEQ_SECTION { - // total size: 0x38 - MTRACK mTrack; // offset 0x0, size 0x8 - u32 bpm; // offset 0x8, size 0x4 - TICKS tickDelta[2]; // offset 0xC, size 0x10 - SEQ_EVENT* globalEventRoot; // offset 0x1C, size 0x4 - TICKS time[2]; // offset 0x20, size 0x10 - u8 timeIndex; // offset 0x30, size 0x1 - u16 speed; // offset 0x32, size 0x2 - u16 loopCnt; // offset 0x34, size 0x2 - u8 loopDisable; // offset 0x36, size 0x1 -} SEQ_SECTION; - -typedef struct SEQ_INSTANCE { - // total size: 0x1868 - struct SEQ_INSTANCE* next; // offset 0x0, size 0x4 - struct SEQ_INSTANCE* prev; // offset 0x4, size 0x4 - u8 state; // offset 0x8, size 0x1 - u8 index; // offset 0x9, size 0x1 - u16 groupID; // offset 0xA, size 0x2 - u32 publicId; // offset 0xC, size 0x4 - PAGE* normtab; // offset 0x10, size 0x4 - u8 normTrans[128]; // offset 0x14, size 0x80 - PAGE* drumtab; // offset 0x94, size 0x4 - u8 drumTrans[128]; // offset 0x98, size 0x80 - ARR* arrbase; // offset 0x118, size 0x4 - u32 trackMute[2]; // offset 0x11C, size 0x8 - TRACK track[64]; // offset 0x124, size 0x200 - u8 trackVolGroup[64]; // offset 0x324, size 0x40 - CPAT pattern[64]; // offset 0x364, size 0xB00 - NOTE* noteUsed[2]; // offset 0xE64, size 0x8 - NOTE* noteKeyOff; // offset 0xE6C, size 0x4 - PRG_STATE prgState[16]; // offset 0xE70, size 0x40 - u8 defVGroup; // offset 0xEB0, size 0x1 - SND_CROSSFADE syncCrossInfo; // offset 0xEB4, size 0x28 - u32* syncSeqIdPtr; // offset 0xEDC, size 0x4 - u8 syncActive; // offset 0xEE0, size 0x1 - u8 defStudio; // offset 0xEE1, size 0x1 - u8 keyOffCheck; // offset 0xEE2, size 0x1 - SEQ_EVENT event[64]; // offset 0xEE4, size 0x600 - u8* trackSectionTab; // offset 0x14E4, size 0x4 - SEQ_SECTION section[16]; // offset 0x14E8, size 0x380 -} SEQ_INSTANCE; - -typedef struct SEQ_PATTERN { - // total size: 0x10 - u32 headerLen; // offset 0x0, size 0x4 - u32 pitchBend; // offset 0x4, size 0x4 - u32 modulation; // offset 0x8, size 0x4 - u32 noteData; // offset 0xC, size 0x4 -} SEQ_PATTERN; - -typedef struct CHANNEL_DEFAULTS { - // total size: 0x1 - u8 pbRange; // offset 0x0, size 0x1 -} CHANNEL_DEFAULTS; - -typedef struct MIDI_CHANNEL_SETUP { - // total size: 0x5 - u8 program; // offset 0x0, size 0x1 - u8 volume; // offset 0x1, size 0x1 - u8 panning; // offset 0x2, size 0x1 - u8 reverb; // offset 0x3, size 0x1 - u8 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; - -extern u8 synthTrackVolume[64]; -extern SEQ_INSTANCE seqInstance[8]; -extern u16 seqMIDIPriority[8][16]; - -void seqInit(); /* extern */ -u32 seqStartPlay(PAGE* norm, PAGE* drum, MIDISETUP* midiSetup, u32* song, SND_PLAYPARA* para, - u8 studio, u16 sgid); -u32 seqGetPrivateId(u32 seqId); -void seqSpeed(u32 seqId, u16 speed); -void seqVolume(u8 volume, u16 time, u32 seqId, u8 mode); -void seqStop(u32 seqId); -u16 seqGetMIDIPriority(u8 set, u8 channel); -void seqCrossFade(SND_CROSSFADE* ci, u32* new_seqId, bool8 irq_call); -u32 seqPlaySong(u16 sgid, u16 sid, void* arrfile, SND_PLAYPARA* para, u8 irq_call, u8 studio); -void seqPause(SND_SEQID seqId); -void seqContinue(SND_SEQID seqId); -void seqMute(SND_SEQID seqId, u32 mask1, u32 mask2); -void seqKillInstancesByGroupID(SND_GROUPID sgid); -void seqKillAllInstances(); -void seqHandle(u32 deltaTime); - -u8 inpTranslateExCtrl(u8 ctrl); -void inpSetGlobalMIDIDirtyFlag(u8 chan, u8 midiSet, s32 flag); -void inpAddCtrl(CTRL_DEST* dest, u8 ctrl, s32 scale, u8 comb, u32 isVar); -void inpSetMidiCtrl(u8 ctrl, u8 channel, u8 set, u8 value); -void inpSetMidiCtrl14(u8 ctrl, u8 channel, u8 set, u16 value); -void inpSetExCtrl(SYNTH_VOICE* svoice, u8 ctrl, s16 v); -CHANNEL_DEFAULTS* inpGetChannelDefaults(u8 midi, u8 midiSet); -#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 3) -unsigned short inpGetFilterSwitch(struct SYNTH_VOICE* svoice); -unsigned short inpGetFilterParameter(struct SYNTH_VOICE* svoice); -void inpSetLPFDefaultRange(u32 lowFrq, u32 highFrq); -#endif -extern CTRL_DEST inpAuxA[8][4]; -extern CTRL_DEST inpAuxB[8][4]; -void inpSetMidiLastNote(u8 midi, u8 midiSet, u8 key); -u8 inpGetMidiLastNote(u8 midi, u8 midiSet); -u16 inpGetExCtrl(SYNTH_VOICE* svoice, u8 ctrl); -u16 inpGetMidiCtrl(u8 ctrl, u8 channel, u8 set); -void inpSetMidiLastNote(u8 midi, u8 midiSet, u8 key); -u16 inpGetModulation(SYNTH_VOICE* svoice); -void inpResetMidiCtrl(u8 ch, u8 set, u32 coldReset); -void inpResetChannelDefaults(u8 midi, u8 midiSet); -u16 inpGetPitchBend(SYNTH_VOICE* svoice); -u16 inpGetDoppler(SYNTH_VOICE* svoice); -u16 inpGetTremolo(SYNTH_VOICE* svoice); -u16 inpGetPanning(SYNTH_VOICE* svoice); -u16 inpGetSurPanning(SYNTH_VOICE* svoice); -u16 inpGetVolume(SYNTH_VOICE* svoice); -u16 inpGetReverb(SYNTH_VOICE* svoice); -u16 inpGetPreAuxA(SYNTH_VOICE* svoice); -u16 inpGetPostAuxA(SYNTH_VOICE* svoice); -u16 inpGetPreAuxB(SYNTH_VOICE* svoice); -u16 inpGetPostAuxB(SYNTH_VOICE* svoice); -u16 inpGetPedal(SYNTH_VOICE* svoice); -u16 inpGetAuxA(u8 studio, u8 index, u8 midi, u8 midiSet); -u16 inpGetAuxB(u8 studio, u8 index, u8 midi, u8 midiSet); -void inpInit(SYNTH_VOICE* svoice); -void inpFXCopyCtrl(u8 ctrl, SYNTH_VOICE* dvoice, SYNTH_VOICE* svoice); - -s16 varGet(SYNTH_VOICE* svoice, u32 ctrl, u8 index); -#ifdef __cplusplus -} -#endif - -#endif // _MUSYX_SEQ diff --git a/include/musyx/snd.h b/include/musyx/snd.h deleted file mode 100644 index 100b97ee..00000000 --- a/include/musyx/snd.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef SND_H -#define SND_H - -#include "musyx/musyx.h" -#include "musyx/voice.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef s32 (*SND_COMPARE)(void*, void*); - -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); -u32 sndGetPitch(u8 key, u32 sInfo); -s32 sndPitchUpOne(u16 note); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/include/musyx/stream.h b/include/musyx/stream.h deleted file mode 100644 index c3bb8f39..00000000 --- a/include/musyx/stream.h +++ /dev/null @@ -1,77 +0,0 @@ -#ifndef _MUSYX_STREAM -#define _MUSYX_STREAM - -#include "musyx/musyx.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef u32 (*SND_STREAM_UPDATE_CALLBACK)(void* buffer1, u32 len1, void* buffer2, u32 len2, - u32 user); -typedef struct SNDADPCMinfo { - // total size: 0x28 - u16 numCoef; // offset 0x0, size 0x2 - u8 initialPS; // offset 0x2, size 0x1 - u8 loopPS; // offset 0x3, size 0x1 - s16 loopY0; // offset 0x4, size 0x2 - s16 loopY1; // offset 0x6, size 0x2 - s16 coefTab[8][2]; // offset 0x8, size 0x20 -} SNDADPCMinfo; - -typedef struct STREAM_INFO { -#if MUSY_VERSION >= MUSY_VERSION_CHECK(1, 5, 4) - u32 nextStreamHandle; -#endif - u32 stid; - u32 flags; - u8 state; - u8 type; - /* These were moved to near the start of the structure in later versions */ -#if MUSY_VERSION >= MUSY_VERSION_CHECK(1, 5, 4) - u8 hwStreamHandle; - u8 lastPSFromBuffer; -#endif - SND_STREAM_UPDATE_CALLBACK updateFunction; - s16* buffer; - u32 size; - u32 bytes; - u32 last; - SNDADPCMinfo adpcmInfo; - volatile SND_VOICEID voice; - u32 user; - u32 frq; - u8 prio; - u8 vol; - u8 pan; - u8 span; - u8 auxa; - u8 auxb; - -#if MUSY_VERSION >= MUSY_VERSION_CHECK(1, 5, 4) - u8 orgPan; - u8 orgSPan; -#endif - - u8 studio; - /* These were moved to near the start of the structure in later versions */ -#if MUSY_VERSION <= MUSY_VERSION_CHECK(1, 5, 3) - u8 hwStreamHandle; - u32 nextStreamHandle; -#endif -} STREAM_INFO; - -#if MUSY_VERSION >= MUSY_VERSION_CHECK(1, 5, 4) -void streamOutputModeChanged(); -#endif - -void streamInit(); /* extern */ -void streamKill(SND_VOICEID voice); -void streamCorrectLoops(); -void streamHandle(); - -#ifdef __cplusplus -} -#endif - -#endif \ No newline at end of file diff --git a/include/musyx/synth.h b/include/musyx/synth.h deleted file mode 100644 index e4953aab..00000000 --- a/include/musyx/synth.h +++ /dev/null @@ -1,334 +0,0 @@ -#ifndef _MUSYX_SYNTH -#define _MUSYX_SYNTH -#include "musyx/musyx.h" - -#include "musyx/adsr.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { - MAC_STATE_RUNNABLE = 0, - MAC_STATE_YIELDED, - MAC_STATE_STOPPED, -} MAC_STATE; - -typedef struct MSTEP { - u32 para[2]; -} MSTEP; - -typedef struct CALLSTACK { - MSTEP* addr; - MSTEP* curAddr; -} CALLSTACK; - -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 - u16 next; // offset 0x0, size 0x2 - u16 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; -extern SynthInfo synthInfo; - -typedef struct VID_LIST { - struct VID_LIST* next; - struct VID_LIST* prev; - u32 vid; - u32 root; -} VID_LIST; - -typedef struct SYNTH_QUEUE { - // total size: 0xC - struct SYNTH_QUEUE* next; // offset 0x0, size 0x4 - struct SYNTH_QUEUE* prev; // offset 0x4, size 0x4 - u8 voice; // offset 0x8, size 0x1 - u8 jobTabIndex; // offset 0x9, size 0x1 -} 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 - f32 volume; // offset 0x0, size 0x4 - f32 target; // offset 0x4, size 0x4 - f32 start; // offset 0x8, size 0x4 - f32 time; // offset 0xC, size 0x4 - f32 deltaTime; // offset 0x10, size 0x4 - f32 pauseVol; // offset 0x14, size 0x4 - f32 pauseTarget; // offset 0x18, size 0x4 - f32 pauseStart; // offset 0x1C, size 0x4 - f32 pauseTime; // offset 0x20, size 0x4 - f32 pauseDeltaTime; // offset 0x24, size 0x4 - u32 seqId; // offset 0x28, size 0x4 - u8 seqMode; // offset 0x2C, size 0x1 - u8 type; // offset 0x2D, size 0x1 -} SYNTHMasterFader; - -typedef struct CTRL_SOURCE { - u8 midiCtrl; - u8 combine; - s32 scale; -} CTRL_SOURCE; - -typedef struct CTRL_DEST { - CTRL_SOURCE source[4]; - u16 oldValue; - u8 numSource; -} CTRL_DEST; - -#pragma push -#pragma pack(4) -typedef struct SYNTH_VOICE { - // total size: 0x404 - SYNTH_QUEUE lowPrecisionJob; // offset 0x0, size 0xC - SYNTH_QUEUE zeroOffsetJob; // offset 0xC, size 0xC - SYNTH_QUEUE eventJob; // offset 0x18, size 0xC - u64 lastLowCallTime; // offset 0x24, size 0x8 - u64 lastZeroCallTime; // offset 0x2C, size 0x8 - MSTEP* addr; // offset 0x34, size 0x4 - MSTEP* curAddr; // offset 0x38, size 0x4 - struct SYNTH_VOICE* nextMacActive; // offset 0x3C, size 0x4 - struct SYNTH_VOICE* prevMacActive; // offset 0x40, size 0x4 - struct SYNTH_VOICE* nextTimeQueueMacro; // offset 0x44, size 0x4 - struct SYNTH_VOICE* prevTimeQueueMacro; // offset 0x48, size 0x4 - MAC_STATE macState; // offset 0x4C, size 0x4 - MSTEP* trapEventAddr[3]; // offset 0x50, size 0xC - MSTEP* trapEventCurAddr[3]; // offset 0x5C, size 0xC - u8 trapEventAny; // offset 0x68, size 0x1 - CALLSTACK callStack[4]; // offset 0x6C, size 0x20 - u8 callStackEntryNum; // offset 0x8C, size 0x1 - u8 callStackIndex; // offset 0x8D, size 0x1 - u64 macStartTime; // offset 0x90, size 0x8 - u64 wait; // offset 0x98, size 0x8 - u64 waitTime; // offset 0xA0, size 0x8 - u8 timeUsedByInput; // offset 0xA8, size 0x1 - u16 loop; // offset 0xAA, size 0x2 - s32 local_vars[16]; // offset 0xAC, size 0x40 - u32 child; // offset 0xEC, size 0x4 - u32 parent; // offset 0xF0, size 0x4 - u32 id; // offset 0xF4, size 0x4 - VID_LIST* vidList; // offset 0xF8, size 0x4 - VID_LIST* vidMasterList; // offset 0xFC, size 0x4 -#if MUSY_VERSION >= MUSY_VERSION_CHECK(1, 5, 0) && MUSY_VERSION <= MUSY_VERSION_CHECK(2, 0, 0) - u16 allocId; // offset 0x100, size 0x2 -#else - u32 allocId; -#endif - u16 macroId; // offset 0x102, size 0x2 - u8 keyGroup; // offset 0x104, size 0x1 - u32 lastVID; // offset 0x108, size 0x4 - u8 prio; // offset 0x10C, size 0x1 - u16 ageSpeed; // offset 0x10E, size 0x2 - u32 age; // offset 0x110, size 0x4 - u64 cFlags; // offset 0x114, size 0x8 - u8 block; // offset 0x11C, size 0x1 - u8 fxFlag; // offset 0x11D, size 0x1 - u8 vGroup; // offset 0x11E, size 0x1 - u8 studio; // offset 0x11F, size 0x1 - u8 track; // offset 0x120, size 0x1 - u8 midi; // offset 0x121, size 0x1 - u8 midiSet; // offset 0x122, size 0x1 - u8 section; // offset 0x123, size 0x1 -#if MUSY_VERSION <= MUSY_VERSION_CHECK(1, 5, 0) - void* sAddr; -#endif - u32 sInfo; // offset 0x124, size 0x4 - u32 playFrq; // offset 0x128, size 0x4 -#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 3) - u16 sampleId; -#endif - u16 curNote; // offset 0x12C, size 0x2 - s8 curDetune; // offset 0x12E, size 0x1 - u8 orgNote; // offset 0x12F, size 0x1 - u8 lastNote; // offset 0x130, size 0x1 - u8 portType; // offset 0x131, size 0x1 - u16 portLastCtrlState; // offset 0x132, size 0x2 - u32 portDuration; // offset 0x134, size 0x4 - u32 portCurPitch; // offset 0x138, size 0x4 - 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 - s32 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 - s32 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 - s32 envDelta; // offset 0x194, size 0x4 - u32 envTarget; // offset 0x198, size 0x4 - u32 envCurrent; // offset 0x19C, size 0x4 - u32 sweepOff[2]; // offset 0x1A0, size 0x8 - s32 sweepAdd[2]; // offset 0x1A8, size 0x8 - s32 sweepCnt[2]; // offset 0x1B0, size 0x8 - u8 sweepNum[2]; // offset 0x1B8, size 0x2 - 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 -#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 3) - u32 lpfLowerFrqBoundary; - u32 lpfUpperFrqBoundary; -#endif - ADSR_VARS pitchADSR; // offset 0x1DC, size 0x28 - s16 pitchADSRRange; // offset 0x204, size 0x2 - u16 curPitch; // offset 0x206, size 0x2 - struct setup { - // total size: 0x9 - 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 -#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 3) - CTRL_DEST inpFilterSwitch; // offset 0x3F8, size 0x24 - CTRL_DEST inpFilterParameter; // offset 0x41C, size 0x24 -#endif - u8 mesgNum; // offset 0x3EC, size 0x1 - u8 mesgRead; // offset 0x3ED, size 0x1 - u8 mesgWrite; // offset 0x3EE, size 0x1 - s32 mesgQueue[4]; // offset 0x3F0, size 0x10 - u16 curOutputVolume; // offset 0x400, size 0x2 -} SYNTH_VOICE; - -typedef struct synthITDInfo { - // total size: 0x2 - u8 music; // offset 0x0, size 0x1 - u8 sfx; // offset 0x1, size 0x1 -} synthITDInfo; - -#pragma pop -typedef void (*SYNTH_MESSAGE_CALLBACK)(u32, s32); - -extern SND_AUX_CALLBACK synthAuxACallback[8]; -extern u8 synthAuxAMIDI[8]; -extern u8 synthAuxAMIDISet[8]; -extern void* synthAuxAUser[8]; -extern SND_AUX_CALLBACK synthAuxBCallback[8]; -extern u8 synthAuxBMIDI[8]; -extern u8 synthAuxBMIDISet[8]; -extern void* synthAuxBUser[8]; - -extern synthITDInfo synthITDDefault[8]; -extern u32 synthFlags; -extern SYNTH_VOICE* synthVoice; -extern u8 sndActive; -extern u8 synthIdleWaitActive; -extern SynthInfo synthInfo; -extern s32 synthGlobalVariable[16]; -extern u64 synthRealTime; -extern SYNTH_MESSAGE_CALLBACK synthMessageCallback; - -u32 synthGetTicksPerSecond(SYNTH_VOICE* svoice); -void synthKillVoicesByMacroReferences(u16* ref); -void synthExit(); -void synthInit(u32 mixFrq, u32 numVoices); -void synthSetBpm(u32 pbm, u8 set, u8 section); -void synthFXCloneMidiSetup(SYNTH_VOICE* dest, SYNTH_VOICE* src); -void synthSetMusicVolumeType(u8 vGroup, u8 type); -void synthInitAllocationAids(); -void synthInitPortamento(SYNTH_VOICE* svoice); -void synthStartSynthJobHandling(SYNTH_VOICE* svoice); -void synthForceLowPrecisionUpdate(SYNTH_VOICE* svoice); -void synthKeyStateUpdate(SYNTH_VOICE* svoice); -void synthHandle(u32 deltaTime); -bool synthFXSetCtrl(SND_VOICEID vid, u8 ctrl, u8 value); -bool synthFXSetCtrl14(SND_VOICEID vid, u8 ctrl, u16 value); -bool synthSendKeyOff(SND_VOICEID vid); -SND_VOICEID synthFXStart(u16 fid, u8 vol, u8 pan, u8 studio, u32 itd); -void synthVolume(u8 volume, u16 time, u8 vGroup, u8 seqMode, u32 seqId); -u32 synthStartSound(u16 id, u8 prio, u8 max, -#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 1) - u32 sourceID, -#endif - u8 key, u8 vol, u8 panning, u8 midi, u8 midiSet, u8 section, u16 step, - u16 trackid, u8 vGroup, s16 prioOffset, u8 studio, u32 itd); -bool synthIsFadeOutActive(u8 vGroup); -void synthActivateStudio(u8 studio, u32 isMaster, SND_STUDIO_TYPE type); -void synthDeactivateStudio(u8 studio); -u8 synthFXGetMaxVoices(u16 fid); -void synthPauseVolume(u8 volume, u16 time, u8 vGroup); -void synthKillAllVoices(bool8 musiconly); -void synthKeyStateUpdate(SYNTH_VOICE* svoice); -bool synthAddStudioInput(u8 studio, SND_STUDIO_INPUT* in_desc); -bool synthRemoveStudioInput(u8 studio, SND_STUDIO_INPUT* in_desc); -u32 synthGetTicksPerSecond(SYNTH_VOICE* svoice); - -#ifdef __cplusplus -} -#endif - -#endif // _MUSYX_SYNTH diff --git a/include/musyx/synth_dbtab.h b/include/musyx/synth_dbtab.h deleted file mode 100644 index 741f8a91..00000000 --- a/include/musyx/synth_dbtab.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef _MUSYX_SYNTH_DBTAB -#define _MUSYX_SYNTH_DBTAB - -#include "musyx/musyx.h" - -#ifdef __cplusplus -extern "C" { -#endif - -extern u16 dspAttenuationTab[194]; -extern u8 dspScale2IndexTab[1024]; -extern float dspDLSVolTab[129]; - -#ifdef __cplusplus -} -#endif - -#endif // _MUSYX_SYNTH_DBTAB diff --git a/include/musyx/synthdata.h b/include/musyx/synthdata.h deleted file mode 100644 index 8f372121..00000000 --- a/include/musyx/synthdata.h +++ /dev/null @@ -1,226 +0,0 @@ -#ifndef SYNTHDATA_H -#define SYNTHDATA_H - -#include "musyx/macros.h" - -#ifdef __cplusplus -extern "C" { -#endif -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 - u32 nextOff; // offset 0x0, size 0x4 - u16 id; // offset 0x4, size 0x2 - u16 type; // offset 0x6, size 0x2 - u32 macroOff; // offset 0x8, size 0x4 - u32 sampleOff; // offset 0xC, size 0x4 - u32 curveOff; // offset 0x10, size 0x4 - u32 keymapOff; // offset 0x14, size 0x4 - u32 layerOff; // offset 0x18, size 0x4 - union { - struct fx { - // total size: 0x4 - u32 tableOff; // offset 0x0, size 0x4 - } fx; - struct song { - // total size: 0xC - u32 normpageOff; // offset 0x0, size 0x4 - u32 drumpageOff; // offset 0x4, size 0x4 - u32 midiSetupOff; // offset 0x8, size 0x4 - } song; - } data; // offset 0x1C, size 0xC -} GROUP_DATA; - -typedef struct SAMPLE_HEADER { - // total size: 0x10 - u32 info; // offset 0x0, size 0x4 - u32 length; // offset 0x4, size 0x4 - u32 loopOffset; // offset 0x8, size 0x4 - u32 loopLength; // offset 0xC, size 0x4 -} SAMPLE_HEADER; - -typedef struct SDIR_DATA { - // total size: 0x20 - u16 id; // offset 0x0, size 0x2 - u16 ref_cnt; // offset 0x2, size 0x2 - u32 offset; // offset 0x4, size 0x4 - void* addr; // offset 0x8, size 0x4 - SAMPLE_HEADER header; // offset 0xC, size 0x10 - u32 extraData; // offset 0x1C, size 0x4 -} SDIR_DATA; - -/*! A direct copy of the above structure to allow us to load in legacy data - * this must be done via sndConvert32BitSDIRto64BitSDIR via client code, - * this is explicit on the part of the programmer. - * MusyX data built with the new tools will not require this step. - */ -typedef struct SDIR_DATA_INTER { - // total size: 0x20 - u16 id; // offset 0x0, size 0x2 - u16 ref_cnt; // offset 0x2, size 0x2 - u32 offset; // offset 0x4, size 0x4 - u32 addr; // offset 0x8, size 0x4 - SAMPLE_HEADER header; // offset 0xC, size 0x10 - u32 extraData; // offset 0x1C, size 0x4 -} SDIR_DATA_INTER; - -typedef struct SDIR_TAB { - // total size: 0xC - SDIR_DATA* data; // offset 0x0, size 0x4 - void* base; // offset 0x4, size 0x4 - u16 numSmp; // offset 0x8, size 0x2 - u16 res; // offset 0xA, size 0x2 -} SDIR_TAB; - -typedef struct DATA_TAB { - // total size: 0x8 - void* data; // offset 0x0, size 0x4 - u16 id; // offset 0x4, size 0x2 - u16 refCount; // offset 0x6, size 0x2 -} DATA_TAB; - -typedef struct LAYER_TAB { - // total size: 0xC - void* data; // offset 0x0, size 0x4 - u16 id; // offset 0x4, size 0x2 - u16 num; // offset 0x6, size 0x2 - u16 refCount; // offset 0x8, size 0x2 - u16 reserved; // offset 0xA, size 0x2 -} LAYER_TAB; - -typedef struct MAC_MAINTAB { - // total size: 0x4 - u16 num; // offset 0x0, size 0x2 - u16 subTabIndex; // offset 0x2, size 0x2 -} MAC_MAINTAB; - -typedef struct MAC_SUBTAB { - // total size: 0x8 - void* data; // offset 0x0, size 0x4 - u16 id; // offset 0x4, size 0x2 - u16 refCount; // offset 0x6, size 0x2 -} MAC_SUBTAB; - -typedef struct GSTACK { - // total size: 0xC - GROUP_DATA* gAddr; // offset 0x0, size 0x4 - SDIR_DATA* sdirAddr; // offset 0x4, size 0x4 - void* prjAddr; // offset 0x8, size 0x4 -} GSTACK; - -typedef struct LAYER { - // total size: 0xC - u16 id; // offset 0x0, size 0x2 - u8 keyLow; // offset 0x2, size 0x1 - u8 keyHigh; // offset 0x3, size 0x1 - s8 transpose; // offset 0x4, size 0x1 - u8 volume; // offset 0x5, size 0x1 - s16 prioOffset; // offset 0x6, size 0x2 - u8 panning; // offset 0x8, size 0x1 - u8 reserved[3]; // offset 0x9, size 0x3 -} LAYER; - -typedef struct KEYMAP { - // total size: 0x8 - u16 id; // offset 0x0, size 0x2 - s8 transpose; // offset 0x2, size 0x1 - u8 panning; // offset 0x3, size 0x1 - s16 prioOffset; // offset 0x4, size 0x2 - u8 reserved[2]; // offset 0x6, size 0x2 -} KEYMAP; - -typedef struct MEM_DATA { - // total size: 0x408 - u32 nextOff; // offset 0x0, size 0x4 - u16 id; // offset 0x4, size 0x2 - u16 reserved; // offset 0x6, size 0x2 - union { - struct { - // total size: 0x10 - u32 num; // offset 0x0, size 0x4 - LAYER entry[1]; // offset 0x4, size 0xC - } layer; - KEYMAP map[128]; - u8 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 FX_TAB { - // total size: 0xA - u16 id; // offset 0x0, size 0x2 - u16 macro; // offset 0x2, size 0x2 - u8 maxVoices; // offset 0x4, size 0x1 - u8 priority; // offset 0x5, size 0x1 - u8 volume; // offset 0x6, size 0x1 - u8 panning; // offset 0x7, size 0x1 - u8 key; // offset 0x8, size 0x1 - u8 vGroup; // offset 0x9, size 0x1 -} FX_TAB; - -typedef struct FX_DATA { - // total size: 0xE - u16 num; // offset 0x0, size 0x2 - u16 reserverd; // offset 0x2, size 0x2 - FX_TAB fx[1]; // offset 0x4, size 0xA -} FX_DATA; - -typedef struct FX_GROUP { - // total size: 0x8 - u16 gid; // offset 0x0, size 0x2 - u16 fxNum; // offset 0x2, size 0x2 - FX_TAB* fxTab; // offset 0x4, size 0x4 -} FX_GROUP; - -void dataInit(u32, u32); /* extern */ -void dataExit(); -#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 3) -void dataInitStack(unsigned long aramBase, unsigned long aramSize); -#else -void dataInitStack(); /* extern */ -#endif -bool dataInsertSDir(SDIR_DATA* sdir, void* smp_data); -bool dataRemoveSDir(SDIR_DATA* sdir); -bool dataInsertMacro(u16 mid, void* macroaddr); -bool dataRemoveMacro(u16 mid); -bool dataInsertCurve(u16 cid, void* curvedata); -bool dataRemoveCurve(u16 sid); -s32 dataGetSample(u16 sid, SAMPLE_INFO* newsmp); -void* dataGetCurve(u16 cid); -bool dataAddSampleReference(u16 sid); -bool dataRemoveSampleReference(u16 sid); -bool dataInsertKeymap(u16 cid, void* keymapdata); -bool dataRemoveKeymap(u16 sid); -bool dataInsertLayer(u16 cid, void* layerdata, u16 size); -bool dataRemoveLayer(u16 sid); -bool dataInsertFX(u16 gid, FX_TAB* fx, u16 fxNum); -bool dataRemoveFX(u16 gid); -FX_TAB* dataGetFX(u16 fid); -void* dataGetLayer(u16 cid, u16* n); -void* dataGetKeymap(u16 cid); -MSTEP* dataGetMacro(u16 mid); - -#ifdef __cplusplus -} -#endif - -#endif // SYNTHDATA_H diff --git a/include/musyx/txwin.h b/include/musyx/txwin.h deleted file mode 100644 index 34b529ac..00000000 --- a/include/musyx/txwin.h +++ /dev/null @@ -1,49 +0,0 @@ -#ifndef _MUSYX_TXWIN -#define _MUSYX_TXWIN - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct STRUCT_WIN { - s32 x1; - s32 y1; - s32 x2; - s32 y2; - char* caption; - u32 flags; - s32 curr_x; - s32 curr_y; - s32 pixel_width; - s32 pixel_height; - s32 char_width; - s32 char_height; - u16 num_lines; - char** buffer; - u16 total_lines; - u16 curr_output_line; - u16 curr_view_line; - void (*refresh)(); - struct STRUCT_WIN* next; - struct STRUCT_WIN* prev; - -} sWIN; - -void winInit(void); -void winRefresh(void); -void winLogPrintf(sWIN* handle, char* fmt, ...); -void winPrintfXY(sWIN* handle, s16 char_x, s16 char_y, char* fmt, ...); -void winClearLogWindow(sWIN* handle); -void winSetFontSize(u16 size); - -sWIN* winOpenLogWindow(s32 x1, s32 y1, s32 x2, s32 y2, char* caption, u16 num_lines, u32 flags); -sWIN* winOpenWindow(s32 x1, s32 y1, s32 x2, s32 y2, char* caption, void* func, u32 flags); - -// WXOpenWindow(); - -#ifdef __cpluplus -} -#endif // __cpluplus -#endif // _MUSYX_TXWIN diff --git a/include/musyx/version.h b/include/musyx/version.h deleted file mode 100644 index 85f1bff7..00000000 --- a/include/musyx/version.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef _MUSYX_VERSION -#define _MUSYX_VERSION - -#define MUSY_TARGET_PC 0 -#define MUSY_TARGET_DOLPHIN 1 - -#ifndef MUSY_TARGET -#define MUSY_TARGET MUSY_TARGET_PC -#endif - -#ifndef MUSY_VERSION_CHECK -#define MUSY_VERSION_CHECK(major, minor, patch) ((major << 16) | (minor << 8) | (patch)) -#endif - -#ifndef MUSY_VERSION_MAJOR -#define MUSY_VERSION_MAJOR 2 -#endif - -#ifndef MUSY_VERSION_MINOR -#define MUSY_VERSION_MINOR 0 -#endif - -#ifndef MUSY_VERSION_PATCH -#define MUSY_VERSION_PATCH 0 -#endif - - -#ifndef MUSY_VERSION -#define MUSY_VERSION MUSY_VERSION_CHECK(MUSY_VERSION_MAJOR, MUSY_VERSION_MINOR, MUSY_VERSION_PATCH) -#endif - -#endif // _MUSYX_VERSION diff --git a/include/musyx/voice.h b/include/musyx/voice.h deleted file mode 100644 index 32ffee3f..00000000 --- a/include/musyx/voice.h +++ /dev/null @@ -1,244 +0,0 @@ -#ifndef _MUSYX_VOICE_H_ -#define _MUSYX_VOICE_H_ - -#include "musyx/synth.h" -#include "musyx/version.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct _PBMIX { - // total size: 0x24 - u16 vL; // offset 0x0, size 0x2 - u16 vDeltaL; // offset 0x2, size 0x2 - u16 vR; // offset 0x4, size 0x2 - u16 vDeltaR; // offset 0x6, size 0x2 - u16 vAuxAL; // offset 0x8, size 0x2 - u16 vDeltaAuxAL; // offset 0xA, size 0x2 - u16 vAuxAR; // offset 0xC, size 0x2 - u16 vDeltaAuxAR; // offset 0xE, size 0x2 - u16 vAuxBL; // offset 0x10, size 0x2 - u16 vDeltaAuxBL; // offset 0x12, size 0x2 - u16 vAuxBR; // offset 0x14, size 0x2 - u16 vDeltaAuxBR; // offset 0x16, size 0x2 - u16 vAuxBS; // offset 0x18, size 0x2 - u16 vDeltaAuxBS; // offset 0x1A, size 0x2 - u16 vS; // offset 0x1C, size 0x2 - u16 vDeltaS; // offset 0x1E, size 0x2 - u16 vAuxAS; // offset 0x20, size 0x2 - u16 vDeltaAuxAS; // offset 0x22, size 0x2 -} _PBMIX; - -typedef struct _PBITD { - // total size: 0xE - u16 flag; // offset 0x0, size 0x2 - u16 bufferHi; // offset 0x2, size 0x2 - u16 bufferLo; // offset 0x4, size 0x2 - u16 shiftL; // offset 0x6, size 0x2 - u16 shiftR; // offset 0x8, size 0x2 - u16 targetShiftL; // offset 0xA, size 0x2 - u16 targetShiftR; // offset 0xC, size 0x2 -} _PBITD; - -typedef struct _PBUPDATE { - // total size: 0xE - u16 updNum[5]; // offset 0x0, size 0xA - u16 dataHi; // offset 0xA, size 0x2 - u16 dataLo; // offset 0xC, size 0x2 -} _PBUPDATE; - -typedef struct _PBDPOP { - // total size: 0x12 - u16 aL; // offset 0x0, size 0x2 - u16 aAuxAL; // offset 0x2, size 0x2 - u16 aAuxBL; // offset 0x4, size 0x2 - u16 aR; // offset 0x6, size 0x2 - u16 aAuxAR; // offset 0x8, size 0x2 - u16 aAuxBR; // offset 0xA, size 0x2 - u16 aS; // offset 0xC, size 0x2 - u16 aAuxAS; // offset 0xE, size 0x2 - u16 aAuxBS; // offset 0x10, size 0x2 -} _PBDPOP; - -typedef struct _PBVE { - // total size: 0x4 - u16 currentVolume; // offset 0x0, size 0x2 - u16 currentDelta; // offset 0x2, size 0x2 -} _PBVE; - -typedef struct _PBFIR { - // total size: 0x6 - u16 numCoefs; // offset 0x0, size 0x2 - u16 coefsHi; // offset 0x2, size 0x2 - u16 coefsLo; // offset 0x4, size 0x2 -} _PBFIR; - -typedef struct _PBADDR { - // total size: 0x10 - u16 loopFlag; // offset 0x0, size 0x2 - u16 format; // offset 0x2, size 0x2 - u16 loopAddressHi; // offset 0x4, size 0x2 - u16 loopAddressLo; // offset 0x6, size 0x2 - u16 endAddressHi; // offset 0x8, size 0x2 - u16 endAddressLo; // offset 0xA, size 0x2 - u16 currentAddressHi; // offset 0xC, size 0x2 - u16 currentAddressLo; // offset 0xE, size 0x2 -} _PBADDR; - -typedef struct _PBADPCM { - // total size: 0x28 - u16 a[8][2]; // offset 0x0, size 0x20 - u16 gain; // offset 0x20, size 0x2 - u16 pred_scale; // offset 0x22, size 0x2 - u16 yn1; // offset 0x24, size 0x2 - u16 yn2; // offset 0x26, size 0x2 -} _PBADPCM; - -typedef struct _PBSRC { - // total size: 0xE - u16 ratioHi; // offset 0x0, size 0x2 - u16 ratioLo; // offset 0x2, size 0x2 - u16 currentAddressFrac; // offset 0x4, size 0x2 - u16 last_samples[4]; // offset 0x6, size 0x8 -} _PBSRC; - -typedef struct _PBADPCMLOOP { - // total size: 0x6 - u16 loop_pred_scale; // offset 0x0, size 0x2 - u16 loop_yn1; // offset 0x2, size 0x2 - u16 loop_yn2; // offset 0x4, size 0x2 -} _PBADPCMLOOP; - -typedef struct _PB { - // total size: 0xBC - u16 nextHi; // offset 0x0, size 0x2 - u16 nextLo; // offset 0x2, size 0x2 - u16 currHi; // offset 0x4, size 0x2 - u16 currLo; // offset 0x6, size 0x2 - u16 srcSelect; // offset 0x8, size 0x2 - u16 coefSelect; // offset 0xA, size 0x2 - u16 mixerCtrl; // offset 0xC, size 0x2 - u16 state; // offset 0xE, size 0x2 - u16 loopType; // offset 0x10, size 0x2 - _PBMIX mix; // offset 0x12, size 0x24 - _PBITD itd; // offset 0x36, size 0xE - _PBUPDATE update; // offset 0x44, size 0xE - _PBDPOP dpop; // offset 0x52, size 0x12 - _PBVE ve; // offset 0x64, size 0x4 - _PBFIR fir; // offset 0x68, size 0x6 - _PBADDR addr; // offset 0x6E, size 0x10 - _PBADPCM adpcm; // offset 0x7E, size 0x28 - _PBSRC src; // offset 0xA6, size 0xE - _PBADPCMLOOP adpcmLoop; // offset 0xB4, size 0x6 - u16 streamLoopCnt; // offset 0xBA, size 0x2 -} _PB; - -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 VS_BUFFER { - // total size: 0x24 - u8 state; // offset 0x0, size 0x1 - u8 hwId; // offset 0x1, size 0x1 - u8 smpType; // offset 0x2, size 0x1 - u8 voice; // offset 0x3, size 0x1 - u32 last; // offset 0x4, size 0x4 - u32 finalGoodSamples; // offset 0x8, size 0x4 - u32 finalLast; // offset 0xC, size 0x4 - SND_VIRTUALSAMPLE_INFO info; // offset 0x10, size 0x14 -} VS_BUFFER; - -typedef struct _VS { - // total size: 0x950 - u8 numBuffers; // offset 0x0, size 0x1 - u32 bufferLength; // offset 0x4, size 0x4 - VS_BUFFER streamBuffer[64]; // offset 0x8, size 0x900 - u8 voices[64]; // offset 0x908, size 0x40 - u16 nextInstID; // offset 0x948, size 0x2 - u32 (*callback)(u8, - const SND_VIRTUALSAMPLE_INFO*); // offset 0x94C, size 0x4 -} VS; - -extern VS vs; - -typedef struct _SPB { - // total size: 0x36 - u16 dpopLHi; // offset 0x0, size 0x2 - u16 dpopLLo; // offset 0x2, size 0x2 - u16 dpopLDelta; // offset 0x4, size 0x2 - u16 dpopRHi; // offset 0x6, size 0x2 - u16 dpopRLo; // offset 0x8, size 0x2 - u16 dpopRDelta; // offset 0xA, size 0x2 - u16 dpopSHi; // offset 0xC, size 0x2 - u16 dpopSLo; // offset 0xE, size 0x2 - u16 dpopSDelta; // offset 0x10, size 0x2 - u16 dpopALHi; // offset 0x12, size 0x2 - u16 dpopALLo; // offset 0x14, size 0x2 - u16 dpopALDelta; // offset 0x16, size 0x2 - u16 dpopARHi; // offset 0x18, size 0x2 - u16 dpopARLo; // offset 0x1A, size 0x2 - u16 dpopARDelta; // offset 0x1C, size 0x2 - u16 dpopASHi; // offset 0x1E, size 0x2 - u16 dpopASLo; // offset 0x20, size 0x2 - u16 dpopASDelta; // offset 0x22, size 0x2 - u16 dpopBLHi; // offset 0x24, size 0x2 - u16 dpopBLLo; // offset 0x26, size 0x2 - u16 dpopBLDelta; // offset 0x28, size 0x2 - u16 dpopBRHi; // offset 0x2A, size 0x2 - u16 dpopBRLo; // offset 0x2C, size 0x2 - u16 dpopBRDelta; // offset 0x2E, size 0x2 - u16 dpopBSHi; // offset 0x30, size 0x2 - u16 dpopBSLo; // offset 0x32, size 0x2 - u16 dpopBSDelta; // offset 0x34, size 0x2 -} _SPB; - -extern u16 voicePrioSortRootListRoot; -extern u8 voiceMusicRunning; -extern u8 voiceFxRunning; -extern u8 voiceListInsert; -extern u8 voiceListRoot; - -void vsInit(); /* extern */ -u32 vsSampleStartNotify(u8 voice); -void vsSampleEndNotify(u32 pubID); -void vsSampleUpdates(); - -void voiceSetPriority(SYNTH_VOICE* svoice, u8 prio); -u32 voiceIsLastStarted(SYNTH_VOICE* svoice); -void voiceSetLastStarted(SYNTH_VOICE* svoice); -void voiceResetLastStarted(SYNTH_VOICE* svoice); -void voiceInitLastStarted(); -s32 voiceKillSound(u32 voiceid); -void voiceKill(u32 vi); -void voiceSetPriority(SYNTH_VOICE* svoice, u8 prio); -u32 voiceIsLastStarted(SYNTH_VOICE* svoice); -void voiceSetLastStarted(SYNTH_VOICE* svoice); -void voiceResetLastStarted(SYNTH_VOICE* svoice); -void voiceInitLastStarted(); -s32 voiceKillSound(u32 voiceid); -void voiceKill(u32 vi); -u32 voiceBlock(u8 prio); -u32 voiceAllocate(u8 priority, u8 maxVoices, u16 allocId, u8 fxFlag); -#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 3) -int voiceAllocatePeek(u8 priority, u8 maxVoices, u32 allocId, u8 fxFlag, u32* currentAllocId); -#endif - -void voiceFree(SYNTH_VOICE* svoice); -void voiceUnblock(u32 voice); -void voiceRemovePriority(SYNTH_VOICE* svoice); - -void vidInit(); -u32 vidGetInternalId(SND_VOICEID id); -void vidRemoveVoiceReferences(SYNTH_VOICE* svoice); -u32 vidMakeNew(SYNTH_VOICE* svoice, u32 isMaster); -u32 vidMakeRoot(SYNTH_VOICE* svoice); - -#ifdef __cplusplus -} -#endif -#endif \ No newline at end of file diff --git a/src/musyx/runtime/CheapReverb/creverb.c b/src/musyx/runtime/CheapReverb/creverb.c deleted file mode 100644 index 937a4115..00000000 --- a/src/musyx/runtime/CheapReverb/creverb.c +++ /dev/null @@ -1,440 +0,0 @@ -/* --------------------------------------- - - - - - - - - - --------------------------------------- -*/ -#include "musyx/musyx.h" -#include "musyx/sal.h" -#include -#include -#include - -static void DLsetdelay(_SND_REVSTD_DELAYLINE* dl, s32 lag) { - dl->outPoint = dl->inPoint - (lag * sizeof(f32)); - while (dl->outPoint < 0) { - dl->outPoint += dl->length; - } -} - -static void DLcreate(_SND_REVSTD_DELAYLINE* dl, s32 len) { - dl->length = (s32)len * sizeof(f32); - dl->inputs = (f32*)salMalloc(len * sizeof(f32)); - memset(dl->inputs, 0, len * sizeof(len)); - dl->lastOutput = 0.f; - DLsetdelay(dl, len >> 1); - dl->inPoint = 0; - dl->outPoint = 0; -} - -static void DLdelete(_SND_REVSTD_DELAYLINE* dl) { salFree(dl->inputs); } - -bool ReverbSTDCreate(_SND_REVSTD_WORK* rv, float coloration, float time, float mix, float damping, - float predelay) { - static u32 lens[4] = {1789, 1999, 433, 149}; - u8 i; // r31 - u8 k; // r29 - - if ((coloration < 0.f || coloration > 1.f) || (time < .01f || time > 10.f) || - (mix < 0.f || mix > 1.f) || (damping < 0.f || damping > 1.f) || - (predelay < 0.f || predelay > 0.1f)) { - return FALSE; - } - - memset(rv, 0, sizeof(_SND_REVSTD_WORK)); - for (k = 0; k < 3; ++k) { - for (i = 0; i < 2; ++i) { - DLcreate(&rv->C[i + k * 2], lens[i] + 2); - DLsetdelay(&rv->C[i + k * 2], lens[i]); - rv->combCoef[i + k * 2] = powf(10.f, (int)(lens[i] * -3) / (time * 32000.f)); - } - for (i = 0; i < 2; ++i) { - DLcreate(&rv->AP[i + k * 2], lens[i + 2] + 2); - DLsetdelay(&rv->AP[i + k * 2], lens[i + 2]); - } - rv->lpLastout[k] = 0.f; - } - - rv->allPassCoeff = coloration; - rv->level = mix; - rv->damping = damping; - if (rv->damping < 0.05f) { - rv->damping = 0.05f; - } - - rv->damping = 1.f - (rv->damping * 0.8f + 0.05f); - - if (predelay != 0.f) { - rv->preDelayTime = (int)(predelay * 32000.f); - for (k = 0; k < 3; ++k) { - rv->preDelayLine[k] = salMalloc(rv->preDelayTime << 2); - memset(rv->preDelayLine[k], 0, rv->preDelayTime << 2); - rv->preDelayPtr[k] = rv->preDelayLine[k]; - } - } else { - rv->preDelayTime = 0; - for (k = 0; k < 3; ++k) { - rv->preDelayPtr[k] = NULL; - rv->preDelayLine[k] = NULL; - } - } - - return TRUE; -} - -bool ReverbSTDModify(_SND_REVSTD_WORK* rv, float coloration, float time, float mix, float damping, - float predelay) { - unsigned char i; // r31 - - if ((coloration < 0.f || coloration > 1.f) || (time < .01f || time > 10.f) || - (mix < 0.f || mix > 1.f) || (damping < 0.f || damping > 1.f) || - (predelay < 0.f || predelay > 0.1f)) { - return FALSE; - } - - rv->allPassCoeff = coloration; - rv->level = mix; - rv->damping = damping; - if (rv->damping < 0.05f) { - rv->damping = 0.05; - } - - rv->damping = 1.f - (rv->damping * 0.8f + 0.05f); - - for (i = 0; i < 6; ++i) { - DLdelete(&rv->AP[i]); - } - - for (i = 0; i < 6; ++i) { - DLdelete(&rv->C[i]); - } - - if (rv->preDelayTime != 0) { - for (i = 0; i < 3; ++i) { - salFree(rv->preDelayLine[i]); - } - } - - return ReverbSTDCreate(rv, coloration, time, mix, damping, predelay); -} - -#ifdef __MWERKS__ -static const float value0_3 = 0.3f; -static const float value0_6 = 0.6f; -static const double i2fMagic = 4.503601774854144E15; -static asm void HandleReverb(long* sptr, struct _SND_REVSTD_WORK* rv) { -#if 1 - nofralloc - stwu r1, -0x90(r1) - stmw r17, 8(r1) - stfd f14, 0x58(r1) - stfd f15, 0x60(r1) - stfd f16, 0x68(r1) - stfd f17, 0x70(r1) - stfd f18, 0x78(r1) - stfd f19, 0x80(r1) - stfd f20, 0x88(r1) - lis r31, value0_3@ha - lfs f6, value0_3@l(r31) - lis r31, value0_6@ha - lfs f9, value0_6@l(r31) - lis r31, i2fMagic@ha - lfd f5, i2fMagic@l(r31) - lfs f2, 0xf0(r4) - lfs f11, 0x11c(r4) - lfs f8, 0x118(r4) - fmuls f3, f8, f9 - fsubs f4, f9, f3 - lis r30, 0x4330 - stw r30, 0x50(r1) - li r5, 0 - -lbl_803B56C8: - slwi r31, r5, 3 - add r31, r31, r4 - lfs f19, 0xf4(r31) - lfs f20, 0xf8(r31) - slwi r31, r5, 2 - add r31, r31, r4 - lfs f7, 0x10c(r31) - lwz r27, 0x124(r31) - lwz r28, 0x130(r31) - lwz r31, 0x120(r4) - addi r22, r31, -1 - slwi r22, r22, 2 - add r22, r22, r27 - cmpwi cr7, r31, 0 - mulli r31, r5, 0x28 - addi r29, r4, 0x78 - add r29, r29, r31 - addi r30, r4, 0 - add r30, r30, r31 - lwz r21, 0(r29) - lwz r20, 4(r29) - lwz r19, 0x14(r29) - lwz r18, 0x18(r29) - lfs f15, 0x10(r29) - lfs f16, 0x24(r29) - lwz r26, 8(r29) - lwz r25, 0x1c(r29) - lwz r7, 0xc(r29) - lwz r8, 0x20(r29) - lwz r12, 0(r30) - lwz r11, 4(r30) - lwz r10, 0x14(r30) - lwz r9, 0x18(r30) - lfs f17, 0x10(r30) - lfs f18, 0x24(r30) - lwz r24, 8(r30) - lwz r23, 0x1c(r30) - lwz r17, 0xc(r30) - lwz r6, 0x20(r30) - lwz r30, 0(r3) - xoris r30, r30, 0x8000 - stw r30, 0x54(r1) - lfd f12, 0x50(r1) - fsubs f12, f12, f5 - li r31, 0x9f - mtctr r31 - -lbl_803B5780: - fmr f13, f12 - beq cr7, lbl_803B57A0 - lfs f13, 0(r28) - addi r28, r28, 4 - cmpw r28, r22 - stfs f12, -4(r28) - bne+ lbl_803B57A0 - mr r28, r27 - -lbl_803B57A0: - - fmadds f8, f19, f15, f13 - lwzu r29, 4(r3) - fmadds f9, f20, f16, f13 - stfsx f8, r7, r21 - addi r21, r21, 4 - stfsx f9, r8, r19 - lfsx f14, r7, r20 - addi r20, r20, 4 - lfsx f16, r8, r18 - cmpw r21, r26 - cmpw cr1, r20, r26 - addi r19, r19, 4 - addi r18, r18, 4 - fmr f15, f14 - cmpw cr5, r19, r25 - fadds f14, f14, f16 - cmpw cr6, r18, r25 - bne+ lbl_803B57EC - li r21, 0 - -lbl_803B57EC: - xoris r29, r29, 0x8000 - fmadds f9, f2, f17, f14 - bne+ cr1, lbl_803B57FC - li r20, 0 - -lbl_803B57FC: - stw r29, 0x54(r1) - bne+ cr5, lbl_803B5808 - li r19, 0 - -lbl_803B5808: - stfsx f9, r17, r12 - fnmsubs f14, f2, f9, f17 - addi r12, r12, 4 - bne+ cr6, lbl_803B581C - li r18, 0 - -lbl_803B581C: - lfsx f17, r17, r11 - cmpw cr5, r12, r24 - addi r11, r11, 4 - cmpw cr6, r11, r24 - bne+ cr5, lbl_803B5834 - li r12, 0 - -lbl_803B5834: - bne+ cr6, lbl_803B583C - li r11, 0 - -lbl_803B583C: - fmuls f14, f14, f6 - lfd f10, 0x50(r1) - fmadds f14, f11, f7, f14 - fmadds f9, f2, f18, f14 - fmr f7, f14 - stfsx f9, r6, r10 - fnmsubs f14, f2, f9, f18 - fmuls f8, f4, f12 - lfsx f18, r6, r9 - addi r10, r10, 4 - addi r9, r9, 4 - fmadds f14, f3, f14, f8 - cmpw cr5, r10, r23 - cmpw cr6, r9, r23 - fctiwz f14, f14 - bne+ cr5, lbl_803B5880 - li r10, 0 - -lbl_803B5880: - bne+ cr6, lbl_803B5888 - li r9, 0 - -lbl_803B5888: - li r31, -4 - fsubs f12, f10, f5 - stfiwx f14, r3, r31 - bdnz lbl_803B5780 - fmr f13, f12 - beq cr7, lbl_803B58B8 - lfs f13, 0(r28) - addi r28, r28, 4 - cmpw r28, r22 - stfs f12, -4(r28) - bne+ lbl_803B58B8 - mr r28, r27 - -lbl_803B58B8: - fmadds f8, f19, f15, f13 - fmadds f9, f20, f16, f13 - stfsx f8, r7, r21 - addi r21, r21, 4 - stfsx f9, r8, r19 - lfsx f14, r7, r20 - addi r20, r20, 4 - lfsx f16, r8, r18 - cmpw r21, r26 - cmpw cr1, r20, r26 - addi r19, r19, 4 - addi r18, r18, 4 - fmr f15, f14 - cmpw cr5, r19, r25 - fadds f14, f14, f16 - cmpw cr6, r18, r25 - bne+ lbl_803B5900 - li r21, 0 - -lbl_803B5900: - fmadds f9, f2, f17, f14 - bne+ cr1, lbl_803B590C - li r20, 0 - -lbl_803B590C: - bne+ cr5, lbl_803B5914 - li r19, 0 - -lbl_803B5914: - stfsx f9, r17, r12 - fnmsubs f14, f2, f9, f17 - addi r12, r12, 4 - bne+ cr6, lbl_803B5928 - li r18, 0 - -lbl_803B5928: - lfsx f17, r17, r11 - cmpw cr5, r12, r24 - addi r11, r11, 4 - cmpw cr6, r11, r24 - bne+ cr5, lbl_803B5940 - li r12, 0 - -lbl_803B5940: - bne+ cr6, lbl_803B5948 - li r11, 0 - -lbl_803B5948: - - fmuls f14, f14, f6 - fmadds f14, f11, f7, f14 - mulli r31, r5, 0x28 - fmadds f9, f2, f18, f14 - fmr f7, f14 - addi r29, r4, 0x78 - add r29, r29, r31 - stfsx f9, r6, r10 - fnmsubs f14, f2, f9, f18 - fmuls f8, f4, f12 - lfsx f18, r6, r9 - addi r10, r10, 4 - - addi r9, r9, 4 - fmadds f14, f3, f14, f8 - cmpw cr5, r10, r23 - cmpw cr6, r9, r23 - - fctiwz f14, f14 - bne+ cr5, lbl_803B5994 - li r10, 0 - -lbl_803B5994: - bne+ cr6, lbl_803B599C - li r9, 0 - -lbl_803B599C: - addi r30, r4, 0 - add r30, r30, r31 - stfiwx f14, r0, r3 - stw r21, 0(r29) - stw r20, 4(r29) - stw r19, 0x14(r29) - stw r18, 0x18(r29) - addi r3, r3, 4 - stfs f15, 0x10(r29) - stfs f16, 0x24(r29) - slwi r31, r5, 2 - add r31, r31, r4 - addi r5, r5, 1 - stw r12, 0(r30) - stw r11, 4(r30) - stw r10, 0x14(r30) - stw r9, 0x18(r30) - cmpwi r5, 3 - stfs f17, 0x10(r30) - stfs f18, 0x24(r30) - stfs f7, 0x10c(r31) - stw r28, 0x130(r31) - bne lbl_803B56C8 - lfd f14, 0x58(r1) - lfd f15, 0x60(r1) - lfd f16, 0x68(r1) - lfd f17, 0x70(r1) - lfd f18, 0x78(r1) - lfd f19, 0x80(r1) - lfd f20, 0x88(r1) - lmw r17, 8(r1) - addi r1, r1, 0x90 - - blr -#endif -} -#else -static void HandleReverb(s32* sptr, struct _SND_REVSTD_WORK* rv) { - // TODO: Reimplement this in C -} -#endif - -void ReverbSTDCallback(s32* left, s32* right, s32* surround, _SND_REVSTD_WORK* rv) { - HandleReverb(left, rv); -} - -void ReverbSTDFree(_SND_REVSTD_WORK* rv) { - u8 i; // r31 - for (i = 0; i < 6; ++i) { - DLdelete(&rv->AP[i]); - } - for (i = 0; i < 6; ++i) { - DLdelete(&rv->C[i]); - } - if (rv->preDelayTime != 0) { - for (i = 0; i < 3; ++i) { - salFree(rv->preDelayLine[i]); - } - } -} diff --git a/src/musyx/runtime/CheapReverb/creverb_fx.c b/src/musyx/runtime/CheapReverb/creverb_fx.c deleted file mode 100644 index b639305b..00000000 --- a/src/musyx/runtime/CheapReverb/creverb_fx.c +++ /dev/null @@ -1,56 +0,0 @@ -/* --------------------------------------- - - - - - - - - - --------------------------------------- -*/ - -#include "musyx/musyx.h" - -#include "musyx/assert.h" - -// TODO: Cleanup and move externs to header -extern bool ReverbSTDCreate(_SND_REVSTD_WORK* rv, f32 coloration, f32 time, f32 mix, f32 damping, - f32 preDelay); -extern void ReverbSTDFree(_SND_REVSTD_WORK* rev); -extern void ReverbSTDCallback(s32* left, s32* right, s32* surround, _SND_REVSTD_WORK* rv); -extern unsigned long ReverbSTDModify(_SND_REVSTD_WORK* rv, float coloration, float time, float mix, - float damping, float predelay); - -void sndAuxCallbackReverbSTD(u8 reason, SND_AUX_INFO* info, void* user) { - switch (reason) { - case SND_AUX_REASON_BUFFERUPDATE: - if ((u8)((SND_AUX_REVERBSTD*)user)->tempDisableFX == 0) { - ReverbSTDCallback(info->data.bufferUpdate.left, info->data.bufferUpdate.right, - info->data.bufferUpdate.surround, &((SND_AUX_REVERBSTD*)user)->rv); - } - break; - case SND_AUX_REASON_PARAMETERUPDATE: - // UNIMPLEMENTED - break; - default: - MUSY_ASSERT(FALSE); - break; - } -} -bool sndAuxCallbackUpdateSettingsReverbSTD(SND_AUX_REVERBSTD* rev) { - rev->tempDisableFX = TRUE; - ReverbSTDModify(&rev->rv, rev->coloration, rev->time, rev->mix, rev->damping, rev->preDelay); - rev->tempDisableFX = FALSE; - return TRUE; -} - -bool sndAuxCallbackPrepareReverbSTD(SND_AUX_REVERBSTD* rev) { - rev->tempDisableFX = 0; - return ReverbSTDCreate(&rev->rv, rev->coloration, rev->time, rev->mix, rev->damping, - rev->preDelay); -} -bool sndAuxCallbackShutdownReverbSTD(SND_AUX_REVERBSTD* rev) { - ReverbSTDFree(&rev->rv); - return TRUE; -} diff --git a/src/musyx/runtime/Chorus/chorus_fx.c b/src/musyx/runtime/Chorus/chorus_fx.c deleted file mode 100644 index d1498f6e..00000000 --- a/src/musyx/runtime/Chorus/chorus_fx.c +++ /dev/null @@ -1,665 +0,0 @@ -#include "musyx/musyx.h" - -#include "musyx/sal.h" -#include "musyx/assert.h" - -static float rsmpTab12khz[512] = { - 0.097503662109f, 0.802215576172f, 0.101593017578f, -0.000976562500f, 0.093505859375f, - 0.802032470703f, 0.105804443359f, -0.001037597656f, 0.089599609375f, 0.801696777344f, - 0.110107421875f, -0.001159667969f, 0.085784912109f, 0.801177978516f, 0.114471435547f, - -0.001281738281f, 0.082031250000f, 0.800476074219f, 0.118927001953f, -0.001403808594f, - 0.078369140625f, 0.799621582031f, 0.123474121094f, -0.001525878906f, 0.074798583984f, - 0.798614501953f, 0.128143310547f, -0.001647949219f, 0.071350097656f, 0.797424316406f, - 0.132873535156f, -0.001770019531f, 0.067962646484f, 0.796051025391f, 0.137695312500f, - -0.001922607422f, 0.064697265625f, 0.794525146484f, 0.142608642578f, -0.002044677734f, - 0.061492919922f, 0.792846679688f, 0.147613525391f, -0.002197265625f, 0.058349609375f, - 0.790985107422f, 0.152709960938f, -0.002319335938f, 0.055328369141f, 0.788940429688f, - 0.157897949219f, -0.002471923828f, 0.052368164062f, 0.786743164062f, 0.163177490234f, - -0.002655029297f, 0.049499511719f, 0.784423828125f, 0.168518066406f, -0.002807617188f, - 0.046722412109f, 0.781890869141f, 0.173980712891f, -0.002990722656f, 0.044006347656f, - 0.779205322266f, 0.179504394531f, -0.003143310547f, 0.041412353516f, 0.776367187500f, - 0.185119628906f, -0.003326416016f, 0.038879394531f, 0.773376464844f, 0.190826416016f, - -0.003509521484f, 0.036407470703f, 0.770233154297f, 0.196594238281f, -0.003692626953f, - 0.034027099609f, 0.766937255859f, 0.202484130859f, -0.003875732422f, 0.031738281250f, - 0.763488769531f, 0.208435058594f, -0.004058837891f, 0.029510498047f, 0.759857177734f, - 0.214447021484f, -0.004272460938f, 0.027374267578f, 0.756103515625f, 0.220550537109f, - -0.004455566406f, 0.025299072266f, 0.752197265625f, 0.226745605469f, -0.004669189453f, - 0.023315429688f, 0.748168945312f, 0.233001708984f, -0.004852294922f, 0.021392822266f, - 0.743988037109f, 0.239318847656f, -0.005065917969f, 0.019561767578f, 0.739654541016f, - 0.245727539062f, -0.005310058594f, 0.017791748047f, 0.735198974609f, 0.252197265625f, - -0.005523681641f, 0.016052246094f, 0.730590820312f, 0.258728027344f, -0.005706787109f, - 0.014404296875f, 0.725860595703f, 0.265350341797f, -0.005920410156f, 0.012817382812f, - 0.721008300781f, 0.272033691406f, -0.006164550781f, 0.011322021484f, 0.716003417969f, - 0.278778076172f, -0.006378173828f, 0.009887695312f, 0.710906982422f, 0.285583496094f, - -0.006561279297f, 0.008514404297f, 0.705657958984f, 0.292449951172f, -0.006774902344f, - 0.007202148438f, 0.700317382812f, 0.299346923828f, -0.007019042969f, 0.005920410156f, - 0.694854736328f, 0.306335449219f, -0.007232666016f, 0.004699707031f, 0.689270019531f, - 0.313385009766f, -0.007415771484f, 0.003570556641f, 0.683563232422f, 0.320465087891f, - -0.007629394531f, 0.002471923828f, 0.677734375000f, 0.327606201172f, -0.007873535156f, - 0.001434326172f, 0.671844482422f, 0.334777832031f, -0.008087158203f, 0.000457763672f, - 0.665832519531f, 0.341979980469f, -0.008270263672f, -0.000488281250f, 0.659729003906f, - 0.349243164062f, -0.008453369141f, -0.001342773438f, 0.653533935547f, 0.356567382812f, - -0.008636474609f, -0.002166748047f, 0.647216796875f, 0.363891601562f, -0.008850097656f, - -0.002960205078f, 0.640838623047f, 0.371276855469f, -0.009033203125f, -0.003692626953f, - 0.634338378906f, 0.378692626953f, -0.009216308594f, -0.004364013672f, 0.627777099609f, - 0.386138916016f, -0.009338378906f, -0.004974365234f, 0.621154785156f, 0.393615722656f, - -0.009490966797f, -0.005584716797f, 0.614440917969f, 0.401092529297f, -0.009643554688f, - -0.006134033203f, 0.607635498047f, 0.408599853516f, -0.009796142578f, -0.006652832031f, - 0.600769042969f, 0.416107177734f, -0.009918212891f, -0.007141113281f, 0.593841552734f, - 0.423645019531f, -0.010009765625f, -0.007568359375f, 0.586853027344f, 0.431213378906f, - -0.010131835938f, -0.007965087891f, 0.579772949219f, 0.438751220703f, -0.010223388672f, - -0.008331298828f, 0.572662353516f, 0.446319580078f, -0.010284423828f, -0.008666992188f, - 0.565521240234f, 0.453887939453f, -0.010345458984f, -0.008972167969f, 0.558319091797f, - 0.461456298828f, -0.010406494141f, -0.009216308594f, 0.551055908203f, 0.469024658203f, - -0.010406494141f, -0.009460449219f, 0.543731689453f, 0.476593017578f, -0.010406494141f, - -0.009674072266f, 0.536407470703f, 0.484130859375f, -0.010375976562f, -0.009857177734f, - 0.529022216797f, 0.491668701172f, -0.010375976562f, -0.010009765625f, 0.521606445312f, - 0.499176025391f, -0.010314941406f, -0.010131835938f, 0.514160156250f, 0.506683349609f, - -0.010253906250f, -0.010253906250f, 0.506683349609f, 0.514160156250f, -0.010131835938f, - -0.010314941406f, 0.499176025391f, 0.521606445312f, -0.010009765625f, -0.010375976562f, - 0.491668701172f, 0.529022216797f, -0.009857177734f, -0.010375976562f, 0.484130859375f, - 0.536407470703f, -0.009674072266f, -0.010406494141f, 0.476593017578f, 0.543731689453f, - -0.009460449219f, -0.010406494141f, 0.469024658203f, 0.551055908203f, -0.009216308594f, - -0.010406494141f, 0.461456298828f, 0.558319091797f, -0.008972167969f, -0.010345458984f, - 0.453887939453f, 0.565521240234f, -0.008666992188f, -0.010284423828f, 0.446319580078f, - 0.572662353516f, -0.008331298828f, -0.010223388672f, 0.438751220703f, 0.579772949219f, - -0.007965087891f, -0.010131835938f, 0.431213378906f, 0.586853027344f, -0.007568359375f, - -0.010009765625f, 0.423645019531f, 0.593841552734f, -0.007141113281f, -0.009918212891f, - 0.416107177734f, 0.600769042969f, -0.006652832031f, -0.009796142578f, 0.408599853516f, - 0.607635498047f, -0.006134033203f, -0.009643554688f, 0.401092529297f, 0.614440917969f, - -0.005584716797f, -0.009490966797f, 0.393615722656f, 0.621154785156f, -0.004974365234f, - -0.009338378906f, 0.386138916016f, 0.627777099609f, -0.004364013672f, -0.009216308594f, - 0.378692626953f, 0.634338378906f, -0.003692626953f, -0.009033203125f, 0.371276855469f, - 0.640838623047f, -0.002960205078f, -0.008850097656f, 0.363891601562f, 0.647216796875f, - -0.002166748047f, -0.008636474609f, 0.356567382812f, 0.653533935547f, -0.001342773438f, - -0.008453369141f, 0.349243164062f, 0.659729003906f, -0.000488281250f, -0.008270263672f, - 0.341979980469f, 0.665832519531f, 0.000457763672f, -0.008087158203f, 0.334777832031f, - 0.671844482422f, 0.001434326172f, -0.007873535156f, 0.327606201172f, 0.677734375000f, - 0.002471923828f, -0.007629394531f, 0.320465087891f, 0.683563232422f, 0.003570556641f, - -0.007415771484f, 0.313385009766f, 0.689270019531f, 0.004699707031f, -0.007232666016f, - 0.306335449219f, 0.694854736328f, 0.005920410156f, -0.007019042969f, 0.299346923828f, - 0.700317382812f, 0.007202148438f, -0.006774902344f, 0.292449951172f, 0.705657958984f, - 0.008514404297f, -0.006561279297f, 0.285583496094f, 0.710906982422f, 0.009887695312f, - -0.006378173828f, 0.278778076172f, 0.716003417969f, 0.011322021484f, -0.006164550781f, - 0.272033691406f, 0.721008300781f, 0.012817382812f, -0.005920410156f, 0.265350341797f, - 0.725860595703f, 0.014404296875f, -0.005706787109f, 0.258728027344f, 0.730590820312f, - 0.016052246094f, -0.005523681641f, 0.252197265625f, 0.735198974609f, 0.017791748047f, - -0.005310058594f, 0.245727539062f, 0.739654541016f, 0.019561767578f, -0.005065917969f, - 0.239318847656f, 0.743988037109f, 0.021392822266f, -0.004852294922f, 0.233001708984f, - 0.748168945312f, 0.023315429688f, -0.004669189453f, 0.226745605469f, 0.752197265625f, - 0.025299072266f, -0.004455566406f, 0.220550537109f, 0.756103515625f, 0.027374267578f, - -0.004272460938f, 0.214447021484f, 0.759857177734f, 0.029510498047f, -0.004058837891f, - 0.208435058594f, 0.763488769531f, 0.031738281250f, -0.003875732422f, 0.202484130859f, - 0.766937255859f, 0.034027099609f, -0.003692626953f, 0.196594238281f, 0.770233154297f, - 0.036407470703f, -0.003509521484f, 0.190826416016f, 0.773376464844f, 0.038879394531f, - -0.003326416016f, 0.185119628906f, 0.776367187500f, 0.041412353516f, -0.003143310547f, - 0.179504394531f, 0.779205322266f, 0.044006347656f, -0.002990722656f, 0.173980712891f, - 0.781890869141f, 0.046722412109f, -0.002807617188f, 0.168518066406f, 0.784423828125f, - 0.049499511719f, -0.002655029297f, 0.163177490234f, 0.786743164062f, 0.052368164062f, - -0.002471923828f, 0.157897949219f, 0.788940429688f, 0.055328369141f, -0.002319335938f, - 0.152709960938f, 0.790985107422f, 0.058349609375f, -0.002197265625f, 0.147613525391f, - 0.792846679688f, 0.061492919922f, -0.002044677734f, 0.142608642578f, 0.794525146484f, - 0.064697265625f, -0.001922607422f, 0.137695312500f, 0.796051025391f, 0.067962646484f, - -0.001770019531f, 0.132873535156f, 0.797424316406f, 0.071350097656f, -0.001647949219f, - 0.128143310547f, 0.798614501953f, 0.074798583984f, -0.001525878906f, 0.123474121094f, - 0.799621582031f, 0.078369140625f, -0.001403808594f, 0.118927001953f, 0.800476074219f, - 0.082031250000f, -0.001281738281f, 0.114471435547f, 0.801177978516f, 0.085784912109f, - -0.001159667969f, 0.110107421875f, 0.801696777344f, 0.089599609375f, -0.001037597656f, - 0.105804443359f, 0.802032470703f, 0.093505859375f, -0.000976562500f, 0.101593017578f, - 0.802215576172f, 0.097503662109f, -}; - -const double i2fMagic = 4.503601774854144E15; - -#ifdef __MWERKS__ -// clang-format off -static asm void do_src1(_SND_CHORUS_SRCINFO* src) { - nofralloc - - stwu r1, -0x40(sp) - stmw r26, 0x28(sp) - - - lwz r4, 0xc(r3) - lwz r5, 0x10(r3) - - lwz r6, 0x14(r3) - - lwz r8, 0x1c(r3) - lwz r7, 0x20(r3) - - lwz r31, 4(r3) - - lwz r30, 0(r3) - - lwz r9, 8(r3) - - lis r10, 0x4330 - stw r10, 8(sp) - stw r10, 0x10(sp) - stw r10, 0x18(sp) - stw r10, 0x20(sp) - - lis r10, i2fMagic@ha - lfd f9, i2fMagic@l(r10) - - slwi r10, r5, 2 - lwz r11, 0(r9) - - lwz r29, 4(r9) - lwz r28, 8(r9) - lwzx r27, r31, r10 - - xoris r11, r11, 0x8000 - xoris r29, r29, 0x8000 - stw r11, 0xc(sp) - xoris r28, r28, 0x8000 - stw r29, 0x14(sp) - xoris r27, r27, 0x8000 - stw r28, 0x1c(sp) - lfd f1, 8(sp) - stw r27, 0x24(sp) - lfd f2, 0x10(sp) - fsubs f1, f1, f9 - lfd f3, 0x18(sp) - fsubs f2, f2, f9 - lfd f4, 0x20(sp) - fsubs f3, f3, f9 - fsubs f4, f4, f9 - - li r26, -4 - - lis r12, rsmpTab12khz@ha - addi r12, r12, rsmpTab12khz@l - - li r9, 0xa0 - mtctr r9 -lbl_803B6D5C: - rlwinm r10, r4, 7, 0x15, 0x1b - - addc r4, r4, r6 - - add r10, r10, r12 - - mcrxr cr0 - - lfs f5, 0(r10) - - beq lbl_803B6DA4 - - lfs f6, 4(r10) - - fmuls f10, f1, f5 - - lfs f7, 8(r10) - - fmadds f10, f2, f6, f10 - - lfs f8, 0xc(r10) - - fmadds f10, f3, f7, f10 - - addi r30, r30, 4 - - fmadds f10, f4, f8, f10 - - fctiwz f10, f10 - - stfiwx f10, r26, r30 - - bdnz lbl_803B6D5C - - b lbl_803B6E10 - - -lbl_803B6DA4: - addi r5, r5, 1 - - lfs f6, 4(r10) - - fmuls f10, f1, f5 - - cmpw r5, r8 - - fmr f1, f2 - - lfs f7, 8(r10) - - fmadds f10, f2, f6, f10 - - fmr f2, f3 - - lfs f8, 0xc(r10) - - fmadds f10, f3, f7, f10 - - addi r30, r30, 4 - - fmr f3, f4 - - bne+ lbl_803B6DDC - mr r5, r7 - -lbl_803B6DDC: - fmadds f10, f4, f8, f10 - - slwi r9, r5, 2 - - bdz lbl_803B6E08 - - lwzx r10, r9, r31 - - fctiwz f10, f10 - - xoris r10, r10, 0x8000 - - stw r10, 0xc(sp) - - stfiwx f10, r26, r30 - - lfd f4, 8(sp) - - fsubs f4, f4, f9 - - b lbl_803B6D5C - - -lbl_803B6E08: - fctiwz f10, f10 - stfiwx f10, r26, r30 - - -lbl_803B6E10: - lwz r9, 8(r3) - - fctiwz f1, f1 - fctiwz f2, f2 - fctiwz f3, f3 - - stfiwx f1, r0, r9 - addi r10, r9, 4 - stfiwx f2, r0, r10 - addi r10, r9, 8 - stfiwx f3, r0, r10 - - stw r4, 0xc(r3) - stw r5, 0x10(r3) - - lmw r26, 0x28(sp) - addi r1, r1, 0x40 - blr -} -/* clang-format on */ -#else -static void do_src1(_SND_CHORUS_SRCINFO* src) { - // TODO: Reimplement in C -} -#endif - -#ifdef __MWERKS__ -/* clang-format off */ -static asm void do_src2(register _SND_CHORUS_SRCINFO* src) { -#define posLoV r4 -#define posHiV r5 -#define pitchLoV r6 -#define triggerV r8 -#define targetV r7 -#define oldPtr r9 -#define destPtr r30 -#define smpBasePtr r31 - - nofralloc; - /* Save stack state to stack */ - stwu r1, -0x40(sp); - stmw r26, 0x28(sp); - - lwz posLoV, src->posLo; - lwz posHiV, src->posHi; - - lwz pitchLoV, src->pitchLo; - - lwz triggerV, src->trigger; - lwz targetV, src->target; - - lwz smpBasePtr, src->smpBase; - - lwz destPtr, src->dest; - - lwz oldPtr, src->old; - /* Store upper portion of int->float conversion constant */ - lis r10, 0x4330; - stw r10, 0x08(sp); - stw r10, 0x10(sp); - stw r10, 0x18(sp); - stw r10, 0x20(sp); - - lis r10, i2fMagic @ha; - lfd f9, i2fMagic @l(r10); - - // posHi * 4 - slwi r10, posHiV, 2; - lwz r11, 0(oldPtr); - lwz r29, 4(oldPtr); - lwz r28, 8(oldPtr); - lwzx r27, smpBasePtr, r10; - - xoris r11, r11, 0x8000; - xoris r29, r29, 0x8000; - stw r11, 0xc(sp); - xoris r28, r28, 0x8000; - stw r29, 0x14(sp); - xoris r27, r27, 0x8000; - stw r28, 0x1c(sp); - lfd f1, 0x08(sp); - stw r27, 0x24(sp); - lfd f2, 0x10(sp); - fsubs f1, f1, f9; - lfd f3, 0x18(sp); - fsubs f2, f2, f9; - lfd f4, 0x20(sp); - fsubs f3, f3, f9; - fsubs f4, f4, f9; - /* Some offset? */ - li r26, -4; - - lis r12, rsmpTab12khz @ha; - addi r12, r12, rsmpTab12khz @l; - - li r9, 0xa0; - mtctr r9; -lbl_803B6EF4: - rlwinm r10, posLoV, 7, 0x15, 0x1b; - - addc posLoV, posLoV, pitchLoV; - - add r10, r10, r12; - - mcrxr cr0; - - addi posHiV, posHiV, 1; - - lfs f5, 0(r10); - - beq lbl_803B6F70; - - lfs f6, 4(r10); - - fmuls f10, f1, f5; - - cmpw posHiV, triggerV; - - fmr f1, f2; - - lfs f7, 8(r10); - - fmadds f10, f2, f6, f10; - - fmr f2, f3; - - lfs f8, 0xc(r10); - - fmadds f10, f3, f7, f10; - - addi destPtr, destPtr, 4; - - fmr f3, f4; - - bne + lbl_803B6F44; - mr posHiV, targetV; - -lbl_803B6F44: - fmadds f10, f4, f8, f10; - - slwi r9, posHiV, 2; - - bdz lbl_803B6FF4; - - lwzx r10, r9, smpBasePtr; - - fctiwz f10, f10; - - xoris r10, r10, 0x8000; - - stw r10, 0xc(sp); - - stfiwx f10, r26, destPtr; - - lfd f4, 8(sp); - - fsubs f4, f4, f9; - - b lbl_803B6EF4; - -lbl_803B6F70: - - cmpw posHiV, triggerV; - - lfs f6, 4(r10); - - bne + lbl_803B6F80; - mr posHiV, targetV; - -lbl_803B6F80: - - slwi r11, posHiV, 2; - addi posHiV, posHiV, 1; - - lwzx r29, r11, smpBasePtr; - - fmuls f10, f1, f5; - - cmpw posHiV, triggerV; - xoris r29, r29, 0x8000; - - fmr f1, f3; - - lfs f7, 8(r10); - - stw r29, 0xc(sp); - - fmadds f10, f2, f6, f10; - - lfs f8, 0xc(r10); - - fmadds f10, f3, f7, f10; - - lfd f3, 8(sp); - - fmr f2, f4; - - addi destPtr, destPtr, 4; - - fsubs f3, f3, f9; - - bne + lbl_803B6FC8; - mr posHiV, targetV; - -lbl_803B6FC8: - - fmadds f10, f4, f8, f10; - - slwi r9, posHiV, 2; - - bdz lbl_803B6FF4; - - lwzx r10, r9, smpBasePtr; - - fctiwz f10, f10; - - xoris r10, r10, 0x8000; - - stw r10, 0xc(sp); - - stfiwx f10, r26, destPtr; - lfd f4, 8(sp); - fsubs f4, f4, f9; - - b lbl_803B6EF4; - -lbl_803B6FF4: - - fctiwz f10, f10; - stfiwx f10, r26, destPtr; - - lwz r9, 8(r3); - - fctiwz f1, f1; - fctiwz f2, f2; - fctiwz f3, f3; - stfiwx f1, r0, r9; - addi r10, r9, 4; - stfiwx f2, r0, r10; - addi r10, r9, 8; - stfiwx f3, r0, r10; - - stw posLoV, src->posLo; - stw posHiV, src->posHi; - - /* Pop and restore LR to original values */ - lmw r26, 0x28(sp); - addi r1, r1, 0x40; - blr; - -#undef posLoV -#undef posHiV -#undef pitchLoV -#undef triggerV -#undef targetV -#undef oldPtr -#undef destPtr -#undef smpBasePtr -} -#else -static void do_src2(register _SND_CHORUS_SRCINFO* src) { - // TODO: Reimplement in C -} -#endif - -void sndAuxCallbackChorus(u8 reason, SND_AUX_INFO* info, void* user) { - SND_AUX_CHORUS* c; - s32 *leftD, *rightD, *surD, *leftS, *rightS, *surS; - u32 i; - u8 nextCurrentLast; - switch (reason) { - case SND_AUX_REASON_BUFFERUPDATE: - c = (SND_AUX_CHORUS*)user; - nextCurrentLast = (c->work.currentLast + 1) % 3; - leftD = c->work.lastLeft[nextCurrentLast]; - rightD = c->work.lastRight[nextCurrentLast]; - surD = c->work.lastSur[nextCurrentLast]; - leftS = info->data.bufferUpdate.left; - rightS = info->data.bufferUpdate.right; - surS = info->data.bufferUpdate.surround; - - for (i = 0; i < 160; ++i) { - *leftD = *leftS++; - leftD++; - *rightD = *rightS++; - rightD++; - *surD = *surS++; - surD++; - } - - c->work.src.pitchHi = (c->work.pitchOffset >> 0x10) + 1; - c->work.src.pitchLo = ((c->work.pitchOffset & 0xFFFF) << 16); - if (--c->work.pitchOffsetPeriodCount == 0) { - c->work.pitchOffsetPeriodCount = c->work.pitchOffsetPeriod; - c->work.pitchOffset = -c->work.pitchOffset; - } - - for (i = 0; i < 3; ++i) { - c->work.src.posHi = c->work.currentPosHi; - c->work.src.posLo = c->work.currentPosLo; - switch (i) { - case 0: - c->work.src.smpBase = c->work.lastLeft[0]; - c->work.src.dest = info->data.bufferUpdate.left; - c->work.src.old = c->work.oldLeft; - break; - case 1: - c->work.src.smpBase = c->work.lastRight[0]; - c->work.src.dest = info->data.bufferUpdate.right; - c->work.src.old = c->work.oldRight; - break; - case 2: - c->work.src.smpBase = c->work.lastSur[0]; - c->work.src.dest = info->data.bufferUpdate.surround; - c->work.src.old = c->work.oldSur; - break; - } - - switch (c->work.src.pitchHi) { - case 0: - do_src1(&c->work.src); - break; - case 1: - do_src2(&c->work.src); - break; - } - } - - c->work.currentPosHi = c->work.src.posHi % 480; - c->work.currentPosLo = c->work.src.posLo; - c->work.currentLast = nextCurrentLast; - break; - case SND_AUX_REASON_PARAMETERUPDATE: - break; - default: - #line 957 - MUSY_ASSERT(FALSE); - break; - } -} - -bool sndAuxCallbackUpdateSettingsChorus(SND_AUX_CHORUS* ch) { - ch->work.currentPosHi = 0x140 - ((ch->baseDelay - 5) << 5); - ch->work.currentPosLo = 0; - ch->work.currentPosHi = (ch->work.currentPosHi + (ch->work.currentLast - 1) * 0xa0) % 0x1e0; - ch->work.pitchOffsetPeriod = (ch->period / 5) + 1 & ~1; - ch->work.pitchOffsetPeriodCount = (u32)ch->work.pitchOffsetPeriod >> 1; - ch->work.pitchOffset = (ch->variation << 16) / (ch->work.pitchOffsetPeriod * 5); - return TRUE; -} - -bool sndAuxCallbackPrepareChorus(SND_AUX_CHORUS* chorus) { - u32 i; - s32* lastLeft; - s32* lastRight; - s32* lastSur; - - chorus->work.lastLeft[0] = (s32*)salMalloc(0x1680); - - if (chorus->work.lastLeft[0] != NULL) { - chorus->work.lastRight[0] = chorus->work.lastLeft[0] + 0x1e0; - chorus->work.lastSur[0] = chorus->work.lastRight[0] + 0x1e0; - - for (i = 1; i < 3; ++i) { - chorus->work.lastLeft[i] = chorus->work.lastLeft[0] + i * 0xa0; - chorus->work.lastRight[i] = chorus->work.lastRight[0] + i * 0xa0; - chorus->work.lastSur[i] = chorus->work.lastSur[0] + i * 0xa0; - } - - lastLeft = chorus->work.lastLeft[0]; - lastRight = chorus->work.lastRight[0]; - lastSur = chorus->work.lastSur[0]; - for (i = 0; i < 0x140; i += 1) { - *lastLeft++ = 0; - *lastRight++ = 0; - *lastSur++ = 0; - } - - chorus->work.currentLast = 1; - chorus->work.oldLeft[0] = chorus->work.oldLeft[1] = chorus->work.oldLeft[2] = chorus->work.oldLeft[3] = 0; - chorus->work.oldRight[0] = chorus->work.oldRight[1] = chorus->work.oldRight[2] = chorus->work.oldRight[3] = 0; - chorus->work.oldSur[0] = chorus->work.oldSur[1] = chorus->work.oldSur[2] = chorus->work.oldSur[3] = 0; - chorus->work.src.trigger = 480; - chorus->work.src.target = 0; - return sndAuxCallbackUpdateSettingsChorus(chorus); - } - return FALSE; -} - -bool sndAuxCallbackShutdownChorus(SND_AUX_CHORUS* ch) { - salFree(ch->work.lastLeft[0]); - return TRUE; -} diff --git a/src/musyx/runtime/Delay/delay_fx.c b/src/musyx/runtime/Delay/delay_fx.c deleted file mode 100644 index 51de2509..00000000 --- a/src/musyx/runtime/Delay/delay_fx.c +++ /dev/null @@ -1,118 +0,0 @@ -/* --------------------------------------- - - - - - - - - - --------------------------------------- -*/ -#include "musyx/musyx.h" - -#include "musyx/assert.h" -#include "musyx/sal.h" - -void sndAuxCallbackDelay(u8 reason, SND_AUX_INFO* info, void* user) { - s32 l; // r30 - s32 r; // r29 - s32 s; // r28 - s32* lBuf; // r27 - s32* rBuf; // r26 - s32* sBuf; // r25 - u32 i; // r24 - SND_AUX_DELAY* c; // r31 - s32* left; // r23 - s32* right; // r22 - s32* sur; // r21 - - switch (reason) { - case SND_AUX_REASON_BUFFERUPDATE: - c = (SND_AUX_DELAY*)user; - left = info->data.bufferUpdate.left; - right = info->data.bufferUpdate.right; - sur = info->data.bufferUpdate.surround; - lBuf = c->left + (c->currentPos[0] * 160); - rBuf = c->right + (c->currentPos[1] * 160); - sBuf = c->sur + (c->currentPos[2] * 160); - for (i = 0; i < 160; ++i) { - - l = *lBuf; - r = *rBuf; - s = *sBuf; - - *lBuf++ = *left + ((s32)(l * c->currentFeedback[0]) >> 7); - *rBuf++ = *right + ((s32)(r * c->currentFeedback[1]) >> 7); - *sBuf++ = *sur + ((s32)(s * c->currentFeedback[2]) >> 7); - - *left++ = (s32)(l * c->currentOutput[0]) >> 7; - *right++ = (s32)(r * c->currentOutput[1]) >> 7; - *sur++ = (s32)(s * c->currentOutput[2]) >> 7; - } - - c->currentPos[0] = (c->currentPos[0] + 1) % c->currentSize[0]; - c->currentPos[1] = (c->currentPos[1] + 1) % c->currentSize[1]; - c->currentPos[2] = (c->currentPos[2] + 1) % c->currentSize[2]; - break; - case SND_AUX_REASON_PARAMETERUPDATE: - break; - default: - MUSY_ASSERT(FALSE); - break; - } -} - -bool sndAuxCallbackUpdateSettingsDelay(SND_AUX_DELAY* delay) { - u32 i; - s32* left; - s32* right; - s32* sur; - sndAuxCallbackShutdownDelay(delay); - - for (i = 0; i < 3; ++i) { - delay->currentSize[i] = ((delay->delay[i] - 5) * 32 + 159) / 160; - delay->currentPos[i] = 0; - delay->currentFeedback[i] = (delay->feedback[i] << 7) / 100; - delay->currentOutput[i] = (delay->output[i] << 7) / 100; - } - - delay->left = (s32*)salMalloc(delay->currentSize[0] * 160 * 4); - delay->right = (s32*)salMalloc(delay->currentSize[1] * 160 * 4); - delay->sur = (s32*)salMalloc(delay->currentSize[2] * 160 * 4); - - /* clang-format off */ - MUSY_ASSERT(delay->left!=NULL); - MUSY_ASSERT(delay->right!=NULL); - MUSY_ASSERT(delay->sur!=NULL); - /* clang-format on */ - left = delay->left; - right = delay->right; - sur = delay->sur; - - for (i = 0; i < delay->currentSize[0] * 160; ++i) { - *left++ = 0; - } - - for (i = 0; i < delay->currentSize[1] * 160; ++i) { - *right++ = 0; - } - for (i = 0; i < delay->currentSize[2] * 160; ++i) { - *sur++ = 0; - } - return TRUE; -} - -bool sndAuxCallbackPrepareDelay(SND_AUX_DELAY* delay) { - delay->left = NULL; - return sndAuxCallbackUpdateSettingsDelay(delay); -} - -bool sndAuxCallbackShutdownDelay(SND_AUX_DELAY* delay) { - if (delay->left != NULL) { - salFree(delay->left); - salFree(delay->right); - salFree(delay->sur); - } - return TRUE; -} diff --git a/src/musyx/runtime/StdReverb/reverb.c b/src/musyx/runtime/StdReverb/reverb.c deleted file mode 100644 index ac9c802e..00000000 --- a/src/musyx/runtime/StdReverb/reverb.c +++ /dev/null @@ -1,634 +0,0 @@ -#include -#include - -#include "musyx/musyx.h" - -#include "musyx/sal.h" - -static void DLsetdelay(_SND_REVHI_DELAYLINE* delayline, s32 len) { - delayline->outPoint = delayline->inPoint - (len * sizeof(f32)); - while (delayline->outPoint < 0) { - delayline->outPoint += delayline->length; - } -} - -static void DLcreate(_SND_REVHI_DELAYLINE* delayline, s32 length) { - delayline->length = (s32)length * sizeof(f32); - delayline->inputs = (f32*)salMalloc(length * sizeof(f32)); - memset(delayline->inputs, 0, length * sizeof(length)); - delayline->lastOutput = 0.f; - DLsetdelay(delayline, length >> 1); - delayline->inPoint = 0; - delayline->outPoint = 0; -} - -static void DLdelete(_SND_REVHI_DELAYLINE* delayline) { salFree(delayline->inputs); } -bool ReverbHICreate(_SND_REVHI_WORK* rev, f32 coloration, f32 time, f32 mix, f32 damping, - f32 preDelay, f32 crosstalk) { - static int lens[] = {1789, 1999, 2333, 433, 149, 47, 73, 67}; - unsigned char i; // r31 - unsigned char k; // r29 - if (coloration < 0.f || coloration > 1.f || time < 0.01f || time > 10.f || mix < 0.f || - mix > 1.f || crosstalk < 0.f || crosstalk > 1.f || damping < 0.f || damping > 1.f || - preDelay < 0.f || preDelay > 0.1f) { - return FALSE; - } - - memset(rev, 0, sizeof(_SND_REVHI_WORK)); - - for (k = 0; k < 3; ++k) { - for (i = 0; i < 3; ++i) { - DLcreate(&rev->C[i + k * 3], lens[i] + 2); - DLsetdelay(&rev->C[i + k * 3], lens[i]); - rev->combCoef[i + k * 3] = powf(10.f, (lens[i] * -3) / (32000.f * time)); - } - - for (i = 0; i < 2; ++i) { - DLcreate(&rev->AP[i + k * 3], lens[i + 3] + 2); - DLsetdelay(&rev->AP[i + k * 3], lens[i + 3]); - } - DLcreate(&rev->AP[k * 3 + 2], lens[k + 5] + 2); - DLsetdelay(&rev->AP[k * 3 + 2], lens[k + 5]); - rev->lpLastout[k] = 0.f; - } - - rev->allPassCoeff = coloration; - rev->level = mix; - rev->crosstalk = crosstalk; - rev->damping = damping; - if (rev->damping < 0.05f) { - rev->damping = 0.05f; - } - - rev->damping = 1.f - (rev->damping * 0.8f + 0.05f); - if (preDelay != 0.f) { - rev->preDelayTime = preDelay * 32000.f; - for (i = 0; i < 3; ++i) { - rev->preDelayLine[i] = (f32*)salMalloc(rev->preDelayTime * sizeof(f32)); - memset(rev->preDelayLine[i], 0, rev->preDelayTime * sizeof(f32)); - rev->preDelayPtr[i] = rev->preDelayLine[i]; - } - } else { - rev->preDelayTime = 0; - for (i = 0; i < 3; ++i) { - rev->preDelayPtr[i] = NULL; - rev->preDelayLine[i] = NULL; - } - } - - return TRUE; -} - -bool ReverbHIModify(struct _SND_REVHI_WORK* rv, float coloration, float time, float mix, - float damping, float preDelay, float crosstalk) { - u8 i; // r30 - - if (coloration < 0.f || coloration > 1.f || time < 0.01f || time > 10.f || mix < 0.f || - mix > 1.f || crosstalk < 0.f || crosstalk > 1.f || damping < 0.f || damping > 1.f || - preDelay < 0.f || preDelay > 0.1f) { - return FALSE; - } - - rv->allPassCoeff = coloration; - rv->level = mix; - rv->crosstalk = crosstalk; - rv->damping = damping; - if (rv->damping < 0.05f) { - rv->damping = 0.05f; - } - - rv->damping = 1.f - (rv->damping * 0.8f + 0.05f); - - for (i = 0; i < 9; ++i) { - DLdelete(&rv->AP[i]); - } - - for (i = 0; i < 9; ++i) { - DLdelete(&rv->C[i]); - } - - if (rv->preDelayTime != 0) { - for (i = 0; i < 3; ++i) { - salFree(rv->preDelayLine[i]); - } - } - - return ReverbHICreate(rv, coloration, time, mix, damping, preDelay, crosstalk); -} - -#ifdef __MWERKS__ -static const float value0_3 = 0.3f; -static const float value0_6 = 0.6f; -static const double i2fMagic = 4.503601774854144E15; - -/* clang-format off */ -/* TODO: Properly rework these to use input arguments and cleanup ASM */ -static asm void DoCrossTalk(s32* a, s32* b, f32 start, f32 end) { - nofralloc - stwu r1, -0x30(r1) - stfd f14, 0x28(r1) - lis r5, i2fMagic@ha - lfd f0, i2fMagic@l(r5) - lis r5, 0x4330 - stw r5, 0x8(r1) - stw r5, 0x10(r1) - stw r5, 0x18(r1) - stw r5, 0x20(r1) - ps_merge00 f3, f2, f1 - ps_merge00 f4, f1, f2 - lis r5, value0_6@ha - lfs f5, value0_6@l(r5) - li r5, 0x4f - mtctr r5 - li r10, -0x8 - li r11, -0x4 - ps_muls0 f4, f4, f5 - lwz r6, 0x0(r3) - lwz r7, 0x0(r4) - xoris r6, r6, 0x8000 - lwz r8, 0x4(r3) - xoris r7, r7, 0x8000 - lwz r9, 0x4(r4) - xoris r8, r8, 0x8000 - stw r6, 0xc(r1) - xoris r9, r9, 0x8000 - stw r7, 0x14(r1) - stw r8, 0x1c(r1) - stw r9, 0x24(r1) - lfd f5, 0x8(r1) - lfd f6, 0x10(r1) - fsubs f5, f5, f0 - lfd f7, 0x18(r1) - fsubs f6, f6, f0 - lfd f8, 0x20(r1) - fsubs f7, f7, f0 - fsubs f8, f8, f0 -L_00000710: - ps_merge00 f9, f5, f6 - lwzu r6, 0x8(r3) - ps_merge00 f10, f7, f8 - lwzu r7, 0x8(r4) - xoris r6, r6, 0x8000 - lwz r8, 0x4(r3) - ps_mul f11, f9, f3 - xoris r7, r7, 0x8000 - ps_mul f12, f9, f4 - lwz r9, 0x4(r4) - ps_mul f13, f10, f3 - xoris r8, r8, 0x8000 - ps_mul f14, f10, f4 - stw r6, 0xc(r1) - ps_sum0 f11, f11, f11, f11 - xoris r9, r9, 0x8000 - ps_sum0 f12, f12, f12, f12 - stw r7, 0x14(r1) - ps_sum0 f13, f13, f13, f13 - stw r8, 0x1c(r1) - ps_sum0 f14, f14, f14, f14 - stw r9, 0x24(r1) - fctiw f11, f11 - lfd f5, 0x8(r1) - fctiw f12, f12 - lfd f6, 0x10(r1) - fctiw f13, f13 - fsubs f5, f5, f0 - fctiw f14, f14 - lfd f7, 0x18(r1) - stfiwx f11, r10, r3 - fsubs f6, f6, f0 - stfiwx f12, r10, r4 - lfd f8, 0x20(r1) - stfiwx f13, r11, r3 - fsubs f7, f7, f0 - stfiwx f14, r11, r4 - fsubs f8, f8, f0 - bdnz L_00000710 - ps_merge00 f9, f5, f6 - addi r3, r3, 0x8 - ps_merge00 f10, f7, f8 - addi r4, r4, 0x8 - ps_mul f11, f9, f3 - ps_mul f12, f9, f4 - ps_mul f13, f10, f3 - ps_mul f14, f10, f4 - ps_sum0 f11, f11, f11, f11 - ps_sum0 f12, f12, f12, f12 - ps_sum0 f13, f13, f13, f13 - ps_sum0 f14, f14, f14, f14 - fctiw f11, f11 - fctiw f12, f12 - fctiw f13, f13 - fctiw f14, f14 - stfiwx f11, r10, r3 - stfiwx f12, r10, r4 - stfiwx f13, r11, r3 - stfiwx f14, r11, r4 - lfd f14, 0x28(r1) - addi r1, r1, 0x30 - blr -} -#else -/* clang-format on */ -static void DoCrossTalk(s32* a, s32* b, f32 start, f32 end) { - // TODO: Reimplement in C -} -#endif - -#ifdef __MWERKS__ -/* clang-format off */ -static asm void HandleReverb(s32*, SND_AUX_REVERBHI* rev, s32) { - nofralloc - stwu r1, -0xc0(r1) - stmw r14, 0x8(r1) - stfd f14, 0x60(r1) - stfd f15, 0x68(r1) - stfd f16, 0x70(r1) - stfd f17, 0x78(r1) - stfd f18, 0x80(r1) - stfd f19, 0x88(r1) - stfd f20, 0x90(r1) - stfd f21, 0x98(r1) - stfd f22, 0xa0(r1) - stfd f23, 0xa8(r1) - stfd f24, 0xb0(r1) - stfd f25, 0xb8(r1) - stw r5, 0x50(r1) - stw r4, 0x54(r1) - lis r31, value0_3@ha - lfs f6, value0_3@l(r31) - lis r31, value0_6@ha - lfs f9, value0_6@l(r31) - lis r31, i2fMagic@ha - lfd f5, i2fMagic@l(r31) - lfs f2, 0x168(r4) - lfs f15, 0x1a0(r4) - lfs f8, 0x19c(r4) - fmuls f3, f8, f9 - fsubs f4, f9, f3 - slwi r30, r5, 1 - add r30, r30, r5 - mulli r31, r30, 0x14 - addi r29, r4, 0xb4 - add r29, r29, r31 - addi r27, r4, 0x0 - add r27, r27, r31 - slwi r31, r30, 2 - add r31, r31, r4 - lfs f22, 0x16c(r31) - lfs f23, 0x170(r31) - lfs f24, 0x174(r31) - slwi r31, r5, 2 - add r31, r31, r4 - lfs f25, 0x190(r31) - lwz r31, 0x1a4(r4) - lis r30, 0x4330 - stw r30, 0x58(r1) - addi r22, r31, -0x1 - slwi r22, r22, 2 - slwi r28, r5, 2 - add r28, r28, r4 - cmpwi cr7, r31, 0x0 - lwz r21, 0x0(r29) - lwz r20, 0x4(r29) - lwz r19, 0x14(r29) - lwz r18, 0x18(r29) - lwz r17, 0x28(r29) - lwz r16, 0x2c(r29) - lfs f16, 0x10(r29) - lfs f17, 0x24(r29) - lfs f18, 0x38(r29) - lwz r25, 0x8(r29) - lwz r24, 0x1c(r29) - lwz r23, 0x30(r29) - lwz r4, 0xc(r29) - lwz r5, 0x20(r29) - lwz r6, 0x34(r29) - lwz r12, 0x0(r27) - lwz r11, 0x4(r27) - lwz r10, 0x14(r27) - lwz r9, 0x18(r27) - lwz r8, 0x28(r27) - lwz r7, 0x2c(r27) - lfs f19, 0x10(r27) - lfs f20, 0x24(r27) - lfs f21, 0x38(r27) - lwz r15, 0x8(r27) - lwz r14, 0x1c(r27) - lwz r30, 0x0(r3) - xoris r30, r30, 0x8000 - stw r30, 0x5c(r1) - lfd f12, 0x58(r1) - fsubs f12, f12, f5 - li r31, 0x9f - mtctr r31 -L_00000954: - fmr f13, f12 - beq cr7, L_00000984 - lwz r30, 0x1ac(r28) - lwz r29, 0x1b8(r28) - add r31, r22, r30 - addi r29, r29, 0x4 - lfs f13, -0x4(r29) - cmpw r29, r31 - stfs f12, -0x4(r29) - bne+ L_00000980 - mr r29, r30 -L_00000980: - stw r29, 0x1b8(r30) -L_00000984: - fmadds f8, f22, f16, f13 - lwzu r29, 0x4(r3) - fmadds f9, f23, f17, f13 - stfsx f8, r4, r21 - addi r21, r21, 0x4 - stfsx f9, r5, r19 - lfsx f14, r4, r20 - addi r20, r20, 0x4 - lfsx f17, r5, r18 - cmpw r21, r25 - cmpw cr1, r20, r25 - addi r19, r19, 0x4 - addi r18, r18, 0x4 - fmr f16, f14 - cmpw cr5, r19, r24 - fadds f14, f14, f17 - cmpw cr6, r18, r24 - bne+ L_000009D0 - li r21, 0x0 -L_000009D0: - fmadds f8, f24, f18, f13 - bne+ cr1, L_000009DC - li r20, 0x0 -L_000009DC: - stfsx f8, r6, r17 - addi r17, r17, 0x4 - bne+ cr5, L_000009EC - li r19, 0x0 -L_000009EC: - lfsx f18, r6, r16 - addi r16, r16, 0x4 - cmpw r17, r23 - bne+ cr6, L_00000A00 - li r18, 0x0 -L_00000A00: - fadds f14, f14, f18 - cmpw cr1, r16, r23 - lwz r26, 0xc(r27) - fmadds f9, f2, f19, f14 - bne+ L_00000A18 - li r17, 0x0 -L_00000A18: - bne+ cr1, L_00000A20 - li r16, 0x0 -L_00000A20: - xoris r29, r29, 0x8000 - stfsx f9, r26, r12 - fnmsubs f14, f2, f9, f19 - addi r12, r12, 0x4 - lfsx f19, r26, r11 - cmpw cr5, r12, r15 - addi r11, r11, 0x4 - lwz r26, 0x20(r27) - cmpw cr6, r11, r15 - fmadds f8, f2, f20, f14 - bne+ cr5, L_00000A50 - li r12, 0x0 -L_00000A50: - stw r29, 0x5c(r1) - stfsx f8, r26, r10 - fnmsubs f14, f2, f8, f20 - addi r10, r10, 0x4 - bne+ cr6, L_00000A68 - li r11, 0x0 -L_00000A68: - lfsx f20, r26, r9 - cmpw r10, r14 - fmuls f14, f14, f6 - addi r9, r9, 0x4 - cmpw cr1, r9, r14 - lfd f10, 0x58(r1) - fmadds f14, f15, f25, f14 - bne+ L_00000A8C - li r10, 0x0 -L_00000A8C: - lwz r26, 0x34(r27) - fmadds f9, f2, f21, f14 - fmr f25, f14 - bne+ cr1, L_00000AA0 - li r9, 0x0 -L_00000AA0: - stfsx f9, r26, r8 - fnmsubs f14, f2, f9, f21 - lwz r31, 0x30(r27) - fmuls f8, f4, f12 - lfsx f21, r26, r7 - addi r8, r8, 0x4 - addi r7, r7, 0x4 - fmadds f14, f3, f14, f8 - cmpw cr5, r8, r31 - cmpw cr6, r7, r31 - fctiwz f14, f14 - bne+ cr5, L_00000AD4 - li r8, 0x0 -L_00000AD4: - bne+ cr6, L_00000ADC - li r7, 0x0 -L_00000ADC: - li r31, -0x4 - fsubs f12, f10, f5 - stfiwx f14, r3, r31 - bdnz L_00000954 - fmr f13, f12 - beq cr7, L_00000B1C - lwz r30, 0x1ac(r28) - lwz r29, 0x1b8(r28) - add r31, r22, r30 - addi r29, r29, 0x4 - lfs f13, -0x4(r29) - cmpw r29, r31 - stfs f12, -0x4(r29) - bne+ L_00000B18 - mr r29, r30 -L_00000B18: - stw r29, 0x1b8(r30) -L_00000B1C: - fmadds f8, f22, f16, f13 - fmadds f9, f23, f17, f13 - stfsx f8, r4, r21 - addi r21, r21, 0x4 - stfsx f9, r5, r19 - lfsx f14, r4, r20 - addi r20, r20, 0x4 - lfsx f17, r5, r18 - cmpw r21, r25 - cmpw cr1, r20, r25 - addi r19, r19, 0x4 - addi r18, r18, 0x4 - fmr f16, f14 - cmpw cr5, r19, r24 - fadds f14, f14, f17 - cmpw cr6, r18, r24 - bne+ L_00000B64 - li r21, 0x0 -L_00000B64: - fmadds f8, f24, f18, f13 - bne+ cr1, L_00000B70 - li r20, 0x0 -L_00000B70: - stfsx f8, r6, r17 - addi r17, r17, 0x4 - bne+ cr5, L_00000B80 - li r19, 0x0 -L_00000B80: - lfsx f18, r6, r16 - addi r16, r16, 0x4 - cmpw r17, r23 - bne+ cr6, L_00000B94 - li r18, 0x0 -L_00000B94: - fadds f14, f14, f18 - cmpw cr1, r16, r23 - lwz r26, 0xc(r27) - fmadds f9, f2, f19, f14 - bne+ L_00000BAC - li r17, 0x0 -L_00000BAC: - bne+ cr1, L_00000BB4 - li r16, 0x0 -L_00000BB4: - stfsx f9, r26, r12 - fnmsubs f14, f2, f9, f19 - addi r12, r12, 0x4 - lfsx f19, r26, r11 - cmpw cr5, r12, r15 - addi r11, r11, 0x4 - lwz r26, 0x20(r27) - cmpw cr6, r11, r15 - fmadds f8, f2, f20, f14 - bne+ cr5, L_00000BE0 - li r12, 0x0 -L_00000BE0: - stfsx f8, r26, r10 - fnmsubs f14, f2, f8, f20 - addi r10, r10, 0x4 - bne+ cr6, L_00000BF4 - li r11, 0x0 -L_00000BF4: - lfsx f20, r26, r9 - cmpw r10, r14 - fmuls f14, f14, f6 - addi r9, r9, 0x4 - cmpw cr1, r9, r14 - fmadds f14, f15, f25, f14 - bne+ L_00000C14 - li r10, 0x0 -L_00000C14: - lwz r26, 0x34(r27) - lwz r5, 0x50(r1) - lwz r4, 0x54(r1) - fmadds f9, f2, f21, f14 - fmr f25, f14 - bne+ cr1, L_00000C30 - li r9, 0x0 -L_00000C30: - stfsx f9, r26, r8 - fnmsubs f14, f2, f9, f21 - lwz r29, 0x30(r27) - fmuls f8, f4, f12 - lfsx f21, r26, r7 - addi r8, r8, 0x4 - addi r7, r7, 0x4 - fmadds f14, f3, f14, f8 - cmpw cr5, r8, r29 - cmpw cr6, r7, r29 - fctiwz f14, f14 - bne+ cr5, L_00000C64 - li r8, 0x0 -L_00000C64: - bne+ cr6, L_00000C6C - li r7, 0x0 -L_00000C6C: - slwi r30, r5, 1 - add r30, r30, r5 - mulli r31, r30, 0x14 - stfiwx f14, r0, r3 - addi r29, r4, 0xb4 - add r29, r29, r31 - stw r21, 0x0(r29) - stw r20, 0x4(r29) - stw r19, 0x14(r29) - stw r18, 0x18(r29) - stw r17, 0x28(r29) - stw r16, 0x2c(r29) - stfs f16, 0x10(r29) - stfs f17, 0x24(r29) - stfs f18, 0x38(r29) - stw r12, 0x0(r27) - stw r11, 0x4(r27) - stw r10, 0x14(r27) - stw r9, 0x18(r27) - stw r8, 0x28(r27) - stw r7, 0x2c(r27) - stfs f19, 0x10(r27) - stfs f20, 0x24(r27) - stfs f21, 0x38(r27) - slwi r31, r5, 2 - add r31, r31, r4 - stfs f25, 0x190(r31) - lfd f14, 0x60(r1) - lfd f15, 0x68(r1) - lfd f16, 0x70(r1) - lfd f17, 0x78(r1) - lfd f18, 0x80(r1) - lfd f19, 0x88(r1) - lfd f20, 0x90(r1) - lfd f21, 0x98(r1) - lfd f22, 0xa0(r1) - lfd f23, 0xa8(r1) - lfd f24, 0xb0(r1) - lfd f25, 0xb8(r1) - lmw r14, 0x8(r1) - addi r1, r1, 0xc0 - blr -} -/* clang-format on */ -#else -static void HandleReverb(s32*, SND_AUX_REVERBHI* rev, s32) { - // TODO: Reimplement in C -} -#endif - -void ReverbHICallback(s32* left, s32* right, s32* surround, SND_AUX_REVERBHI* rev) { - u8 i; - for (i = 0; i < 3; ++i) { - switch (i) { - case 0: - if (rev->rv.crosstalk != 0.f) { - DoCrossTalk(left, right, rev->rv.crosstalk * 0.5f, 1.f - (rev->rv.crosstalk * 0.5f)); - } - HandleReverb(left, rev, 0); - break; - case 1: - HandleReverb(right, rev, 1); - break; - case 2: - HandleReverb(surround, rev, 2); - break; - } - } -} - -void ReverbHIFree(_SND_REVHI_WORK* rv) { - u8 i; - for (i = 0; i < 9; ++i) { - DLdelete(&rv->AP[i]); - } - for (i = 0; i < 9; ++i) { - DLdelete(&rv->C[i]); - } - if (rv->preDelayTime != 0) { - for (i = 0; i < 3; ++i) { - salFree(rv->preDelayLine[i]); - } - } -} diff --git a/src/musyx/runtime/StdReverb/reverb_fx.c b/src/musyx/runtime/StdReverb/reverb_fx.c deleted file mode 100644 index fd0f2d70..00000000 --- a/src/musyx/runtime/StdReverb/reverb_fx.c +++ /dev/null @@ -1,58 +0,0 @@ -/* --------------------------------------- - - - - - - - - - --------------------------------------- -*/ - -#include "musyx/musyx.h" - -#include "musyx/assert.h" - -extern bool ReverbHICreate(_SND_REVHI_WORK* rev, f32 coloration, f32 time, f32 mix, f32 damping, - f32 preDelay, f32 crosstalk); -extern void ReverbHIFree(_SND_REVHI_WORK* rev); -extern void ReverbHIModify(_SND_REVHI_WORK* rev, f32 coloration, f32 time, f32 mix, f32 damping, - f32 preDelay, f32 crosstalk); -extern void ReverbHICallback(s32* left, s32* right, s32* surround, SND_AUX_REVERBHI* rev); - -void sndAuxCallbackReverbHI(u8 reason, SND_AUX_INFO* info, void* user) { - switch (reason) { - case SND_AUX_REASON_BUFFERUPDATE: - if (((SND_AUX_REVERBHI*)user)->tempDisableFX == 0) { - ReverbHICallback(info->data.bufferUpdate.left, info->data.bufferUpdate.right, - info->data.bufferUpdate.surround, (SND_AUX_REVERBHI*)user); - } - - break; - case SND_AUX_REASON_PARAMETERUPDATE: - break; - default: - MUSY_ASSERT(FALSE); - break; - } -} - -bool sndAuxCallbackUpdateSettingsReverbHI(SND_AUX_REVERBHI* rev) { - rev->tempDisableFX = TRUE; - ReverbHIModify(&rev->rv, rev->coloration, rev->time, rev->mix, rev->damping, rev->preDelay, - rev->crosstalk); - rev->tempDisableFX = FALSE; - return TRUE; -} - -bool sndAuxCallbackPrepareReverbHI(SND_AUX_REVERBHI* rev) { - rev->tempDisableFX = FALSE; - return ReverbHICreate(&rev->rv, rev->coloration, rev->time, rev->mix, rev->damping, rev->preDelay, - rev->crosstalk); -} - -bool sndAuxCallbackShutdownReverbHI(SND_AUX_REVERBHI* rev) { - ReverbHIFree(&rev->rv); - return TRUE; -} diff --git a/src/musyx/runtime/dsp_import.c b/src/musyx/runtime/dsp_import.c deleted file mode 100644 index 56a40086..00000000 --- a/src/musyx/runtime/dsp_import.c +++ /dev/null @@ -1,423 +0,0 @@ -#include "musyx/dsp_import.h" -#if MUSY_TARGET == MUSY_TARGET_DOLPHIN - -char dspSlave[0x19E0] ATTRIBUTE_ALIGN(32) = { - 0x00, 0x00, 0x00, 0x00, 0x02, 0x9F, 0x0C, 0x10, 0x02, 0x9F, 0x0C, 0x1F, 0x02, 0x9F, 0x0C, 0x3B, - 0x02, 0x9F, 0x0C, 0x4A, 0x02, 0x9F, 0x0C, 0x50, 0x02, 0x9F, 0x0C, 0x82, 0x02, 0x9F, 0x0C, 0x88, - 0x13, 0x02, 0x13, 0x03, 0x12, 0x04, 0x13, 0x05, 0x13, 0x06, 0x8E, 0x00, 0x8C, 0x00, 0x8B, 0x00, - 0x00, 0x92, 0x00, 0xFF, 0x81, 0x00, 0x89, 0x00, 0x00, 0x9E, 0x0E, 0x80, 0x00, 0xFE, 0x0E, 0x1B, - 0x81, 0x00, 0x00, 0xFE, 0x0E, 0x31, 0x16, 0xFC, 0xDC, 0xD1, 0x16, 0xFD, 0x00, 0x00, 0x16, 0xFB, - 0x00, 0x01, 0x26, 0xFC, 0x02, 0xA0, 0x80, 0x00, 0x02, 0x9C, 0x00, 0x29, 0x02, 0x9F, 0x00, 0x45, - 0x13, 0x02, 0x13, 0x03, 0x12, 0x04, 0x13, 0x05, 0x13, 0x06, 0x8E, 0x00, 0x8C, 0x00, 0x8B, 0x00, - 0x00, 0x92, 0x00, 0xFF, 0x16, 0xFC, 0xDC, 0xD1, 0x16, 0xFD, 0x00, 0x01, 0x16, 0xFB, 0x00, 0x01, - 0x26, 0xFC, 0x02, 0xA0, 0x80, 0x00, 0x02, 0x9C, 0x00, 0x40, 0x8E, 0x00, 0x81, 0x00, 0x89, 0x00, - 0x00, 0x9F, 0xBA, 0xBE, 0x26, 0xFE, 0x02, 0xC0, 0x80, 0x00, 0x02, 0x9C, 0x00, 0x4A, 0x82, 0x00, - 0x02, 0x94, 0x00, 0x4A, 0x23, 0xFF, 0x81, 0x00, 0x26, 0xFE, 0x02, 0xC0, 0x80, 0x00, 0x02, 0x9C, - 0x00, 0x54, 0x27, 0xFF, 0x02, 0x40, 0x7F, 0xFF, 0x2E, 0xCE, 0x2F, 0xCF, 0x16, 0xCD, 0x0C, 0x00, - 0x81, 0x00, 0x2E, 0xC9, 0x1F, 0xFB, 0x2F, 0xCB, 0x02, 0xBF, 0x05, 0x5C, 0x00, 0x80, 0x0C, 0x00, - 0x8E, 0x00, 0x81, 0x00, 0x89, 0x70, 0xB1, 0x00, 0x02, 0x91, 0x00, 0x7E, 0x0A, 0x12, 0xC1, 0x00, - 0x02, 0x92, 0x00, 0x7E, 0x00, 0x9F, 0x0A, 0xFF, 0x4C, 0x00, 0x1C, 0x7E, 0x02, 0x13, 0x1C, 0x7E, - 0x17, 0x6F, 0x16, 0xFC, 0xFB, 0xAD, 0x16, 0xFD, 0x80, 0x80, 0x00, 0x21, 0x16, 0xFC, 0xBA, 0xAD, - 0x2E, 0xFD, 0x00, 0x21, 0x81, 0x00, 0x89, 0x70, 0x8E, 0x78, 0x2E, 0xCE, 0x2F, 0xCF, 0x00, 0x9E, - 0x0E, 0x44, 0x2E, 0xCD, 0x0E, 0x00, 0x2E, 0xC9, 0x00, 0x9E, 0x00, 0x40, 0x2E, 0xCB, 0x00, 0x81, - 0x0E, 0x44, 0x00, 0x82, 0x00, 0x00, 0x00, 0x9B, 0x00, 0x9F, 0x00, 0x9A, 0x01, 0x40, 0x81, 0x00, - 0x89, 0x00, 0x8F, 0x00, 0x02, 0xBF, 0x05, 0x5C, 0x19, 0x3E, 0x19, 0x3C, 0xB1, 0x00, 0x19, 0x3F, - 0x02, 0x94, 0x00, 0xA6, 0x00, 0x5A, 0x1B, 0x5E, 0x02, 0x9F, 0x00, 0xAE, 0x99, 0x00, 0x1B, 0x5E, - 0x1B, 0x5C, 0x00, 0x7B, 0x00, 0xAD, 0x4C, 0x00, 0x1B, 0x5E, 0x1B, 0x5C, 0x19, 0x3E, 0x19, 0x3C, - 0xB1, 0x00, 0x19, 0x3F, 0x02, 0x94, 0x00, 0xB8, 0x00, 0x5A, 0x1B, 0x5E, 0x02, 0x9F, 0x00, 0xC0, - 0x99, 0x00, 0x1B, 0x5E, 0x1B, 0x5C, 0x00, 0x7B, 0x00, 0xBF, 0x4C, 0x00, 0x1B, 0x5E, 0x1B, 0x5C, - 0x19, 0x3E, 0x19, 0x3C, 0xB1, 0x00, 0x19, 0x3F, 0x02, 0x94, 0x00, 0xCA, 0x00, 0x5A, 0x1B, 0x5E, - 0x02, 0x9F, 0x00, 0xD2, 0x99, 0x00, 0x1B, 0x5E, 0x1B, 0x5C, 0x00, 0x7B, 0x00, 0xD1, 0x4C, 0x00, - 0x1B, 0x5E, 0x1B, 0x5C, 0x00, 0x82, 0x04, 0x00, 0x19, 0x3E, 0x19, 0x3C, 0xB1, 0x79, 0x02, 0x94, - 0x00, 0xDD, 0x00, 0x5A, 0x1B, 0x5E, 0x02, 0x9F, 0x00, 0xE5, 0x99, 0x00, 0x1B, 0x5E, 0x1B, 0x5C, - 0x00, 0x7B, 0x00, 0xE4, 0x4C, 0x00, 0x1B, 0x5E, 0x1B, 0x5C, 0x19, 0x3E, 0x19, 0x3C, 0xB1, 0x79, - 0x02, 0x94, 0x00, 0xEE, 0x00, 0x5A, 0x1B, 0x5E, 0x02, 0x9F, 0x00, 0xF6, 0x99, 0x00, 0x1B, 0x5E, - 0x1B, 0x5C, 0x00, 0x7B, 0x00, 0xF5, 0x4C, 0x00, 0x1B, 0x5E, 0x1B, 0x5C, 0x19, 0x3E, 0x19, 0x3C, - 0xB1, 0x79, 0x02, 0x94, 0x00, 0xFF, 0x00, 0x5A, 0x1B, 0x5E, 0x02, 0x9F, 0x01, 0x07, 0x99, 0x00, - 0x1B, 0x5E, 0x1B, 0x5C, 0x00, 0x7B, 0x01, 0x06, 0x4C, 0x00, 0x1B, 0x5E, 0x1B, 0x5C, 0x00, 0x82, - 0x07, 0xC0, 0x19, 0x3E, 0x19, 0x3C, 0xB1, 0x79, 0x02, 0x94, 0x01, 0x12, 0x00, 0x5A, 0x1B, 0x5E, - 0x02, 0x9F, 0x01, 0x1A, 0x99, 0x00, 0x1B, 0x5E, 0x1B, 0x5C, 0x00, 0x7B, 0x01, 0x19, 0x4C, 0x00, - 0x1B, 0x5E, 0x1B, 0x5C, 0x19, 0x3E, 0x19, 0x3C, 0xB1, 0x79, 0x02, 0x94, 0x01, 0x23, 0x00, 0x5A, - 0x1B, 0x5E, 0x02, 0x9F, 0x01, 0x2B, 0x99, 0x00, 0x1B, 0x5E, 0x1B, 0x5C, 0x00, 0x7B, 0x01, 0x2A, - 0x4C, 0x00, 0x1B, 0x5E, 0x1B, 0x5C, 0x19, 0x3E, 0x19, 0x3C, 0xB1, 0x79, 0x02, 0x94, 0x01, 0x34, - 0x00, 0x5A, 0x1B, 0x5E, 0x02, 0x9F, 0x01, 0x3C, 0x99, 0x00, 0x1B, 0x5E, 0x1B, 0x5C, 0x00, 0x7B, - 0x01, 0x3B, 0x4C, 0x00, 0x1B, 0x5E, 0x1B, 0x5C, 0x02, 0x9F, 0x00, 0x68, 0x00, 0x85, 0xFF, 0xFF, - 0x81, 0x50, 0x89, 0x40, 0x8E, 0x48, 0x00, 0xFA, 0x0E, 0x17, 0x00, 0xF8, 0x0E, 0x18, 0x00, 0x81, - 0x00, 0x00, 0x02, 0xBF, 0x04, 0xF1, 0x00, 0xDA, 0x0E, 0x17, 0x00, 0xD8, 0x0E, 0x18, 0x89, 0x48, - 0x00, 0x81, 0x04, 0x00, 0x02, 0xBF, 0x04, 0xF1, 0x00, 0xDA, 0x0E, 0x17, 0x00, 0xD8, 0x0E, 0x18, - 0x89, 0x48, 0x00, 0x81, 0x07, 0xC0, 0x02, 0xBF, 0x04, 0xF1, 0x02, 0x9F, 0x00, 0x68, 0x00, 0x86, - 0x07, 0xC0, 0x02, 0xBF, 0x04, 0x84, 0x02, 0x9F, 0x00, 0x68, 0x81, 0x00, 0x8E, 0x00, 0x19, 0x1E, - 0x19, 0x1C, 0x2E, 0xCE, 0x2C, 0xCF, 0x16, 0xCD, 0x00, 0x00, 0x16, 0xC9, 0x00, 0x01, 0x16, 0xCB, - 0x07, 0x80, 0x02, 0xBF, 0x05, 0x5C, 0x02, 0x9F, 0x00, 0x68, 0x81, 0x00, 0x89, 0x70, 0x8E, 0x60, - 0x2E, 0xCE, 0x2C, 0xCF, 0x16, 0xCD, 0x0E, 0x44, 0x16, 0xC9, 0x00, 0x00, 0x89, 0x00, 0x0D, 0x20, - 0x2D, 0xCB, 0x4C, 0x00, 0x1C, 0x80, 0x00, 0x80, 0x02, 0x80, 0x00, 0x81, 0x00, 0x00, 0x00, 0x82, - 0x01, 0x40, 0x00, 0x83, 0x0E, 0x44, 0x0A, 0x00, 0x27, 0xC9, 0x03, 0xA0, 0x00, 0x04, 0x02, 0x9C, - 0x01, 0x8C, 0x2E, 0xCE, 0x2C, 0xCF, 0x16, 0xCD, 0x0E, 0x54, 0x16, 0xC9, 0x00, 0x00, 0x16, 0xCB, - 0x02, 0x60, 0x00, 0x9F, 0x00, 0xA0, 0x8F, 0x00, 0x00, 0x7F, 0x01, 0xA5, 0x19, 0x7E, 0x1B, 0x1A, - 0x19, 0x7C, 0x1B, 0x1A, 0x1B, 0x5E, 0x7C, 0x22, 0x1B, 0x3E, 0x1B, 0x3C, 0x1C, 0x04, 0x02, 0x9F, - 0x00, 0x68, 0x8E, 0x70, 0x89, 0x60, 0x19, 0x1F, 0x2E, 0xCE, 0x2C, 0xCF, 0x16, 0xCD, 0x0C, 0x00, - 0x16, 0xC9, 0x00, 0x00, 0x05, 0x03, 0x03, 0x40, 0xFF, 0xF0, 0x2F, 0xCB, 0x02, 0xBF, 0x05, 0x5C, - 0x00, 0x80, 0x0C, 0x00, 0x02, 0x9F, 0x00, 0x68, 0x81, 0x00, 0x89, 0x70, 0x8E, 0x78, 0x2E, 0xCE, - 0x2F, 0xCF, 0x16, 0xCD, 0x0B, 0x80, 0x16, 0xC9, 0x00, 0x00, 0x16, 0xCB, 0x00, 0xC0, 0x00, 0x82, - 0x0E, 0x08, 0x00, 0x9F, 0x00, 0x00, 0x1B, 0x5F, 0x00, 0x9F, 0x01, 0x40, 0x1B, 0x5F, 0x00, 0x9F, - 0x02, 0x80, 0x1B, 0x5F, 0x00, 0x9F, 0x04, 0x00, 0x1B, 0x5F, 0x00, 0x9F, 0x05, 0x40, 0x1B, 0x5F, - 0x00, 0x9F, 0x06, 0x80, 0x1B, 0x5F, 0x00, 0x9F, 0x07, 0xC0, 0x1B, 0x5F, 0x00, 0x9F, 0x09, 0x00, - 0x1B, 0x5F, 0x00, 0x9F, 0x0A, 0x40, 0x1B, 0x5F, 0x02, 0xBF, 0x05, 0x5C, 0x00, 0xDE, 0x0B, 0xA7, - 0x00, 0xDF, 0x0B, 0xA8, 0x2E, 0xCE, 0x2F, 0xCF, 0x16, 0xCD, 0x03, 0xC0, 0x16, 0xC9, 0x00, 0x00, - 0x16, 0xCB, 0x00, 0x80, 0x81, 0x00, 0x89, 0x00, 0x00, 0xDE, 0x0B, 0x84, 0x00, 0x9F, 0x0B, 0x31, - 0x4C, 0x00, 0x1C, 0x7E, 0x02, 0x13, 0x00, 0xFE, 0x0E, 0x15, 0x00, 0xDE, 0x0B, 0x85, 0x00, 0x9F, - 0x0B, 0x34, 0x4C, 0x00, 0x1C, 0x7E, 0x02, 0x13, 0x00, 0xFE, 0x0E, 0x16, 0x00, 0xDE, 0x0B, 0x86, - 0x00, 0x9F, 0x0B, 0x11, 0x4C, 0x00, 0x1C, 0x7E, 0x02, 0x13, 0x00, 0xFE, 0x0E, 0x14, 0x81, 0x00, - 0x00, 0xDE, 0x0B, 0x9B, 0xB1, 0x00, 0x02, 0x95, 0x02, 0x3A, 0x89, 0x00, 0x00, 0xDF, 0x0B, 0x9E, - 0x03, 0x00, 0x0C, 0xC0, 0x00, 0xFF, 0x0E, 0x40, 0x00, 0xDF, 0x0B, 0x9F, 0x03, 0x00, 0x0C, 0xC0, - 0x00, 0xFF, 0x0E, 0x41, 0x00, 0x9F, 0x0C, 0xE0, 0x00, 0xFF, 0x0E, 0x42, 0x00, 0xFF, 0x0E, 0x43, - 0x02, 0xBF, 0x05, 0x5C, 0x00, 0xDE, 0x0B, 0x9C, 0x2E, 0xCE, 0x00, 0xDE, 0x0B, 0x9D, 0x2E, 0xCF, - 0x16, 0xCD, 0x0C, 0xC0, 0x16, 0xC9, 0x00, 0x00, 0x16, 0xCB, 0x00, 0x40, 0x02, 0xBF, 0x05, 0x5C, - 0x02, 0x9F, 0x00, 0x68, 0x00, 0x9F, 0x0C, 0xE0, 0x00, 0xFF, 0x0E, 0x42, 0x00, 0xFF, 0x0E, 0x40, - 0x00, 0xFF, 0x0E, 0x41, 0x00, 0xFF, 0x0E, 0x43, 0x02, 0xBF, 0x05, 0x5C, 0x02, 0x9F, 0x00, 0x68, - 0x8E, 0x00, 0x00, 0xE0, 0x0E, 0x07, 0x00, 0x80, 0x0B, 0xA2, 0x00, 0x81, 0x03, 0xC0, 0x0E, 0x05, - 0x00, 0xFE, 0x0E, 0x04, 0x89, 0x00, 0x81, 0x50, 0x00, 0x9F, 0x0B, 0x80, 0x00, 0x7A, 0x02, 0x5B, - 0x19, 0x3E, 0x4C, 0x49, 0x1C, 0x5E, 0x1A, 0x59, 0x00, 0x83, 0x0E, 0x05, 0x1B, 0x61, 0x1B, 0x60, - 0x00, 0xDE, 0x0B, 0x87, 0x06, 0x01, 0x02, 0x95, 0x02, 0x67, 0x02, 0x9F, 0x03, 0x32, 0x00, 0xDE, - 0x0E, 0x42, 0x00, 0xFE, 0x0E, 0x1C, 0x00, 0xC3, 0x0E, 0x15, 0x17, 0x7F, 0x8E, 0x00, 0x8A, 0x00, - 0x81, 0x00, 0x89, 0x00, 0x00, 0xDE, 0x0B, 0xB3, 0x00, 0xDF, 0x0B, 0xB2, 0x1F, 0x1F, 0x4D, 0x00, - 0x14, 0x81, 0x8D, 0x1E, 0x1F, 0xD8, 0x00, 0x98, 0x80, 0x00, 0x00, 0x80, 0x0E, 0x44, 0xA8, 0x30, - 0xAC, 0x38, 0xAD, 0x30, 0xAC, 0x38, 0xAD, 0x30, 0xAC, 0x38, 0xAD, 0x30, 0xAC, 0x38, 0xAD, 0x30, - 0xAC, 0x38, 0xAD, 0x30, 0xAC, 0x38, 0xAD, 0x30, 0xAC, 0x38, 0xAD, 0x30, 0xAC, 0x38, 0xAD, 0x30, - 0xAC, 0x38, 0xAD, 0x30, 0xAC, 0x38, 0xAD, 0x30, 0xAC, 0x38, 0xAD, 0x30, 0xAC, 0x38, 0xAD, 0x30, - 0xAC, 0x38, 0xAD, 0x30, 0xAC, 0x38, 0xAD, 0x30, 0xAC, 0x38, 0xAD, 0x30, 0xAC, 0x38, 0x00, 0xFE, - 0x0B, 0xB2, 0x8F, 0x00, 0x00, 0x80, 0x0E, 0x44, 0x00, 0xC1, 0x0E, 0x43, 0x1C, 0x61, 0x19, 0x3A, - 0x19, 0x18, 0x90, 0x59, 0x19, 0x19, 0x9E, 0x51, 0x80, 0x80, 0x97, 0x59, 0x80, 0x91, 0x9E, 0x51, - 0x80, 0x80, 0x97, 0x59, 0x80, 0x91, 0x9E, 0x51, 0x80, 0x80, 0x97, 0x59, 0x80, 0x91, 0x9E, 0x51, - 0x80, 0x80, 0x97, 0x59, 0x80, 0x91, 0x9E, 0x51, 0x80, 0x80, 0x97, 0x59, 0x80, 0x91, 0x9E, 0x51, - 0x80, 0x80, 0x97, 0x59, 0x80, 0x91, 0x9E, 0x51, 0x80, 0x80, 0x97, 0x59, 0x80, 0x91, 0x9E, 0x51, - 0x80, 0x80, 0x97, 0x59, 0x80, 0x91, 0x9E, 0x51, 0x80, 0x80, 0x97, 0x59, 0x80, 0x91, 0x9E, 0x51, - 0x80, 0x80, 0x97, 0x59, 0x80, 0x91, 0x9E, 0x51, 0x80, 0x80, 0x97, 0x59, 0x80, 0x91, 0x9E, 0x51, - 0x80, 0x80, 0x97, 0x59, 0x80, 0x91, 0x9E, 0x51, 0x80, 0x80, 0x97, 0x59, 0x80, 0x91, 0x9E, 0x51, - 0x80, 0x80, 0x97, 0x59, 0x80, 0x91, 0x9E, 0x51, 0x80, 0x80, 0x97, 0x59, 0x80, 0x91, 0x9E, 0x00, - 0x6F, 0x33, 0x1B, 0x7F, 0x00, 0xC3, 0x0E, 0x14, 0x8F, 0x00, 0x8D, 0x00, 0x8A, 0x00, 0x17, 0x7F, - 0x81, 0x00, 0x00, 0xDE, 0x0B, 0x9B, 0xB1, 0x00, 0x02, 0x95, 0x03, 0x2A, 0x00, 0xDE, 0x0E, 0x42, - 0x00, 0xFE, 0x0E, 0x43, 0x81, 0x00, 0x89, 0x00, 0x00, 0xDE, 0x0B, 0x9E, 0x00, 0xDF, 0x0B, 0xA0, - 0x82, 0x00, 0x02, 0x93, 0x03, 0x06, 0x78, 0x00, 0x02, 0x9F, 0x03, 0x09, 0x02, 0x95, 0x03, 0x09, - 0x74, 0x00, 0x00, 0xFE, 0x0B, 0x9E, 0x00, 0xDF, 0x0E, 0x43, 0x05, 0xE0, 0x4C, 0x00, 0x00, 0xFE, - 0x0E, 0x40, 0x81, 0x00, 0x89, 0x00, 0x00, 0xDE, 0x0B, 0x9F, 0x00, 0xDF, 0x0B, 0xA1, 0x82, 0x00, - 0x02, 0x93, 0x03, 0x1D, 0x78, 0x00, 0x02, 0x9F, 0x03, 0x20, 0x02, 0x95, 0x03, 0x20, 0x74, 0x00, - 0x00, 0xFE, 0x0B, 0x9F, 0x00, 0xDF, 0x0E, 0x43, 0x05, 0xE0, 0x4C, 0x00, 0x00, 0xFE, 0x0E, 0x41, - 0x02, 0x9F, 0x03, 0x32, 0x00, 0xDE, 0x0E, 0x42, 0x00, 0xFE, 0x0E, 0x40, 0x00, 0xFE, 0x0E, 0x41, - 0x00, 0xFE, 0x0E, 0x43, 0x81, 0x00, 0x8E, 0x00, 0x84, 0x00, 0x89, 0x00, 0x1E, 0xFE, 0x0E, 0x40, - 0x1E, 0xBE, 0x00, 0x83, 0x0E, 0x08, 0x1C, 0x03, 0x1F, 0xF5, 0x19, 0x1A, 0xF8, 0x58, 0xFB, 0xA0, - 0xF8, 0xB1, 0xFB, 0xA0, 0xF8, 0xB1, 0xFB, 0xA0, 0xF8, 0xB1, 0xFB, 0xA0, 0xF8, 0x3B, 0x1B, 0x7E, - 0x00, 0x83, 0x0E, 0x04, 0x81, 0x00, 0x89, 0x73, 0x19, 0x61, 0x19, 0x60, 0x78, 0x00, 0x00, 0xFE, - 0x0E, 0x04, 0x02, 0x94, 0x02, 0x53, 0x8E, 0x00, 0x81, 0x00, 0x00, 0xDE, 0x0B, 0x9B, 0xB1, 0x00, - 0x02, 0x95, 0x03, 0x6A, 0x00, 0xDE, 0x0B, 0x9C, 0x00, 0xDC, 0x0B, 0x9D, 0x2E, 0xCE, 0x2C, 0xCF, - 0x81, 0x00, 0x00, 0xDE, 0x0E, 0x1C, 0x2E, 0xCD, 0x16, 0xC9, 0x00, 0x01, 0x16, 0xCB, 0x00, 0x40, - 0x02, 0xBF, 0x05, 0x5C, 0x81, 0x00, 0x89, 0x00, 0x00, 0xDE, 0x0B, 0x82, 0x00, 0xDF, 0x0B, 0x83, - 0x2E, 0xCE, 0x2F, 0xCF, 0x16, 0xCD, 0x0B, 0x80, 0x16, 0xC9, 0x00, 0x01, 0x16, 0xCB, 0x00, 0xC0, - 0x02, 0xBF, 0x05, 0x5C, 0x81, 0x00, 0x00, 0xDE, 0x0B, 0x80, 0x00, 0xDC, 0x0B, 0x81, 0xB1, 0x00, - 0x02, 0x94, 0x03, 0x86, 0x00, 0xC0, 0x0E, 0x07, 0x02, 0x9F, 0x00, 0x68, 0x2E, 0xCE, 0x2C, 0xCF, - 0x16, 0xCD, 0x0B, 0x80, 0x16, 0xC9, 0x00, 0x00, 0x16, 0xCB, 0x00, 0xC0, 0x00, 0x82, 0x0E, 0x08, - 0x00, 0x9F, 0x00, 0x00, 0x1B, 0x5F, 0x00, 0x9F, 0x01, 0x40, 0x1B, 0x5F, 0x00, 0x9F, 0x02, 0x80, - 0x1B, 0x5F, 0x00, 0x9F, 0x04, 0x00, 0x1B, 0x5F, 0x00, 0x9F, 0x05, 0x40, 0x1B, 0x5F, 0x00, 0x9F, - 0x06, 0x80, 0x1B, 0x5F, 0x00, 0x9F, 0x07, 0xC0, 0x1B, 0x5F, 0x00, 0x9F, 0x09, 0x00, 0x1B, 0x5F, - 0x00, 0x9F, 0x0A, 0x40, 0x1B, 0x5F, 0x02, 0xBF, 0x05, 0x5C, 0x00, 0xDE, 0x0B, 0xA7, 0x00, 0xDF, - 0x0B, 0xA8, 0x2E, 0xCE, 0x2F, 0xCF, 0x16, 0xCD, 0x03, 0xC0, 0x16, 0xC9, 0x00, 0x00, 0x16, 0xCB, - 0x00, 0x80, 0x81, 0x00, 0x89, 0x00, 0x00, 0xDE, 0x0B, 0x84, 0x00, 0x9F, 0x0B, 0x31, 0x4C, 0x00, - 0x1C, 0x7E, 0x02, 0x13, 0x00, 0xFE, 0x0E, 0x15, 0x00, 0xDE, 0x0B, 0x85, 0x00, 0x9F, 0x0B, 0x34, - 0x4C, 0x00, 0x1C, 0x7E, 0x02, 0x13, 0x00, 0xFE, 0x0E, 0x16, 0x00, 0xDE, 0x0B, 0x86, 0x00, 0x9F, - 0x0B, 0x11, 0x4C, 0x00, 0x1C, 0x7E, 0x02, 0x13, 0x00, 0xFE, 0x0E, 0x14, 0x81, 0x00, 0x00, 0xDE, - 0x0B, 0x9B, 0xB1, 0x00, 0x02, 0x95, 0x04, 0x03, 0x89, 0x00, 0x00, 0xDF, 0x0B, 0x9E, 0x03, 0x00, - 0x0C, 0xC0, 0x00, 0xFF, 0x0E, 0x40, 0x00, 0xDF, 0x0B, 0x9F, 0x03, 0x00, 0x0C, 0xC0, 0x00, 0xFF, - 0x0E, 0x41, 0x00, 0x9F, 0x0C, 0xE0, 0x00, 0xFF, 0x0E, 0x42, 0x00, 0xFF, 0x0E, 0x43, 0x02, 0xBF, - 0x05, 0x5C, 0x00, 0xDE, 0x0B, 0x9C, 0x2E, 0xCE, 0x00, 0xDE, 0x0B, 0x9D, 0x2E, 0xCF, 0x16, 0xCD, - 0x0C, 0xC0, 0x16, 0xC9, 0x00, 0x00, 0x16, 0xCB, 0x00, 0x40, 0x02, 0xBF, 0x05, 0x5C, 0x00, 0xC0, - 0x0E, 0x07, 0x02, 0x9F, 0x02, 0x48, 0x00, 0x9F, 0x0C, 0xE0, 0x00, 0xFF, 0x0E, 0x42, 0x00, 0xFF, - 0x0E, 0x40, 0x00, 0xFF, 0x0E, 0x41, 0x00, 0xFF, 0x0E, 0x43, 0x02, 0xBF, 0x05, 0x5C, 0x00, 0xC0, - 0x0E, 0x07, 0x02, 0x9F, 0x02, 0x48, 0x8E, 0x00, 0x00, 0x86, 0x04, 0x00, 0x81, 0x00, 0x89, 0x70, - 0x19, 0x1C, 0x2E, 0xCE, 0x2C, 0xCF, 0x1F, 0xC6, 0x2E, 0xCD, 0x16, 0xC9, 0x00, 0x01, 0x16, 0xCB, - 0x07, 0x80, 0x02, 0xBF, 0x05, 0x5C, 0x02, 0xBF, 0x04, 0x84, 0x02, 0x9F, 0x00, 0x68, 0x8E, 0x00, - 0x00, 0x86, 0x07, 0xC0, 0x81, 0x00, 0x89, 0x70, 0x19, 0x1C, 0x2E, 0xCE, 0x2C, 0xCF, 0x1F, 0xC6, - 0x2E, 0xCD, 0x16, 0xC9, 0x00, 0x01, 0x16, 0xCB, 0x07, 0x80, 0x02, 0xBF, 0x05, 0x5C, 0x02, 0xBF, - 0x04, 0x84, 0x02, 0x9F, 0x00, 0x68, 0x8C, 0x00, 0x8A, 0x00, 0x81, 0x00, 0x89, 0x70, 0x19, 0x1F, - 0x2E, 0xCE, 0x2F, 0xCF, 0x16, 0xCD, 0x02, 0x80, 0x16, 0xC9, 0x00, 0x01, 0x16, 0xCB, 0x02, 0x80, - 0x8F, 0x50, 0x81, 0x40, 0x00, 0x81, 0x04, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x82, 0x01, 0x40, - 0x00, 0x99, 0x00, 0x80, 0x02, 0xBF, 0x05, 0x5C, 0x11, 0x05, 0x04, 0x6C, 0x1F, 0x61, 0x11, 0x20, - 0x04, 0x5E, 0x89, 0x72, 0x19, 0x5C, 0xF0, 0x7B, 0x19, 0x7D, 0xF1, 0x31, 0x81, 0x39, 0x89, 0x00, - 0x68, 0x00, 0x2E, 0xCE, 0x2C, 0xCF, 0x1F, 0xFB, 0x2F, 0xCD, 0x0F, 0x01, 0x2F, 0xC9, 0x1F, 0xF9, - 0x2F, 0xCB, 0x72, 0x00, 0x1F, 0x5E, 0x1F, 0x1C, 0x81, 0x00, 0x26, 0xC9, 0x02, 0xA0, 0x00, 0x04, - 0x02, 0x9C, 0x04, 0x6D, 0x02, 0x9F, 0x00, 0x68, 0x02, 0x9F, 0x00, 0x68, 0x02, 0x9F, 0x00, 0x68, - 0x02, 0x9F, 0x00, 0x68, 0x16, 0xFC, 0xDC, 0xD1, 0x16, 0xFD, 0x00, 0x02, 0x16, 0xFB, 0x00, 0x01, - 0x02, 0x9F, 0x0C, 0x91, 0x02, 0x9F, 0x00, 0x45, 0x8E, 0x00, 0x19, 0x1F, 0x19, 0x1D, 0x1F, 0x5F, - 0x1F, 0x1D, 0x2F, 0xCE, 0x2D, 0xCF, 0x89, 0x00, 0x1F, 0xA6, 0x2D, 0xCD, 0x0E, 0x00, 0x2E, 0xC9, - 0x81, 0x00, 0x00, 0x9C, 0x00, 0xC0, 0x2C, 0xCB, 0x1C, 0xA0, 0x00, 0x81, 0x0E, 0x44, 0x48, 0x00, - 0x1B, 0x3E, 0x1B, 0x3C, 0x0B, 0x00, 0x00, 0x99, 0x00, 0x60, 0x4B, 0x00, 0x1B, 0x3D, 0x00, 0x81, - 0x0E, 0x44, 0x1C, 0x06, 0x00, 0x83, 0x00, 0x00, 0x1C, 0x43, 0x27, 0xC9, 0x03, 0xA0, 0x00, 0x04, - 0x02, 0x9C, 0x04, 0xA5, 0x11, 0x09, 0x04, 0xDA, 0x8E, 0x00, 0x19, 0x3A, 0x19, 0x38, 0x69, 0x00, - 0x2F, 0xCE, 0x2D, 0xCF, 0x89, 0x00, 0x19, 0x3D, 0x2D, 0xCD, 0x16, 0xC9, 0x00, 0x00, 0x81, 0x00, - 0x00, 0x9C, 0x00, 0xC0, 0x2C, 0xCB, 0x00, 0x81, 0x0E, 0x44, 0x48, 0x00, 0x1B, 0x3E, 0x1B, 0x3C, - 0x0B, 0x00, 0x09, 0x60, 0x4B, 0x00, 0x1B, 0x3D, 0x00, 0x81, 0x0E, 0x44, 0x8F, 0x00, 0x80, 0xF0, - 0x80, 0xC0, 0x6A, 0x00, 0x48, 0x00, 0x11, 0x17, 0x04, 0xD4, 0x80, 0xF0, 0x80, 0xC0, 0x6B, 0x32, - 0x49, 0x22, 0x80, 0xF0, 0x80, 0xC0, 0x6A, 0x3A, 0x48, 0x2A, 0x80, 0xF0, 0x80, 0xC0, 0x6B, 0x32, - 0x49, 0x22, 0x1B, 0x5F, 0x1B, 0x5D, 0x80, 0xF0, 0x80, 0xC0, 0x6A, 0x00, 0x48, 0x00, 0x11, 0x17, - 0x04, 0xE8, 0x80, 0xF0, 0x80, 0xC0, 0x6B, 0x32, 0x49, 0x22, 0x80, 0xF0, 0x80, 0xC0, 0x6A, 0x3A, - 0x48, 0x2A, 0x80, 0xF0, 0x80, 0xC0, 0x6B, 0x32, 0x49, 0x22, 0x1B, 0x5F, 0x1B, 0x5D, 0x1C, 0x05, - 0x02, 0xDF, 0x8E, 0x00, 0x00, 0x9B, 0x0E, 0x44, 0x00, 0x9D, 0x00, 0xC0, 0x02, 0xBF, 0x05, 0x41, - 0x49, 0x00, 0x00, 0xFF, 0x0E, 0x1D, 0x00, 0xFD, 0x0E, 0x1E, 0x89, 0x00, 0x02, 0xBF, 0x05, 0x5C, - 0x11, 0x04, 0x05, 0x2C, 0x00, 0xDA, 0x0E, 0x1D, 0x00, 0xD8, 0x0E, 0x1E, 0x00, 0x9B, 0x0E, 0xA4, - 0x00, 0x9D, 0x00, 0xC0, 0x02, 0xBF, 0x05, 0x41, 0x49, 0x00, 0x00, 0xFF, 0x0E, 0x1D, 0x00, 0xFD, - 0x0E, 0x1E, 0x00, 0x83, 0x0E, 0x44, 0x02, 0xBF, 0x05, 0x4C, 0x89, 0x00, 0x00, 0xDA, 0x0E, 0x1D, - 0x00, 0xD8, 0x0E, 0x1E, 0x00, 0x9B, 0x0E, 0x44, 0x00, 0x9D, 0x00, 0xC0, 0x02, 0xBF, 0x05, 0x41, - 0x49, 0x00, 0x00, 0xFF, 0x0E, 0x1D, 0x00, 0xFD, 0x0E, 0x1E, 0x00, 0x83, 0x0E, 0xA4, 0x02, 0xBF, - 0x05, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x8E, 0x00, 0x89, 0x00, 0x00, 0xDA, 0x0E, 0x1D, 0x00, 0xD8, - 0x0E, 0x1E, 0x00, 0x9B, 0x0E, 0xA4, 0x00, 0x9D, 0x00, 0xC0, 0x02, 0xBF, 0x05, 0x41, 0x49, 0x00, - 0x00, 0x83, 0x0E, 0x44, 0x02, 0xBF, 0x05, 0x4C, 0x00, 0x83, 0x0E, 0xA4, 0x02, 0xBF, 0x05, 0x4C, - 0x02, 0xDF, 0x8E, 0x00, 0x00, 0xFA, 0xFF, 0xCE, 0x00, 0xF8, 0xFF, 0xCF, 0x00, 0xFB, 0xFF, 0xCD, - 0x16, 0xC9, 0x00, 0x00, 0x2D, 0xCB, 0x02, 0xDF, 0x8F, 0x00, 0x8D, 0x00, 0x8A, 0x00, 0x19, 0x7A, - 0x19, 0x78, 0xA0, 0x00, 0xB6, 0x00, 0x11, 0x30, 0x05, 0x5A, 0x91, 0x79, 0x4E, 0x6D, 0x19, 0x7A, - 0x4D, 0x43, 0xA0, 0x39, 0xB6, 0x29, 0x02, 0xDF, 0x26, 0xC9, 0x02, 0xA0, 0x00, 0x04, 0x02, 0x9C, - 0x05, 0x5C, 0x02, 0xDF, 0x26, 0xFE, 0x02, 0xC0, 0x80, 0x00, 0x02, 0x9C, 0x05, 0x62, 0x02, 0xDF, - 0x26, 0xFC, 0x02, 0xA0, 0x80, 0x00, 0x02, 0x9C, 0x05, 0x68, 0x02, 0xDF, 0x26, 0xFC, 0x02, 0xA0, - 0x80, 0x00, 0x02, 0x9C, 0x05, 0x6E, 0x02, 0xDF, 0x81, 0x00, 0x89, 0x70, 0x8E, 0x60, 0x2E, 0xCE, - 0x2C, 0xCF, 0x16, 0xCD, 0x0E, 0x44, 0x16, 0xC9, 0x00, 0x00, 0x89, 0x00, 0x0D, 0x20, 0x2D, 0xCB, - 0x4C, 0x00, 0x1C, 0x80, 0x00, 0x80, 0x02, 0x80, 0x00, 0x81, 0x00, 0x00, 0x00, 0x82, 0x01, 0x40, - 0x00, 0x83, 0x0E, 0x44, 0x0A, 0x00, 0x27, 0xC9, 0x03, 0xA0, 0x00, 0x04, 0x02, 0x9C, 0x05, 0x8B, - 0x2E, 0xCE, 0x2C, 0xCF, 0x16, 0xCD, 0x0E, 0x54, 0x16, 0xC9, 0x00, 0x00, 0x16, 0xCB, 0x02, 0x60, - 0x00, 0x9F, 0x00, 0xA0, 0x8F, 0x00, 0x00, 0x7F, 0x05, 0xA4, 0x19, 0x7E, 0x1B, 0x1A, 0x19, 0x7C, - 0x1B, 0x1A, 0x1B, 0x5E, 0x1B, 0x5C, 0x1B, 0x3E, 0x1B, 0x3C, 0x1C, 0x04, 0x02, 0x9F, 0x00, 0x68, - 0x00, 0x82, 0x0B, 0xB8, 0x19, 0x5E, 0x2E, 0xD1, 0x19, 0x5E, 0x2E, 0xD4, 0x19, 0x5E, 0x2E, 0xD5, - 0x19, 0x5E, 0x2E, 0xD6, 0x19, 0x5E, 0x2E, 0xD7, 0x19, 0x5E, 0x2E, 0xD8, 0x19, 0x5E, 0x2E, 0xD9, - 0x19, 0x5E, 0x2E, 0xA0, 0x19, 0x5E, 0x2E, 0xA1, 0x19, 0x5E, 0x2E, 0xA2, 0x19, 0x5E, 0x2E, 0xA3, - 0x19, 0x5E, 0x2E, 0xA4, 0x19, 0x5E, 0x2E, 0xA5, 0x19, 0x5E, 0x2E, 0xA6, 0x19, 0x5E, 0x2E, 0xA7, - 0x19, 0x5E, 0x2E, 0xA8, 0x19, 0x5E, 0x2E, 0xA9, 0x19, 0x5E, 0x2E, 0xAA, 0x19, 0x5E, 0x2E, 0xAB, - 0x19, 0x5E, 0x2E, 0xAC, 0x19, 0x5E, 0x2E, 0xAD, 0x19, 0x5E, 0x2E, 0xAE, 0x19, 0x5E, 0x2E, 0xAF, - 0x19, 0x5E, 0x2E, 0xDE, 0x19, 0x5E, 0x2E, 0xDA, 0x19, 0x5E, 0x2E, 0xDB, 0x19, 0x5E, 0x2E, 0xDC, - 0x8C, 0x00, 0x8A, 0x00, 0x8E, 0x00, 0x00, 0xD8, 0x0E, 0x16, 0x19, 0x5B, 0x19, 0x59, 0x81, 0x00, - 0x19, 0x5C, 0x00, 0x80, 0x0E, 0x44, 0x19, 0x5F, 0x1B, 0x1F, 0x19, 0x5F, 0x1B, 0x1F, 0x19, 0x5F, - 0x1B, 0x1F, 0x18, 0x5F, 0x1B, 0x1F, 0x6B, 0x00, 0x15, 0x05, 0x4D, 0x00, 0x15, 0x7E, 0x1C, 0x9F, - 0x1C, 0xBD, 0x05, 0xE0, 0x99, 0x00, 0x7D, 0x00, 0x1C, 0xDD, 0x89, 0x00, 0x1F, 0xA5, 0x15, 0x02, - 0x1C, 0xBF, 0x00, 0x9A, 0x01, 0xFC, 0x00, 0x9E, 0x0E, 0x44, 0x00, 0x81, 0xFF, 0xDD, 0x00, 0x83, - 0x0D, 0x80, 0x00, 0x64, 0x06, 0x1A, 0x18, 0x27, 0x1B, 0x07, 0x4A, 0x00, 0x1F, 0xFC, 0x18, 0x27, - 0x1B, 0x07, 0x15, 0x79, 0x35, 0x00, 0x18, 0x27, 0x1B, 0x07, 0x41, 0x00, 0x1B, 0x7E, 0x18, 0x27, - 0x1B, 0x07, 0x1B, 0x7F, 0x00, 0x00, 0x00, 0x65, 0x06, 0x20, 0x18, 0x27, 0x1B, 0x07, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x07, 0x18, 0x7F, 0x00, 0x66, 0x06, 0x29, 0x4A, 0x3B, 0x1F, 0xFC, 0x15, 0x79, - 0x35, 0x33, 0x41, 0x00, 0x1B, 0x7F, 0x00, 0x04, 0x18, 0x9F, 0x1A, 0xDF, 0x18, 0x9F, 0x1A, 0xDF, - 0x18, 0x9F, 0x1A, 0xDF, 0x18, 0x9F, 0x1A, 0xDF, 0x1A, 0xDC, 0x00, 0x82, 0x0B, 0xD2, 0x27, 0xDC, - 0x1A, 0xDF, 0x27, 0xDB, 0x1A, 0xDF, 0x27, 0xDA, 0x1A, 0xDF, 0x00, 0x82, 0x0B, 0xBE, 0x27, 0xD9, - 0x1A, 0xDF, 0x27, 0xD8, 0x1A, 0xDF, 0x8F, 0x00, 0x00, 0xC1, 0x0E, 0x42, 0x00, 0x82, 0x0D, 0x80, - 0x19, 0x40, 0x19, 0x43, 0x80, 0xF0, 0xB8, 0xC0, 0x11, 0x1F, 0x06, 0x54, 0xA6, 0xF0, 0xBC, 0xF0, - 0x19, 0x40, 0x19, 0x43, 0xBC, 0xF0, 0x4E, 0xC0, 0xB8, 0x31, 0xA6, 0xF0, 0xBC, 0xF0, 0xBC, 0x00, - 0x4E, 0x00, 0x1B, 0x3E, 0x00, 0xE1, 0x0E, 0x42, 0x02, 0xDF, 0x00, 0x82, 0x0B, 0xB8, 0x19, 0x5E, - 0x2E, 0xD1, 0x19, 0x5E, 0x2E, 0xD4, 0x19, 0x5E, 0x2E, 0xD5, 0x19, 0x5E, 0x2E, 0xD6, 0x19, 0x5E, - 0x2E, 0xD7, 0x19, 0x5E, 0x2E, 0xD8, 0x19, 0x5E, 0x2E, 0xD9, 0x19, 0x5E, 0x2E, 0xA0, 0x19, 0x5E, - 0x2E, 0xA1, 0x19, 0x5E, 0x2E, 0xA2, 0x19, 0x5E, 0x2E, 0xA3, 0x19, 0x5E, 0x2E, 0xA4, 0x19, 0x5E, - 0x2E, 0xA5, 0x19, 0x5E, 0x2E, 0xA6, 0x19, 0x5E, 0x2E, 0xA7, 0x19, 0x5E, 0x2E, 0xA8, 0x19, 0x5E, - 0x2E, 0xA9, 0x19, 0x5E, 0x2E, 0xAA, 0x19, 0x5E, 0x2E, 0xAB, 0x19, 0x5E, 0x2E, 0xAC, 0x19, 0x5E, - 0x2E, 0xAD, 0x19, 0x5E, 0x2E, 0xAE, 0x19, 0x5E, 0x2E, 0xAF, 0x19, 0x5E, 0x2E, 0xDE, 0x19, 0x5E, - 0x2E, 0xDA, 0x19, 0x5E, 0x2E, 0xDB, 0x19, 0x5E, 0x2E, 0xDC, 0x8C, 0x00, 0x8A, 0x00, 0x8E, 0x00, - 0x19, 0x5B, 0x19, 0x59, 0x81, 0x00, 0x19, 0x5C, 0x00, 0x80, 0x0E, 0x44, 0x19, 0x5F, 0x19, 0x5F, - 0x19, 0x5F, 0x1B, 0x1F, 0x18, 0x5F, 0x1B, 0x1F, 0x6B, 0x00, 0x15, 0x05, 0x4D, 0x00, 0x15, 0x7E, - 0x1C, 0x9F, 0x1C, 0xBD, 0x05, 0xE0, 0x99, 0x00, 0x7D, 0x00, 0x1C, 0xDD, 0x89, 0x00, 0x1F, 0xA5, - 0x15, 0x02, 0x1C, 0xBF, 0x00, 0x9A, 0x01, 0xFC, 0x00, 0x9E, 0x0E, 0x45, 0x00, 0x81, 0xFF, 0xDD, - 0x00, 0x83, 0x0D, 0x80, 0x00, 0x64, 0x06, 0xCB, 0x18, 0x27, 0x1B, 0x07, 0x4A, 0x00, 0x1B, 0x7E, - 0x18, 0x27, 0x1B, 0x07, 0x1B, 0x7C, 0x00, 0x00, 0x18, 0x27, 0x1B, 0x07, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x27, 0x1B, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x06, 0xD1, 0x18, 0x27, 0x1B, 0x07, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x06, 0xD6, 0x4A, 0x00, 0x1B, 0x7E, 0x1B, 0x7C, 0x00, 0x04, - 0x18, 0x9F, 0x1A, 0xDF, 0x18, 0x9F, 0x1A, 0xDF, 0x18, 0x9F, 0x1A, 0xDF, 0x18, 0x9F, 0x1A, 0xDF, - 0x1A, 0xDC, 0x00, 0x82, 0x0B, 0xD2, 0x27, 0xDC, 0x1A, 0xDF, 0x27, 0xDB, 0x1A, 0xDF, 0x27, 0xDA, - 0x1A, 0xDF, 0x00, 0x82, 0x0B, 0xBE, 0x27, 0xD9, 0x1A, 0xDF, 0x27, 0xD8, 0x1A, 0xDF, 0x8D, 0x00, - 0x8B, 0x00, 0x8F, 0x00, 0x00, 0xC1, 0x0E, 0x42, 0x00, 0x82, 0x0D, 0x80, 0x81, 0x00, 0x11, 0x20, - 0x07, 0x03, 0x89, 0x00, 0x19, 0x40, 0x18, 0x9E, 0x18, 0x1B, 0x19, 0x9A, 0x54, 0x00, 0x1F, 0x5E, - 0x19, 0x59, 0xB0, 0x00, 0xFB, 0x00, 0x81, 0x39, 0x00, 0xE1, 0x0E, 0x42, 0x02, 0xDF, 0x00, 0x82, - 0x0B, 0xB8, 0x19, 0x5E, 0x2E, 0xD1, 0x19, 0x5E, 0x2E, 0xD4, 0x19, 0x5E, 0x2E, 0xD5, 0x19, 0x5E, - 0x2E, 0xD6, 0x19, 0x5E, 0x2E, 0xD7, 0x19, 0x5E, 0x2E, 0xD8, 0x19, 0x5E, 0x2E, 0xD9, 0x19, 0x5E, - 0x2E, 0xA0, 0x19, 0x5E, 0x2E, 0xA1, 0x19, 0x5E, 0x2E, 0xA2, 0x19, 0x5E, 0x2E, 0xA3, 0x19, 0x5E, - 0x2E, 0xA4, 0x19, 0x5E, 0x2E, 0xA5, 0x19, 0x5E, 0x2E, 0xA6, 0x19, 0x5E, 0x2E, 0xA7, 0x19, 0x5E, - 0x2E, 0xA8, 0x19, 0x5E, 0x2E, 0xA9, 0x19, 0x5E, 0x2E, 0xAA, 0x19, 0x5E, 0x2E, 0xAB, 0x19, 0x5E, - 0x2E, 0xAC, 0x19, 0x5E, 0x2E, 0xAD, 0x19, 0x5E, 0x2E, 0xAE, 0x19, 0x5E, 0x2E, 0xAF, 0x19, 0x5E, - 0x2E, 0xDE, 0x19, 0x5E, 0x2E, 0xDA, 0x19, 0x5E, 0x2E, 0xDB, 0x19, 0x5E, 0x2E, 0xDC, 0x00, 0xC0, - 0x0E, 0x42, 0x00, 0x81, 0xFF, 0xDD, 0x11, 0x20, 0x07, 0x48, 0x18, 0x24, 0x1B, 0x04, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xE0, 0x0E, 0x42, 0x00, 0x82, 0x0B, 0xD9, 0x00, 0x04, 0x18, 0x9F, 0x1A, 0xDF, - 0x18, 0x9F, 0x1A, 0xDF, 0x18, 0x9F, 0x1A, 0xDF, 0x18, 0x9F, 0x1A, 0xDF, 0x89, 0x00, 0x1A, 0xDC, - 0x27, 0xDC, 0x00, 0xFF, 0x0B, 0xD2, 0x27, 0xDB, 0x00, 0xFF, 0x0B, 0xD1, 0x27, 0xDA, 0x00, 0xFF, - 0x0B, 0xD0, 0x27, 0xD9, 0x00, 0xFF, 0x0B, 0xBE, 0x27, 0xD8, 0x00, 0xFF, 0x0B, 0xBD, 0x02, 0xDF, - 0x00, 0xC0, 0x0E, 0x40, 0x00, 0x81, 0x0B, 0x89, 0x00, 0xC2, 0x0E, 0x08, 0x1C, 0x62, 0x00, 0xC4, - 0x0E, 0x41, 0x00, 0xC5, 0x0E, 0x09, 0x02, 0xBF, 0x80, 0xE7, 0x00, 0xF8, 0x0B, 0xA9, 0x00, 0xFB, - 0x0B, 0xAC, 0x02, 0xDF, 0x00, 0xC0, 0x0E, 0x40, 0x00, 0x81, 0x0B, 0x89, 0x00, 0xC2, 0x0E, 0x08, - 0x1C, 0x62, 0x00, 0xC4, 0x0E, 0x41, 0x00, 0xC5, 0x0E, 0x09, 0x02, 0xBF, 0x80, 0xE7, 0x00, 0xF8, - 0x0B, 0xA9, 0x00, 0xFB, 0x0B, 0xAC, 0x00, 0xC0, 0x0E, 0x40, 0x00, 0x81, 0x0B, 0x8D, 0x00, 0xC2, - 0x0E, 0x0B, 0x1C, 0x62, 0x00, 0xC4, 0x0E, 0x41, 0x00, 0xC5, 0x0E, 0x0C, 0x02, 0xBF, 0x80, 0xE7, - 0x00, 0xF8, 0x0B, 0xAA, 0x00, 0xFB, 0x0B, 0xAD, 0x02, 0xDF, 0x00, 0xC0, 0x0E, 0x40, 0x00, 0x81, - 0x0B, 0x89, 0x00, 0xC2, 0x0E, 0x08, 0x1C, 0x62, 0x00, 0xC4, 0x0E, 0x41, 0x00, 0xC5, 0x0E, 0x09, - 0x02, 0xBF, 0x80, 0xE7, 0x00, 0xF8, 0x0B, 0xA9, 0x00, 0xFB, 0x0B, 0xAC, 0x00, 0xC0, 0x0E, 0x40, - 0x00, 0x81, 0x0B, 0x91, 0x00, 0xC2, 0x0E, 0x0E, 0x1C, 0x62, 0x00, 0xC4, 0x0E, 0x41, 0x00, 0xC5, - 0x0E, 0x0F, 0x02, 0xBF, 0x80, 0xE7, 0x00, 0xF8, 0x0B, 0xAB, 0x00, 0xFB, 0x0B, 0xAE, 0x02, 0xDF, - 0x00, 0xC0, 0x0E, 0x40, 0x00, 0x81, 0x0B, 0x89, 0x00, 0xC2, 0x0E, 0x08, 0x1C, 0x62, 0x00, 0xC4, - 0x0E, 0x41, 0x00, 0xC5, 0x0E, 0x09, 0x02, 0xBF, 0x80, 0xE7, 0x00, 0xF8, 0x0B, 0xA9, 0x00, 0xFB, - 0x0B, 0xAC, 0x00, 0xC0, 0x0E, 0x40, 0x00, 0x81, 0x0B, 0x8D, 0x00, 0xC2, 0x0E, 0x0B, 0x1C, 0x62, - 0x00, 0xC4, 0x0E, 0x41, 0x00, 0xC5, 0x0E, 0x0C, 0x02, 0xBF, 0x80, 0xE7, 0x00, 0xF8, 0x0B, 0xAA, - 0x00, 0xFB, 0x0B, 0xAD, 0x00, 0xC0, 0x0E, 0x40, 0x00, 0x81, 0x0B, 0x91, 0x00, 0xC2, 0x0E, 0x0E, - 0x1C, 0x62, 0x00, 0xC4, 0x0E, 0x41, 0x00, 0xC5, 0x0E, 0x0F, 0x02, 0xBF, 0x80, 0xE7, 0x00, 0xF8, - 0x0B, 0xAB, 0x00, 0xFB, 0x0B, 0xAE, 0x02, 0xDF, 0x00, 0xC0, 0x0E, 0x40, 0x00, 0x81, 0x0B, 0x89, - 0x00, 0xC2, 0x0E, 0x08, 0x1C, 0x62, 0x00, 0xC4, 0x0E, 0x41, 0x00, 0xC5, 0x0E, 0x09, 0x02, 0xBF, - 0x80, 0xE7, 0x00, 0xF8, 0x0B, 0xA9, 0x00, 0xFB, 0x0B, 0xAC, 0x00, 0xC0, 0x0E, 0x43, 0x00, 0x81, - 0x0B, 0x97, 0x00, 0xC2, 0x0E, 0x0A, 0x1C, 0x62, 0x02, 0xBF, 0x81, 0xF9, 0x00, 0xF8, 0x0B, 0xAF, - 0x02, 0xDF, 0x00, 0xC0, 0x0E, 0x40, 0x00, 0x81, 0x0B, 0x89, 0x00, 0xC2, 0x0E, 0x08, 0x1C, 0x62, - 0x00, 0xC4, 0x0E, 0x41, 0x00, 0xC5, 0x0E, 0x09, 0x02, 0xBF, 0x80, 0xE7, 0x00, 0xF8, 0x0B, 0xA9, - 0x00, 0xFB, 0x0B, 0xAC, 0x00, 0xC0, 0x0E, 0x40, 0x00, 0x81, 0x0B, 0x8D, 0x00, 0xC2, 0x0E, 0x0B, - 0x1C, 0x62, 0x00, 0xC4, 0x0E, 0x41, 0x00, 0xC5, 0x0E, 0x0C, 0x02, 0xBF, 0x80, 0xE7, 0x00, 0xF8, - 0x0B, 0xAA, 0x00, 0xFB, 0x0B, 0xAD, 0x00, 0xC0, 0x0E, 0x43, 0x00, 0x81, 0x0B, 0x97, 0x00, 0xC2, - 0x0E, 0x0A, 0x1C, 0x62, 0x1C, 0x80, 0x00, 0xC5, 0x0E, 0x0D, 0x02, 0xBF, 0x80, 0xE7, 0x00, 0xF8, - 0x0B, 0xAF, 0x00, 0xFB, 0x0B, 0xB0, 0x02, 0xDF, 0x00, 0xC0, 0x0E, 0x40, 0x00, 0x81, 0x0B, 0x89, - 0x00, 0xC2, 0x0E, 0x08, 0x1C, 0x62, 0x00, 0xC4, 0x0E, 0x41, 0x00, 0xC5, 0x0E, 0x09, 0x02, 0xBF, - 0x80, 0xE7, 0x00, 0xF8, 0x0B, 0xA9, 0x00, 0xFB, 0x0B, 0xAC, 0x00, 0xC0, 0x0E, 0x40, 0x00, 0x81, - 0x0B, 0x91, 0x00, 0xC2, 0x0E, 0x0E, 0x1C, 0x62, 0x00, 0xC4, 0x0E, 0x41, 0x00, 0xC5, 0x0E, 0x0F, - 0x02, 0xBF, 0x80, 0xE7, 0x00, 0xF8, 0x0B, 0xAB, 0x00, 0xFB, 0x0B, 0xAE, 0x00, 0xC0, 0x0E, 0x43, - 0x00, 0x81, 0x0B, 0x95, 0x00, 0xC2, 0x0E, 0x10, 0x1C, 0x62, 0x1C, 0x80, 0x00, 0xC5, 0x0E, 0x0A, - 0x02, 0xBF, 0x80, 0xE7, 0x00, 0xF8, 0x0B, 0xB1, 0x00, 0xFB, 0x0B, 0xAF, 0x02, 0xDF, 0x00, 0xC0, - 0x0E, 0x40, 0x00, 0x81, 0x0B, 0x89, 0x00, 0xC2, 0x0E, 0x08, 0x1C, 0x62, 0x00, 0xC4, 0x0E, 0x41, - 0x00, 0xC5, 0x0E, 0x09, 0x02, 0xBF, 0x80, 0xE7, 0x00, 0xF8, 0x0B, 0xA9, 0x00, 0xFB, 0x0B, 0xAC, - 0x00, 0xC0, 0x0E, 0x40, 0x00, 0x81, 0x0B, 0x8D, 0x00, 0xC2, 0x0E, 0x0B, 0x1C, 0x62, 0x00, 0xC4, - 0x0E, 0x41, 0x00, 0xC5, 0x0E, 0x0C, 0x02, 0xBF, 0x80, 0xE7, 0x00, 0xF8, 0x0B, 0xAA, 0x00, 0xFB, - 0x0B, 0xAD, 0x00, 0xC0, 0x0E, 0x40, 0x00, 0x81, 0x0B, 0x91, 0x00, 0xC2, 0x0E, 0x0E, 0x1C, 0x62, - 0x00, 0xC4, 0x0E, 0x41, 0x00, 0xC5, 0x0E, 0x0F, 0x02, 0xBF, 0x80, 0xE7, 0x00, 0xF8, 0x0B, 0xAB, - 0x00, 0xFB, 0x0B, 0xAE, 0x00, 0xC0, 0x0E, 0x43, 0x00, 0x81, 0x0B, 0x97, 0x00, 0xC2, 0x0E, 0x0A, - 0x1C, 0x62, 0x1C, 0x80, 0x00, 0xC5, 0x0E, 0x0D, 0x02, 0xBF, 0x80, 0xE7, 0x00, 0xF8, 0x0B, 0xAF, - 0x00, 0xFB, 0x0B, 0xB0, 0x00, 0xC0, 0x0E, 0x43, 0x00, 0x81, 0x0B, 0x95, 0x00, 0xC2, 0x0E, 0x10, - 0x1C, 0x62, 0x02, 0xBF, 0x81, 0xF9, 0x00, 0xF8, 0x0B, 0xB1, 0x02, 0xDF, 0x00, 0xC0, 0x0E, 0x40, - 0x00, 0x81, 0x0B, 0x89, 0x00, 0xC2, 0x0E, 0x08, 0x00, 0x83, 0x0E, 0x44, 0x00, 0xC4, 0x0E, 0x41, - 0x00, 0xC5, 0x0E, 0x09, 0x02, 0xBF, 0x82, 0x82, 0x00, 0xF8, 0x0B, 0xA9, 0x00, 0xFB, 0x0B, 0xAC, - 0x02, 0xDF, 0x00, 0xC0, 0x0E, 0x40, 0x00, 0x81, 0x0B, 0x89, 0x00, 0xC2, 0x0E, 0x08, 0x00, 0x83, - 0x0E, 0x44, 0x00, 0xC4, 0x0E, 0x41, 0x00, 0xC5, 0x0E, 0x09, 0x02, 0xBF, 0x82, 0x82, 0x00, 0xF8, - 0x0B, 0xA9, 0x00, 0xFB, 0x0B, 0xAC, 0x00, 0xC0, 0x0E, 0x40, 0x00, 0x81, 0x0B, 0x8D, 0x00, 0xC2, - 0x0E, 0x0B, 0x00, 0x83, 0x0E, 0x44, 0x00, 0xC4, 0x0E, 0x41, 0x00, 0xC5, 0x0E, 0x0C, 0x02, 0xBF, - 0x82, 0x82, 0x00, 0xF8, 0x0B, 0xAA, 0x00, 0xFB, 0x0B, 0xAD, 0x02, 0xDF, 0x00, 0xC0, 0x0E, 0x40, - 0x00, 0x81, 0x0B, 0x89, 0x00, 0xC2, 0x0E, 0x08, 0x00, 0x83, 0x0E, 0x44, 0x00, 0xC4, 0x0E, 0x41, - 0x00, 0xC5, 0x0E, 0x09, 0x02, 0xBF, 0x82, 0x82, 0x00, 0xF8, 0x0B, 0xA9, 0x00, 0xFB, 0x0B, 0xAC, - 0x00, 0xC0, 0x0E, 0x40, 0x00, 0x81, 0x0B, 0x91, 0x00, 0xC2, 0x0E, 0x0E, 0x00, 0x83, 0x0E, 0x44, - 0x00, 0xC4, 0x0E, 0x41, 0x00, 0xC5, 0x0E, 0x0F, 0x02, 0xBF, 0x82, 0x82, 0x00, 0xF8, 0x0B, 0xAB, - 0x00, 0xFB, 0x0B, 0xAE, 0x02, 0xDF, 0x00, 0xC0, 0x0E, 0x40, 0x00, 0x81, 0x0B, 0x89, 0x00, 0xC2, - 0x0E, 0x08, 0x00, 0x83, 0x0E, 0x44, 0x00, 0xC4, 0x0E, 0x41, 0x00, 0xC5, 0x0E, 0x09, 0x02, 0xBF, - 0x82, 0x82, 0x00, 0xF8, 0x0B, 0xA9, 0x00, 0xFB, 0x0B, 0xAC, 0x00, 0xC0, 0x0E, 0x40, 0x00, 0x81, - 0x0B, 0x8D, 0x00, 0xC2, 0x0E, 0x0B, 0x00, 0x83, 0x0E, 0x44, 0x00, 0xC4, 0x0E, 0x41, 0x00, 0xC5, - 0x0E, 0x0C, 0x02, 0xBF, 0x82, 0x82, 0x00, 0xF8, 0x0B, 0xAA, 0x00, 0xFB, 0x0B, 0xAD, 0x00, 0xC0, - 0x0E, 0x40, 0x00, 0x81, 0x0B, 0x91, 0x00, 0xC2, 0x0E, 0x0E, 0x00, 0x83, 0x0E, 0x44, 0x00, 0xC4, - 0x0E, 0x41, 0x00, 0xC5, 0x0E, 0x0F, 0x02, 0xBF, 0x82, 0x82, 0x00, 0xF8, 0x0B, 0xAB, 0x00, 0xFB, - 0x0B, 0xAE, 0x02, 0xDF, 0x00, 0xC0, 0x0E, 0x40, 0x00, 0x81, 0x0B, 0x89, 0x00, 0xC2, 0x0E, 0x08, - 0x00, 0x83, 0x0E, 0x44, 0x00, 0xC4, 0x0E, 0x41, 0x00, 0xC5, 0x0E, 0x09, 0x02, 0xBF, 0x82, 0x82, - 0x00, 0xF8, 0x0B, 0xA9, 0x00, 0xFB, 0x0B, 0xAC, 0x00, 0xC0, 0x0E, 0x43, 0x00, 0x81, 0x0B, 0x97, - 0x00, 0xC2, 0x0E, 0x0A, 0x00, 0x83, 0x0E, 0x44, 0x02, 0xBF, 0x84, 0x5D, 0x00, 0xF8, 0x0B, 0xAF, - 0x02, 0xDF, 0x00, 0xC0, 0x0E, 0x40, 0x00, 0x81, 0x0B, 0x89, 0x00, 0xC2, 0x0E, 0x08, 0x00, 0x83, - 0x0E, 0x44, 0x00, 0xC4, 0x0E, 0x41, 0x00, 0xC5, 0x0E, 0x09, 0x02, 0xBF, 0x82, 0x82, 0x00, 0xF8, - 0x0B, 0xA9, 0x00, 0xFB, 0x0B, 0xAC, 0x00, 0xC0, 0x0E, 0x40, 0x00, 0x81, 0x0B, 0x8D, 0x00, 0xC2, - 0x0E, 0x0B, 0x00, 0x83, 0x0E, 0x44, 0x00, 0xC4, 0x0E, 0x41, 0x00, 0xC5, 0x0E, 0x0C, 0x02, 0xBF, - 0x82, 0x82, 0x00, 0xF8, 0x0B, 0xAA, 0x00, 0xFB, 0x0B, 0xAD, 0x00, 0xC0, 0x0E, 0x43, 0x00, 0x81, - 0x0B, 0x97, 0x00, 0xC2, 0x0E, 0x0A, 0x00, 0x83, 0x0E, 0x44, 0x1C, 0x80, 0x00, 0xC5, 0x0E, 0x0D, - 0x02, 0xBF, 0x82, 0x82, 0x00, 0xF8, 0x0B, 0xAF, 0x00, 0xFB, 0x0B, 0xB0, 0x02, 0xDF, 0x00, 0xC0, - 0x0E, 0x40, 0x00, 0x81, 0x0B, 0x89, 0x00, 0xC2, 0x0E, 0x08, 0x00, 0x83, 0x0E, 0x44, 0x00, 0xC4, - 0x0E, 0x41, 0x00, 0xC5, 0x0E, 0x09, 0x02, 0xBF, 0x82, 0x82, 0x00, 0xF8, 0x0B, 0xA9, 0x00, 0xFB, - 0x0B, 0xAC, 0x00, 0xC0, 0x0E, 0x40, 0x00, 0x81, 0x0B, 0x91, 0x00, 0xC2, 0x0E, 0x0E, 0x00, 0x83, - 0x0E, 0x44, 0x00, 0xC4, 0x0E, 0x41, 0x00, 0xC5, 0x0E, 0x0F, 0x02, 0xBF, 0x82, 0x82, 0x00, 0xF8, - 0x0B, 0xAB, 0x00, 0xFB, 0x0B, 0xAE, 0x00, 0xC0, 0x0E, 0x43, 0x00, 0x81, 0x0B, 0x95, 0x00, 0xC2, - 0x0E, 0x10, 0x00, 0x83, 0x0E, 0x44, 0x1C, 0x80, 0x00, 0xC5, 0x0E, 0x0A, 0x02, 0xBF, 0x82, 0x82, - 0x00, 0xF8, 0x0B, 0xB1, 0x00, 0xFB, 0x0B, 0xAF, 0x02, 0xDF, 0x00, 0xC0, 0x0E, 0x40, 0x00, 0x81, - 0x0B, 0x89, 0x00, 0xC2, 0x0E, 0x08, 0x00, 0x83, 0x0E, 0x44, 0x00, 0xC4, 0x0E, 0x41, 0x00, 0xC5, - 0x0E, 0x09, 0x02, 0xBF, 0x82, 0x82, 0x00, 0xF8, 0x0B, 0xA9, 0x00, 0xFB, 0x0B, 0xAC, 0x00, 0xC0, - 0x0E, 0x40, 0x00, 0x81, 0x0B, 0x8D, 0x00, 0xC2, 0x0E, 0x0B, 0x00, 0x83, 0x0E, 0x44, 0x00, 0xC0, - 0x0E, 0x41, 0x00, 0xC5, 0x0E, 0x0C, 0x02, 0xBF, 0x82, 0x82, 0x00, 0xF8, 0x0B, 0xAA, 0x00, 0xFB, - 0x0B, 0xAD, 0x00, 0xC0, 0x0E, 0x40, 0x00, 0x81, 0x0B, 0x91, 0x00, 0xC2, 0x0E, 0x0E, 0x00, 0x83, - 0x0E, 0x44, 0x00, 0xC4, 0x0E, 0x41, 0x00, 0xC5, 0x0E, 0x0F, 0x02, 0xBF, 0x82, 0x82, 0x00, 0xF8, - 0x0B, 0xAB, 0x00, 0xFB, 0x0B, 0xAE, 0x00, 0xC0, 0x0E, 0x43, 0x00, 0x81, 0x0B, 0x97, 0x00, 0xC2, - 0x0E, 0x0A, 0x00, 0x83, 0x0E, 0x44, 0x1C, 0x80, 0x00, 0xC5, 0x0E, 0x0D, 0x02, 0xBF, 0x82, 0x82, - 0x00, 0xF8, 0x0B, 0xAF, 0x00, 0xFB, 0x0B, 0xB0, 0x00, 0xC0, 0x0E, 0x43, 0x00, 0x81, 0x0B, 0x95, - 0x00, 0xC2, 0x0E, 0x10, 0x00, 0x83, 0x0E, 0x44, 0x02, 0xBF, 0x84, 0x5D, 0x00, 0xF8, 0x0B, 0xB1, - 0x02, 0xDF, 0x00, 0xC0, 0x0E, 0x40, 0x00, 0x81, 0x0B, 0x89, 0x00, 0xC2, 0x0E, 0x08, 0x1C, 0x62, - 0x00, 0xC4, 0x0E, 0x41, 0x00, 0xC5, 0x0E, 0x09, 0x02, 0xBF, 0x80, 0xE7, 0x00, 0xF8, 0x0B, 0xA9, - 0x00, 0xFB, 0x0B, 0xAC, 0x00, 0xC0, 0x0E, 0x43, 0x00, 0x81, 0x0B, 0x91, 0x00, 0xC2, 0x0E, 0x0E, - 0x1C, 0x62, 0x1C, 0x80, 0x00, 0xC5, 0x0E, 0x0F, 0x02, 0xBF, 0x80, 0xE7, 0x00, 0xF8, 0x0B, 0xAB, - 0x00, 0xFB, 0x0B, 0xAE, 0x02, 0xDF, 0x00, 0xC0, 0x0E, 0x40, 0x00, 0x81, 0x0B, 0x89, 0x00, 0xC2, - 0x0E, 0x08, 0x1C, 0x62, 0x00, 0xC4, 0x0E, 0x41, 0x00, 0xC5, 0x0E, 0x09, 0x02, 0xBF, 0x80, 0xE7, - 0x00, 0xF8, 0x0B, 0xA9, 0x00, 0xFB, 0x0B, 0xAC, 0x00, 0xC0, 0x0E, 0x43, 0x00, 0x81, 0x0B, 0x91, - 0x00, 0xC2, 0x0E, 0x0E, 0x1C, 0x62, 0x1C, 0x80, 0x00, 0xC5, 0x0E, 0x0F, 0x02, 0xBF, 0x80, 0xE7, - 0x00, 0xF8, 0x0B, 0xAB, 0x00, 0xFB, 0x0B, 0xAE, 0x00, 0xC0, 0x0E, 0x40, 0x00, 0x81, 0x0B, 0x8D, - 0x00, 0xC2, 0x0E, 0x0B, 0x1C, 0x62, 0x00, 0xC4, 0x0E, 0x41, 0x00, 0xC5, 0x0E, 0x0C, 0x02, 0xBF, - 0x80, 0xE7, 0x00, 0xF8, 0x0B, 0xAA, 0x00, 0xFB, 0x0B, 0xAD, 0x00, 0xC0, 0x0E, 0x43, 0x00, 0x81, - 0x0B, 0x99, 0x00, 0xC2, 0x0E, 0x0D, 0x1C, 0x62, 0x02, 0xBF, 0x81, 0xF9, 0x00, 0xF8, 0x0B, 0xB0, - 0x02, 0xDF, 0x00, 0xC0, 0x0E, 0x40, 0x00, 0x81, 0x0B, 0x89, 0x00, 0xC2, 0x0E, 0x08, 0x00, 0x83, - 0x0E, 0x44, 0x00, 0xC4, 0x0E, 0x41, 0x00, 0xC5, 0x0E, 0x09, 0x02, 0xBF, 0x82, 0x82, 0x00, 0xF8, - 0x0B, 0xA9, 0x00, 0xFB, 0x0B, 0xAC, 0x00, 0xC0, 0x0E, 0x43, 0x00, 0x81, 0x0B, 0x91, 0x00, 0xC2, - 0x0E, 0x0E, 0x00, 0x83, 0x0E, 0x44, 0x1C, 0x80, 0x00, 0xC5, 0x0E, 0x0F, 0x02, 0xBF, 0x82, 0x82, - 0x00, 0xF8, 0x0B, 0xAB, 0x00, 0xFB, 0x0B, 0xAE, 0x02, 0xDF, 0x00, 0xC0, 0x0E, 0x40, 0x00, 0x81, - 0x0B, 0x89, 0x00, 0xC2, 0x0E, 0x08, 0x00, 0x83, 0x0E, 0x44, 0x00, 0xC4, 0x0E, 0x41, 0x00, 0xC5, - 0x0E, 0x09, 0x02, 0xBF, 0x82, 0x82, 0x00, 0xF8, 0x0B, 0xA9, 0x00, 0xFB, 0x0B, 0xAC, 0x00, 0xC0, - 0x0E, 0x43, 0x00, 0x81, 0x0B, 0x91, 0x00, 0xC2, 0x0E, 0x0E, 0x00, 0x83, 0x0E, 0x44, 0x1C, 0x80, - 0x00, 0xC5, 0x0E, 0x0F, 0x02, 0xBF, 0x82, 0x82, 0x00, 0xF8, 0x0B, 0xAB, 0x00, 0xFB, 0x0B, 0xAE, - 0x00, 0xC0, 0x0E, 0x40, 0x00, 0x81, 0x0B, 0x8D, 0x00, 0xC2, 0x0E, 0x0B, 0x00, 0x83, 0x0E, 0x44, - 0x00, 0xC4, 0x0E, 0x41, 0x00, 0xC5, 0x0E, 0x0C, 0x02, 0xBF, 0x82, 0x82, 0x00, 0xF8, 0x0B, 0xAA, - 0x00, 0xFB, 0x0B, 0xAD, 0x00, 0xC0, 0x0E, 0x43, 0x00, 0x81, 0x0B, 0x99, 0x00, 0xC2, 0x0E, 0x0D, - 0x00, 0x83, 0x0E, 0x44, 0x02, 0xBF, 0x84, 0x5D, 0x00, 0xF8, 0x0B, 0xB0, 0x02, 0xDF, 0x00, 0x82, - 0x01, 0x3E, 0x01, 0xBC, 0x02, 0x48, 0x04, 0x13, 0x04, 0x27, 0x01, 0x65, 0x05, 0x74, 0x0B, 0x37, - 0x01, 0x5F, 0x04, 0x78, 0x04, 0x74, 0x04, 0x76, 0x01, 0xA9, 0x04, 0x3B, 0x04, 0x7A, 0x0B, 0xB1, - 0x01, 0x75, 0x07, 0x68, 0x07, 0x7A, 0x07, 0x9D, 0x07, 0xC0, 0x07, 0xF4, 0x08, 0x11, 0x08, 0x44, - 0x08, 0x77, 0x08, 0xC6, 0x08, 0xD9, 0x08, 0xFE, 0x09, 0x23, 0x09, 0x5A, 0x09, 0x79, 0x09, 0xAF, - 0x09, 0xE5, 0x0A, 0x39, 0x0A, 0x5B, 0x07, 0x68, 0x07, 0x68, 0x07, 0x68, 0x07, 0x68, 0x07, 0x68, - 0x07, 0x68, 0x0A, 0x99, 0x0A, 0xBD, 0x07, 0x68, 0x07, 0x68, 0x07, 0x68, 0x07, 0x68, 0x07, 0x68, - 0x07, 0x68, 0x05, 0xA8, 0x06, 0x5D, 0x07, 0x07, 0x10, 0x00, 0x12, 0x00, 0x14, 0x00, 0x8E, 0x00, - 0x81, 0x00, 0x89, 0x70, 0x19, 0x1C, 0x2E, 0xCE, 0x2C, 0xCF, 0x16, 0xCD, 0x0E, 0x80, 0x16, 0xC9, - 0x00, 0x00, 0x16, 0xCB, 0x01, 0x00, 0x1F, 0x7E, 0x1F, 0x3C, 0x81, 0x00, 0x26, 0xC9, 0x02, 0xA0, - 0x00, 0x04, 0x02, 0x9C, 0x0B, 0x46, 0x19, 0x1E, 0x19, 0x1C, 0x2E, 0xCE, 0x2C, 0xCF, 0x16, 0xCD, - 0x02, 0x80, 0x16, 0xC9, 0x00, 0x00, 0x16, 0xCB, 0x02, 0x80, 0x1C, 0x80, 0x00, 0x80, 0x02, 0x80, - 0x00, 0xC1, 0x0E, 0x1B, 0x00, 0x85, 0x00, 0x00, 0x00, 0x89, 0x00, 0x7F, 0x00, 0x82, 0x0F, 0x00, - 0x00, 0x83, 0x16, 0xB4, 0x1C, 0xE3, 0x81, 0x00, 0x26, 0xC9, 0x02, 0xA0, 0x00, 0x04, 0x02, 0x9C, - 0x0B, 0x64, 0x8F, 0x00, 0x8A, 0x78, 0x8C, 0x68, 0xF1, 0x00, 0x1A, 0x3F, 0x84, 0xE3, 0x10, 0x7E, - 0xF2, 0xE3, 0xF2, 0xE7, 0xF2, 0x78, 0x6E, 0x68, 0xF1, 0x32, 0x1A, 0x3F, 0x11, 0x9E, 0x0B, 0x80, - 0x1C, 0x67, 0x84, 0xE3, 0x10, 0x7E, 0xF2, 0xE3, 0xF2, 0xE7, 0xF2, 0x78, 0x6E, 0x68, 0xF1, 0x32, - 0x1A, 0x3F, 0x1C, 0x67, 0x84, 0xE3, 0x10, 0x7E, 0xF2, 0xE3, 0xF2, 0xE7, 0xF2, 0x00, 0x6E, 0x00, - 0x1B, 0x5E, 0x00, 0xE1, 0x0E, 0x1B, 0x00, 0x80, 0x02, 0x80, 0x00, 0x83, 0x0F, 0x00, 0x00, 0x81, - 0x00, 0x00, 0x00, 0x82, 0x01, 0x40, 0x00, 0x89, 0xFF, 0xFF, 0x89, 0x00, 0x81, 0x00, 0x8F, 0x00, - 0x11, 0xA0, 0x0B, 0xA0, 0x19, 0x7F, 0x99, 0x30, 0x1B, 0x1E, 0x1B, 0x3F, 0x7D, 0x29, 0x1B, 0x5F, - 0x1B, 0x5D, 0x8E, 0x00, 0x1F, 0xDB, 0x1F, 0x99, 0x2E, 0xCE, 0x2C, 0xCF, 0x16, 0xCD, 0x0E, 0x80, - 0x16, 0xC9, 0x00, 0x01, 0x16, 0xCB, 0x01, 0x00, 0x02, 0xBF, 0x05, 0x5C, 0x1C, 0x04, 0x02, 0x9F, - 0x00, 0x68, 0x8E, 0x00, 0x81, 0x00, 0x89, 0x70, 0x19, 0x1C, 0x2E, 0xCE, 0x2C, 0xCF, 0x16, 0xCD, - 0x07, 0xC0, 0x16, 0xC9, 0x00, 0x01, 0x16, 0xCB, 0x05, 0x00, 0x02, 0xBF, 0x05, 0x5C, 0x81, 0x00, - 0x89, 0x70, 0x19, 0x1C, 0x2E, 0xCE, 0x2C, 0xCF, 0x16, 0xCD, 0x07, 0xC0, 0x16, 0xC9, 0x00, 0x00, - 0x89, 0x00, 0x0D, 0x20, 0x2D, 0xCB, 0x4C, 0x00, 0x1C, 0x80, 0x00, 0x80, 0x07, 0xC0, 0x00, 0x83, - 0x00, 0x00, 0x1C, 0x43, 0x0A, 0x00, 0x27, 0xC9, 0x03, 0xA0, 0x00, 0x04, 0x02, 0x9C, 0x0B, 0xD3, - 0x2E, 0xCE, 0x2C, 0xCF, 0x16, 0xCD, 0x07, 0xD0, 0x16, 0xC9, 0x00, 0x00, 0x16, 0xCB, 0x04, 0xE0, - 0x8F, 0x00, 0x80, 0xF0, 0x80, 0xC0, 0x6A, 0x00, 0x48, 0x00, 0x11, 0x4F, 0x0B, 0xEE, 0x80, 0xF0, - 0x80, 0xC0, 0x6B, 0x32, 0x49, 0x22, 0x80, 0xF0, 0x80, 0xC0, 0x6A, 0x3A, 0x48, 0x2A, 0x80, 0xF0, - 0x80, 0xC0, 0x6B, 0x32, 0x49, 0x22, 0x1B, 0x5F, 0x1B, 0x5D, 0x80, 0xF0, 0x80, 0xC0, 0x68, 0x00, - 0x7C, 0x00, 0x4A, 0x00, 0x11, 0x4F, 0x0C, 0x05, 0x80, 0xF0, 0x80, 0xC0, 0x69, 0x32, 0x7D, 0x00, - 0x4B, 0x22, 0x80, 0xF0, 0x80, 0xC0, 0x68, 0x3A, 0x7C, 0x00, 0x4A, 0x2A, 0x80, 0xF0, 0x80, 0xC0, - 0x69, 0x32, 0x7D, 0x00, 0x4B, 0x22, 0x1B, 0x5F, 0x1B, 0x5D, 0x1C, 0x04, 0x02, 0x9F, 0x00, 0x68, - 0x8E, 0x00, 0x16, 0xFC, 0xEC, 0xC0, 0x1F, 0xCC, 0x1D, 0x9E, 0x2E, 0xFD, 0x26, 0xFC, 0x02, 0xA0, - 0x80, 0x00, 0x02, 0x9C, 0x0C, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0x8E, 0x00, - 0x00, 0xF0, 0x0E, 0x17, 0x00, 0xFE, 0x0E, 0x18, 0x00, 0xFC, 0x0E, 0x19, 0x1F, 0xCC, 0x1D, 0x9E, - 0x16, 0xFC, 0xFE, 0xED, 0x2E, 0xFD, 0x26, 0xFC, 0x02, 0xA0, 0x80, 0x00, 0x02, 0x9C, 0x0C, 0x2B, - 0x00, 0xD0, 0x0E, 0x17, 0x00, 0xDE, 0x0E, 0x18, 0x00, 0xDC, 0x0E, 0x19, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0x8E, 0x00, 0x1D, 0xBC, 0x1D, 0xBE, 0x81, 0x00, 0x00, 0xDE, - 0x0B, 0xB7, 0x06, 0x01, 0x02, 0x95, 0x0C, 0x47, 0x0E, 0x00, 0x00, 0xFE, 0x0B, 0x87, 0x1F, 0xCD, - 0x1F, 0x8D, 0x02, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, - 0x8E, 0x00, 0x1D, 0xBC, 0x1D, 0xBE, 0x81, 0x00, 0x00, 0xDE, 0x0B, 0xB7, 0x06, 0x01, 0x02, 0x95, - 0x0C, 0x5F, 0x0E, 0x00, 0x00, 0xFE, 0x0B, 0x87, 0x1F, 0xCD, 0x1F, 0x8D, 0x02, 0xFF, 0x81, 0x00, - 0x00, 0xDE, 0x0B, 0x88, 0x06, 0x01, 0x02, 0x95, 0x0C, 0x71, 0x00, 0xDE, 0x0B, 0xDA, 0x2E, 0xDA, - 0x00, 0xDE, 0x0B, 0xDB, 0x2E, 0xDB, 0x00, 0xDE, 0x0B, 0xDC, 0x2E, 0xDC, 0x1F, 0xCD, 0x1F, 0x8D, - 0x02, 0xFF, 0x00, 0xDE, 0x0B, 0xDA, 0x2E, 0xDA, 0x26, 0xDB, 0x2E, 0xDB, 0x26, 0xDC, 0x2E, 0xDC, - 0x81, 0x00, 0x00, 0xDC, 0x0B, 0xDD, 0x76, 0x00, 0x00, 0xFC, 0x0B, 0xDD, 0x81, 0x00, 0x1F, 0xCD, - 0x1F, 0x8D, 0x02, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0x0C, 0x9F, 0x0C, 0xA2, 0x0C, 0xDA, - 0x0C, 0xDD, 0x8E, 0x00, 0x81, 0x00, 0x89, 0x00, 0x02, 0xBF, 0x0C, 0xE0, 0x27, 0xFF, 0x00, 0x9E, - 0x0C, 0x8D, 0x4C, 0x00, 0x1C, 0x7E, 0x03, 0x13, 0x1C, 0x7F, 0x17, 0x6F, 0x00, 0x21, 0x02, 0x9F, - 0x00, 0x30, 0x00, 0x21, 0x81, 0x00, 0x89, 0x00, 0x02, 0xBF, 0x0C, 0xE0, 0x24, 0xFF, 0x02, 0xBF, - 0x0C, 0xE6, 0x25, 0xFF, 0x02, 0xBF, 0x0C, 0xE6, 0x27, 0xFF, 0x2E, 0xCE, 0x2C, 0xCF, 0x16, 0xC9, - 0x00, 0x01, 0x2F, 0xCD, 0x2D, 0xCB, 0x81, 0x00, 0x89, 0x00, 0x02, 0xBF, 0x0C, 0xE0, 0x24, 0xFF, - 0x1C, 0x9E, 0x1C, 0xBC, 0x02, 0xBF, 0x0C, 0xE6, 0x25, 0xFF, 0x02, 0xBF, 0x0C, 0xE6, 0x27, 0xFF, - 0x1C, 0xDF, 0x1C, 0xFD, 0x81, 0x00, 0x02, 0xBF, 0x0C, 0xE0, 0x26, 0xFF, 0x1C, 0x1E, 0x89, 0x00, - 0x02, 0xBF, 0x0C, 0xE6, 0x20, 0xFF, 0x1F, 0x5F, 0x02, 0xBF, 0x0C, 0xE0, 0x21, 0xFF, 0x02, 0xBF, - 0x0C, 0xE0, 0x23, 0xFF, 0x26, 0xC9, 0x02, 0xA0, 0x00, 0x04, 0x02, 0x9C, 0x0C, 0xD2, 0x02, 0x9F, - 0x80, 0xB5, 0x00, 0x21, 0x02, 0x9F, 0x80, 0x00, 0x00, 0x21, 0x02, 0x9F, 0x00, 0x45, 0x00, 0x21, - 0x26, 0xFE, 0x02, 0xC0, 0x80, 0x00, 0x02, 0x9C, 0x0C, 0xE0, 0x02, 0xDF, 0x27, 0xFE, 0x03, 0xC0, - 0x80, 0x00, 0x02, 0x9C, 0x0C, 0xE6, 0x02, 0xDF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -u16 dspSlaveLength = sizeof(dspSlave); - -#endif \ No newline at end of file diff --git a/src/musyx/runtime/hardware.c b/src/musyx/runtime/hardware.c deleted file mode 100644 index c732c984..00000000 --- a/src/musyx/runtime/hardware.c +++ /dev/null @@ -1,526 +0,0 @@ -#include "musyx/hardware.h" -#include "musyx/assert.h" -#include "musyx/s3d.h" -#include "musyx/sal.h" -#include "musyx/seq.h" -#include "musyx/stream.h" -#include "musyx/synth.h" - -static volatile const u16 itdOffTab[128] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, - 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, - 9, 9, 9, 10, 10, 10, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 15, 15, 15, 16, 16, 17, - 17, 17, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 22, 22, 22, 23, 23, 23, 24, 24, 24, 25, - 25, 25, 26, 26, 26, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, - 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, -}; - -// SND_PROFILE_INFO prof; - -u8 salFrame; -u8 salAuxFrame; -u8 salNumVoices; -u8 salMaxStudioNum; -SND_HOOKS salHooks; -u8 salTimeOffset; -void hwSetTimeOffset(u8 offset); - -static void snd_handle_irq() { - u8 r; // r31 - u8 i; // r30 - u8 v; // r29 - if (sndActive == 0) { - return; - } - - streamCorrectLoops(); - hwIRQEnterCritical(); - // sndProfStartPCM(&prof.dspCtrl); - salCtrlDsp(salAiGetDest()); - // sndProfStopPMC(&prof.dspCtrl); - hwIRQLeaveCritical(); - hwIRQEnterCritical(); - // sndProfStartPCM(&prof.auxProcessing); - salHandleAuxProcessing(); - // sndProfStopPMC(&prof.auxProcessing); - hwIRQLeaveCritical(); - hwIRQEnterCritical(); - salFrame ^= 1; - salAuxFrame = (salAuxFrame + 1) % 3; - - for (v = 0; v < salNumVoices; ++v) { - for (i = 0; i < 5; ++i) { - dspVoice[v].changed[i] = 0; - } - } - - // sndProfStartPMC(&prof.sequencer); - // sndProfPausePMC(&prof.sequencer); - // sndProfStartPMC(&prof.synthesizer); - // sndProfPausePMC(&prof.synthesizer); - hwIRQLeaveCritical(); - for (r = 0; r < 5; ++r) { - hwIRQEnterCritical(); - hwSetTimeOffset(r); - // sndProfStartPMC(&prof.sequencer); - seqHandle(256); - // sndProfPausePMC(&prof.sequencer); - // sndProfStartPMC(&prof.synthesizer); - synthHandle(256); - // sndProfPausePMC(&prof.synthesizer); - hwIRQLeaveCritical(); - } - - // sndProfStopPMC(&prof.sequencer); - // sndProfStopPMC(&prof.synthesizer); - hwIRQEnterCritical(); - hwSetTimeOffset(0); - // sndProfStartPMC(&prof.emitters); - s3dHandle(); - // sndProfStopPMC(&prof.emitters); - hwIRQLeaveCritical(); - hwIRQEnterCritical(); - // sndProfStartPMC(&prof.streaming); - streamHandle(); - // sndProfStopPMC(&prof.streaming); - hwIRQLeaveCritical(); - hwIRQEnterCritical(); - vsSampleUpdates(); - hwIRQLeaveCritical(); - // sndProfUpdateMisc(&prof); - - // if (sndProfUserCallback) { - // sndProfUserCallback(&prof); - // } -} - -s32 hwInit(u32* frq, u16 numVoices, u16 numStudios, u32 flags) { - MUSY_DEBUG("Entering hwInit()\n\n"); - hwInitIrq(); - salFrame = 0; - salAuxFrame = 0; - salMessageCallback = NULL; - if (salInitAi(snd_handle_irq, flags, frq) != 0) { - MUSY_DEBUG("salInitAi() is done.\n\n"); - if (salInitDspCtrl(numVoices, numStudios, (flags & 1) != 0) != 0) { - MUSY_DEBUG("salInitDspCtrl() is done.\n\n"); - if (salInitDsp(flags)) { - MUSY_DEBUG("salInitDsp() is done.\n\n"); - hwEnableIrq(); - MUSY_DEBUG("Starting AI DMA...\n\n"); - salStartAi(); - MUSY_DEBUG("hwInit() done.\n\n"); - return 0; - } - MUSY_DEBUG("Could not initialize DSP.\n"); - } else { - MUSY_DEBUG("Could not initialize DSP control logic.\n"); - } - } else { - MUSY_DEBUG("Could not initialize AI.\n"); - } - return -1; -} - -void hwExit() { - hwDisableIrq(); - salExitDsp(); - salExitDspCtrl(); - salExitAi(); - hwEnableIrq(); - hwExitIrq(); -} - -void hwSetTimeOffset(u8 offset) { salTimeOffset = offset; } - -u8 hwGetTimeOffset() { return salTimeOffset; } - -u32 hwIsActive(u32 v) { return dspVoice[v].state != 0; } -u32 hwGlobalActivity() { return 0; } - -void hwSetMesgCallback(SND_MESSAGE_CALLBACK callback) { salMessageCallback = callback; } - -void hwSetPriority(u32 v, u32 prio) { dspVoice[v].prio = prio; } - -void hwInitSamplePlayback(u32 v, u16 smpID, void* newsmp, u32 set_defadsr, u32 prio, - u32 callbackUserValue, u32 setSRC, u8 itdMode) { - unsigned char i; // r30 - unsigned long bf; // r29 - bf = 0; - for (i = 0; i <= salTimeOffset; ++i) { - bf |= dspVoice[v].changed[i] & 0x20; - dspVoice[v].changed[i] = 0; - } - - dspVoice[v].changed[0] = bf; - dspVoice[v].prio = prio; - dspVoice[v].mesgCallBackUserValue = callbackUserValue; - dspVoice[v].flags = 0; - dspVoice[v].smp_id = smpID; - dspVoice[v].smp_info = *(SAMPLE_INFO*)newsmp; - - if (set_defadsr != 0) { - dspVoice[v].adsr.mode = 0; - dspVoice[v].adsr.data.dls.aTime = 0; - dspVoice[v].adsr.data.dls.dTime = 0; - dspVoice[v].adsr.data.dls.sLevel = 0x7FFF; - dspVoice[v].adsr.data.dls.rTime = 0; - } - - dspVoice[v].lastUpdate.pitch = 0xff; - dspVoice[v].lastUpdate.vol = 0xff; - dspVoice[v].lastUpdate.volA = 0xff; - dspVoice[v].lastUpdate.volB = 0xff; - - if (setSRC != 0) { - hwSetSRCType(v, 0); - hwSetPolyPhaseFilter(v, 1); - } - - hwSetITDMode(v, itdMode); -} - -void hwBreak(s32 vid) { - if (dspVoice[vid].state == 1 && salTimeOffset == 0) { - dspVoice[vid].startupBreak = 1; - } - - dspVoice[vid].changed[salTimeOffset] |= 0x20; -} - -void hwSetADSR(u32 v, void* _adsr, u8 mode) { - u32 sl; // r29 - ADSR_INFO* adsr = (ADSR_INFO*)_adsr; // r30 - - switch (mode) { - case 0: { - dspVoice[v].adsr.mode = 0; - dspVoice[v].adsr.data.linear.aTime = adsr->data.linear.atime; - dspVoice[v].adsr.data.linear.dTime = adsr->data.linear.dtime; - sl = adsr->data.linear.slevel << 3; - if (sl > 0x7fff) { - sl = 0x7fff; - } - - dspVoice[v].adsr.data.linear.sLevel = sl; - dspVoice[v].adsr.data.linear.rTime = adsr->data.linear.rtime; - break; - } - case 1: - case 2: - dspVoice[v].adsr.mode = 1; - dspVoice[v].adsr.data.dls.aMode = 0; - if (mode == 1) { - dspVoice[v].adsr.data.dls.aTime = adsrConvertTimeCents(adsr->data.dls.atime) & 0xFFFF; - dspVoice[v].adsr.data.dls.dTime = adsrConvertTimeCents(adsr->data.dls.dtime) & 0xFFFF; - - sl = adsr->data.dls.slevel >> 2; - if (sl > 0x3ff) { - sl = 0x3ff; - } - - dspVoice[v].adsr.data.dls.sLevel = 193 - dspScale2IndexTab[sl]; - } else { - dspVoice[v].adsr.data.dls.aTime = adsr->data.dls.atime & 0xFFFF; - dspVoice[v].adsr.data.dls.dTime = adsr->data.dls.dtime & 0xFFFF; - dspVoice[v].adsr.data.dls.sLevel = adsr->data.dls.slevel; - } - - dspVoice[v].adsr.data.dls.rTime = adsr->data.dls.rtime; - } - - dspVoice[v].changed[0] |= 0x10; -} - -void hwSetVirtualSampleLoopBuffer(u32 voice, void* addr, u32 len) { - dspVoice[voice].vSampleInfo.loopBufferAddr = addr; - dspVoice[voice].vSampleInfo.loopBufferLength = len; -} - -u32 hwGetVirtualSampleState(u32 voice) { return dspVoice[voice].vSampleInfo.inLoopBuffer; } - -u8 hwGetSampleType(u32 voice) { return dspVoice[voice].smp_info.compType; } - -u16 hwGetSampleID(u32 voice) { return dspVoice[voice].smp_id; } - -void hwSetStreamLoopPS(u32 voice, u8 ps) { dspVoice[voice].streamLoopPS = ps; } - -void hwStart(u32 v, u8 studio) { - dspVoice[v].singleOffset = salTimeOffset; - salActivateVoice(&dspVoice[v], studio); -} - -void hwKeyOff(u32 v) { dspVoice[v].changed[salTimeOffset] |= 0x40; } - -void hwSetPitch(u32 v, u16 speed) { - DSPvoice* dsp_vptr = &dspVoice[v]; - - if (speed >= 0x4000) { - speed = 0x3fff; - } - - if (dsp_vptr->lastUpdate.pitch != 0xff && - dsp_vptr->pitch[dsp_vptr->lastUpdate.pitch] == speed * 16) { - return; - } - - dsp_vptr->pitch[salTimeOffset] = speed * 16; - dsp_vptr->changed[salTimeOffset] |= 8; - dsp_vptr->lastUpdate.pitch = salTimeOffset; -} - -void hwSetSRCType(u32 v, u8 salSRCType) { - static u16 dspSRCType[3] = {0, 1, 2}; - struct DSPvoice* dsp_vptr = &dspVoice[v]; - dsp_vptr->srcTypeSelect = dspSRCType[salSRCType]; - dsp_vptr->changed[0] |= 0x100; -} - -void hwSetPolyPhaseFilter(u32 v, u8 salCoefSel) { - static u16 dspCoefSel[3] = {0, 1, 2}; - DSPvoice* dsp_vptr = &dspVoice[v]; - dsp_vptr->srcCoefSelect = dspCoefSel[salCoefSel]; - dsp_vptr->changed[0] |= 0x80; -} - -static void SetupITD(DSPvoice* dsp_vptr, u8 pan) { - dsp_vptr->itdShiftL = itdOffTab[pan]; - dsp_vptr->itdShiftR = 32 - itdOffTab[pan]; - dsp_vptr->changed[0] |= 0x200; -} - -void hwSetITDMode(u32 v, u8 mode) { - if (!mode) { - dspVoice[v].flags |= 0x80000000; - dspVoice[v].itdShiftL = 16; - dspVoice[v].itdShiftR = 16; - return; - } - dspVoice[v].flags &= ~0x80000000; -} - -#define hwGetITDMode(dsp_vptr) (dsp_vptr->flags & 0x80000000) - -void hwSetVolume(u32 v, u8 table, float vol, u32 pan, u32 span, float auxa, float auxb) { - SAL_VOLINFO vi; // r1+0x24 - u16 il; // r30 - u16 ir; // r29 - u16 is; // r28 - DSPvoice* dsp_vptr = &dspVoice[v]; // r31 - if (vol >= 1.f) { - vol = 1.f; - } - - if (auxa >= 1.f) { - auxa = 1.f; - } - - if (auxb >= 1.f) { - auxb = 1.f; - } - - salCalcVolume(table, &vi, vol, pan, span, auxa, auxb, (dsp_vptr->flags & 0x80000000) != 0, - dspStudio[dsp_vptr->studio].type == SND_STUDIO_TYPE_DPL2); - - il = 32767.f * vi.volL; - ir = 32767.f * vi.volR; - is = 32767.f * vi.volS; - - if (dsp_vptr->lastUpdate.vol == 0xff || dsp_vptr->volL != il || dsp_vptr->volR != ir || - dsp_vptr->volS != is) { - dsp_vptr->volL = il; - dsp_vptr->volR = ir; - dsp_vptr->volS = is; - dsp_vptr->changed[0] |= 1; - dsp_vptr->lastUpdate.vol = 0; - } - - il = 32767.f * vi.volAuxAL; - ir = 32767.f * vi.volAuxAR; - is = 32767.f * vi.volAuxAS; - - if (dsp_vptr->lastUpdate.volA == 0xff || dsp_vptr->volLa != il || dsp_vptr->volRa != ir || - dsp_vptr->volSa != is) { - dsp_vptr->volLa = il; - dsp_vptr->volRa = ir; - dsp_vptr->volSa = is; - dsp_vptr->changed[0] |= 2; - dsp_vptr->lastUpdate.volA = 0; - } - - il = 32767.f * vi.volAuxBL; - ir = 32767.f * vi.volAuxBR; - is = 32767.f * vi.volAuxBS; - - if (dsp_vptr->lastUpdate.volB == 0xff || dsp_vptr->volLb != il || dsp_vptr->volRb != ir || - dsp_vptr->volSb != is) { - dsp_vptr->volLb = il; - dsp_vptr->volRb = ir; - dsp_vptr->volSb = is; - dsp_vptr->changed[0] |= 4; - dsp_vptr->lastUpdate.volB = 0; - } - - if (hwGetITDMode(dsp_vptr)) { - SetupITD(dsp_vptr, (pan >> 16)); - } -} - -void hwOff(s32 vid) { salDeactivateVoice(&dspVoice[vid]); } - -void hwSetAUXProcessingCallbacks(u8 studio, SND_AUX_CALLBACK auxA, void* userA, - SND_AUX_CALLBACK auxB, void* userB) { - dspStudio[studio].auxAHandler = auxA; - dspStudio[studio].auxAUser = userA; - dspStudio[studio].auxBHandler = auxB; - dspStudio[studio].auxBUser = userB; -} - -void hwActivateStudio(u8 studio, bool isMaster, SND_STUDIO_TYPE type) { - salActivateStudio(studio, isMaster, type); -} - -void hwDeactivateStudio(u8 studio) { salDeactivateStudio(studio); } - -void hwChangeStudioMix(u8 studio, u32 isMaster) { dspStudio[studio].isMaster = isMaster; } - -bool hwIsStudioActive(u8 studio) { return dspStudio[studio].state == 1; } - -bool hwAddInput(u8 studio, SND_STUDIO_INPUT* in_desc) { - return salAddStudioInput(&dspStudio[studio], in_desc); -} - -bool hwRemoveInput(u8 studio, SND_STUDIO_INPUT* in_desc) { - return salRemoveStudioInput(&dspStudio[studio], in_desc); -} - -void hwChangeStudio(u32 v, u8 studio) { salReconnectVoice(&dspVoice[v], studio); } - -u32 hwGetPos(u32 v) { - unsigned long pos; // r31 - unsigned long off; // r30 - if (dspVoice[v].state != 2) { - return 0; - } - - switch (dspVoice[v].smp_info.compType) { - case 0: - case 1: - case 4: - case 5: - pos = ((dspVoice[v].currentAddr - (u32)dspVoice[v].smp_info.addr * 2) / 16) * 14; - off = dspVoice[v].currentAddr & 0xf; - if (off >= 2) { - pos += off - 2; - } - break; - case 3: - pos = dspVoice[v].currentAddr - (u32)dspVoice[v].smp_info.addr; - break; - case 2: - pos = dspVoice[v].currentAddr - ((u32)dspVoice[v].smp_info.addr / 2); - break; - } - - return pos; -} - -void hwFlushStream(void* base, u32 offset, u32 bytes, u8 hwStreamHandle, void (*callback)(size_t), - u32 user) { - size_t aram; // r28 - size_t mram; // r29 - size_t len; - aram = aramGetStreamBufferAddress(hwStreamHandle, &len); - bytes += (offset & 31); - offset &= ~31; - bytes = (bytes + 31) & ~31; - mram = (u32)base + offset; -#if MUSY_TARGET == MUSY_TARGET_DOLPHIN - DCStoreRange((void*)mram, bytes); -#endif - aramUploadData((void*)mram, aram + offset, bytes, 1, callback, user); -} - -void hwPrepareStreamBuffer() {} -u8 hwInitStream(u32 len) { return aramAllocateStreamBuffer(len); } - -void hwExitStream(u8 id) { aramFreeStreamBuffer(id); } - -void* hwGetStreamPlayBuffer(u8 hwStreamHandle) { - return (void*)aramGetStreamBufferAddress(hwStreamHandle, NULL); -} - -void* hwTransAddr(void* samples) { return samples; } - -u32 hwFrq2Pitch(u32 frq) { return (frq * 4096.f) / synthInfo.mixFrq; } - -void hwInitSampleMem(u32 baseAddr, u32 length) { -#line 940 - MUSY_ASSERT(baseAddr == 0x00000000); - aramInit(length); -} - -void hwExitSampleMem() { aramExit(); } - -static u32 convert_length(u32 len, u8 type) { - switch (type) { - case 0: - case 1: - case 4: - case 5: - return (((u32)((len + 0xD) / 0xe))) * 8; - case 2: - return len * 2; - } - return len; -} - -void hwSaveSample(void* header, void* data) { -#if MUSY_TARGET == MUSY_TARGET_DOLPHIN - u32 len = ((u32*)*((u32*)header))[1] & 0xFFFFFF; - u8 type = ((u32*)*((u32*)header))[1] >> 0x18; - len = convert_length(len, type); - *((u32*)data) = (u32)aramStoreData((void*)*((u32*)data), len); -#endif -} - -void hwSetSaveSampleCallback(ARAMUploadCallback callback, unsigned long chunckSize) { - aramSetUploadCallback(callback, chunckSize); -} - -void hwRemoveSample(void* header, void* data) { -#if MUSY_VERSION <= MUSY_VERSION_CHECK(1, 5, 3) - u32 len = (((u32*)header))[1] & 0xFFFFFF; - u8 type = (((u32*)header))[1] >> 0x18; - len = convert_length(len, type); -#else - u8 type = (((u32*)header))[1] >> 0x18; - u32 len = convert_length((((u32*)header))[1] & 0xFFFFFF, type); -#endif - aramRemoveData(data, len); -} - -void hwSyncSampleMem() { aramSyncTransferQueue(); } - -void hwFrameDone() {} - -void sndSetHooks(SND_HOOKS* hooks) { salHooks = *hooks; } - -void hwEnableHRTF() { - if (dspHRTFOn != FALSE) { - return; - } - dspHRTFOn = TRUE; - salInitHRTFBuffer(); -} -void hwDisableHRTF() { dspHRTFOn = FALSE; } - -u32 hwGetVirtualSampleID(u32 v) { - if (dspVoice[v].state == 0) { - return 0xFFFFFFFF; - } - - return dspVoice[v].virtualSampleID; -} - -bool hwVoiceInStartup(u32 v) { return dspVoice[v].state == 1; } diff --git a/src/musyx/runtime/hw_aramdma.c b/src/musyx/runtime/hw_aramdma.c deleted file mode 100644 index b411c12d..00000000 --- a/src/musyx/runtime/hw_aramdma.c +++ /dev/null @@ -1,422 +0,0 @@ -#include "musyx/assert.h" -#include "musyx/musyx.h" -#include "musyx/platform.h" - -typedef struct STREAM_BUFFER { - // total size: 0x10 - struct STREAM_BUFFER* next; // offset 0x0, size 0x4 - unsigned long aram; // offset 0x4, size 0x4 - unsigned long length; // offset 0x8, size 0x4 - unsigned long allocLength; // offset 0xC, size 0x4 -} STREAM_BUFFER; - -#if MUSY_TARGET == MUSY_TARGET_DOLPHIN -#include -#include -#include - -typedef struct ARAMTransferJob { - // total size: 0x28 - ARQRequest arq; // offset 0x0, size 0x20 - void (*callback)(u32); // offset 0x20, size 0x4 - unsigned long user; // offset 0x24, size 0x4 -} ARAMTransferJob; - -typedef struct ARAMTransferQueue { - // total size: 0x284 - ARAMTransferJob queue[16]; // offset 0x0, size 0x280 - vu8 write; // offset 0x280, size 0x1 - vu8 valid; // offset 0x281, size 0x1 -} ARAMTransferQueue; - -static u32 aramTop; // size: 0x4 -static u32 aramWrite; // size: 0x4 -static u32 aramStream; // size: 0x4 -static void* (*aramUploadCallback)(u32, u32); // size: 0x4 -static u32 aramUploadChunkSize; // size: 0x4 - -static ARAMTransferQueue aramQueueLo; -static ARAMTransferQueue aramQueueHi; - -static STREAM_BUFFER aramStreamBuffers[64]; -static STREAM_BUFFER* aramUsedStreamBuffers; -static STREAM_BUFFER* aramFreeStreamBuffers; -static STREAM_BUFFER* aramIdleStreamBuffers; - -static void InitStreamBuffers(); - -static void aramQueueInit() { - aramQueueLo.write = aramQueueLo.valid = 0; - aramQueueHi.write = aramQueueHi.valid = 0; -} - -static void aramQueueCallback(unsigned long ptr) { - u32 i; // r31 - ARQRequest* arq; // r29 - ARAMTransferQueue* aramQueue; // r30 - - arq = (ARQRequest*)ptr; - if (arq->priority == 1) { - aramQueue = &aramQueueHi; - } else { - aramQueue = &aramQueueLo; - } - - for (i = 0; i < 16; ++i) { - if (arq == &aramQueue->queue[i].arq && aramQueue->queue[i].callback) { - aramQueue->queue[i].callback(aramQueue->queue[i].user); - } - } - - --aramQueue->valid; -} - -void aramUploadData(void* mram, unsigned long aram, unsigned long len, unsigned long highPrio, - void (*callback)(unsigned long), unsigned long user) { - ARAMTransferQueue* aramQueue; // r31 - int old; // r30 - - aramQueue = highPrio != 0 ? &aramQueueHi : &aramQueueLo; - - for (;;) { - old = OSDisableInterrupts(); - if (aramQueue->valid < 16) { - aramQueue->queue[aramQueue->write].arq.owner = 42; - aramQueue->queue[aramQueue->write].arq.type = 0; - aramQueue->queue[aramQueue->write].arq.priority = highPrio != 0 ? 1 : 0; - aramQueue->queue[aramQueue->write].arq.source = (u32)mram; - aramQueue->queue[aramQueue->write].arq.dest = aram; - aramQueue->queue[aramQueue->write].arq.length = len; - aramQueue->queue[aramQueue->write].arq.callback = aramQueueCallback; - aramQueue->queue[aramQueue->write].callback = callback; - aramQueue->queue[aramQueue->write].user = user; - ARQPostRequest(&aramQueue->queue[aramQueue->write].arq, - aramQueue->queue[aramQueue->write].arq.owner, - aramQueue->queue[aramQueue->write].arq.type, - aramQueue->queue[aramQueue->write].arq.priority, - aramQueue->queue[aramQueue->write].arq.source, - aramQueue->queue[aramQueue->write].arq.dest, - aramQueue->queue[aramQueue->write].arq.length, - aramQueue->queue[aramQueue->write].arq.callback); - ++aramQueue->valid; - aramQueue->write = (aramQueue->write + 1) % 16; - OSRestoreInterrupts(old); - return; - } - OSRestoreInterrupts(old); - } -} - -void aramSyncTransferQueue() { - while (aramQueueLo.valid != 0) { - } -} - -void aramInit(unsigned long length) { - signed short* tmpMem; // r30 - unsigned long i; // r29 - unsigned long aramBase; // r28 -#line 173 - MUSY_ASSERT_MSG(length > sizeof(s16) * 640, "ARAM size is too small"); - - aramBase = ARGetBaseAddress(); - - tmpMem = (s16*)salMalloc(sizeof(s16) * 640); -#line 182 - MUSY_ASSERT_MSG(tmpMem != NULL, "Could not allocate temporary storage"); - - for (i = 0; i < 640; ++i) { - tmpMem[i] = 0; - } - - DCFlushRange(tmpMem, sizeof(s16) * 640); - aramQueueInit(); - aramUploadData(tmpMem, aramBase, sizeof(s16) * 640, 0, NULL, 0); - aramSyncTransferQueue(); - salFree(tmpMem); - aramTop = aramBase + length; - if (aramTop > ARGetSize()) { - aramTop = ARGetSize(); - } - - aramWrite = aramBase + sizeof(s16) * 640; - aramUploadCallback = NULL; - InitStreamBuffers(); - MUSY_DEBUG("MusyX ARAM handler initialized\n"); -} - -void aramExit() {} - -unsigned long aramGetZeroBuffer() { return ARGetBaseAddress(); } - -void aramSetUploadCallback(void* (*callback)(unsigned long, unsigned long), - unsigned long chunckSize) { - unsigned long acs; // r30 - - if (callback != NULL) { - chunckSize = (chunckSize + 31) & ~31; - acs = ARQGetChunkSize(); - aramUploadChunkSize = chunckSize < acs ? acs : chunckSize; - } - - aramUploadCallback = callback; -} - -void* aramStoreData(void* src, unsigned long len) { - unsigned long addr; // r26 - void* buffer; // r27 - unsigned long blkSize; // r30 - len = (len + 31) & ~31; -#line 266 - MUSY_ASSERT_MSG(aramWrite + len <= aramStream, "Data will not fit in remaining ARAM space"); - addr = aramWrite; - if (aramUploadCallback == NULL) { -#line 276 - MUSY_ASSERT_MSG(!((u32)src & 31), "MRAM address is not aligned properly"); - DCFlushRange(src, len); - aramUploadData(src, aramWrite, len, 0, NULL, 0); - aramWrite += len; - return (void*)addr; - } - - while (len != 0) { - blkSize = len >= aramUploadChunkSize ? aramUploadChunkSize : len; - buffer = (void*)aramUploadCallback((u32)src, blkSize); -#line 297 - MUSY_ASSERT_MSG(!((u32)buffer & 31), "MRAM address is not aligned properly"); - DCFlushRange(buffer, blkSize); - aramUploadData(buffer, aramWrite, blkSize, 0, NULL, 0); - len -= blkSize; - aramWrite += blkSize; - src = (void*)((u32)src + blkSize); - } - - return (void*)addr; -} - -void aramRemoveData(void* aram, unsigned long len) { - len = (len + 31) & ~31; - aramWrite -= len; -#line 328 - MUSY_ASSERT_MSG((u32)aram == aramWrite, - "Current ARAM address does not match originally allocated one"); -} - -static void InitStreamBuffers() { - unsigned long i; // r31 - aramUsedStreamBuffers = NULL; - aramFreeStreamBuffers = NULL; - aramIdleStreamBuffers = aramStreamBuffers; - for (i = 1; i < 64; ++i) { - aramStreamBuffers[i - 1].next = &aramStreamBuffers[i]; - } - aramStreamBuffers[i - 1].next = NULL; - aramStream = aramTop; -} - -unsigned char aramAllocateStreamBuffer(unsigned long len) { - STREAM_BUFFER* sb; // r30 - STREAM_BUFFER* oSb; // r31 - STREAM_BUFFER* lastSb; // r28 - u32 minLen; // r27 - - len = (len + 31) & ~31; - lastSb = oSb = NULL; - minLen = -1; - - for (sb = aramFreeStreamBuffers; sb != NULL; sb = sb->next) { - if (sb->allocLength == len) { - oSb = sb; - break; - } - - if (sb->allocLength > len && minLen > sb->allocLength) { - oSb = sb; - minLen = sb->allocLength; - } - lastSb = sb; - } - - if (oSb == NULL) { - if (aramIdleStreamBuffers != NULL && aramStream - len >= aramWrite) { - oSb = aramIdleStreamBuffers; - aramIdleStreamBuffers = oSb->next; - oSb->allocLength = len; - oSb->length = len; - aramStream -= len; - oSb->aram = aramStream; - oSb->next = aramUsedStreamBuffers; - aramUsedStreamBuffers = oSb; - } - } else { - if (lastSb != NULL) { - lastSb->next = oSb->next; - } else { - aramFreeStreamBuffers = oSb->next; - } - - oSb->length = len; - oSb->next = aramUsedStreamBuffers; - aramUsedStreamBuffers = oSb; - } - - if (oSb == NULL) { - MUSY_DEBUG("No stream buffer slots available or ARAM.\n\n"); - return 0xFF; - } - - return (oSb - aramStreamBuffers); -} - -unsigned long aramGetStreamBufferAddress(unsigned char id, unsigned long* len) { -#line 467 - MUSY_ASSERT_MSG(id != 0xFF, "Stream buffer ID is invalid"); - - if (len != NULL) { - *len = aramStreamBuffers[id].length; - } - - return aramStreamBuffers[id].aram; -} - -void aramFreeStreamBuffer(unsigned char id) { - struct STREAM_BUFFER* fSb; // r30 - struct STREAM_BUFFER* sb; // r31 - struct STREAM_BUFFER* lastSb; // r29 - struct STREAM_BUFFER* nextSb; // r27 - unsigned long minAddr; // r28 - - MUSY_ASSERT_MSG(id != 0xFF, "Stream buffer ID is invalid"); - fSb = &aramStreamBuffers[id]; - lastSb = NULL; - sb = aramUsedStreamBuffers; - - while (sb != NULL) { - if (sb == fSb) { - if (lastSb != NULL) { - lastSb->next = fSb->next; - } else { - aramUsedStreamBuffers = fSb->next; - } - break; - } else { - lastSb = sb; - sb = sb->next; - } - } - - if (fSb->aram == aramStream) { - fSb->next = aramIdleStreamBuffers; - aramIdleStreamBuffers = fSb; - minAddr = -1; - sb = aramUsedStreamBuffers; - while (sb != NULL) { - if (sb->aram <= minAddr) { - minAddr = sb->aram; - } - sb = sb->next; - } - - lastSb = NULL; - sb = aramFreeStreamBuffers; - while (sb != NULL) { - nextSb = sb->next; - if (sb->aram < minAddr) { - if (lastSb != NULL) { - lastSb->next = sb->next; - } else { - aramFreeStreamBuffers = sb->next; - } - - sb->next = aramIdleStreamBuffers; - aramIdleStreamBuffers = sb; - } - sb = nextSb; - } - - aramStream = minAddr != -1 ? minAddr : aramTop; - return; - } - fSb->next = aramFreeStreamBuffers; - aramFreeStreamBuffers = fSb; -} - -#elif MUSY_TARGET == MUSY_TARGET_PC -// typedef struct ARAMTransferJob { -// // total size: 0x28 -// ARQRequest arq; // offset 0x0, size 0x20 -// void (*callback)(unsigned long); // offset 0x20, size 0x4 -// unsigned long user; // offset 0x24, size 0x4 -// } ARAMTransferJob; -// -// typedef struct ARAMTransferQueue { -// // total size: 0x284 -// ARAMTransferJob queue[16]; // offset 0x0, size 0x280 -// vu8 write; // offset 0x280, size 0x1 -// vu8 valid; // offset 0x281, size 0x1 -// } ARAMTransferQueue; -// -// typedef struct STREAM_BUFFER { -// // total size: 0x10 -// struct STREAM_BUFFER* next; // offset 0x0, size 0x4 -// unsigned long aram; // offset 0x4, size 0x4 -// unsigned long length; // offset 0x8, size 0x4 -// unsigned long allocLength; // offset 0xC, size 0x4 -// } STREAM_BUFFER; -// -// static unsigned long aramTop; // size: 0x4 -// static unsigned long aramWrite; // size: 0x4 -// static unsigned long aramStream; // size: 0x4 -// static void* (*aramUploadCallback)(unsigned long, unsigned long); // size: 0x4 -// static unsigned long aramUploadChunkSize; // size: 0x4 -// -// static ARAMTransferQueue aramQueueLo; -// static ARAMTransferQueue aramQueueHi; - -// static STREAM_BUFFER aramStreamBuffers[64]; -// static STREAM_BUFFER* aramUsedStreamBuffers; -// static STREAM_BUFFER* aramFreeStreamBuffers; -// static STREAM_BUFFER* aramIdleStreamBuffers; - -static void InitStreamBuffers(); - -static void aramQueueInit() {} - -static void aramQueueCallback(unsigned long ptr) {} - -void aramUploadData(void* mram, unsigned long aram, unsigned long len, unsigned long highPrio, - void (*callback)(unsigned long), unsigned long user) {} - -void aramSyncTransferQueue() {} - -void aramInit(unsigned long length) {} - -void aramExit() {} - -unsigned long aramGetZeroBuffer() { return 0; } - -void aramSetUploadCallback(void* (*callback)(unsigned long, unsigned long), - unsigned long chunckSize) {} - -void* aramStoreData(void* src, unsigned long len) {} - -void aramRemoveData(void* aram, unsigned long len) {} - -static void InitStreamBuffers() {} - -unsigned char aramAllocateStreamBuffer(u32 len) { return 0; } - -size_t aramGetStreamBufferAddress(u8 id, size_t* len) { - MUSY_ASSERT_MSG(id != 0xFF, "Stream buffer ID is invalid"); -} - -void aramFreeStreamBuffer(unsigned char id) { - STREAM_BUFFER* fSb; // r30 - STREAM_BUFFER* sb; // r31 - STREAM_BUFFER* lastSb; // r29 - STREAM_BUFFER* nextSb; // r27 - unsigned long minAddr; // r28 - - MUSY_ASSERT_MSG(id != 0xFF, "Stream buffer ID is invalid"); -} -#endif \ No newline at end of file diff --git a/src/musyx/runtime/hw_dolphin.c b/src/musyx/runtime/hw_dolphin.c deleted file mode 100644 index 313d1626..00000000 --- a/src/musyx/runtime/hw_dolphin.c +++ /dev/null @@ -1,175 +0,0 @@ -#include "musyx/platform.h" - -#if MUSY_TARGET == MUSY_TARGET_DOLPHIN -#include "dolphin/dsp.h" -#include "musyx/assert.h" -#include "musyx/dsp_import.h" -#include "musyx/hardware.h" -#include "musyx/sal.h" - -static DSPTaskInfo dsp_task ATTRIBUTE_ALIGN(8); -static u16 dram_image[4096] ATTRIBUTE_ALIGN(32); - -static volatile u32 oldState = 0; -static volatile u16 hwIrqLevel = 0; -static volatile u32 salDspInitIsDone = 0; -static volatile OSTick salLastTick = 0; -static volatile u32 salLogicActive = 0; -static volatile u32 salLogicIsWaiting = 0; -static volatile u32 salDspIsDone = 0; -void* salAIBufferBase = NULL; -static u8 salAIBufferIndex = 0; -static SND_SOME_CALLBACK userCallback = NULL; - -#define DMA_BUFFER_LEN 0x280 - -u32 salGetStartDelay(); -static void callUserCallback() { - if (salLogicActive) { - return; - } - salLogicActive = 1; - OSEnableInterrupts(); - userCallback(); - OSDisableInterrupts(); - salLogicActive = 0; -} - -void salCallback() { - salAIBufferIndex = (salAIBufferIndex + 1) % 4; - AIInitDMA(OSCachedToPhysical(salAIBufferBase) + (salAIBufferIndex * DMA_BUFFER_LEN), - DMA_BUFFER_LEN); - salLastTick = OSGetTick(); - if (salDspIsDone) { - callUserCallback(); - } else { - salLogicIsWaiting = 1; - } -} - -void dspInitCallback() { - salDspIsDone = TRUE; - salDspInitIsDone = TRUE; -} - -void dspResumeCallback() { - salDspIsDone = TRUE; - if (salLogicIsWaiting) { - salLogicIsWaiting = FALSE; - callUserCallback(); - } -} - -u32 salInitAi(SND_SOME_CALLBACK callback, u32 unk, u32* outFreq) { - if ((salAIBufferBase = salMalloc(DMA_BUFFER_LEN * 4)) != NULL) { - memset(salAIBufferBase, 0, DMA_BUFFER_LEN * 4); - DCFlushRange(salAIBufferBase, DMA_BUFFER_LEN * 4); - salAIBufferIndex = TRUE; - salLogicIsWaiting = FALSE; - salDspIsDone = TRUE; - salLogicActive = FALSE; - userCallback = callback; - AIRegisterDMACallback(salCallback); - AIInitDMA(OSCachedToPhysical(salAIBufferBase) + (salAIBufferIndex * 0x280), 0x280); - synthInfo.numSamples = 0x20; - *outFreq = 32000; - MUSY_DEBUG("MusyX AI interface initialized.\n"); - return TRUE; - } - - return FALSE; -} - -u32 salStartAi() { AIStartDMA(); } - -u32 salExitAi() { - AIRegisterDMACallback(NULL); - AIStopDMA(); - salFree(salAIBufferBase); - return TRUE; -} - -void* salAiGetDest() { - u8 index; // r31 - index = (salAIBufferIndex + 2) % 4; - return (void*)((u8*)salAIBufferBase + index * DMA_BUFFER_LEN); -} - -u32 salInitDsp() { - u8 _[8]; - dsp_task.iram_mmem_addr = (u16*)dspSlave; - dsp_task.iram_length = dspSlaveLength; - dsp_task.iram_addr = 0; - dsp_task.dram_mmem_addr = (u16*)dram_image; - dsp_task.dram_length = 0x2000; - dsp_task.dram_addr = 0; - dsp_task.dsp_init_vector = 0x10; - dsp_task.dsp_resume_vector = 0x30; - dsp_task.init_cb = dspInitCallback; - dsp_task.res_cb = dspResumeCallback; - dsp_task.done_cb = NULL; - dsp_task.req_cb = NULL; - dsp_task.priority = 0; - DSPInit(); - DSPAddTask(&dsp_task); - salDspInitIsDone = FALSE; - hwEnableIrq(); - while (!salDspInitIsDone) - ; - hwDisableIrq(); - return TRUE; -} - -u32 salExitDsp() { - DSPHalt(); - while (DSPGetDMAStatus()) - ; - DSPReset(); - - return TRUE; -} -void salStartDsp(s16* cmdList) { - salDspIsDone = FALSE; - PPCSync(); - /* clang-format off */ - MUSY_ASSERT(((u32)cmdList&0x1F) == 0); - /* clang-format on */ - DSPSendMailToDSP(dspCmdFirstSize | 0xbabe0000); - - while (DSPCheckMailToDSP()) - ; - DSPSendMailToDSP((u32)cmdList); - while (DSPCheckMailToDSP()) - ; -} - -void salCtrlDsp(s16* dest) { - salBuildCommandList(dest, salGetStartDelay()); - salStartDsp(dspCmdList); -} - -u32 salGetStartDelay() { return OSTicksToMicroseconds(OSGetTick() - salLastTick); } - -void hwInitIrq() { - oldState = OSDisableInterrupts(); - hwIrqLevel = 1; -} - -void hwExitIrq() {} - -void hwEnableIrq() { - if (--hwIrqLevel == 0) { - OSRestoreInterrupts(oldState); - } -} - -void hwDisableIrq() { - if ((hwIrqLevel++) == 0) { - oldState = OSDisableInterrupts(); - } -} - -void hwIRQEnterCritical() { OSDisableInterrupts(); } - -void hwIRQLeaveCritical() { OSEnableInterrupts(); } -#endif \ No newline at end of file diff --git a/src/musyx/runtime/hw_dspctrl.c b/src/musyx/runtime/hw_dspctrl.c deleted file mode 100644 index d7b375c6..00000000 --- a/src/musyx/runtime/hw_dspctrl.c +++ /dev/null @@ -1,527 +0,0 @@ -/* - - - - - - - - - - - - - - - -*/ -#include "musyx/assert.h" -#include "musyx/dspvoice.h" -#include "musyx/hardware.h" -#include "musyx/sal.h" - -#include - -#ifdef _DEBUG -static u32 dbgActiveVoicesMax = 0; -#endif - -extern u8 salAuxFrame; - -DSPstudioinfo dspStudio[8]; - -static u32 dspARAMZeroBuffer = 0; - -u16* dspCmdLastLoad = NULL; - -u16* dspCmdLastBase = NULL; - -s16* dspCmdList = NULL; - -u16 dspCmdLastSize = 0; - -u16* dspCmdCurBase = NULL; - -u16* dspCmdMaxPtr = NULL; - -u16* dspCmdPtr = NULL; - -u16 dspCmdFirstSize = 0; - -u32 dspHRTFOn = FALSE; - -s16* dspHrtfHistoryBuffer = NULL; - -s32* dspSurround = NULL; - -s16* dspITDBuffer = NULL; - -DSPvoice* dspVoice = NULL; - -SND_MESSAGE_CALLBACK salMessageCallback = NULL; - -bool salInitDspCtrl(u8 numVoices, u8 numStudios, u32 defaultStudioDPL2) { - u32 i; // r31 - u32 j; // r27 - size_t itdPtr; // r28 - - salNumVoices = numVoices; - salMaxStudioNum = numStudios; - - MUSY_ASSERT(salMaxStudioNum <= SAL_MAX_STUDIONUM); - dspARAMZeroBuffer = aramGetZeroBuffer(); - if ((dspCmdList = salMalloc(1024 * sizeof(u16))) != NULL) { - MUSY_DEBUG("Allocated dspCmdList.\n\n"); - if ((dspSurround = salMalloc(160 * sizeof(s32))) != NULL) { - MUSY_DEBUG("Allocated surround buffer.\n\n"); - memset(dspSurround, 0, 160 * sizeof(s32)); -#if MUSY_TARGET == MUSY_TARGET_DOLPHIN - DCFlushRange(dspSurround, 160 * sizeof(long)); -#endif - if ((dspVoice = salMalloc(salNumVoices * sizeof(DSPvoice))) != NULL) { - MUSY_DEBUG("Allocated HW voice array.\n\n"); - if ((dspITDBuffer = salMalloc(salNumVoices * 64)) != NULL) { - MUSY_DEBUG("Allocated ITD buffers for voice array.\n\n"); -#if MUSY_TARGET == MUSY_TARGET_DOLPHIN - DCInvalidateRange(dspITDBuffer, salNumVoices * 64); -#endif - itdPtr = (u32)dspITDBuffer; - for (i = 0; i < salNumVoices; ++i) { - MUSY_DEBUG("Initializing voice %d...\n", i); - dspVoice[i].state = 0; - dspVoice[i].postBreak = 0; - dspVoice[i].startupBreak = 0; - dspVoice[i].lastUpdate.pitch = 0xff; - dspVoice[i].lastUpdate.vol = 0xff; - dspVoice[i].lastUpdate.volA = 0xff; - dspVoice[i].lastUpdate.volB = 0xff; - dspVoice[i].pb = salMalloc(sizeof(_PB)); - memset(dspVoice[i].pb, 0, sizeof(_PB)); - dspVoice[i].patchData = salMalloc(0x80); - dspVoice[i].pb->currHi = ((u32)dspVoice[i].pb >> 16); - dspVoice[i].pb->currLo = (u16)dspVoice[i].pb; - dspVoice[i].pb->update.dataHi = ((u32)dspVoice[i].patchData >> 16); - dspVoice[i].pb->update.dataLo = ((u16)dspVoice[i].patchData); - dspVoice[i].pb->itd.bufferHi = ((u32)itdPtr >> 16); - dspVoice[i].pb->itd.bufferLo = ((u16)itdPtr); - dspVoice[i].itdBuffer = (void*)itdPtr; - itdPtr += 0x40; - dspVoice[i].virtualSampleID = 0xFFFFFFFF; -#if MUSY_TARGET == MUSY_TARGET_DOLPHIN - DCStoreRangeNoSync(dspVoice[i].pb, sizeof(_PB)); -#endif - for (j = 0; j < 5; ++j) { - dspVoice[i].changed[j] = 0; - } - } - - MUSY_DEBUG("All voices initialized.\n\n"); - - for (i = 0; i < salMaxStudioNum; ++i) { - MUSY_DEBUG("Initializing studio %d...\n", i); - dspStudio[i].state = 0; - if ((dspStudio[i].spb = (_SPB*)salMalloc(sizeof(_SPB))) == NULL) { - return FALSE; - } - - if ((dspStudio[i].main[0] = (void*)salMalloc(0x3c00)) == NULL) { - return FALSE; - } - - memset(dspStudio[i].main[0], 0, 0x3c00); -#if MUSY_TARGET == MUSY_TARGET_DOLPHIN - DCFlushRangeNoSync(dspStudio[i].main[0], 0x3c00); -#endif - dspStudio[i].main[1] = dspStudio[i].main[0] + 0x1e0; - dspStudio[i].auxA[0] = dspStudio[i].main[1] + 0x1e0; - dspStudio[i].auxA[1] = dspStudio[i].auxA[0] + 0x1e0; - dspStudio[i].auxA[2] = dspStudio[i].auxA[1] + 0x1e0; - dspStudio[i].auxB[0] = dspStudio[i].auxA[2] + 0x1e0; - dspStudio[i].auxB[1] = dspStudio[i].auxB[0] + 0x1e0; - dspStudio[i].auxB[2] = dspStudio[i].auxB[1] + 0x1e0; - memset(dspStudio[i].spb, 0, sizeof(_SPB)); - dspStudio[i].hostDPopSum.l = dspStudio[i].hostDPopSum.r = dspStudio[i].hostDPopSum.s = - 0; - dspStudio[i].hostDPopSum.lA = dspStudio[i].hostDPopSum.rA = - dspStudio[i].hostDPopSum.sA = 0; - dspStudio[i].hostDPopSum.lB = dspStudio[i].hostDPopSum.rB = - dspStudio[i].hostDPopSum.sB = 0; -#if MUSY_TARGET == MUSY_TARGET_DOLPHIN - DCFlushRangeNoSync(dspStudio[i].spb, sizeof(_SPB)); -#endif - } - MUSY_DEBUG("All studios are initialized.\n\n"); - salActivateStudio( - 0, 1, defaultStudioDPL2 != FALSE ? SND_STUDIO_TYPE_DPL2 : SND_STUDIO_TYPE_STD); - MUSY_DEBUG("Default studio is active.\n\n"); - if ((dspHrtfHistoryBuffer = salMalloc(0x100)) == NULL) { - return FALSE; - } - - salInitHRTFBuffer(); - return TRUE; - } - } - } - } - - return FALSE; -} - -void salInitHRTFBuffer() { - memset(dspHrtfHistoryBuffer, 0, 0x100); -#if MUSY_TARGET == MUSY_TARGET_DOLPHIN - DCFlushRangeNoSync(dspHrtfHistoryBuffer, 0x100); -#endif -} - -bool salExitDspCtrl() { - u8 i; // r31 - salFree(dspHrtfHistoryBuffer); - - for (i = 0; i < salNumVoices; ++i) { - salFree(dspVoice[i].pb); - salFree(dspVoice[i].patchData); - } - - for (i = 0; i < salMaxStudioNum; ++i) { - salFree(dspStudio[i].spb); - salFree(dspStudio[i].main[0]); - } - - salFree(dspITDBuffer); - salFree(dspVoice); - salFree(dspSurround); - salFree(dspCmdList); - return TRUE; -} - -void salActivateStudio(u8 studio, u32 isMaster, SND_STUDIO_TYPE type) { - memset(dspStudio[studio].main[0], 0, 0x3c00); -#if MUSY_TARGET == MUSY_TARGET_DOLPHIN - DCFlushRangeNoSync(dspStudio[studio].main[0], 0x3c00); -#endif - memset(dspStudio[studio].spb, 0, sizeof(_SPB)); - dspStudio[studio].hostDPopSum.l = dspStudio[studio].hostDPopSum.r = - dspStudio[studio].hostDPopSum.s = 0; - dspStudio[studio].hostDPopSum.lA = dspStudio[studio].hostDPopSum.rA = - dspStudio[studio].hostDPopSum.sA = 0; - dspStudio[studio].hostDPopSum.lB = dspStudio[studio].hostDPopSum.rB = - dspStudio[studio].hostDPopSum.sB = 0; -#if MUSY_TARGET == MUSY_TARGET_DOLPHIN - DCFlushRangeNoSync(dspStudio[studio].spb, sizeof(_SPB)); -#endif - memset(dspStudio[studio].auxA[0], 0, 0x780); -#if MUSY_TARGET == MUSY_TARGET_DOLPHIN - DCFlushRangeNoSync(dspStudio[studio].auxA[0], 0x780); -#endif - memset(dspStudio[studio].auxB[0], 0, 0x780); -#if MUSY_TARGET == MUSY_TARGET_DOLPHIN - DCFlushRangeNoSync(dspStudio[studio].auxB[0], 0x780); -#endif - dspStudio[studio].voiceRoot = NULL; - dspStudio[studio].alienVoiceRoot = NULL; - dspStudio[studio].state = 1; - dspStudio[studio].isMaster = isMaster; - dspStudio[studio].numInputs = 0; - dspStudio[studio].type = type; - dspStudio[studio].auxAHandler = dspStudio[studio].auxBHandler = NULL; -} - -u16 dspSRCCycles[3][3] = { - {2990, 2990, 1115}, - {3300, 3300, 1115}, - {3700, 3700, 1115}, -}; - -static const u16 dspMixerCycles[32] = { - 1470, 2940, 2940, 4410, 2230, 4460, 4460, 6690, 2470, 4940, 4940, 7410, 3735, 7470, 7470, 11205, - 2940, 3386, 2940, 3386, 2940, 3386, 2940, 3386, 4940, 5687, 4940, 5687, 4940, 5687, 4940, 5687, -}; - -void salDeactivateStudio(u8 studio) { dspStudio[studio].state = 0; } - -static u32 salCheckVolErrorAndResetDelta(u16* dsp_vol, u16* dsp_delta, u16* last_vol, u16 targetVol, - u16* resetFlags, u16 resetMask) { - s16 d; // r31 - s16 x; // r30 - - if (targetVol != *last_vol) { - d = (s16)targetVol - (s16)*last_vol; - if ((s16)d >= 32 && (s16)d < 160) { - x = (s16)d >> 5; - if ((s16)x < 5) { - resetFlags[x] |= resetMask; - } - - *dsp_delta = 1; - *last_vol += (x << 5); - return 1; - } - - if (-32 >= (s16)d && -160 < (s16)d) { - x = -(s16)d >> 5; - if (x < 5) { - resetFlags[x] |= resetMask; - } - *dsp_delta = 0xFFFF; - *last_vol -= x << 5; - return 1; - } - - if (targetVol == 0 && (s16)d > -32) { - *dsp_vol = *last_vol = 0; - } - } - - *dsp_delta = 0; - return 0; -} - -static void sal_setup_dspvol(u16* dsp_delta, u16* last_vol, u16 vol) { - *dsp_delta = ((s16)vol - (s16)*last_vol) / 160; - *last_vol += (s16)*dsp_delta * 160; -} - -static void sal_update_hostplayinfo(DSPvoice* dsp_vptr) { - u32 old_lo; // r30 - u32 pitch; // r31 - - if (dsp_vptr->smp_info.loopLength != 0) { - return; - } - if (dsp_vptr->pb->srcSelect != 2) { - pitch = dsp_vptr->playInfo.pitch << 5; - - } else { - pitch = 0x200000; - } - - old_lo = dsp_vptr->playInfo.posLo; - dsp_vptr->playInfo.posLo += pitch * 0x10000; - - if (old_lo > dsp_vptr->playInfo.posLo) { - dsp_vptr->playInfo.posHi += (pitch >> 16) + 1; - } else { - dsp_vptr->playInfo.posHi += (pitch >> 16); - } -} - -static void AddDpop(s32* sum, s16 delta) { - *sum += (int)delta; - *sum = (*sum > 0x7fffff) ? 0x7fffff : (*sum < -0x7fffff ? -0x7fffff : *sum); -} - -static void DoDepopFade(long* dspStart, s16* dspDelta, long* hostSum) { - if (*hostSum <= -160) { - *dspDelta = (*hostSum <= -3200) ? 0x14 : (s16)(-*hostSum / 160); - } else if (*hostSum >= 160) { - *dspDelta = (*hostSum >= 3200) ? -0x14 : (s16)(-*hostSum / 160); - } else { - *dspDelta = 0; - } - - *dspStart = *hostSum; - *hostSum += *dspDelta * 160; -} - -static void HandleDepopVoice(DSPstudioinfo* stp, DSPvoice* dsp_vptr) { - _PB* pb; // r31 - dsp_vptr->postBreak = 0; - dsp_vptr->pb->state = 0; - pb = dsp_vptr->pb; - AddDpop(&stp->hostDPopSum.l, pb->dpop.aL); - AddDpop(&stp->hostDPopSum.r, pb->dpop.aR); - - if ((pb->mixerCtrl & 0x04) != 0) { - AddDpop(&stp->hostDPopSum.s, pb->dpop.aS); - } - - if ((pb->mixerCtrl & 0x01) != 0) { - AddDpop(&stp->hostDPopSum.lA, pb->dpop.aAuxAL); - AddDpop(&stp->hostDPopSum.rA, pb->dpop.aAuxAR); - - if ((pb->mixerCtrl & 0x14) != 0) { - AddDpop(&stp->hostDPopSum.sA, pb->dpop.aAuxAS); - } - } - - if ((pb->mixerCtrl & 0x12) != 0) { - AddDpop(&stp->hostDPopSum.lB, pb->dpop.aAuxBL); - AddDpop(&stp->hostDPopSum.rB, pb->dpop.aAuxBR); - - if ((pb->mixerCtrl & 0x4) != 0) { - AddDpop(&stp->hostDPopSum.sB, pb->dpop.aAuxBS); - } - } -} - -static void SortVoices(DSPvoice** voices, long l, long r) { - long i; // r28 - long last; // r29 - DSPvoice* tmp; // r27 - - if (l >= r) { - return; - } - - tmp = voices[l]; - voices[l] = voices[(l + r) / 2]; - voices[(l + r) / 2] = tmp; - last = l; - i = l + 1; - - for (; i <= r; ++i) { - if (voices[i]->prio < voices[l]->prio) { - last += 1; - tmp = voices[last]; - voices[last] = voices[i]; - voices[i] = tmp; - } - } - - tmp = voices[l]; - voices[l] = voices[last]; - voices[last] = tmp; - SortVoices(voices, l, last - 1); - SortVoices(voices, last + 1, r); -} - -void salBuildCommandList(signed short* dest, unsigned long nsDelay) { - static const u16 pbOffsets[9] = {10, 12, 24, 13, 16, 26, 18, 20, 22}; - static DSPvoice* voices[64]; -} - -u32 salSynthSendMessage(DSPvoice* dsp_vptr, u32 mesg) { - return salMessageCallback == NULL ? FALSE - : salMessageCallback(mesg, dsp_vptr->mesgCallBackUserValue); -} - -void salActivateVoice(DSPvoice* dsp_vptr, u8 studio) { - if (dsp_vptr->state != 0) { - salDeactivateVoice(dsp_vptr); - dsp_vptr->changed[0] |= 0x20; - } - - dsp_vptr->postBreak = 0; - if ((dsp_vptr->next = dspStudio[studio].voiceRoot) != NULL) { - dsp_vptr->next->prev = dsp_vptr; - } - - dsp_vptr->prev = NULL; - dspStudio[studio].voiceRoot = dsp_vptr; - dsp_vptr->startupBreak = 0; - dsp_vptr->state = 1; - dsp_vptr->studio = studio; -} - -void salDeactivateVoice(DSPvoice* dsp_vptr) { - if (dsp_vptr->state == 0) { - return; - } - - if (dsp_vptr->prev != NULL) { - dsp_vptr->prev->next = dsp_vptr->next; - } else { - dspStudio[dsp_vptr->studio].voiceRoot = dsp_vptr->next; - } - - if (dsp_vptr->next != NULL) { - dsp_vptr->next->prev = dsp_vptr->prev; - } - - dsp_vptr->state = 0; -} - -void salReconnectVoice(DSPvoice* dsp_vptr, u8 studio) { - if (dsp_vptr->state != 0) { - if (dsp_vptr->prev != NULL) { - dsp_vptr->prev->next = dsp_vptr->next; - } else { - dspStudio[dsp_vptr->studio].voiceRoot = dsp_vptr->next; - } - - if (dsp_vptr->next != NULL) { - dsp_vptr->next->prev = dsp_vptr->prev; - } - - if ((dsp_vptr->next = dspStudio[studio].voiceRoot) != NULL) { - dsp_vptr->next->prev = dsp_vptr; - } - - dsp_vptr->prev = NULL; - dspStudio[studio].voiceRoot = dsp_vptr; - if (dsp_vptr->state == 2) { - dsp_vptr->nextAlien = dspStudio[dsp_vptr->studio].alienVoiceRoot; - dspStudio[dsp_vptr->studio].alienVoiceRoot = dsp_vptr; - } - } - - dsp_vptr->studio = studio; -} - -bool salAddStudioInput(DSPstudioinfo* stp, SND_STUDIO_INPUT* desc) { - if (stp->numInputs < 7) { - stp->in[stp->numInputs].studio = desc->srcStudio; - stp->in[stp->numInputs].vol = ((u16)desc->vol << 8) | ((u16)desc->vol << 1); - stp->in[stp->numInputs].volA = ((u16)desc->volA << 8) | ((u16)desc->volA << 1); - stp->in[stp->numInputs].volB = ((u16)desc->volB << 8) | ((u16)desc->volB << 1); - stp->in[stp->numInputs].desc = desc; - ++stp->numInputs; - return 1; - } - - return 0; -} - -bool salRemoveStudioInput(DSPstudioinfo* stp, SND_STUDIO_INPUT* desc) { - long i; // r31 - - for (i = 0; i < stp->numInputs; ++i) { - if (stp->in[i].desc == desc) { - for (; i <= stp->numInputs - 2; ++i) { - stp->in[i] = stp->in[i + 1]; - } - --stp->numInputs; - return 1; - } - } - - return 0; -} - -void salHandleAuxProcessing() { - u8 st; // r29 - s32* work; // r30 - DSPstudioinfo* sp; // r31 - SND_AUX_INFO info; // r1+0x8 - sp = &dspStudio[0]; - for (st = 0; st < salMaxStudioNum; ++st, ++sp) { - - if (sp->state != 1) { - continue; - } - - if (sp->auxAHandler != NULL) { - work = sp->auxA[(salAuxFrame + 2) % 3]; - info.data.bufferUpdate.left = work; - info.data.bufferUpdate.right = work + 0xa0; - info.data.bufferUpdate.surround = work + 0x140; - sp->auxAHandler(0, &info, sp->auxAUser); -#if MUSY_TARGET == MUSY_TARGET_DOLPHIN - DCFlushRangeNoSync(work, 0x780); -#endif - } - - if (sp->type == 0 && sp->auxBHandler != 0) { - work = sp->auxB[(salAuxFrame + 2) % 3]; - info.data.bufferUpdate.left = work; - info.data.bufferUpdate.right = work + 0xa0; - info.data.bufferUpdate.surround = work + 0x140; - sp->auxBHandler(0, &info, sp->auxBUser); -#if MUSY_TARGET == MUSY_TARGET_DOLPHIN - DCFlushRangeNoSync(work, 0x780); -#endif - } - } -} diff --git a/src/musyx/runtime/hw_lib_dummy.c b/src/musyx/runtime/hw_lib_dummy.c deleted file mode 100644 index c8856bd3..00000000 --- a/src/musyx/runtime/hw_lib_dummy.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "musyx/musyx.h" - -u32 aramSize = 0; -u8* aramBase = NULL; diff --git a/src/musyx/runtime/hw_memory.c b/src/musyx/runtime/hw_memory.c deleted file mode 100644 index 93ea1be3..00000000 --- a/src/musyx/runtime/hw_memory.c +++ /dev/null @@ -1,5 +0,0 @@ -#include "musyx/hardware.h" - -void* salMalloc(u32 len) { return salHooks.malloc(len); } - -void salFree(void* addr) { salHooks.free(addr); } diff --git a/src/musyx/runtime/hw_pc.c b/src/musyx/runtime/hw_pc.c deleted file mode 100644 index 921850b3..00000000 --- a/src/musyx/runtime/hw_pc.c +++ /dev/null @@ -1,138 +0,0 @@ -#include "musyx/platform.h" - -#if MUSY_TARGET == MUSY_TARGET_PC -#include -#include "musyx/assert.h" -#include "musyx/hardware.h" -#include "musyx/sal.h" -#include - -static volatile u32 oldState = 0; -static volatile u16 hwIrqLevel = 0; -static volatile u32 salDspInitIsDone = 0; -static volatile u64 salLastTick = 0; -static volatile u32 salLogicActive = 0; -static volatile u32 salLogicIsWaiting = 0; -static volatile u32 salDspIsDone = 0; -void* salAIBufferBase = NULL; -static u8 salAIBufferIndex = 0; -static SND_SOME_CALLBACK userCallback = NULL; - -#define DMA_BUFFER_LEN 0x280 -pthread_mutex_t globalMutex; -pthread_mutex_t globalInterrupt; - -u32 salGetStartDelay(); -static void callUserCallback() { - if (salLogicActive) { - return; - } - salLogicActive = 1; - // OSEnableInterrupts(); - userCallback(); - // OSDisableInterrupts(); - salLogicActive = 0; -} - -void salCallback() { - salAIBufferIndex = (salAIBufferIndex + 1) % 4; - // AIInitDMA(OSCachedToPhysical(salAIBufferBase) + (salAIBufferIndex * DMA_BUFFER_LEN), - // DMA_BUFFER_LEN); - salLastTick = 0; // OSGetTick(); - if (salDspIsDone) { - callUserCallback(); - } else { - salLogicIsWaiting = 1; - } -} - -void dspInitCallback() { - salDspIsDone = TRUE; - salDspInitIsDone = TRUE; -} - -void dspResumeCallback() { - salDspIsDone = TRUE; - if (salLogicIsWaiting) { - salLogicIsWaiting = FALSE; - callUserCallback(); - } -} - -bool salInitAi(SND_SOME_CALLBACK callback, u32 unk, u32* outFreq) { - if ((salAIBufferBase = salMalloc(DMA_BUFFER_LEN * 4)) != NULL) { - memset(salAIBufferBase, 0, DMA_BUFFER_LEN * 4); - // DCFlushRange(salAIBufferBase, DMA_BUFFER_LEN * 4); - salAIBufferIndex = TRUE; - salLogicIsWaiting = FALSE; - salDspIsDone = TRUE; - salLogicActive = FALSE; - userCallback = callback; - // AIRegisterDMACallback(salCallback); - // AIInitDMA(OSCachedToPhysical(salAIBufferBase) + (salAIBufferIndex * 0x280), 0x280); - synthInfo.numSamples = 0x20; - *outFreq = 32000; - MUSY_DEBUG("MusyX AI interface initialized.\n"); - return TRUE; - } - - return FALSE; -} - -bool salStartAi() { } //AIStartDMA(); } - -bool salExitAi() { - salFree(salAIBufferBase); - return TRUE; -} - -void* salAiGetDest() { - u8 index; // r31 - index = (salAIBufferIndex + 2) % 4; - return NULL; -} - -bool salInitDsp(u32) { return TRUE; } - -bool salExitDsp() {} - -void salStartDsp(s16* cmdList) {} - -void salCtrlDsp(s16* dest) { - salBuildCommandList(dest, salGetStartDelay()); - salStartDsp(dspCmdList); -} - -u32 salGetStartDelay() { return 0; } - -void hwInitIrq() { - // oldState = OSDisableInterrupts(); - hwIrqLevel = 1; - pthread_mutexattr_t attr; - pthread_mutexattr_init(&attr); - pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ROBUST); - pthread_mutex_init(&globalMutex, &attr); -} - -void hwExitIrq() {} - -void hwEnableIrq() { - if (--hwIrqLevel == 0) { - // OSRestoreInterrupts(oldState); - } -} - -void hwDisableIrq() { - if ((hwIrqLevel++) == 0) { - // oldState = OSDisableInterrupts(); - } -} - -void hwIRQEnterCritical() { - pthread_mutex_lock(&globalMutex); -} - -void hwIRQLeaveCritical() { - pthread_mutex_unlock(&globalMutex); -} -#endif diff --git a/src/musyx/runtime/hw_volconv.c b/src/musyx/runtime/hw_volconv.c deleted file mode 100644 index 9ac6deeb..00000000 --- a/src/musyx/runtime/hw_volconv.c +++ /dev/null @@ -1,139 +0,0 @@ -#include "musyx/sal.h" -#include "musyx/synth_dbtab.h" - -#include - -static float musyx_vol_tab[129] = { - 0.f, 3.0518499e-05f, 0.000152593f, 0.000396741f, 0.00070192601f, - 0.00112918f, 0.001648f, 0.00222785f, 0.0029297799f, 0.00372326f, - 0.0046082898f, 0.00558489f, 0.0066530402f, 0.0078432597f, 0.0091250297f, - 0.0104984f, 0.0119633f, 0.0135502f, 0.0151982f, 0.0169988f, - 0.0188604f, 0.0208441f, 0.0229194f, 0.025116701f, 0.027405599f, - 0.0298166f, 0.032319099f, 0.0349437f, 0.037659802f, 0.040467501f, - 0.043427799f, 0.046479698f, 0.049623098f, 0.052888598f, 0.056276102f, - 0.059785798f, 0.063386902f, 0.067110203f, 0.0709555f, 0.074922897f, - 0.078981899f, 0.083162896f, 0.087466002f, 0.091921799f, 0.096469f, - 0.101138f, 0.10593f, 0.110843f, 0.115879f, 0.121036f, - 0.12634701f, 0.13174801f, 0.13730299f, 0.142979f, 0.14877801f, - 0.15472899f, 0.160772f, 0.166997f, 0.173315f, 0.179785f, - 0.186407f, 0.193121f, 0.200018f, 0.20700701f, 0.21417899f, - 0.22147299f, 0.228919f, 0.236488f, 0.24420901f, 0.252083f, - 0.260079f, 0.26825801f, 0.276559f, 0.28501201f, 0.29364899f, - 0.30240801f, 0.31131899f, 0.32038301f, 0.32960001f, 0.33899999f, - 0.34852099f, 0.358226f, 0.36808401f, 0.37809399f, 0.38828701f, - 0.398633f, 0.40913099f, 0.41981301f, 0.43064699f, 0.44166401f, - 0.45286399f, 0.46421701f, 0.47575301f, 0.48744199f, 0.499313f, - 0.51139897f, 0.523606f, 0.53602701f, 0.54863101f, 0.56141901f, - 0.57438898f, 0.587542f, 0.60087901f, 0.61439902f, 0.62813199f, - 0.64201802f, 0.65614802f, 0.67043102f, 0.68492699f, 0.699637f, - 0.71452999f, 0.72963703f, 0.74492598f, 0.76042998f, 0.77614701f, - 0.792077f, 0.808191f, 0.82454902f, 0.84109002f, 0.85784501f, - 0.87484401f, 0.89205599f, 0.90945202f, 0.927122f, 0.94500601f, - 0.96307302f, 0.98141402f, 1.f, 1.f, -}; -static float pan_tab[4] = { - 0.f, - 0.7079f, - 1.0f, - 1.0f, -}; - -static float pan_tab_dpl2[4] = { - 0.575f, - 0.7079f, - 1.f, - 1.f, -}; - -void CalcBus(float* vol_tab, float* vl, float* vr, float* vs, float vol, struct SAL_PANINFO* pi) { - u32 i; // r29 - float f; // r62 - float v; // r63 - - i = vol * 127.f; - v = (vol * 127) - (float)i; - f = (1.f - v) * vol_tab[i] + v * vol_tab[i + 1]; - *vs = f * ((1.f - pi->span_f) * pan_tab[pi->span_i] + pi->span_f * pan_tab[pi->span_i + 1]) * - 0.7079f; - f = f * ((1.f - pi->span_fm) * pan_tab[pi->span_im] + pi->span_fm * pan_tab[pi->span_im + 1]); - *vr = f * ((1.f - pi->pan_f) * pan_tab[pi->pan_i] + pi->pan_f * pan_tab[pi->pan_i + 1]); - *vl = f * ((1.f - pi->pan_fm) * pan_tab[pi->pan_im] + pi->pan_fm * pan_tab[pi->pan_im + 1]); -} - -void CalcBusDPL2(float* vol_tab, float* fvl, float* fvr, float* rvl, float* rvr, float vol, - SAL_PANINFO* pi) { - u32 i; // r29 - float f; // r62 - float v; // r63 - float vs; // r61 - - i = vol * 127; - f = vol * 127 - (float)i; - v = (1.f - f) * vol_tab[i] + f * vol_tab[i + 1]; - vs = v * ((1.f - pi->span_f) * pan_tab[pi->span_i] + pi->span_f * pan_tab[pi->span_i + 1]); - v *= (1.f - pi->span_fm) * pan_tab[pi->span_im] + pi->span_fm * pan_tab[pi->span_im + 1]; - *fvr = v * ((1.f - pi->pan_f) * pan_tab[pi->pan_i] + pi->pan_f * pan_tab[pi->pan_i + 1]); - *fvl = v * ((1.f - pi->pan_fm) * pan_tab[pi->pan_im] + pi->pan_fm * pan_tab[pi->pan_im + 1]); - *rvr = - vs * ((1.f - pi->rpan_f) * pan_tab_dpl2[pi->rpan_i] + pi->rpan_f * pan_tab[pi->rpan_i + 1]); - *rvl = vs * - ((1.f - pi->rpan_fm) * pan_tab_dpl2[pi->rpan_im] + pi->rpan_fm * pan_tab[pi->rpan_im + 1]); -} - -void salCalcVolume(u8 voltab_index, SAL_VOLINFO* vi, float vol, u32 pan, u32 span, float auxa, - float auxb, u32 itd, u32 dpl2) { - float* vol_tab; // r30 - float p; // r63 - float sp; // r62 - SAL_PANINFO pi; // r1+0x2C - - if (voltab_index == 0) { - vol_tab = musyx_vol_tab; - } else { - vol_tab = dspDLSVolTab; - } - - if (pan == 0x800000) { - pan = 0; - span = 0x7f0000; - } - - pan = (pan <= 0x10000 ? 0 : pan - 0x10000); - span = (span <= 0x10000 ? 0 : span - 0x10000); - - p = pan * 2.4220301e-07f; - sp = span * 2.4220301e-07f; - - if (dpl2 != FALSE) { - pi.rpan_f = fmodf(p, 1.f); - pi.rpan_i = p; - pi.rpan_fm = fmodf(2.f - p, 1.f); - pi.rpan_im = 2.f - p; - } - - if (itd != FALSE) { - p = (p - 1.f) * 0.76604f + 1.f; - } - - pi.pan_f = fmodf(p, 1.f); - pi.pan_i = p; - pi.span_f = fmodf(sp, 1.f); - pi.span_i = sp; - p = 2.f - p; - sp = 2.f - sp; - pi.pan_fm = fmodf(p, 1.f); - pi.pan_im = p; - pi.span_fm = fmodf(sp, 1.f); - pi.span_im = sp; - - if (!dpl2) { - CalcBus(vol_tab, &vi->volL, &vi->volR, &vi->volS, vol, &pi); - CalcBus(vol_tab, &vi->volAuxAL, &vi->volAuxAR, &vi->volAuxAS, auxa, &pi); - CalcBus(vol_tab, &vi->volAuxBL, &vi->volAuxBR, &vi->volAuxBS, auxb, &pi); - } else { - CalcBusDPL2(vol_tab, &vi->volL, &vi->volR, &vi->volAuxBL, &vi->volAuxBR, vol, &pi); - CalcBus(vol_tab, &vi->volAuxAL, &vi->volAuxAR, &vi->volAuxAS, auxa, &pi); - vi->volS = 0.f; - vi->volAuxBS = 0.f; - } -} diff --git a/src/musyx/runtime/profile.c b/src/musyx/runtime/profile.c deleted file mode 100644 index 53000f0e..00000000 --- a/src/musyx/runtime/profile.c +++ /dev/null @@ -1,94 +0,0 @@ -#include "dolphin/PPCArch.h" -#include "musyx/musyx_priv.h" - -SND_PROF_USERCALLBACK sndProfUserCallback = NULL; - -void sndProfSetCallback(SND_PROF_USERCALLBACK callback) { sndProfUserCallback = callback; } - -void sndProfUpdateMisc(SND_PROFILE_INFO* info) { - info->numMusicVoices = voiceMusicRunning; - info->numSFXVoices = voiceFxRunning; -} - -void sndProfResetPMC(SND_PROFILE_DATA* info) { - PPCMtpmc1(0); - PPCMtpmc2(0); - PPCMtpmc3(0); - PPCMtpmc4(0); - info->sumLoadStores = info->loadStores = 0; - info->sumMissCycles = info->missCycles = 0; - info->sumCycles = info->cycles = 0; - info->sumInstructions = info->instructions = 0; - info->peekLoadStores = 0; - info->peekMissCycles = 0; - info->peekCycles = 0; - info->peekInstructions = 0; - info->cnt = 0; - info->paused = 1; -} -void sndProfStartPMC(SND_PROFILE_DATA* info) { - PPCMtmmcr0(0); - PPCMtmmcr1(0); - info->paused = 0; - info->_loadStores = PPCMfpmc2(); - info->_missCycles = PPCMfpmc3(); - info->_cycles = PPCMfpmc4(); - info->_instructions = PPCMfpmc1(); - PPCMtmmcr1(0x78400000); - PPCMtmmcr0(0xc08b); -} - -void sndProfPausePMC(SND_PROFILE_DATA* info) { - PPCMtmmcr0(0); - PPCMtmmcr1(0); - info->loadStores += PPCMfpmc2() - info->_loadStores; - info->missCycles += PPCMfpmc3() - info->_missCycles; - info->cycles += PPCMfpmc4() - info->_cycles; - info->instructions += PPCMfpmc1() - info->_instructions; - info->paused = 1; - PPCMtmmcr1(0x78400000); - PPCMtmmcr0(0xc08b); -} -void sndProfStopPMC(SND_PROFILE_DATA* info) { - PPCMtmmcr0(0); - PPCMtmmcr1(0); - if (info->paused == 0) { - info->loadStores = info->loadStores + (PPCMfpmc2() - info->_loadStores); - info->missCycles = info->missCycles + (PPCMfpmc3() - info->_missCycles); - info->cycles = info->cycles + (PPCMfpmc4() - info->_cycles); - info->instructions = info->instructions + (PPCMfpmc1() - info->_instructions); - info->paused = 1; - } - info->cnt = info->cnt + 1; - info->sumLoadStores += info->loadStores; - info->sumMissCycles += info->missCycles; - - info->sumCycles += info->cycles; - info->sumInstructions += info->instructions; - info->avgLoadStores = info->sumLoadStores / info->cnt; - info->avgMissCycles = info->sumMissCycles / info->cnt; - info->avgCycles = info->sumCycles / info->cnt; - info->avgInstructions = info->sumInstructions / info->cnt; - info->lastLoadStores = info->loadStores; - info->lastMissCycles = info->missCycles; - info->lastCycles = info->cycles; - info->lastInstructions = info->instructions; - if (info->loadStores > info->peekLoadStores) { - info->peekLoadStores = info->loadStores; - } - if (info->missCycles > info->peekMissCycles) { - info->peekMissCycles = info->missCycles; - } - if (info->cycles > info->peekCycles) { - info->peekCycles = info->cycles; - } - if (info->instructions > info->peekInstructions) { - info->peekInstructions = info->instructions; - } - info->loadStores = 0; - info->missCycles = 0; - info->cycles = 0; - info->instructions = 0; - PPCMtmmcr1(0x78400000); - PPCMtmmcr0(0xc08b); -} diff --git a/src/musyx/runtime/s_data.c b/src/musyx/runtime/s_data.c deleted file mode 100644 index 815d4562..00000000 --- a/src/musyx/runtime/s_data.c +++ /dev/null @@ -1,331 +0,0 @@ - -#include "musyx/assert.h" -#include "musyx/hardware.h" -#include "musyx/seq.h" -#include "musyx/synth.h" -#include "musyx/synthdata.h" -#include "musyx/s3d.h" - -static GSTACK gs[128]; -static s16 sp; - -void dataInitStack() { sp = 0; } - -static MEM_DATA* GetPoolAddr(u16 id, MEM_DATA* m) { - while (m->nextOff != 0xFFFFFFFF) { - if (m->id == id) { - return m; - } - - m = (MEM_DATA*)((u8*)m + m->nextOff); - } - return NULL; -} - -static MEM_DATA* GetMacroAddr(u16 id, POOL_DATA* pool) { - return pool == NULL ? NULL : GetPoolAddr(id, (MEM_DATA*)((u8*)pool + pool->macroOff)); -} - -static MEM_DATA* GetCurveAddr(u16 id, POOL_DATA* pool) { - return pool == NULL ? NULL : GetPoolAddr(id, (MEM_DATA*)((u8*)pool + pool->curveOff)); -} -static MEM_DATA* GetKeymapAddr(u16 id, POOL_DATA* pool) { - return pool == NULL ? NULL : GetPoolAddr(id, (MEM_DATA*)((u8*)pool + pool->keymapOff)); -} -static MEM_DATA* GetLayerAddr(u16 id, POOL_DATA* pool) { - return pool == NULL ? NULL : GetPoolAddr(id, (MEM_DATA*)((u8*)pool + pool->layerOff)); -} - -static void InsertData(u16 id, void* data, u8 dataType, u32 remove) { - MEM_DATA* m; // r30 - - switch (dataType) { - case 0: - if (!remove) { - if ((m = GetMacroAddr(id, data)) != NULL) { - dataInsertMacro(id, &m->data.cmd); - - } else { - dataInsertMacro(id, NULL); - } - } else { - dataRemoveMacro(id); - } - break; - case 2: { - id |= 0x4000; - if (!remove) { - if ((m = GetKeymapAddr(id, data)) != NULL) { - dataInsertKeymap(id, &m->data.map); - } else { - dataInsertKeymap(id, NULL); - } - } else { - dataRemoveKeymap(id); - } - } break; - case 3: { - id |= 0x8000; - if (!remove) { - if ((m = GetLayerAddr(id, data)) != NULL) { - dataInsertLayer(id, &m->data.layer.entry, m->data.layer.num); - } else { - dataInsertLayer(id, NULL, 0); - } - } else { - dataRemoveLayer(id); - } - } break; - case 4: - if (!remove) { - if ((m = GetCurveAddr(id, data)) != NULL) { - dataInsertCurve(id, &m->data.tab); - } else { - dataInsertCurve(id, NULL); - } - } else { - dataRemoveCurve(id); - } - break; - case 1: - if (!remove) { - dataAddSampleReference(id); - } else { - dataRemoveSampleReference(id); - } - break; - } -} - -static void ScanIDList(u16* ref, void* data, u8 dataType, u32 remove) { - u16 id; // r30 - - while (*ref != 0xFFFF) { - if ((*ref & 0x8000)) { - id = *ref & 0x3fff; - while (id <= ref[1]) { - InsertData(id, data, dataType, remove); - ++id; - } - ref += 2; - - } else { - InsertData(*ref++, data, dataType, remove); - } - } -} - -static void ScanIDListReverse(u16* refBase, void* data, u8 dataType, u32 remove) { - s16 id; - u16* ref; - - if (*refBase != 0xffff) { - ref = refBase; - while (*ref != 0xffff) { - ref++; - } - ref--; - - while (ref >= refBase) { - if (ref != refBase) { - if ((ref[-1] & 0x8000) != 0) { - id = *ref; - while (id >= (s16)(ref[-1] & 0x3fff)) { - InsertData(id, data, dataType, remove); - id--; - } - ref -= 2; - } else { - InsertData(*ref, data, dataType, remove); - ref--; - } - } else { - InsertData(*ref, data, dataType, remove); - ref--; - } - } - } -} - -static void InsertMacros(unsigned short* ref, void* pool) { ScanIDList(ref, pool, 0, 0); } - -static void InsertCurves(unsigned short* ref, void* pool) { ScanIDList(ref, pool, 4, 0); } - -static void InsertKeymaps(unsigned short* ref, void* pool) { ScanIDList(ref, pool, 2, 0); } - -static void InsertLayers(unsigned short* ref, void* pool) { ScanIDList(ref, pool, 3, 0); } - -static void RemoveMacros(unsigned short* ref) { ScanIDList(ref, NULL, 0, 1); } - -static void RemoveCurves(unsigned short* ref) { ScanIDList(ref, NULL, 4, 1); } - -static void RemoveKeymaps(unsigned short* ref) { ScanIDList(ref, NULL, 2, 1); } - -static void RemoveLayers(unsigned short* ref) { ScanIDList(ref, NULL, 3, 1); } - -static void InsertSamples(u16* ref, void* samples, void* sdir) { - samples = hwTransAddr(samples); - if (dataInsertSDir((SDIR_DATA*)sdir, samples)) { - ScanIDList(ref, sdir, 1, 0); - } -} - -static void RemoveSamples(unsigned short* ref, void* sdir) { - ScanIDListReverse(ref, NULL, 1, 1); - dataRemoveSDir(sdir); -} - -static void InsertFXTab(unsigned short gid, FX_DATA* fd) { dataInsertFX(gid, fd->fx, fd->num); } - -static void RemoveFXTab(unsigned short gid) { dataRemoveFX(gid); } - -void sndSetSampleDataUploadCallback(void* (*callback)(u32, u32), - u32 chunckSize) { - hwSetSaveSampleCallback(callback, chunckSize); -} - -bool sndPushGroup(void* prj_data, u16 gid, void* samples, void* sdir, void* pool) { - GROUP_DATA* g; // r31 - MUSY_ASSERT_MSG(prj_data != NULL, "Project data pointer is NULL"); - MUSY_ASSERT_MSG(sdir != NULL, "Sample directory pointer is NULL"); - - if (sndActive && sp < 128) { - g = prj_data; - - while (g->nextOff != 0xFFFFFFFF) { - if (g->id == gid) { - gs[sp].gAddr = g; - gs[sp].prjAddr = prj_data; - gs[sp].sdirAddr = sdir; - InsertSamples((u16*)((u8*)prj_data + g->sampleOff), samples, sdir); - InsertMacros((u16*)((u8*)prj_data + g->macroOff), pool); - InsertCurves((u16*)((u8*)prj_data + g->curveOff), pool); - InsertKeymaps((u16*)((u8*)prj_data + g->keymapOff), pool); - InsertLayers((u16*)((u8*)prj_data + g->layerOff), pool); - if (g->type == 1) { - InsertFXTab(gid, (FX_DATA*)((u8*)prj_data + g->data.song.normpageOff)); - } - hwSyncSampleMem(); - ++sp; - return TRUE; - } - - g = (GROUP_DATA*)((u8*)prj_data + g->nextOff); - } - } - - MUSY_DEBUG("Group ID=%d could not be pushed.\n", gid); - return FALSE; -} - -/* - - - - - - - - - - -*/ -bool sndPopGroup() { - GROUP_DATA* g; - SDIR_DATA* sdir; - void* prj; - FX_DATA* fd; - - MUSY_ASSERT_MSG(sndActive != FALSE, "Sound system is not initialized."); - MUSY_ASSERT_MSG(sp != 0, "Soundstack is empty."); - g = gs[--sp].gAddr; - prj = gs[sp].prjAddr; - sdir = gs[sp].sdirAddr; - hwDisableIrq(); - - if (g->type == 1) { - fd = (FX_DATA*)((u8*)prj + g->data.song.normpageOff); - s3dKillEmitterByFXID(fd->fx, fd->num); - } else { - seqKillInstancesByGroupID(g->id); - } - - synthKillVoicesByMacroReferences((u16*)((u8*)prj + g->macroOff)); - hwEnableIrq(); - RemoveSamples((u16*)((u8*)prj + g->sampleOff), sdir); - RemoveMacros((u16*)((u8*)prj + g->macroOff)); - RemoveCurves((u16*)((u8*)prj + g->curveOff)); - RemoveKeymaps((u16*)((u8*)prj + g->keymapOff)); - RemoveLayers((u16*)((u8*)prj + g->layerOff)); - if (g->type == 1) { - RemoveFXTab(g->id); - } - return 1; -} - -/* - - - - - - - - - - - - -*/ - -u32 seqPlaySong(u16 sgid, u16 sid, void* arrfile, SND_PLAYPARA* para, u8 irq_call, u8 studio) { - int i; - GROUP_DATA* g; - PAGE* norm; - PAGE* drum; - MIDISETUP* midiSetup; - u32 seqId; - void* prj; - MUSY_ASSERT_MSG(sndActive != FALSE, "Sound system is not initialized."); - - for (i = 0; i < sp; ++i) { - if (sgid != gs[i].gAddr->id) { - continue; - } - - if (gs[i].gAddr->type == 0) { - g = gs[i].gAddr; - prj = gs[i].prjAddr; - norm = (PAGE*)((size_t)prj + g->data.song.normpageOff); - drum = (PAGE*)((size_t)prj + g->data.song.drumpageOff); - midiSetup = (MIDISETUP*)((size_t)prj + g->data.song.midiSetupOff); - while (midiSetup->songId != 0xFFFF) { - if (midiSetup->songId == sid) { - if (irq_call != 0) { - seqId = seqStartPlay(norm, drum, midiSetup, arrfile, para, studio, sgid); - } else { - hwDisableIrq(); - seqId = seqStartPlay(norm, drum, midiSetup, arrfile, para, studio, sgid); - hwEnableIrq(); - } - return seqId; - } - - ++midiSetup; - } - - MUSY_DEBUG("Song ID=%d is not in group ID=%d.", sid, sgid); - return 0xffffffff; - } else { - MUSY_DEBUG("Group ID=%d is no songgroup.", sgid); - return 0xffffffff; - } - } - - MUSY_DEBUG("Group ID=%d is not on soundstack.", sgid); - return 0xffffffff; -} - -u32 sndSeqPlayEx(u16 sgid, u16 sid, void* arrfile, SND_PLAYPARA* para, u8 studio) { - return seqPlaySong(sgid, sid, arrfile, para, 0, studio); -} diff --git a/src/musyx/runtime/seq.c b/src/musyx/runtime/seq.c deleted file mode 100644 index 6a2728ab..00000000 --- a/src/musyx/runtime/seq.c +++ /dev/null @@ -1,1378 +0,0 @@ -#include "musyx/seq.h" - -#include "musyx/assert.h" -#include "musyx/sal.h" -#include "musyx/synth.h" - -#include - -static NOTE seqNote[256]; -SEQ_INSTANCE seqInstance[8]; -u16 seqMIDIPriority[8][16]; - -static u32 seq_next_id = 0; -static bool8 curFadeOutState = 0; -static u32 curSeqId = 0; -static NOTE* noteFree = NULL; -static SEQ_INSTANCE* cseq = NULL; -SEQ_INSTANCE* seqFreeRoot = NULL; -SEQ_INSTANCE* seqPausedRoot = NULL; -SEQ_INSTANCE* seqActiveRoot = NULL; - -static void ClearNotes() { - NOTE* ln = NULL; // r30 - s32 i; // r29 - - noteFree = &seqNote[0]; - for (i = 0; i < 256; ++i) { - seqNote[i].prev = ln; - if (ln != NULL) { - ln->next = &seqNote[i]; - } - ln = &seqNote[i]; - } - - ln->next = NULL; -} - -static void ResetNotes(SEQ_INSTANCE* seq) { - NOTE* n; // r31 - u32 i; // r30 - for (i = 0; i < 2; ++i) { - n = seq->noteUsed[i]; - if (n != NULL) { - for (; n->next != NULL; n = n->next) { - } - - if (noteFree != NULL) { - n->next = noteFree; - noteFree->prev = n; - } - - noteFree = seq->noteUsed[i]; - seq->noteUsed[i] = NULL; - } - } - - n = seq->noteKeyOff; - - if (n != NULL) { - for (; n->next != NULL; n = n->next) { - } - - if (noteFree != NULL) { - n->next = noteFree; - noteFree->prev = n; - } - - noteFree = seq->noteKeyOff; - seq->noteKeyOff = NULL; - } -} - -static void KillNotes(SEQ_INSTANCE* seq) { - NOTE* n; // r31 - u32 i; // r30 - - for (i = 0; i < 2; ++i) { - for (n = seq->noteUsed[i]; n != NULL; n = n->next) { - voiceKillSound(n->id); - } - } - - for (n = seq->noteKeyOff; n != NULL; n = n->next) { - voiceKillSound(n->id); - } -} - -static NOTE* AllocateNote(u32 endTime, u8 section) { - NOTE* n; // r31 - NOTE* nl; // r30 - NOTE* last_nl; // r29 - if ((n = noteFree) != NULL) { - if ((noteFree = n->next) != NULL) { - noteFree->prev = NULL; - } - - n->endTime = endTime; - n->section = section; - n->timeIndex = cseq->section[section].timeIndex; - last_nl = NULL; - for (nl = cseq->noteUsed[n->timeIndex]; nl != NULL; nl = nl->next) { - if (nl->endTime > n->endTime) { - n->next = nl; - n->prev = last_nl; - if (last_nl != NULL) { - last_nl->next = n; - } else { - cseq->noteUsed[n->timeIndex] = n; - } - - nl->prev = n; - return n; - } - - last_nl = nl; - } - n->prev = last_nl; - - if (last_nl != NULL) { - last_nl->next = n; - } else { - cseq->noteUsed[n->timeIndex] = n; - } - - n->next = NULL; - } - - return n; -} - -static void FreeNote(struct NOTE* n) { - if (n->next != NULL) { - n->next->prev = n->prev; - } - - if (n->prev != NULL) { - n->prev->next = n->next; - } else { - cseq->noteUsed[n->timeIndex] = n->next; - } - - if ((n->next = noteFree) != NULL) { - noteFree->prev = n; - } - - n->prev = NULL; - noteFree = n; -} - -static u32 HandleNotes() { - NOTE* note; // r31 - u32 i; // r30 - - for (i = 0; i < 2; ++i) { - note = cseq->noteUsed[i]; - if (note != NULL) { - while (note->endTime <= cseq->section[note->section].time[i].high) { - synthSendKeyOff(note->id); - - if ((cseq->noteUsed[i] = note->next) != NULL) { - cseq->noteUsed[i]->prev = NULL; - } - - if ((note->next = cseq->noteKeyOff) != NULL) { - cseq->noteKeyOff->prev = note; - } - cseq->noteKeyOff = note; - note = cseq->noteUsed[i]; - - if (note == NULL) { - break; - } - } - } - } - - return cseq->noteUsed[0] != NULL || cseq->noteUsed[1] != NULL; -} - -static void KeyOffNotes() { - NOTE* note; // r31 - NOTE* nextNote; // r29 - u32 i; // r30 - - for (i = 0; i < 2; ++i) { - note = cseq->noteUsed[i]; - - while (note != NULL) { - nextNote = note->next; - synthSendKeyOff(note->id); - if ((cseq->noteUsed[i] = note->next) != NULL) { - cseq->noteUsed[i]->prev = NULL; - } - - if ((note->next = cseq->noteKeyOff) != NULL) { - cseq->noteKeyOff->prev = note; - } - cseq->noteKeyOff = note; - note = nextNote; - } - } -} - -static void seqFreeKeyOffNote(NOTE* n) { - if (n->next != NULL) { - n->next->prev = n->prev; - } - - if (n->prev != NULL) { - n->prev->next = n->next; - } else { - cseq->noteKeyOff = n->next; - } - - if ((n->next = noteFree) != NULL) { - noteFree->prev = n; - } - - n->prev = NULL; - noteFree = n; -} - -static void HandleKeyOffNotes() { - NOTE* n; // r31 - NOTE* nn; // r30 - if (!cseq->keyOffCheck) { - n = cseq->noteKeyOff; - while (n != NULL) { - nn = n->next; - if (n->id != SND_ID_ERROR && sndFXCheck(n->id) == SND_ID_ERROR) { - seqFreeKeyOffNote(n); - } - - n = nn; - } - } - - cseq->keyOffCheck = (cseq->keyOffCheck + 1) % 5; -} - -static void InitPublicIds() { seq_next_id = 0; } - -static u32 GetPublicId(u32 seqId) { - u32 pub_id; // r30 - SEQ_INSTANCE* si; // r31 - - do { - pub_id = seq_next_id; - seq_next_id = pub_id + 1; - seq_next_id &= ~SND_SEQ_CROSSFADE_ID; - - for (si = seqActiveRoot; si != NULL; si = si->next) { - if (si->publicId == pub_id) { - pub_id = SND_SEQ_ERROR_ID; - break; - } - } - for (si = seqPausedRoot; si != NULL; si = si->next) { - if (si->publicId == pub_id) { - pub_id = SND_SEQ_ERROR_ID; - break; - } - } - } while (pub_id == SND_SEQ_ERROR_ID); - - seqInstance[seqId].publicId = pub_id; - return pub_id; -} - -u32 seqGetPrivateId(u32 seqId) { - SEQ_INSTANCE* si; // r31 - for (si = seqActiveRoot; si != NULL; si = si->next) { - if (si->publicId == (seqId & ~SND_SEQ_CROSSFADE_ID)) { - return si->index | seqId & SND_SEQ_CROSSFADE_ID; - } - } - for (si = seqPausedRoot; si != NULL; si = si->next) { - if (si->publicId == (seqId & ~SND_SEQ_CROSSFADE_ID)) { - return si->index | seqId & SND_SEQ_CROSSFADE_ID; - } - } - return SND_ID_ERROR; -} - -static void DoPrgChange(SEQ_INSTANCE* seq, u8 prg, u8 midi) { - seqMIDIPriority[curSeqId][midi] = 0xFFFF; - if (midi != 9) { - prg = seq->normTrans[prg]; - if (prg == 0xFF) { - return; - } - - seq->prgState[midi].macId = seq->normtab[prg].macro; - seq->prgState[midi].priority = seq->normtab[prg].prio; - seq->prgState[midi].maxVoices = seq->normtab[prg].maxVoices; -#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 1) - seq->prgState[midi].program = prg; -#endif - return; - } - - prg = seq->drumTrans[prg]; - if (prg == 0xFF) { - return; - } - - seq->prgState[midi].macId = seq->drumtab[prg].macro; - seq->prgState[midi].priority = seq->drumtab[prg].prio; - seq->prgState[midi].maxVoices = seq->drumtab[prg].maxVoices; -#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 1) - seq->prgState[midi].program = prg; -#endif -} - -static void BuildTransTab(u8* tab, PAGE* page) { - u8 i; // r31 - - for (i = 0; i < 128; ++i) { - tab[i] = 0xff; - } - - for (i = 0; page->index != 0xFF; ++i, ++page) { - tab[page->index] = i; - } -} - -static void StartPause(SEQ_INSTANCE* si); -static void InitTrackEvents(); - -u32 seqStartPlay(PAGE* norm, PAGE* drum, MIDISETUP* midiSetup, u32* song, SND_PLAYPARA* para, - u8 studio, u16 sgid) { - ARR* arr; // r27 - u32* tracktab; // r24 - s32 i; // r31 - SEQ_INSTANCE* nseq; // r30 - SEQ_INSTANCE* oldCSeq; // r23 - u32 seqId; // r28 - u32 bpm; // r25 - - if ((nseq = seqFreeRoot) == NULL) { - return SND_ID_ERROR; - } - if ((seqFreeRoot = nseq->next) != NULL) { - seqFreeRoot->prev = NULL; - } - if ((nseq->next = seqActiveRoot) != NULL) { - seqActiveRoot->prev = nseq; - } - - nseq->prev = NULL; - seqActiveRoot = nseq; - nseq->state = 1; - for (i = 0; i < 16; ++i) { - nseq->section[i].globalEventRoot = NULL; - } - - seqId = nseq->index; - nseq->syncActive = FALSE; - nseq->normtab = norm; - nseq->drumtab = drum; - nseq->arrbase = (ARR*)song; - nseq->groupID = sgid; - BuildTransTab(nseq->normTrans, nseq->normtab); - BuildTransTab(nseq->drumTrans, nseq->drumtab); - nseq->defVGroup = seqId + 23; - for (i = 0; i < 64; ++i) { - nseq->trackVolGroup[i] = nseq->defVGroup; - } - - nseq->defStudio = studio; - if (para == NULL) { - nseq->trackMute[0] = -1; - nseq->trackMute[1] = -1; - for (i = 0; i < 16; ++i) { - nseq->section[i].speed = 256; - } - - synthVolume(SND_PAUSEVOL_NORMAL, 0, nseq->defVGroup, 0, SND_ID_ERROR); - } else { - if (para->flags & SND_PLAYPARA_TRACKMUTE) { - nseq->trackMute[0] = para->trackMute[0]; - nseq->trackMute[1] = para->trackMute[1]; - } else { - nseq->trackMute[0] = -1; - nseq->trackMute[1] = -1; - } - - if (para->flags & SND_PLAYPARA_SPEED) { - for (i = 0; i < 16; ++i) { - nseq->section[i].speed = para->speed; - } - } else { - for (i = 0; i < 16; ++i) { - nseq->section[i].speed = 256; - } - } - - if (para->flags & SND_PLAYPARA_SEQVOLDEF) { - for (i = 0; i < para->numSeqVolDef; ++i) { - nseq->trackVolGroup[para->seqVolDef[i].track] = para->seqVolDef[i].volGroup; - synthSetMusicVolumeType(para->seqVolDef[i].volGroup, 0); - } - } - - if (para->flags & SND_PLAYPARA_VOLUME) { - synthVolume(para->volume.target, para->volume.time, nseq->defVGroup, SND_SEQVOL_CONTINUE, - SND_SEQ_ERROR_ID); - - for (i = 0; i < para->numFaded; ++i) { - synthVolume(para->volume.target, para->volume.time, para->faded[i], SND_SEQVOL_CONTINUE, - SND_SEQ_ERROR_ID); - } - } - } - - arr = (ARR*)song; - if (arr->info & 0x80000000) { - nseq->trackSectionTab = ARR_GET(arr, arr->tsTab); - } else { - nseq->trackSectionTab = NULL; - } - - bpm = arr->info & 0x0fffffff; - - if (!(arr->info & 0x40000000)) { - bpm <<= 10; - } - - for (i = 0; i < 16; ++i) { - nseq->section[i].bpm = bpm; - synthSetBpm(bpm >> 10, seqId, i); - - if (arr->mTrack != 0) { - nseq->section[i].mTrack.base = ARR_GET(arr, arr->mTrack); - nseq->section[i].mTrack.addr = nseq->section[i].mTrack.base; - } else { - nseq->section[i].mTrack.base = NULL; - } - - nseq->section[i].loopDisable = FALSE; - nseq->section[i].loopCnt = 0; - } - - tracktab = ARR_GET(arr, arr->tTab); - for (i = 0; i < 64; ++i) { - synthTrackVolume[i] = SND_PAUSEVOL_NORMAL; - nseq->pattern[i].addr = NULL; - if (tracktab[i] != 0) { - nseq->track[i].addr = nseq->track[i].base = ARR_GET(arr, tracktab[i]); - } else { - nseq->track[i].addr = nseq->track[i].base = NULL; - } - } - - nseq->noteUsed[0] = NULL; - nseq->noteUsed[1] = NULL; - nseq->noteKeyOff = NULL; - - for (i = 0; i < 16; ++i) { - inpResetMidiCtrl(i, seqId, 1); - } - for (i = 0; i < 16; ++i) { - nseq->prgState[i].macId = 0xffff; - } - for (i = 0; i < 16; ++i) { - inpResetChannelDefaults(i, seqId); - } - if (midiSetup != NULL) { - for (i = 0; i < 16; ++i) { - DoPrgChange(nseq, midiSetup->channel[i].program, i); - inpSetMidiCtrl(SND_MIDICTRL_VOLUME, i, seqId, midiSetup->channel[i].volume); - inpSetMidiCtrl(SND_MIDICTRL_PANNING, i, seqId, midiSetup->channel[i].panning); - inpSetMidiCtrl(SND_MIDICTRL_REVERB, i, seqId, midiSetup->channel[i].reverb); - inpSetMidiCtrl(SND_MIDICTRL_CHORUS, i, seqId, midiSetup->channel[i].chorus); - } - } - for (i = 0; i < 16; ++i) { - seqMIDIPriority[seqId][i] = 0xffff; - } - for (i = 0; i < 16; ++i) { - nseq->section[i].time[0].high = 0; - nseq->section[i].time[0].low = 0; - nseq->section[i].time[1].high = 0; - nseq->section[i].time[1].low = 0; - nseq->section[i].timeIndex = 0; - } - nseq->keyOffCheck = 0; - - if (para != NULL && (para->flags & SND_PLAYPARA_PAUSE) != 0) { - StartPause(nseq); - } - - oldCSeq = cseq; - cseq = nseq; - InitTrackEvents(); - cseq = oldCSeq; - seqId = GetPublicId(seqId); - return seqId; -} - -static void SetTickDelta(SEQ_SECTION* section, u32 deltaTime) { - float tickDelta = (float)section->bpm * (float)deltaTime * (1.f / (40960000.f)); - tickDelta *= section->speed * (1.f / 256.f); - - section->tickDelta[section->timeIndex].low = fmodf(tickDelta * 65536.f, 65536.f); - section->tickDelta[section->timeIndex].high = floorf(tickDelta); -} - -static void HandleMasterTrack(u8 secIndex) { - SEQ_SECTION* section; // r31 - - section = &cseq->section[secIndex]; - if (section->mTrack.base != NULL) { - while (section->mTrack.addr->time != -1) { - if (section->mTrack.addr->time > section->time[section->timeIndex].high) { - break; - } - - if ((cseq->arrbase->info & 0x40000000) != 0) { - synthSetBpm((section->bpm = section->mTrack.addr->bpm) >> 10, curSeqId, secIndex); - } else { - synthSetBpm(section->mTrack.addr->bpm, curSeqId, secIndex); - section->bpm = section->mTrack.addr->bpm << 10; - } - - ++section->mTrack.addr; - } - } -} - -static void RewindMTrack(u8 secIndex, u32 deltaTime) { - if (cseq->section[secIndex].mTrack.base == NULL) { - return; - } - cseq->section[secIndex].mTrack.addr = cseq->section[secIndex].mTrack.base; - HandleMasterTrack(secIndex); - SetTickDelta(cseq->section + secIndex, deltaTime); -} - -static void StartPause(SEQ_INSTANCE* si) { - if (si->prev != NULL) { - si->prev->next = si->next; - } else { - seqActiveRoot = si->next; - } - - if (si->next != NULL) { - si->next->prev = si->prev; - } - - if ((si->next = seqPausedRoot) != NULL) { - seqPausedRoot->prev = si; - } - - si->prev = NULL; - seqPausedRoot = si; - si->state = 2; -} - -void seqPause(u32 seqId) { - SEQ_INSTANCE* si; // r31 - seqId = seqGetPrivateId(seqId); - - if (seqId == SND_SEQ_ERROR_ID) { - return; - } - - if ((seqId & SND_SEQ_CROSSFADE_ID) == 0) { - si = &seqInstance[seqId]; - if (si->state == 1) { - StartPause(si); - KillNotes(si); - ResetNotes(si); - } - } else { - si = &seqInstance[seqId & ~SND_SEQ_CROSSFADE_ID]; - if (si->state != 0) { - si->syncCrossInfo.flags |= 8; - } - } -} - -void seqStop(u32 seqId) { - SEQ_INSTANCE* si; // r31 - - if ((seqId = seqGetPrivateId(seqId)) == SND_SEQ_ERROR_ID) { - return; - } - - if ((seqId & SND_SEQ_CROSSFADE_ID) == 0) { - si = &seqInstance[seqId]; - switch (si->state) { - case 1: - if (si->prev != NULL) { - si->prev->next = si->next; - } else { - seqActiveRoot = si->next; - } - - KillNotes(&seqInstance[seqId]); - ResetNotes(&seqInstance[seqId]); - break; - case 2: - if (si->prev != NULL) { - si->prev->next = si->next; - } else { - seqPausedRoot = si->next; - } - break; - } - - if (si->next != NULL) { - si->next->prev = si->prev; - } - si->state = 0; - if (seqFreeRoot != NULL) { - seqFreeRoot->prev = si; - } - si->next = seqFreeRoot; - si->prev = NULL; - seqFreeRoot = si; - } else { - si = &seqInstance[seqId & ~SND_SEQ_CROSSFADE_ID]; - if (si->state != 0) { - si->syncSeqIdPtr = NULL; - } - } -} - -void seqKillAllInstances() { - SEQ_INSTANCE* si; // r31 - for (si = seqActiveRoot; si != NULL; si = si->next) { - seqStop(si->publicId); - } - - for (si = seqPausedRoot; si != NULL; si = si->next) { - seqStop(si->publicId); - } -} - -void seqKillInstancesByGroupID(u16 sgid) { - SEQ_INSTANCE* si; // r31 - - for (si = seqActiveRoot; si != NULL; si = si->next) { - if (si->groupID == sgid) { - seqStop(si->publicId); - } - } - for (si = seqPausedRoot; si != NULL; si = si->next) { - if (si->groupID == sgid) { - seqStop(si->publicId); - } - } -} - -void seqSpeed(u32 seqId, u16 speed) { - u32 i; // r30 - - seqId = seqGetPrivateId(seqId); - MUSY_ASSERT_MSG(seqId != SND_SEQ_ERROR_ID, "Sequencer ID is not valid."); - - if ((seqId & SND_SEQ_CROSSFADE_ID) == 0) { - for (i = 0; i < 16; ++i) { - seqInstance[seqId].section[i].speed = speed; - } - } else { - seqId &= ~SND_SEQ_CROSSFADE_ID; - seqInstance[seqId].syncCrossInfo.flags |= SND_CROSSFADE_SPEED; - seqInstance[seqId].syncCrossInfo.speed2 = speed; - } -} - -void seqContinue(u32 seqId) { - struct SEQ_INSTANCE* si; // r31 - - seqId = seqGetPrivateId(seqId); - MUSY_ASSERT_MSG(seqId != SND_SEQ_ERROR_ID, "Sequencer ID is not valid."); - - if ((seqId & SND_SEQ_CROSSFADE_ID) == 0) { - si = &seqInstance[seqId]; - - if (si->state == 2) { - if (si->prev != NULL) { - si->prev->next = si->next; - } else { - seqPausedRoot = si->next; - } - - if (si->next != NULL) { - si->next->prev = si->prev; - } - - if ((si->next = seqActiveRoot) != NULL) { - seqActiveRoot->prev = si; - } - - si->prev = NULL; - seqActiveRoot = si; - si->state = 1; - } - } else { - seqInstance[seqId & ~SND_SEQ_CROSSFADE_ID].syncCrossInfo.flags &= ~SND_CROSSFADE_PAUSENEW; - } -} - -void seqMute(u32 seqId, u32 mask1, u32 mask2) { - seqId = seqGetPrivateId(seqId); - if (seqId == SND_SEQ_ERROR_ID) { - return; - } - - if ((seqId & SND_SEQ_CROSSFADE_ID) == 0) { - seqInstance[seqId].trackMute[0] = mask1; - seqInstance[seqId].trackMute[1] = mask2; - } else { - seqId &= ~SND_SEQ_CROSSFADE_ID; - seqInstance[seqId].syncCrossInfo.flags |= SND_CROSSFADE_TRACKMUTE; - seqInstance[seqId].syncCrossInfo.trackMute2[0] = mask1; - seqInstance[seqId].syncCrossInfo.trackMute2[1] = mask2; - } -} - -void seqVolume(u8 volume, u16 time, u32 seqId, u8 mode) { - u32 i; // r29 - u32 pub_id; // r27 - - pub_id = seqId; - seqId = seqGetPrivateId(seqId); - if (seqId == SND_SEQ_ERROR_ID) { - return; - } - - if ((seqId & SND_SEQ_CROSSFADE_ID) == 0) { - synthVolume(volume, time, seqInstance[seqId].defVGroup, mode, pub_id); - for (i = 0; i < 64; ++i) { - if (seqInstance[seqId].trackVolGroup[i] != seqInstance[seqId].defVGroup) { - synthVolume(volume, time, seqInstance[seqId].trackVolGroup[i], SND_SEQVOL_CONTINUE, - SND_SEQ_ERROR_ID); - } - } - } else { - seqId &= ~SND_SEQ_CROSSFADE_ID; - switch (mode & SND_SEQVOL_MODEMASK) { - case SND_SEQVOL_CONTINUE: - seqInstance[seqId].syncCrossInfo.vol2 = volume; - break; - case SND_SEQVOL_STOP: - seqInstance[seqId].syncSeqIdPtr = NULL; - break; - case SND_SEQVOL_PAUSE: - seqInstance[seqId].syncCrossInfo.flags |= SND_CROSSFADE_PAUSENEW; - seqInstance[seqId].syncCrossInfo.vol2 = volume; - break; - case SND_SEQVOL_MUTE: - seqInstance[seqId].syncCrossInfo.flags |= SND_CROSSFADE_MUTENEW; - seqInstance[seqId].syncCrossInfo.vol2 = volume; - break; - default: - MUSY_FATAL("Illegal sequencere fade mode detected."); - break; - } - } -} - -void seqCrossFade(SND_CROSSFADE* ci, u32* new_seqId, bool8 irq_call) { - SND_PLAYPARA pp; // r1+0x14 - u32 seqId; // r29 - u16 time; // r27 - - seqId = seqGetPrivateId(ci->seqId1); - MUSY_ASSERT_MSG(seqId != SND_SEQ_ERROR_ID, "Sequencer ID is not valid."); - - if ((ci->flags & SND_CROSSFADE_SYNC) != 0) { - seqInstance[seqId].syncCrossInfo = *ci; - seqInstance[seqId].syncActive = TRUE; - seqInstance[seqId].syncSeqIdPtr = new_seqId; - seqInstance[seqId].syncCrossInfo.flags &= ~SND_CROSSFADE_SYNC; - *new_seqId = ci->seqId1 | SND_SEQ_CROSSFADE_ID; - return; - } - - if (irq_call) { - time = ci->time1 < 5 ? 5 : ci->time1; - if ((ci->flags & SND_CROSSFADE_PAUSE) != 0) { - seqVolume(0, time, ci->seqId1, SND_SEQVOL_PAUSE); - } else if ((ci->flags & SND_CROSSFADE_MUTE) != 0) { - seqVolume(0, time, ci->seqId1, SND_SEQVOL_MUTE); - } else { - seqVolume(0, time, ci->seqId1, SND_SEQVOL_STOP); - } - } else { - if ((ci->flags & SND_CROSSFADE_PAUSE) != 0) { - sndSeqVolume(0, ci->time1, ci->seqId1, SND_SEQVOL_PAUSE); - } else if ((ci->flags & SND_CROSSFADE_MUTE) != 0) { - sndSeqVolume(0, ci->time1, ci->seqId1, SND_SEQVOL_MUTE); - } else { - sndSeqVolume(0, ci->time1, ci->seqId1, SND_SEQVOL_STOP); - } - } - - if (new_seqId == NULL) { - return; - } - - if ((ci->flags & SND_CROSSFADE_CONTINUE) != 0) { - if (seqGetPrivateId(ci->seqId2) != SND_SEQ_ERROR_ID) { - if (irq_call) { - seqContinue(ci->seqId2); - seqVolume(ci->vol2, ci->time2, ci->seqId2, SND_SEQVOL_CONTINUE); - if ((ci->flags & SND_CROSSFADE_TRACKMUTE) != 0) { - seqMute(ci->seqId2, ci->trackMute2[0], ci->trackMute2[1]); - } - if ((ci->flags & SND_CROSSFADE_SPEED) != 0) { - seqSpeed(ci->seqId2, ci->speed2); - } - } else { - sndSeqContinue(ci->seqId2); - sndSeqVolume(ci->vol2, ci->time2, ci->seqId2, SND_SEQVOL_CONTINUE); - if ((ci->flags & SND_CROSSFADE_TRACKMUTE) != 0) { - sndSeqMute(ci->seqId2, ci->trackMute2[0], ci->trackMute2[1]); - } - if ((ci->flags & SND_CROSSFADE_SPEED) != 0) { - sndSeqSpeed(ci->seqId2, ci->speed2); - } - } - *new_seqId = ci->seqId2; - } else { - *new_seqId = SND_SEQ_ERROR_ID; - } - } else { - pp.flags = SND_PLAYPARA_VOLUME; - if ((ci->flags & SND_CROSSFADE_PAUSENEW) != 0) { - pp.flags |= SND_PLAYPARA_PAUSE; - } - if ((ci->flags & SND_CROSSFADE_SPEED) != 0) { - pp.flags |= SND_PLAYPARA_SPEED; - pp.speed = ci->speed2; - } - if ((ci->flags & SND_CROSSFADE_TRACKMUTE) != 0) { - pp.flags |= SND_PLAYPARA_TRACKMUTE; - pp.trackMute[0] = ci->trackMute2[0]; - pp.trackMute[1] = ci->trackMute2[1]; - } - pp.volume.time = ci->time2; - pp.volume.target = ci->vol2; - pp.numFaded = 0; - if (irq_call != 0) { - if ((*new_seqId = seqPlaySong(ci->gid2, ci->sid2, ci->arr2, &pp, TRUE, ci->studio2)) != - SND_SEQ_ERROR_ID && - (ci->flags & SND_CROSSFADE_MUTENEW) != 0) { - seqMute(*new_seqId, 0, 0); - } - } else { - if ((*new_seqId = sndSeqPlayEx(ci->gid2, ci->sid2, ci->arr2, &pp, ci->studio2)) != - SND_SEQ_ERROR_ID && - (ci->flags & SND_CROSSFADE_MUTENEW) != 0) { - sndSeqMute(*new_seqId, 0, 0); - } - } - } -} - -static u8* GetStreamValue(u8* stream, u16* deltaTime, s16* deltaData) { - u8 b1; // r31 - u8 b2; // r29 - s16 v; // r30 - - b1 = stream[0]; - b2 = stream[1]; - if (b1 == 0x80 && b2 == 0) { - return NULL; - } - - if ((b1 & 0x80) != 0) { -#if MUSY_VERSION >= MUSY_VERSION_CHECK(1, 5, 4) - *deltaTime = (((u16)b1 & 0x7f) << 8) | b2; -#else - *deltaTime = ((b1 & 0x7f) << 8) | b2; -#endif - stream += 2; - } else { - *deltaTime = b1; - stream += 1; - } - - b1 = stream[0]; - b2 = stream[1]; - if ((b1 & 0x80) != 0) { -#if MUSY_VERSION >= MUSY_VERSION_CHECK(1, 5, 4) - v = (((u16)b1 & 0x7f) << 8) | b2; - v |= (v & 0x4000) << 1; -#else - v = ((b1 & 0x7f) << 8) | b2; - v <<= 1; - v >>= 1; -#endif - *deltaData = v; - stream += 2; - } else { -#if MUSY_VERSION >= MUSY_VERSION_CHECK(1, 5, 4) - b1 |= (b1 & 0x40) << 1; - *deltaData = (s8)b1; -#else - v = b1; - v <<= 9; - v >>= 9; - *deltaData = v; -#endif - stream += 1; - } - - return stream; -} - -static void InitStream(SEQ_STREAM* stream, u32 streamDataOffset) { - u16 delta; // r1+0x10 - if (streamDataOffset != 0) { - if ((stream->nextAddr = GetStreamValue(ARR_GET(cseq->arrbase, streamDataOffset), &delta, - &stream->nextDelta)) != NULL) { - stream->nextTime = delta; - } else { - stream->nextTime = 0x7fffffff; - } - } else { - stream->nextTime = 0x7fffffff; - } -} - -static u16 HandleStream(SEQ_STREAM* stream) { - u16 delta; // r1+0xC - stream->value += stream->nextDelta; - if (stream->nextAddr != NULL) { - if ((stream->nextAddr = GetStreamValue(stream->nextAddr, &delta, &stream->nextDelta)) != NULL) { - stream->nextTime += delta; - } else { - stream->nextTime = 0x7fffffff; - } - } else { - stream->nextTime = 0x7fffffff; - } - return stream->value; -} - -static SEQ_EVENT* GenerateNextTrackEvent(u8 trackId) { - TRACK* track; // r29 - CPAT* pattern; // r31 - SEQ_EVENT* ev; // r30 - u32 patternTime; // r28 - u32 pitchTime; // r27 - u32 modTime; // r26 - - track = &cseq->track[trackId]; - pattern = &cseq->pattern[trackId]; - - if (track->addr != NULL) { - ev = &cseq->event[trackId]; - ev->trackId = trackId; - ev->info.pattern.base = pattern; - - if (pattern->addr == NULL) { - null_pattern_addr: - if (track->addr->pattern == 0xffff) { - track->addr = NULL; - return NULL; - } - - if (track->addr->pattern == 0xfffe) { - if (cseq->trackSectionTab == NULL) { - if (cseq->section[0].loopDisable) { - track->addr = NULL; - return NULL; - } - } else if (cseq->section[cseq->trackSectionTab[trackId]].loopDisable) { - track->addr = NULL; - return NULL; - } - - ev->type = 3; - ev->time = track->addr->time; - // TODO what is this? - track->addr = &track->base[*((u16*)&track->addr->transpose)]; - return ev; - } - - ev->type = 4; - ev->time = track->addr->time; - ev->info.trackAddr = track->addr; - ++track->addr; - return ev; - } - - pitchTime = pattern->pitchBend.nextTime; - modTime = pattern->modulation.nextTime; - - loop: - patternTime = pattern->addr->time + pattern->lTime; - if (patternTime >= pitchTime) { - goto use_pitch_time; - } - if (patternTime >= modTime) { - goto use_mod_time; - } - if (pattern->addr->key == 0xff && pattern->addr->velocity == 0xff) { - pattern->addr = NULL; - goto null_pattern_addr; - } - - ev->info.trackAddr = (TENTRY*)pattern->addr; - pattern->lTime = patternTime; - - if ((pattern->addr->key & 0x80) != 0) { - pattern->addr = (NOTE_DATA*)((u8*)pattern->addr + 4); - goto use_pattern_time; - } - if ((pattern->addr->key | pattern->addr->velocity) == 0) { - pattern->addr = (NOTE_DATA*)((u8*)pattern->addr + 4); - goto loop; - } - ++pattern->addr; - - use_pattern_time: - ev->type = 0; - ev->time = patternTime + pattern->baseTime; - goto end; - - use_pitch_time: - if (pitchTime < modTime) { - ev->time = pitchTime + pattern->baseTime; - ev->type = 2; - goto end; - } - - use_mod_time: - ev->time = modTime + pattern->baseTime; - ev->type = 1; - - end: - return ev; - } - - return NULL; -} - -static void InsertGlobalEvent(SEQ_SECTION* section, SEQ_EVENT* event) { - SEQ_EVENT* el; // r31 - SEQ_EVENT* last_el; // r30 - - last_el = NULL; - el = section->globalEventRoot; - for (; el != NULL; last_el = el, el = el->next) { - if (el->time > event->time) { - event->next = el; - event->prev = last_el; - if (last_el != NULL) { - last_el->next = event; - } else { - section->globalEventRoot = event; - } - el->prev = event; - return; - } - } - - event->prev = last_el; - if (last_el != NULL) { - last_el->next = event; - } else { - section->globalEventRoot = event; - } - event->next = NULL; -} - -static u32 GetNextEventTime(SEQ_SECTION* section) { - return section->globalEventRoot == NULL ? 0 : section->globalEventRoot->time; -} - -static SEQ_EVENT* GetGlobalEvent(SEQ_SECTION* section) { - SEQ_EVENT* ev; // r31 - ev = section->globalEventRoot; - if (ev != NULL && ((section->globalEventRoot = ev->next) != NULL)) { - section->globalEventRoot->prev = NULL; - } - return ev; -} - -static SEQ_EVENT* HandleEvent(SEQ_EVENT* event, u8 secIndex, bool* loopFlag) { - CPAT* pa; // r26 - NOTE_DATA* pe; // r24 - s32 velocity; // r28 - s32 key; // r30 - u8 midi; // r27 - u16 macId; // r21 - NOTE* note; // r22 - TENTRY* tEntry; // r25 - CPAT* pattern; // r29 - u32* pTab; // r20 - SEQ_PATTERN* pptr; // r23 - - switch (event->type) { - case 4: - tEntry = event->info.trackAddr; - pattern = &cseq->pattern[event->trackId]; - pTab = ARR_GET(cseq->arrbase, cseq->arrbase->pTab); - pptr = ARR_GET(cseq->arrbase, pTab[tEntry->pattern]); - pattern->addr = (NOTE_DATA*)&pptr->noteData; - pattern->lTime = 0; - pattern->baseTime = tEntry->time; - pattern->patternInfo = tEntry; - InitStream(&pattern->pitchBend, pptr->pitchBend); - pattern->pitchBend.value = 0x2000; - InitStream(&pattern->modulation, pptr->modulation); - pattern->modulation.value = 0; - pattern->midi = ARR_GET_TYPE(cseq->arrbase, cseq->arrbase->tmTab, u8*)[event->trackId]; - if (tEntry->prgChange != 0xff) { - DoPrgChange(cseq, tEntry->prgChange, pattern->midi); - } - if (tEntry->velocity != 0xff) { - inpSetMidiCtrl(SND_MIDICTRL_VOLUME, pattern->midi, curSeqId, tEntry->velocity); - } - break; - - case 0: - pe = event->info.pattern.addr; - pa = event->info.pattern.base; - key = pe->key; - velocity = pe->velocity; - midi = pa->midi; - - if ((key & 0x80) != 0) { - switch (velocity) { - case 0: - DoPrgChange(cseq, key & 0x7f, midi); - break; - case 1: - inpSetMidiCtrl(0x82 /* TODO SND_MIDICTRL_? */, midi, curSeqId, key & 0x7f); - break; - default: - if ((velocity & 0x80) != 0x80) { - break; - } - switch (velocity & 0x7f) { - case 0x68: - if (cseq->syncActive) { - seqCrossFade(&cseq->syncCrossInfo, cseq->syncSeqIdPtr, TRUE); - cseq->syncActive = FALSE; - } - break; - case 0x69: - seqMIDIPriority[curSeqId][midi] = key & 0x7f; - break; - case 0x6a: - seqMIDIPriority[curSeqId][midi] = (key & 0x7f) + 0x80; - break; - case 0x79: - inpResetMidiCtrl(midi, curSeqId, FALSE); - break; - case 0x7b: - KeyOffNotes(); - break; - default: - inpSetMidiCtrl(velocity & 0x7f, midi, curSeqId, key & 0x7f); - break; - } - } - break; - } - - if ((cseq->trackMute[event->trackId / 32] & (1 << (event->trackId & 0x1f))) != 0) { - if ((macId = cseq->prgState[midi].macId) != 0xffff) { - key += pa->patternInfo->transpose; - key = CLAMP(key, 0, 0x7f); - - velocity += pa->patternInfo->velocityAdd; - velocity = CLAMP(velocity, 0, 0x7f); - - if ((note = AllocateNote(event->time + pe->length, secIndex)) != NULL) { - if ((note->id = synthStartSound( - macId, cseq->prgState[midi].priority, cseq->prgState[midi].maxVoices, -#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 1) - cseq->groupID | (cseq->prgState[midi].program << 16) | - ((midi == 9 ? 1 : 0) << 24), -#endif - key, velocity, 64, midi, curSeqId, secIndex, 0, event->trackId, - cseq->trackVolGroup[event->trackId], curFadeOutState ? -1 : 0, cseq->defStudio, - synthITDDefault[cseq->defStudio].music)) == SND_ID_ERROR) { - FreeNote(note); - } - } - } - } - break; - - case 2: - pa = event->info.pattern.base; - inpSetMidiCtrl14(SND_MIDICTRL_PITCHBEND, pa->midi, curSeqId, HandleStream(&pa->pitchBend)); - break; - - case 1: - pa = event->info.pattern.base; - inpSetMidiCtrl14(SND_MIDICTRL_MODULATION, pa->midi, curSeqId, HandleStream(&pa->modulation)); - break; - - case 3: - *loopFlag |= 1; - return NULL; - } - - return GenerateNextTrackEvent(event->trackId); -} - -static void InitTrackEvents() { - u32 i; // r31 - SEQ_EVENT* ev; // r30 - - if (cseq->trackSectionTab == NULL) { - for (i = 0; i < 0x40; i += 1) { - if ((ev = GenerateNextTrackEvent(i)) != NULL) { - InsertGlobalEvent(cseq->section, ev); - } - } - } else { - for (i = 0; i < 0x40; i += 1) { - if ((ev = GenerateNextTrackEvent(i)) != NULL) { - InsertGlobalEvent(cseq->section + cseq->trackSectionTab[i], ev); - } - } - } -} - -static void InitTrackEventsSection(u8 secIndex) { - u32 i; // r31 - SEQ_EVENT* ev; // r30 - - if (cseq->trackSectionTab == NULL) { - for (i = 0; i < 64; i += 1) { - if ((ev = GenerateNextTrackEvent(i)) != NULL) { - InsertGlobalEvent(cseq->section, ev); - } - } - } else { - for (i = 0; i < 64; i += 1) { - if ((secIndex == cseq->trackSectionTab[i]) && (ev = GenerateNextTrackEvent(i)) != NULL) { - InsertGlobalEvent(cseq->section + secIndex, ev); - } - } - } -} - -static bool HandleTrackEvents(u8 secIndex, u32 deltaTime) { - SEQ_EVENT* ev; // r29 - bool loopFlag; // r1+0x10 - SEQ_SECTION* section; // r31 - - section = &cseq->section[secIndex]; - loopFlag = FALSE; - - while (GetNextEventTime(section) <= section->time[section->timeIndex].high) { - if ((ev = GetGlobalEvent(section)) == NULL) { - if (!loopFlag) { - return FALSE; - } - - loopFlag = FALSE; - section->timeIndex ^= 1; - section->time[section->timeIndex].high = cseq->arrbase->loopPoint[secIndex]; - section->time[section->timeIndex].low = section->time[section->timeIndex ^ 1].low; - RewindMTrack(secIndex, deltaTime); - section->loopCnt += 1; - InitTrackEventsSection(secIndex); - continue; - } - - if ((ev = HandleEvent(ev, secIndex, &loopFlag)) != NULL) { - InsertGlobalEvent(section, ev); - } - } - - return TRUE; -} - -void seqHandle(u32 deltaTime) { - u32 x; // r29 - u32 i; // r31 - u32 j; // r28 - u32 eventsActive; // r25 - u32 notesActive; // r24 - SEQ_INSTANCE* si; // r30 - SEQ_INSTANCE* nextSi; // r27 - - if (deltaTime == 0) { - return; - } - - si = seqActiveRoot; - while (si != NULL) { - nextSi = si->next; - cseq = si; - curSeqId = si->index; - curFadeOutState = synthIsFadeOutActive(si->defVGroup); - - if (cseq->trackSectionTab == NULL) { - HandleMasterTrack(0); - SetTickDelta(cseq->section, deltaTime); - eventsActive = HandleTrackEvents(0, deltaTime); - notesActive = HandleNotes(); - HandleKeyOffNotes(); - - for (i = 0; i < 2; ++i) { - x = cseq->section[0].time[i].low + cseq->section[0].tickDelta[i].low; - cseq->section[0].time[i].low = x & 0xffff; - x >>= 16; - cseq->section[0].time[i].high += x + cseq->section[0].tickDelta[i].high; - } - } else { - eventsActive = 0; - for (i = 0; i < 16; ++i) { - HandleMasterTrack(i); - SetTickDelta(&cseq->section[i], deltaTime); - eventsActive |= HandleTrackEvents(i, deltaTime); - } - notesActive = HandleNotes(); - HandleKeyOffNotes(); - - for (i = 0; i < 16; ++i) { - for (j = 0; j < 2; ++j) { - x = cseq->section[i].time[j].low + cseq->section[i].tickDelta[j].low; - cseq->section[i].time[j].low = x & 0xffff; - x >>= 16; - cseq->section[i].time[j].high += x + cseq->section[i].tickDelta[j].high; - } - } - } - - if (eventsActive == 0 && notesActive == 0) { - if (si->prev != NULL) { - si->prev->next = nextSi; - } else { - seqActiveRoot = nextSi; - } - if (nextSi != NULL) { - nextSi->prev = si->prev; - } - ResetNotes(si); - si->state = 0; - si->prev = NULL; - if ((si->next = seqFreeRoot) != NULL) { - seqFreeRoot->prev = si; - } - seqFreeRoot = si; - } - si = nextSi; - } -} - -void seqInit() { - u32 i; // r31 - u32 j; // r29 - - seqActiveRoot = NULL; - seqPausedRoot = NULL; - for (i = 0; i < 8; ++i) { - if (i == 0) { - seqFreeRoot = &seqInstance[i]; - seqInstance[i].prev = NULL; - } else { - seqInstance[i - 1].next = &seqInstance[i]; - seqInstance[i].prev = &seqInstance[i - 1]; - } - seqInstance[i].index = i; - seqInstance[i].state = 0; - for (j = 0; j < 0x10; ++j) { - seqMIDIPriority[i][j] = 0xffff; - } - } - seqInstance[i - 1].next = NULL; - ClearNotes(); - InitPublicIds(); -} diff --git a/src/musyx/runtime/seq_api.c b/src/musyx/runtime/seq_api.c deleted file mode 100644 index 3242aa29..00000000 --- a/src/musyx/runtime/seq_api.c +++ /dev/null @@ -1,354 +0,0 @@ -/* - - - - - - - - - - - - - - - -*/ - -#include "musyx/assert.h" -#include "musyx/hardware.h" -#include "musyx/seq.h" -/* - - - - - - - - -*/ -void sndSeqCrossFade(struct SND_CROSSFADE* ci, u32* new_seqId) { - MUSY_ASSERT_MSG(sndActive, "Sound system is not initialized."); - - MUSY_ASSERT_MSG(ci != NULL, "Crossfade information pointer is NULL."); - MUSY_ASSERT_MSG(ci->studio2 < 8, "Studio index is illegal."); - MUSY_ASSERT_MSG(hwIsStudioActive(ci->studio2), "Selected studio is inactive."); - - hwDisableIrq(); - - seqCrossFade(ci, new_seqId, 0); - - hwEnableIrq(); -} - -/* - - - - -*/ -bool sndSeqCrossFadeDone(SND_SEQID* new_seqId) { - if (*new_seqId != -1) { - return (*new_seqId & 0x80000000) == 0; - } - - return TRUE; -} - -u16 sndSeqGetLoopCnt(SND_SEQID seqId) { - MUSY_ASSERT_MSG(sndActive, "Sound system is not initialized."); - - seqId = seqGetPrivateId(seqId); - if (seqId != -1 && (seqId & 0x80000000) == 0) { - return seqInstance[seqId].section[0].loopCnt; - } - - return 0; -} - -/* - - - - - - -*/ -u16 sndSeqGetLoopCntEx(u32 seqId, u8 track) { - MUSY_ASSERT_MSG(sndActive, "Sound system is not initialized."); - - seqId = seqGetPrivateId(seqId); - if (seqId != -1 && (seqId & 0x80000000) == 0) { - if (seqInstance[seqId].trackSectionTab == NULL) { - return seqInstance[seqId].section[0].loopCnt; - } else { - return seqInstance[seqId].section[seqInstance[seqId].trackSectionTab[track]].loopCnt; - } - } - - return 0; -} - -/* - - - - - - -*/ -bool sndSeqGetValid(SND_SEQID seqId) { - MUSY_ASSERT_MSG(sndActive, "Sound system is not initialized."); - - return seqGetPrivateId(seqId) != -1; -} - -/* - - -*/ -void sndSeqPause(SND_SEQID seqId) { - MUSY_ASSERT_MSG(sndActive, "Sound system is not initialized."); - hwDisableIrq(); - seqPause(seqId); - hwEnableIrq(); -} - -/* - - - -*/ -void sndSeqStop(SND_SEQID seqid) { - MUSY_ASSERT_MSG(sndActive, "Sound system is not initialized."); - hwDisableIrq(); - seqStop(seqid); - hwEnableIrq(); -} - -/* - - - -*/ -bool sndSeqLoop(SND_SEQID seqId, bool on) { - unsigned long i; // r30 - MUSY_ASSERT_MSG(sndActive, "Sound system is not initialized."); - - if ((seqId = seqGetPrivateId(seqId)) != -1) { - if ((seqId & 0x80000000) == 0) { - for (i = 0; i < 16; ++i) { - seqInstance[seqId].section[i].loopDisable = !on; - } - - return TRUE; - } - - MUSY_DEBUG("Sequencer ID is temporary.\n"); - } else { - MUSY_DEBUG("Sequencer ID is not valid.\n"); - } - - return FALSE; -} - -/* - - - - - - -*/ -bool sndSeqLoopEx(SND_SEQID seqId, u8 track, bool on) { - u32 i; // r29 - MUSY_ASSERT_MSG(sndActive, "Sound system is not initialized."); - - if ((seqId = seqGetPrivateId(seqId)) != -1) { - if ((seqId & 0x80000000) == 0) { - if (seqInstance[seqId].trackSectionTab == NULL) { - for (i = 0; i < 16; ++i) { - seqInstance[seqId].section[i].loopDisable = !on; - } - return TRUE; - } - - seqInstance[seqId].section[seqInstance[seqId].trackSectionTab[track]].loopDisable = !on; - - return TRUE; - } - - MUSY_DEBUG("Sequencer ID is temporary.\n"); - } else { - MUSY_DEBUG("Sequencer ID is not valid.\n"); - } - - return FALSE; -} - -/* - - - - - - - -*/ -void sndSeqSpeed(u32 seqId, u16 speed) { - MUSY_ASSERT_MSG(sndActive, "Sound system is not initialized."); - hwDisableIrq(); - seqSpeed(seqId, speed); - hwEnableIrq(); -} - -/* - - - -*/ -void sndSeqContinue(SND_SEQID seqId) { - MUSY_ASSERT_MSG(sndActive, "Sound system is not initialized."); - hwDisableIrq(); - seqContinue(seqId); - hwEnableIrq(); -} - -/* - - - -*/ -void sndSeqMute(SND_SEQID seqId, u32 mask1, u32 mask2) { - MUSY_ASSERT_MSG(sndActive, "Sound system is not initialized."); - hwDisableIrq(); - seqMute(seqId, mask1, mask2); - hwEnableIrq(); -} - -/* - - -*/ -void sndSeqVolume(u8 volume, u16 time, u32 seqId, u8 mode) { - MUSY_ASSERT_MSG(sndActive, "Sound system is not initialized."); - hwDisableIrq(); - seqVolume(volume, time, seqId, mode); - hwEnableIrq(); -} - -/* - - - -*/ -u8 sndSeqGetVolGroup(SND_SEQID seqId) { - MUSY_ASSERT_MSG(sndActive, "Sound system is not initialized."); - if ((seqId = seqGetPrivateId(seqId)) != -1) { - return seqInstance[seqId].defVGroup; - } - - MUSY_DEBUG("Volume group could not be received from sequencer.\n"); - return 0; -} - -/* - - -*/ -bool sndSeqAssignVolGroup2Track(SND_SEQID seqId, u8 track, u8 vGroup) { - MUSY_ASSERT_MSG(sndActive, "Sound system is not initialized."); - - if ((seqId = seqGetPrivateId(seqId)) != -1) { - seqInstance[seqId].trackVolGroup[track] = vGroup; - synthSetMusicVolumeType(vGroup, 2); - return TRUE; - } - - MUSY_DEBUG("Volume group could not be assigned to track.\n"); - return FALSE; -} - -/* - - - - - -*/ -u8 sndSeqGetMidiCtrl(SND_SEQID seqId, u8 channel, u8 ctrl) { - u8 value; // r31 - MUSY_ASSERT_MSG(sndActive, "Sound system is not initialized."); - - value = 0; - hwDisableIrq(); - - if ((seqId = seqGetPrivateId(seqId)) != -1) { - value = inpGetMidiCtrl(ctrl, channel, seqId) >> 7; - } - - hwEnableIrq(); - return value; -} - -/* - - -*/ -u16 sndSeqGetMidiCtrl14(SND_SEQID seqId, u8 channel, u8 ctrl) { - u16 value; // r31 - MUSY_ASSERT_MSG(sndActive, "Sound system is not initialized."); - - value = 0; - hwDisableIrq(); - - if ((seqId = seqGetPrivateId(seqId)) != -1) { - value = inpGetMidiCtrl(ctrl, channel, seqId); - } - - hwEnableIrq(); - return value; -} - -/* - -*/ -bool sndSeqSetMidiCtrl(SND_SEQID seqId, u8 channel, u8 ctrl, u8 value) { - unsigned long ret = FALSE; // r30 - MUSY_ASSERT_MSG(sndActive, "Sound system is not initialized."); - hwDisableIrq(); - if ((seqId = seqGetPrivateId(seqId)) != -1) { - inpSetMidiCtrl(ctrl, channel, seqId, value); - ret = TRUE; - } else { - MUSY_DEBUG("Sequenzer ID is not valid.\n\n"); - } - hwEnableIrq(); - - return ret; -} - -/* - - - - -*/ -bool sndSeqSetMidiCtrl14(SND_SEQID seqId, u8 channel, u8 ctrl, u16 value) { - bool ret = FALSE; // r30 - MUSY_ASSERT_MSG(sndActive, "Sound system is not initialized."); - hwDisableIrq(); - if ((seqId = seqGetPrivateId(seqId)) != -1) { - inpSetMidiCtrl14(ctrl, channel, seqId, value); - ret = TRUE; - } else { - MUSY_DEBUG("Sequenzer ID is not valid.\n\n"); - } - hwEnableIrq(); - - return ret; -} - -u16 seqGetMIDIPriority(u8 set, u8 channel) { return seqMIDIPriority[set][channel]; } diff --git a/src/musyx/runtime/snd3d.c b/src/musyx/runtime/snd3d.c deleted file mode 100644 index 534780d8..00000000 --- a/src/musyx/runtime/snd3d.c +++ /dev/null @@ -1,1185 +0,0 @@ -#include "musyx/musyx.h" - -#include "musyx/hardware.h" -#include "musyx/sal.h" -#include "musyx/synth.h" - -static u8 s3dCallCnt; -static SND_EMITTER* s3dEmitterRoot; -static SND_LISTENER* s3dListenerRoot; -static SND_ROOM* s3dRoomRoot; -static SND_DOOR* s3dDoorRoot; -static u32 snd_used_studios; -static u8 snd_base_studio; -static u8 snd_max_studios; -static u8 s3dUseMaxVoices; - -static void UpdateRoomDistances() { - SND_ROOM* r; // r30 - SND_LISTENER* li; // r31 - f32 distance; // r63 - u32 n; // r29 - SND_FVECTOR d; // r1+0x8 - - for (n = 0, li = s3dListenerRoot; li != NULL; li = li->next, ++n) - ; - - if (n != 0) { - for (r = s3dRoomRoot; r != NULL; r = r->next) { - if (r->studio != 0xFF) { - distance = 0.f; - for (li = s3dListenerRoot; li != NULL; li = li->next) { - d.x = r->pos.x - li->pos.x; - d.y = r->pos.y - li->pos.y; - d.z = r->pos.z - li->pos.z; - distance += d.x * d.x + d.y * d.y + d.z * d.z; - } - - r->distance = distance / n; - } - } - } -} - -static void CheckRoomStatus() { - SND_LISTENER* li; // r30 - SND_EMITTER* em; // r28 - SND_ROOM* r; // r27 - SND_ROOM* max_room; // r29 - SND_ROOM* room; // r31 - SND_FVECTOR d; // r1+0x8 - f32 distance; // r63 - f32 maxDis; // r62 - u32 li_num; // r25 - u32 i; // r26 - u32 mask; // r23 - u8 has_listener; // r24 - - UpdateRoomDistances(); - - for (li_num = 0, li = s3dListenerRoot; li != NULL; li = li->next, ++li_num) - ; - - if (li_num != 0) { - for (room = s3dRoomRoot; room != NULL; room = room->next) { - if (room->studio == 0xff) { - distance = 0.f; - for (li = s3dListenerRoot; li != NULL; li = li->next) { - d.x = room->pos.x - li->pos.x; - d.y = room->pos.y - li->pos.y; - d.z = room->pos.z - li->pos.z; - distance += d.x * d.x + d.y * d.y + d.z * d.z; - } - - distance = distance / li_num; - - has_listener = FALSE; - for (li = s3dListenerRoot; li != NULL; li = li->next) { - if (li->room == room) { - has_listener = TRUE; - break; - } - } - - mask = ~(-1 << snd_max_studios); - - if (mask != (snd_used_studios & mask)) { - for (i = 0; i < snd_max_studios; ++i) { - if (!(snd_used_studios & (1 << i))) { - break; - } - } - - snd_used_studios |= (1 << i); - room->studio = i + snd_base_studio; - } else { - maxDis = -1.f; - - for (r = s3dRoomRoot; r != NULL; r = r->next) { - if (r->studio != 0xFF && maxDis < r->distance) { - maxDis = r->distance; - max_room = r; - } - } - - if (has_listener || maxDis > distance) { - - for (em = s3dEmitterRoot; em != NULL; em = em->next) { - if (em->room == max_room) { - synthSendKeyOff(em->vid); - em->flags |= 0x80000; - em->vid = -1; - } - } - - if (max_room->deActivateReverb != NULL) { - max_room->deActivateReverb(max_room->studio); - } - - synthDeactivateStudio(max_room->studio); - room->studio = max_room->studio; - max_room->studio = 0xff; - max_room->flags = 0; - } else { - continue; - } - } - room->distance = distance; - room->curMVol = has_listener ? 0x7f0000 : 0; - - if (room->curMVol * 1.2014794e-07f >= 0.5) { - synthActivateStudio(room->studio, TRUE, SND_STUDIO_TYPE_STD); - } else { - synthActivateStudio(room->studio, FALSE, SND_STUDIO_TYPE_STD); - } - - if (room->activateReverb != NULL) { - room->activateReverb(room->studio, room->user); - } - } else { - if (room->flags & 0x80000000) { - room->curMVol += 0x40000; - if (room->curMVol >= 0x7F0000) { - room->curMVol = 0x7F0000; - room->flags &= ~0x80000000; - } - - if (room->curMVol * 1.2014794e-07f >= 0.5) { - synthActivateStudio(room->studio, TRUE, SND_STUDIO_TYPE_STD); - } else { - synthActivateStudio(room->studio, FALSE, SND_STUDIO_TYPE_STD); - } - } - - if ((room->flags & 0x40000000) != 0) { - room->curMVol = room->curMVol - 0x40000; - if ((int)room->curMVol >= 0) { - room->curMVol = 0; - room->flags &= ~0x40000000; - } - if (room->curMVol * 1.2014794e-07f >= 0.5) { - synthActivateStudio(room->studio, TRUE, SND_STUDIO_TYPE_STD); - } else { - synthActivateStudio(room->studio, FALSE, SND_STUDIO_TYPE_STD); - } - } - } - } - } -} - -bool sndAddRoom(SND_ROOM* room, SND_FVECTOR* pos, void (*activateReverb)(u8 studio, void* user), - void (*deActivateReverb)(u8 studio)) { - if (sndActive) { - hwDisableIrq(); - - if ((room->next = s3dRoomRoot) != NULL) { - room->next->prev = room; - } - - room->prev = NULL; - s3dRoomRoot = room; - room->flags = 0; - room->studio = 0xff; - room->activateReverb = activateReverb; - room->deActivateReverb = deActivateReverb; - room->pos = *pos; - - hwEnableIrq(); - return TRUE; - } - - return FALSE; -} - -bool sndRemoveRoom(SND_ROOM* room) { - if (sndActive) { - hwDisableIrq(); - if (room->prev != NULL) { - room->prev->next = room->next; - } else { - s3dRoomRoot = room->next; - } - - if (room->next != NULL) { - room->next->prev = room->prev; - } - - if (room->studio != 0xFF) { - snd_used_studios &= ~(1 << room->studio - snd_base_studio); - - if (room->deActivateReverb) { - room->deActivateReverb(room->studio); - } - - synthDeactivateStudio(room->studio); - } - - room->flags = 0; - hwEnableIrq(); - - return TRUE; - } - - return FALSE; -} - -bool sndUpdateRoom(SND_ROOM* room, SND_FVECTOR* pos) { - - if (sndActive) { - hwDisableIrq(); - room->pos = *pos; - hwEnableIrq(); - return TRUE; - } - - return FALSE; -} - -static void AddListener2Room(SND_ROOM* room) { - if (room->flags & 0x80000000) { - return; - } - - if (room->curMVol != 0) { - return; - } - - room->flags |= 0x80000000; -} - -static void RemoveListenerFromRoom(SND_ROOM* room) { - u32 n; // r30 - SND_LISTENER* li; // r31 - - for (n = 0, li = s3dListenerRoot; li != NULL; li = li->next) { - if (li->room == room) { - ++n; - } - } - - if (n == 1) { - room->flags &= ~0x80000000; - room->flags |= 0x40000000; - } -} - -static void CalcDoorParameters(SND_DOOR* door) { - f32 f; // r1+0xC - f32 v; // r63 - v = door->open; - f = (1.f - door->open) * door->dampen; - door->input.volA = door->fxVol * v; - door->input.volB = 0; - door->input.vol = v * 127.f; -} - -static void CheckDoorStatus() { - SND_DOOR* door; // r31 - - for (door = s3dDoorRoot; door != NULL; door = door->next) { - if (!(door->flags & 0x80000000)) { - if (door->a->studio != 0xFF) { - if (door->b->studio != 0xFF) { - CalcDoorParameters(door); - if (door->flags & 1) { - door->input.srcStudio = door->b->studio; - synthAddStudioInput(door->a->studio, &door->input); - } else { - door->input.srcStudio = door->a->studio; - synthAddStudioInput(door->b->studio, &door->input); - } - - door->flags |= 0x80000000; - } - } - } else if (door->a->studio == 0xFF || door->b->studio == 0xFF) { - if ((door->a->studio != 0xFF && door->a->studio == door->destStudio) || - (door->b->studio != 0xFF && door->b->studio == door->destStudio)) { - synthRemoveStudioInput(door->destStudio, &door->input); - } - - door->flags &= ~0x80000000; - } else { - CalcDoorParameters(door); - } - } -} - -bool sndAddDoor(SND_DOOR* door, SND_ROOM* a, SND_ROOM* b, SND_FVECTOR* pos, f32 dampen, f32 open, - unsigned char fxVol, s16 filterCoef[4], u32 flags) { - - hwDisableIrq(); - - if ((door->next = s3dDoorRoot) != NULL) { - door->next->prev = door; - } - - door->prev = NULL; - s3dDoorRoot = door; - door->pos = *pos; - door->open = open; - door->dampen = dampen; - door->fxVol = fxVol; - door->a = a; - door->b = b; - door->flags = flags; - hwEnableIrq(); - return 1; -} - -bool sndRemoveDoor(SND_DOOR* door) { - hwDisableIrq(); - if (door->prev != NULL) { - door->prev->next = door->next; - } else { - s3dDoorRoot = door->next; - } - if (door->next != NULL) { - door->next->prev = door->prev; - } - hwEnableIrq(); - return 1; -} - -static void CalcEmitter(struct SND_EMITTER* em, f32* vol, f32* doppler, f32* xPan, f32* yPan, - f32* zPan) { - SND_LISTENER* li; // r31 - SND_FVECTOR d; // r1+0x44 - SND_FVECTOR v; // r1+0x38 - SND_FVECTOR p; // r1+0x2C - f32 relspeed; // r60 - f32 distance; // r61 - f32 new_distance; // r59 - f32 ft; // r63 - f32 vd; // r62 - SND_FVECTOR pan; // r1+0x20 - u32 n; // r29 - ft = 1.f / 60.f; - *vol = 0.f; - *doppler = 1.f; - - pan.x = pan.y = pan.z = 0.f; - - for (n = 0, li = s3dListenerRoot; li != NULL; li = li->next, ++n) { - d.x = em->pos.x - (li->pos.x + li->heading.x * li->volPosOff); - d.y = em->pos.y - (li->pos.y + li->heading.y * li->volPosOff); - d.z = em->pos.z - (li->pos.z + li->heading.z * li->volPosOff); - - distance = sqrtf(d.x * d.x + d.y * d.y + d.z * d.z); - - if (em->maxDis >= distance) { - vd = distance / em->maxDis; - - if (em->volPush >= 0.f) { - *vol += - li->vol * (em->minVol + (em->maxVol - em->minVol) * - (1.f - ((1.f - em->volPush) * vd + em->volPush * vd * vd))); - } else { - *vol += - li->vol * (em->minVol + (em->maxVol - em->minVol) * - (1.f - ((em->volPush + 1.f) * vd - - em->volPush * (1.f - (1.f - vd) * (1.f - vd))))); - } - - if (!(em->flags & 0x80000)) { - if ((em->flags & 0x8) || (li->flags & 1)) { - v.x = li->dir.x - em->dir.x; - v.y = li->dir.y - em->dir.y; - v.z = li->dir.z - em->dir.z; - relspeed = sqrtf(v.x * v.x + v.y * v.y + v.z * v.z); - - if (relspeed > 0.f) { - - d.x = (em->pos.x + em->dir.x * ft) - (li->pos.x + li->dir.x * ft); - d.y = (em->pos.y + em->dir.y * ft) - (li->pos.y + li->dir.y * ft); - d.z = (em->pos.z + em->dir.z * ft) - (li->pos.z + li->dir.z * ft); - - new_distance = sqrtf(d.x * d.x + d.y * d.y + d.z * d.z); - - if (new_distance < distance) { - *doppler = li->soundSpeed / (li->soundSpeed - relspeed); - } else { - *doppler = li->soundSpeed / (li->soundSpeed + relspeed); - } - } - } - - if (distance != 0.f) { - salApplyMatrix(&li->mat, &em->pos, &p); - - if (p.z <= 0.f) { - pan.z += -li->surroundDisFront < p.z ? -p.z / li->surroundDisFront : 1.f; - } else { - pan.z += li->surroundDisBack > p.z ? -p.z / li->surroundDisBack : -1.f; - } - - if (p.x != 0.f || p.y != 0.f || p.z != 0.f) { - salNormalizeVector(&p); - } - - pan.x += p.x; - pan.y -= p.y; - } - } - } - } - - if (n != 0) { - *xPan = pan.x / n; - *yPan = pan.y / n; - *zPan = pan.z / n; - } -} - -static u8 clip127(u8 v) { - if (v <= 0x7f) { - return v; - } - return 0x7f; -} - -static u16 clip3FFF(u32 v) { - if (v > 0x3fff) { - return 0x3fff; - } - return v; -} - -static void SetFXParameters(SND_EMITTER* const em, f32 vol, f32 xPan, f32 yPan, f32 zPan, - f32 doppler) { - SND_VOICEID vid; // r30 - u8 i; // r28 - SND_PARAMETER* pPtr; // r31 - - vid = em->vid; - if ((em->flags & 0x100000) != 0) { - synthFXSetCtrl(vid, 7, clip127((em->fade * vol) * 127.f)); - } else { - synthFXSetCtrl(vid, 7, clip127(vol * 127.f)); - } - - synthFXSetCtrl(vid, 10, clip127((1.f + xPan) * 64.f)); - synthFXSetCtrl(vid, 131, clip127((1.f - zPan) * 64.f)); - synthFXSetCtrl14(vid, 132, clip3FFF(doppler * 8192.f)); - - if (em->paraInfo != NULL) { - pPtr = em->paraInfo->paraArray; - for (i = 0; i < em->paraInfo->numPara; ++pPtr, ++i) { - if (pPtr->ctrl < 0x40 || pPtr->ctrl == 0x80 || pPtr->ctrl == 0x84) { - synthFXSetCtrl14(vid, pPtr->ctrl, (pPtr->paraData).value14); - } else { - synthFXSetCtrl(vid, pPtr->ctrl, (pPtr->paraData).value7); - } - } - } -} - -static void EmitterShutdown(SND_EMITTER* em) { - if (em->next != NULL) { - em->next->prev = em->prev; - } - - if (em->prev != NULL) { - em->prev->next = em->next; - } else { - s3dEmitterRoot = em->next; - } - - em->flags &= 0xFFFF; - if (em->vid != -1) { - synthSendKeyOff(em->vid); - } -} - -bool sndUpdateEmitter(SND_EMITTER* em, SND_FVECTOR* pos, SND_FVECTOR* dir, u8 maxVol, - SND_ROOM* room) { - u32 id; // r29 - - if (sndActive) { - hwDisableIrq(); - - em->pos = *pos; - em->dir = *dir; - em->maxVol = maxVol / 127.f; - if (em->minVol > em->maxVol) { - em->minVol = em->maxVol; - } - - if (em->room != room) { - if (em->vid != -1) { - if (room->studio != 0xFF) { - if ((id = vidGetInternalId(em->vid)) != -1) { - hwChangeStudio(id & 0xFF, room->studio); - } - } else { - synthSendKeyOff(em->vid); - em->flags |= 0x80000; - em->vid = -1; - } - } - - em->room = room; - } - hwEnableIrq(); - return TRUE; - } - - return FALSE; -} - -bool sndCheckEmitter(SND_EMITTER* em) { - if (sndActive) { - return (em->flags & 0x10000) != 0; - } - return FALSE; -} - -static SND_VOICEID AddEmitter(SND_EMITTER* em_buffer, SND_FVECTOR* pos, SND_FVECTOR* dir, - f32 maxDis, f32 comp, u32 flags, u16 fxid, u32 groupid, u8 maxVol, - u8 minVol, SND_ROOM* room, SND_PARAMETER_INFO* para, u8 studio) { - static SND_EMITTER tmp_em; - SND_EMITTER* em; // r31 - f32 xPan; // r1+0x3C - f32 yPan; // r1+0x38 - f32 zPan; // r1+0x34 - f32 cvol; // r1+0x30 - f32 pitch; // r1+0x2C - - hwDisableIrq(); - em = em_buffer == NULL ? &tmp_em : em_buffer; - - em->flags = flags; - em->pos = *pos; - em->dir = *dir; - em->maxDis = maxDis; - em->fxid = fxid; - em->maxVol = maxVol * (1.f / 127.f); - em->minVol = minVol * (1.f / 127.f); - em->volPush = comp; - em->group = groupid; - em->room = room; - em->studio = studio; - - if (em_buffer == NULL) { - - if (em->room != NULL && em->room->studio == 0xFF) { - hwEnableIrq(); - return -1; - } - - CalcEmitter(em, &cvol, &pitch, &xPan, &yPan, &zPan); - if (cvol == 0.f) { - hwEnableIrq(); - return -1; - } else { - em->vid = synthFXStart(em->fxid, 127, 64, em->room != NULL ? em->room->studio : em->studio, - (em->flags & 0x10) != 0); - if (em->vid == -1) { - hwEnableIrq(); - return -1; - } - SetFXParameters(em, cvol, xPan, yPan, zPan, pitch); - hwEnableIrq(); - return em->vid; - } - } else { - if ((em->next = s3dEmitterRoot) != NULL) { - s3dEmitterRoot->prev = em; - } - - em->prev = NULL; - s3dEmitterRoot = em; - em->paraInfo = para; - em->vid = -1; - em->VolLevelCnt = 0; - em->flags |= 0x30000; - em->maxVoices = synthFXGetMaxVoices(em->fxid); - } - - hwEnableIrq(); - return -1; -} - -SND_VOICEID sndAddEmitter(SND_EMITTER* em_buffer, SND_FVECTOR* pos, SND_FVECTOR* dir, f32 maxDis, - f32 comp, u32 flags, SND_FXID fxid, u8 maxVol, u8 minVol, - SND_ROOM* room) { - if (sndActive) { - return AddEmitter(em_buffer, pos, dir, maxDis, comp, flags, fxid, fxid | 0x80000000, maxVol, - minVol, room, NULL, 0); - } - - return -1; -} - -SND_VOICEID sndAddEmitterEx(SND_EMITTER* em_buffer, SND_FVECTOR* pos, SND_FVECTOR* dir, f32 maxDis, - f32 comp, u32 flags, SND_FXID fxid, unsigned short groupid, u8 maxVol, - u8 minVol, SND_ROOM* room) { - if (sndActive) { - return AddEmitter(em_buffer, pos, dir, maxDis, comp, flags, fxid, groupid, maxVol, minVol, room, - NULL, 0); - } - - return -1; -} - -SND_VOICEID sndAddEmitterPara(SND_EMITTER* em_buffer, struct SND_FVECTOR* pos, SND_FVECTOR* dir, - f32 maxDis, f32 comp, u32 flags, SND_FXID fxid, u8 maxVol, u8 minVol, - SND_ROOM* room, struct SND_PARAMETER_INFO* para) { - if (sndActive) { - return AddEmitter(em_buffer, pos, dir, maxDis, comp, flags, fxid, fxid | 0x80000000, maxVol, - minVol, room, para, 0); - } - return -1; -} - -SND_VOICEID sndAddEmitterParaEx(SND_EMITTER* em_buffer, SND_FVECTOR* pos, SND_FVECTOR* dir, - f32 maxDis, f32 comp, u32 flags, SND_FXID fxid, SND_GROUPID groupid, - u8 maxVol, u8 minVol, SND_ROOM* room, SND_PARAMETER_INFO* para) { - if (sndActive) { - return AddEmitter(em_buffer, pos, dir, maxDis, comp, flags, fxid, groupid, maxVol, minVol, room, - para, 0); - } - - return -1; -} - -SND_VOICEID sndAddEmitter2Studio(SND_EMITTER* em_buffer, SND_FVECTOR* pos, SND_FVECTOR* dir, - f32 maxDis, f32 comp, u32 flags, SND_FXID fxid, u8 maxVol, - u8 minVol, u8 studio) { - if (sndActive) { - return AddEmitter(em_buffer, pos, dir, maxDis, comp, flags, fxid, fxid | 0x80000000, maxVol, - minVol, NULL, NULL, studio); - } - return -1; -} - -SND_VOICEID sndAddEmitter2StudioEx(SND_EMITTER* em_buffer, SND_FVECTOR* pos, SND_FVECTOR* dir, - f32 maxDis, f32 comp, u32 flags, SND_FXID fxid, u16 groupid, - u8 maxVol, u8 minVol, u8 studio) { - if (sndActive) { - return AddEmitter(em_buffer, pos, dir, maxDis, comp, flags, fxid, groupid, maxVol, minVol, NULL, - NULL, studio); - } - return -1; -} - -SND_VOICEID sndAddEmitter2StudioPara(SND_EMITTER* em_buffer, SND_FVECTOR* pos, SND_FVECTOR* dir, - f32 maxDis, f32 comp, u32 flags, SND_FXID fxid, u8 maxVol, - u8 minVol, u8 studio, SND_PARAMETER_INFO* para) { - if (sndActive) { - return AddEmitter(em_buffer, pos, dir, maxDis, comp, flags, fxid, fxid | 0x80000000, maxVol, - minVol, NULL, para, studio); - } - return -1; -} - -SND_VOICEID sndAddEmitter2StudioParaEx(SND_EMITTER* em_buffer, SND_FVECTOR* pos, SND_FVECTOR* dir, - f32 maxDis, f32 comp, u32 flags, SND_FXID fxid, u16 groupid, - u8 maxVol, u8 minVol, u8 studio, SND_PARAMETER_INFO* para) { - if (sndActive) { - return AddEmitter(em_buffer, pos, dir, maxDis, comp, flags, fxid, groupid, maxVol, minVol, NULL, - para, studio); - } - return -1; -} - -bool sndRemoveEmitter(SND_EMITTER* em) { - if (sndActive) { - hwDisableIrq(); - if (em->flags & 0x10000) { - EmitterShutdown(em); - } - - hwEnableIrq(); - return TRUE; - } - - return FALSE; -} - -SND_VOICEID sndEmitterVoiceID(SND_EMITTER* em) { - SND_VOICEID ret; // r31 - - ret = 0xffffffff; - if (sndActive != FALSE) { - hwDisableIrq(); - if ((em->flags & 0x10000) != 0) { - ret = em->vid; - } - hwEnableIrq(); - } - return ret; -} - -void s3dKillAllEmitter() { - struct SND_EMITTER* em; // r31 - struct SND_EMITTER* nem; // r30 - - em = s3dEmitterRoot; - while (em != NULL) { - nem = em->next; - sndRemoveEmitter(em); - em = nem; - } -} - -void s3dKillEmitterByFXID(FX_TAB* fxTab, unsigned long num) { - struct SND_EMITTER* em; // r31 - struct SND_EMITTER* nem; // r29 - unsigned long j; // r30 - - for (em = s3dEmitterRoot; em != NULL; em = nem) { - nem = em->next; - for (j = 0; j < num; ++j) { - if (em->fxid == fxTab[j].id) { - sndRemoveEmitter(em); - break; - } - } - } -} - -static void MakeListenerMatrix(SND_LISTENER* li) { - struct SND_FMATRIX mat; // r1+0xC - salCrossProduct(&li->right, &li->heading, &li->up); - mat.m[0][0] = li->right.x; - mat.m[1][0] = li->right.y; - mat.m[2][0] = li->right.z; - mat.m[0][1] = li->up.x; - mat.m[1][1] = li->up.y; - mat.m[2][1] = li->up.z; - mat.m[0][2] = -li->heading.x; - mat.m[1][2] = -li->heading.y; - mat.m[2][2] = -li->heading.z; - mat.t[0] = li->pos.x; - mat.t[1] = li->pos.y; - mat.t[2] = li->pos.z; - salInvertMatrix(&li->mat, &mat); -} - -bool sndUpdateListener(SND_LISTENER* li, SND_FVECTOR* pos, SND_FVECTOR* dir, SND_FVECTOR* heading, - SND_FVECTOR* up, u8 vol, SND_ROOM* room) { - if (sndActive) { - hwDisableIrq(); - li->pos = *pos; - li->dir = *dir; - li->heading = *heading; - li->up = *up; - - MakeListenerMatrix(li); - li->vol = vol / 127.f; - - if (room != li->room) { - if (li->room != NULL) { - RemoveListenerFromRoom(li->room); - } - - li->room = room; - if (room != NULL) { - AddListener2Room(li->room); - } - } - - hwEnableIrq(); - return TRUE; - } - - return FALSE; -} - -bool sndAddListenerEx(SND_LISTENER* li, SND_FVECTOR* pos, SND_FVECTOR* dir, SND_FVECTOR* heading, - SND_FVECTOR* up, f32 front_sur, f32 back_sur, f32 soundSpeed, - f32 volPosOffset, u32 flags, u8 vol, SND_ROOM* room) { - - if (sndActive) { - hwDisableIrq(); - if ((li->next = s3dListenerRoot) != NULL) { - s3dListenerRoot->prev = li; - } - - li->prev = NULL; - s3dListenerRoot = li; - li->pos = *pos; - li->dir = *dir; - li->heading = *heading; - li->up = *up; - li->surroundDisFront = front_sur; - li->surroundDisBack = back_sur; - li->soundSpeed = soundSpeed; - li->volPosOff = volPosOffset; - MakeListenerMatrix(li); - li->flags = flags; - li->vol = vol / 127.f; - li->room = room; - if (room != NULL) { - AddListener2Room(room); - } - hwEnableIrq(); - return TRUE; - } - - return FALSE; -} - -bool sndAddListener(SND_LISTENER* li, SND_FVECTOR* pos, SND_FVECTOR* dir, SND_FVECTOR* heading, - SND_FVECTOR* up, f32 front_sur, f32 back_sur, f32 soundSpeed, u32 flags, u8 vol, - SND_ROOM* room) { - return sndAddListenerEx(li, pos, dir, heading, up, front_sur, back_sur, soundSpeed, 0.f, flags, - vol, room); -} - -bool sndRemoveListener(SND_LISTENER* li) { - if (sndActive) { - - hwDisableIrq(); - - if (li->room != NULL) { - RemoveListenerFromRoom(li->room); - } - - if (li->next != NULL) { - li->next->prev = li->prev; - } - - if (li->prev != NULL) { - li->prev->next = li->next; - } else { - s3dListenerRoot = li->next; - } - hwEnableIrq(); - return TRUE; - } - - return FALSE; -} - -typedef struct START_LIST { - // total size: 0x1C - struct START_LIST* next; // offset 0x0, size 0x4 - f32 vol; // offset 0x4, size 0x4 - f32 xPan; // offset 0x8, size 0x4 - f32 yPan; // offset 0xC, size 0x4 - f32 zPan; // offset 0x10, size 0x4 - f32 pitch; // offset 0x14, size 0x4 - SND_EMITTER* em; // offset 0x18, size 0x4 -} START_LIST; - -typedef struct RUN_LIST { - // total size: 0xC - struct RUN_LIST* next; // offset 0x0, size 0x4 - f32 vol; // offset 0x4, size 0x4 - SND_EMITTER* em; // offset 0x8, size 0x4 -} RUN_LIST; - -typedef struct START_GROUP { - // total size: 0x10 - unsigned long id; // offset 0x0, size 0x4 - struct START_LIST* list; // offset 0x4, size 0x4 - struct RUN_LIST* running; // offset 0x8, size 0x4 - unsigned short numRunning; // offset 0xC, size 0x2 -} START_GROUP; - -static START_GROUP startGroup[64]; // size: 0x400 -static u8 startGroupNum; // size: 0x1 -static START_LIST startListNum[64]; // size: 0x700 -static u8 startListNumnum; // size: 0x1 -static RUN_LIST runList[64]; // size: 0x300 -static u8 runListNum; // size: 0x1 - -void ClearStartList() { - startGroupNum = 0; - startListNumnum = 0; - runListNum = 0; -} - -void AddRunningEmitter(SND_EMITTER* em, f32 vol) { - long i; // r30 - RUN_LIST* rl; // r29 - RUN_LIST* lrl; // r28 - - for (i = 0; i < startGroupNum; ++i) { - if (em->group == startGroup[i].id) { - break; - } - } - - if (i == startGroupNum) { - startGroup[i].list = NULL; - startGroup[i].running = NULL; - startGroup[i].numRunning = 0; - startGroup[i].id = em->group; - ++startGroupNum; - } - - ++startGroup[i].numRunning; - - lrl = NULL; - for (rl = startGroup[i].running; rl != NULL; rl = rl->next) { - if (rl->vol > vol) { - break; - } - lrl = rl; - } - - if (lrl == NULL) { - startGroup[i].running = &runList[runListNum]; - } else { - lrl->next = &runList[runListNum]; - } - - runList[runListNum].next = rl; - runList[runListNum].em = em; - runList[runListNum++].vol = vol; -} - -bool AddStartingEmitter(SND_EMITTER* em, f32 vol, f32 xPan, f32 yPan, f32 zPan, f32 pitch) { - long i; // r30 - START_LIST* sl; // r29 - - for (i = 0; i < startGroupNum; ++i) { - if (em->group == startGroup[i].id) { - break; - } - } - - if (i == startGroupNum) { - if (startGroupNum == 64) { - return FALSE; - } - - startGroup[i].list = NULL; - startGroup[i].running = NULL; - startGroup[i].numRunning = 0; - startGroup[i].id = em->group; - ++startGroupNum; - } - - if (startListNumnum == 64) { - return FALSE; - } - - sl = startGroup[i].list; - - if (sl != NULL) { - for (; sl->next != NULL; sl = sl->next) { - if (sl->vol < vol) { - break; - } - } - startListNum[startListNumnum].next = sl->next; - sl->next = &startListNum[startListNumnum]; - } else { - startListNum[startListNumnum].next = startGroup[i].list; - startGroup[i].list = &startListNum[startListNumnum]; - } - - startListNum[startListNumnum].em = em; - startListNum[startListNumnum].pitch = pitch; - startListNum[startListNumnum].xPan = xPan; - startListNum[startListNumnum].yPan = yPan; - startListNum[startListNumnum].zPan = zPan; - startListNum[startListNumnum++].vol = vol; - - return TRUE; -} - -void StartContinousEmitters() { - long i; // r30 - START_LIST* sl; // r29 - SND_EMITTER* em; // r31 - f32 dv; // r63 - - for (i = 0; i < startGroupNum; ++i) { - - for (sl = startGroup[i].list; sl != NULL; sl = sl->next) { - if ((startGroup[i].running != NULL) && - !(((s3dUseMaxVoices != '\0' && ((startGroup[i].id & 0x80000000) != 0)) && - (startGroup[i].numRunning < startGroup[i].list->em->maxVoices)))) { - - dv = sl->vol - (startGroup[i].running)->vol; - if (dv <= 0.08f) { - continue; - } else if (dv <= 0.15f) { - if (++sl->em->VolLevelCnt < 20) { - continue; - } - } else { - sl->em->VolLevelCnt = 0; - } - } - em = sl->em; - - if (em->room != NULL && em->room->studio == 0xFF) { - goto set_flags; - } - if ((em->vid = - synthFXStart(em->fxid, 127, 64, em->room != NULL ? em->room->studio : em->studio, - (em->flags & 0x10) != 0)) == -1) { - set_flags: - if (!(em->flags & 0x2)) { - em->flags |= 0x40000; - em->flags &= ~0x20000; - } - } else { - if (!(em->flags & 0x20)) { - em->flags |= 0x100000; - em->fade = 0.f; - } else { - em->fade = 1.f; - } - SetFXParameters(em, sl->vol, sl->xPan, sl->yPan, sl->zPan, sl->pitch); - em->flags &= ~0x20000; - ++startGroup[i].numRunning; - if (startGroup[i].running != NULL) { - startGroup[i].running = startGroup[i].running->next; - } - } - } - } -} - -void s3dHandle() { - SND_EMITTER* em; // r31 - SND_EMITTER* nem; // r30 - f32 vol; // r1+0x18 - f32 xPan; // r1+0x14 - f32 yPan; // r1+0x10 - f32 zPan; // r1+0xC - f32 pitch; // r1+0x8 - - if (s3dCallCnt != 0) { - --s3dCallCnt; - return; - } - s3dCallCnt = 3; - ClearStartList(); - em = s3dEmitterRoot; - for (; em != NULL; em = nem) { - nem = em->next; - if ((em->flags & 0x40000) != 0) { - EmitterShutdown(em); - continue; - } - if ((em->flags & 0x20001) != 0) { - CalcEmitter(em, &vol, &pitch, &xPan, &yPan, &zPan); - } - - if (!(em->flags & 0x80000)) { - if (em->flags & 0x20000) { - if (vol == 0.f && em->flags & 0x4) { - em->flags |= 0x80000; - em->flags &= ~0x20000; - goto found_emitter; - } else if (vol == 0.f && em->flags & 0x40) { - EmitterShutdown(em); - continue; - } - - if (em->flags & 1) { - if (AddStartingEmitter(em, vol, xPan, yPan, zPan, pitch)) { - continue; - } - } else if (em->room == NULL || em->room->studio != 0xFF) { - if ((em->vid = - synthFXStart(em->fxid, 127, 64, em->room != NULL ? em->room->studio : em->studio, - (em->flags & 0x10) != 0)) == -1) { - - derp: - if (!(em->flags & 2)) { - em->flags |= 0x40000; - em->flags &= ~0x20000; - } else { - continue; - } - } - } else { - goto derp; - } - } else if ((em->vid = sndFXCheck(em->vid)) == -1) { - if ((em->flags & 2)) { - em->flags |= 0x20000; - } else { - em->flags |= 0x40000; - } - } - - found_emitter: - if (em->vid != -1) { - if ((em->flags & 1) != 0) { - AddRunningEmitter(em, vol); - } - if ((vol == 0.f) && ((em->flags & 4) != 0)) { - synthSendKeyOff(em->vid); - em->vid = 0xffffffff; - if ((em->flags & 2)) { - em->flags |= 0x80000; - } else { - em->flags |= 0x40000; - } - } else { - SetFXParameters(em, vol, xPan, yPan, zPan, pitch); - } - } - if ((em->flags & 0x100000) != 0) { - em->fade += .3f; - if (em->fade >= 1.f) { - em->flags &= ~0x100000; - } - } - } else if ((em->room == NULL || (em->room != NULL && em->room->studio != 0xff)) && vol != 0.f) { - em->flags &= ~0x80000; - em->flags |= 0x20000; - } - } - StartContinousEmitters(); - CheckRoomStatus(); - CheckDoorStatus(); -} - -void sndSetup3DStudios(unsigned char first, unsigned char num) { - snd_base_studio = first; - snd_max_studios = num; -} - -void sndGet3DParameters(SND_3DINFO* info, SND_FVECTOR* pos, SND_FVECTOR* dir, f32 maxDis, f32 comp, - u8 maxVol, u8 minVol, SND_ROOM* room) { - f32 xPan; // r1+0x34 - f32 yPan; // r1+0x30 - f32 zPan; // r1+0x2C - f32 cvol; // r1+0x28 - f32 pitch; // r1+0x24 - static SND_EMITTER em; - hwDisableIrq(); - - em.flags = 8; - em.pos = *pos; - em.dir = *dir; - em.maxDis = maxDis; - em.maxVol = maxVol / 127.f; - em.minVol = minVol / 127.f; - em.volPush = comp; - em.room = room; - - CalcEmitter(&em, &cvol, &pitch, &xPan, &yPan, &zPan); - info->vol = clip127(cvol * 127.f); - info->pan = clip127((xPan + 1.f) * 64.f); - info->span = clip127((1.f - zPan) * 64.f); - info->doppler = clip3FFF(pitch * 8192.f); - - hwEnableIrq(); -} - -void s3dInit(u32 flags) { - s3dEmitterRoot = 0; - s3dListenerRoot = 0; - s3dRoomRoot = 0; - s3dDoorRoot = 0; - snd_used_studios = 0; - snd_base_studio = 1; - snd_max_studios = 3; - s3dCallCnt = 0; - s3dUseMaxVoices = ((flags & 2) != 0); -} - -void s3dExit() {} diff --git a/src/musyx/runtime/snd_init.c b/src/musyx/runtime/snd_init.c deleted file mode 100644 index b09bcdff..00000000 --- a/src/musyx/runtime/snd_init.c +++ /dev/null @@ -1,173 +0,0 @@ - -/* - - - - - - - - - - - - - - - -*/ - -#include "musyx/assert.h" -#include "musyx/hardware.h" -#include "musyx/s3d.h" -#include "musyx/seq.h" -#include "musyx/stream.h" -#include "musyx/synth.h" -#include "musyx/synthdata.h" - -// #define _DEBUG - -/* - - - - -*/ -#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 3) -long DoInit(u32 mixFrq, u32 numVoices, u32 flags, u32 aramBase, u32 aramSize) -#else -static s32 DoInit(u32 mixFrq, u32 aramSize, u32 numVoices, u32 flags) -#endif -{ - bool ret; - - MUSY_DEBUG("\nMusyX software initialization...\nBuild Date: %s %s\n\n", __DATE__, __TIME__); - ret = FALSE; - -#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 3) - dataInitStack(aramBase, aramGetUserBytes(aramSize)); -#else - dataInitStack(); -#endif - dataInit(0, aramSize); - - seqInit(); - - synthIdleWaitActive = 0; - - synthInit(mixFrq, numVoices); - - streamInit(); - - vsInit(); - - s3dInit(flags); - - sndActive = 1; - - MUSY_DEBUG("MusyX logic is initialized.\n\n"); - - return ret; -} - -/* - - - - - - - - - - -*/ -s32 sndInit(u8 voices, u8 music, u8 sfx, u8 studios, u32 flags, u32 aramSize) { - s32 ret; // r31 - u32 frq; // r1+0x14 - - MUSY_DEBUG("Entering sndInit()\n\n"); - ret = 0; - sndActive = 0; - if (voices <= 64) { - synthInfo.voiceNum = voices; - } else { - synthInfo.voiceNum = 64; - } - if (studios <= 8) { - synthInfo.studioNum = studios; - } else { - synthInfo.studioNum = 8; - } - - synthInfo.maxMusic = music; - synthInfo.maxSFX = sfx; - frq = 32000; - if ((ret = hwInit(&frq, synthInfo.voiceNum, synthInfo.studioNum, flags)) == 0) { -#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 3) - ret = DoInit(32000, synthInfo.voiceNum, flags, aramGetFirstUserAddress(), aramSize); -#else - ret = DoInit(32000, aramSize, synthInfo.voiceNum, flags); -#endif - } - - MUSY_DEBUG("Leaving sndInit().\n\n"); - return ret; -} - -/* */ -void sndQuit() { - MUSY_ASSERT_MSG(sndActive, "Sound system is not initialized."); - - hwExit(); - /* - - - */ - dataExit(); - /* - */ - s3dExit(); - /* */ - synthExit(); - /* */ - sndActive = 0; -} - -/* - - -*/ -void sndSetMaxVoices(u8 music, u8 sfx) { - MUSY_ASSERT_MSG(music <= synthInfo.voiceNum, "Music voices are above maximum voice number."); - MUSY_ASSERT_MSG(sfx <= synthInfo.voiceNum, "Sfx voices are above maximum voice number."); - - synthInfo.maxMusic = music; - synthInfo.maxSFX = sfx; -} - -/* - - -*/ -bool sndIsInstalled() { return sndActive; } - -/* - - - - -*/ -SND_PLAYBACKINFO* sndGetPlayBackInfo() { - if (sndActive) { - return &synthInfo.pbInfo; - } - - return NULL; -} - -#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 3) -void sndSetLowPassFilterDefaultRange(unsigned long lowFrq, unsigned long highFrq) { - inpSetLPFDefaultRange(lowFrq, highFrq); -} -#endif diff --git a/src/musyx/runtime/snd_math.c b/src/musyx/runtime/snd_math.c deleted file mode 100644 index 96cdff80..00000000 --- a/src/musyx/runtime/snd_math.c +++ /dev/null @@ -1,46 +0,0 @@ -#include -#include "musyx/musyx.h" - -void salApplyMatrix(const SND_FMATRIX* mat, const SND_FVECTOR* in, SND_FVECTOR* out) { - out->x = mat->m[0][0] * in->x + mat->m[0][1] * in->y + mat->m[0][2] * in->z + mat->t[0]; - out->y = mat->m[1][0] * in->x + mat->m[1][1] * in->y + mat->m[1][2] * in->z + mat->t[1]; - out->z = mat->m[2][0] * in->x + mat->m[2][1] * in->y + mat->m[2][2] * in->z + mat->t[2]; -} - -float salNormalizeVector(SND_FVECTOR* vec) { - float l = sqrtf(vec->x * vec->x + vec->y * vec->y + vec->z * vec->z); - vec->x /= l; - vec->y /= l; - vec->z /= l; - return l; -} - -void salCrossProduct(SND_FVECTOR* out, const SND_FVECTOR* a, const SND_FVECTOR* b) { - out->x = (a->y * b->z) - (a->z * b->y); - out->y = (a->z * b->x) - (a->x * b->z); - out->z = (a->x * b->y) - (a->y * b->x); -} - -void salInvertMatrix(SND_FMATRIX* out, const SND_FMATRIX* in) { - float a; // r62 - float b; // r61 - float c; // r60 - float f; // r63 - - a = in->m[1][1] * in->m[2][2] - in->m[2][1] * in->m[1][2]; - b = -(in->m[1][0] * in->m[2][2] - in->m[2][0] * in->m[1][2]); - c = in->m[1][0] * in->m[2][1] - in->m[2][0] * in->m[1][1]; - f = 1.f / (in->m[0][0] * a + in->m[0][1] * b + in->m[0][2] * c); - out->m[0][0] = f * a; - out->m[1][0] = f * b; - out->m[2][0] = f * c; - out->m[0][1] = -f * (in->m[0][1] * in->m[2][2] - in->m[2][1] * in->m[0][2]); - out->m[1][1] = f * (in->m[0][0] * in->m[2][2] - in->m[2][0] * in->m[0][2]); - out->m[2][1] = -f * (in->m[0][0] * in->m[2][1] - in->m[2][0] * in->m[0][1]); - out->m[0][2] = f * (in->m[0][1] * in->m[1][2] - in->m[1][1] * in->m[0][2]); - out->m[1][2] = -f * (in->m[0][0] * in->m[1][2] - in->m[1][0] * in->m[0][2]); - out->m[2][2] = f * (in->m[0][0] * in->m[1][1] - in->m[1][0] * in->m[0][1]); - out->t[0] = (-in->t[0] * out->m[0][0] - in->t[1] * out->m[0][1]) - in->t[2] * out->m[0][2]; - out->t[1] = (-in->t[0] * out->m[1][0] - in->t[1] * out->m[1][1]) - in->t[2] * out->m[1][2]; - out->t[2] = (-in->t[0] * out->m[2][0] - in->t[1] * out->m[2][1]) - in->t[2] * out->m[2][2]; -} diff --git a/src/musyx/runtime/snd_midictrl.c b/src/musyx/runtime/snd_midictrl.c deleted file mode 100644 index 7046aebb..00000000 --- a/src/musyx/runtime/snd_midictrl.c +++ /dev/null @@ -1,644 +0,0 @@ - -/* - - - - - - - - - - - - - - - -*/ - -#include "musyx/assert.h" -#include "musyx/seq.h" -#include "musyx/synth.h" - -#include - -#define SYNTH_FX_MIDISET 0xFF - -static u8 midi_lastNote[8][16]; - -static u8 fx_lastNote[64]; - -static u8 midi_ctrl[8][16][134]; - -static u8 fx_ctrl[64][134]; - -static u32 inpGlobalMIDIDirtyFlags[8][16]; - -static CHANNEL_DEFAULTS inpChannelDefaults[8][16]; - -static CHANNEL_DEFAULTS inpFXChannelDefaults[64]; - -static inline bool GetGlobalFlagSet(u8 chan, u8 midiSet, s32 flag) { - return (flag & inpGlobalMIDIDirtyFlags[midiSet][chan]) != 0; -} - -/* - - - - - - -*/ -static void inpResetGlobalMIDIDirtyFlags() { - u32 i, j; - for (i = 0; i < 8; ++i) { - for (j = 0; j < 16; ++j) { - inpGlobalMIDIDirtyFlags[i][j] = 0xFF; - } - } -} - -static u32 inpResetGlobalMIDIDirtyFlag(u8 chan, u8 midiSet, u32 flag) { - u32 ret; - // clang-format off - MUSY_ASSERT(midiSet!=SYNTH_FX_MIDISET); - // clang-format on - if ((ret = GetGlobalFlagSet(chan, midiSet, flag))) { - inpGlobalMIDIDirtyFlags[midiSet][chan] &= ~flag; - } - return ret; -} - -void inpSetGlobalMIDIDirtyFlag(u8 chan, u8 midiSet, s32 flag) { - // clang-format off - MUSY_ASSERT(midiSet!=SYNTH_FX_MIDISET); - // clang-format on - inpGlobalMIDIDirtyFlags[midiSet][chan] |= flag; -} - -void inpSetRPNHi(u8 set, u8 channel, u8 value) { - u16 rpn; // r28 - u32 i; // r31 - u8 range; // r29 - - rpn = (midi_ctrl[set][channel][100]) | (midi_ctrl[set][channel][101] << 8); - switch (rpn) { - case 0: - range = value > 24 ? 24 : value; - inpChannelDefaults[set][channel].pbRange = range; - - for (i = 0; i < synthInfo.voiceNum; ++i) { - if (set == synthVoice[i].midiSet && channel == synthVoice[i].midi) { - synthVoice[i].pbUpperKeyRange = range; - synthVoice[i].pbLowerKeyRange = range; - } - } - break; - default: - break; - } -} - -void inpSetRPNLo(u8 set, u8 channel, u8 value) {} - -void inpSetRPNDec(u8 set, u8 channel) { - u16 rpn; // r28 - u32 i; // r31 - u8 range; // r30 - - rpn = (midi_ctrl[set][channel][100]) | (midi_ctrl[set][channel][101] << 8); - switch (rpn) { - case 0: - range = inpChannelDefaults[set][channel].pbRange; - if (range != 0) { - --range; - } - inpChannelDefaults[set][channel].pbRange = range; - for (i = 0; i < synthInfo.voiceNum; ++i) { - if (set == synthVoice[i].midiSet && channel == synthVoice[i].midi) { - synthVoice[i].pbUpperKeyRange = range; - synthVoice[i].pbLowerKeyRange = range; - } - } - break; - default: - break; - } -} - -void inpSetRPNInc(u8 set, u8 channel) { - u16 rpn; // r28 - u32 i; // r31 - u8 range; // r30 - - rpn = (midi_ctrl[set][channel][100]) | (midi_ctrl[set][channel][101] << 8); - switch (rpn) { - case 0: - range = inpChannelDefaults[set][channel].pbRange; - if (range < 24) { - ++range; - } - - inpChannelDefaults[set][channel].pbRange = range; - for (i = 0; i < synthInfo.voiceNum; ++i) { - if (set == synthVoice[i].midiSet && channel == synthVoice[i].midi) { - synthVoice[i].pbUpperKeyRange = range; - synthVoice[i].pbLowerKeyRange = range; - } - } - break; - default: - break; - } -} - -void inpSetMidiCtrl(u8 ctrl, u8 channel, u8 set, u8 value) { - u32 i; - if (channel == 0xFF) { - return; - } - - if (set != 0xFF) { - switch (ctrl) { - case 6: - inpSetRPNHi(set, channel, value); - break; - case 38: - inpSetRPNLo(set, channel, value); - break; - case 96: - inpSetRPNDec(set, channel); - break; - case 97: - inpSetRPNInc(set, channel); - break; - } - - midi_ctrl[set][channel][ctrl] = value & 0x7f; - for (i = 0; i < synthInfo.voiceNum; ++i) { - if (set == synthVoice[i].midiSet && channel == synthVoice[i].midi) { - synthVoice[i].midiDirtyFlags = 0x1fff; - synthKeyStateUpdate(&synthVoice[i]); - } - } - inpGlobalMIDIDirtyFlags[set][channel] = 0xff; - - } else { - switch (ctrl) { - case 6: - inpSetRPNHi(set, channel, value); - break; - case 38: - inpSetRPNLo(set, channel, value); - break; - case 96: - inpSetRPNDec(set, channel); - break; - case 97: - inpSetRPNInc(set, channel); - break; - } - - fx_ctrl[channel][ctrl] = value & 0x7f; - for (i = 0; i < synthInfo.voiceNum; ++i) { - if (set == synthVoice[i].midiSet && channel == synthVoice[i].midi) { - synthVoice[i].midiDirtyFlags = 0x1fff; - synthKeyStateUpdate(&synthVoice[i]); - } - } - } -} - -void inpSetMidiCtrl14(u8 ctrl, u8 channel, u8 set, u16 value) { - - if (channel == 0xFF) { - return; - } - - if (ctrl < 64) { - inpSetMidiCtrl(ctrl & 31, channel, set, value >> 7); - inpSetMidiCtrl((ctrl & 31) + 32, channel, set, value & 0x7f); - } else if (ctrl == 128 || ctrl == 129) { - inpSetMidiCtrl(ctrl & 254, channel, set, value >> 7); - inpSetMidiCtrl((ctrl & 254) + 1, channel, set, value & 0x7f); - } else if (ctrl == 132 || ctrl == 133) { - inpSetMidiCtrl(ctrl & 254, channel, set, value >> 7); - inpSetMidiCtrl((ctrl & 254) + 1, channel, set, value & 0x7f); - } else { - inpSetMidiCtrl(ctrl, channel, set, value >> 7); - } -} - -static const u8 inpColdMIDIDefaults[134] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x40, 0x7F, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x7F, 0x7F, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, -}; -static const u8 inpWarmMIDIDefaults[134] = { - 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - -}; - -void inpResetMidiCtrl(u8 ch, u8 set, u32 coldReset) { - const u8* values; // r30 - u8* dest; // r29 - u32 i; // r31 - - values = coldReset ? inpColdMIDIDefaults : inpWarmMIDIDefaults; - dest = set != 0xFF ? midi_ctrl[set][ch] : fx_ctrl[ch]; - - if (coldReset) { - memcpy(dest, values, 134); - } else { - for (i = 0; i < 134; ++i) { - if (values[i] != 0xFF) { - dest[i] = values[i]; - } - } - } - - inpSetMidiLastNote(ch, set, 0xFF); -} - -u16 inpGetMidiCtrl(u8 ctrl, u8 channel, u8 set) { - - if (channel != 0xff) { - if (set != 0xff) { - - if (ctrl < 0x40) { - return midi_ctrl[set][channel][ctrl & 0x1f] << 7 | - midi_ctrl[set][channel][(ctrl & 0x1f) + 0x20]; - } else if (ctrl < 0x46) { - return midi_ctrl[set][channel][ctrl] < 0x40 ? 0 : 0x3fff; - } else if (ctrl >= 0x60 && ctrl < 0x66) { - return 0; - } else { - if ((ctrl == 0x80) || (ctrl == 0x81)) { - return midi_ctrl[set][channel][ctrl & 0xfe] << 7 | - midi_ctrl[set][channel][(ctrl & 0xfe) + 1]; - } else if ((ctrl == 0x84) || (ctrl == 0x85)) { - return midi_ctrl[set][channel][ctrl & 0xfe] << 7 | - midi_ctrl[set][channel][(ctrl & 0xfe) + 1]; - } else { - return midi_ctrl[set][channel][ctrl] << 7; - } - } - } else { - if (ctrl < 0x40) { - return fx_ctrl[channel][ctrl & 0x1f] << 7 | fx_ctrl[channel][(ctrl & 0x1f) + 0x20]; - } else if (ctrl < 0x46) { - return fx_ctrl[channel][ctrl] < 0x40 ? 0 : 0x3fff; - } else if (ctrl >= 0x60 && ctrl < 0x66) { - return 0; - } else { - if ((ctrl == 0x80) || (ctrl == 0x81)) { - return fx_ctrl[channel][ctrl & 0xfe] << 7 | fx_ctrl[channel][(ctrl & 0xfe) + 1]; - } else if ((ctrl == 0x84) || (ctrl == 0x85)) { - return fx_ctrl[channel][ctrl & 0xfe] << 7 | fx_ctrl[channel][(ctrl & 0xfe) + 1]; - } else { - return fx_ctrl[channel][ctrl] << 7; - } - } - } - } - return 0; -} - -CHANNEL_DEFAULTS* inpGetChannelDefaults(u8 midi, u8 midiSet) { - if (midiSet == 0xFF) { - return &inpFXChannelDefaults[midi]; - } - - return &inpChannelDefaults[midiSet][midi]; -} - -void inpResetChannelDefaults(u8 midi, u8 midiSet) { - CHANNEL_DEFAULTS* channelDefaults; // r31 - channelDefaults = - midiSet != 0xFF ? &inpChannelDefaults[midiSet][midi] : &inpFXChannelDefaults[midi]; - channelDefaults->pbRange = 2; -} - -void inpAddCtrl(CTRL_DEST* dest, u8 ctrl, s32 scale, u8 comb, u32 isVar) { - u8 n; // r30 - if (comb == 0) { - dest->numSource = 0; - } - - if (dest->numSource < 4) { - n = dest->numSource++; - if (isVar == 0) { - ctrl = inpTranslateExCtrl(ctrl); - } else { - comb |= 0x10; - } - - dest->source[n].midiCtrl = ctrl; - dest->source[n].combine = comb; - dest->source[n].scale = scale; - } -} - -void inpFXCopyCtrl(u8 ctrl, SYNTH_VOICE* dvoice, SYNTH_VOICE* svoice) { - u8 di; // r30 - u8 si; // r29 - di = dvoice->id; - si = svoice->id; - - if (ctrl < 64) { - fx_ctrl[di][ctrl & 31] = fx_ctrl[si][ctrl & 31]; - fx_ctrl[di][(ctrl & 31) + 32] = fx_ctrl[si][(ctrl & 31) + 32]; - } else if (ctrl == 128 || ctrl == 129) { - fx_ctrl[di][ctrl & 254] = fx_ctrl[si][ctrl & 254]; - fx_ctrl[di][(ctrl & 254) + 1] = fx_ctrl[si][(ctrl & 254) + 1]; - } else if (ctrl == 132 || ctrl == 133) { - fx_ctrl[di][ctrl & 254] = fx_ctrl[si][ctrl & 254]; - fx_ctrl[di][(ctrl & 254) + 1] = fx_ctrl[si][(ctrl & 254) + 1]; - } else { - fx_ctrl[di][ctrl] = fx_ctrl[si][ctrl]; - } -} - -void inpSetMidiLastNote(u8 midi, u8 midiSet, u8 key) { - if (midiSet != 0xFF) { - midi_lastNote[midiSet][midi] = key; - } else { - fx_lastNote[midi] = key; - } -} - -u8 inpGetMidiLastNote(u8 midi, u8 midiSet) { - if (midiSet != 0xFF) { - return midi_lastNote[midiSet][midi]; - } - return fx_lastNote[midi]; -} - -static u16 _GetInputValue(SYNTH_VOICE* svoice, CTRL_DEST* inp, u8 midi, u8 midiSet) { - u32 i; // r26 - u32 value; // r29 - u8 ctrl; // r28 - s32 tmp; // r31 - s32 vtmp; // r30 - u32 sign; // r25 - - for (value = 0, i = 0; i < inp->numSource; ++i) { - if (inp->source[i].combine & 0x10) { - tmp = (svoice != NULL ? varGet(svoice, 0, inp->source[i].midiCtrl) : 0); - } else { - ctrl = inp->source[i].midiCtrl; - if (ctrl == 128 || ctrl == 1 || ctrl == 10 || ctrl == 160 || ctrl == 161 || ctrl == 131) { - switch (ctrl) { - case 160: - case 161: - if (svoice != NULL) { - tmp = svoice->lfo[ctrl - 160].value << 1; - svoice->lfoUsedByInput[ctrl - 160] = 1; - } else { - tmp = 0; - } - break; - default: - tmp = inpGetMidiCtrl(ctrl, midi, midiSet) - 0x2000; - break; - } - } else if (ctrl == 163) { - tmp = svoice != NULL ? svoice->orgVolume >> 9 : 0; - } else if (ctrl < 163) { - if (ctrl < 162) { - tmp = inpGetMidiCtrl(ctrl, midi, midiSet); - } else if (svoice == NULL) { - tmp = 0; - } else { - tmp = svoice->orgNote << 7; - } - } else if (ctrl > 164) { - if (svoice != NULL) { - tmp = (synthRealTime - svoice->macStartTime) << 8; - if (tmp > 0x3fff) { - tmp = 0x3fff; - } - - svoice->timeUsedByInput = 1; - } else { - tmp = 0; - } - } - - tmp = (tmp * inp->source[i].scale / 2) >> 15; - } - } - - inp->oldValue = value; - return value; -} - -static u16 GetInputValue(SYNTH_VOICE* svoice, CTRL_DEST* inp, u32 dirtyMask) { - - if (!(svoice->midiDirtyFlags & dirtyMask)) { - return inp->oldValue; - } - - svoice->midiDirtyFlags &= ~dirtyMask; - - return _GetInputValue(svoice, inp, svoice->midi, svoice->midiSet); -} - -static u16 GetGlobalInputValue(CTRL_DEST* inp, u32 dirtyMask, u8 midi, u8 midiSet) { - if (!inpResetGlobalMIDIDirtyFlag(midi, midiSet, dirtyMask)) { - return inp->oldValue; - } - return _GetInputValue(NULL, inp, midi, midiSet); -} - -u16 inpGetVolume(SYNTH_VOICE* svoice) { return GetInputValue(svoice, &svoice->inpVolume, 0x1); } - -u16 inpGetPanning(SYNTH_VOICE* svoice) { return GetInputValue(svoice, &svoice->inpPanning, 0x2); } - -u16 inpGetSurPanning(SYNTH_VOICE* svoice) { - return GetInputValue(svoice, &svoice->inpSurroundPanning, 0x4); -} - -u16 inpGetPitchBend(SYNTH_VOICE* svoice) { - return GetInputValue(svoice, &svoice->inpPitchBend, 0x8); -} - -u16 inpGetDoppler(SYNTH_VOICE* svoice) { return GetInputValue(svoice, &svoice->inpDoppler, 0x10); } - -u16 inpGetModulation(SYNTH_VOICE* svoice) { - return GetInputValue(svoice, &svoice->inpModulation, 0x20); -} - -u16 inpGetPedal(SYNTH_VOICE* svoice) { return GetInputValue(svoice, &svoice->inpPedal, 0x40); } - -u16 inpGetPreAuxA(SYNTH_VOICE* svoice) { return GetInputValue(svoice, &svoice->inpPreAuxA, 0x100); } - -u16 inpGetReverb(SYNTH_VOICE* svoice) { return GetInputValue(svoice, &svoice->inpReverb, 0x200); } - -u16 inpGetPreAuxB(SYNTH_VOICE* svoice) { return GetInputValue(svoice, &svoice->inpPreAuxB, 0x400); } - -u16 inpGetPostAuxB(SYNTH_VOICE* svoice) { - return GetInputValue(svoice, &svoice->inpPostAuxB, 0x800); -} - -u16 inpGetTremolo(SYNTH_VOICE* svoice) { - return GetInputValue(svoice, &svoice->inpTremolo, 0x1000); -} - -u16 inpGetAuxA(u8 studio, u8 index, u8 midi, u8 midiSet) { - static u32 dirtyMask[4] = {0x80000001, 0x80000002, 0x80000004, 0x80000008}; - return GetGlobalInputValue(&inpAuxA[studio][index], dirtyMask[index], midi, midiSet); -} - -u16 inpGetAuxB(u8 studio, u8 index, u8 midi, u8 midiSet) { - static u32 dirtyMask[4] = {0x80000010, 0x80000020, 0x80000040, 0x80000080}; - - return GetGlobalInputValue(&inpAuxB[studio][index], dirtyMask[index], midi, midiSet); -} - -void inpInit(SYNTH_VOICE* svoice) { - u32 i; // r30 - u32 s; // r29 - - if (svoice != NULL) { - svoice->inpVolume.source[0].midiCtrl = 7; - svoice->inpVolume.source[0].combine = 0; - svoice->inpVolume.source[0].scale = 0x10000; - svoice->inpVolume.source[1].midiCtrl = 11; - svoice->inpVolume.source[1].combine = 2; - svoice->inpVolume.source[1].scale = 0x10000; - svoice->inpVolume.numSource = 2; - svoice->inpPanning.source[0].midiCtrl = 10; - svoice->inpPanning.source[0].combine = 0; - svoice->inpPanning.source[0].scale = 0x10000; - svoice->inpPanning.numSource = 1; - svoice->inpSurroundPanning.source[0].midiCtrl = 131; - svoice->inpSurroundPanning.source[0].combine = 0; - svoice->inpSurroundPanning.source[0].scale = 0x10000; - svoice->inpSurroundPanning.numSource = 1; - svoice->inpPitchBend.source[0].midiCtrl = 128; - svoice->inpPitchBend.source[0].combine = 0; - svoice->inpPitchBend.source[0].scale = 0x10000; - svoice->inpPitchBend.numSource = 1; - svoice->inpModulation.source[0].midiCtrl = 1; - svoice->inpModulation.source[0].combine = 0; - svoice->inpModulation.source[0].scale = 0x10000; - svoice->inpModulation.numSource = 1; - svoice->inpPedal.source[0].midiCtrl = 64; - svoice->inpPedal.source[0].combine = 0; - svoice->inpPedal.source[0].scale = 0x10000; - svoice->inpPedal.numSource = 1; - svoice->inpPortamento.source[0].midiCtrl = 65; - svoice->inpPortamento.source[0].combine = 0; - svoice->inpPortamento.source[0].scale = 0x10000; - svoice->inpPortamento.numSource = 1; - svoice->inpPreAuxA.numSource = 0; - svoice->inpReverb.source[0].midiCtrl = 91; - svoice->inpReverb.source[0].combine = 0; - svoice->inpReverb.source[0].scale = 0x10000; - svoice->inpReverb.numSource = 1; - svoice->inpPreAuxB.numSource = 0; - svoice->inpPostAuxB.source[0].midiCtrl = 93; - svoice->inpPostAuxB.source[0].combine = 0; - svoice->inpPostAuxB.source[0].scale = 0x10000; - svoice->inpPostAuxB.numSource = 1; - svoice->inpDoppler.source[0].midiCtrl = 132; - svoice->inpDoppler.source[0].combine = 0; - svoice->inpDoppler.source[0].scale = 0x10000; - svoice->inpDoppler.numSource = 1; - svoice->inpTremolo.numSource = 0; - - svoice->midiDirtyFlags = 0x1fff; - svoice->lfoUsedByInput[0] = 0; - svoice->lfoUsedByInput[1] = 0; - svoice->timeUsedByInput = 0; - } else { - for (s = 0; s < 8; ++s) { - for (i = 0; i < 4; ++i) { - inpAuxA[s][i].numSource = 0; - inpAuxB[s][i].numSource = 0; - } - } - - inpResetGlobalMIDIDirtyFlags(); - } -} - -u8 inpTranslateExCtrl(u8 ctrl) { - switch (ctrl) { - case 0x80: - ctrl = 0x80; - break; - case 0x81: - ctrl = 0x82; - break; - case 0x82: - ctrl = 0xa0; - break; - case 0x83: - ctrl = 0xa1; - break; - case 0x84: - ctrl = 0x83; - break; - case 0x85: - ctrl = 0x84; - break; - case 0x86: - ctrl = 0xa2; - break; - case 0x87: - ctrl = 0xa3; - break; - case 0x88: - ctrl = 0xa4; - break; - } - return ctrl; -} -u16 inpGetExCtrl(SYNTH_VOICE* svoice, u8 ctrl) { - u16 v; // r30 - switch (inpTranslateExCtrl(ctrl)) { - case 160: - v = (svoice->lfo[0].value << 1) + 0x2000; - break; - case 161: - v = (svoice->lfo[1].value << 1) + 0x2000; - break; - default: - v = svoice->midi != 0xFF ? inpGetMidiCtrl(ctrl, svoice->midi, svoice->midiSet) : 0; - break; - } - - return v; -} -void inpSetExCtrl(SYNTH_VOICE* svoice, u8 ctrl, s16 v) { - v = v < 0 ? 0 : v > 0x3fff ? 0x3fff : v; - - switch (inpTranslateExCtrl(ctrl)) { - case 161: - case 160: - break; - default: - if (svoice->midi != 0xFF) { - inpSetMidiCtrl14(ctrl, svoice->midi, svoice->midiSet, v); - } - break; - } -} diff --git a/src/musyx/runtime/snd_service.c b/src/musyx/runtime/snd_service.c deleted file mode 100644 index 4c312a81..00000000 --- a/src/musyx/runtime/snd_service.c +++ /dev/null @@ -1,136 +0,0 @@ -#include "musyx/musyx.h" - -#include "musyx/snd.h" -#include "musyx/synth.h" - -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus - -s16 sndSintab[1024] = { - 0, 6, 12, 18, 25, 31, 37, 43, 50, 56, 62, 69, 75, 81, 87, 94, - 100, 106, 113, 119, 125, 131, 138, 144, 150, 157, 163, 169, 175, 182, 188, 194, - 200, 207, 213, 219, 226, 232, 238, 244, 251, 257, 263, 269, 276, 282, 288, 295, - 301, 307, 313, 320, 326, 332, 338, 345, 351, 357, 363, 370, 376, 382, 388, 395, - 401, 407, 413, 420, 426, 432, 438, 445, 451, 457, 463, 470, 476, 482, 488, 495, - 501, 507, 513, 520, 526, 532, 538, 545, 551, 557, 563, 569, 576, 582, 588, 594, - 601, 607, 613, 619, 625, 632, 638, 644, 650, 656, 663, 669, 675, 681, 687, 694, - 700, 706, 712, 718, 725, 731, 737, 743, 749, 755, 762, 768, 774, 780, 786, 792, - 799, 805, 811, 817, 823, 829, 836, 842, 848, 854, 860, 866, 872, 879, 885, 891, - 897, 903, 909, 915, 921, 928, 934, 940, 946, 952, 958, 964, 970, 976, 983, 989, - 995, 1001, 1007, 1013, 1019, 1025, 1031, 1037, 1043, 1050, 1056, 1062, 1068, 1074, 1080, 1086, - 1092, 1098, 1104, 1110, 1116, 1122, 1128, 1134, 1140, 1146, 1152, 1158, 1164, 1170, 1176, 1182, - 1189, 1195, 1201, 1207, 1213, 1219, 1225, 1231, 1237, 1243, 1248, 1254, 1260, 1266, 1272, 1278, - 1284, 1290, 1296, 1302, 1308, 1314, 1320, 1326, 1332, 1338, 1344, 1350, 1356, 1362, 1368, 1373, - 1379, 1385, 1391, 1397, 1403, 1409, 1415, 1421, 1427, 1433, 1438, 1444, 1450, 1456, 1462, 1468, - 1474, 1479, 1485, 1491, 1497, 1503, 1509, 1515, 1520, 1526, 1532, 1538, 1544, 1550, 1555, 1561, - 1567, 1573, 1579, 1584, 1590, 1596, 1602, 1608, 1613, 1619, 1625, 1631, 1636, 1642, 1648, 1654, - 1659, 1665, 1671, 1677, 1682, 1688, 1694, 1699, 1705, 1711, 1717, 1722, 1728, 1734, 1739, 1745, - 1751, 1756, 1762, 1768, 1773, 1779, 1785, 1790, 1796, 1802, 1807, 1813, 1819, 1824, 1830, 1835, - 1841, 1847, 1852, 1858, 1864, 1869, 1875, 1880, 1886, 1891, 1897, 1903, 1908, 1914, 1919, 1925, - 1930, 1936, 1941, 1947, 1952, 1958, 1964, 1969, 1975, 1980, 1986, 1991, 1997, 2002, 2007, 2013, - 2018, 2024, 2029, 2035, 2040, 2046, 2051, 2057, 2062, 2067, 2073, 2078, 2084, 2089, 2094, 2100, - 2105, 2111, 2116, 2121, 2127, 2132, 2138, 2143, 2148, 2154, 2159, 2164, 2170, 2175, 2180, 2186, - 2191, 2196, 2201, 2207, 2212, 2217, 2223, 2228, 2233, 2238, 2244, 2249, 2254, 2259, 2265, 2270, - 2275, 2280, 2286, 2291, 2296, 2301, 2306, 2312, 2317, 2322, 2327, 2332, 2337, 2343, 2348, 2353, - 2358, 2363, 2368, 2373, 2379, 2384, 2389, 2394, 2399, 2404, 2409, 2414, 2419, 2424, 2429, 2434, - 2439, 2445, 2450, 2455, 2460, 2465, 2470, 2475, 2480, 2485, 2490, 2495, 2500, 2505, 2510, 2515, - 2519, 2524, 2529, 2534, 2539, 2544, 2549, 2554, 2559, 2564, 2569, 2574, 2578, 2583, 2588, 2593, - 2598, 2603, 2608, 2613, 2617, 2622, 2627, 2632, 2637, 2641, 2646, 2651, 2656, 2661, 2665, 2670, - 2675, 2680, 2684, 2689, 2694, 2699, 2703, 2708, 2713, 2717, 2722, 2727, 2732, 2736, 2741, 2746, - 2750, 2755, 2760, 2764, 2769, 2773, 2778, 2783, 2787, 2792, 2796, 2801, 2806, 2810, 2815, 2819, - 2824, 2828, 2833, 2837, 2842, 2847, 2851, 2856, 2860, 2865, 2869, 2874, 2878, 2882, 2887, 2891, - 2896, 2900, 2905, 2909, 2914, 2918, 2922, 2927, 2931, 2936, 2940, 2944, 2949, 2953, 2957, 2962, - 2966, 2970, 2975, 2979, 2983, 2988, 2992, 2996, 3000, 3005, 3009, 3013, 3018, 3022, 3026, 3030, - 3034, 3039, 3043, 3047, 3051, 3055, 3060, 3064, 3068, 3072, 3076, 3080, 3085, 3089, 3093, 3097, - 3101, 3105, 3109, 3113, 3117, 3121, 3126, 3130, 3134, 3138, 3142, 3146, 3150, 3154, 3158, 3162, - 3166, 3170, 3174, 3178, 3182, 3186, 3190, 3193, 3197, 3201, 3205, 3209, 3213, 3217, 3221, 3225, - 3229, 3232, 3236, 3240, 3244, 3248, 3252, 3255, 3259, 3263, 3267, 3271, 3274, 3278, 3282, 3286, - 3289, 3293, 3297, 3301, 3304, 3308, 3312, 3315, 3319, 3323, 3326, 3330, 3334, 3337, 3341, 3345, - 3348, 3352, 3356, 3359, 3363, 3366, 3370, 3373, 3377, 3381, 3384, 3388, 3391, 3395, 3398, 3402, - 3405, 3409, 3412, 3416, 3419, 3423, 3426, 3429, 3433, 3436, 3440, 3443, 3447, 3450, 3453, 3457, - 3460, 3463, 3467, 3470, 3473, 3477, 3480, 3483, 3487, 3490, 3493, 3497, 3500, 3503, 3506, 3510, - 3513, 3516, 3519, 3522, 3526, 3529, 3532, 3535, 3538, 3541, 3545, 3548, 3551, 3554, 3557, 3560, - 3563, 3566, 3570, 3573, 3576, 3579, 3582, 3585, 3588, 3591, 3594, 3597, 3600, 3603, 3606, 3609, - 3612, 3615, 3618, 3621, 3624, 3627, 3629, 3632, 3635, 3638, 3641, 3644, 3647, 3650, 3652, 3655, - 3658, 3661, 3664, 3667, 3669, 3672, 3675, 3678, 3680, 3683, 3686, 3689, 3691, 3694, 3697, 3700, - 3702, 3705, 3708, 3710, 3713, 3716, 3718, 3721, 3723, 3726, 3729, 3731, 3734, 3736, 3739, 3742, - 3744, 3747, 3749, 3752, 3754, 3757, 3759, 3762, 3764, 3767, 3769, 3772, 3774, 3776, 3779, 3781, - 3784, 3786, 3789, 3791, 3793, 3796, 3798, 3800, 3803, 3805, 3807, 3810, 3812, 3814, 3816, 3819, - 3821, 3823, 3826, 3828, 3830, 3832, 3834, 3837, 3839, 3841, 3843, 3845, 3848, 3850, 3852, 3854, - 3856, 3858, 3860, 3862, 3864, 3867, 3869, 3871, 3873, 3875, 3877, 3879, 3881, 3883, 3885, 3887, - 3889, 3891, 3893, 3895, 3897, 3899, 3900, 3902, 3904, 3906, 3908, 3910, 3912, 3914, 3915, 3917, - 3919, 3921, 3923, 3925, 3926, 3928, 3930, 3932, 3933, 3935, 3937, 3939, 3940, 3942, 3944, 3945, - 3947, 3949, 3950, 3952, 3954, 3955, 3957, 3959, 3960, 3962, 3963, 3965, 3967, 3968, 3970, 3971, - 3973, 3974, 3976, 3977, 3979, 3980, 3982, 3983, 3985, 3986, 3988, 3989, 3990, 3992, 3993, 3995, - 3996, 3997, 3999, 4000, 4001, 4003, 4004, 4005, 4007, 4008, 4009, 4011, 4012, 4013, 4014, 4016, - 4017, 4018, 4019, 4020, 4022, 4023, 4024, 4025, 4026, 4027, 4029, 4030, 4031, 4032, 4033, 4034, - 4035, 4036, 4037, 4038, 4039, 4040, 4041, 4042, 4043, 4044, 4045, 4046, 4047, 4048, 4049, 4050, - 4051, 4052, 4053, 4054, 4055, 4056, 4057, 4057, 4058, 4059, 4060, 4061, 4062, 4062, 4063, 4064, - 4065, 4065, 4066, 4067, 4068, 4068, 4069, 4070, 4071, 4071, 4072, 4073, 4073, 4074, 4075, 4075, - 4076, 4076, 4077, 4078, 4078, 4079, 4079, 4080, 4080, 4081, 4081, 4082, 4082, 4083, 4083, 4084, - 4084, 4085, 4085, 4086, 4086, 4087, 4087, 4087, 4088, 4088, 4089, 4089, 4089, 4090, 4090, 4090, - 4091, 4091, 4091, 4091, 4092, 4092, 4092, 4092, 4093, 4093, 4093, 4093, 4094, 4094, 4094, 4094, - 4094, 4094, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, -}; - -#define SINTAB_ELEMENT_COUNT (sizeof(sndSintab) / sizeof(u16) - 1) - -u32 last_rnd = 1; - -u16 sndRand(void) { - last_rnd *= 2822053219; - return last_rnd >> 6; -} - -s16 sndSin(u16 angle) { - angle &= 0xFFF; - if (angle < 1024) { - return (s16)sndSintab[angle]; - } - if (angle < 2048) { - return (s16)sndSintab[SINTAB_ELEMENT_COUNT - (angle & SINTAB_ELEMENT_COUNT)]; - } - if (angle < 3072) { - return (s16)-sndSintab[angle & SINTAB_ELEMENT_COUNT]; - } - return -sndSintab[SINTAB_ELEMENT_COUNT - (angle & SINTAB_ELEMENT_COUNT)]; -} - -void* sndBSearch(void* key, void* base, s32 num, s32 len, SND_COMPARE cmp) { - long l; // r31 - long r; // r30 - long m; // r29 - long c; // r28 - void* ptr; // r27 - - if (num != 0) { - l = 1; - r = num; - do { - // This is kind of gross.... - if ((c = cmp(key, (ptr = (void*)((size_t)base + len * ((m = (l + r) >> 1) - 1))))) == 0) { - return ptr; - } - - if (c < 0) { - r = m - 1; - } else { - l = m + 1; - } - } while (l <= r); - } - return NULL; -} - -void sndConvertMs(u32* time) { *time = *time * 256; } - -void sndConvertTicks(u32* out, SYNTH_VOICE* svoice) { - *out = (((*out << 16) / synthGetTicksPerSecond(svoice)) * 1000) / 32; -} - -u32 sndConvert2Ms(u32 time) { return time / 256; } - -#ifdef __cplusplus -} -#endif // __cplusplus diff --git a/src/musyx/runtime/snd_synthapi.c b/src/musyx/runtime/snd_synthapi.c deleted file mode 100644 index 60cbb206..00000000 --- a/src/musyx/runtime/snd_synthapi.c +++ /dev/null @@ -1,693 +0,0 @@ -/* --------------------------------------- - - - - - - - - - - - - - - - - - - --------------------------------------- -*/ - -#include "musyx/assert.h" -#include "musyx/hardware.h" -#include "musyx/macros.h" -#include "musyx/s3d.h" -#include "musyx/seq.h" -#include "musyx/stream.h" -#include "musyx/synth.h" - -#include - -/* - - - - - - - - - -*/ -bool sndFXCtrl(SND_VOICEID vid, u8 ctrl, u8 value) { - bool ret; - MUSY_ASSERT_MSG(sndActive != 0, "Sound system is not initialized."); - hwDisableIrq(); - ret = synthFXSetCtrl(vid, ctrl, value); - hwEnableIrq(); - return ret; -} - -/* - - - - -*/ -bool sndFXCtrl14(SND_VOICEID vid, u8 ctrl, u16 value) { - bool ret; - MUSY_ASSERT_MSG(sndActive != 0, "Sound system is not initialized."); - hwDisableIrq(); - ret = synthFXSetCtrl14(vid, ctrl, value); - hwEnableIrq(); - return ret; -} - -/* - - - - -*/ -bool sndFXKeyOff(SND_VOICEID vid) { - bool ret; - MUSY_ASSERT_MSG(sndActive != 0, "Sound system is not initialized."); - hwDisableIrq(); - ret = synthSendKeyOff(vid); - hwEnableIrq(); - return ret; -} - -/* - - - - -*/ -SND_VOICEID sndFXStartEx(SND_FXID fid, u8 vol, u8 pan, u8 studio) { - SND_VOICEID v; - MUSY_ASSERT_MSG(sndActive != 0, "Sound system is not initialized."); - hwDisableIrq(); - v = synthFXStart(fid, vol, pan, studio, synthITDDefault[studio].sfx); - hwEnableIrq(); - return v; -} - -/* - - - - - - - - - -*/ -SND_VOICEID sndFXStartPara(SND_FXID fid, u8 vol, u8 pan, u8 studio, u8 numPara, ...) { - u32 vid; - u8 i; - va_list args; - u32 value; - u8 ctrl; - - MUSY_ASSERT_MSG(sndActive != 0, "Sound system is not initialized."); - - hwDisableIrq(); - - if ((vid = synthFXStart(fid, vol, pan, studio, synthITDDefault[studio].sfx)) != -1 && - numPara != 0) { - - va_start(args, numPara); - - for (i = 0; i < numPara; ++i) { - - ctrl = va_arg(args, u32); - value = va_arg(args, u32); - /* - - - - - - */ - if (ctrl < 0x40 || ctrl == 0x80 || ctrl == 0x84) { - MUSY_ASSERT_MSG(value <= 0x3fff, "Hires MIDI controller value out of range."); - - synthFXSetCtrl14(vid, ctrl, (u16)value); - } else { - - MUSY_ASSERT_MSG(value <= 0x7f, "Lores MIDI controller value out of range."); - synthFXSetCtrl(vid, ctrl, (u16)value); - } - } - } - /* - - */ - hwEnableIrq(); - return vid; -} - -/* - -*/ -SND_VOICEID sndFXStartParaInfo(SND_FXID fid, u8 vol, u8 pan, u8 studio, - SND_PARAMETER_INFO* paraInfo) { - unsigned long vid; // r29 - unsigned char i; // r28 - SND_PARAMETER* pPtr; // r31 - - MUSY_ASSERT_MSG(sndActive != 0, "Sound system is not initialized."); - - hwDisableIrq(); - - if ((vid = synthFXStart(fid, vol, pan, studio, synthITDDefault[studio].sfx)) != 0xFFFFFFFF) { - MUSY_ASSERT_MSG(paraInfo != NULL, "Parameter pointer must not be NULL."); - for (pPtr = paraInfo->paraArray, i = 0; i < paraInfo->numPara; ++pPtr, ++i) { - /* - - */ - if (pPtr->ctrl < 0x40 || pPtr->ctrl == 0x80 || pPtr->ctrl == 0x84) { - MUSY_ASSERT_MSG(pPtr->paraData.value14 <= 0x3fff, - "Hires MIDI controller value out of range."); - - synthFXSetCtrl14(vid, pPtr->ctrl, pPtr->paraData.value14); - } else { - - MUSY_ASSERT_MSG(pPtr->paraData.value7 <= 0x7f, "Lores MIDI controller value out of range."); - synthFXSetCtrl(vid, pPtr->ctrl, pPtr->paraData.value7); - } - } - } - - hwEnableIrq(); - return vid; -} - -/* - - - - - - - - - - - - - -*/ -SND_VOICEID sndFXCheck(SND_VOICEID vid) { - MUSY_ASSERT_MSG(sndActive != FALSE, "Sound system is not initialized."); - return vidGetInternalId(vid) != -1 ? vid : -1; -} - -/* - - - - - -*/ -s32 sndReadFlag(unsigned char num) { - - MUSY_ASSERT_MSG(sndActive != FALSE, "Sound system is not initialized."); - return synthGlobalVariable[num & 0xf]; -} - -/* - - - - -*/ -s32 sndWriteFlag(u8 num, s32 value) { - s32 old; // r30 - MUSY_ASSERT_MSG(sndActive != FALSE, "Sound system is not initialized."); - - num &= 0xf; - - hwDisableIrq(); - old = synthGlobalVariable[num]; - synthGlobalVariable[num] = value; - hwEnableIrq(); - - return old; -} -/* - - - - -*/ -bool sndSendMessage(SND_VOICEID vid, s32 mesg) { - bool ret; // r31 - MUSY_ASSERT_MSG(sndActive != FALSE, "Sound system is not initialized."); - - hwDisableIrq(); - ret = macPostMessage(vid, mesg); - hwEnableIrq(); - return ret; -} - -/* - - -*/ -void sndSetReceiveMessageCallback(void (*callback)(u32, s32)) { - MUSY_ASSERT_MSG(sndActive != FALSE, "Sound system is not initialized."); - synthMessageCallback = callback; -} - -/* - - - -*/ -void sndSilence() { - MUSY_ASSERT_MSG(sndActive != FALSE, "Sound system is not initialized."); - - hwDisableIrq(); - seqKillAllInstances(); - s3dKillAllEmitter(); - synthKillAllVoices(0); - hwEnableIrq(); -} - -/* - - - -*/ -bool sndIsIdle() { - u32 i; // r31 - u8 flag; // r30 - - MUSY_ASSERT_MSG(sndActive != FALSE, "Sound system is not initialized."); - - flag = 0; - - synthIdleWaitActive = TRUE; - if (!hwGlobalActivity()) { - for (i = 0; i < synthInfo.voiceNum; ++i) { - flag |= hwIsActive(i); - } - } else { - - flag = 1; - } - synthIdleWaitActive = FALSE; - return flag == 0; -} - -/* - - -*/ -bool sndFXAssignVolGroup2FXId(SND_FXID fid, u8 vGroup) { - FX_TAB* fx; // r30 - u32 ret; // r29 - - MUSY_ASSERT_MSG(sndActive != FALSE, "Sound system is not initialized."); - - ret = 0; - - hwDisableIrq(); - // - // - // - if ((fx = dataGetFX(fid)) != NULL) { - /* - - - */ - if ((u8)vGroup != 0xFE) { - // - // - fx->vGroup = vGroup; - synthSetMusicVolumeType(vGroup, 3); - } else { - fx->vGroup = 0x1f; - } - ret = 1; - } else { - - MUSY_DEBUG("FX ID=%d could not be found in FX table.", fid); - } - - hwEnableIrq(); - - return ret; -} - -/* - - - -*/ -void sndPauseVolume(u8 volume, u16 time, u8 vGroup) { - MUSY_ASSERT_MSG(sndActive != FALSE, "Sound system is not initialized."); - - hwDisableIrq(); - synthPauseVolume(volume, time, vGroup); - hwEnableIrq(); -} - -/* - - - -*/ -void sndVolume(u8 volume, u16 time, u8 volgroup) { - MUSY_ASSERT_MSG(sndActive != FALSE, "Sound system is not initialized."); - - hwDisableIrq(); - synthVolume(volume, time, volgroup, 0, -1); - hwEnableIrq(); -} - -/* - - -*/ -void sndMasterVolume(u8 volume, u16 time, u8 music, u8 fx) { - MUSY_ASSERT_MSG(sndActive != FALSE, "Sound system is not initialized."); - hwDisableIrq(); - if (music != 0) - synthVolume(volume, time, 0x15, 0, -1); - - if (fx != 0) - synthVolume(volume, time, 0x16, 0, -1); - hwEnableIrq(); -} - -/* - - -*/ -void sndOutputMode(SND_OUTPUTMODE output) { - u32 i; - u32 oldFlags; - MUSY_ASSERT_MSG(sndActive != FALSE, "Sound system is not initialized."); - oldFlags = synthFlags; - - switch (output) { - case SND_OUTPUTMODE_MONO: - - synthFlags |= 1; - synthFlags &= ~2; - hwDisableHRTF(); - - break; - case SND_OUTPUTMODE_STEREO: - - synthFlags &= ~1; - synthFlags &= ~2; - hwDisableHRTF(); - - break; - case SND_OUTPUTMODE_SURROUND: - - synthFlags &= ~1; - synthFlags |= 2; - hwDisableHRTF(); - - break; - default: - MUSY_ASSERT_MSG(FALSE, "Unsupported outputmode selected."); - break; - } - - if (oldFlags == synthFlags) { - return; - } - - for (i = 0; i < synthInfo.voiceNum; ++i) { - synthVoice[i].cFlags |= 0x0000200000000000; - } -#if MUSY_VERSION >= MUSY_VERSION_CHECK(1, 5, 4) - streamOutputModeChanged(); -#endif -} - -/* - - - - - - -*/ -// clang-format off -void sndSetAuxProcessingCallbacks(u8 studio, - SND_AUX_CALLBACK auxA, void* userA, u8 midiA, SND_SEQID seqIDA, - SND_AUX_CALLBACK auxB, void* userB, u8 midiB, SND_SEQID seqIDB) { - // clang-format on - MUSY_ASSERT_MSG(sndActive != FALSE, "Sound system is not initialized."); - - hwDisableIrq(); - if (auxA != NULL) { - - if ((synthAuxAMIDI[studio] = midiA) != 0xFF) { - synthAuxAMIDISet[studio] = seqGetPrivateId(seqIDA); - synthAuxACallback[studio] = auxA; - synthAuxAUser[studio] = userA; - } - } else { - synthAuxACallback[studio] = NULL; - synthAuxAMIDI[studio] = 0xff; - } - - if (auxB != NULL) { - - if ((synthAuxBMIDI[studio] = midiB) != 0xFF) { - synthAuxBMIDISet[studio] = seqGetPrivateId(seqIDB); - synthAuxBCallback[studio] = auxB; - synthAuxBUser[studio] = userB; - } - } else { - synthAuxBCallback[studio] = NULL; - synthAuxBMIDI[studio] = 0xff; - } - - hwSetAUXProcessingCallbacks(studio, auxA, userA, auxB, userB); - hwEnableIrq(); -} - -/* - - - - - - - - - - - - - - - - - -*/ -void sndUpdateAuxParameter(unsigned char studio, unsigned short* para, unsigned char auxBus) { - struct SND_AUX_INFO info; // r1+0x14 - unsigned long i; // r30 - - MUSY_ASSERT_MSG(sndActive != FALSE, "Sound system is not initialized."); - - for (i = 0; i < 4; ++i) { - info.data.parameterUpdate.para[i] = para[i]; - } - - if (auxBus == 0) { - MUSY_ASSERT_MSG(synthAuxACallback[studio] != NULL, "No FX is defined for AuxA."); - - synthAuxACallback[studio](1, &info, synthAuxAUser); - } else { - - MUSY_ASSERT_MSG(synthAuxBCallback[studio] != NULL, "No FX is defined for AuxB."); - synthAuxBCallback[studio](1, &info, synthAuxBUser); - } -} - -/* - - -*/ -void sndSetITDDefault(u8 studio, bool musicITD, bool sfxITD) { - synthITDDefault[studio].music = musicITD; - synthITDDefault[studio].sfx = sfxITD; -} - -/* - - -*/ -void synthActivateStudio(u8 studio, u32 isMaster, SND_STUDIO_TYPE type) { - MUSY_ASSERT_MSG(sndActive != FALSE, "Sound system is not initialized."); - hwDisableIrq(); - synthAuxACallback[studio] = NULL; - synthAuxBCallback[studio] = NULL; - synthAuxAMIDI[studio] = 0xFF; - synthAuxBMIDI[studio] = 0xFF; - synthITDDefault[studio].sfx = 0; - synthITDDefault[studio].music = 0; - hwActivateStudio(studio, isMaster, type); - hwEnableIrq(); -} - -/* - - - -*/ -void sndActivateStudioEx(u8 studio, bool isMaster, SND_STUDIO_TYPE type) { - MUSY_ASSERT_MSG(sndActive != FALSE, "Sound system is not initialized."); - MUSY_ASSERT_MSG(studio < synthInfo.studioNum, "Illegal studio index."); - if (studio != 0) { - hwDisableIrq(); - synthActivateStudio(studio, isMaster, type); - hwEnableIrq(); - } else { - MUSY_DEBUG("The default studio cannot be activated or deactivated.\n"); - } -} - -/* - - - - - - -*/ -void synthDeactivateStudio(u8 studio) { - u32 i; - MUSY_ASSERT_MSG(sndActive != FALSE, "Sound system is not initialized."); - - for (i = 0; i < synthInfo.voiceNum; ++i) { - - if (studio == synthVoice[i].studio) { - if (synthVoice[i].id != 0xFFFFFFFF) { - voiceKillSound(synthVoice[i].vidList->vid); - } else if (hwIsActive(i)) { - hwOff(i); - } - } - } - - hwDisableIrq(); - - synthAuxACallback[studio] = 0; - synthAuxBCallback[studio] = 0; - synthAuxAMIDI[studio] = 0xFF; - synthAuxBMIDI[studio] = 0xFF; - - hwEnableIrq(); - - hwDeactivateStudio(studio); -} - -/* - - - - -*/ -void sndDeactivateStudio(u8 studio) { - MUSY_ASSERT_MSG(sndActive != FALSE, "Sound system is not initialized."); - MUSY_ASSERT_MSG(studio < synthInfo.studioNum, "Illegal studio index."); - if (studio != 0) { - hwDisableIrq(); - synthDeactivateStudio(studio); - hwEnableIrq(); - } else { - MUSY_DEBUG("The default studio cannot be activated or deactivated.\n"); - } -} - -/* - - - - - -*/ -void synthChangeStudioMasterMix(u8 studio, u32 isMaster) { - MUSY_ASSERT_MSG(sndActive != FALSE, "Sound system is not initialized."); - hwChangeStudioMix(studio, isMaster); -} - -// - -void sndChangeStudioMasterMix(u8 studio, bool isMaster) { - MUSY_ASSERT_MSG(sndActive != FALSE, "Sound system is not initialized."); - if (studio != 0) { - hwDisableIrq(); - synthChangeStudioMasterMix(studio, isMaster); - hwEnableIrq(); - } else { - MUSY_DEBUG("Default studio's master mix cannot be changed.\n"); - } -} - -/* - - - - - -*/ -bool synthAddStudioInput(u8 studio, SND_STUDIO_INPUT* in_desc) { - - MUSY_ASSERT_MSG(sndActive != FALSE, "Sound system is not initialized."); - - return hwAddInput(studio, in_desc); -} - -// - -bool sndAddStudioInput(u8 studio, SND_STUDIO_INPUT* in_desc) { - u32 ret; - MUSY_ASSERT_MSG(sndActive != FALSE, "Sound system is not initialized."); - hwDisableIrq(); - ret = synthAddStudioInput(studio, in_desc); - hwEnableIrq(); - return ret; -} - -/* - -*/ -bool synthRemoveStudioInput(u8 studio, SND_STUDIO_INPUT* in_desc) { - MUSY_ASSERT_MSG(sndActive != FALSE, "Sound system is not initialized."); - return hwRemoveInput(studio, in_desc); -} - -/* - -*/ -bool sndRemoveStudioInput(u8 studio, SND_STUDIO_INPUT* in_desc) { - bool ret; - MUSY_ASSERT_MSG(sndActive != FALSE, "Sound system is not initialized."); - hwDisableIrq(); - ret = synthRemoveStudioInput(studio, in_desc); - hwEnableIrq(); - return ret; -} - -u8 sndDbgGetActiveVoices() { - u8 n; // r31 - hwDisableIrq(); - n = voiceFxRunning + voiceMusicRunning; - hwEnableIrq(); - return n; -} diff --git a/src/musyx/runtime/stream.c b/src/musyx/runtime/stream.c deleted file mode 100644 index cbbcb534..00000000 --- a/src/musyx/runtime/stream.c +++ /dev/null @@ -1,696 +0,0 @@ -#include "musyx/musyx.h" - -#include "musyx/assert.h" -#include "musyx/hardware.h" -#include "musyx/snd.h" -#include "musyx/stream.h" -#include "musyx/synth.h" -#include "musyx/synthdata.h" -#include "musyx/voice.h" - -#if !defined(_DEBUG) && MUSY_TARGET == MUSY_TARGET_DOLPHIN -#include "dolphin/os.h" -#endif - -static STREAM_INFO streamInfo[64]; -static u32 nextPublicID = 0; -static u8 streamCallDelay = 0; -static u8 streamCallCnt = 0; - -void streamInit() { - s32 i; - streamCallCnt = 0; - streamCallDelay = 3; - for (i = 0; i < synthInfo.voiceNum; ++i) { - streamInfo[i].state = 0; - } - nextPublicID = 0; -} - -#if MUSY_VERSION >= MUSY_VERSION_CHECK(1, 5, 4) -void SetHWMix(const STREAM_INFO* si) { - hwSetVolume(si->voice, 0, si->vol * (1 / 127.f), (si->pan << 16), (si->span << 16), - si->auxa * (1 / 127.f), si->auxb * (1 / 127.f)); -} -#endif - -void streamHandle() { - STREAM_INFO* si; // r31 - u32 cpos; // r30 - u32 len; // r29 - u32 i; // r25 - SAMPLE_INFO newsmp; // r1+0x8 - float f; // r63 - SND_VOICEID v; - - // TODO: Match this - - if (streamCallCnt != 0) { - --streamCallCnt; - return; - } - streamCallCnt = streamCallDelay; - si = &streamInfo[0]; - for (i = 0; i < synthInfo.voiceNum; ++i, ++si) { - switch (si->state) { - case 1: - newsmp.info = si->frq | 0x40000000; - newsmp.addr = hwGetStreamPlayBuffer(si->hwStreamHandle); - newsmp.offset = 0; - newsmp.length = si->size; - newsmp.loop = 0; - newsmp.loopLength = si->size; - -#if MUSY_VERSION <= MUSY_VERSION_CHECK(1, 5, 3) - si->adpcmInfo.initialPS = si->adpcmInfo.loopPS = *(u8*)si->buffer; -#if MUSY_TARGET == MUSY_TARGET_DOLPHIN - DCInvalidateRange(si->buffer, 1); -#endif - -#endif - - switch (si->type) { - case 0: - newsmp.compType = 2; - break; - case 1: - newsmp.extraData = &si->adpcmInfo; - newsmp.compType = 4; - -#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 0) - hwSetStreamLoopPS(si->voice, si->lastPSFromBuffer); - si->adpcmInfo.loopPS = si->adpcmInfo.initialPS = si->lastPSFromBuffer; -#endif - break; - } - - v = si->voice; - hwInitSamplePlayback(v, -1, &newsmp, 1, -1, synthVoice[v].id, 1, 1); - hwSetPitch(si->voice, (si->frq / (float)synthInfo.mixFrq) * 4096.f); -#if MUSY_VERSION <= MUSY_VERSION_CHECK(1, 5, 3) - hwSetVolume(si->voice, 0, si->vol * (1 / 127.f), (si->pan << 16), (si->span << 16), - si->auxa * (1 / 127.f), si->auxb * (1 / 127.f)); -#else - SetHWMix(si); -#endif - - hwStart(si->voice, si->studio); - si->state = 2; - if (!(si->flags & 0x20000)) { - hwFlushStream(si->buffer, 0, si->bytes, si->hwStreamHandle, NULL, 0); - } - break; - case 2: { - u32 off = hwGetPos(si->voice); - - if (si->type == 1) { - off = (off / 14) * 14; - } - - if (si->last != off) { - if (si->last < off) { - switch (si->type) { - case 0: { - len = si->updateFunction(si->buffer + si->last, off - si->last, NULL, 0, si->user); - if (len != 0 && si->state == 2) { - off = (si->last + len) % si->size; - if (!(si->flags & 0x20000)) { - if (off != 0) { - hwFlushStream(si->buffer, si->last * 2, (off - si->last) * 2, si->hwStreamHandle, - NULL, 0); - } else { - hwFlushStream(si->buffer, si->last * 2, (si->size - si->last) * 2, - si->hwStreamHandle, NULL, 0); - } - } - - si->last = off; - } - } break; - case 1: { - cpos = (si->last / 14) * 8; - if ((len = si->updateFunction((void*)((size_t)si->buffer + cpos), off - si->last, NULL, - 0, si->user)) != 0 && - si->state == 2) { - off = (si->last + len) % si->size; - - if (!(si->flags & 0x20000)) { - if (off != 0) { - hwFlushStream(si->buffer, cpos, ((off + 13) / 14) * 8 - cpos, si->hwStreamHandle, - NULL, 0); - } else { - hwFlushStream(si->buffer, cpos, (si->bytes) - cpos, si->hwStreamHandle, NULL, 0); - } - } - si->last = off; - } - } break; - } - } else if (off == 0) { - switch (si->type) { - case 0: - if ((len = si->updateFunction(si->buffer + si->last, si->size - si->last, NULL, 0, - si->user)) && - si->state == 2) { - off = (si->last + len) % si->size; - if (!(si->flags & 0x20000)) { - if (off == 0) { - hwFlushStream(si->buffer, si->last * 2, si->bytes - (si->last * 2), - si->hwStreamHandle, NULL, 0); - } else { - hwFlushStream(si->buffer, si->last * 2, (off - si->last) * 2, si->hwStreamHandle, - NULL, 0); - } - } - si->last = off; - } - break; - case 1: - cpos = ((si->last / 14) * 8); - if ((len = si->updateFunction((void*)((size_t)si->buffer + cpos), si->size - si->last, - NULL, 0, si->user)) && - si->state == 2) { - off = (si->last + len) % si->size; - if (!(si->flags & 0x20000)) { - if (off == 0) { - hwFlushStream(si->buffer, cpos, si->bytes - cpos, si->hwStreamHandle, NULL, 0); - } else { - hwFlushStream(si->buffer, cpos, ((off + 13) / 14) * 8 - cpos, si->hwStreamHandle, - NULL, 0); - } - } - - si->last = off; - } - break; - } - } else { - switch (si->type) { - case 0: - if ((len = si->updateFunction(si->buffer + si->last, si->size - si->last, si->buffer, - off, si->user)) && - si->state == 2) { - off = (si->last + len) % si->size; - - if (!(si->flags & 0x20000)) { - if (len > si->size - si->last) { - hwFlushStream(si->buffer, si->last * 2, (si->bytes - si->last * 2), - si->hwStreamHandle, NULL, 0); - hwFlushStream(si->buffer, 0, off * 2, si->hwStreamHandle, NULL, 0); - - } else if (off == 0) { - hwFlushStream(si->buffer, si->last * 2, (si->bytes - si->last * 2), - si->hwStreamHandle, NULL, 0); - } else { - hwFlushStream(si->buffer, si->last * 2, (off - si->last) * 2, si->hwStreamHandle, - NULL, 0); - } - } - si->last = off; - } - break; - case 1: { - cpos = (si->last / 14) * 8; - if ((len = si->updateFunction((void*)((size_t)si->buffer + cpos), si->size - si->last, - si->buffer, off, si->user)) && - si->state == 2) { - off = (si->last + len) % si->size; - - if (!(si->flags & 0x20000)) { - if (len > si->size - si->last) { - hwFlushStream(si->buffer, cpos, si->bytes - cpos, si->hwStreamHandle, NULL, 0); - hwFlushStream(si->buffer, 0, (off / 14) << 3, si->hwStreamHandle, NULL, 0); - } else if (off == 0) { - hwFlushStream(si->buffer, cpos, si->bytes - cpos, si->hwStreamHandle, NULL, 0); - } else { - hwFlushStream(si->buffer, cpos, ((off + 13) / 14) * 8 - cpos, si->hwStreamHandle, - NULL, 0); - } - } - si->last = off; - } - - } break; - } - } - - if (si->state == 2 && !(si->flags & 0x20000) && si->type == 1) { -#if MUSY_TARGET == MUSY_TARGET_DOLPHIN - hwSetStreamLoopPS(si->voice, - (si->lastPSFromBuffer = *(u32*)OSCachedToUncached(si->buffer) >> 24)); -#elif MUSY_TARGET == MUSY_TARGET_PC - hwSetStreamLoopPS(si->voice, (si->lastPSFromBuffer = *(u32*)si->buffer >> 24)); -#endif - } - } - } break; - } - } -} - -void streamCorrectLoops() {} - -void streamKill(u32 voice) { - STREAM_INFO* si = &streamInfo[voice]; - switch (si->state) { - case 1: - case 2: - if (si->state == 2) { - voiceUnblock(si->voice); - } - si->state = 3; - si->updateFunction(NULL, 0, NULL, 0, si->user); - break; - default: - break; - } -} - -static u32 GetPrivateIndex(u32 publicID) { - u32 i; // r31 - for (i = 0; i < 64; ++i) { - if (streamInfo[i].state != 0 && publicID == streamInfo[i].stid) { - return i; - } - } - - return -1; -} - -static u32 GeneratePublicID() { - u32 id; // r30 - u32 i; // r31 - - do { - if ((id = nextPublicID++) == -1) { - id = nextPublicID; - nextPublicID = id + 1; - } - for (i = 0; i < 64; ++i) { - if (streamInfo[i].state != 0 && id == streamInfo[i].stid) { - break; - } - } - } while (i != 64); - - return id; -} - -u32 sndStreamCallbackFrq(u32 msTime) { - s32 time; // r31 - time = ((msTime * 2 + 5) / 10) - 1; - streamCallDelay = time < 0 ? 0 : time; - return (streamCallDelay + 1) * 5; -} - -void sndStreamARAMUpdate(u32 stid, u32 off1, u32 len1, u32 off2, u32 len2) { - u32 i; // r30 - MUSY_ASSERT_MSG(sndActive, "Sound system is not initialized."); - hwDisableIrq(); - i = GetPrivateIndex(stid); - if (i != -1) { - switch (streamInfo[i].type) { - case 0: - off1 *= 2; - len1 *= 2; - off2 *= 2; - len2 *= 2; - break; - case 1: - off1 = (off1 / 14) * 8; - len1 = ((len1 + 13) / 14) * 8; - off2 = (off2 / 14) * 8; - len2 = ((len2 + 13) / 14) * 8; - break; - } - - if (len1 != 0) { - hwFlushStream(streamInfo[i].buffer, off1, len1, streamInfo[i].hwStreamHandle, 0, 0); - } - - if (len2 != 0) { - hwFlushStream(streamInfo[i].buffer, off2, len2, streamInfo[i].hwStreamHandle, 0, 0); - } - -#if MUSY_VERSION >= MUSY_VERSION_CHECK(1, 5, 4) - if (streamInfo[i].type == 1) { - streamInfo[i].lastPSFromBuffer = - (*(u32*)MUSY_CACHED_TO_UNCACHED_ADDR(streamInfo[i].buffer)) >> 24; - if (streamInfo[i].voice != -1) { - hwSetStreamLoopPS(streamInfo[i].voice, streamInfo[i].lastPSFromBuffer); - } - } -#else - if (streamInfo[i].type == 1) { - hwSetStreamLoopPS(streamInfo[i].voice, - *(u32*)MUSY_CACHED_TO_UNCACHED_ADDR(streamInfo[i].buffer) >> 24); - } -#endif - } else { - MUSY_DEBUG("ID is invalid.\n"); - } - hwEnableIrq(); -} - -static void CheckOutputMode(u8* pan, u8* span) { - if (synthFlags & 1) { - *pan = 64; - *span = 0; - } else if (!(synthFlags & 2)) { - *span = 0; - } -} - -#if MUSY_VERSION >= MUSY_VERSION_CHECK(1, 5, 4) -static void SetupVolumeAndPan(STREAM_INFO* si, u8 vol, u8 pan, u8 span, u8 auxa, u8 auxb) { - si->orgPan = pan; - si->orgSPan = span; - CheckOutputMode(&pan, &span); - si->vol = vol; - si->pan = pan; - si->span = span; - si->auxa = auxa; - si->auxb = auxb; -} -#endif - -#if MUSY_VERSION >= MUSY_VERSION_CHECK(1, 5, 4) -void streamOutputModeChanged() { - u32 i; - - hwDisableIrq(); - for (i = 0; i < synthInfo.voiceNum; ++i) { - if (streamInfo[i].state != 0) { - streamInfo[i].pan = streamInfo[i].orgPan; - streamInfo[i].span = streamInfo[i].orgSPan; - CheckOutputMode(&streamInfo[i].pan, &streamInfo[i].span); - if (streamInfo[i].state != 3) { - SetHWMix(&streamInfo[i]); - } - } - } - - hwEnableIrq(); -} -#endif - -SND_STREAMID sndStreamAllocEx(u8 prio, void* buffer, u32 samples, u32 frq, u8 vol, u8 pan, u8 span, - u8 auxa, u8 auxb, u8 studio, u32 flags, - u32 (*updateFunction)(void* buffer1, u32 len1, void* buffer2, - u32 len2, u32 user), - u32 user, SND_ADPCMSTREAM_INFO* adpcmInfo) { - u32 stid; // r29 - u32 i; // r31 - u32 bytes; // r25 - u32 j; // r28 - MUSY_ASSERT_MSG(sndActive, "Sound system is not initialized."); - hwDisableIrq(); - - for (i = 0; i < 64; ++i) { - if (streamInfo[i].state == 0) { - break; - } - } - - if (i != 64) { - stid = GeneratePublicID(); - streamInfo[i].stid = stid; - streamInfo[i].flags = flags; - bytes = sndStreamAllocLength(samples, flags); - streamInfo[i].buffer = (s16*)buffer; - streamInfo[i].size = samples; - streamInfo[i].bytes = bytes; - streamInfo[i].updateFunction = updateFunction; - streamInfo[i].voice = -1; - if (flags & 1) { - if (adpcmInfo != NULL) { - for (j = 0; j < 8; j++) { - streamInfo[i].adpcmInfo.coefTab[j][0] = adpcmInfo->coefTab[j][0]; - streamInfo[i].adpcmInfo.coefTab[j][1] = adpcmInfo->coefTab[j][1]; - } - streamInfo[i].adpcmInfo.numCoef = 8; - } - streamInfo[i].type = 1; - } else { - streamInfo[i].type = 0; - } - - streamInfo[i].frq = frq; - streamInfo[i].studio = studio; - streamInfo[i].prio = prio; -#if MUSY_VERSION <= MUSY_VERSION_CHECK(1, 5, 3) - CheckOutputMode(&pan, &span); - streamInfo[i].vol = vol; - streamInfo[i].pan = pan; - streamInfo[i].span = span; - streamInfo[i].auxa = auxa; - streamInfo[i].auxb = auxb; -#else - SetupVolumeAndPan(&streamInfo[i], vol, pan, span, auxa, auxb); -#endif - streamInfo[i].user = user; - streamInfo[i].nextStreamHandle = -1; - streamInfo[i].state = 3; - if ((streamInfo[i].hwStreamHandle = hwInitStream(bytes)) != 0xFF) { - if (!(flags & 0x10000) && !sndStreamActivate(stid)) { - MUSY_DEBUG("No voice could be allocated for streaming.\n"); - stid = -1; - } - } else { - MUSY_DEBUG("No ARAM memory could be allocated for streaming.\n"); - stid = -1; - } - if (stid == -1) { - streamInfo[i].state = 0; - } - } else { - stid = -1; - } - - hwEnableIrq(); - - return stid; -} - -u32 sndStreamAllocStereo(u8 prio, void* lBuffer, void* rBuffer, u32 samples, u32 frq, u8 vol, - u8 pan, u8 span, u8 auxa, u8 auxb, u8 studio, u32 flags, - SND_STREAM_UPDATE_CALLBACK updateFunction, u32 lUser, u32 rUser, - SND_ADPCMSTREAM_INFO* adpcmInfoL, SND_ADPCMSTREAM_INFO* adpcmInfoR) { - u32 stid[2]; // r1+0x38 - s16 rPan; // r31 - s16 lPan; // r30 - - lPan = pan - 64; - lPan = lPan < 0 ? 0 : lPan > 127 ? 127 : lPan; - rPan = pan + 64; - rPan = rPan < 0 ? 0 : rPan > 127 ? 127 : rPan; - - hwDisableIrq(); - - if ((stid[0] = sndStreamAllocEx(prio, lBuffer, samples, frq, vol, lPan, span, auxa, auxb, studio, - flags, updateFunction, lUser, adpcmInfoL)) != 0xFFFFFFFF) { - if ((stid[1] = sndStreamAllocEx(prio, rBuffer, samples, frq, vol, rPan, span, auxa, auxb, - studio, flags, updateFunction, rUser, adpcmInfoR)) == - 0xFFFFFFFF) { - sndStreamFree(stid[0]); - hwEnableIrq(); - return 0xFFFFFFFF; - } - - streamInfo[GetPrivateIndex(stid[0])].nextStreamHandle = stid[1]; - } - - hwEnableIrq(); - return stid[0]; -} - -u32 sndStreamAllocLength(u32 num, u32 flags) { - if (flags & 1) { - return (((num + 13) / 14) * 8 + 31) & ~31; - } - - return (num * 2 + 31) & ~31; -} - -void sndStreamADPCMParameter(u32 stid, SND_ADPCMSTREAM_INFO* adpcmInfo) { - u32 j; // r31 - u32 i; // r30 - MUSY_ASSERT_MSG(sndActive, "Sound system is not initialized."); - hwDisableIrq(); - i = GetPrivateIndex(stid); - if (i != -1) { - for (j = 0; j < 8; ++j) { - streamInfo[i].adpcmInfo.coefTab[j][0] = adpcmInfo->coefTab[j][0]; - streamInfo[i].adpcmInfo.coefTab[j][1] = adpcmInfo->coefTab[j][1]; - } - streamInfo[i].adpcmInfo.numCoef = 8; - if (streamInfo[i].nextStreamHandle != 0xffffffff) { - sndStreamADPCMParameter(streamInfo[i].nextStreamHandle, adpcmInfo); - } - } else { - MUSY_DEBUG("ID is invalid.\n"); - } - hwEnableIrq(); -} - -void sndStreamMixParameter(u32 stid, u8 vol, u8 pan, u8 span, u8 fxvol) { - u32 i; // r31 - MUSY_ASSERT_MSG(sndActive, "Sound system is not initialized."); - hwDisableIrq(); - i = GetPrivateIndex(stid); - - if (i != -1) { -#if MUSY_VERSION < MUSY_VERSION_CHECK(1, 5, 4) - CheckOutputMode(&pan, &span); - streamInfo[i].vol = vol; - streamInfo[i].pan = pan; - streamInfo[i].span = span; - streamInfo[i].auxa = fxvol; - streamInfo[i].auxb = 0; - hwSetVolume(streamInfo[i].voice, 0, vol * (1 / 127.f), (pan << 16), (span << 16), - fxvol * (1 / 127.f), 0.f); -#else - SetupVolumeAndPan(&streamInfo[i], vol, pan, span, fxvol, 0); - SetHWMix(&streamInfo[i]); -#endif - - if (streamInfo[i].nextStreamHandle != -1) { - sndStreamMixParameter(streamInfo[i].nextStreamHandle, vol, pan, span, fxvol); - } - } else { - MUSY_DEBUG("ID is invalid.\n"); - } - hwEnableIrq(); -} - -void sndStreamMixParameterEx(u32 stid, u8 vol, u8 pan, u8 span, u8 auxa, u8 auxb) { - u32 i; // r31 - MUSY_ASSERT_MSG(sndActive, "Sound system is not initialized."); - hwDisableIrq(); - i = GetPrivateIndex(stid); - if (i != -1) { -#if MUSY_VERSION <= MUSY_VERSION_CHECK(1, 5, 3) - streamInfo[i].vol = vol; - streamInfo[i].pan = pan; - streamInfo[i].span = span; - streamInfo[i].auxa = auxa; - streamInfo[i].auxb = auxb; - if (streamInfo[i].state == 2) { - hwSetVolume(streamInfo[i].voice, 0, vol * (1 / 127.f), (pan << 16), (span << 16), - auxa * (1 / 127.f), auxb * (1 / 127.f)); - } -#else - SetupVolumeAndPan(&streamInfo[i], vol, pan, span, auxa, auxb); - if (streamInfo[i].state == 2) { - SetHWMix(&streamInfo[i]); - } -#endif - - if (streamInfo[i].nextStreamHandle != -1) { - sndStreamMixParameterEx(streamInfo[i].nextStreamHandle, vol, pan, span, auxa, auxb); - } - - } else { - MUSY_DEBUG("ID is invalid.\n"); - } - - hwEnableIrq(); -} - -void sndStreamFrq(u32 stid, u32 frq) { - u32 i; // r31 - u16 pitch; // r27 - - MUSY_ASSERT_MSG(sndActive, "Sound system is not initialized."); - hwDisableIrq(); - i = GetPrivateIndex(stid); - if (i != -1) { - streamInfo[i].frq = frq; - if (streamInfo[i].state == 2) { - pitch = (4096.f * frq) / synthInfo.mixFrq; - hwSetPitch(streamInfo[i].voice, pitch); - } - - if (streamInfo[i].nextStreamHandle != -1) { - sndStreamFrq(streamInfo[i].nextStreamHandle, frq); - } - } else { - MUSY_DEBUG("ID is invalid.\n"); - } - - hwEnableIrq(); -} - -void sndStreamFree(u32 stid) { - u32 i; // r31 - MUSY_ASSERT_MSG(sndActive, "Sound system is not initialized."); - hwDisableIrq(); - i = GetPrivateIndex(stid); - if (i != -1) { - sndStreamDeactivate(stid); - hwExitStream(streamInfo[i].hwStreamHandle); - if (streamInfo[i].nextStreamHandle != -1) { - sndStreamFree(streamInfo[i].nextStreamHandle); - } - - streamInfo[i].state = 0; - } else { - MUSY_DEBUG("ID is invalid.\n"); - } - - hwEnableIrq(); -} - -bool sndStreamActivate(SND_STREAMID stid) { - u32 i; // r31 - u32 ret; // r28 - ret = 0; - MUSY_ASSERT_MSG(sndActive, "Sound system is not initialized."); - hwDisableIrq(); - i = GetPrivateIndex(stid); - if (i != -1) { - if (streamInfo[i].state == 3) { - if ((streamInfo[i].voice = voiceBlock(streamInfo[i].prio)) == -1) { - MUSY_DEBUG("No voice could be allocated for streaming.\n"); - hwEnableIrq(); - return 0; - } - - streamInfo[i].last = 0; - streamInfo[i].state = 1; - } else { - MUSY_DEBUG("Stream is already active.\n"); - } - - if (streamInfo[i].nextStreamHandle != -1) { - ret = sndStreamActivate(streamInfo[i].nextStreamHandle); - } else { - ret = 1; - } - } else { - MUSY_DEBUG("ID is invalid.\n"); - } - hwEnableIrq(); - return ret; -} - -void sndStreamDeactivate(u32 stid) { - u32 i; // r31 - MUSY_ASSERT_MSG(sndActive, "Sound system is not initialized."); - hwDisableIrq(); - i = GetPrivateIndex(stid); - if (i != -1) { - if (streamInfo[i].state == 1 || streamInfo[i].state == 2) { - voiceUnblock(streamInfo[i].voice); - streamInfo[i].state = 3; - } - - if (streamInfo[i].nextStreamHandle != -1) { - sndStreamDeactivate(streamInfo[i].nextStreamHandle); - } - } else { - MUSY_DEBUG("ID is invalid.\n"); - } - - hwEnableIrq(); -} diff --git a/src/musyx/runtime/synth.c b/src/musyx/runtime/synth.c deleted file mode 100644 index a3bed2f7..00000000 --- a/src/musyx/runtime/synth.c +++ /dev/null @@ -1,1428 +0,0 @@ - -#include "musyx/synth.h" -#include "musyx/assert.h" -#include "musyx/hardware.h" -#include "musyx/macros.h" -#include "musyx/sal.h" -#include "musyx/seq.h" -#include "musyx/snd.h" -#include "musyx/synthdata.h" - -#include - -static u32 synthTicksPerSecond[9][16]; -static SYNTH_JOBTAB synthJobTable[32]; -CTRL_DEST inpAuxA[8][4]; -CTRL_DEST inpAuxB[8][4]; -s32 synthGlobalVariable[16]; -synthITDInfo synthITDDefault[8]; -void* synthAuxBUser[8]; -SND_AUX_CALLBACK synthAuxBCallback[8]; -void* synthAuxAUser[8]; -SND_AUX_CALLBACK synthAuxACallback[8]; -u8 synthTrackVolume[64]; -SYNTHMasterFader synthMasterFader[32]; -SynthInfo synthInfo; - -u8 sndActive = 0; -static u8 synthJobTableIndex = 0; -u64 synthRealTime; -u8 synthIdleWaitActive; -SYNTH_MESSAGE_CALLBACK synthMessageCallback; -SYNTH_VOICE* synthVoice; -u32 synthFlags; -u32 synthMasterFaderActiveFlags; -u32 synthMasterFaderPauseActiveFlags; -u8 synthAuxAMIDI[8]; -u8 synthAuxAMIDISet[8]; -u8 synthAuxBMIDI[8]; -u8 synthAuxBMIDISet[8]; -u8 synthTrackVolume[64]; // size: 0x40 - -static void synthAddJob(SYNTH_VOICE* svoice, SYNTH_JOBTYPE jobType, u32 deltaTime); - -void synthSetBpm(u32 bpm, u8 set, u8 section) { - if (set == 0xFF) { - set = 8; - } - synthTicksPerSecond[set][section] = ((bpm << 3) * 1536) / 240; -} - -u32 synthGetTicksPerSecond(SYNTH_VOICE* svoice) { - return synthTicksPerSecond[svoice->midiSet == 0xFF ? 8 : svoice->midiSet][svoice->section]; -} - -static u32 apply_portamento(SYNTH_VOICE* svoice, u32 ccents, u32 deltaTime) { - u32 old_portCurPitch; // r31 - - if ((svoice->cFlags & 0x400) != 0 && (int)((svoice->portDuration - svoice->portTime) >> 8) > 0) { - - old_portCurPitch = svoice->portCurPitch; - svoice->portCurPitch += (int)deltaTime * ((int)(ccents - svoice->portCurPitch) >> 8) / - (int)((svoice->portDuration - svoice->portTime) >> 8); - - if ((old_portCurPitch < ccents && svoice->portCurPitch < ccents) || - (old_portCurPitch > ccents && (svoice->portCurPitch > ccents))) { - ccents = svoice->portCurPitch; - svoice->portTime += deltaTime; - } else { - svoice->portTime = svoice->portDuration; - } - } - return ccents; -} - -void synthInitPortamento(SYNTH_VOICE* svoice) { - if (svoice->cFlags & 0x20000) { - return; - } - - if (svoice->portType == 1) { - if (!(svoice->cFlags & 0x1000)) { - svoice->portTime = 0; - } else { - svoice->portTime = svoice->portDuration; - } - } else { - svoice->portTime = svoice->portDuration; - } - - svoice->portCurPitch = svoice->lastNote << 16; -} - -static u32 do_voice_portamento(u8 key, u8 midi, u8 midiSet, u32 isMaster, u32* rejected) { - u32 i; // r30 - u32 vid; // r29 - u32 id; // r27 - SYNTH_VOICE* sv; // r31 - SYNTH_VOICE* last_sv; // r28 - bool legatoVoiceIsStarting; // r26 - - legatoVoiceIsStarting = FALSE; - vid = SND_ID_ERROR; - - for (i = 0, sv = synthVoice; i < synthInfo.voiceNum; ++i, ++sv) { - if ( -#if MUSY_VERSION >= MUSY_VERSION_CHECK(1, 5, 4) - sv->block == 0 && -#endif - sv->id != SND_ID_ERROR && sv->midi == midi && sv->midiSet == midiSet) { - if ((sv->cFlags & 2) != 0) { - legatoVoiceIsStarting = TRUE; - } - if ((sv->cFlags & 0x10) != 0 && (sv->cFlags & 0x10000000008) != 0x8 && hwIsActive(i)) { - if (vid == SND_ID_ERROR && (sv->cFlags & 0x20002) == 0x20002) { - *rejected = TRUE; - return SND_ID_ERROR; - } - last_sv = sv; - sv->portCurPitch = (sv->curNote * 65536) + (sv->curDetune * 65536) / 100; - sv->lastNote = sv->curNote; - sv->curNote = key + ((sv->curNote & 0xff) - sv->orgNote); - sv->orgNote = key; - sv->curDetune = 0; - sv->portTime = 0; - sv->cFlags |= 0x20000; - vidRemoveVoiceReferences(&synthVoice[i]); - if (vid == SND_ID_ERROR) { - sv->child = SND_ID_ERROR; - sv->parent = SND_ID_ERROR; - vid = vidMakeNew(&synthVoice[i], isMaster); - id = sv->id; - } else { - synthVoice[id & 0xff].child = sv->id; - sv->parent = id; - id = sv->id; - vidMakeNew(&synthVoice[i], FALSE); - } - } - } - } - - if (vid != SND_ID_ERROR) { - voiceSetLastStarted(last_sv); - inpSetMidiLastNote(last_sv->midi, last_sv->midiSet, last_sv->curNote); - *rejected = FALSE; - } else { - *rejected = legatoVoiceIsStarting; - } - return vid; -} - -static u32 check_portamento(u8 key, u8 midi, u8 midiSet, u32 newVID, u32* vid) { - u32 rejected; // r1+0x14 - - if (inpGetMidiCtrl(65 /* TODO SND_MIDICTRL_? */, midi, midiSet) > 8064) { - *vid = do_voice_portamento(key & 0x7f, midi, midiSet, newVID, &rejected); - return !rejected; - } - *vid = 0xFFFFFFFF; - return 1; -} - -static u32 StartKeymap(u16 keymapID, s16 prio, u8 maxVoices, u16 allocId, u8 key, u8 vol, - u8 panning, u8 midi, u8 midiSet, u8 section, u16 step, u16 trackid, - u32 vidFlag, u8 vGroup, u8 studio, u32 itd); - -static u32 StartLayer(u16 layerID, s16 prio, u8 maxVoices, u16 allocId, u8 key, u8 vol, u8 panning, - u8 midi, u8 midiSet, u8 section, u16 step, u16 trackid, u32 vidFlag, - u8 vGroup, u8 studio, u32 itd) { - u16 n; // r1+0x38 - u32 vid; // r26 - u32 new_id; // r1+0x34 - u32 id; // r27 - LAYER* l; // r31 - s32 p; // r30 - s32 k; // r29 - u8 v; // r25 - u8 mKey; // r24 - - vid = SND_ID_ERROR; - if ((l = dataGetLayer(layerID, &n)) == NULL) { - goto end; - } - - mKey = key & 0x7f; - for (; n != 0; --n, ++l) { - if (l->id == 0xffff || l->keyLow > mKey || l->keyHigh < mKey) { - continue; - } - - k = mKey + l->transpose; - k = CLAMP(k, 0, 127); - - if ((l->id & 0xC000) == 0) { - if (check_portamento(k, midi, midiSet, -#if MUSY_VERSION >= MUSY_VERSION_CHECK(1, 5, 4) - 0, -#else - vidFlag, -#endif - &new_id)) { - if (new_id != 0xFFFFFFFF) { - goto apply_new_id; - } else { - goto start_new_id; - } - } - continue; - } - - start_new_id: - if ((l->panning & 0x80) == 0) { - p = l->panning - 0x40; - p += panning; - // TODO - // p = CLAMP(p, 0, 0x7f); - p = CLAMP_INV(p, 0, 0x7f); - } else { - p = 0x80; - } - - v = (vol * l->volume) / 0x7f; - prio += l->prioOffset; - prio = CLAMP(prio, 0, 0xff); - - switch (l->id & 0xC000) { - case 0: - new_id = macStart(l->id, prio, maxVoices, allocId, k | key & 0x80, v, p, midi, midiSet, - section, step, trackid, 0, vGroup, studio, itd); - break; - case 0x4000: - new_id = StartKeymap(l->id, prio, maxVoices, allocId, k | key & 0x80, v, p, midi, midiSet, - section, step, trackid, 0, vGroup, studio, itd); - break; - case 0x8000: - new_id = StartLayer(l->id, prio, maxVoices, allocId, k | key & 0x80, v, p, midi, midiSet, - section, step, trackid, 0, vGroup, studio, itd); - break; - } - - if (new_id != SND_ID_ERROR) { - apply_new_id: - if (vid == SND_ID_ERROR) { - if (vidFlag != 0) { - vid = vidMakeRoot(&synthVoice[new_id & 0xff]); - } else { - vid = new_id; - } - } else { - synthVoice[id & 0xff].child = new_id; - synthVoice[new_id & 0xff].parent = id; - } - id = new_id; - while (synthVoice[id & 0xff].child != SND_ID_ERROR) { -#if MUSY_VERSION >= MUSY_VERSION_CHECK(1, 5, 4) - synthVoice[id & 0xff].block = 1; -#endif - id = synthVoice[id & 0xff].child; - } -#if MUSY_VERSION >= MUSY_VERSION_CHECK(1, 5, 4) - synthVoice[id & 0xff].block = 1; -#endif - } - } - -end: - return vid; -} - -static u32 StartKeymap(u16 keymapID, s16 prio, u8 maxVoices, u16 allocId, u8 key, u8 vol, - u8 panning, u8 midi, u8 midiSet, u8 section, u16 step, u16 trackid, - u32 vidFlag, u8 vGroup, u8 studio, u32 itd) { - u8 o; // r30 - KEYMAP* keymap; // r31 - s32 p; // r26 - s32 k; // r29 - u32 vid; // r1+0x34 - - if ((keymap = dataGetKeymap(keymapID)) != NULL) { - o = key & 0x7f; - if (keymap[o].id != 0xffff && (keymap[o].id & 0xc000) != 0x4000) { - if ((keymap[o].panning & 0x80) == 0) { - p = (keymap[key].panning - 0x40); - p += panning; - if (p < 0) { - panning = 0; - } else if (p > 0x7f) { - panning = 0x7f; - } else { - panning = p; - } - } else { - panning = 0x80; - } - - k = (key & 0x7f) + keymap[o].transpose; - k = CLAMP(k, 0, 127); - - prio += keymap[o].prioOffset; - prio = CLAMP(prio, 0, 0xff); - - if ((keymap[o].id & 0xc000) == 0) { - if (!check_portamento(k & 0xff, midi, midiSet, vidFlag, &vid)) { - return 0xffffffff; - } - if (vid != 0xffffffff) { - return vid; - } - return macStart(keymap[o].id, prio, maxVoices, allocId, k | key & 0x80, vol, panning, midi, - midiSet, section, step, trackid, vidFlag, vGroup, studio, itd); - } - - return StartLayer(keymap[o].id, prio, maxVoices, allocId, k | key & 0x80, vol, panning, midi, - midiSet, section, step, trackid, vidFlag & 0xff, vGroup, studio, itd); - } - } - - return SND_ID_ERROR; -} - -#if MUSY_VERSION >= MUSY_VERSION_CHECK(1, 5, 4) -static void unblockAllAllocatedVoices(u32 vid) { - u32 id; // r31 - - id = vidGetInternalId(vid); - MUSY_ASSERT_MSG(id != SND_ID_ERROR, "*** Alloc unblock: ID is illegal"); - while (id != SND_ID_ERROR) { - synthVoice[id & 0xff].block = 0; - id = synthVoice[id & 0xff].child; - } -} -#endif - -u32 synthStartSound(u16 id, u8 prio, u8 max, -#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 1) - u32 sourceID, -#endif - u8 key, u8 vol, u8 panning, u8 midi, u8 midiSet, u8 section, u16 step, - u16 trackid, u8 vGroup, s16 prioOffset, u8 studio, u32 itd) { - prio += prioOffset; - prio = CLAMP(prio, 0, 0xff); - - switch (id & 0xC000) { - case 0: { - u32 vid; // r1+0x34 - if (!check_portamento(key, midi, midiSet, 1, &vid)) { - return SND_ID_ERROR; - } - if (vid != SND_ID_ERROR) { - return vid; - } - return macStart(id, prio, max, id, key, vol, panning, midi, midiSet, section, step, trackid, 1, - vGroup, studio, itd); - } - case 0x4000: { -#if MUSY_VERSION >= MUSY_VERSION_CHECK(1, 5, 4) - u32 vid = StartKeymap(id, prio, max, id, key, vol, panning, midi, midiSet, section, step, - trackid, 1, vGroup, studio, itd); - if (vid != SND_ID_ERROR) { - unblockAllAllocatedVoices(vid); - } - return vid; -#else - return StartKeymap(id, prio, max, id, key, vol, panning, midi, midiSet, section, step, trackid, - 1, vGroup, studio, itd); -#endif - } - case 0x8000: { -#if MUSY_VERSION >= MUSY_VERSION_CHECK(1, 5, 4) - u32 vid = StartLayer(id, prio, max, id, key, vol, panning, midi, midiSet, section, step, - trackid, 1, vGroup, studio, itd); - if (vid != SND_ID_ERROR) { - unblockAllAllocatedVoices(vid); - } - return vid; -#else - return StartLayer(id, prio, max, id, key, vol, panning, midi, midiSet, section, step, trackid, - 1, vGroup, studio, itd); -#endif - } - default: - return SND_ID_ERROR; - } -} - -static u32 convert_cents(SYNTH_VOICE* svoice, u32 ccents) { - u32 curDetune; // r30 - u32 cpitch; // r31 - - cpitch = sndGetPitch(ccents / 65536, svoice->sInfo) * 65536; - if ((curDetune = ccents & 0xffff) != 0) { - cpitch += curDetune * ((sndPitchUpOne(cpitch / 65536) & 0xffff) - (cpitch / 65536 & 0xffff)); - } - return cpitch; -} - -static void UpdateTimeMIDICtrl(SYNTH_VOICE* sv) { - if (!sv->timeUsedByInput) { - return; - } - - sv->timeUsedByInput = 0; -#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 3) - sv->midiDirtyFlags = 0x7fff; -#else - sv->midiDirtyFlags = 0x1fff; -#endif -} - -static void LowPrecisionHandler(u32 i) { - u32 j; // r30 - s32 pbend; // r29 - u32 ccents; // r28 - u32 cpitch; // r26 - u16 Modulation; // r24 - u16 portamento; // r25 - u32 lowDeltaTime; // r27 - SYNTH_VOICE* sv; // r31 - u32 cntDelta; // r20 - u32 addFactor; // r19 - u16 adsr_start; // r1+0xE - u16 adsr_delta; // r1+0xC - s32 vrange; // r23 - s32 voff; // r22 - - sv = &synthVoice[i]; - if (!hwIsActive(i) && sv->addr == NULL) { - goto end; - } - - lowDeltaTime = synthRealTime - sv->lastLowCallTime; - sv->lastLowCallTime = synthRealTime; - for (j = 0; j < 2; ++j) { - if (sv->lfo[j].period == 0) { - continue; - } - sv->lfo[j].time += lowDeltaTime; - sv->lfo[j].value = - sndSin((sv->lfo[j].time % sv->lfo[j].period * 16) / (sv->lfo[j].period / 256)); - if (sv->lfo[j].value != sv->lfo[j].lastValue) { - sv->lfo[j].lastValue = sv->lfo[j].value; - if (sv->lfoUsedByInput[j]) { - sv->lfoUsedByInput[j] = 0; -#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 3) - sv->midiDirtyFlags |= 0x7fff; -#else - sv->midiDirtyFlags |= 0x1fff; -#endif - } - } - } - - if ((sv->cFlags & 0x2000) != 0) { - sv->vibCurTime += lowDeltaTime; - sv->vibCurOffset = sndSin((sv->vibCurTime % sv->vibPeriod * 16) / (sv->vibPeriod / 256)); - } - - if (sv->sweepNum[0] | sv->sweepNum[1]) { -#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 3) - cntDelta = (lowDeltaTime << 8) >> 4; - addFactor = (lowDeltaTime << 4) >> 4; -#else - cntDelta = (lowDeltaTime & 0x00ffffff) << 4; - addFactor = lowDeltaTime & 0x0fffffff; -#endif - for (j = 0; j < 2; ++j) { - if (sv->sweepNum[j] == 0) { - continue; - } - sv->sweepCnt[j] -= cntDelta; - if (sv->sweepCnt[j] <= 0) { - sv->sweepCnt[j] = sv->sweepNum[j] << 16; - sv->sweepOff[j] = 0; - } else { - sv->sweepOff[j] += (sv->sweepAdd[j] >> 12) * addFactor; - } - } - } - - for (j = 0; j < 2; ++j) { - if (sv->panning[j] == sv->panTarget[j]) { - continue; - } - sv->panTime[j] -= lowDeltaTime; - if ((s32)sv->panTime[j] <= 0) { - sv->panning[j] = sv->panTarget[j]; - sv->panTime[j] = 0; - } else { - sv->panning[j] = sv->panTarget[j] - (sv->panTime[j] / 256) * sv->panDelta[j]; - sv->panning[j] = CLAMP_INV((s32)sv->panning[j], 0, 0x7f0000u); - } - - sv->cFlags |= 0x200000000000; - } - - if ((sv->cFlags & 0x20000000000) != 0 && - adsrHandleLowPrecision(&sv->pitchADSR, &adsr_start, &adsr_delta)) { - sv->cFlags &= ~0x20000000000; - } - - ccents = sv->curNote * 65536 + (sv->curDetune * 65536) / 100; - if ((sv->cFlags & -#if MUSY_VERSION >= MUSY_VERSION_CHECK(1, 5, 4) - 0x10030 -#else - 0x10010 -#endif - ) != 0) { - if (sv->midi != 0xff) { - pbend = inpGetPitchBend(sv); - sv->pbLast = pbend; - goto pbend_adjust; - } - } else { - pbend = sv->pbLast; - pbend_adjust: - if (pbend != 0x2000) { - pbend -= 0x2000; - if (pbend < 0) { - ccents += sv->pbLowerKeyRange * pbend * 8; - } else { - ccents += sv->pbUpperKeyRange * pbend * 8; - } - } - } - - if ((sv->cFlags & 0x2000) != 0) { - Modulation = inpGetModulation(sv); - vrange = sv->vibKeyRange * 256 + (sv->vibCentRange * 256) / 100; - if (sv->vibModAddScale != 0) { -#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 3) - vrange += (sv->vibModAddScale * (Modulation >> 7)) >> 7; -#elif MUSY_VERSION >= MUSY_VERSION_CHECK(1, 5, 4) - vrange += (sv->vibModAddScale * ((Modulation & 0x1ffff) >> 7)) >> 7; -#else - vrange += (sv->vibModAddScale * ((Modulation >> 7) & 0x1ff)) >> 7; -#endif - } - if ((sv->cFlags & 0x4000) != 0) { -#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 3) - voff = (sv->vibCurOffset * (Modulation >> 7)) >> 7; -#elif MUSY_VERSION >= MUSY_VERSION_CHECK(1, 5, 4) - voff = (sv->vibCurOffset * ((Modulation & 0x1ffff) >> 7)) >> 7; -#else - voff = (sv->vibCurOffset * ((Modulation >> 7) & 0x1ff)) >> 7; -#endif - } else { - voff = sv->vibCurOffset; - } - ccents += (vrange * voff) >> 4; - } - - if (sv->midi != 0xff) { - portamento = inpGetMidiCtrl(SND_MIDICTRL_PORTAMENTO, sv->midi, sv->midiSet); - if (portamento != sv->portLastCtrlState || (sv->cFlags & 0x21000) == 0x20000) { - if (portamento <= 0x1f80) { - sv->cFlags &= ~0x400; - } else { - if ((sv->cFlags & 0x400) == 0) { - synthInitPortamento(sv); - } - sv->cFlags |= 0x400; - } - sv->cFlags |= 0x1000; - sv->portLastCtrlState = portamento; - } - } - - ccents = apply_portamento(sv, ccents, lowDeltaTime); - if ((sv->cFlags & 0x20000000000) != 0) { - ccents += sv->pitchADSRRange * (sv->pitchADSR.currentVolume >> 16) >> 7; - } - - cpitch = convert_cents(sv, ccents); - cpitch += sv->sweepOff[0] + sv->sweepOff[1]; - cpitch = ((cpitch >> 16) * inpGetDoppler(sv)) >> 13; - sv->curPitch = cpitch; - - hwSetPitch(i, cpitch); - synthAddJob(sv, 0, 0xf00); - -end: - UpdateTimeMIDICtrl(sv); -} - -static void ZeroOffsetHandler(u32 i) { - SYNTH_VOICE* sv; // r31 - u32 lowDeltaTime; // r26 - u16 Modulation; // r25 - f32 vol; // f30 - f32 auxa; // f25 - f32 auxb; // f24 - f32 f; // f27 - f32 voiceVol; // f28 - bool volUpdate; // r30 - f32 lfo; // f23 - f32 scale; // f31 - f32 mscale; // f22 - s32 pan; // r28 - f32 preVol; // f26 - f32 postVol; // f29 -#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 3) - unsigned short para; // r22 - unsigned short a0; // r1+0xA - unsigned short b0; // r1+0x8 - unsigned long frq; // r21 -#endif - - sv = &synthVoice[i]; - if (!hwIsActive(i) && sv->addr == NULL) { - goto end; - } - - lowDeltaTime = synthRealTime - sv->lastZeroCallTime; - sv->lastZeroCallTime = synthRealTime; - - if ((sv->cFlags & 0x8000) != 0) { - sv->envCurrent += sv->envDelta * (lowDeltaTime >> 8); - if (sv->envDelta < 0) { - if ((s32)sv->envTarget >= (s32)sv->envCurrent) { - sv->envCurrent = sv->envTarget; - sv->cFlags &= ~0x8000; - } - } else if ((s32)sv->envTarget <= (s32)sv->envCurrent) { - sv->envCurrent = sv->envTarget; - sv->cFlags &= ~0x8000; - } - sv->volume = sv->envCurrent; - volUpdate = TRUE; - } else { - volUpdate = (sv->cFlags & 0x100000000000) != 0; - } - - sv->cFlags &= ~0x100000000000; - - f = synthMasterFader[sv->vGroup].pauseVol * synthMasterFader[sv->vGroup].volume * - synthMasterFader[sv->fxFlag ? 22 : 21].volume; - - if (sv->track != 0xff) { - vol = f * (f32)synthTrackVolume[sv->track] * (1.f / 127.f); - } else { - vol = f; - } - - if (vol != sv->lastVolFaderScale) { - sv->lastVolFaderScale = vol; - volUpdate = TRUE; - } - - voiceVol = (f32)sv->volume * (1.f / (8192.f * 1016.f) /* 1.201479e-07 */); - - if ((sv->treScale | sv->treModAddScale) != 0) { - Modulation = inpGetModulation(sv); - lfo = (f32)(8192 - (8192 - ((s16)inpGetTremolo(sv) - 8192) >> 1)) * (1.f / 8192.f); - mscale = 1.f - (f32)Modulation * (4096 - sv->treModAddScale) * 1.490207e-08f /* 1/(8192^2)? */; - scale = (f32)sv->treScale * mscale * (1.f / 4096.f); - if (sv->treCurScale < scale) { - if ((sv->treCurScale += 0.2f) > scale) { - sv->treCurScale = scale; - } - } else if (sv->treCurScale > scale) { - if ((sv->treCurScale -= 0.2f) < scale) { - sv->treCurScale = scale; - } - } - voiceVol *= 1.f - lfo * (1.f - sv->treCurScale); - volUpdate = TRUE; - } - - if ((synthFlags & 1) == 0) { - if ((sv->cFlags & 0x200000000000) != 0 || (sv->midiDirtyFlags & 0x6) != 0) { - sv->cFlags &= ~0x200000000000; - pan = sv->panning[0] + (inpGetPanning(sv) - 8192) * 0x200; - sv->lastPan = CLAMP_INV(pan, 0, 0x7f0000); - - if ((synthFlags & 2) != 0) { - if ((sv->lastSPan = sv->panning[1] + inpGetSurPanning(sv) * 512) > 0x7f0000) { - sv->lastSPan = 0x7f0000; - } - } else { - sv->lastSPan = 0; - } - - volUpdate = TRUE; - } else if ((synthFlags & 2) == 0) { - sv->lastSPan = 0; - } - } else { - sv->lastPan = 0x400000; - sv->lastSPan = 0; - volUpdate |= (sv->cFlags & 0x200000000000) != 0; - sv->cFlags &= ~0x200000000000; - } - - if (volUpdate || (sv->midiDirtyFlags & 0xf01) != 0) { - preVol = voiceVol; - postVol = voiceVol * vol * (f32)inpGetVolume(sv) * (1.f / 16383.f) /* 1/16384? */; - auxa = ((f32)sv->revVolOffset * (1.f / 127.f)) + - ((preVol * (f32)inpGetPreAuxA(sv) * (1.f / 16383.f) /* 1/16384? */) + - ((f32)sv->revVolScale * - (postVol * (f32)inpGetReverb(sv) * (1.f / 16383.f) /* 1/16384? */) * (1.f / 127.f))); - auxb = (preVol * (f32)inpGetPreAuxB(sv) * (1.f / 16383.f) /* 1/16384? */) + - (postVol * (f32)inpGetPostAuxB(sv) * (1.f / 16383.f) /* 1/16384? */); - sv->curOutputVolume = (u16)(postVol * 32767.f); - hwSetVolume(i, sv->volTable, postVol, sv->lastPan, sv->lastSPan, auxa, auxb); - } -#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 3) - if (sv->midiDirtyFlags & 0x6000) { - if (inpGetFilterSwitch(sv) > 0x1FFF) { - para = inpGetFilterParameter(sv); - frq = sv->lpfLowerFrqBoundary + (u32)((1.f - ((1.f / 16383.f) * para)) * - (sv->lpfUpperFrqBoundary - sv->lpfLowerFrqBoundary)); - hwLowPassFrqToCoef(frq, &a0, &b0); - hwSetFilter(i, 1, a0, b0); - } else { - hwSetFilter(i, 0, 0, 0); - } - } -#endif - if (sv->age != 0) { - if ((s32)(sv->age -= sv->ageSpeed * lowDeltaTime) < 0) { - sv->age = 0; - } - hwSetPriority(i, sv->prio << 24 | sv->age >> 15); - } - - synthAddJob(sv, SYNTH_JOBTYPE_ZERO, (5 - hwGetTimeOffset()) * 256); - -end: - UpdateTimeMIDICtrl(sv); -} - -static void EventHandler(u32 i) { - SYNTH_VOICE* sv; // r31 - - sv = &synthVoice[i]; - if (!hwIsActive(i) && sv->addr == NULL) { - goto end; - } - - macSetPedalState(sv, inpGetPedal(sv) > 0x1f80); - - if ((sv->cFlags & 0x20) != 0) { - sv->cFlags &= ~0x20; - sv->cFlags |= 0x10; - hwStart(i, sv->studio); - } - - if ((sv->cFlags & 0x10000000090) == 0x90) { - sv->cFlags &= ~0x90; - hwKeyOff(i); - if ((sv->cFlags & 0x20000000000) != 0 && adsrRelease(&sv->pitchADSR)) { - sv->cFlags &= ~0x20000000000; - } - } - -end: - UpdateTimeMIDICtrl(sv); -} - -static void synthInitJobQueue() { - u8 i; // r31 - - for (i = 0; i < 32; ++i) { - synthJobTable[i].lowPrecision = NULL; - synthJobTable[i].event = NULL; - synthJobTable[i].zeroOffset = NULL; - } - - synthJobTableIndex = 0; -} - -static void synthAddJob(SYNTH_VOICE* svoice, SYNTH_JOBTYPE jobType, u32 deltaTime) { - SYNTH_QUEUE* newJq; // r31 - SYNTH_QUEUE** root; // r30 - u8 jobTabIndex; // r29 - SYNTH_JOBTAB* jobTab; // r28 - - jobTabIndex = ((deltaTime / 256) + synthJobTableIndex) & 0x1f; - jobTab = &synthJobTable[jobTabIndex]; - - switch (jobType) { - case SYNTH_JOBTYPE_LOW: - newJq = &svoice->lowPrecisionJob; - if (newJq->jobTabIndex != 0xff) { - if (newJq->jobTabIndex == jobTabIndex) { - return; - } - if (newJq->next != NULL) { - newJq->next->prev = newJq->prev; - } - if (newJq->prev != NULL) { - newJq->prev->next = newJq->next; - } else { - synthJobTable[newJq->jobTabIndex].lowPrecision = newJq->next; - } - } - root = &jobTab->lowPrecision; - break; - case SYNTH_JOBTYPE_ZERO: - newJq = &svoice->zeroOffsetJob; - if (newJq->jobTabIndex != 0xff) { - if (newJq->jobTabIndex == jobTabIndex) { - return; - } - if (newJq->next != NULL) { - newJq->next->prev = newJq->prev; - } - if (newJq->prev != NULL) { - newJq->prev->next = newJq->next; - } else { - synthJobTable[newJq->jobTabIndex].zeroOffset = newJq->next; - } - } - root = &jobTab->zeroOffset; - break; - case SYNTH_JOBTYPE_EVENT: - newJq = &svoice->eventJob; - if (newJq->jobTabIndex != 0xff) { - return; - } - root = &jobTab->event; - break; - default: - break; - } - - newJq->jobTabIndex = jobTabIndex; - if ((newJq->next = *root) != NULL) { - (*root)->prev = newJq; - } - newJq->prev = NULL; - *root = newJq; -} - -void synthStartSynthJobHandling(SYNTH_VOICE* svoice) { - svoice->lastLowCallTime = synthRealTime; - svoice->lastZeroCallTime = synthRealTime; - synthAddJob(svoice, SYNTH_JOBTYPE_LOW, 0); - synthAddJob(svoice, SYNTH_JOBTYPE_ZERO, 0); -} - -void synthForceLowPrecisionUpdate(SYNTH_VOICE* svoice) { - synthAddJob(svoice, SYNTH_JOBTYPE_LOW, 0); - synthAddJob(svoice, SYNTH_JOBTYPE_ZERO, 0); -} - -void synthKeyStateUpdate(SYNTH_VOICE* svoice) { synthAddJob(svoice, SYNTH_JOBTYPE_EVENT, 0); } - -static void HandleJobQueue(SYNTH_QUEUE** queueRoot, void (*handler)(u32)) { - SYNTH_QUEUE* jq; // r31 - SYNTH_QUEUE* nextJq; // r30 - - jq = *queueRoot; - while (jq != NULL) { - nextJq = jq->next; - jq->jobTabIndex = 0xff; - if (!synthVoice[jq->voice].block) { - handler(jq->voice); - } - jq = nextJq; - } - - *queueRoot = NULL; -} - -static void HandleVoices() { - SYNTH_JOBTAB* jTab = &synthJobTable[synthJobTableIndex]; // r31 - HandleJobQueue(&jTab->lowPrecision, LowPrecisionHandler); - HandleJobQueue(&jTab->event, EventHandler); - HandleJobQueue(&jTab->zeroOffset, ZeroOffsetHandler); - synthJobTableIndex = synthJobTableIndex + 1 & 0x1f; -} - -static void HandleFaderTermination(SYNTHMasterFader* smf) { - switch (smf->seqMode) { - case 1: - seqStop(smf->seqId); - break; - case 2: - seqPause(smf->seqId); - break; - case 3: - seqMute(smf->seqId, 0, 0); - break; - } -} - -void synthHandle(u32 deltaTime) { - u32 i; // r29 - u32 s; // r30 - SYNTHMasterFader* smf; // r31 - u32 testFlag; // r27 - - if (synthInfo.numSamples == 0) { - return; - } - - macHandle(deltaTime); - HandleVoices(); - - if (hwGetTimeOffset() == 0) { - if ((synthMasterFaderActiveFlags | synthMasterFaderPauseActiveFlags) != 0) { - for (i = 0, smf = synthMasterFader, testFlag = 1; i < 32; testFlag <<= 1, ++i, ++smf) { - if ((synthMasterFaderActiveFlags & testFlag) != 0) { - smf->volume = smf->target - smf->time * (smf->target - smf->start); - if ((smf->time -= smf->deltaTime) <= 0.f) { - smf->volume = smf->target; - HandleFaderTermination(smf); - if ((synthMasterFaderActiveFlags &= ~testFlag) == 0 && - synthMasterFaderPauseActiveFlags == 0) { - break; - } - } - } - - if ((synthMasterFaderPauseActiveFlags & testFlag) != 0) { - smf->pauseVol = smf->pauseTarget - smf->pauseTime * (smf->pauseTarget - smf->pauseStart); - if ((smf->pauseTime -= smf->pauseDeltaTime) <= 0.f) { - smf->pauseVol = smf->pauseTarget; - if ((synthMasterFaderPauseActiveFlags &= ~testFlag) == 0 && - synthMasterFaderActiveFlags == 0) { - break; - } - } - } - } - } - - for (s = 0; s < 8; ++s) { - if (synthAuxAMIDI[s] != 0xff) { - SND_AUX_INFO info; // r1+0x18 - for (i = 0; i < SND_AUX_NUMPARAMETERS; ++i) { - info.data.parameterUpdate.para[i] = - inpGetAuxA(s, i, synthAuxAMIDI[s], synthAuxAMIDISet[s]); - } - synthAuxACallback[s](SND_AUX_REASON_PARAMETERUPDATE, &info, synthAuxAUser[s]); - } - - if (synthAuxBMIDI[s] != 0xff) { - SND_AUX_INFO info; // r1+0xC - for (i = 0; i < SND_AUX_NUMPARAMETERS; ++i) { - info.data.parameterUpdate.para[i] = - inpGetAuxB(s, i, synthAuxBMIDI[s], synthAuxBMIDISet[s]); - } - synthAuxBCallback[s](SND_AUX_REASON_PARAMETERUPDATE, &info, synthAuxBUser[s]); - } - } - } - - hwFrameDone(); - synthRealTime += deltaTime; -} - -u8 synthFXGetMaxVoices(u16 fid) { - FX_TAB* fx; - if ((fx = dataGetFX(fid)) != NULL) { - return fx->maxVoices; - } - - return 0; -} - -u32 synthFXStart(u16 fid, u8 vol, u8 pan, u8 studio, u32 itd) { - FX_TAB* fx; - u32 v; - v = 0xFFFFFFFF; - if ((fx = dataGetFX(fid)) != NULL) { - if (vol == 0xFF) { - vol = fx->volume; - } - - if (pan == 0xFF) { - pan = fx->panning; - } - - v = synthStartSound(fx->macro, fx->priority, fx->maxVoices, -#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 1) - 0, // TODO -#endif - fx->key | 0x80, vol, pan, 0xFF, 0xFF, 0, 0, 0xFF, fx->vGroup, 0, studio, - itd); - } - - return v; -} - -#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 3) -int synthCheckFXRealloc(unsigned short fid) { - struct FX_TAB* fx; // r31 - unsigned long allocId; // r30 - unsigned long currentAllocId; // r1+0x8 - - fx = dataGetFX(fid); - if (fx == NULL) { - return 0; - } - - allocId = fid | 0x80000000; - - if (!voiceAllocatePeek(fx->priority, fx->maxVoices, allocId, TRUE, ¤tAllocId)) { - return 0; - } - return allocId == currentAllocId; -} -#endif - -bool synthFXSetCtrl(u32 vid, u8 ctrl, u8 value) { - u32 i; // r31 - u32 ret; // r29 - - ret = FALSE; - vid = vidGetInternalId(vid); - - while (vid != SND_ID_ERROR) { - i = vid & 0xff; - if (vid == synthVoice[i].id) { - if ((synthVoice[i].cFlags & 0x2) != 0) { - inpSetMidiCtrl(ctrl, i, synthVoice[i].setup.midiSet, value); - } else { - inpSetMidiCtrl(ctrl, i, synthVoice[i].midiSet, value); - } - - vid = synthVoice[i].child; - ret = TRUE; - } else { - return ret; - } - } - - return ret; -} - -bool synthFXSetCtrl14(u32 vid, u8 ctrl, u16 value) { - u32 i; // r31 - u32 ret; // r29 - - ret = FALSE; - vid = vidGetInternalId(vid); - - while (vid != SND_ID_ERROR) { - i = vid & 0xff; - if (vid == synthVoice[i].id) { - if ((synthVoice[i].cFlags & 0x2) != 0) { - inpSetMidiCtrl14(ctrl, i, synthVoice[i].setup.midiSet, value); - } else { - inpSetMidiCtrl14(ctrl, i, synthVoice[i].midiSet, value); - } - - vid = synthVoice[i].child; - ret = TRUE; - } else { - return ret; - } - } - - return ret; -} - -void synthFXCloneMidiSetup(SYNTH_VOICE* dest, SYNTH_VOICE* src) { - inpFXCopyCtrl(SND_MIDICTRL_VOLUME, dest, src); - inpFXCopyCtrl(SND_MIDICTRL_PANNING, dest, src); - inpFXCopyCtrl(SND_MIDICTRL_REVERB, dest, src); - inpFXCopyCtrl(SND_MIDICTRL_PITCHBEND, dest, src); - inpFXCopyCtrl(SND_MIDICTRL_DOPPLER, dest, src); -} - -static bool synthFXVolume(u32 vid, u8 vol) { - u32 i; // r31 - u32 ret; // r29 - - ret = FALSE; - vid = vidGetInternalId(vid); - - while (vid != SND_ID_ERROR) { - i = vid & 0xff; - if (vid == synthVoice[i].id) { - if ((synthVoice[i].cFlags & 0x2) != 0) { - inpSetMidiCtrl(SND_MIDICTRL_VOLUME, i, synthVoice[i].setup.midiSet, vol); - } else { - inpSetMidiCtrl(SND_MIDICTRL_VOLUME, i, synthVoice[i].midiSet, vol); - } - - vid = synthVoice[i].child; - ret = TRUE; - } else { - return ret; - } - } - - return ret; -} - -bool synthSendKeyOff(u32 voiceid) { - u32 i; // r30 - bool ret; // r29 - - ret = FALSE; - - if (sndActive != 0) { - voiceid = vidGetInternalId(voiceid); - - while (voiceid != SND_ID_ERROR) { - i = voiceid & 0xff; - - if (voiceid == synthVoice[i].id) { - macSetExternalKeyoff(&synthVoice[i]); - ret = TRUE; - } - - voiceid = synthVoice[i].child; - } - } - - return ret; -} - -u16 synthGetVolume(u32 vid) { - u32 i; // r30 - - vid = vidGetInternalId(vid); - if (vid != SND_ID_ERROR) { - i = vid & 0xff; - if (vid == synthVoice[i].id && (synthVoice[i].cFlags & 0x2) == 0) { - return synthVoice[i].curOutputVolume; - } - } - - return 0; -} - -static void SetupFader(SYNTHMasterFader* smf, u8 volume, u32 time, u8 seqMode, u32 seqId) { - smf->seqMode = seqMode; - smf->seqId = seqId; - if (time != 0) { - smf->start = smf->volume; - smf->target = (f32)volume * (1.f / 127.f); - smf->time = 1.f; - smf->deltaTime = 1280.f / (f32)time; - } else { - smf->volume = smf->target = (f32)volume * (1.f / 127.f); - if (smf->seqId != SND_ID_ERROR) { - HandleFaderTermination(smf); - } - } -} - -void synthVolume(u8 volume, u16 time, u8 vGroup, u8 seqMode, u32 seqId) { - u32 ltime; // r1+0x14 - u32 i; // r30 - u8 type; // r29 - SYNTHMasterFader* smf; // r31 - - if ((ltime = time) != 0) { - sndConvertMs(<ime); - } - - switch (vGroup) { - case SND_ALL_VOLGROUPS: - for (smf = synthMasterFader, i = 0; i < 32; ++i, ++smf) { - if (smf->type == 0 || smf->type == 1) { - SetupFader(smf, volume, ltime, seqMode, SND_ID_ERROR); - synthMasterFaderActiveFlags |= 1 << i; - } - } - return; - - case SND_USERALL_VOLGROUPS: - for (smf = synthMasterFader, i = 0; i < 32; ++i, ++smf) { - if (smf->type == 2 || smf->type == 3) { - SetupFader(smf, volume, ltime, seqMode, SND_ID_ERROR); - synthMasterFaderActiveFlags |= 1 << i; - } - } - return; - - case SND_USERMUSIC_VOLGROUPS: - type = 2; - goto setup_type; - - case SND_USERFX_VOLGROUPS: - type = 3; - goto setup_type; - - case SND_MUSIC_VOLGROUPS: - type = 0; - goto setup_type; - - case SND_FX_VOLGROUPS: - type = 1; - goto setup_type; - - setup_type: - for (smf = synthMasterFader, i = 0; i < 32; ++i, ++smf) { - if (smf->type == type) { - SetupFader(smf, volume, ltime, seqMode, SND_ID_ERROR); - synthMasterFaderActiveFlags |= 1 << i; - } - } - return; - - default: - SetupFader(&synthMasterFader[vGroup], volume, ltime, seqMode, seqId); - synthMasterFaderActiveFlags |= 1 << vGroup; - return; - } -} - -bool synthIsFadeOutActive(u8 vGroup) { - if (synthMasterFader[vGroup].type != 4 && (synthMasterFaderActiveFlags & (1 << vGroup)) != 0 && - synthMasterFader[vGroup].start > synthMasterFader[vGroup].target) { - return TRUE; - } - return FALSE; -} - -void synthPauseVolume(u8 volume, u16 time, u8 vGroup) { - u32 i; // r30 - u32 ltime; // r1+0x10 - u8 type; // r28 - SYNTHMasterFader* smf; // r31 - - if (time == 0) { - ++time; - } - ltime = time & 0xffff; - sndConvertMs(<ime); - - switch (vGroup) { - case SND_ALL_VOLGROUPS: - for (smf = synthMasterFader, i = 0; i < 32; ++i, ++smf) { - if (synthMasterFader[i].type == 0 || synthMasterFader[i].type == 1) { - smf->pauseStart = smf->pauseVol; - smf->pauseTarget = (f32)volume * (1.f / 127.f); - smf->pauseTime = 1.f; - smf->pauseDeltaTime = 1280.f / (f32)ltime; - synthMasterFaderActiveFlags |= 1 << i; - } - } - return; - - case SND_USERALL_VOLGROUPS: - for (smf = synthMasterFader, i = 0; i < 32; ++i, ++smf) { - if (synthMasterFader[i].type == 2 || synthMasterFader[i].type == 3) { - smf->pauseStart = smf->pauseVol; - smf->pauseTarget = (f32)volume * (1.f / 127.f); - smf->pauseTime = 1.f; - smf->pauseDeltaTime = 1280.f / (f32)ltime; - synthMasterFaderActiveFlags |= 1 << i; - } - } - return; - - case SND_USERMUSIC_VOLGROUPS: - type = 2; - goto setup_type; - - case SND_USERFX_VOLGROUPS: - type = 3; - goto setup_type; - - case SND_MUSIC_VOLGROUPS: - type = 0; - goto setup_type; - - case SND_FX_VOLGROUPS: - type = 1; - goto setup_type; - - setup_type: - for (smf = synthMasterFader, i = 0; i < 32; ++i, ++smf) { - if (synthMasterFader[i].type == type) { - smf->pauseStart = smf->pauseVol; - smf->pauseTarget = (f32)volume * (1.f / 127.f); - smf->pauseTime = 1.f; - smf->pauseDeltaTime = 1280.f / (f32)ltime; - synthMasterFaderActiveFlags |= 1 << i; - } - } - return; - - default: - smf = &synthMasterFader[vGroup]; - smf->pauseStart = smf->pauseVol; - smf->pauseTarget = (f32)volume * (1.f / 127.f); - smf->pauseTime = 1.f; - smf->pauseDeltaTime = 1280.f / (f32)ltime; - synthMasterFaderActiveFlags |= 1 << vGroup; - return; - } -} - -void synthSetMusicVolumeType(u8 vGroup, u8 type) { - if (sndActive) { - synthMasterFader[vGroup].type = type; - } -} - -static u32 synthHWMessageHandler(u32 mesg, u32 voiceID) { - u32 ret; // r30 - - ret = FALSE; - - switch (mesg) { - case 0: - if (synthVoice[voiceID & 0xff].block != 0) { - break; - } - vsSampleEndNotify(hwGetVirtualSampleID(voiceID & 0xff)); - if (voiceID != synthVoice[voiceID & 0xff].id) { - break; - } - macSampleEndNotify(&synthVoice[voiceID & 0xff]); - break; - - case 1: - voiceKill(voiceID & 0xff); - break; - - case 2: - ret = vsSampleStartNotify(voiceID); - break; - - case 3: - vsSampleEndNotify(hwGetVirtualSampleID(voiceID & 0xff)); - break; - - default: - MUSY_ASSERT(FALSE); - break; - } - - return ret; -} - -void synthInit(u32 mixFrq, u32 numVoices) { - u32 i; // r31 - - synthRealTime = 0; - synthInfo.mixFrq = mixFrq; - synthSetBpm(120, 255, 0); - synthFlags = 0; - synthMessageCallback = NULL; - - synthVoice = salMalloc(numVoices * sizeof(SYNTH_VOICE)); - if (synthVoice == NULL) { - MUSY_FATAL("Fatal: Could not allocate synthesizer voice array."); - } - memset(synthVoice, 0, numVoices * sizeof(SYNTH_VOICE)); - - for (i = 0; i < numVoices; ++i) { - synthVoice[i].id = 0xffffffff; - synthVoice[i].cFlags = 0; - synthVoice[i].age = 0; - synthVoice[i].prio = 0; - synthVoice[i].midi = 0xff; - synthVoice[i].volume = 0; - synthVoice[i].volTable = 0; - synthVoice[i].revVolScale = 128; - synthVoice[i].revVolOffset = 0; - synthVoice[i].panning[0] = synthVoice[i].panTarget[0] = 0x400000; - synthVoice[i].panning[1] = synthVoice[i].panTarget[1] = 0; - synthVoice[i].sweepOff[0] = 0; - synthVoice[i].sweepOff[1] = 0; - synthVoice[i].sweepNum[0] = 0; - synthVoice[i].sweepNum[1] = 0; - synthVoice[i].block = 0; - synthVoice[i].vGroup = 23; - synthVoice[i].keyGroup = 0; - synthVoice[i].itdMode = 1; - synthVoice[i].lfo[0].period = 0; - synthVoice[i].lfo[0].value = 0; - synthVoice[i].lfo[0].lastValue = 0x7fff; - synthVoice[i].lfo[1].period = 0; - synthVoice[i].lfo[1].value = 0; - synthVoice[i].lfo[1].lastValue = 0x7fff; - synthVoice[i].portTime = 25600; - synthVoice[i].portType = 0; - synthVoice[i].studio = 0; - synthVoice[i].lowPrecisionJob.voice = i; - synthVoice[i].lowPrecisionJob.jobTabIndex = 0xff; - synthVoice[i].zeroOffsetJob.voice = i; - synthVoice[i].zeroOffsetJob.jobTabIndex = 0xff; - synthVoice[i].eventJob.voice = i; - synthVoice[i].eventJob.jobTabIndex = 0xff; - } - - for (i = 0; i < 32; ++i) { - synthMasterFader[i].volume = 0.f; - synthMasterFader[i].pauseVol = 1.f; - synthMasterFader[i].type = 4; - } - - synthMasterFaderActiveFlags = 0; - synthMasterFaderPauseActiveFlags = 0; - synthMasterFader[31].type = 1; - - for (i = 0; i < 8; ++i) { - synthMasterFader[i + 23].type = 0; - } - - synthMasterFader[21].volume = 1.f; - synthMasterFader[22].volume = 1.f; - inpInit(0); - - for (i = 0; i < 8; ++i) { - synthAuxACallback[i] = NULL; - synthAuxAMIDI[i] = 0xff; - synthAuxBCallback[i] = NULL; - synthAuxBMIDI[i] = 0xff; - synthITDDefault[i].sfx = 0; - synthITDDefault[i].music = 0; - } - - macInit(); - vidInit(); - synthInitAllocationAids(); - - for (i = 0; i < 16; ++i) { - synthGlobalVariable[i] = 0; - } - - voiceInitLastStarted(); - synthInitJobQueue(); - hwSetMesgCallback(synthHWMessageHandler); -} - -void synthExit() { salFree(synthVoice); } diff --git a/src/musyx/runtime/synth_ac.c b/src/musyx/runtime/synth_ac.c deleted file mode 100644 index d89a6d5c..00000000 --- a/src/musyx/runtime/synth_ac.c +++ /dev/null @@ -1,72 +0,0 @@ -#include "musyx/synth.h" - - -static float toneup_tab[128] = { - 1.0f, 1.0594635f, 1.1224623f, 1.1892071f, 1.2599211f, 1.3348398f, 1.4142141f, - 1.4983072f, 1.5874014f, 1.6817932f, 1.7817984f, 1.8877487f, 2.000001f, 2.118927f, - 2.2449245f, 2.378415f, 2.519843f, 2.6696806f, 2.8284283f, 2.9966154f, 3.1748037f, - 3.3635874f, 3.5635967f, 3.7754984f, 4.000002f, 4.237854f, 4.48985f, 4.75683f, - 5.039686f, 5.339362f, 5.6568565f, 5.993231f, 6.3496075f, 6.7271748f, 7.1271935f, - 7.5509977f, 8.000004f, 8.475709f, 8.979701f, 9.513661f, 10.079373f, 10.678724f, - 11.313714f, 11.986463f, 12.699215f, 13.4543495f, 14.254387f, 15.101996f, 16.000008f, - 16.951418f, 17.959402f, 19.027323f, 20.158747f, 21.357449f, 22.627428f, 23.972925f, - 25.39843f, 26.908699f, 28.508774f, 30.203993f, 32.000015f, 33.902836f, 35.918804f, - 38.054646f, 40.317493f, 42.714897f, 45.254856f, 47.94585f, 50.79686f, 53.817398f, - 57.017548f, 60.407986f, 64.00003f, 67.80567f, 71.83761f, 76.10929f, 80.63499f, - 85.429794f, 90.50971f, 95.8917f, 101.59372f, 107.634796f, 114.035095f, 120.81597f, - 128.00006f, 135.61134f, 143.67522f, 152.21858f, 161.26997f, 170.85959f, 181.01942f, - 191.7834f, 203.18744f, 215.26959f, 228.07019f, 241.63194f, 256.00012f, 271.2227f, - 287.35043f, 304.43716f, 322.53995f, 341.71918f, 362.03885f, 383.5668f, 406.37488f, - 430.53918f, 456.14038f, 483.2639f, 512.00024f, 542.4454f, 574.70087f, 608.8743f, - 645.0799f, 683.43835f, 724.0777f, 767.1336f, 812.74976f, 861.07837f, 912.28076f, - 966.5278f, 1024.0005f, 1084.8907f, 1149.4017f, 1217.7487f, 1290.1598f, 1366.8767f, - 1448.1554f, 1534.2672f, - -}; -static float tonedown_tab[128] = { - 1.0f, 0.94387436f, 0.8908987f, 0.8408966f, 0.7937002f, 0.74915314f, - 0.7071066f, 0.66741943f, 0.62996006f, 0.59460354f, 0.56123066f, 0.52973175f, - 0.5f, 0.47193718f, 0.44544888f, 0.4204483f, 0.3968506f, 0.37457657f, - 0.35355282f, 0.33370972f, 0.3149805f, 0.2973013f, 0.2806158f, 0.26486588f, - 0.25f, 0.23596859f, 0.22272491f, 0.21022415f, 0.1984253f, 0.18728828f, - 0.17677689f, 0.16685486f, 0.15748978f, 0.14865112f, 0.14030743f, 0.13243294f, - 0.125f, 0.11798382f, 0.11136246f, 0.105112076f, 0.09921265f, 0.09364414f, - 0.08838844f, 0.08342743f, 0.07874489f, 0.07432556f, 0.07015419f, 0.06621647f, - 0.0625f, 0.058992386f, 0.05568123f, 0.052556038f, 0.049606323f, 0.046822548f, - 0.04419422f, 0.041713715f, 0.039372444f, 0.03716278f, 0.035077095f, 0.033107758f, - 0.03125f, 0.029496193f, 0.027840614f, 0.026277542f, 0.024803162f, 0.023410797f, - 0.022096634f, 0.020856857f, 0.019686699f, 0.01858139f, 0.01753807f, 0.016553879f, - 0.015625f, 0.01474762f, 0.01391983f, 0.013138771f, 0.012401581f, 0.011705399f, - 0.011048317f, 0.010428429f, 0.009842873f, 0.009290695f, 0.008769035f, 0.008276939f, - 0.0078125f, 0.00737381f, 0.006959915f, 0.0065698624f, 0.0062007904f, 0.0058526993f, - 0.0055246353f, 0.005214691f, 0.004921913f, 0.0046453476f, 0.0043849945f, 0.0041389465f, - 0.00390625f, 0.003686905f, 0.0034799576f, 0.0032844543f, 0.0031003952f, 0.0029268265f, - 0.0027618408f, 0.0026073456f, 0.0024604797f, 0.002322197f, 0.0021924973f, 0.0020694733f, - 0.001953125f, 0.0018434525f, 0.0017404556f, 0.0016422272f, 0.0015497208f, 0.0014629364f, - 0.0013809204f, 0.0013036728f, 0.0012302399f, 0.0011615753f, 0.0010957718f, 0.0010347366f, - 9.765625E-4f, 9.2220306E-4f, 8.69751E-4f, 8.211136E-4f, 7.753372E-4f, 7.314682E-4f, - 6.904602E-4f, 6.5135956E-4f, - -}; - -s32 sndPitchUpOne(u16 note) { return note * 1.0594631f; } - -u32 sndGetPitch(u8 key, u32 sInfo) { - u8 okey; // r31 - float frq; // r63 - if (sInfo == 0xffffffff) { - sInfo = 0x40005622; - } - - okey = sInfo >> 24; - - if (key != okey) { - frq = (float)(sInfo & 0xFFFFFF) * - (okey < key ? toneup_tab[key - okey] : tonedown_tab[okey - key]); - - } else { - frq = sInfo & 0xFFFFFF; - } - - return (4096.f * frq) / synthInfo.mixFrq; -} diff --git a/src/musyx/runtime/synth_adsr.c b/src/musyx/runtime/synth_adsr.c deleted file mode 100644 index 2e8b1cbd..00000000 --- a/src/musyx/runtime/synth_adsr.c +++ /dev/null @@ -1,219 +0,0 @@ - -#include "musyx/adsr.h" -#include "musyx/synth_dbtab.h" - -#include - -extern float powf(float, float); - -static u32 adsrGetIndex(ADSR_VARS* adsr) { - s32 i = 193 - ((adsr->currentIndex + 0x8000) >> 16); - return i < 0 ? 0 : i; -} - -u32 adsrConvertTimeCents(s32 tc) { return 1000.f * powf(2.f, 1.2715658e-08f * tc); } - -u32 salChangeADSRState(ADSR_VARS* adsr) { - u32 VoiceDone; // r30 - VoiceDone = FALSE; - - switch (adsr->mode) { - case 0: - switch (adsr->state) { - case 0: { - if ((adsr->cnt = adsr->data.dls.aTime)) { - adsr->state = 1; - adsr->currentVolume = 0; - adsr->currentDelta = 0x7fff0000 / (adsr->data).dls.aTime; - goto done; - } - } - case 1: { - if ((adsr->cnt = adsr->data.dls.dTime)) { - adsr->state = 2; - adsr->currentVolume = 0x7fff0000; - adsr->currentDelta = - -((0x7fff0000 - (adsr->data.dls.sLevel * 0x10000)) / adsr->data.dls.dTime); - goto done; - } - } - case 2: { - if (adsr->data.dls.sLevel != 0) { - adsr->state = 3; - adsr->currentVolume = adsr->data.dls.sLevel << 0x10; - adsr->currentDelta = 0; - goto done; - } - } - case 4: { - break; - } - default: - goto done; - } - adsr->currentVolume = 0; - VoiceDone = TRUE; - break; - case 1: - switch (adsr->state) { - case 0: { - if ((adsr->cnt = adsr->data.dls.aTime)) { - adsr->state = 1; - if (adsr->data.dls.aMode == 0) { - adsr->currentVolume = 0; - adsr->currentDelta = 0x7fff0000 / adsr->cnt; - } else { - adsr->currentVolume = adsr->currentIndex = 0; - adsr->currentDelta = 0xc10000 / adsr->cnt; - } - goto done; - } - } - case 1: { - adsr->cnt = adsr->data.dls.dTime * (((0xc1u - adsr->data.dls.sLevel) * 0x10000) / 0xc1) >> 16; - if (adsr->cnt) { - adsr->state = 2; - adsr->currentVolume = 0x7fff0000; - adsr->currentIndex = 0xc10000; - adsr->currentDelta = -(((0xc1 - (u32)(adsr->data).dls.sLevel) * 0x10000) / adsr->cnt); - goto done; - } - } - case 2: { - if (adsr->data.dls.sLevel) { - adsr->state = 3; - adsr->currentIndex = adsr->data.dls.sLevel << 16; - adsr->currentVolume = dspAttenuationTab[adsrGetIndex(adsr)] << 16; - adsr->currentDelta = 0; - goto done; - } - break; - } - case 4: { - break; - } - default: - goto done; - } - adsr->currentVolume = 0; - VoiceDone = TRUE; - break; - } -done: - return VoiceDone; -} - -u32 adsrSetup(ADSR_VARS* adsr) { - adsr->state = 0; - salChangeADSRState(adsr); -} - -u32 adsrStartRelease(ADSR_VARS* adsr, u32 rtime) { - switch (adsr->mode) { - case 0: - adsr->state = 4; - adsr->cnt = rtime; - if (rtime == 0) { - adsr->cnt = 1; - adsr->currentDelta = 0; - return 1; - } - adsr->currentDelta = -(adsr->currentVolume / rtime); - break; - case 1: - if (adsr->data.dls.aMode == 0 && adsr->state == 1) { - adsr->currentIndex = (193 - dspScale2IndexTab[adsr->currentVolume >> 21]) * 0x10000; - } - - adsr->cnt = (u32)(3.238342E-4f * (float)adsr->currentIndex * (float)rtime) >> 12; - adsr->state = 4; - if (adsr->cnt == 0) { - adsr->cnt = 1; - adsr->currentDelta = adsr->currentIndex = adsr->currentVolume = 0; - return 1; - } - - adsr->currentDelta = -(adsr->currentIndex / adsr->cnt); - break; - } - - return 0; -} - -bool adsrRelease(ADSR_VARS* adsr) { - switch (adsr->mode) { - case 0: - case 1: - return adsrStartRelease(adsr, adsr->data.dls.rTime); - } - - return FALSE; -} - -u32 adsrHandle(ADSR_VARS* adsr, u16* adsr_start, u16* adsr_delta) { - s32 old_volume; // r29 - bool VoiceDone; // r28 - s32 vDelta; // r27 - - VoiceDone = FALSE; - - switch (adsr->mode) { - case 0: - if (adsr->state != 3) { - old_volume = adsr->currentVolume; - adsr->currentVolume += adsr->currentDelta; - *adsr_start = old_volume >> 16; - if (adsr->currentDelta >= 0) { - *adsr_delta = adsr->currentDelta >> 21; - } else { - *adsr_delta = -(-adsr->currentDelta >> 21); - } - - if (--adsr->cnt == 0) { - VoiceDone = salChangeADSRState(adsr); - } - } else { - *adsr_start = adsr->currentVolume >> 16; - *adsr_delta = 0; - } - break; - case 1: - if (adsr->state != 3) { - old_volume = adsr->currentVolume; - if (adsr->data.dls.aMode == 0 && adsr->state == 1) { - adsr->currentVolume += adsr->currentDelta; - } else { - adsr->currentIndex += adsr->currentDelta; - adsr->currentVolume = dspAttenuationTab[adsrGetIndex(adsr)] << 16; - } - *adsr_start = old_volume >> 16; - vDelta = adsr->currentVolume - old_volume; - if (vDelta >= 0) { - *adsr_delta = vDelta >> 21; - } else { - *adsr_delta = -(-vDelta >> 21); - } - - if (--adsr->cnt == 0) { - VoiceDone = salChangeADSRState(adsr); - } - } else { - *adsr_start = adsr->currentVolume >> 16; - *adsr_delta = 0; - } - break; - } - - return VoiceDone; -} -u32 adsrHandleLowPrecision(ADSR_VARS* adsr, u16* adsr_start, u16* adsr_delta) { - u8 i; // r31 - - for (i = 0; i < 15; ++i) { - if (adsrHandle(adsr, adsr_start, adsr_delta)) { - return 1; - } - } - - return 0; -} diff --git a/src/musyx/runtime/synth_dbtab.c b/src/musyx/runtime/synth_dbtab.c deleted file mode 100644 index b7c85292..00000000 --- a/src/musyx/runtime/synth_dbtab.c +++ /dev/null @@ -1,114 +0,0 @@ -#include "musyx/synth_dbtab.h" - -#ifdef __cplusplus -extern "C" { -#endif - -u16 dspAttenuationTab[194] = { - 0x7FFF, 0x78D6, 0x7213, 0x6BB1, 0x65AB, 0x5FFB, 0x5A9D, 0x558B, 0x50C2, 0x4C3E, 0x47FA, 0x43F3, - 0x4026, 0x3C8F, 0x392C, 0x35F9, 0x32F4, 0x301B, 0x2D6A, 0x2ADF, 0x2879, 0x2636, 0x2412, 0x220E, - 0x2026, 0x1E5A, 0x1CA7, 0x1B0D, 0x1989, 0x181C, 0x16C2, 0x157C, 0x1449, 0x1326, 0x1214, 0x1111, - 0x101D, 0x0F36, 0x0E5C, 0x0D8E, 0x0CCC, 0x0C15, 0x0B68, 0x0AC5, 0x0A2A, 0x0999, 0x090F, 0x088D, - 0x0813, 0x079F, 0x0732, 0x06CB, 0x066A, 0x060E, 0x05B7, 0x0565, 0x0518, 0x04CF, 0x048A, 0x0449, - 0x040C, 0x03D2, 0x039B, 0x0367, 0x0337, 0x0309, 0x02DD, 0x02B4, 0x028D, 0x0269, 0x0246, 0x0226, - 0x0207, 0x01EA, 0x01CE, 0x01B4, 0x019C, 0x0185, 0x016F, 0x015B, 0x0147, 0x0135, 0x0124, 0x0113, - 0x0104, 0x00F5, 0x00E7, 0x00DA, 0x00CE, 0x00C3, 0x00B8, 0x00AD, 0x00A4, 0x009B, 0x0092, 0x008A, - 0x0082, 0x007B, 0x0074, 0x006D, 0x0067, 0x0061, 0x005C, 0x0057, 0x0052, 0x004D, 0x0049, 0x0045, - 0x0041, 0x003D, 0x003A, 0x0037, 0x0033, 0x0031, 0x002E, 0x002B, 0x0029, 0x0026, 0x0024, 0x0022, - 0x0020, 0x001E, 0x001D, 0x001B, 0x001A, 0x0018, 0x0017, 0x0015, 0x0014, 0x0013, 0x0012, 0x0011, - 0x0010, 0x000F, 0x000E, 0x000D, 0x000D, 0x000C, 0x000B, 0x000A, 0x000A, 0x0009, 0x0009, 0x0008, - 0x0008, 0x0007, 0x0007, 0x0006, 0x0006, 0x0006, 0x0005, 0x0005, 0x0005, 0x0004, 0x0004, 0x0004, - 0x0004, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, - 0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, - 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, -}; - -u8 dspScale2IndexTab[1024] = { - 0xC1, 0x78, 0x6C, 0x65, 0x60, 0x5C, 0x59, 0x57, 0x54, 0x52, 0x50, 0x4F, 0x4D, 0x4C, 0x4B, 0x49, - 0x48, 0x47, 0x46, 0x45, 0x44, 0x44, 0x43, 0x42, 0x41, 0x40, 0x40, 0x3F, 0x3F, 0x3E, 0x3D, 0x3D, - 0x3C, 0x3C, 0x3B, 0x3B, 0x3A, 0x3A, 0x39, 0x39, 0x38, 0x38, 0x37, 0x37, 0x37, 0x36, 0x36, 0x36, - 0x35, 0x35, 0x34, 0x34, 0x34, 0x33, 0x33, 0x33, 0x32, 0x32, 0x32, 0x32, 0x31, 0x31, 0x31, 0x30, - 0x30, 0x30, 0x30, 0x2F, 0x2F, 0x2F, 0x2F, 0x2E, 0x2E, 0x2E, 0x2E, 0x2D, 0x2D, 0x2D, 0x2D, 0x2C, - 0x2C, 0x2C, 0x2C, 0x2C, 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x29, 0x29, - 0x29, 0x29, 0x29, 0x29, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, - 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x24, 0x24, - 0x24, 0x24, 0x24, 0x24, 0x24, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, - 0x1F, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1D, 0x1D, 0x1D, 0x1D, - 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, - 0x1C, 0x1C, 0x1C, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1A, - 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x19, 0x19, 0x19, 0x19, - 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, - 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, - 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x14, 0x14, 0x14, 0x14, 0x14, - 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x13, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, - 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, - 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0E, 0x0E, 0x0E, - 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, - 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, - 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, - 0x0D, 0x0D, 0x0D, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, - 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, - 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, - 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, - 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, - 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, - 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, - 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, - 0x09, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -float dspDLSVolTab[129] = { - 0.000000, 0.000062, 0.000248, 0.000558, 0.000992, 0.001550, 0.002232, 0.003038, 0.003968, - 0.005022, 0.006200, 0.007502, 0.008928, 0.010478, 0.012152, 0.013950, 0.015872, 0.017918, - 0.020088, 0.022382, 0.024800, 0.027342, 0.030008, 0.032798, 0.035712, 0.038750, 0.041912, - 0.045198, 0.048608, 0.052142, 0.055800, 0.059582, 0.063488, 0.067518, 0.071672, 0.075950, - 0.080352, 0.084878, 0.089528, 0.094302, 0.099200, 0.104222, 0.109368, 0.114638, 0.120032, - 0.125550, 0.131192, 0.136958, 0.142848, 0.148862, 0.155000, 0.161262, 0.167648, 0.174158, - 0.180792, 0.187550, 0.194432, 0.201438, 0.208568, 0.215822, 0.223200, 0.230702, 0.238328, - 0.246078, 0.253953, 0.261951, 0.270073, 0.278319, 0.286689, 0.295183, 0.303801, 0.312543, - 0.321409, 0.330399, 0.339513, 0.348751, 0.358113, 0.367599, 0.377209, 0.386943, 0.396801, - 0.406783, 0.416889, 0.427119, 0.437473, 0.447951, 0.458553, 0.469279, 0.480129, 0.491103, - 0.502201, 0.513423, 0.524769, 0.536239, 0.547833, 0.559551, 0.571393, 0.583359, 0.595449, - 0.607663, 0.620001, 0.632463, 0.645049, 0.657759, 0.670593, 0.683551, 0.696633, 0.709839, - 0.723169, 0.736623, 0.750202, 0.763904, 0.777730, 0.791680, 0.805754, 0.819952, 0.834274, - 0.848720, 0.863290, 0.877984, 0.892802, 0.907744, 0.922810, 0.938000, 0.953314, 0.968752, - 0.984314, 1.000000, 1.000000, -}; - -#ifdef __cplusplus -} -#endif diff --git a/src/musyx/runtime/synth_vsamples.c b/src/musyx/runtime/synth_vsamples.c deleted file mode 100644 index 217a6fd9..00000000 --- a/src/musyx/runtime/synth_vsamples.c +++ /dev/null @@ -1,349 +0,0 @@ -#include "musyx/musyx.h" - -#include "musyx/assert.h" -#include "musyx/hardware.h" -#include "musyx/macros.h" -#include "musyx/snd.h" -#include "musyx/voice.h" - -VS vs; - -void vsInit() { - u32 i; - vs.numBuffers = 0; - for (i = 0; i < 64; i++) { - vs.voices[i] = 0xFF; - } - - vs.nextInstID = 0; - vs.callback = NULL; -} - -u16 vsNewInstanceID() { - u8 i; // r31 - u16 instID; // r29 - do { - instID = vs.nextInstID++; - i = 0; - for (; i < vs.numBuffers; ++i) { - if (vs.streamBuffer[i].state != 0 && vs.streamBuffer[i].info.instID == instID) { - break; - } - } - } while (i != vs.numBuffers); - - return instID; -} - -u8 vsAllocateBuffer() { - u8 i; - - for (i = 0; i < vs.numBuffers; ++i) { - if (vs.streamBuffer[i].state != 0) { - continue; - } - vs.streamBuffer[i].state = 1; - vs.streamBuffer[i].last = 0; - return i; - } - - return 0xFF; -} - -void vsFreeBuffer(u8 bufferIndex) { - vs.streamBuffer[bufferIndex].state = 0; - vs.voices[vs.streamBuffer[bufferIndex].voice] = 0xFF; -} - -u32 vsSampleStartNotify(unsigned char voice) { - u8 sb; // r29 - u8 i; // r28 - size_t addr; // r27 - - for (i = 0; i < vs.numBuffers; ++i) { - if (vs.streamBuffer[i].state != 0 && vs.streamBuffer[i].voice == voice) { - vsFreeBuffer(i); - } - } - - sb = vs.voices[voice] = vsAllocateBuffer(); - if (sb != 0xFF) { - addr = aramGetStreamBufferAddress(vs.voices[voice], 0); - hwSetVirtualSampleLoopBuffer(voice, (void*)addr, vs.bufferLength); - vs.streamBuffer[sb].info.smpID = hwGetSampleID(voice); - vs.streamBuffer[sb].info.instID = vsNewInstanceID(); - vs.streamBuffer[sb].smpType = hwGetSampleType(voice); - vs.streamBuffer[sb].voice = voice; - if (vs.callback != NULL) { - vs.callback(0, &vs.streamBuffer[sb].info); - - return (vs.streamBuffer[sb].info.instID << 8) | voice; - } - hwSetVirtualSampleLoopBuffer(voice, 0, 0); - } else { - hwSetVirtualSampleLoopBuffer(voice, 0, 0); - } - - return 0xFFFFFFFF; -} - -void vsSampleEndNotify(u32 pubID) { - u8 sb; - u8 voice; - - if (pubID != 0xFFFFFFFF) { - u8 id = (u8)pubID; - sb = vs.voices[id]; - if (sb != 0xFF) { - if (vs.streamBuffer[sb].info.instID == ((pubID >> 8) & 0xFFFF)) { - if (vs.callback != NULL) { - vs.callback(2, &vs.streamBuffer[sb].info); - } - vsFreeBuffer(sb); - } - } - } -} - -void vsUpdateBuffer(struct VS_BUFFER* sb, unsigned long cpos) { - u32 len; // r29 - u32 off; // r27 - - if (sb->last == cpos) { - return; - } - if ((s32)sb->last < cpos) { - switch (sb->smpType) { - case 5: - sb->info.data.update.off1 = (sb->last / 14) * 8; - sb->info.data.update.len1 = cpos - sb->last; - sb->info.data.update.off2 = 0; - sb->info.data.update.len2 = 0; - if ((len = vs.callback(1, &sb->info)) != 0) { - off = sb->last + len; - sb->last = off % vs.bufferLength; - } - break; - default: - break; - } - } else if (cpos == 0) { - switch (sb->smpType) { - case 5: - sb->info.data.update.off1 = (sb->last / 14) * 8; - sb->info.data.update.len1 = vs.bufferLength - sb->last; - sb->info.data.update.off2 = 0; - sb->info.data.update.len2 = 0; - if ((len = vs.callback(1, &sb->info)) != 0) { - off = sb->last + len; - sb->last = off % vs.bufferLength; - } - break; - default: - break; - } - } else { - switch (sb->smpType) { - case 5: - sb->info.data.update.off1 = (sb->last / 14) * 8; - sb->info.data.update.len1 = vs.bufferLength - sb->last; - sb->info.data.update.off2 = 0; - sb->info.data.update.len2 = cpos; - if ((len = vs.callback(1, &sb->info)) != 0) { - off = sb->last + len; - sb->last = off % vs.bufferLength; - } - break; - default: - break; - } - } -} - -void vsSampleUpdates() { - u32 i; // r29 - u32 cpos; // r27 - u32 realCPos; // r28 - VS_BUFFER* sb; // r31 - u32 nextSamples; // r26 - - if (vs.callback == NULL) { - return; - } - - for (i = 0; i < 64; ++i) { - if (vs.voices[i] != 0xFF && hwGetVirtualSampleState(i) != 0) { - sb = &vs.streamBuffer[vs.voices[i]]; - realCPos = hwGetPos(i); - cpos = sb->smpType == 5 ? (realCPos / 14) * 14 : realCPos; - - switch (sb->state) { - case 1: - vsUpdateBuffer(sb, cpos); - break; - case 2: - case 3: - if (((sb->info.instID << 8) | sb->voice) == hwGetVirtualSampleID(sb->voice)) { - vsUpdateBuffer(sb, cpos); - - if (realCPos >= sb->finalLast) { - sb->finalGoodSamples -= (realCPos - sb->finalLast); - } else { - sb->finalGoodSamples -= (vs.bufferLength - (sb->finalLast - realCPos)); - } - - sb->finalLast = realCPos; - nextSamples = (synthVoice[sb->voice].curPitch * 160 + 0xFFF) / 4096; - if ((s32)nextSamples > (s32)sb->finalGoodSamples) { - if (!hwVoiceInStartup(sb->voice)) { -#if MUSY_VERSION >= MUSY_VERSION_CHECK(1, 5, 4) - if (sb->state == 2) { - hwBreak(sb->voice); - macSampleEndNotify(&synthVoice[sb->voice]); - } else { - voiceKill(sb->voice); - } -#else - hwBreak(sb->voice); -#endif - } - - sb->state = 0; - vs.voices[sb->voice] = 0xff; - } - } else { - sb->state = 0; - vs.voices[sb->voice] = 0xff; - } - break; - } - } - } -} - -bool sndVirtualSampleAllocateBuffers(u8 numInstances, u32 numSamples, u32 flags) { - s32 i; // r31 - u32 len; // r28 - MUSY_ASSERT_MSG(sndActive, "Sound system is not initialized."); - MUSY_ASSERT_MSG(numInstances <= 64, "Parameter exceeded maximum number of instances allowable"); - - hwDisableIrq(); - vs.numBuffers = numInstances; - len = sndStreamAllocLength(numSamples, 1); - vs.bufferLength = (len / 8) * 14; - - for (i = 0; i < vs.numBuffers; ++i) { - if ((vs.streamBuffer[i].hwId = aramAllocateStreamBuffer(len)) == 0xFF) { - break; - } - vs.streamBuffer[i].state = 0; - vs.voices[vs.streamBuffer[i].voice] = 0xFF; - } - - if (i >= vs.numBuffers) { - hwEnableIrq(); - return 1; - } - - while ((i - 1) > 0) { - aramFreeStreamBuffer(vs.streamBuffer[i - 1].hwId); - --i; - } - - hwEnableIrq(); - return 0; -} - -void sndVirtualSampleFreeBuffers() { - u8 i; // r31 - MUSY_ASSERT_MSG(sndActive, "Sound system is not initialized."); - - for (i = 0; i < vs.numBuffers; ++i) { - aramFreeStreamBuffer(vs.streamBuffer[i].hwId); - } - - vs.numBuffers = 0; -} - -void sndVirtualSampleSetCallback(u32 (*callback)(u8 reason, const SND_VIRTUALSAMPLE_INFO* info)) { - MUSY_ASSERT_MSG(sndActive, "Sound system is not initialized."); - vs.callback = callback; -} - -void vsARAMDMACallback(size_t user) { - if (vs.callback == NULL) { - return; - } - - vs.callback(3, &((VS_BUFFER*)user)->info); -} - -void sndVirtualSampleARAMUpdate(SND_INSTID instID, void* base, u32 off1, u32 len1, u32 off2, - u32 len2) { - u8 i; - MUSY_ASSERT_MSG(sndActive, "Sound system is not initialized."); - - hwDisableIrq(); - - for (i = 0; i < vs.numBuffers; ++i) { - if (vs.streamBuffer[i].state == 0 || vs.streamBuffer[i].info.instID != instID) { - continue; - } - if ((s32)vs.streamBuffer[i].smpType != 5) { - i = i; - } else { - off1 = (off1 / 14) * 8; - len1 = ((len1 + 13) / 14) * 8; - off2 = (off2 / 14) * 8; - len2 = ((len2 + 13) / 14) * 8; - } - - if (len1 != 0) { - hwFlushStream(base, off1, len1, vs.streamBuffer[i].hwId, vsARAMDMACallback, - (u32)&vs.streamBuffer[i]); - } - if (len2 != 0) { - hwFlushStream(base, off2, len2, vs.streamBuffer[i].hwId, vsARAMDMACallback, - (u32)&vs.streamBuffer[i]); - } - - if (vs.streamBuffer[i].smpType == 5) { -#if MUSY_TARGET == MUSY_TARGET_DOLPHIN - hwSetStreamLoopPS(vs.streamBuffer[i].voice, *(u32*)(OSCachedToUncached(base)) >> 24); -#elif MUSY_TARGET == MUSY_TARGET_PC - hwSetStreamLoopPS(vs.streamBuffer[i].voice, *(u32*)(base) >> 24); -#endif - } - break; - } - - hwEnableIrq(); -} - -void sndVirtualSampleEndPlayback(SND_INSTID instID, bool sampleEndedNormally) { - u8 i; // r30 - VS_BUFFER* stream; // r31 - u32 cpos; // r28 - - hwDisableIrq(); - - for (i = 0; i < vs.numBuffers; ++i) { - if (vs.streamBuffer[i].state == 0 || vs.streamBuffer[i].info.instID != instID) { - continue; - } - - stream = &vs.streamBuffer[i]; - cpos = hwGetPos(i); - - if (stream->last < cpos) { - stream->finalGoodSamples = vs.bufferLength - (cpos - stream->last); - } else { - stream->finalGoodSamples = stream->last - cpos; - } - - stream->finalLast = cpos; - stream->state = 2; - break; - } - hwEnableIrq(); -} diff --git a/src/musyx/runtime/synthdata.c b/src/musyx/runtime/synthdata.c deleted file mode 100644 index aa3bcb6d..00000000 --- a/src/musyx/runtime/synthdata.c +++ /dev/null @@ -1,676 +0,0 @@ -#include "musyx/synthdata.h" -#include "musyx/assert.h" -#include "musyx/hardware.h" -#include "musyx/snd.h" - -static SDIR_TAB dataSmpSDirs[128]; -static u16 dataSmpSDirNum; -static DATA_TAB dataCurveTab[2048]; -static u16 dataCurveNum; -static DATA_TAB dataKeymapTab[256]; -static u16 dataKeymapNum; -static LAYER_TAB dataLayerTab[256]; -static u16 dataLayerNum; -static MAC_MAINTAB dataMacMainTab[512]; -static MAC_SUBTAB dataMacSubTabmem[2048]; -static u16 dataMacTotal; -static FX_GROUP dataFXGroups[128]; -static u16 dataFXGroupNum; - -bool dataInsertKeymap(u16 cid, void* keymapdata) { - long i; // r31 - long j; // r29 - hwDisableIrq(); - - for (i = 0; i < dataKeymapNum && dataKeymapTab[i].id < cid; ++i) - ; - - if (i < dataKeymapNum) { - - if (cid != dataKeymapTab[i].id) { - - if (dataKeymapNum < 256) { - - for (j = dataKeymapNum - 1; j >= i; --j) - dataKeymapTab[j + 1] = dataKeymapTab[j]; - ++dataKeymapNum; - } else { - hwEnableIrq(); - return 0; - } - } else { - dataKeymapTab[i].refCount++; - hwEnableIrq(); - return 0; - } - } else if (dataKeymapNum < 256) { - ++dataKeymapNum; - } else { - - hwEnableIrq(); - return 0; - } - MUSY_ASSERT_MSG(keymapdata != NULL, "Keymap data pointer is NULL"); - - dataKeymapTab[i].id = cid; - dataKeymapTab[i].data = keymapdata; - dataKeymapTab[i].refCount = 1; - hwEnableIrq(); - return 1; -} - -bool dataRemoveKeymap(u16 sid) { - long i; // r31 - long j; // r30 - - hwDisableIrq(); - for (i = 0; i < dataKeymapNum && dataKeymapTab[i].id != sid; ++i) - ; - - if (i != dataKeymapNum && --dataKeymapTab[i].refCount == 0) { - for (j = i + 1; j < dataKeymapNum; j++) { - dataKeymapTab[j - 1] = dataKeymapTab[j]; - } - - --dataKeymapNum; - hwEnableIrq(); - return 1; - } - - hwEnableIrq(); - return 0; -} - -bool dataInsertLayer(u16 cid, void* layerdata, u16 size) { - long i; // r31 - long j; // r29 - - hwDisableIrq(); - - for (i = 0; i < dataLayerNum && dataLayerTab[i].id < cid; ++i) - ; - - if (i < dataLayerNum) { - - if (cid != dataLayerTab[i].id) { - - if (dataLayerNum < 256) { - - for (j = dataLayerNum - 1; j >= i; --j) - dataLayerTab[j + 1] = dataLayerTab[j]; - ++dataLayerNum; - - } else { - - hwEnableIrq(); - return 0; - } - } else { - - dataLayerTab[i].refCount++; - hwEnableIrq(); - return 0; - } - - } else if (dataLayerNum < 256) { - ++dataLayerNum; - } else { - - hwEnableIrq(); - return 0; - } - MUSY_ASSERT_MSG(layerdata != NULL, "Layer data pointer is NULL"); - - dataLayerTab[i].id = cid; - dataLayerTab[i].data = layerdata; - dataLayerTab[i].num = size; - dataLayerTab[i].refCount = 1; - hwEnableIrq(); - return 1; -} - -bool dataRemoveLayer(u16 sid) { - long i; // r31 - long j; // r30 - - hwDisableIrq(); - for (i = 0; i < dataLayerNum && dataLayerTab[i].id != sid; ++i) - ; - - if (i != dataLayerNum && --dataLayerTab[i].refCount == 0) { - for (j = i + 1; j < dataLayerNum; j++) { - dataLayerTab[j - 1] = dataLayerTab[j]; - } - - --dataLayerNum; - hwEnableIrq(); - return 1; - } - - hwEnableIrq(); - return 0; -} - -bool dataInsertCurve(u16 cid, void* curvedata) { - long i; // r31 - long j; // r29 - - hwDisableIrq(); - - for (i = 0; i < dataCurveNum && dataCurveTab[i].id < cid; ++i) - ; - - if (i < dataCurveNum) { - - if (cid != dataCurveTab[i].id) { - - if (dataCurveNum < 2048) { - - for (j = dataCurveNum - 1; j >= i; --j) - dataCurveTab[j + 1] = dataCurveTab[j]; - ++dataCurveNum; - - } else { - hwEnableIrq(); - return 0; - } - } else { - hwEnableIrq(); - dataCurveTab[i].refCount++; - return 0; - } - - } else if (dataCurveNum < 2048) { - ++dataCurveNum; - } else { - - hwEnableIrq(); - return 0; - } - MUSY_ASSERT_MSG(curvedata != NULL, "Curve data pointer is NULL"); - - dataCurveTab[i].id = cid; - dataCurveTab[i].data = curvedata; - dataCurveTab[i].refCount = 1; - hwEnableIrq(); - return 1; -} - -bool dataRemoveCurve(u16 sid) { - long i; // r31 - long j; // r30 - - hwDisableIrq(); - for (i = 0; i < dataCurveNum && dataCurveTab[i].id != sid; ++i) - ; - - if (i != dataCurveNum && --dataCurveTab[i].refCount == 0) { - for (j = i + 1; j < dataCurveNum; j++) { - dataCurveTab[j - 1] = dataCurveTab[j]; - } - - --dataCurveNum; - hwEnableIrq(); - return 1; - } - - hwEnableIrq(); - return 0; -} - -bool dataInsertSDir(SDIR_DATA* sdir, void* smp_data) { - s32 i; // r31 - SDIR_DATA* s; // r25 - u16 n; // r27 - u16 j; // r29 - u16 k; // r26 - for (i = 0; i < dataSmpSDirNum && dataSmpSDirs[i].data != sdir; ++i) - ; - - if (i == dataSmpSDirNum) { - if (dataSmpSDirNum < 128) { - n = 0; - for (s = sdir; s->id != 0xffff; ++s) { - ++n; - } - - hwDisableIrq(); - for (j = 0; j < n; ++j) { - for (i = 0; i < dataSmpSDirNum; ++i) { - for (k = 0; k < dataSmpSDirs[i].numSmp; ++k) { - if (sdir[j].id == dataSmpSDirs[i].data[k].id) - goto found_id; - } - } - found_id: - if (i != dataSmpSDirNum) { - sdir[j].ref_cnt = 0xffff; - } else { - sdir[j].ref_cnt = 0; - } - } - - dataSmpSDirs[dataSmpSDirNum].data = sdir; - dataSmpSDirs[dataSmpSDirNum].numSmp = n; - dataSmpSDirs[dataSmpSDirNum].base = smp_data; - ++dataSmpSDirNum; - hwEnableIrq(); - return 1; - } else { - return 0; - } - } - - return 1; -} - -bool dataRemoveSDir(struct SDIR_DATA* sdir) { - long i; // r28 - long j; // r30 - long index; // r27 - SDIR_DATA* data; // r31 - - index = 0; - for (; index < dataSmpSDirNum && dataSmpSDirs[index].data != sdir; ++index) { - } - - if (index != dataSmpSDirNum) { - - hwDisableIrq(); - - for (data = sdir; data->id != 0xFFFF; ++data) { - if (data->ref_cnt != 0xFFFF && data->ref_cnt != 0) - break; - } - - if (data->id == 0xFFFF) { - data = sdir; - - for (data = sdir; data->id != 0xFFFF; ++data) { - if (data->ref_cnt != 0xFFFF) { - for (i = 0; i < dataSmpSDirNum; ++i) { - if (dataSmpSDirs[i].data == sdir) - continue; - for (j = 0; j < dataSmpSDirs[i].numSmp; ++j) { - if (data->id == dataSmpSDirs[i].data[j].id && - dataSmpSDirs[i].data[j].ref_cnt == 0xFFFF) { - dataSmpSDirs[i].data[j].ref_cnt = 0; - break; - } - } - - if (j != dataSmpSDirs[i].numSmp) { - break; - } - } - } else { - } - } - data = sdir; - for (; data->id != 0xFFFF; ++data) { - data->ref_cnt = 0; - } - - for (j = index + 1; j < dataSmpSDirNum; ++j) { - dataSmpSDirs[j - 1] = dataSmpSDirs[j]; - } - - --dataSmpSDirNum; - hwEnableIrq(); - return TRUE; - } - - hwEnableIrq(); - } - return FALSE; -} - -bool dataAddSampleReference(u16 sid) { - u32 i; // r29 - SAMPLE_HEADER* header; // r1+0xC - SDIR_DATA* data; // r30 - SDIR_DATA* sdir; // r31 - - data = NULL; - sdir = NULL; - for (i = 0; i < dataSmpSDirNum; ++i) { - for (data = dataSmpSDirs[i].data; data->id != 0xFFFF; ++data) { - if (data->id == sid && data->ref_cnt != 0xFFFF) { - sdir = data; - goto done; - } - } - } -done: - - MUSY_ASSERT_MSG(sdir != NULL, - "Sample ID to be inserted could not be found in any sample directory.\n"); - - if (sdir->ref_cnt == 0) { - sdir->addr = (void*)((size_t)sdir->offset + (s32)dataSmpSDirs[i].base); - header = &sdir->header; - hwSaveSample(&header, &sdir->addr); - } - - ++sdir->ref_cnt; - return TRUE; -} - -bool dataRemoveSampleReference(u16 sid) { - u32 i; // r30 - SDIR_DATA* sdir; // r31 - - for (i = 0; i < dataSmpSDirNum; ++i) { - for (sdir = dataSmpSDirs[i].data; sdir->id != 0xFFFF; ++sdir) { - if (sdir->id == sid && sdir->ref_cnt != 0xFFFF) { - --sdir->ref_cnt; - - if (sdir->ref_cnt == 0) { - hwRemoveSample(&sdir->header, sdir->addr); - } - - return TRUE; - } - } - } - return FALSE; -} - -bool dataInsertFX(u16 gid, struct FX_TAB* fx, u16 fxNum) { - long i; // r31 - - for (i = 0; i < dataFXGroupNum && gid != dataFXGroups[i].gid; ++i) { - } - - if (i == dataFXGroupNum && dataFXGroupNum < 128) { - hwDisableIrq(); - dataFXGroups[dataFXGroupNum].gid = gid; - dataFXGroups[dataFXGroupNum].fxNum = fxNum; - dataFXGroups[dataFXGroupNum].fxTab = fx; - - for (i = 0; i < fxNum; ++i, ++fx) { - fx->vGroup = 31; - } - - dataFXGroupNum++; - hwEnableIrq(); - return TRUE; - } - return FALSE; -} - -bool dataRemoveFX(u16 gid) { - long i; // r31 - long j; // r30 - - for (i = 0; i < dataFXGroupNum && gid != dataFXGroups[i].gid; ++i) { - } - - if (i != dataFXGroupNum) { - hwDisableIrq(); - for (j = i + 1; j < dataFXGroupNum; j++) { - dataFXGroups[j - 1] = dataFXGroups[j]; - } - - --dataFXGroupNum; - hwEnableIrq(); - return TRUE; - } - return FALSE; -} - -bool dataInsertMacro(u16 mid, void* macroaddr) { - long main; // r28 - long pos; // r29 - long base; // r27 - long i; // r31 - - hwDisableIrq(); - - main = (mid >> 6) & 0x3ff; - - if (dataMacMainTab[main].num == 0) { - pos = base = dataMacMainTab[main].subTabIndex = dataMacTotal; - } else { - base = dataMacMainTab[main].subTabIndex; - for (i = 0; i < dataMacMainTab[main].num && dataMacSubTabmem[base + i].id < mid; ++i) { - } - - if (i < dataMacMainTab[main].num) { - pos = base + i; - if (mid == dataMacSubTabmem[pos].id) { - dataMacSubTabmem[pos].refCount++; - hwEnableIrq(); - return FALSE; - } - } else { - pos = base + i; - } - } - - if (dataMacTotal < 2048) { - MUSY_ASSERT_MSG(macroaddr, "Macro data pointer is NULL"); - for (i = 0; i < 512; ++i) { - if (dataMacMainTab[i].subTabIndex > base) { - dataMacMainTab[i].subTabIndex++; - } - } - - i = dataMacTotal - 1; - for (; i >= pos; --i) { - dataMacSubTabmem[i + 1] = dataMacSubTabmem[i]; - } - - dataMacSubTabmem[pos].id = mid; - dataMacSubTabmem[pos].data = macroaddr; - dataMacSubTabmem[pos].refCount = 1; - dataMacMainTab[main].num++; - dataMacTotal++; - hwEnableIrq(); - return TRUE; - } - hwEnableIrq(); - return FALSE; -} - -bool dataRemoveMacro(u16 mid) { - s32 main; // r29 - s32 base; // r28 - s32 i; // r31 - - hwDisableIrq(); - main = (mid >> 6) & 0x3ff; - - if (dataMacMainTab[main].num != 0) { - base = dataMacMainTab[main].subTabIndex; - for (i = 0; i < dataMacMainTab[main].num && mid != dataMacSubTabmem[base + i].id; ++i) { - } - - if (i < dataMacMainTab[main].num) { - if (--dataMacSubTabmem[base + i].refCount == 0) { - for (i = base + i + 1; i < dataMacTotal; ++i) { - dataMacSubTabmem[i - 1] = dataMacSubTabmem[i]; - } - - for (i = 0; i < 512; ++i) { - if (dataMacMainTab[i].subTabIndex > base) { - --dataMacMainTab[i].subTabIndex; - } - } - - --dataMacMainTab[main].num; - --dataMacTotal; - } - } - } - - hwEnableIrq(); - return FALSE; -} - -static s32 maccmp(void* p1, void* p2) { return ((MAC_SUBTAB*)p1)->id - ((MAC_SUBTAB*)p2)->id; } - -MSTEP* dataGetMacro(u16 mid) { - static s32 base; - static s32 main; - static MAC_SUBTAB key; - static MAC_SUBTAB* result; - - main = (mid >> 6) & 0x3fff; - - if (dataMacMainTab[main].num != 0) { - base = dataMacMainTab[main].subTabIndex; - key.id = mid; - if ((result = (MAC_SUBTAB*)sndBSearch(&key, &dataMacSubTabmem[base], dataMacMainTab[main].num, - 8, maccmp)) != NULL) { - return result->data; - } - } - - return NULL; -} - -static s32 smpcmp(void* p1, void* p2) { return ((SDIR_DATA*)p1)->id - ((SDIR_DATA*)p2)->id; } - -s32 dataGetSample(u16 sid, SAMPLE_INFO* newsmp) { - static SDIR_DATA key; - static SDIR_DATA* result; - static SAMPLE_HEADER* sheader; - long i; // r30 - - key.id = sid; - - for (i = 0; i < dataSmpSDirNum; ++i) { - if ((result = sndBSearch(&key, dataSmpSDirs[i].data, dataSmpSDirs[i].numSmp, sizeof(SDIR_DATA), - smpcmp)) != NULL) { - if (result->ref_cnt != 0xFFFF) { - sheader = &result->header; - newsmp->info = sheader->info; - newsmp->addr = result->addr; - newsmp->offset = 0; - newsmp->loop = sheader->loopOffset; - newsmp->length = sheader->length & 0xffffff; - newsmp->loopLength = sheader->loopLength; - newsmp->compType = sheader->length >> 24; - - if (result->extraData) { - newsmp->extraData = (void*)((size_t) & (dataSmpSDirs[i].data)->id + result->extraData); - } - return 0; - } - } - } - - return -1; -} - -static s32 curvecmp(void* p1, void* p2) { return ((DATA_TAB*)p1)->id - ((DATA_TAB*)p2)->id; } - -void* dataGetCurve(u16 cid) { - static DATA_TAB key; - static DATA_TAB* result; - - key.id = cid; - if ((result = - (DATA_TAB*)sndBSearch(&key, dataCurveTab, dataCurveNum, sizeof(DATA_TAB), curvecmp))) { - return result->data; - } - return NULL; -} - -void* dataGetKeymap(u16 cid) { - static DATA_TAB key; - static DATA_TAB* result; - - key.id = cid; - if ((result = - (DATA_TAB*)sndBSearch(&key, dataKeymapTab, dataKeymapNum, sizeof(DATA_TAB), curvecmp))) { - return result->data; - } - return NULL; -} - -static s32 layercmp(void* p1, void* p2) { return ((LAYER_TAB*)p1)->id - ((LAYER_TAB*)p2)->id; } - -void* dataGetLayer(u16 cid, u16* n) { - static LAYER_TAB key; - static LAYER_TAB* result; - - key.id = cid; - if ((result = - (LAYER_TAB*)sndBSearch(&key, dataLayerTab, dataLayerNum, sizeof(LAYER_TAB), layercmp))) { - *n = result->num; - return result->data; - } - return NULL; -} - -static s32 fxcmp(void* p1, void* p2) { - return ((FX_TAB*)p1)->id - ((FX_TAB*)p2)->id; -} - -struct FX_TAB* dataGetFX(u16 fid) { - static FX_TAB key; - FX_TAB* ret; // r29 - long i; // r31 - - key.id = fid; - for (i = 0; i < dataFXGroupNum; ++i) { - if ((ret = (FX_TAB*)sndBSearch(&key, dataFXGroups[i].fxTab, dataFXGroups[i].fxNum, - sizeof(FX_TAB), fxcmp))) { - return ret; - } - } - - return NULL; -} - -void dataInit(u32 smpBase, u32 smpLength) { - long i; // r31 - - dataSmpSDirNum = 0; - dataCurveNum = 0; - dataKeymapNum = 0; - dataLayerNum = 0; - dataFXGroupNum = 0; - dataMacTotal = 0; - for (i = 0; i < 512; ++i) { - dataMacMainTab[i].num = 0; - dataMacMainTab[i].subTabIndex = 0; - } - hwInitSampleMem(smpBase, smpLength); -} - -void dataExit() { hwExitSampleMem(); } - -#if MUSY_TARGET == MUSY_PLATFORM_PC -void* sndConvert32BitSDIRTo64BitSDIR(void* sdir_int) { - SDIR_DATA_INTER* sdir_inter = sdir_int; - SDIR_DATA* sdir = NULL; - s32 i = 0; - SDIR_DATA* s; - SDIR_DATA_INTER* s2 = NULL; - u16 n = 0; - - for (s2 = sdir_inter; s2->id != 0xffff; ++s2) { - ++n; - } - - ++n; - - sdir = malloc(n * sizeof(SDIR_DATA)); - - for (i = 0; i < n; ++i) { - sdir[i].id = sdir_inter[i].id; - sdir[i].ref_cnt = sdir_inter[i].ref_cnt; - sdir[i].offset = sdir_inter[i].offset; - sdir[i].addr = (void*)(size_t)sdir_inter[i].addr; - sdir[i].header = sdir_inter[i].header; - sdir[i].extraData = sdir_inter[i].extraData; - } - - free(sdir_int); - - return sdir; -} -#endif diff --git a/src/musyx/runtime/synthmacros.c b/src/musyx/runtime/synthmacros.c deleted file mode 100644 index 8e9be60e..00000000 --- a/src/musyx/runtime/synthmacros.c +++ /dev/null @@ -1,1744 +0,0 @@ -#include "musyx/assert.h" -#include "musyx/hardware.h" -#include "musyx/macros.h" -#include "musyx/seq.h" -#include "musyx/snd.h" -#include "musyx/synth.h" -#include "musyx/synthdata.h" - -#include - -static u8 DebugMacroSteps; - -static SYNTH_VOICE* macActiveMacroRoot; -static SYNTH_VOICE* macTimeQueueRoot; -static u64 macRealTime; - -static void TimeQueueAdd(SYNTH_VOICE* svoice); - -void macMakeActive(SYNTH_VOICE* svoice); - -void macSetExternalKeyoff(SYNTH_VOICE* svoice); - -static void DoSetPitch(SYNTH_VOICE* svoice); - -static int SendSingleKeyOff(u32 voiceid) { - u32 i; // r31 - - if (voiceid != 0xFFFFFFFF) { - - i = voiceid & 0xFF; - - if (voiceid == synthVoice[i].id) { - - macSetExternalKeyoff(&synthVoice[i]); - - return 0; - } - } - - return -1; -} - -static u32 ExecuteTrap(SYNTH_VOICE* svoice, u8 trapType) { - if (svoice->trapEventAny != 0 && svoice->trapEventAddr[trapType] != NULL) { - svoice->curAddr = svoice->trapEventCurAddr[trapType]; - svoice->addr = svoice->trapEventAddr[trapType]; - svoice->trapEventAddr[trapType] = NULL; - macMakeActive(svoice); - return 1; - } - - return 0; -} - -static u32 HasHWEventTrap(SYNTH_VOICE* svoice) { - if (svoice->trapEventAny != '\0') { - return svoice->trapEventAddr[1] != NULL; - } - return 0; -} - -static void CheckHWEventTrap(SYNTH_VOICE* svoice) { - if ((svoice->cFlags & 0x20) == 0 && !hwIsActive(svoice->id & 0xff)) { - ExecuteTrap(svoice, 1); - } -} - -static u32 mcmdWait(SYNTH_VOICE* svoice, MSTEP* cstep) { - u32 w; // r1+0x10 - u32 ms; // r29 - - if ((ms = (u16)(cstep->para[1] >> 0x10))) { - if (((u8)(cstep->para[0] >> 8) & 1)) { - if (svoice->cFlags & 8) { - if (!(svoice->cFlags & 0x10000000000)) { - return 0; - } - svoice->cFlags |= 0x40000000000; - } - svoice->cFlags |= 4; - } else { - svoice->cFlags &= ~4; - } - - if (((u8)(cstep->para[0] >> 0x18) & 1)) { - if (!(svoice->cFlags & 0x20) && !hwIsActive(svoice->id & 0xFF)) { - return 0; - } - svoice->cFlags |= 0x40000; - } else { - svoice->cFlags &= ~0x40000; - } - - if (((u8)(cstep->para[0] >> 0x10)) & 1) { - ms = sndRand() % ms; - } - - if (ms != 0xFFFF) { - if ((w = ((u8)(cstep->para[1] >> 0x8) & 1) != 0)) { - sndConvertMs(&ms); - } else { - sndConvertTicks(&ms, svoice); - } - - if (w != 0) { - if ((u8)cstep->para[1] & 1) { - svoice->wait = svoice->macStartTime + ms; - } else { - svoice->wait = macRealTime + ms; - } - } else { - if ((u8)cstep->para[1] & 1) { - svoice->wait = ms; - } else { - svoice->wait = svoice->waitTime + ms; - } - } - - if (!(svoice->wait > macRealTime)) { - svoice->waitTime = svoice->wait; - svoice->wait = 0; - } - } else { - svoice->wait = -1; - } - - if (svoice->wait != 0) { - if (svoice->wait != -1) { - TimeQueueAdd(svoice); - } - macMakeInactive(svoice, 1); - return 1; - } - } - - return 0; -} - -static u32 mcmdWaitMs(SYNTH_VOICE* svoice, MSTEP* cstep) { - *((u8*)cstep->para + 6) = 1; - return mcmdWait(svoice, cstep); -} - -static u32 mcmdEndOfMacro(SYNTH_VOICE* svoice) { - vidRemoveVoiceReferences(svoice); - voiceFree(svoice); - return 1; -} - -static u32 mcmdStop(SYNTH_VOICE* svoice) { return mcmdEndOfMacro(svoice); } - -static u32 mcmdReturn(SYNTH_VOICE* svoice) { - if (svoice->callStackEntryNum != 0) { - svoice->addr = svoice->callStack[svoice->callStackIndex].addr; - svoice->curAddr = svoice->callStack[svoice->callStackIndex].curAddr; - svoice->callStackIndex = (svoice->callStackIndex - 1) & 3; - --svoice->callStackEntryNum; - } - return 0; -} - -static void mcmdIfKey(SYNTH_VOICE* svoice, MSTEP* cstep) { - MSTEP* addr; // r31 - if (svoice->curNote < ((u8)(cstep->para[0] >> 8))) { - return; - } - - if ((addr = (MSTEP*)dataGetMacro((cstep->para[0] >> 0x10))) != NULL) { - svoice->addr = addr; - svoice->curAddr = addr + (u16)cstep->para[1]; - } -} - -static void mcmdIfVelocity(SYNTH_VOICE* svoice, MSTEP* cstep) { - MSTEP* addr; - if (((u8)(svoice->volume >> 0x10)) < (u8)(cstep->para[0] >> 8)) { - return; - } - - if ((addr = (MSTEP*)dataGetMacro(cstep->para[0] >> 0x10))) { - svoice->addr = addr; - svoice->curAddr = addr + (u16)cstep->para[1]; - } -} - -static void mcmdIfModulation(SYNTH_VOICE* svoice, MSTEP* cstep) { - MSTEP* addr; // r30 - u8 mod; // r28 - - if (svoice->midi == 0xff) { - return; - } - mod = inpGetModulation(svoice) >> 7; - if (mod < (u8)(cstep->para[0] >> 8)) { - return; - } - - if ((addr = (MSTEP*)dataGetMacro(cstep->para[0] >> 0x10))) { - svoice->addr = addr; - svoice->curAddr = addr + (u16)(cstep->para[1]); - } -} - -static void mcmdIfRandom(SYNTH_VOICE* svoice, MSTEP* cstep) { - MSTEP* addr; // r31 - if ((u8)sndRand() < (u8)(cstep->para[0] >> 8)) { - return; - } - - if ((addr = (MSTEP*)dataGetMacro(cstep->para[0] >> 0x10))) { - svoice->addr = addr; - svoice->curAddr = addr + (u16)cstep->para[1]; - } -} - -static u32 mcmdGoto(SYNTH_VOICE* svoice, MSTEP* cstep) { - MSTEP* addr; // r31 - if ((addr = (MSTEP*)dataGetMacro(cstep->para[0] >> 0x10)) != NULL) { - svoice->addr = addr; - svoice->curAddr = addr + (u16)cstep->para[1]; - return 0; - } - - return mcmdEndOfMacro(svoice); -} - -static u32 mcmdGosub(SYNTH_VOICE* svoice, MSTEP* cstep) { - MSTEP* addr; // r30 - if ((addr = (MSTEP*)dataGetMacro((u16)(cstep->para[0] >> 0x10))) != NULL) { - svoice->callStackIndex = (svoice->callStackIndex + 1) & 3; - svoice->callStack[svoice->callStackIndex].addr = svoice->addr; - svoice->callStack[svoice->callStackIndex].curAddr = svoice->curAddr; - if (++svoice->callStackEntryNum > 4) { - svoice->callStackEntryNum = 4; - } - - svoice->addr = addr; - svoice->curAddr = addr + (u16)cstep->para[1]; - return 0; - } - - return mcmdEndOfMacro(svoice); -} - -static void mcmdTrapEvent(SYNTH_VOICE* svoice, MSTEP* cstep) { - MSTEP* addr; // r29 - u8 t; // r30 - if ((addr = (MSTEP*)dataGetMacro(cstep->para[0] >> 0x10)) != NULL) { - t = (u8)(cstep->para[0] >> 8); - svoice->trapEventAddr[t] = addr; - svoice->trapEventCurAddr[t] = addr + (u16)cstep->para[1]; - svoice->trapEventAny = 1; - if (t == 0 && (svoice->cFlags & 0x10000000008) == 0x10000000008) { - svoice->cFlags |= 0x40000000000; - } - } -} - -static void mcmdUntrapEvent(SYNTH_VOICE* svoice, MSTEP* cstep) { - u8 i; // r31 - svoice->trapEventAddr[(u8)(cstep->para[0] >> 8)] = 0; - - for (i = 0; i < 3; ++i) { - if (svoice->trapEventAddr[i] != NULL) { - return; - } - } - - svoice->trapEventAny = 0; -} - -static void mcmdLoop(SYNTH_VOICE* svoice, MSTEP* cstep) { - - if (svoice->loop == 0) { - if ((u8)(cstep->para[0] >> 16) & 1) { - svoice->loop = sndRand() % (u16)(cstep->para[1] >> 16); - } else { - svoice->loop = (cstep->para[1] >> 16); - } - - if (svoice->loop == 0xFFFF) { - goto skip; - } - ++svoice->loop; - } else if (svoice->loop == 0xFFFF) { - goto skip; - } - - if (--svoice->loop == 0) { - return; - } -skip: - if (((u8)(cstep->para[0] >> 8) & 1) != 0 && (svoice->cFlags & 0x10000000008) == 0x00000000008) { - svoice->loop = 0; - - } else if (((u8)(cstep->para[0] >> 0x18) & 1) && (svoice->cFlags & 0x20) == 0 && - !hwIsActive(svoice->id & 0xFF)) { - svoice->loop = 0; - } else { - svoice->curAddr = svoice->addr + ((u16)cstep->para[1]); - } -} - -static void mcmdPlayMacro(SYNTH_VOICE* svoice, MSTEP* cstep) { - s32 key; // r29 - u32 new_child; // r30 - - key = ((u32)svoice->orgNote + (s8)(u8)(cstep->para[0] >> 8)); - key = (key < 0) ? 0 : key > 0x7f ? 0x7f : key; - - if (svoice->fxFlag != 0) { - key |= 0x80; - } - - svoice->block = 1; - new_child = macStart((u16)(cstep->para[0] >> 0x10), (u8)(cstep->para[1] >> 0x10), - (u8)(cstep->para[1] >> 0x18), svoice->allocId, key, - (u8)(svoice->volume >> 0x10), (u8)(svoice->panning[0] >> 0x10), svoice->midi, - svoice->midiSet, svoice->section, (u16)cstep->para[1], (u16)svoice->track, 0, - svoice->vGroup, svoice->studio, svoice->itdMode == 0); - svoice->block = 0; - if (new_child != 0xFFFFFFFF) { - svoice->lastVID = synthVoice[(u8)new_child].vidList->vid; - synthVoice[(u8)new_child].parent = svoice->id; - if (svoice->child != -1) { - synthVoice[(u8)new_child].child = svoice->child; - synthVoice[(u8)svoice->child].parent = new_child; - } - svoice->child = new_child; - if (svoice->fxFlag != 0) { - synthFXCloneMidiSetup(&synthVoice[(u8)new_child], svoice); - } - } else { - svoice->lastVID = 0xFFFFFFFF; - } -} - -static void mcmdSendKeyOff(SYNTH_VOICE* svoice, MSTEP* cstep) { - u32 voiceid; // r30 - u32 i; // r31 - - voiceid = (svoice->orgNote + (u8)(cstep->para[0] >> 8)) << 8; - voiceid |= ((u16)(cstep->para[0] >> 16)) << 16; - for (i = 0; i < synthInfo.voiceNum; ++i) { - if (synthVoice[i].id == (voiceid | i)) { - SendSingleKeyOff(voiceid | i); - } - } -} - -static void mcmdAddAgeCounter(SYNTH_VOICE* svoice, MSTEP* cstep) { - s16 step; // r29 - s32 age; // r30 - - step = (u16)(cstep->para[0] >> 16); - age = (svoice->age >> 15) + step; - - if (age < 0) { - svoice->age = 0; - } else if (age > 0xFFFF) { - svoice->age = 0x7fff8000; - } else { - svoice->age = age * 0x8000; - } - - hwSetPriority(svoice->id & 0xFF, ((u32)svoice->prio << 24) | ((u32)svoice->age >> 15)); -} - -static void mcmdSetAgeCounter(SYNTH_VOICE* svoice, MSTEP* cstep) { - svoice->age = (u16)(cstep->para[0] >> 0x10) << 0xf; - hwSetPriority(svoice->id & 0xff, (u32)svoice->prio << 0x18 | svoice->age >> 0xf); -} - -static void mcmdSetAgeCounterSpeed(SYNTH_VOICE* svoice, MSTEP* cstep) { - u32 time = cstep->para[1]; - if (time != 0) { - svoice->ageSpeed = (svoice->age >> 8) / time; - } else { - svoice->ageSpeed = 0; - } -} -static void mcmdSetAgeCounterByVolume(SYNTH_VOICE* svoice, MSTEP* cstep) { - u32 age; // r30 - - age = (((u8)(svoice->volume >> 16) * (u16)cstep->para[1]) >> 7) + (u16)(cstep->para[0] >> 16); - svoice->age = age > 60000 ? 0x75300000 : age * 0x8000; - hwSetPriority(svoice->id & 0xff, (u32)svoice->prio << 0x18 | svoice->age >> 0xf); -} - -static void mcmdAddPriority(SYNTH_VOICE* svoice, MSTEP* cstep) { - s16 add; // r30 - s16 prio; // r31 - add = (u16)(cstep->para[0] >> 16); - prio = svoice->prio + add; - prio = (prio < 0) ? 0 : (prio > 0xFF) ? 0xFF : prio; - - voiceSetPriority(svoice, prio); -} - -static void mcmdSetPriority(SYNTH_VOICE* svoice, MSTEP* cstep) { - voiceSetPriority(svoice, cstep->para[0] >> 8); -} - -static void mcmdSendFlag(MSTEP* cstep) { - synthGlobalVariable[(u8)(cstep->para[0] >> 8)] = (u8)(cstep->para[0] >> 16); -} - -static void mcmdSetPitchWheelRange(SYNTH_VOICE* svoice, MSTEP* cstep) { - svoice->pbLowerKeyRange = (u8)(cstep->para[0] >> 0x10); - svoice->pbUpperKeyRange = (u8)(cstep->para[0] >> 8); -} - -static u32 mcmdSetKey(SYNTH_VOICE* svoice, MSTEP* cstep) { - svoice->curNote = (u8)(cstep->para[0] >> 8) & 0x7f; - svoice->curDetune = (s8)(cstep->para[0] >> 0x10); - if (voiceIsLastStarted(svoice) != 0) { - inpSetMidiLastNote(svoice->midi, svoice->midiSet, svoice->curNote & 0xff); - } - cstep->para[0] = 4; - return mcmdWait(svoice, cstep); -} - -static u32 mcmdAddKey(SYNTH_VOICE* svoice, MSTEP* cstep) { - if ((u8)(cstep->para[0] >> 0x18) == 0) { - svoice->curNote += (s8)(u8)(cstep->para[0] >> 8); - } else { - svoice->curNote = (u16)svoice->orgNote + (s16)(s8)(u8)(cstep->para[0] >> 8); - } - - svoice->curNote = (s16)svoice->curNote < 0 ? 0 : svoice->curNote > 0x7f ? 0x7f : svoice->curNote; - svoice->curDetune = (s8)(cstep->para[0] >> 0x10); - - if (voiceIsLastStarted(svoice) != 0) { - inpSetMidiLastNote(svoice->midi, svoice->midiSet, svoice->curNote); - } - cstep->para[0] = 4; - return mcmdWait(svoice, cstep); -} - -static u32 mcmdLastKey(SYNTH_VOICE* svoice, MSTEP* cstep) { - svoice->curNote = svoice->lastNote + (s8)(u8)(cstep->para[0] >> 8); - svoice->curNote = (s16)svoice->curNote < 0 ? 0 : svoice->curNote > 0x7f ? 0x7f : svoice->curNote; - svoice->curDetune = (s8)(cstep->para[0] >> 16); - if (svoice->midi != 0xFF) { - inpSetMidiLastNote(svoice->midi, svoice->midiSet, svoice->curNote); - } - cstep->para[0] = 4; - - return mcmdWait(svoice, cstep); -} - -static void mcmdStartSample(SYNTH_VOICE* svoice, MSTEP* cstep) { - static SAMPLE_INFO newsmp; - u16 smp; // r28 - smp = cstep->para[0] >> 8; - - if (dataGetSample(smp, &newsmp) != 0) { - return; - } - switch ((u8)(cstep->para[0] >> 0x18)) { - case 0: - newsmp.offset = cstep->para[1]; - break; - case 1: - newsmp.offset = ((u8)(0x7f - (svoice->volume >> 0x10)) * (u32)cstep->para[1]) / 0x7f; - ; - break; - case 2: - newsmp.offset = ((u8)((svoice->volume >> 0x10)) * (u32)cstep->para[1]) / 0x7f; - break; - default: - newsmp.offset = 0; - break; - } - - if (newsmp.offset >= newsmp.length) { - newsmp.offset = newsmp.length - 1; - } - - hwInitSamplePlayback(svoice->id & 0xFF, smp, &newsmp, (svoice->cFlags & 0x100) == 0, - ((u32)svoice->prio << 24) | ((u32)svoice->age >> 15), svoice->id, - (svoice->cFlags & 0x80000000000) == 0, svoice->itdMode); - - svoice->sInfo = newsmp.info; - - if (svoice->playFrq != -1) { - DoSetPitch(svoice); - } - svoice->cFlags |= 0x20; - synthKeyStateUpdate(svoice); -} - -static void mcmdStopSample(SYNTH_VOICE* svoice) { hwBreak(svoice->id & 0xFF); } -static void mcmdKeyOff(SYNTH_VOICE* svoice) { - svoice->cFlags |= 0x80; - synthKeyStateUpdate(svoice); -} - -static void mcmdSetMod2Vibrato(SYNTH_VOICE* svoice, MSTEP* cstep) { - svoice->vibModAddScale = (s8)(cstep->para[0] >> 8) << 8; - if (svoice->vibModAddScale >= 0) { - svoice->vibModAddScale += ((s16)(s8)(cstep->para[0] >> 0x10) << 8) / 100; - - } else { - svoice->vibModAddScale -= ((s16)(s8)(cstep->para[0] >> 0x10) << 8) / 100; - } -} - -static void mcmdVibrato(SYNTH_VOICE* svoice, MSTEP* cstep) { - u32 time; // r1+0x10 - s8 kr; // r29 - s8 cr; // r30 - - if ((u8)(cstep->para[0] >> 0x18) & 3) { - svoice->cFlags |= 0x4000; - } else { - svoice->cFlags &= ~0x4000; - } - - time = (u16)(cstep->para[1] >> 0x10); - if ((u8)(cstep->para[1] >> 8) & 1) { - sndConvertMs(&time); - } else { - sndConvertTicks(&time, svoice); - } - - if (time) { - svoice->cFlags |= 0x2000; - svoice->vibPeriod = time; - - kr = (s8)(cstep->para[0] >> 8); - cr = (s8)(cstep->para[0] >> 16); - - if (kr < 0) { - if (cr < 0) { - svoice->vibCentRange = -cr; - } else { - svoice->vibCentRange = cr; - } - - svoice->vibKeyRange = -kr; - svoice->vibCurTime = svoice->vibPeriod / 2; - } else { - if (cr < 0) { - if (kr == 0) { - svoice->vibCentRange = -cr; - svoice->vibCurTime = svoice->vibPeriod / 2; - } else { - --kr; - svoice->vibCentRange = 100 - cr; - svoice->vibCurTime = 0; - } - } else { - svoice->vibCentRange = cr; - svoice->vibCurTime = 0; - } - svoice->vibKeyRange = kr; - } - } else { - svoice->cFlags &= ~0x2000; - } -} - -static void mcmdSetupLFO(SYNTH_VOICE* svoice, MSTEP* cstep) { - u32 time; // r1+0x14 - u32 phase; // r1+0x10 - u8 n; // r31 - - n = (u8)(cstep->para[0] >> 8); - time = (u16)(cstep->para[0] >> 0x10); - sndConvertMs(&time); - if (svoice->lfo[n].period != 0) { - phase = (u16)cstep->para[1]; - sndConvertMs(&phase); - svoice->lfo[n].time = phase; - } - svoice->lfo[n].period = time; -} - -#pragma dont_inline on -static void DoSetPitch(SYNTH_VOICE* svoice) { - u32 f; // r28 - u32 of; // r25 - u32 i; // r31 - u32 frq; // r27 - u32 ofrq; // r26 - u32 no; // r30 - s32 key; // r24 - u8 oKey; // r23 - static u16 kf[13] = { - 4096, 4339, 4597, 4871, 5160, 5467, 5792, 6137, 6502, 6888, 7298, 7732, 8192, - }; - - frq = svoice->playFrq & 0xFFFFFF; - ofrq = svoice->sInfo & 0xFFFFFF; - - if (ofrq == frq) { - svoice->curNote = svoice->sInfo >> 24; - } else if (ofrq < frq) { - f = (frq << 12) / ofrq; - for (no = 0; no < 11 && (1 << ((no + 1) & 0x3f)) < (f >> 12); ++no) { - } - - f /= (1 << (no & 0x3f)); - - for (i = 11; f <= kf[i]; i--) { - } - - svoice->curNote = (svoice->sInfo >> 24) + no * 12 + i; - svoice->curDetune = (no - kf[i]) * 100 / (kf[i + 1] - kf[i]); - } -} -#pragma dont_inline reset - -static void mcmdSetPitch(SYNTH_VOICE* svoice, MSTEP* cstep) { - svoice->playFrq = (u32)(cstep->para[0] >> 8); - svoice->playFrq |= (u8)cstep->para[1]; - if (svoice->sInfo != -1) { - DoSetPitch(svoice); - } -} - -#pragma dont_inline on -static void mcmdSetADSR(SYNTH_VOICE* svoice, MSTEP* cstep) { - ADSR_INFO adsr; // r1+0x10 - ADSR_INFO* adsr_ptr; // r31 - s32 ascale; // r29 - s32 dscale; // r28 - float sScale; // r63 -} -#pragma dont_inline reset - -static s32 midi2TimeTab[128] = { - 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, - 110, 120, 130, 140, 150, 160, 170, 190, 200, 220, 230, 250, - 270, 290, 310, 330, 350, 380, 410, 440, 470, 500, 540, 580, - 620, 660, 710, 760, 820, 880, 940, 1000, 1000, 1100, 1200, 1300, - 1400, 1500, 1600, 1700, 1800, 2000, 2100, 2300, 2400, 2600, 2800, 3000, - 3200, 3500, 3700, 4000, 4300, 4600, 4900, 5300, 5700, 6100, 6500, 7000, - 7500, 8100, 8600, 9300, 9900, 10000, 11000, 12000, 13000, 14000, 15000, 16000, - 17000, 18000, 19000, 21000, 22000, 24000, 26000, 28000, 30000, 32000, 34000, 37000, - 39000, 42000, 45000, 49000, 50000, 55000, 60000, 65000, 70000, 75000, 80000, 85000, - 90000, 95000, 100000, 105000, 110000, 115000, 120000, 125000, 130000, 135000, 140000, 145000, - 150000, 155000, 160000, 165000, 170000, 175000, 180000, 0, -}; - -#pragma dont_inline on -static void mcmdSetADSRFromCtrl(SYNTH_VOICE* svoice, MSTEP* cstep) { - float sScale; // r63 - ADSR_INFO adsr; // r1+0x10 -} - -static void mcmdSetPitchADSR(SYNTH_VOICE* svoice, MSTEP* cstep) { - ADSR_INFO adsr; // r1+0x10 - ADSR_INFO* adsr_ptr; // r31 - u32 sl; // r28 - s32 ascale; // r27 - s32 dscale; // r26 -} -#pragma dont_inline reset - -static u32 mcmdPitchSweep(SYNTH_VOICE* svoice, MSTEP* cstep, int num) { - s32 delta; // r31 - svoice->sweepOff[num] = 0; - svoice->sweepNum[num] = (u8)(cstep->para[0] >> 8); - svoice->sweepCnt[num] = (s32)svoice->sweepNum[num] << 0x10; - delta = (int)(short)(cstep->para[0] >> 0x10); - if (delta >= 0) { - delta = hwFrq2Pitch(delta); - } else { - delta = -hwFrq2Pitch(-delta); - } - svoice->sweepAdd[num] = delta << 0x10; - cstep->para[0] = 0; - mcmdWait(svoice, cstep); -} - -static void DoPanningSetup(SYNTH_VOICE* svoice, MSTEP* cstep, u8 pi) { - s32 width; // r29 - u32 mstime; // r27 - svoice->panTime[pi] = width = (u16)(cstep->para[0] >> 16); - sndConvertMs(&svoice->panTime[pi]); - mstime = (s8)(cstep->para[1]); - svoice->panning[pi] = ((u8)(cstep->para[0] >> 8)) << 16; - svoice->panTarget[pi] = svoice->panning[pi] + mstime * 0x10000; - if (svoice->panTime[pi] != 0) { - svoice->panDelta[pi] = (s32)(mstime << 16) / width; - } else { - svoice->panDelta[pi] = (s32)(mstime << 16); - } - - svoice->cFlags |= 0x200000000000; -} - -static void mcmdSetPanning(SYNTH_VOICE* svoice, MSTEP* cstep) { DoPanningSetup(svoice, cstep, 0); } - -static void mcmdSetSurroundPanning(SYNTH_VOICE* svoice, MSTEP* cstep) { - DoPanningSetup(svoice, cstep, 1); -} - -static void mcmdSetPianoPanning(SYNTH_VOICE* svoice, MSTEP* cstep) { - s32 delta; // r31 - s32 scale; // r30 - delta = (svoice->curNote << 16) - ((u8)(cstep->para[0] >> 16) << 16); - scale = (s8)((u8)(cstep->para[0] >> 8)); - delta = ((delta * scale) >> 7); - delta += (u8)(cstep->para[0] >> 0x18) << 16; - delta = delta < 0 ? 0 : delta > 0x7f0000 ? 0x7f0000 : delta; - svoice->panTarget[0] = delta; - svoice->panning[0] = delta; -} - -static u32 TranslateVolume(u32 volume, u16 curve) { - u8* ptr; // r30 - u32 vlow; // r28 - u32 vhigh; // r31 - s32 d; // r27 - - if (curve != 0xFFFF) { - if ((ptr = (u8*)dataGetCurve(curve))) { - vhigh = (volume >> 16) & 0xFFFF; - vlow = volume & 0xFFFF; - - if (vhigh < 0x7f) { - d = vlow * (ptr[vhigh + 1] - ptr[vhigh]); -#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 0) - volume = d + ((u16)ptr[vhigh] << 16); -#else - volume = d + (ptr[vhigh] << 16); -#endif - } else { - volume = ptr[vhigh] << 16; - } - } - } - - return volume; -} - -static void mcmdScaleVolume(SYNTH_VOICE* svoice, MSTEP* cstep) { - u16 curve; // r29 - u16 scale; // r28 - scale = (u16)(u8)(cstep->para[0] >> 8); - - if ((u8)(cstep->para[1] >> 8) == 0) { - svoice->volume = (svoice->volume * scale) / 0x7f; - } else { - svoice->volume = (svoice->orgVolume * scale) / 0x7f; - } -#if MUSY_VERSION >= MUSY_VERSION_CHECK(2, 0, 0) - svoice->volume += (u8)(cstep->para[0] >> 16) << 16; -#else - svoice->volume += EXTRACT_3RDNYBBLE(cstep->para[0]); -#endif - if (svoice->volume > 0x7f0000) { - svoice->volume = 0x7f0000; - } - - curve = (u8)(cstep->para[0] >> 0x18); - curve |= ((u16)((u8)cstep->para[1]) << 8); - - svoice->volume = TranslateVolume(svoice->volume, curve); - svoice->cFlags |= 0x100000000000; -} - -static void mcmdScaleVolumeDLS(SYNTH_VOICE* svoice, MSTEP* cstep) { - u16 scale; // r31 - - scale = (cstep->para[0] >> 8); - if ((u8)(cstep->para[0] >> 0x18) == 0) { - svoice->volume = ((svoice->volume >> 5) * scale) >> 7; - } else { - svoice->volume = ((svoice->orgVolume >> 5) * scale) >> 7; - } - if (svoice->volume > 0x7f0000) { - svoice->volume = 0x7f0000; - } - - svoice->cFlags |= 0x100000000000; -} - -static void DoEnvelopeCalculation(SYNTH_VOICE* svoice, MSTEP* cstep, s32 start_vol) { - u32 tvol; // r31 - u32 time; // r1+0x14 - s32 mstime; // r28 - u16 curve; // r27 - - time = (u16)(cstep->para[1] >> 16); - - if ((u8)(cstep->para[1] >> 8) & 1) { - sndConvertMs(&time); - } else { - sndConvertTicks(&time, svoice); - } - - mstime = sndConvert2Ms(time); - if (mstime == 0) { - mstime = 1; - } - - tvol = (svoice->volume * (u8)(cstep->para[0] >> 8) >> 7); - tvol += (u8)(cstep->para[0] >> 16) << 16; - - if (tvol > 0x7f0000) { - tvol = 0x7f0000; - } - - curve = (u16)(u8)(cstep->para[0] >> 0x18); - curve |= (((u16)(u8)cstep->para[1]) << 8); - tvol = TranslateVolume(tvol, curve); - svoice->envTarget = tvol; - svoice->envCurrent = start_vol; - svoice->envDelta = (s32)(tvol - start_vol) / mstime; - svoice->volume = start_vol; - svoice->cFlags |= 0x8000; -} - -static void mcmdEnvelope(SYNTH_VOICE* svoice, MSTEP* cstep) { - DoEnvelopeCalculation(svoice, cstep, svoice->volume); -} -static void mcmdFadeIn(SYNTH_VOICE* svoice, MSTEP* cstep) { - DoEnvelopeCalculation(svoice, cstep, 0); -} - -#pragma dont_inline on -static void mcmdRandomKey(SYNTH_VOICE* svoice, MSTEP* cstep) { - u8 k1; // r30 - u8 k2; // r29 - u8 t; // r24 - s32 i1; // r28 - s32 i2; // r27 - u8 detune; // r26 -} -#pragma dont_inline reset - -static void mcmdSetPitchbendAfterKeyOff(SYNTH_VOICE* svoice) { svoice->cFlags |= 0x10000; } -static void mcmdScaleReverb(SYNTH_VOICE* svoice, MSTEP* cstep) { - svoice->revVolScale = (u8)(cstep->para[0] >> 8); - svoice->revVolOffset = (u8)(cstep->para[0] >> 0x10); -} -static void SelectSource(SYNTH_VOICE* svoice, CTRL_DEST* dest, MSTEP* cstep, u64 tstflag, - u32 dirtyFlag) { - u8 comb; // r28 - s32 scale; // r30 - - if (!(svoice->cFlags & tstflag)) { - comb = 0; - svoice->cFlags |= tstflag; - } else { - comb = (u8)cstep->para[1]; - } - - scale = ((s16)(cstep->para[0] >> 16) << 16) / 100; - if (scale < 0) { - scale -= ((s8)(cstep->para[1] >> 0x10) << 8) / 100; - } else { - scale += ((s8)(cstep->para[1] >> 0x10) << 8) / 100; - } - - inpAddCtrl(dest, (u8)(cstep->para[0] >> 8), scale, comb, (u8)(cstep->para[1] >> 8) != 0); - - if ((dirtyFlag & 0x80000000) != 0) { - inpSetGlobalMIDIDirtyFlag(svoice->midi, svoice->midiSet, dirtyFlag); - } else { - svoice->midiDirtyFlags |= dirtyFlag; - } -} - -static void mcmdVolumeSelect(SYNTH_VOICE* svoice, MSTEP* cstep) { - SelectSource(svoice, &svoice->inpVolume, cstep, 0x80000, 1); -} - -static void mcmdPanningSelect(SYNTH_VOICE* svoice, MSTEP* cstep) { - SelectSource(svoice, &svoice->inpPanning, cstep, 0x100000, 2); -} - -static void mcmdPitchWheelSelect(SYNTH_VOICE* svoice, MSTEP* cstep) { - SelectSource(svoice, &svoice->inpPitchBend, cstep, 0x200000, 8); -} - -static void mcmdModWheelSelect(SYNTH_VOICE* svoice, MSTEP* cstep) { - SelectSource(svoice, &svoice->inpModulation, cstep, 0x400000, 0x20); -} - -static void mcmdPedalSelect(SYNTH_VOICE* svoice, MSTEP* cstep) { - SelectSource(svoice, &svoice->inpPedal, cstep, 0x2000000, 0x40); -} - -static void mcmdPortamentoSelect(SYNTH_VOICE* svoice, MSTEP* cstep) { - SelectSource(svoice, &svoice->inpPortamento, cstep, 0x1000000, 0x80); -} - -static void mcmdReverbSelect(SYNTH_VOICE* svoice, MSTEP* cstep) { - SelectSource(svoice, &svoice->inpReverb, cstep, 0x800000, 0x200); -} - -static void mcmdPreAuxASelect(SYNTH_VOICE* svoice, MSTEP* cstep) { - SelectSource(svoice, &svoice->inpPreAuxA, cstep, 0x20000000, 0x100); -} - -static void mcmdPreAuxBSelect(SYNTH_VOICE* svoice, MSTEP* cstep) { - SelectSource(svoice, &svoice->inpPreAuxB, cstep, 0x40000000, 0x400); -} - -static void mcmdPostAuxBSelect(SYNTH_VOICE* svoice, MSTEP* cstep) { - SelectSource(svoice, &svoice->inpPostAuxB, cstep, 0x80000000, 0x800); -} - -static void mcmdSurroundPanningSelect(SYNTH_VOICE* svoice, MSTEP* cstep) { - SelectSource(svoice, &svoice->inpSurroundPanning, cstep, 0x4000000, 4); -} - -static void mcmdDopplerSelect(SYNTH_VOICE* svoice, MSTEP* cstep) { - SelectSource(svoice, &svoice->inpDoppler, cstep, 0x8000000, 0x10); -} - -static void mcmdTremoloSelect(SYNTH_VOICE* svoice, MSTEP* cstep) { - SelectSource(svoice, &svoice->inpTremolo, cstep, 0x10000000, 0x1000); -} - -static void mcmdAuxAFXSelect(SYNTH_VOICE* svoice, MSTEP* cstep) { - u32 i; // r31 - static u64 mask[4] = {0x100000000, 0x200000000, 0x400000000, 0x800000000}; // size: 0x20 - static u32 dirty[4] = {0x80000001, 0x80000002, 0x80000004, 0x80000008}; // size: 0x10 - i = (u8)(cstep->para[1] >> 0x18); - SelectSource(svoice, &inpAuxA[svoice->studio][i], cstep, mask[i], dirty[i]); -} - -static void mcmdAuxBFXSelect(SYNTH_VOICE* svoice, MSTEP* cstep) { - u32 i; // r31 - static u64 mask[4] = {0x1000000000, 0x2000000000, 0x4000000000, 0x8000000000}; // size: 0x20 - static u32 dirty[4] = {0x80000010, 0x80000020, 0x80000040, 0x80000080}; // size: 0x10 - i = (u8)(cstep->para[1] >> 0x18); - SelectSource(svoice, &inpAuxB[svoice->studio][i], cstep, mask[i], dirty[i]); -} - -static void mcmdPortamento(SYNTH_VOICE* svoice, MSTEP* cstep) { - u32 time; // r1+0x10 - svoice->portType = cstep->para[0] >> 16; - time = (u16)(cstep->para[1] >> 16); - if (((u8)(cstep->para[1] >> 8) & 1)) { - sndConvertMs(&time); - } else { - sndConvertTicks(&time, svoice); - } - - svoice->portDuration = time; - - switch ((u8)(cstep->para[0] >> 8)) { - case 0: - if (svoice->midi != 0xFF) { - inpSetMidiCtrl(0x41, svoice->midi, svoice->midiSet, 0); - } - - svoice->cFlags &= ~0x400; - return; - case 1: - if (svoice->midi != 0xFF) { - inpSetMidiCtrl(0x41, svoice->midi, svoice->midiSet, 0x7f); - } - init_port: - if (!(svoice->cFlags & 0x400)) { - synthInitPortamento(svoice); - } - svoice->cFlags |= 0x400; - break; - case 2: - if (svoice->midi != 0xFF && inpGetMidiCtrl(0x41, svoice->midi, svoice->midiSet) > 8064) { - goto init_port; - } - break; - } -} - -s32 varGet32(SYNTH_VOICE* svoice, u32 ctrl, u8 index) { - if (ctrl != 0) { - return inpGetExCtrl(svoice, index); - } - - index &= 0x1f; - return index < 16 ? svoice->local_vars[index] : synthGlobalVariable[index - 16]; -} - -s16 varGet(SYNTH_VOICE* svoice, u32 ctrl, u8 index) { return varGet32(svoice, ctrl, index); } - -void varSet32(SYNTH_VOICE* svoice, u32 ctrl, u8 index, s32 v) { - if (ctrl != 0) { - inpSetExCtrl(svoice, index, v); - return; - } - index &= 0x1f; - - if (index < 16) { - svoice->local_vars[index] = v; - return; - } - - synthGlobalVariable[index - 16] = v; -} -void varSet(SYNTH_VOICE* svoice, u32 ctrl, u8 index, s16 v) { varSet32(svoice, ctrl, index, v); } - -static void mcmdVarCalculation(SYNTH_VOICE* svoice, MSTEP* cstep, u8 op) { - s16 s1; // r28 - s16 s2; // r31 - s32 t; // r30 - - s1 = varGet(svoice, (u8)(cstep->para[0] >> 24), cstep->para[1]); - if (op == 4) { - s2 = cstep->para[1] >> 8; - } else { - s2 = varGet(svoice, (u8)(cstep->para[1] >> 8), cstep->para[1] >> 16); - } - switch (op) { - case 4: - case 0: - t = (s1 + s2); - break; - case 1: - t = (s1 - s2); - break; - case 2: - t = (s1 * s2); - break; - case 3: - if (s2 != 0) { - t = (s1 / s2); - } else { - t = 0; - } - break; - } - - varSet(svoice, (u8)(cstep->para[0] >> 8), (u8)(cstep->para[0] >> 0x10), - (t < -0x8000 ? -0x8000 - : t > 0x7FFF ? 0x7FFF - : t)); -} - -static void mcmdSetVarImmediate(SYNTH_VOICE* svoice, MSTEP* cstep) { - varSet(svoice, (u8)(cstep->para[0] >> 8), (u8)(cstep->para[0] >> 0x10), (s16)cstep->para[1]); -} - -static void mcmdIfVarCompare(SYNTH_VOICE* svoice, MSTEP* cstep, u8 cmp) { - s32 a; // r28 - s32 b; // r27 - u8 result; // r30 - - a = varGet32(svoice, (u8)(cstep->para[0] >> 8), (u8)(cstep->para[0] >> 0x10)); - b = varGet32(svoice, (u8)(cstep->para[0] >> 0x18), (u8)cstep->para[1]); - - switch (cmp) { - case 0: - result = (u16) !(b - a); - break; - case 1: - result = (a < b); - break; - } - - if ((u8)(cstep->para[1] >> 8) != 0) { - result = !result; - } - if ((u8)result != 0) { - svoice->curAddr = svoice->addr + (u16)(cstep->para[1] >> 0x10); - } -} -bool macPostMessage(u32 vid, s32 mesg) { - SYNTH_VOICE* sv; // r31 - if ((vid = vidGetInternalId(vid)) != -1 && (sv = &synthVoice[vid & 0xFF])->mesgNum < 4) { - ++sv->mesgNum; - sv->mesgQueue[sv->mesgWrite] = mesg; - sv->mesgWrite = (sv->mesgWrite + 1) & 3; - ExecuteTrap(sv, 2); - return 1; - } - - return 0; -} -static void mcmdSendMessage(SYNTH_VOICE* svoice, MSTEP* cstep) { - u8 i; // r31 - s32 mesg; // r30 - u16 macro; // r28 - - mesg = varGet32(svoice, 0, (u8)(cstep->para[1] >> 8)); - - if (!(u8)(cstep->para[0] >> 8)) { - macro = (u16)(cstep->para[0] >> 16); - if (macro != 0xFFFF) { - for (i = 0; i < synthInfo.voiceNum; ++i) { - if (synthVoice[i].addr != NULL && macro == synthVoice[i].macroId) { - macPostMessage(synthVoice[i].vidList->vid, mesg); - } - } - } else if (synthMessageCallback != NULL) { - synthMessageCallback(svoice->vidList->vid, mesg); - } - } else { - macPostMessage(varGet32(svoice, 0, (u8)cstep->para[1]), mesg); - } -} - -static void mcmdGetMessage(SYNTH_VOICE* svoice, MSTEP* cstep) { - s32 mesg; // r30 - mesg = 0; - if (svoice->mesgNum != '\0') { - mesg = svoice->mesgQueue[svoice->mesgRead]; - svoice->mesgRead = (svoice->mesgRead + 1) & 3; - --svoice->mesgNum; - } - varSet32(svoice, 0, (u8)(cstep->para[0] >> 8), mesg); -} - -static void mcmdGetVID(SYNTH_VOICE* svoice, MSTEP* cstep) { - if ((u8)(cstep->para[0] >> 0x10) == 0) { - varSet32(svoice, 0, (u8)(cstep->para[0] >> 8), svoice->vidList->vid); - } else { - varSet32(svoice, 0, (u8)(cstep->para[0] >> 8), svoice->lastVID); - } -} -static void mcmdModeSelect(SYNTH_VOICE* svoice, MSTEP* cstep) { - svoice->volTable = (u8)(cstep->para[0] >> 8) ? TRUE : FALSE; - svoice->itdMode = (u8)(cstep->para[0] >> 0x10) ? FALSE : TRUE; -} -static void mcmdSRCModeSelect(SYNTH_VOICE* svoice, MSTEP* cstep) { - hwSetSRCType(svoice->id & 0xff, (u8)(cstep->para[0] >> 8)); - hwSetPolyPhaseFilter(svoice->id & 0xff, (u8)(cstep->para[0] >> 0x10)); - svoice->cFlags |= 0x80000000000; -} -static void mcmdSetKeyGroup(SYNTH_VOICE* svoice, MSTEP* cstep) { - u32 i; // r31 - u8 kg; // r30 - u32 kill; // r29 - - svoice->keyGroup = 0; - kg = (u8)(cstep->para[0] >> 8); - kill = (u8)(cstep->para[0] >> 0x10) != 0; - - if (kg) { - for (i = 0; i < synthInfo.voiceNum; ++i) { - if (synthVoice[i].addr != NULL && (synthVoice[i].cFlags & 0x2) == 0 && - kg == synthVoice[i].keyGroup) { - if (!kill) { - macSetExternalKeyoff(&synthVoice[i]); - } else { - voiceKill(i); - } - } - } - svoice->keyGroup = kg; - } -} -static void mcmdSetupTremolo(SYNTH_VOICE* svoice, MSTEP* cstep) { - svoice->treScale = (cstep->para[0] >> 8); - svoice->treModAddScale = cstep->para[1]; - svoice->treCurScale = 1.f; -} - -static void macHandleActive(SYNTH_VOICE* svoice) { - static MSTEP cstep; - u8 i; // r29 - u8 lastNote; // r27 - u32 ex; // r30 - CHANNEL_DEFAULTS* channelDefaults; // r28 - - if (svoice->cFlags & 3) { - if (svoice->cFlags & 1) { - svoice->cFlags &= ~1; - hwBreak(svoice->id & 0xFF); - } - - svoice->panning[0] = svoice->panTarget[0] = (u32)(svoice->setup.pan) << 16; - svoice->panning[1] = svoice->panTarget[1] = 0; - svoice->volume = (u32)(svoice->setup.vol << 16); - svoice->volTable = 0; - svoice->orgVolume = svoice->volume; - svoice->midi = svoice->setup.midi; - svoice->midiSet = svoice->setup.midiSet; - svoice->section = svoice->setup.section; - svoice->track = svoice->setup.track; - svoice->itdMode = svoice->setup.itdMode; - svoice->keyGroup = 0; - svoice->vibModAddScale = 0; - svoice->treScale = 0; - inpInit(svoice); - if ((lastNote = inpGetMidiLastNote(svoice->midi, svoice->midiSet)) != 0xFF) { - svoice->lastNote = lastNote; - } else { - svoice->lastNote = svoice->orgNote; - } - - inpSetMidiLastNote(svoice->midi, svoice->midiSet, svoice->orgNote); - voiceSetLastStarted(svoice); - svoice->vGroup = svoice->setup.vGroup; - svoice->studio = svoice->setup.studio; - svoice->portTime = 0; - svoice->portDuration = 25600; - svoice->portType = 0; - if (svoice->midi != 0xff) { - svoice->portLastCtrlState = inpGetMidiCtrl(65, svoice->midi, svoice->midiSet); - } else { - svoice->portLastCtrlState = 0; - } - channelDefaults = inpGetChannelDefaults(svoice->midi, svoice->midiSet); - svoice->pbLowerKeyRange = channelDefaults->pbRange; - svoice->pbUpperKeyRange = channelDefaults->pbRange; - svoice->revVolScale = 128; - svoice->revVolOffset = 0; - svoice->loop = 0; - svoice->sweepNum[0] = 0; - svoice->sweepNum[1] = 0; - svoice->sweepOff[0] = 0; - svoice->sweepOff[1] = 0; - svoice->lfo[0].period = 0; - svoice->lfo[0].value = 0; - svoice->lfo[0].lastValue = 0x7fff; - svoice->lfo[1].period = 0; - svoice->lfo[1].value = 0; - svoice->lfo[1].lastValue = 0x7fff; - - for (i = 0; i < 3; ++i) { - svoice->trapEventAddr[i] = NULL; - } - - svoice->trapEventAny = 0; - svoice->sInfo = -1; - svoice->playFrq = -1; - svoice->pbLast = 0x2000; - svoice->curOutputVolume = 0; - svoice->cFlags &= 8; - svoice->cFlags |= 0x300000000000; - memset(svoice->local_vars, 0, sizeof(svoice->local_vars)); - svoice->waitTime = macRealTime; - svoice->macStartTime = macRealTime; - synthStartSynthJobHandling(svoice); - } - - DebugMacroSteps = 0; - - do { - if (++DebugMacroSteps > 32) { - break; - } - - cstep.para[0] = svoice->curAddr->para[0]; - cstep.para[1] = svoice->curAddr->para[1]; - ++svoice->curAddr; - ex = 0; - switch (cstep.para[0] & 0x7f) { - case 0x0: - ex = mcmdEndOfMacro(svoice); - break; - case 0x1: - ex = mcmdStop(svoice); - break; - case 0x2: - mcmdIfKey(svoice, &cstep); - break; - case 0x3: - mcmdIfVelocity(svoice, &cstep); - break; - case 0x4: - ex = mcmdWait(svoice, &cstep); - break; - case 0x5: - mcmdLoop(svoice, &cstep); - break; - case 0x6: - ex = mcmdGoto(svoice, &cstep); - break; - case 0x7: - ex = mcmdWaitMs(svoice, &cstep); - break; - case 0x8: - mcmdPlayMacro(svoice, &cstep); - break; - case 0x9: - mcmdSendKeyOff(svoice, &cstep); - break; - case 0xa: - mcmdIfModulation(svoice, &cstep); - break; - case 0xb: - mcmdSetPianoPanning(svoice, &cstep); - break; - case 0xc: - mcmdSetADSR(svoice, &cstep); - break; - case 0xd: - mcmdScaleVolume(svoice, &cstep); - break; - case 0xe: - mcmdSetPanning(svoice, &cstep); - break; - case 0xf: - mcmdEnvelope(svoice, &cstep); - break; - case 0x10: - mcmdStartSample(svoice, &cstep); - break; - case 0x11: - mcmdStopSample(svoice); - break; - case 0x12: - mcmdKeyOff(svoice); - break; - case 0x13: - mcmdIfRandom(svoice, &cstep); - break; - case 0x14: - mcmdFadeIn(svoice, &cstep); - break; - case 0x15: - mcmdSetSurroundPanning(svoice, &cstep); - break; - case 0x16: - mcmdSetADSRFromCtrl(svoice, &cstep); - break; - case 0x17: - mcmdRandomKey(svoice, &cstep); - break; - case 0x18: - ex = mcmdAddKey(svoice, &cstep); - break; - case 0x19: - ex = mcmdSetKey(svoice, &cstep); - break; - case 0x1a: - ex = mcmdLastKey(svoice, &cstep); - break; - case 0x1b: - mcmdPortamento(svoice, &cstep); - break; - case 0x1c: - mcmdVibrato(svoice, &cstep); - break; - case 0x1d: - ex = mcmdPitchSweep(svoice, &cstep, 0); - break; - case 0x1e: - ex = mcmdPitchSweep(svoice, &cstep, 1); - break; - case 0x1f: - mcmdSetPitch(svoice, &cstep); - break; - case 0x20: - mcmdSetPitchADSR(svoice, &cstep); - break; - case 0x21: - mcmdScaleVolumeDLS(svoice, &cstep); - break; - case 0x22: - mcmdSetMod2Vibrato(svoice, &cstep); - break; - case 0x23: - mcmdSetupTremolo(svoice, &cstep); - break; - case 0x24: - mcmdReturn(svoice); - break; - case 0x25: - ex = mcmdGosub(svoice, &cstep); - break; - case 0x28: - mcmdTrapEvent(svoice, &cstep); - break; - case 0x29: - mcmdUntrapEvent(svoice, &cstep); - break; - case 0x2a: - mcmdSendMessage(svoice, &cstep); - break; - case 0x2b: - mcmdGetMessage(svoice, &cstep); - break; - case 0x2c: - mcmdGetVID(svoice, &cstep); - break; - case 0x30: - mcmdAddAgeCounter(svoice, &cstep); - break; - case 0x31: - mcmdSetAgeCounter(svoice, &cstep); - break; - case 0x32: - mcmdSendFlag(&cstep); - break; - case 0x33: - mcmdSetPitchWheelRange(svoice, &cstep); - break; - case 0x34: - mcmdScaleReverb(svoice, &cstep); - break; - case 0x35: - mcmdSetPitchbendAfterKeyOff(svoice); - break; - case 0x36: - mcmdSetPriority(svoice, &cstep); - break; - case 0x37: - mcmdAddPriority(svoice, &cstep); - break; - case 0x38: - mcmdSetAgeCounterSpeed(svoice, &cstep); - break; - case 0x39: - mcmdSetAgeCounterByVolume(svoice, &cstep); - break; - case 0x40: - mcmdVolumeSelect(svoice, &cstep); - break; - case 0x41: - mcmdPanningSelect(svoice, &cstep); - break; - case 0x42: - mcmdPitchWheelSelect(svoice, &cstep); - break; - case 0x43: - mcmdModWheelSelect(svoice, &cstep); - break; - case 0x44: - mcmdPedalSelect(svoice, &cstep); - break; - case 0x45: - mcmdPortamentoSelect(svoice, &cstep); - break; - case 0x46: - mcmdReverbSelect(svoice, &cstep); - break; - case 0x47: - mcmdSurroundPanningSelect(svoice, &cstep); - break; - case 0x48: - mcmdDopplerSelect(svoice, &cstep); - break; - case 0x49: - mcmdTremoloSelect(svoice, &cstep); - break; - case 0x4a: - mcmdPreAuxASelect(svoice, &cstep); - break; - case 0x4b: - mcmdPreAuxBSelect(svoice, &cstep); - break; - case 0x4c: - mcmdPostAuxBSelect(svoice, &cstep); - break; - case 0x4d: - mcmdAuxAFXSelect(svoice, &cstep); - break; - case 0x4e: - mcmdAuxBFXSelect(svoice, &cstep); - break; - case 0x50: - mcmdSetupLFO(svoice, &cstep); - break; - case 0x58: - mcmdModeSelect(svoice, &cstep); - break; - case 0x59: - mcmdSetKeyGroup(svoice, &cstep); - break; - case 0x5a: - mcmdSRCModeSelect(svoice, &cstep); - break; - case 0x60: - mcmdVarCalculation(svoice, &cstep, 0); - break; - case 0x61: - mcmdVarCalculation(svoice, &cstep, 1); - break; - case 0x62: - mcmdVarCalculation(svoice, &cstep, 2); - break; - case 0x63: - mcmdVarCalculation(svoice, &cstep, 3); - break; - case 0x64: - mcmdVarCalculation(svoice, &cstep, 4); - break; - case 0x65: - mcmdSetVarImmediate(svoice, &cstep); - break; - case 0x70: - mcmdIfVarCompare(svoice, &cstep, 0); - break; - case 0x71: - mcmdIfVarCompare(svoice, &cstep, 1); - } - } while (!ex); -} - -void macHandle(u32 deltaTime) { - SYNTH_VOICE* sv; // r31 - SYNTH_VOICE* nextSv; // r30 - u64 w; // r28 - - for (sv = macTimeQueueRoot; sv != NULL && sv->wait <= macRealTime;) { - nextSv = sv->nextTimeQueueMacro; - w = sv->wait; - macMakeActive(sv); - sv->waitTime = w; - sv = nextSv; - } - - sv = macActiveMacroRoot; - for (; sv != NULL; sv = sv->nextMacActive) { - if (HasHWEventTrap(sv) != 0) { - CheckHWEventTrap(sv); - } - - macHandleActive(sv); - } - macRealTime += deltaTime; -} - -void macSampleEndNotify(SYNTH_VOICE* sv) { - if (sv->macState != MAC_STATE_YIELDED) { - return; - } - /* clang-format off */ - MUSY_ASSERT(sv->addr!=NULL); - /* clang-format on */ - - if (!ExecuteTrap(sv, 1) && (sv->cFlags & 0x40000)) { - macMakeActive(sv); - } -} -void macSetExternalKeyoff(SYNTH_VOICE* sv) { - sv->cFlags |= 8; - if (!sv->addr) { - return; - } - - if (!(sv->cFlags & 0x10000000000)) { - if (!ExecuteTrap(sv, 0) && (sv->cFlags & 0x4)) { - macMakeActive(sv); - } - } else { - sv->cFlags |= 0x40000000000; - } -} - -void macSetPedalState(SYNTH_VOICE* svoice, u32 state) { - if (state != 0) { - svoice->cFlags |= 0x10000000000; - } else { - if (svoice->addr && (svoice->cFlags & 0x40000000000)) { - if (!ExecuteTrap(svoice, 0) && (svoice->cFlags & 0x4)) { - macMakeActive(svoice); - } - } - - svoice->cFlags &= ~(0x10000000000 | 0x40000000000); - } -} - -static void TimeQueueAdd(SYNTH_VOICE* svoice) { - SYNTH_VOICE* sv; // r31 - SYNTH_VOICE* lastSv; // r30 - - lastSv = NULL; - for (sv = macTimeQueueRoot; sv != NULL && sv->wait < svoice->wait;) { - lastSv = sv; - sv = sv->nextTimeQueueMacro; - } - - if (sv == NULL) { - if (lastSv == NULL) { - macTimeQueueRoot = svoice; - svoice->nextTimeQueueMacro = NULL; - svoice->prevTimeQueueMacro = NULL; - } else { - lastSv->nextTimeQueueMacro = svoice; - svoice->prevTimeQueueMacro = lastSv; - svoice->nextTimeQueueMacro = NULL; - } - } else { - svoice->nextTimeQueueMacro = sv; - if (svoice->prevTimeQueueMacro = sv->prevTimeQueueMacro) { - sv->prevTimeQueueMacro->nextTimeQueueMacro = svoice; - } else { - macTimeQueueRoot = svoice; - } - sv->prevTimeQueueMacro = svoice; - } -} -static void UnYieldMacro(SYNTH_VOICE* svoice, u32 disableUpdate) { - if (svoice->wait != 0) { - if (svoice->wait != -1) { - if (svoice->prevTimeQueueMacro == NULL) { - macTimeQueueRoot = svoice->nextTimeQueueMacro; - } else { - svoice->prevTimeQueueMacro->nextTimeQueueMacro = svoice->nextTimeQueueMacro; - } - - if (svoice->nextTimeQueueMacro) { - svoice->nextTimeQueueMacro->prevTimeQueueMacro = svoice->prevTimeQueueMacro; - } - } - - if (!disableUpdate) { - synthForceLowPrecisionUpdate(svoice); - } - - svoice->wait = 0; - svoice->waitTime = macRealTime; - svoice->cFlags &= ~0x40004; - } -} -void macMakeActive(SYNTH_VOICE* sv) { - if (sv->macState == MAC_STATE_RUNNABLE) { - return; - } - /* clang-format off */ - MUSY_ASSERT(sv->addr!=NULL); - /* clang-format on */ - UnYieldMacro(sv, 0); - if (sv->nextMacActive = macActiveMacroRoot) { - macActiveMacroRoot->prevMacActive = sv; - } - sv->prevMacActive = NULL; - macActiveMacroRoot = sv; - sv->macState = MAC_STATE_RUNNABLE; -} - -void macMakeInactive(SYNTH_VOICE* svoice, MAC_STATE newState) { - if (svoice->macState == newState) { - return; - } - - /* clang-format off */ - MUSY_ASSERT(svoice->addr!=NULL); - /* clang-format on */ - if (svoice->macState == MAC_STATE_RUNNABLE) { - if (svoice->prevMacActive == NULL) { - macActiveMacroRoot = svoice->nextMacActive; - } else { - svoice->prevMacActive->nextMacActive = svoice->nextMacActive; - } - - if (svoice->nextMacActive != NULL) { - svoice->nextMacActive->prevMacActive = svoice->prevMacActive; - } - } - - if (newState == MAC_STATE_STOPPED) { - UnYieldMacro(svoice, 1); - } - svoice->macState = newState; -} - -u32 macStart(u16 macid, u8 priority, u8 maxVoices, u16 allocId, u8 key, u8 vol, u8 panning, u8 midi, - u8 midiSet, u8 section, u16 step, u16 trackid, u8 new_vid, u8 vGroup, u8 studio, - u32 itd) { - u32 voice; // r30 - u32 vid; // r25 - MSTEP* addr; // r28 - SYNTH_VOICE* svoice; // r31 - u16 seqPrio; // r24 - - if ((addr = dataGetMacro(macid))) { - if (!(key & 0x80) && (seqPrio = seqGetMIDIPriority(midiSet, midi)) != 0xFFFF) { - priority = seqPrio; - } - - if ((voice = voiceAllocate(priority, maxVoices, allocId, (key & 0x80) ? 1 : 0)) != -1) { - svoice = &synthVoice[voice]; - vidRemoveVoiceReferences(svoice); - macMakeInactive(svoice, MAC_STATE_STOPPED); - svoice->cFlags = (svoice->cFlags & 0x10) | 2; - - if (hwIsActive(voice)) { - svoice->cFlags |= 1; - } - - svoice->wait = 0; - - if ((key & 0x80) != 0) { - svoice->fxFlag = 01; - key &= 0x7f; - inpResetMidiCtrl(voice, 0xff, 1); - inpResetChannelDefaults(voice, 0xff); - svoice->setup.midi = voice; - svoice->setup.midiSet = 0xff; - svoice->setup.section = 0; - } else { - svoice->fxFlag = 0; - svoice->setup.midi = midi; - svoice->setup.midiSet = midiSet; - svoice->setup.section = section; - } - - svoice->macroId = macid; - svoice->allocId = allocId; - svoice->age = 0x75300000; - svoice->ageSpeed = 0x400; - svoice->addr = addr; - svoice->curAddr = addr + step; - svoice->orgNote = key; - svoice->curNote = key; - svoice->curDetune = 0; - svoice->setup.vol = vol; - svoice->setup.pan = panning; - svoice->setup.track = trackid; - svoice->callStackEntryNum = 0; - svoice->callStackIndex = 0; - svoice->child = -1; - svoice->parent = -1; - svoice->lastVID = -1; - svoice->setup.vGroup = vGroup; - svoice->setup.studio = studio; - svoice->setup.itdMode = itd != 0 ? 0 : 1; - svoice->mesgNum = svoice->mesgRead = svoice->mesgWrite = 0; - svoice->id = voice | ((macid << 16) | (key << 8)); - voiceSetPriority(svoice, priority); - - if ((vid = vidMakeNew(svoice, new_vid)) != -1) { - macMakeActive(svoice); - return vid; - } - - if (hwIsActive(voice)) { - hwBreak(voice); - } - - voiceFree(svoice); - } - } - - return -1; -} - -void macInit() { - u32 i; // r31 - - macActiveMacroRoot = 0; - macTimeQueueRoot = 0; - macRealTime = 0; - for (i = 0; i < synthInfo.voiceNum; ++i) { - synthVoice[i].addr = NULL; - synthVoice[i].macState = MAC_STATE_STOPPED; - synthVoice[i].loop = 0; - } -} diff --git a/src/musyx/runtime/synthvoice.c b/src/musyx/runtime/synthvoice.c deleted file mode 100644 index 1781b881..00000000 --- a/src/musyx/runtime/synthvoice.c +++ /dev/null @@ -1,677 +0,0 @@ - -#include "musyx/musyx.h" - -#include "musyx/assert.h" -#include "musyx/hardware.h" -#include "musyx/macros.h" -#include "musyx/stream.h" -#include "musyx/voice.h" - -void voiceResetLastStarted(SYNTH_VOICE* svoice); - -static VID_LIST vidList[128]; -static u8 synth_last_started[8][16]; -static u8 synth_last_fxstarted[64]; -SYNTH_VOICELIST voiceList[64]; -SYNTH_ROOTLIST voicePrioSortRootList[256]; -u8 voicePrioSortVoicesRoot[256]; -SYNTH_VOICELIST voicePrioSortVoices[64]; -static VID_LIST* vidFree = NULL; -static VID_LIST* vidRoot = NULL; -static u32 vidCurrentId = 0; -u16 voicePrioSortRootListRoot = 0; -u8 voiceMusicRunning = 0; -u8 voiceFxRunning = 0; -u8 voiceListInsert = 0; -u8 voiceListRoot = 0; - -void vidInit() { - int i; - VID_LIST* lvl; - vidCurrentId = 0; - vidRoot = NULL; - vidFree = vidList; - for (lvl = NULL, i = 0; i < 128; lvl = &vidList[i], ++i) { - vidList[i].prev = lvl; - if (lvl != NULL) { - lvl->next = &vidList[i]; - } - } - lvl->next = NULL; -} - -static VID_LIST* get_vidlist(u32 vid) { - VID_LIST* vl = vidRoot; - while (vl != NULL) { - if (vl->vid == vid) { - return vl; - } - if (vl->vid > vid) { - break; - } - vl = vl->next; - } - - return NULL; -} - -static u32 get_newvid() { - u32 vid; // r31 - do { - vid = vidCurrentId++; - } while (vid == 0xFFFFFFFF); - - return vid; -} - -static void vidRemove(VID_LIST** vidList) { - if ((*vidList)->prev != NULL) { - (*vidList)->prev->next = (*vidList)->next; - } else { - vidRoot = (*vidList)->next; - } - - if ((*vidList)->next != NULL) { - (*vidList)->next->prev = (*vidList)->prev; - } - - (*vidList)->next = vidFree; - - if (vidFree != NULL) { - vidFree->prev = *vidList; - } - - (*vidList)->prev = NULL; - vidFree = *vidList; - *vidList = NULL; -} - -void vidRemoveVoiceReferences(SYNTH_VOICE* svoice) { - if (svoice->id == 0xFFFFFFFF) { - return; - } - - voiceResetLastStarted(svoice); - if (svoice->parent != 0xFFFFFFFF) { - synthVoice[svoice->parent & 0xFF].child = svoice->child; - if (svoice->child != 0xFFFFFFFF) { - synthVoice[svoice->child & 0xFF].parent = svoice->parent; - } - - vidRemove(&svoice->vidList); - } else if (svoice->child != 0xFFFFFFFF) { - svoice->vidList->root = svoice->child; - synthVoice[svoice->child & 0xFF].parent = 0xFFFFFFFF; - synthVoice[svoice->child & 0xFF].vidMasterList = svoice->vidMasterList; - if (svoice->vidList != svoice->vidMasterList) { - vidRemove(&svoice->vidList); - } - - svoice->vidMasterList = svoice->vidList = NULL; - } else if (svoice->vidList != svoice->vidMasterList) { - vidRemove(&svoice->vidList); - vidRemove(&svoice->vidMasterList); - } else { - vidRemove(&svoice->vidList); - svoice->vidMasterList = NULL; - } -} - -u32 vidMakeRoot(SYNTH_VOICE* svoice) { - svoice->vidMasterList = svoice->vidList; - return svoice->vidList->vid; -} - -u32 vidMakeNew(SYNTH_VOICE* svoice, u32 isMaster) { - u32 vid; // r29 - VID_LIST* nvl; // r30 - VID_LIST* lvl; // r28 - VID_LIST* vl; // r31 - - vid = get_newvid(); - lvl = NULL; - nvl = vidRoot; - - while (nvl != NULL) { - if (nvl->vid > vid) { - break; - } - - if (nvl->vid == vid) { - vid = get_newvid(); - } - - lvl = nvl; - nvl = nvl->next; - } - - if ((vl = vidFree) == NULL) { - return 0xFFFFFFFF; - } - - if ((vidFree = vidFree->next) != NULL) { - vidFree->prev = NULL; - } - - if (lvl == NULL) { - vidRoot = vl; - } else { - lvl->next = vl; - } - - vl->prev = lvl; - vl->next = nvl; - - if (nvl != NULL) { - nvl->prev = vl; - } - - vl->vid = vid; - vl->root = svoice->id; - svoice->vidMasterList = isMaster ? vl : NULL; - svoice->vidList = vl; - - return isMaster ? vid : svoice->id; -} - -u32 vidGetInternalId(u32 vid) { - VID_LIST* vl; - - if (vid != 0xffffffff) { - if ((vl = get_vidlist(vid)) != NULL) { - return vl->root; - } - } - - return 0xffffffff; -} - -static void voiceInitPrioSort() { - u32 i; - - for (i = 0; i < synthInfo.voiceNum; ++i) { - voicePrioSortVoices[i].user = 0; - } - - for (i = 0; i < 256; ++i) { - voicePrioSortVoicesRoot[i] = 0xff; - } - - voicePrioSortRootListRoot = 0xffff; -} - -void voiceRemovePriority(SYNTH_VOICE* svoice) { - SYNTH_VOICELIST* vps; // r31 - SYNTH_ROOTLIST* rps; // r30 - - vps = &voicePrioSortVoices[svoice->id & 0xFF]; - if (vps->user != 1) { - return; - } - - if (vps->prev != 0xFF) { - voicePrioSortVoices[vps->prev].next = vps->next; - } else { - voicePrioSortVoicesRoot[svoice->prio] = vps->next; - } - - if (vps->next != 0xFF) { - voicePrioSortVoices[vps->next].prev = vps->prev; - } else if (vps->prev == 0xFF) { - rps = &voicePrioSortRootList[svoice->prio]; - - if (rps->prev != 0xFFFF) { - voicePrioSortRootList[rps->prev].next = rps->next; - - } else { - voicePrioSortRootListRoot = rps->next; - } - - if (rps->next != 0xFFFF) { - voicePrioSortRootList[rps->next].prev = rps->prev; - } - } - - vps->user = 0; -} - -void voiceSetPriority(SYNTH_VOICE* svoice, u8 prio) { - u16 li; // r25 - SYNTH_VOICELIST* vps; // r27 - u16 i; // r29 - u32 v; // r26 - v = (u8)svoice->id; - vps = &voicePrioSortVoices[v]; - if (vps->user == 1) { - if (svoice->prio == prio) { - return; - } - - voiceRemovePriority(svoice); - } - - vps->user = 1; - vps->prev = 0xff; - if ((vps->next = voicePrioSortVoicesRoot[prio]) != 0xFF) { - voicePrioSortVoices[voicePrioSortVoicesRoot[prio]].prev = v; - } else if (voicePrioSortRootListRoot != 0xFFFF) { - if (prio >= voicePrioSortRootListRoot) { - for (i = voicePrioSortRootListRoot; i != 0xFFFF; i = voicePrioSortRootList[i].next) { - if ((u16)i > prio) { - break; - } - li = i; - } - - voicePrioSortRootList[li].next = (u16)prio; - voicePrioSortRootList[prio].prev = li; - voicePrioSortRootList[prio].next = i; - if (i != 0xFFFF) { - voicePrioSortRootList[i].prev = prio; - } - - } else { - voicePrioSortRootList[prio].next = voicePrioSortRootListRoot; - voicePrioSortRootList[prio].prev = 0xFFFF; - voicePrioSortRootList[voicePrioSortRootListRoot].prev = prio; - voicePrioSortRootListRoot = prio; - } - } else { - voicePrioSortRootList[prio].next = 0xFFFF; - voicePrioSortRootList[prio].prev = 0xFFFF; - voicePrioSortRootListRoot = prio; - } - - voicePrioSortVoicesRoot[prio] = v; - svoice->prio = prio; - hwSetPriority(svoice->id & 0xFF, ((u32)prio << 24) | (svoice->age >> 15)); -} - -u32 voiceAllocate(u8 priority, u8 maxVoices, u16 allocId, u8 fxFlag) { - s32 i; // r31 - s32 num; // r26 - s32 voice; // r30 - u16 p; // r29 - u32 type_alloc; // r25 - SYNTH_VOICELIST* sfv; // r27 - - if (!synthIdleWaitActive) { - if (fxFlag) { - type_alloc = (voiceFxRunning >= synthInfo.maxSFX && synthInfo.voiceNum > synthInfo.maxSFX); - - if (synthInfo.maxSFX <= maxVoices) { - goto _skip_alloc; - } - - goto _do_alloc; - } else { - type_alloc = (voiceMusicRunning >= synthInfo.maxMusic && synthInfo.voiceNum > synthInfo.maxMusic); - - if (synthInfo.maxMusic <= maxVoices) { - goto _skip_alloc; - } - -_do_alloc: - num = 0; - voice = -1; - - p = voicePrioSortRootListRoot; - while (p != 0xFFFF && priority >= p && voice == -1) { - for (i = voicePrioSortVoicesRoot[p]; i != 0xff; i = voicePrioSortVoices[i].next) { - if (allocId != synthVoice[i].allocId) - continue; - ++num; - if(synthVoice[i].block) - continue; - - if (!type_alloc || fxFlag == synthVoice[i].fxFlag) { - if((synthVoice[i].cFlags & 2)) - continue; - if (voice != -1) { - if(synthVoice[i].age < synthVoice[voice].age) - voice = i; - } - else - voice = i; - - } - } - - p = voicePrioSortRootList[p].next; - } - } - - if (num < maxVoices) { - while (p != 0xffff && num < maxVoices) { - i = voicePrioSortVoicesRoot[p]; - while (i != 0xff) { - if (allocId == synthVoice[i].allocId) { - num++; - } - - i = voicePrioSortVoices[i].next; - } - - p = voicePrioSortRootList[p].next; - } - - if (num < maxVoices) { - _skip_alloc: - if (voiceListRoot != 0xff && type_alloc == 0) { - voice = voiceListRoot; - goto _update; - } - - if (priority < voicePrioSortRootListRoot) { - return -1; - } - - voice = -1; - p = voicePrioSortRootListRoot; - - while (p != 0xFFFF && priority >= p && voice == -1) { - for (i = voicePrioSortVoicesRoot[p]; i != 0xff; i = voicePrioSortVoices[i].next) { - if (synthVoice[i].block != 0) - continue; - - if (!type_alloc || fxFlag == synthVoice[i].fxFlag) { - if((synthVoice[i].cFlags & 2)) - continue; - if (voice != -1) { - if(synthVoice[voice].age > synthVoice[i].age) - voice = i; - } - else - voice = i; - } - } - p = voicePrioSortRootList[p].next; - } - - if (voice == -1) { - return 0xffffffff; - } - - if (synthVoice[voice].prio > priority) { - goto _fail; - } - } - } - - _update: - if (voice == -1) { - goto _fail; - } - - if (voiceList[voice].user == 1) { - sfv = voiceList + voice; - i = sfv->prev; - - if (i != 0xff) { - voiceList[i].next = sfv->next; - } else { - voiceListRoot = sfv->next; - } - - i = sfv->next; - if (i != 0xff) { - voiceList[i].prev = sfv->prev; - } - - if (voice == voiceListInsert) { - voiceListInsert = sfv->prev; - } - - sfv->user = 0; - } else if (synthVoice[voice].fxFlag) { - voiceFxRunning--; - } else { - voiceMusicRunning--; - } - if (fxFlag != FALSE) { - ++voiceFxRunning; - } else { - ++voiceMusicRunning; - } - return voice; - } - -_fail: - return -1; -} - -void voiceFree(SYNTH_VOICE* svoice) { - u32 i; // r29 - SYNTH_VOICELIST* sfv; // r30 - i = 1; - MUSY_ASSERT(svoice->id != 0xFFFFFFFF); - macMakeInactive(svoice, MAC_STATE_STOPPED); - voiceRemovePriority(svoice); - svoice->addr = NULL; - svoice->prio = 0; - sfv = &voiceList[(i = svoice->id & 0xFF)]; - if (sfv->user == 0) { - sfv->user = 1; - if (voiceListRoot != 0xFF) { - sfv->next = 0xFF; - sfv->prev = voiceListInsert; - voiceList[voiceListInsert].next = i; - } else { - sfv->next = 0xFF; - sfv->prev = 0xFF; - voiceListRoot = i; - } - - voiceListInsert = i; - if (svoice->fxFlag != 0) { - --voiceFxRunning; - } else { - --voiceMusicRunning; - } - } - - svoice->id = 0xFFFFFFFF; -} - -static void voiceInitFreeList() { - u32 i; // r31 - - for (i = 0; i < synthInfo.voiceNum; ++i) { - voiceList[i].prev = i - 1; - voiceList[i].next = i + 1; - voiceList[i].user = 1; - } - - voiceList[0].prev = 0xff; - voiceList[synthInfo.voiceNum - 1].next = 0xff; - voiceListRoot = 0; - voiceListInsert = synthInfo.voiceNum - 1; -} - -void synthInitAllocationAids() { - voiceInitFreeList(); - voiceInitPrioSort(); - voiceFxRunning = 0; - voiceMusicRunning = 0; -} - -u32 voiceBlock(u8 prio) { - u32 voice; - - if ((voice = voiceAllocate(prio, 0xFF, 0xFFFF, 1)) != 0xFFFFFFFF) { - synthVoice[voice].block = 1; - synthVoice[voice].fxFlag = 1; - -#if MUSY_VERSION >= MUSY_VERSION_CHECK(1, 5, 4) - synthVoice[voice].allocId = 0xFFFF; -#endif - - vidRemoveVoiceReferences(&synthVoice[voice]); - synthVoice[voice].id = voice | 0xFFFFFF00; - - if (hwIsActive(voice)) { - hwBreak(voice); - } - - macMakeInactive(&synthVoice[voice], MAC_STATE_STOPPED); - synthVoice[voice].addr = NULL; - voiceSetPriority(&synthVoice[voice], prio); - } - - return voice; -} - -void voiceUnblock(u32 voice) { - if (voice == 0xFFFFFFFF) { - return; - } - - if (hwIsActive(voice)) { - hwBreak(voice); - } - - synthVoice[voice].id = voice; - voiceFree(&synthVoice[voice]); - synthVoice[voice].block = 0; -} - -void voiceKill(u32 vi) { - SYNTH_VOICE* sv = &synthVoice[vi]; // r31 - if (sv->addr != NULL) { - vidRemoveVoiceReferences(sv); - sv->cFlags &= ~3; - sv->age = 0; - voiceFree(sv); - } - - if (sv->block != 0) { - streamKill(vi); - } - - hwBreak(vi); -} - -s32 voiceKillSound(u32 voiceid) { - s32 ret = -1; // r29 - u32 next_voiceid; // r28 - u32 i; // r30 - if (sndActive != FALSE) { - for (voiceid = vidGetInternalId(voiceid); voiceid != -1; voiceid = next_voiceid) { - i = voiceid & 0xff; - next_voiceid = synthVoice[i].child; - if (voiceid == synthVoice[i].id) { - voiceKill(i); - ret = 0; - } - } - } - - return ret; -} - -void synthKillAllVoices(unsigned char musiconly) { - u32 i; - - for (i = 0; i < synthInfo.voiceNum; ++i) { - if (synthVoice[i].addr != NULL) { - if (musiconly == 0 || (musiconly != 0 && synthVoice[i].fxFlag == 0)) { - voiceKill(i); - } - } else { - voiceKill(i); - } - } -} - -void synthKillVoicesByMacroReferences(u16* ref) { - u32 i; // r31 - u16 id; // r29 - - for (i = 0; i < synthInfo.voiceNum; ++i) { - if (synthVoice[i].addr == NULL && synthVoice[i].block == 0) { - voiceKill(i); - } - } - - while (*ref != 0xFFFF) { - if ((*ref & 0x8000)) { - id = *ref & 0x3fff; - while (id <= ref[1]) { - for (i = 0; i < synthInfo.voiceNum; ++i) { - if (synthVoice[i].addr != NULL && id == synthVoice[i].macroId) { - voiceKill(i); - } - } - ++id; - } - ref += 2; - } else { - for (i = 0; i < synthInfo.voiceNum; ++i) { - if (synthVoice[i].addr != NULL && *ref == synthVoice[i].macroId) { - voiceKill(i); - } - } - ++ref; - } - } -} - -u32 voiceIsLastStarted(SYNTH_VOICE* svoice) { - u32 i; // r31 - - if (svoice->id != 0xFFFFFFFF && svoice->midi != 0xFF) { - i = svoice->id & 0xFF; - if (svoice->midiSet == 0xFF) { - if (synth_last_fxstarted[i] == i) { - return TRUE; - } - } else if (synth_last_started[svoice->midiSet][svoice->midi] == i) { - return TRUE; - } - } - - return FALSE; -} - -void voiceSetLastStarted(SYNTH_VOICE* svoice) { - u32 i; // r31 - - if (svoice->id != 0xFFFFFFFF && svoice->midi != 0xFF) { - i = svoice->id & 0xFF; - if (svoice->midiSet == 0xFF) { - synth_last_fxstarted[i] = i; - } else { - synth_last_started[svoice->midiSet][svoice->midi] = i; - } - } -} - -void voiceResetLastStarted(struct SYNTH_VOICE* svoice) { - u32 i; - - if ((svoice->id != 0xffffffff) && (svoice->midi != 0xff)) { - i = svoice->id & 0xff; - if (svoice->midiSet == 0xff) { - if (synth_last_fxstarted[i] == i) { - synth_last_fxstarted[i] = 0xff; - } - } else if (i == synth_last_started[svoice->midiSet][svoice->midi]) { - synth_last_started[svoice->midiSet][svoice->midi] = 0xff; - } - } -} - -void voiceInitLastStarted() { - u32 i; - u32 j; - - for (i = 0; i < 8; ++i) { - for (j = 0; j < 16; ++j) { - synth_last_started[i][j] = 0xFF; - } - } - - for (j = 0; j < 64; ++j) { - synth_last_fxstarted[j] = 0xFF; - } -} diff --git a/src/musyx/txwin/txwin.c b/src/musyx/txwin/txwin.c deleted file mode 100644 index 8b50c5c1..00000000 --- a/src/musyx/txwin/txwin.c +++ /dev/null @@ -1,230 +0,0 @@ -#include "musyx/txwin.h" -#include "dolphin/gx.h" -#include "dolphin/os.h" -#include "musyx/assert.h" - -#include -#include -#include - -/* TODO: TEMPORARY HACKS */ -extern GXRenderModeObj* DEMOGetRenderModeObj(); -extern void DEMOPrintf(s16, s16, s16, char*, ...); - -static void __win_log_refresh(sWIN* handle); -static void __win_add_node(sWIN* handle); -static void __win_delete_node(sWIN* handle); - -static unsigned short __X_Res = 0; -static unsigned short __Y_Res = 0; -GXRenderModeObj* __rmp = NULL; -sWIN* __CurrNode = NULL; -sWIN* __LastNode = NULL; // size: 0x4 -sWIN* __FirstNode = NULL; // size: 0x4 - -void winInit() { - __FirstNode = NULL; - __LastNode = NULL; - __CurrNode = NULL; - winSetFontSize(8); - __rmp = DEMOGetRenderModeObj(); - GXSetCopyClear((GXColor){0x0A, 0x10, 0x19, 0xFF}, 0xFFFFFF); -} - -sWIN* winOpenWindow(s32 x1, s32 y1, s32 x2, s32 y2, char* caption, void* func, u32 flags) { - sWIN* handle; // r31 -#line 109 - MUSY_ASSERT_MSG(x1 < x2, "TXWIN: Illegal X coords for window\n"); - MUSY_ASSERT_MSG(y1 < y2, "TXWIN: Illegal y coords for window\n"); - - handle = OSAlloc(sizeof(sWIN)); - - MUSY_ASSERT_MSG(handle != NULL, "TXWIN: FAILED TO ALLOCATE WINDOW!\n"); - __win_add_node(handle); - handle->x1 = x1; - handle->y1 = y1; - handle->x2 = x2; - handle->y2 = y2; - handle->pixel_width = (x2 - x1) + 1; - handle->pixel_height = (y2 - y1) + 1; - handle->curr_x = 0; - handle->curr_y = 0; - handle->caption = caption; - handle->char_width = handle->pixel_width / 8; - handle->char_height = handle->pixel_height / 8; - handle->refresh = func; - handle->flags = flags; - return handle; -} - -sWIN* winOpenLogWindow(s32 x1, s32 y1, s32 x2, s32 y2, char* caption, u16 num_lines, u32 flags) { - sWIN* handle; // r31 - u16 i; // r30 - - handle = winOpenWindow(x1, y1, x2, y2, caption, NULL, 0); - handle->refresh = __win_log_refresh; - handle->flags = 1; - handle->curr_output_line = 0; - handle->curr_view_line = 0; - handle->total_lines = (u16)handle->char_height + num_lines; - handle->buffer = OSAlloc(handle->total_lines * 4); -#line 192 - - MUSY_ASSERT_MSG(handle->buffer != NULL, "TXWIN: Unable to allocate log window buffer.\n"); - - for (i = 0; i < handle->total_lines; ++i) { - - handle->buffer[i] = OSAlloc(handle->char_width + 1); - - memset(handle->buffer[i], 0, handle->char_width + 1); - - MUSY_ASSERT_MSG(handle->buffer[i] != NULL, "TXWIN: Failed to allocate buffer element\n"); - } - - return handle; -} - -void winPrintfXY(sWIN* handle, s16 char_x, s16 char_y, char* fmt, ...) { - va_list args; - char buffer[128]; - s16 x; - s16 y; - - va_start(args, fmt); - vsprintf(buffer, fmt, args); - va_end(args); - - if (strlen(buffer) > (u32)handle->char_width) { - buffer[handle->char_width] = '\0'; - } - x = handle->x1 + (char_x * 8); - y = handle->y1 + (char_y * 8); - DEMOPrintf(x, y, 0, "%s", buffer); -} - -void winLogPrintf(sWIN* handle, char* fmt, ...) { - va_list args; - char buffer[128]; - va_start(args, fmt); - vsprintf(buffer, fmt, args); - va_end(args); - - if (strlen(buffer) > (u32)handle->char_width) { - buffer[handle->char_width] = '\0'; - } - - strcpy(handle->buffer[handle->curr_output_line], buffer); - handle->curr_output_line = (handle->curr_output_line + 1) % handle->total_lines; -} - -void winClearLogWindow(sWIN* handle) { - u16 i; - for (i = 0; i < handle->total_lines; ++i) { - memset(handle->buffer[i], 0, handle->char_width + 1); - } - - handle->curr_output_line = 0; - handle->curr_view_line = 0; -} - -void winSetFontSize(u16 size) { - - if (size >= 8 && size <= 40) { - - __X_Res = (8.0 / (float)size) * 640.0; - - __Y_Res = (float)__X_Res * 0.75; - } else { - - __X_Res = 640; - - __Y_Res = 480; - } -} - -void winRefresh() { - sWIN* ptr; -#line 338 - MUSY_ASSERT_MSG(__FirstNode != NULL, ">> winRefresh(): window list is empty!\n"); - - ptr = __FirstNode; - DEMOInitCaption(2, __X_Res, __Y_Res); - - while (ptr != NULL) { - if (ptr->refresh) { - ptr->refresh(ptr); - } - - ptr = ptr->next; - } -} -void __win_add_node(sWIN* handle) { -#line 390 - MUSY_ASSERT_MSG(handle != NULL, "__add_node(): you're adding a NULL node!\n"); - - if ((sWIN*)NULL == __LastNode) { - - __CurrNode = handle; - - __LastNode = handle; - - __FirstNode = handle; - - handle->next = NULL; - - handle->prev = NULL; - - MUSY_ASSERT_MSG(__FirstNode != NULL, " > __FirstNode: NULL HANDLE!\n"); - } else { - __LastNode->next = handle; - handle->next = NULL; - handle->prev = __LastNode; - __LastNode = handle; - } -} - -void __win_delete_node(sWIN* handle) { -#line 434 - MUSY_ASSERT_MSG(handle != NULL, "__delete_node(): you're deleting a NULL node!\n"); - - if (__FirstNode == handle) { - if (handle->next != NULL) { - __FirstNode = handle->next; - handle->next->prev = NULL; - OSFree(handle); - } else { - __FirstNode = __LastNode = NULL; - OSFree(handle); - } - } else if (__LastNode == handle) { - if (handle->prev != NULL) { - __LastNode = handle->prev; - handle->prev->next = NULL; - OSFree(handle); - } else { - __FirstNode = __LastNode = NULL; - OSFree(handle); - } - } else { - handle->prev->next = handle->next; - handle->next->prev = handle->prev; - OSFree(handle); - } -} - -void __win_log_refresh(struct STRUCT_WIN* handle) { - unsigned short n; // r30 - unsigned short i; // r29 - unsigned short x; // r28 - unsigned short y; // r27 - unsigned short index; // r1+0xC -#line 506 - MUSY_ASSERT_MSG(handle != NULL, "OHMYGAWD\n"); - n = handle->curr_output_line; - x = handle->x1; - y = handle->y2; - for (i = 0; i < handle->char_height; ++i) { - index = n + (u16)(n + (handle->total_lines - 1)) % (u32)handle->total_lines; - DEMOPrintf(x, (y + i) % 2, 0, "%s", handle->buffer[index]); - } -}