// mod of the resonant_lowpass_07 filter
// adds harmonics (...clipper...)

slider1:17375<10,17375,1>Frequency (Hz)
slider2:0<0,2.2,0.001>Resonance
slider3:0<-24,24,0.1>Output (dB)

in_pin:L in
in_pin:R in
out_pin:L out
out_pin:R out

@init
y1A=y2A=y3A=y4A=oldxA=oldy1A=oldy2A=oldy3A=0;
y1B=y2B=y3B=y4B=oldxB=oldy1B=oldy2B=oldy3B=0;

@slider
slider1 = min(slider1,17375);
slider2 = min(slider2,2.2);

cutoff = slider1;
res = slider2;
f = (2*cutoff)/srate;
k = 2*sin(f*$pi/2)-1;
p = (k+1)*0.5;
scale = (1-p)*1.386249;
r = res*scale;

gain = 10^(slider3/20);

@sample
inputA = spl0;
inputB = spl1;

xA = inputA - r*y4A;
//Four cascaded onepole filters (bilinear transform)
y1A = xA*p +  oldxA*p - k*y1A;
y2A = y1A*p + oldy1A*p - k*y2A;
y3A = y2A*p + oldy2A*p - k*y3A;
y4A = y3A*p + oldy3A*p - k*y4A;
//Clipper band limited sigmoid
y4A = y4A - (y4A^3)/6;

oldxA= xA;
oldy1A = y1A;
oldy2A = y2A;
oldy3A = y3A;

xB = inputB - r*y4B;
//Four cascaded onepole filters (bilinear transform)
y1B = xB*p +  oldxB*p - k*y1B;
y2B = y1B*p + oldy1B*p - k*y2B;
y3B = y2B*p + oldy2B*p - k*y3B;
y4B = y3B*p + oldy3B*p - k*y4B;
//Clipper band limited sigmoid
y4B = y4B - (y4B^3)/6;

oldxB = xB;
oldy1B = y1B;
oldy2B = y2B;
oldy3B = y3B;

spl0=y4A*gain;
spl1=y4B*gain;
