slider1:0<0,3,1{Output,Lo,Mid,Hi}>|------------------- listen
slider2:0.4<0,1,0.001>x-over 1
slider3:0.5<0,1,0.001>x-over 2
slider4:0.5<0,1,0.01>|--------------- lo drive
slider5:0.5<0,1,0.01>mid drive
slider6:0.5<0,1,0.01>hi drive
slider7:0.5<0,1,0.01>|------------------ lo trim
slider8:0.5<0,1,0.01>mid trim
slider9:0.5<0,1,0.01>hi trim
slider10:0<0,1,1{Transistor (biploar),Valve (unipolar)}>|------------------ mode
slider11:0.5<0,1,0.01>main out

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

@slider
fParam1=slider1; // listen
fParam2=slider2; // lo<>mid
fParam3=slider3; // mid<>hi
fParam4=slider4; // lo dist
fParam5=slider5; // mid dist
fParam6=slider6; // hi dist
fParam7=slider7; // lo out
fParam8=slider8; // mid out
fParam9=slider9; // hi out
fParam10=slider10; // mode
fParam11=slider11; // main out

driv1 = pow(10,(6 * fParam4 * fParam4) - 1);
driv2 = pow(10,(6 * fParam5 * fParam5) - 1);
driv3 = pow(10,(6 * fParam6 * fParam6) - 1);

valve = fParam10|0;

(valve==1) ?
(
trim1 = (0.5);
trim2 = (0.5);
trim3 = (0.5);
):(
trim1 = 0.3*pow(10,(4 * pow(fParam4,3))); //(0.5 + 500 * pow(fParam4,6));
trim2 = 0.3*pow(10,(4 * pow(fParam5,3)));
trim3 = 0.3*pow(10,(4 * pow(fParam6,3)));
);
trim1 = (trim1 * pow(10, 2 * fParam7 - 1));
trim2 = (trim2 * pow(10, 2 * fParam8 - 1));
trim3 = (trim3 * pow(10, 2 * fParam9 - 1));

switch = fParam1|0;

(switch==0) ? (
slev=0.5; // width (side-level)
);
(switch==1) ? (
trim2=0; trim3=0; slev=0;
);
(switch==2) ? (
trim1=0; trim3=0; slev=0;
);
(switch==3) ? (
trim1=0; trim2=0; slev=0;
);

fi1 = pow(10,fParam2 - 1.70); fo1=(1 - fi1);
fi2 = pow(10,fParam3 - 1.05); fo2=(1 - fi2);

main = pow(10, 2 * fParam11 - 1);

@sample
l=fb3;
sl=slev;

f1i=fi1;
f1o=fo1;
f2i=fi2;
f2o=fo2;

b1=fb1;
b2=fb2;

d1=driv1;
t1=trim1;
d2=driv2;
t2=trim2;
d3=driv3;
t3=trim3;

a = spl0;
b = spl1;

s = (a - b) * sl; // keep stereo component for later
a += (b + 0.00002); // dope filter at low level
b2 = (f2i * a) + (f2o * b2); // crossovers
b1 = (f1i * b2) + (f1o * b1);
l = (f1i * b1) + (f1o * l);
m = b2-l;
h = a-b2;

g = (l>0) ? l : -l; // lo
g = (1 / (1 + d1 * g)); // distort
g1 = g;

g = (m>0) ? m : -m; //mid
g = (1 / (1 + d2 * g));
g2 = g;

g = (h>0) ? h : -h; // hi
g = (1 / (1 + d3 * g));
g3 = g;

(valve==1) ? ( (l>0) ? g1=1; (m>0) ? g2=1; (h>0) ? g3=1; );

a = (l*g1*t1) + (m*g2*t2) + (h*g3*t3);
c = a + s; //output
d = a - s;

spl0 = c * main;
spl1 = d * main;

fb1=b1;
fb2=b2;
fb3=l;

@gfx 0 200
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",srate * fi1 * (0.098 + 0.09*fi1 + 0.5*pow(fi1,8.2)) );
gfx_x =70; gfx_y =10;  gfx_printf("Hz");
gfx_x =110; gfx_y =10;  gfx_printf("X-Over 1");

gfx_x =20; gfx_y =30;  gfx_printf("%.0f",srate * fi2 * (0.015 + 0.15*fi2 + 0.9*pow(fi2,8.2)) );
gfx_x =70; gfx_y =30;  gfx_printf("Hz");
gfx_x =110; gfx_y =30;  gfx_printf("X-Over 2");

gfx_r=0.8; gfx_g=0.8; gfx_b=0.2;

gfx_x =20; gfx_y =50;  gfx_printf("%.1f",60.0 * fParam4 );
gfx_x =70; gfx_y =50;  gfx_printf("dB");
gfx_x =110; gfx_y =50;  gfx_printf("Lo Drive");

gfx_x =20; gfx_y =70;  gfx_printf("%.1f",60.0 * fParam5 );
gfx_x =70; gfx_y =70;  gfx_printf("dB");
gfx_x =110; gfx_y =70;  gfx_printf("Mid Drive");

gfx_x =20; gfx_y =90;  gfx_printf("%.1f",60.0 * fParam6 );
gfx_x =70; gfx_y =90;  gfx_printf("dB");
gfx_x =110; gfx_y =90;  gfx_printf("Hi Drive");

gfx_r=0.8; gfx_g=0.5; gfx_b=0.2;

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

gfx_x =20; gfx_y =130;  gfx_printf("%.1f",(40 * fparam8 - 20) );
gfx_x =70; gfx_y =130;  gfx_printf("dB");
gfx_x =110; gfx_y =130;  gfx_printf("Mid Trim");

gfx_x =20; gfx_y =150;  gfx_printf("%.1f",(40 * fparam9 - 20) );
gfx_x =70; gfx_y =150;  gfx_printf("dB");
gfx_x =110; gfx_y =150;  gfx_printf("Hi Trim");

gfx_r=0.2; gfx_g=0.8; gfx_b=0.8;

gfx_x =20; gfx_y =170;  gfx_printf("%.1f",(40 * fparam11 - 20) );
gfx_x =70; gfx_y =170;  gfx_printf("dB");
gfx_x =110; gfx_y =170;  gfx_printf("Main Out");
