Add missing reverb.c

This commit is contained in:
Phillip Stephens 2023-06-30 05:05:29 -07:00
parent a7219f190a
commit cd4939c8dc
3 changed files with 697 additions and 5 deletions

View File

@ -919,10 +919,10 @@ LIBS = [
},
{
"lib": "musyx",
#"mw_version": "1.2.5",
#"cflags": "-proc gecko -fp hard -nodefaults -nosyspath -i include -i libc -g -sym on -D_DEBUG=1 -enum int -DMUSY_VERSION_MAJOR=1 -DMUSY_VERSION_MINOR=5 -DMUSY_VERSION_PATCH=3",
"mw_version": "1.3.2",
"cflags": "$cflags_musyx -DMUSY_VERSION_MAJOR=1 -DMUSY_VERSION_MINOR=5 -DMUSY_VERSION_PATCH=4",
"mw_version": "1.2.5",
"cflags": "-proc gecko -fp hard -nodefaults -nosyspath -i include -i libc -g -sym on -D_DEBUG=1 -enum int -DMUSY_VERSION_MAJOR=1 -DMUSY_VERSION_MINOR=5 -DMUSY_VERSION_PATCH=3",
#"mw_version": "1.3.2",
#"cflags": "$cflags_musyx -DMUSY_VERSION_MAJOR=1 -DMUSY_VERSION_MINOR=5 -DMUSY_VERSION_PATCH=4",
"host": False,
"objects": [
["musyx/runtime/seq", False],

View File

@ -0,0 +1,617 @@
#include "math.h"
#include "musyx/musyx_priv.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);
}
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
}
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 */
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]);
}
}
}

View File

@ -417,7 +417,7 @@ u32 seqStartPlay(PAGE* norm, PAGE* drum, MIDISETUP* midiSetup, u32* song, SND_PL
for (i = 0; i < 16; ++i) {
nseq->section[i].bpm = bpm;
synthSetBpm(bpm >> 10, seqId & 0xFF, i & 0xFF);
synthSetBpm(bpm >> 10, seqId, i);
if (arr->mTrack != NULL) {
nseq->section[i].mTrack.base = ARR_GET(arr, arr->mTrack);
@ -1063,3 +1063,78 @@ static SEQ_EVENT* GetGlobalEvent(SEQ_SECTION* section) {
}
return ev;
}
static SEQ_EVENT* HandleEvent(SEQ_EVENT* event, unsigned char secIndex, unsigned long* loopFlag) {
struct CPAT* pa; // r26
struct NOTE_DATA* pe; // r24
long velocity; // r28
long key; // r30
unsigned char midi; // r27
unsigned short macId; // r21
struct NOTE* note; // r22
struct TENTRY* tEntry; // r25
struct CPAT* pattern; // r29
unsigned long* pTab; // r20
struct SEQ_PATTERN* pptr; // r23
}
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(unsigned char 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 unsigned long HandleTrackEvents(unsigned char secIndex, unsigned long deltaTime) {
struct SEQ_EVENT* ev; // r29
unsigned long loopFlag; // r1+0x10
struct SEQ_SECTION* section; // r31
return FALSE;
}
void seqHandle(unsigned long deltaTime) {
unsigned long x; // r29
unsigned long i; // r31
unsigned long j; // r28
unsigned long eventsActive; // r25
unsigned long notesActive; // r24
struct SEQ_INSTANCE* si; // r30
struct SEQ_INSTANCE* nextSi; // r27
}
void seqInit() {
unsigned long i; // r31
unsigned long j; // r29
}