More musyx work

This commit is contained in:
Phillip Stephens
2022-12-24 14:54:58 -08:00
parent c1c2083bb4
commit 4919b49af6
12 changed files with 894 additions and 37 deletions
+3 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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"
+32
View File
@@ -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
+42
View File
@@ -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
+1
View File
@@ -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
View File
@@ -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
View File
@@ -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;
}
+7 -9
View File
@@ -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
View File
@@ -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
+50
View File
@@ -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) {
}