// 24db Moog VCF resonant lowpass
// with tanh clipping + boosting

slider1:0.5<0,1,0.01>Frequency
slider2:0<0,4,0.01>Resonance
slider3:0<0,24,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);
);

@slider
slider1 = max(slider1,0.1);
f = slider1*1.16;
fb = slider2 * (1 - 0.15 * f * f);
boost = 10^(slider3/20);
output = 10^(slider4/20);

@sample
//left
inputA = spl0;

inputA -= tanh(outA4) * fb;

inputA *= 0.35013 * (f*f)*(f*f);
outA1 = inputA + 0.3 * inA1 + (1 - f) * outA1; // Pole 1
inA1 = inputA;
outA2 = outA1 + 0.3 * inA2 + (1 - f) * outA2; // Pole 2
inA2 = outA1;
outA3 = outA2 + 0.3 * inA3 + (1 - f) * outA3; // Pole 3
inA3 = outA2;
outA4 = outA3 + 0.3 * inA4 + (1 - f) * outA4; // Pole 4
inA4 = outA3;
outA5 = tanh(outA4*boost);
spl0 = outA5*output;

//right
inputB = spl1;

inputB -= tanh(outB4) * fb;

inputB *= 0.35013 * (f*f)*(f*f);
outB1 = inputB + 0.3 * inB1 + (1 - f) * outB1; // Pole 1
inB1 = inputB;
outB2 = outB1 + 0.3 * inB2 + (1 - f) * outB2; // Pole 2
inB2 = outB1;
outB3 = outB2 + 0.3 * inB3 + (1 - f) * outB3; // Pole 3
inB3 = outB2;
outB4 = outB3 + 0.3 * inB4 + (1 - f) * outB4; // Pole 4
inB4 = outB3;
outB5 = tanh(outB4*boost);
spl1 = outB5*output;
