slider1:0<0,100,1>Boost (%)
slider2:0<0,100,1>Drive (%)
slider3:12000<1000,12000,1>LowPass (Hz)
slider4:0<-30,0,0.1>Output (dB)
slider5:25<20,250,5>Size (ms)

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

@init
histbuf=1000000;
histpos=0;

@slider
gain = (slider1/100)+1;
drive = max(min(slider2,99),0);
a = sin(((drive+1)/101)*($pi/2));
k = 2*a/(1-a);

outvol = 10^(slider4/20);

f = 2*$pi * min(slider3, 0.49 * srate) / srate;
q = 0.707;

w0 = f;
cos_w0 = cos(w0);
alpha = sin(w0) / (2*q);

b1 = 1 - cos_w0;
b0 = b2 = 0.5 * b1;
a0 = 1 + alpha;
a1 = -2 * cos_w0;
a2 = 1 - alpha;

a1 /= a0;
a2 /= a0;
b0 /= a0;
b1 /= a0;
b2 /= a0;

size=slider5;
histsize=size/1000*srate|0;

@sample
spl0*=gain;
spl1*=gain;

spl0 = (1+k)*(spl0)/(1+k*abs(spl0));
spl1 = (1+k)*(spl1)/(1+k*abs(spl1));

inA = spl0;
inB = spl1;

//Left
x2A = x1A;
x1A = x0A;
x0A = inA;

y2A = y1A;
y1A = y0A;
y0A = b0*x0A + b1*x1A + b2*x2A - a1*y1A - a2*y2A;

//Right
x2B = x1B;
x1B = x0B;
x0B = inB;

y2B = y1B;
y1B = y0B;
y0B = b0*x0B + b1*x1B + b2*x2B - a1*y1B - a2*y2B;

//Output
spl0 = y0A;
spl1 = y0B;

spl0 *= outvol;
spl1 *= outvol;

//spl0 = min(max(spl0,-1),1);
//spl1 = min(max(spl1,-1),1);

histbuf[histpos]=spl0;
histbuf[histpos+histsize]=spl1;

histpos+=1;
histpos >= histsize ? histpos=0;

@gfx 0 101
gfxSize=min(gfx_w,gfx_h);

gfx_r=gfx_g=gfx_b=0; gfx_a=1;
gfx_x=gfx_y=0;
gfx_rectto(gfx_w,gfx_h);

gfx_r=gfx_g=gfx_b=0.8; gfx_a=1;
gfx_x=gfxSize/2;
gfx_y=0;
gfx_lineto(gfxSize/2,gfxSize,0);
gfx_x=0;
gfx_y=gfxSize/2;
gfx_lineto(gfxSize,gfxSize/2,0);

gfx_r=0.5; gfx_g=1; gfx_b=0; gfx_a=1;
gfx_x=0;
gfx_y=gfxSize;
x = -1;
while(
y = -((1+k)*x/(1+k*abs(x)));
gfx_lineto(x*gfxSize/2+gfxSize/2,y*gfxSize/2+gfxSize/2,1);
(x+=0.001) <= 1;
);
gfx_lineto(gfxSize-1,0,1);

offs=histpos;
gscale=gfxSize/histsize;
gbuf=histbuf;
gscale2=gfxSize/2;

gfx_r=0; gfx_g=1; gfx_b=1; gfx_a=0.5;

ga=0;
loop(histsize,
gv=gbuf[offs];
offs+=1;
offs>=histsize?offs=0;
gx=ga*gscale;
gy=gfxSize/2 - gv*gscale2;
ga ? gfx_lineto(gx,gy,0) : ( gfx_x=gx; gfx_y=gy; );
ga+=1;
);

gbuf+=histsize;
