// 18dB/oct resonant 3 pole LPF
// with tanh clipping + boosting

slider1:6000<100,6000,1>Frequency (Hz)
slider2:0.7<0,0.95,0.01>Resonance
slider3:0<0,18,0.1>Boost (dB)
slider4:0<-24,0,0.1>Output (dB)

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

@init
function tanh(x) 
( 
x = exp(2*x);
(x - 1) / (x + 1);
);

ay1l = 0;
ay2l = 0;
aoutputl = 0;

ay1r = 0;
ay2r = 0;
aoutputr = 0;

@slider
fc=slider1;
res=slider2;
boost=10^(slider3/20);
out=10^(slider4/20);

kfcn = fc/(srate/2);
kp = ((-2.7528*kfcn + 3.0429)*kfcn + 1.718)*kfcn - 0.9984;
ap=kp;
kp1 = kp+1;
kscl = ((-2.7079*kp1 + 10.963)*kp1 - 14.934)*kp1 + 8.4974;
//kscl = -1.6519*log(kp+1) + 2.2173;
kres = res*kscl;

@sample
//left
inputl = spl0;

inputl = inputl - kres*tanh(aoutputl);

ax1l = inputl;
ay1l = (inputl + ax1l) * (ap+1)/2 - ap*ay1l;

ay11l = ay1l;
ay2l = (ay1l + ay11l) * (ap+1)/2 - ap*ay2l;

ay31l = ay2l;
aoutputl = (ay2l + ay31l) * (ap+1)/2 - ap*aoutputl;

//outputl = aoutputl;
outputl = tanh(aoutputl*(1+(boost*(1.5+2*kres*(1-kfcn)))));

//right
inputr = spl1;

inputr = inputr - kres*tanh(aoutputr);

ax1r = inputr;
ay1r = (inputr + ax1r) * (ap+1)/2 - ap*ay1r;

ay11r = ay1r;
ay2r = (ay1r + ay11r) * (ap+1)/2 - ap*ay2r;

ay31r = ay2r;
aoutputr = (ay2r + ay31r) * (ap+1)/2 - ap*aoutputr;

//outputr = aoutputr;
outputr = tanh(aoutputr*(1+(boost*(1.5+2*kres*(1-kfcn)))));

spl0 = outputl*out;
spl1 = outputr*out;
