// mod with different 'rate' fader range...

desc: Mono.

slider1:1<0,1,0.01>clip
slider2:1<0,1,0.01>quant
slider3:0.5<0,1,0.01>rate
slider4:1<0,1,0.01>post filter
slider5:0.5<0,1,0.01>non-linearity
slider6:0.5<0,1,0.01>output

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

@init
buf0 = buf1 = buf2 = buf3 = buf4 = buf5 = buf6 = buf7 = buf8 = buf9 = 0;

function filterFreq(hz) (
r = 0.999;
j = r * r - 1;
k = (2 - 2 * r * r * cos(0.647 * hz / srate ));
((sqrt(k*k - 4*j*j) - k) / (2*j));
);

@slider
fParam1 = slider1; //headroom
fParam2 = slider2; //quant
fParam3 = slider3; //rate
fParam4 = slider4; //postfilt
fParam5 = slider5; //non-lin
fParam6 = slider6; //output

/*
(fParam3>0.5) ? (
f = fParam3 - 0.5;
mode = 1;
):(
f = 0.5 - fParam3;
mode = 0;
);
tn = exp(18 * f)|0;
*/

(fParam3>0.5) ? (
tn = (18 * fParam3 - 8)|0;
mode = 1;
):(
tn = (10 - 18 * fParam3)|0;
mode = 0;
);

tcount = 1;

clip = pow(10,(-1.5 + 1.5 * fParam1));

fo2 = filterFreq(pow(10, 2.30104 + 2*fParam4));

fi2 = 1-fo2;
fi2 = fi2*fi2;
fi2 = fi2*fi2;

_g1 = pow(2, 2 + (fParam2*12)|0);
g2 = 1/(2 * _g1);

(fParam3>0.5) ? (
g1 = -_g1/tn;
):(
g1 = -_g1;
); 

g3 = pow(10, 2*fParam6 - 1);

(fParam5>0.5) ? (
lin = pow(10, 0.3 * (0.5 - fParam5));
lin2 = lin;
):(
lin = pow(10, 0.3 * (fParam5 - 0.5));
lin2 = 1;
);

@sample
b0=buf0;
b1=buf1;
b2=buf2;
b3=buf3;
b4=buf4;
b5=buf5;
b6=buf6;
b7=buf7;
b8=buf8;
b9=buf9;

b0 = (spl0 + spl1) + mode * b0;

(tcount == tn) ? (
tcount = 0;
b5 = -(g2 * ((b0 * g1)|0)); // -() ???
(b5>0) ? (
b5=pow(b5,lin2); (b5>clip) ? b5=clip;
):(
b5=-pow(-b5,lin); (b5<-clip) ? b5=-clip;
);
b0 = 0;
);
tcount = tcount+1;

b1 = fi2 * (b5 * g3) + fo2 * b1;
b2 = b1 + fo2 * b2;
b3 = b2 + fo2 * b3;
b4 = b3 + fo2 * b4;
b6 = fi2 * b4 + fo2 * b6;
b7 = b6 + fo2 * b7;
b8 = b7 + fo2 * b8;
b9 = b8 + fo2 * b9;

c = b9;
d = b9;

spl0 = c;
spl1 = d;

(abs(b1)<0.0000000001) ? (
buf1=0; buf2=0; buf3=0; buf4=0; buf6=0; buf7=0; buf8=0; buf9=0; buf0=0; buf5=0;
):( 
buf1=b1; buf2=b2; buf3=b3; buf4=b4; buf6=b6; buf7=b7; buf8=b8; buf9=b9; buf0=b0; buf5=b5;
);

@gfx 0 140
gfx_r=0; gfx_g=0.9; gfx_b=0; gfx_a=1;
gfx_setfont(1,"Arial", 16);

gfx_x =20; gfx_y =10;  gfx_printf("%.1f",(-30 * (1 - fParam1)) );
gfx_x =70; gfx_y =10;  gfx_printf("dB");
gfx_x =110; gfx_y =10;  gfx_printf("Clip");

gfx_x =20; gfx_y =30;  gfx_printf("%.0f",(4 + 12 * fParam2)|0 );
gfx_x =70; gfx_y =30;  gfx_printf("Bits");
gfx_x =110; gfx_y =30;  gfx_printf("Quant");

gfx_x =20; gfx_y =50;  gfx_printf("%.0f",(srate/tn) );
gfx_x =70; gfx_y =50;  gfx_printf("Hz");
gfx_x =110; gfx_y =50;  gfx_printf("Rate");
(fParam3>0.5) ? (gfx_x =210; gfx_y =50;  gfx_printf("-S&H-")) :
(gfx_x =210; gfx_y =50;  gfx_printf("-S-"));

gfx_x =20; gfx_y =70;  gfx_printf("%.0f",(pow(10, 2.30104 + 2*fParam4)) );
gfx_x =70; gfx_y =70;  gfx_printf("Hz");
gfx_x =110; gfx_y =70;  gfx_printf("Post Filter");

gfx_x =20; gfx_y =90;  gfx_printf("%.0f",(200 * abs(fParam5 - 0.5)) );
gfx_x =70; gfx_y =90;  gfx_drawchar($'%');
gfx_x =110; gfx_y =90;  gfx_printf("Non-Linearity");
(fParam5>0.5) ? (gfx_x =210; gfx_y =90;  gfx_printf("-Even-")) :
(gfx_x =210; gfx_y =90;  gfx_printf("-Odd-"));

gfx_x =20; gfx_y =110;  gfx_printf("%.1f",(40 * fParam6 - 20) );
gfx_x =70; gfx_y =110;  gfx_printf("dB");
gfx_x =110; gfx_y =110;  gfx_printf("Output");
