slider1:0<0,100,1>Drive (%)
slider2:50<0,100,1>Mix (%)
slider3:0<-24,24,0.1>Output (dB)
slider4:0<0,1,1{Mono,Stereo}>Mode
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+10;
mix=0.2+slider2*0.008;
out=10^(slider3/20);
mode=slider4;

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

@sample
mode == 0 ? (
x=(spl0+spl1)*0.5;

q=x * gain/max(abs(x),1);
z=sign(-q) * (1-exp(sign(-q) * q));
y=mix * z * max(abs(x),1)/max(abs(z),1)+(1-mix) * x;
y=-(y * max(abs(x),1)/max(abs(y),1)) * out;

spl1=spl0=y;
);

mode == 1 ? (
xA=spl0;
xB=spl1;

qA=xA * gain/max(abs(xA),1);
zA=sign(-qA) * (1-exp(sign(-qA) * qA));
yA=mix * zA * max(abs(xA),1)/max(abs(zA),1)+(1-mix) * xA;
yA=-(yA * max(abs(xA),1)/max(abs(yA),1)) * out;

qB=xB * gain/max(abs(xB),1);
zB=sign(-qB) * (1-exp(sign(-qB) * qB));
yB=mix * zB * max(abs(xB),1)/max(abs(zB),1)+(1-mix) * xB;
yB=-(yB * max(abs(xB),1)/max(abs(yB),1)) * out;

spl0=yA;
spl1=yB;
);

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;
xC = -1;
while(
qC=xC * gain/max(abs(xC),1);
zC=sign(-qC) * (1-exp(sign(-qC) * qC));
yC=mix * zC * max(abs(xC),1)/max(abs(zC),1)+(1-mix) * xC;
yC=(yC * max(abs(xC),1)/max(abs(yC),1)) * out;
gfx_lineto(xC*gfxSize/2+gfxSize/2,yC*gfxSize/2+gfxSize/2,1);
(xC+=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;
