slider1:0<0,1,0.01>drive
slider2:0<0,1,0.01>muffle
slider3:0.5<0,1,0.01>gain

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

@init
filt1 = filt2 = 0;

@slider
fParam1 = slider1;
fParam2 = slider2;
fParam3 = slider3;

drive = fParam1;
filt = pow(10,-1.6 * fParam2);
gain = pow(10, 2 * fParam3 - 1);

@sample
fa = filt1;
fb = filt2;

a = spl0;
b = spl1;

aa = a>0 ? sqrt(a) : -sqrt(-a); // overdrive
bb = b>0 ? sqrt(b) : -sqrt(-b);

fa = fa + filt * (drive * (aa-a) + a - fa); // filter
fb = fb + filt * (drive * (bb-b) + b - fb);

spl0 = fa * gain;
spl1 = fb * gain;

(abs(fa)>0.0000000001) ? (filt1 = fa;) : (filt1 = 0;); // catch denormals
(abs(fb)>0.0000000001) ? (filt2 = fb;) : (filt2 = 0;);

@gfx 0 80
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("%.0f",100 * fParam1 );
gfx_x =80; gfx_y =10;  gfx_drawchar($'%');
gfx_x =110; gfx_y =10;  gfx_printf("Drive");

gfx_x =20; gfx_y =30;  gfx_printf("%.0f",100 * fParam2 );
gfx_x =80; gfx_y =30;  gfx_drawchar($'%');
gfx_x =110; gfx_y =30;  gfx_printf("Muffle");

gfx_x =20; gfx_y =50;  gfx_printf("%.1f",(40 * fParam3 - 20) );
gfx_x =80; gfx_y =50;  gfx_printf("dB");
gfx_x =110; gfx_y =50;  gfx_printf("Gain");
