Not sure what you mean exactly, but if you really want to modulate that filter at audio rate, you need to update the coefficients more often than hop(128), eslse I'd expect some nasty aliasing (not exactly beating). Try this slightly modified SVF3 filter code:
Code: Select all
streamin input;
streamin cut;
streamin resonance;
streamout lowpass;
streamout highpass;
streamout bandpass;
streamout notch;
streamout peak;
float lp1=0;
float bp1=0;
float f=0;
float nrez=0;
float MULTI=0.33333333;
float MINCUT=0.00045351474;
float TSF7=-0.00039682539;
float TSF5=0.016666667;
float TSF3=-0.33333333;
float TSF1=0.51945286;
float F1=1;
float F2=2;
float DENORM=1e-009;
mov eax,ecx; and eax,15; cmp eax,0; jnz hopend; // hop(128)
movaps xmm0,MINCUT;
maxps xmm0,cut;
minps xmm0,F1;
//xmm0 -> cutoff
mulps xmm0,TSF1;
movaps xmm7,xmm0; // x
mulps xmm0,xmm7; // x2
movaps xmm1,TSF7;
mulps xmm1,xmm0;
addps xmm1,TSF5;
mulps xmm1,xmm0;
addps xmm1,TSF3;
mulps xmm1,xmm0;
addps xmm1,F2;
mulps xmm1,xmm7;
movaps f,xmm1;
movaps xmm0,resonance;
subps xmm0,F1;
movaps nrez,xmm0;
hopend: // end hop
movaps xmm7,input;
addps xmm7,DENORM;
movaps xmm1,lp1; // xmm1 -> lp1
movaps xmm2,bp1; // xmm2 -> bp1
// step 1
movaps xmm0,xmm2; // xmm0 -> bp1
mulps xmm0,f; // xmm0 -> f*bp1
addps xmm1,xmm0; // xmm1 -> lp1 = f*bp1+lp1
movaps xmm0,xmm2; // xmm0 -> bp1
mulps xmm0,nrez; // xmm0 -> -(bp1*rez)
addps xmm0,xmm7; // xmm0 -> input-(bp1*rez)
subps xmm0,xmm1; // xmm0 -> hp1 = input-lp1-(bp1*rez)
movaps xmm3,xmm0; // xmm3 -> hp1
mulps xmm0,f; // xmm0 -> f*hp1
addps xmm2,xmm0; // xmm2 -> bp1=bp1+f*hp1
movaps xmm4,xmm1; // xmm4 -> lowpass = lp1
movaps xmm5,xmm2; // xmm5 -> bandpass = bp1
movaps xmm6,xmm3; // xmm6 -> highpass = hp1
// step 2
movaps xmm0,xmm2; // xmm0 -> bp1
mulps xmm0,f; // xmm0 -> f*bp1
addps xmm1,xmm0; // xmm1 -> lp1 = f*bp1+lp1
movaps xmm0,xmm2; // xmm0 -> bp1
mulps xmm0,nrez; // xmm0 -> -(bp1*rez)
addps xmm0,xmm7; // xmm0 -> input-(bp1*rez)
subps xmm0,xmm1; // xmm0 -> hp1 = input-lp1-(bp1*rez)
movaps xmm3,xmm0; // xmm3 -> hp1
mulps xmm0,f; // xmm0 -> f*hp1
addps xmm2,xmm0; // xmm2 -> bp1=bp1+f*hp1
addps xmm4,xmm1; // xmm4 -> lowpass = lowpass + lp1
addps xmm5,xmm2; // xmm5 -> bandpass = bandpass + bp1
addps xmm6,xmm3; // xmm6 -> highpass = highpass + hp1
// step 3
subps xmm7,DENORM;
movaps xmm0,xmm2; // xmm0 -> bp1
mulps xmm0,f; // xmm0 -> f*bp1
addps xmm1,xmm0; // xmm1 -> lp1 = f*bp1+lp1
movaps xmm0,xmm2; // xmm0 -> bp1
mulps xmm0,nrez; // xmm0 -> -(bp1*rez)
addps xmm0,xmm7; // xmm0 -> input-(bp1*rez)
subps xmm0,xmm1; // xmm0 -> hp1 = input-lp1-(bp1*rez)
movaps xmm3,xmm0; // xmm3 -> hp1
mulps xmm0,f; // xmm0 -> f*hp1
addps xmm2,xmm0; // xmm2 -> bp1=bp1+f*hp1
addps xmm4,xmm1; // xmm4 -> lowpass = lowpass + lp1
addps xmm5,xmm2; // xmm5 -> bandpass = bandpass + bp1
addps xmm6,xmm3; // xmm6 -> highpass = highpass + hp1
// scale
mulps xmm4,MULTI;
mulps xmm5,MULTI;
mulps xmm6,MULTI;
// for next loop
movaps lp1,xmm1;
movaps bp1,xmm2;
// output
movaps lowpass,xmm4;
movaps bandpass,xmm5;
movaps highpass,xmm6;
addps xmm7,xmm5;
movaps peak,xmm7;
addps xmm4,xmm6;
movaps notch,xmm4;
/*streamin input;
streamin cut;
streamin resonance;
streamout lowpass;
streamout highpass;
streamout bandpass;
streamout notch;
streamout peak;
streamout dbg;
float cutoff, rez, f;
float lp1, hp1, bp1;
float multi, x, x2, x3, x5, x7;
multi = 0.33333333333333333333333333333333;
hop(128) {
rez = 1.0 - resonance;
// clamp at 1.0 and 20/44100
cutoff = max(cut, 0.00045351473922902494331065759637188);
cutoff = min(cutoff, 1.0);
// f = 2 * sin1((3.141592 * (cutoff / 36.0)));
// taylor series
x = cutoff * 0.51945286321522940099128899997997;
x2 = x*x;
x3 = x2*x;
x5 = x3*x2;
x7 = x5*x2;
// x3 / 6, x5 /120, x7 / 5040;
f = x+x
- x3 * 0.333333333333333333333333333332
+ x5 * 0.016666666666666666666666666666
- x7 * 0.000396825396825396825396825396;
dbg = f;}
input = input + 0.000000001;
lp1 = lp1 + f * bp1;
hp1 = input - lp1 - rez * bp1;
bp1 = f * hp1 + bp1;
lowpass = lp1;
highpass = hp1;
bandpass = bp1;
lp1 = lp1 + f * bp1;
hp1 = input - lp1 - rez * bp1;
bp1 = f * hp1 + bp1;
lowpass = lowpass + lp1;
highpass = highpass + hp1;
bandpass = bandpass + bp1;
input = input - 0.000000001;
lp1 = lp1 + f * bp1;
hp1 = input - lp1 - rez * bp1;
bp1 = f * hp1 + bp1;
lowpass = (lowpass + lp1) * multi;
highpass = (highpass + hp1) * multi;
bandpass = (bandpass + bp1) * multi;
peak = input + bandpass;
notch = lowpass + highpass;*/