slider1:0<-24,24,0.1>Input (dB)
slider2:50<1,100,1>Tube (%)
slider3:0<-24,24,0.1>Wet (dB)
slider4:-30<-24,24,0.1>Dry (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
function tanh(x) (
x = exp(2*x);
(x - 1) / (x + 1);
);

histbuf=1000000;
histpos=0;

@slider
pregain = 10^(slider1/20);
tube = (slider2+6.24)*0.1186;

wetgain = slider3 <= -24.0 ? 0.0 : 10^(slider3/20);
drygain = slider4 <= -24.0 ? 0.0 : 10^(slider4/20);

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

@sample
in0 = spl0;
in1 = spl1;

wet0 = tanh(spl0*pregain);
wet1 = tanh(spl1*pregain);

out0 = (((exp(wet0*tube) - exp(wet0*tube * -1.2)) / (exp(wet0*tube) + exp(wet0*tube * -1.0))) / tube);
out1 = (((exp(wet1*tube) - exp(wet1*tube * -1.2)) / (exp(wet1*tube) + exp(wet1*tube * -1.0))) / tube);

spl0 = out0*wetgain+in0*drygain;
spl1 = out1*wetgain+in1*drygain;

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_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_x=0;
gfx_y=gfxSize;
x = -1;
while(
y = -(tanh((((exp(x*tube) - exp(x*tube * -1.2)) / (exp(x*tube) + exp(x*tube * -1.0))) / tube)));
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;
