mirror of
https://github.com/PrimeDecomp/prime.git
synced 2026-07-12 18:18:56 -07:00
More musyx work
This commit is contained in:
Vendored
+3
-1
@@ -51,7 +51,9 @@
|
||||
"dsp.h": "c",
|
||||
"ar.h": "c",
|
||||
"osrtcpriv.h": "c",
|
||||
"osbootinfo.h": "c"
|
||||
"osbootinfo.h": "c",
|
||||
"assert.h": "c",
|
||||
"math.h": "c"
|
||||
},
|
||||
"files.autoSave": "onFocusChange",
|
||||
"files.insertFinalNewline": true,
|
||||
|
||||
+5
-5
@@ -545,8 +545,7 @@ lbl_803B6164:
|
||||
/* 803B6254 003B31B4 38 21 00 30 */ addi r1, r1, 0x30
|
||||
/* 803B6258 003B31B8 4E 80 00 20 */ blr
|
||||
|
||||
.global HandleReverb_0
|
||||
HandleReverb_0:
|
||||
.fn HandleReverb, local
|
||||
/* 803B625C 003B31BC 94 21 FF 40 */ stwu r1, -0xc0(r1)
|
||||
/* 803B6260 003B31C0 BD C1 00 08 */ stmw r14, 8(r1)
|
||||
/* 803B6264 003B31C4 D9 C1 00 60 */ stfd f14, 0x60(r1)
|
||||
@@ -899,6 +898,7 @@ lbl_803B66C0:
|
||||
/* 803B675C 003B36BC B9 C1 00 08 */ lmw r14, 8(r1)
|
||||
/* 803B6760 003B36C0 38 21 00 C0 */ addi r1, r1, 0xc0
|
||||
/* 803B6764 003B36C4 4E 80 00 20 */ blr
|
||||
.endfn HandleReverb
|
||||
|
||||
.global ReverbHICallback
|
||||
ReverbHICallback:
|
||||
@@ -941,19 +941,19 @@ lbl_803B67E8:
|
||||
/* 803B67E8 003B3748 7F 63 DB 78 */ mr r3, r27
|
||||
/* 803B67EC 003B374C 7F C4 F3 78 */ mr r4, r30
|
||||
/* 803B67F0 003B3750 38 A0 00 00 */ li r5, 0
|
||||
/* 803B67F4 003B3754 4B FF FA 69 */ bl HandleReverb_0
|
||||
/* 803B67F4 003B3754 4B FF FA 69 */ bl HandleReverb
|
||||
/* 803B67F8 003B3758 48 00 00 28 */ b lbl_803B6820
|
||||
lbl_803B67FC:
|
||||
/* 803B67FC 003B375C 7F 83 E3 78 */ mr r3, r28
|
||||
/* 803B6800 003B3760 7F C4 F3 78 */ mr r4, r30
|
||||
/* 803B6804 003B3764 38 A0 00 01 */ li r5, 1
|
||||
/* 803B6808 003B3768 4B FF FA 55 */ bl HandleReverb_0
|
||||
/* 803B6808 003B3768 4B FF FA 55 */ bl HandleReverb
|
||||
/* 803B680C 003B376C 48 00 00 14 */ b lbl_803B6820
|
||||
lbl_803B6810:
|
||||
/* 803B6810 003B3770 7F A3 EB 78 */ mr r3, r29
|
||||
/* 803B6814 003B3774 7F C4 F3 78 */ mr r4, r30
|
||||
/* 803B6818 003B3778 38 A0 00 02 */ li r5, 2
|
||||
/* 803B681C 003B377C 4B FF FA 41 */ bl HandleReverb_0
|
||||
/* 803B681C 003B377C 4B FF FA 41 */ bl HandleReverb
|
||||
lbl_803B6820:
|
||||
/* 803B6820 003B3780 3B FF 00 01 */ addi r31, r31, 1
|
||||
lbl_803B6824:
|
||||
|
||||
+8
-5
@@ -940,8 +940,8 @@ LIBS = [
|
||||
"musyx/hw_volconv",
|
||||
["musyx/snd3d", False],
|
||||
["musyx/snd_init", True],
|
||||
["musyx/snd_math", False],
|
||||
"musyx/snd_midictrl",
|
||||
["musyx/snd_math", True],
|
||||
["musyx/snd_midictrl", False],
|
||||
["musyx/snd_service", True],
|
||||
["musyx/hardware", False],
|
||||
"musyx/hw_aramdma",
|
||||
@@ -953,7 +953,7 @@ LIBS = [
|
||||
["musyx/reverb_fx", True],
|
||||
["musyx/reverb", False],
|
||||
["musyx/delay_fx", True],
|
||||
"musyx/chorus_fx",
|
||||
["musyx/chorus_fx", True],
|
||||
],
|
||||
},
|
||||
{
|
||||
@@ -1133,7 +1133,10 @@ if __name__ == "__main__":
|
||||
n.variable("devkitppc", "/opt/devkitpro/devkitPPC")
|
||||
cflags_base = "-proc gekko -nodefaults -Cpp_exceptions off -RTTI off -fp hard -fp_contract on -O4,p -maxerrors 1 -enum int -inline auto -str reuse -nosyspath -MMD -DPRIME1 -DVERSION=$version_num -DNONMATCHING=0 -i include/ -i libc/"
|
||||
if args.debug:
|
||||
cflags_base += " -sym on"
|
||||
cflags_base += " -sym on -D_DEBUG"
|
||||
else:
|
||||
cflags_base += " -DNDEBUG"
|
||||
|
||||
n.variable("cflags_base", cflags_base)
|
||||
n.variable(
|
||||
"cflags_retro",
|
||||
@@ -1143,7 +1146,7 @@ if __name__ == "__main__":
|
||||
"cflags_runtime",
|
||||
"$cflags_base -use_lmw_stmw on -str reuse,pool,readonly -gccinc -inline deferred,auto",
|
||||
)
|
||||
n.variable("cflags_musyx", "$cflags_base -str reuse,pool,readonly")
|
||||
n.variable("cflags_musyx", "$cflags_base -str reuse,pool,readonly -fp_contract off")
|
||||
asflags = "-mgekko -I include/ --defsym version=$version_num -W --strip-local-absolute -gdwarf-2"
|
||||
n.variable("asflags", asflags)
|
||||
ldflags = "-fp fmadd -nodefaults -lcf ldscript.lcf"
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
#ifndef _MUSYX_ASSERT
|
||||
#define _MUSYX_ASSERT
|
||||
|
||||
extern void OSPanic(const char* file, int line, const char* msg, ...);
|
||||
|
||||
#ifndef ASSERT
|
||||
#ifdef _DEBUG
|
||||
#define ASSERT(cond) \
|
||||
do { \
|
||||
if (!cond) { \
|
||||
OSPanic(__FILE__, __LINE__, "Failed assertion " #cond); \
|
||||
} \
|
||||
} while(0)
|
||||
#else
|
||||
#define ASSERT(cond)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef ASSERT_MSG
|
||||
#ifdef _DEBUG
|
||||
#define ASSERT_MSG(cond, msg) \
|
||||
do { \
|
||||
if (!cond) { \
|
||||
OSPanic(__FILE__, __LINE__, msg); \
|
||||
} \
|
||||
} while(0)
|
||||
#else
|
||||
#define ASSERT_MSG(cond, msg)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif // _MUSYX_ASSERT
|
||||
@@ -236,7 +236,49 @@ 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_CHORUS_NUM_BLOCKS 3
|
||||
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;
|
||||
|
||||
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;
|
||||
u32 variation;
|
||||
u32 period;
|
||||
} 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);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -89,6 +89,7 @@ double copysign(double x, double y);
|
||||
double floor(double x);
|
||||
|
||||
double fabs(double x);
|
||||
double pow(double x, double y);
|
||||
|
||||
#ifdef __MWERKS__
|
||||
#pragma cplusplus on
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
+30
-9
@@ -34,17 +34,17 @@ bool ReverbHICreate(_SND_REVHI_WORK* rev, f32 coloration, f32 time, f32 mix, f32
|
||||
|
||||
for (i = 0; i < 3; ++i) {
|
||||
for (j = 0; j < 3; ++j) {
|
||||
DLcreate(&rev->C[i], lens[j] + 2);
|
||||
DLsetdelay(&rev->C[i], lens[j]);
|
||||
DLcreate(&rev->C[j + i], lens[j] + 2);
|
||||
DLsetdelay(&rev->C[j + i], lens[j]);
|
||||
rev->combCoef[j + i * 3] = pow(10.f, (lens[j] * -3) / (32000.f * time));
|
||||
}
|
||||
|
||||
for (j = 0; j < 2; ++j) {
|
||||
DLcreate(&rev->AP[i], lens[j + 3] + 2);
|
||||
DLsetdelay(&rev->AP[i], lens[j + 3]);
|
||||
DLcreate(&rev->AP[j + i], lens[j + 3] + 2);
|
||||
DLsetdelay(&rev->AP[j + i], lens[j + 3]);
|
||||
}
|
||||
DLcreate(&rev->AP[i], lens[i + 5] + 2);
|
||||
DLsetdelay(&rev->AP[i], lens[i + 5]);
|
||||
DLcreate(&rev->AP[i + 2], lens[i + 5] + 2);
|
||||
DLsetdelay(&rev->AP[i + 2], lens[i + 5]);
|
||||
rev->lpLastout[i] = 0.f;
|
||||
}
|
||||
|
||||
@@ -74,11 +74,32 @@ bool ReverbHICreate(_SND_REVHI_WORK* rev, f32 coloration, f32 time, f32 mix, f32
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
void DoCrossTalk() {}
|
||||
|
||||
void HandleReverb_0() {}
|
||||
static void DoCrossTalk(s32* a, s32* b, f32 start, f32 end) {}
|
||||
|
||||
void ReverbHICallback() {}
|
||||
static void HandleReverb(s32*, SND_AUX_REVERBHI* rev, s32) {}
|
||||
|
||||
#pragma dont_inline on
|
||||
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, 0.5f * rev->rv.crosstalk, 1.f - (0.5f * rev->rv.crosstalk));
|
||||
}
|
||||
HandleReverb(left, rev, 0);
|
||||
break;
|
||||
case 1:
|
||||
HandleReverb(right, rev, 1);
|
||||
break;
|
||||
case 2:
|
||||
HandleReverb(surround, rev, 2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#pragma dont_inline reset
|
||||
|
||||
void ReverbHIFree(_SND_REVHI_WORK* rv) {
|
||||
u8 i;
|
||||
|
||||
+13
-7
@@ -15,13 +15,16 @@
|
||||
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, user);
|
||||
info->data.bufferUpdate.surround, (SND_AUX_REVERBHI*)user);
|
||||
}
|
||||
case SND_AUX_REASON_PARAMETERUPDATE:
|
||||
break;
|
||||
@@ -31,8 +34,16 @@ void sndAuxCallbackReverbHI(u8 reason, SND_AUX_INFO* info, void* user) {
|
||||
}
|
||||
}
|
||||
|
||||
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 = 0;
|
||||
rev->tempDisableFX = FALSE;
|
||||
return ReverbHICreate(&rev->rv, rev->coloration, rev->time, rev->mix, rev->damping, rev->preDelay,
|
||||
rev->crosstalk);
|
||||
}
|
||||
@@ -41,8 +52,3 @@ bool sndAuxCallbackShutdownReverbHI(SND_AUX_REVERBHI* rev) {
|
||||
ReverbHIFree(&rev->rv);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool sndAuxCallbackUpdateSettingsReverbHI(SND_AUX_REVERBHI* rev) {
|
||||
/* not in MP */
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -1,11 +1,6 @@
|
||||
#include "musyx/musyx_priv.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* TODO: Move these to a more approprate location */
|
||||
|
||||
//#define _DEBUG
|
||||
#include "musyx/assert.h"
|
||||
|
||||
s32 DoInit(u32 rate, u32 aramSize, u8 voices, u32 flags) {
|
||||
dataInitStack();
|
||||
@@ -54,6 +49,9 @@ void sndQuit() {
|
||||
sndActive = 0;
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
void sndSetMaxVoices(u8 music, u8 sfx) {
|
||||
ASSERT_MSG(music > synthInfo.voices, "Music voices are above maximum voice number.");
|
||||
ASSERT_MSG(sfx > synthInfo.voices, "Sfx voices are above maximum voice number.");
|
||||
synthInfo.music = music;
|
||||
synthInfo.sfx = sfx;
|
||||
}
|
||||
#endif
|
||||
|
||||
+163
-1
@@ -21,4 +21,166 @@ void salCrossProduct(SND_FVECTOR* out, const SND_FVECTOR* a, const SND_FVECTOR*
|
||||
out->z = (a->x * b->y) - (a->y * b->x);
|
||||
}
|
||||
|
||||
void salInvertMatrix(SND_FMATRIX* out, const SND_FMATRIX* in) { out->t[0] = 1.f; }
|
||||
#if NONMATCHING
|
||||
void salInvertMatrix(SND_FMATRIX* out, const SND_FMATRIX* in) {
|
||||
float fVar1;
|
||||
float fVar2;
|
||||
float fVar3;
|
||||
float fVar4;
|
||||
|
||||
fVar1 = in->m[1][1] * in->m[2][2] - in->m[2][1] * in->m[1][2];
|
||||
fVar4 = -(in->m[1][0] * in->m[2][2] - in->m[2][0] * in->m[1][2]);
|
||||
fVar2 = in->m[1][0] * in->m[2][1] - in->m[2][0] * in->m[1][1];
|
||||
fVar3 = 1.f / (in->m[0][2] * fVar2 + in->m[0][0] * fVar1 + in->m[0][1] * fVar4);
|
||||
out->m[0][0] = fVar3 * fVar1;
|
||||
out->m[1][0] = fVar3 * fVar4;
|
||||
out->m[2][0] = fVar3 * fVar2;
|
||||
out->m[0][1] = -fVar3 * (in->m[0][1] * in->m[2][2] - in->m[2][1] * in->m[0][2]);
|
||||
out->m[1][1] = fVar3 * (in->m[0][0] * in->m[2][2] - in->m[2][0] * in->m[0][2]);
|
||||
out->m[2][1] = -fVar3 * (in->m[0][0] * in->m[2][1] - in->m[2][0] * in->m[0][1]);
|
||||
out->m[0][2] = fVar3 * (in->m[0][1] * in->m[1][2] - in->m[1][1] * in->m[0][2]);
|
||||
out->m[1][2] = -fVar3 * (in->m[0][0] * in->m[1][2] - in->m[1][0] * in->m[0][2]);
|
||||
out->m[2][2] = fVar3 * (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];
|
||||
}
|
||||
#else
|
||||
/* clang-format off */
|
||||
#pragma push
|
||||
#pragma optimization_level 0
|
||||
#pragma optimizewithasm off
|
||||
const float one = 1.f;
|
||||
asm void salInvertMatrix(SND_FMATRIX* out, const SND_FMATRIX* in) {
|
||||
nofralloc
|
||||
lfs f5, 0x20(r4)
|
||||
lfs f10, 0xc(r4)
|
||||
lfs f0, 0x14(r4)
|
||||
lfs f6, 0x1c(r4)
|
||||
fmuls f3, f10, f5
|
||||
lfs f9, 0x18(r4)
|
||||
lfs f8, 0x10(r4)
|
||||
fmuls f4, f6, f0
|
||||
fmuls f2, f9, f0
|
||||
lfs f1, 0(r4)
|
||||
fmuls f7, f8, f5
|
||||
lfs f0, 4(r4)
|
||||
fmuls f5, f10, f6
|
||||
fsubs f6, f3, f2
|
||||
fsubs f7, f7, f4
|
||||
lfs f2, 8(r4)
|
||||
fmuls f4, f9, f8
|
||||
lfs f3, one
|
||||
fneg f6, f6
|
||||
fmuls f1, f1, f7
|
||||
fsubs f4, f5, f4
|
||||
fmuls f0, f0, f6
|
||||
fmuls f2, f2, f4
|
||||
fadds f0, f1, f0
|
||||
fadds f0, f2, f0
|
||||
fdivs f1, f3, f0
|
||||
fmuls f0, f1, f7
|
||||
fmuls f3, f1, f6
|
||||
fmuls f2, f1, f4
|
||||
stfs f0, 0(r3)
|
||||
fneg f0, f1
|
||||
stfs f3, 0xc(r3)
|
||||
stfs f2, 0x18(r3)
|
||||
lfs f5, 4(r4)
|
||||
lfs f4, 0x20(r4)
|
||||
lfs f3, 0x1c(r4)
|
||||
lfs f2, 8(r4)
|
||||
fmuls f4, f5, f4
|
||||
fmuls f2, f3, f2
|
||||
fsubs f2, f4, f2
|
||||
fmuls f2, f0, f2
|
||||
stfs f2, 4(r3)
|
||||
lfs f5, 0(r4)
|
||||
lfs f4, 0x20(r4)
|
||||
lfs f3, 0x18(r4)
|
||||
lfs f2, 8(r4)
|
||||
fmuls f4, f5, f4
|
||||
fmuls f2, f3, f2
|
||||
fsubs f2, f4, f2
|
||||
fmuls f2, f1, f2
|
||||
stfs f2, 0x10(r3)
|
||||
lfs f5, 0(r4)
|
||||
lfs f4, 0x1c(r4)
|
||||
lfs f3, 0x18(r4)
|
||||
lfs f2, 4(r4)
|
||||
fmuls f4, f5, f4
|
||||
fmuls f2, f3, f2
|
||||
fsubs f2, f4, f2
|
||||
fmuls f2, f0, f2
|
||||
stfs f2, 0x1c(r3)
|
||||
lfs f5, 4(r4)
|
||||
lfs f4, 0x14(r4)
|
||||
lfs f3, 0x10(r4)
|
||||
lfs f2, 8(r4)
|
||||
fmuls f4, f5, f4
|
||||
fmuls f2, f3, f2
|
||||
fsubs f2, f4, f2
|
||||
fmuls f2, f1, f2
|
||||
stfs f2, 8(r3)
|
||||
lfs f5, 0(r4)
|
||||
lfs f4, 0x14(r4)
|
||||
lfs f3, 0xc(r4)
|
||||
lfs f2, 8(r4)
|
||||
fmuls f4, f5, f4
|
||||
fmuls f2, f3, f2
|
||||
fsubs f2, f4, f2
|
||||
fmuls f0, f0, f2
|
||||
stfs f0, 0x14(r3)
|
||||
lfs f4, 0(r4)
|
||||
lfs f3, 0x10(r4)
|
||||
lfs f2, 0xc(r4)
|
||||
lfs f0, 4(r4)
|
||||
fmuls f3, f4, f3
|
||||
fmuls f0, f2, f0
|
||||
fsubs f0, f3, f0
|
||||
fmuls f0, f1, f0
|
||||
stfs f0, 0x20(r3)
|
||||
lfs f0, 0x24(r4)
|
||||
lfs f4, 0(r3)
|
||||
fneg f5, f0
|
||||
lfs f3, 0x28(r4)
|
||||
lfs f2, 4(r3)
|
||||
lfs f1, 0x2c(r4)
|
||||
lfs f0, 8(r3)
|
||||
fmuls f4, f5, f4
|
||||
fmuls f2, f3, f2
|
||||
fmuls f0, f1, f0
|
||||
fsubs f1, f4, f2
|
||||
fsubs f0, f1, f0
|
||||
stfs f0, 0x24(r3)
|
||||
lfs f0, 0x24(r4)
|
||||
lfs f4, 0xc(r3)
|
||||
fneg f5, f0
|
||||
lfs f3, 0x28(r4)
|
||||
lfs f2, 0x10(r3)
|
||||
lfs f1, 0x2c(r4)
|
||||
lfs f0, 0x14(r3)
|
||||
fmuls f4, f5, f4
|
||||
fmuls f2, f3, f2
|
||||
fmuls f0, f1, f0
|
||||
fsubs f1, f4, f2
|
||||
fsubs f0, f1, f0
|
||||
stfs f0, 0x28(r3)
|
||||
lfs f1, 0x24(r4)
|
||||
lfs f0, 0x18(r3)
|
||||
fneg f4, f1
|
||||
lfs f3, 0x28(r4)
|
||||
lfs f2, 0x1c(r3)
|
||||
lfs f1, 0x2c(r4)
|
||||
fmuls f4, f4, f0
|
||||
lfs f0, 0x20(r3)
|
||||
fmuls f2, f3, f2
|
||||
fmuls f0, f1, f0
|
||||
fsubs f1, f4, f2
|
||||
fsubs f0, f1, f0
|
||||
stfs f0, 0x2c(r3)
|
||||
blr
|
||||
}
|
||||
#pragma pop
|
||||
/* clang-format on */
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
#include "musyx/assert.h"
|
||||
#include "musyx/musyx_priv.h"
|
||||
#define SYNTH_FX_MIDISET 0xFF
|
||||
|
||||
u32 inpGlobalMIDIDirtyFlags[8][16];
|
||||
s32 midi_ctrl;
|
||||
|
||||
inline bool GetGlobalFlagSet(u8 chan, u8 midiSet, s32 flag) {
|
||||
return (flag & inpGlobalMIDIDirtyFlags[midiSet][chan]) != 0;
|
||||
}
|
||||
|
||||
void inpResetGlobalMIDIDirtyFlags() {
|
||||
u32 i, j;
|
||||
for (i = 0; i < 8; ++i) {
|
||||
for (j = 0; j < 16; ++j) {
|
||||
inpGlobalMIDIDirtyFlags[i][j] = 0xFF;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool inpResetGlobalMIDIDirtyFlag(u8 chan, u8 midiSet, s32 flag) {
|
||||
// ASSERT(midiSet!=SYNTH_FX_MIDISET);
|
||||
bool ret = GetGlobalFlagSet(chan, midiSet, flag);
|
||||
if (ret) {
|
||||
inpGlobalMIDIDirtyFlags[midiSet][chan] &= ~flag;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
void inpSetGlobalMIDIDirtyFlag(u8 chan, u8 midiSet, s32 flag) {
|
||||
// ASSERT(midiSet!=SYNTH_FX_MIDISET);
|
||||
inpGlobalMIDIDirtyFlags[midiSet][chan] |= flag;
|
||||
}
|
||||
|
||||
void inpSetRPNHi(u8 a, u8 b, u8 c) {
|
||||
|
||||
}
|
||||
|
||||
void inpSetRPNLo(u8 a, u8 b, u8 c) {
|
||||
|
||||
}
|
||||
|
||||
void inpSetRPNDec(u8 a, u8 b) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
void inpSetRPNInc(u8 a, u8 b) {
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user