slider1:-1<-1,0,0.01>negative
slider2:1<0,1,0.01>positive
slider4:0<-24,24,0.1>input (dB)
slider5:0<-24,24,0.1>output (dB)
slider7:0<0,1,1{mono,stereo}>mode
slider8: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
a=slider1;
b=slider2;

k1=a^2;
k2=1+2*a;
k3=b^2;
k4=1-2*b;

input = 10^(slider4/20);
output = 10^(slider5/20);

mode=slider7;

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

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

x<a?(
y=(k1+x)/(k2-x);
);
(a<=x)&&(x<=b)?(
y=x;
);
x>b?(
y=(x-k3)/(x+k4);
);

//spl0=tanh(y);
spl0=y*output;
spl1=spl0;
);

mode==1?(
x0=spl0*input;
x1=spl1*input;

x0<a?(
y0=(k1+x0)/(k2-x0);
);
(a<=x0)&&(x0<=b)?(
y0=x0;
);
x0>b?(
y0=(x0-k3)/(x0+k4);
);

x1<a?(
y1=(k1+x1)/(k2-x1);
);
(a<=x1)&&(x1<=b)?(
y1=x1;
);
x1>b?(
y1=(x1-k3)/(x1+k4);
);

//spl0=tanh(y0);
//spl1=tanh(y1);
spl0=y0*output;
spl1=y1*output;
);

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;
x2 = -1;
while(
x2<a?(
y2=-((k1+x2)/(k2-x2));
);
(a<=x2)&&(x2<=b)?(
y2=-x2;
);
x2>b?(
y2=-((x2-k3)/(x2+k4));
);
gfx_lineto(x2*gfxSize/2+gfxSize/2,y2*gfxSize/2+gfxSize/2,1);
(x2+=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;
