// this plugin will hopefully be improved in the future...

slider1:1<0,3,1{20,30,60,100}>|------------- LSF (Hz)
slider2:0<0,15,0.1>Push (dB)
slider3:0<-15,0,0.1>Pull (dB)

slider5:832<160,4000,1>|----------- Peak (Hz)
slider6:0<0,1,1{dull,sharp}>Q Mode
slider7:0<-12,12,0.1>Gain (dB)

slider9:2<0,3,1{6k,8k,12k,15k}>|------------- HSF (Hz)
slider10:0<-8,8,0.1>Gain (dB)

slider12:0<-12,12,0.1>|--------- Output (dB)

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

@init

tempA = slider2; //(-30+slider2)+(slider2*(3-slider2/15));
src_wetA = tgt_wetA = slider2 <= 0 ? 0.0 : 10^(tempA/20);

tempB = (-7.5-slider3*0.5); //(-15.8-slider3/150)+(-slider3*1);
src_wetB = tgt_wetB = slider3 >= 0 ? 0.0 : 10^(tempB/20);

@slider

//LowPass A
//freqA = (slider1 == 0 ? (1650+(20400-(slider2*1360))) : (slider1 == 1 ? (2850+(19200-(slider2*1280))) : (slider1 == 2 ? (6000+(16050-(slider2*1070))) : (8250+(13800-(slider2*920))) )));
freqA = (slider1 == 0 ? (400) : (slider1 == 1 ? (860) : (slider1 == 2 ? (1800) : (2560) )));
fA = 2*$pi * min(freqA, 0.49 * srate) / srate;
qA = 0.04 * (30-slider2)/15; //0.04; //(0.01+slider2/10000);

w0A = fA;
cos_w0A = cos(w0A);
alphaA = sin(w0A) / (2*qA);

b1A = 1 - cos_w0A;
b0A = b2A = 0.5 * b1A;
a0A = 1 + alphaA;
a1A = -2 * cos_w0A;
a2A = 1 - alphaA;

a1A /= a0A;
a2A /= a0A;
b0A /= a0A;
b1A /= a0A;
b2A /= a0A;

tempA = slider2; //(-30+slider2)+(slider2*(3-slider2/15));
tgt_wetA = slider2 <= 0 ? 0.0 : 10^(tempA/20);


//LowPass B
//freqB = (slider1 == 0 ? (12600+(9450-(-slider3*630))) : (slider1 == 1 ? (16050+(6000-(-slider3*400))) : (slider1 == 2 ? (19200+(2850-(-slider3*190))) : (20100+(1950-(-slider3*130))) )));
freqB = (slider1 == 0 ? (3820) : (slider1 == 1 ? (6500) : (slider1 == 2 ? (11560) : (13640) )));
fB = 2*$pi * min(freqB, 0.49 * srate) / srate;
qB = 0.04 * (30-abs(slider3))/15; //0.04; //(0.01-slider3/10000);

w0B = fB;
cos_w0B = cos(w0B);
alphaB = sin(w0B) / (2*qB);

b1B = 1 - cos_w0B;
b0B = b2B = 0.5 * b1B;
a0B = 1 + alphaB;
a1B = -2 * cos_w0B;
a2B = 1 - alphaB;

a1B /= a0B;
a2B /= a0B;
b0B /= a0B;
b1B /= a0B;
b2B /= a0B;

tempB = (-7.5-slider3*0.5); //(-15.8-slider3/150)+(-slider3*1);
tgt_wetB = slider3 >= 0 ? 0.0 : 10^(tempB/20);

dry = 1;


//Peak
fC= 2*$pi * min(slider5, 0.49 * srate) / srate;
tmp = (slider6 == 0 ? 0.6 : 1.2);
qC = tmp;
dB_gainC = slider7;

w0C = fC;
alphaC = sin(w0C) / (2*qC);
aC = 10^(db_gainC / 40);

b0C = 1 + alphaC * aC;
b1C = a1C = -2 * cos(w0C);
b2C = 1 - alphaC * aC;
a0C = 1 + alphaC / aC;
a2C = 1 - alphaC / aC;

a1C /= a0C;
a2C /= a0C;
b0C /= a0C;
b1C /= a0C;
b2C /= a0C;


//HighShelf
freq2 = (slider9 == 0 ? 2000 : (slider9 == 1 ? 3200 : (slider9 == 2 ? 5300 :  6400 )));
qD = (slider9 == 0 ? 0.5 : (slider9 == 1 ? 0.48 : (slider9 == 2 ? 0.46 :  0.46 )));

fD = 2*$pi * min(freq2, 0.49 * srate) / srate;

slider9 > 1 ?
(
slider10 >= 0 ? tmp2 = slider10;
slider10 < 0 ? tmp2 = slider10*0.75;
):(
tmp2 = slider10;
);
dB_gainD = tmp2;

w0D = fD;
cos_w0D = cos(w0D);
aD = 10^(db_gainD / 40);

tmp0D = 2 * sqrt(aD) * sin(w0D) / (2 * qD);
tmp1D = (aD + 1) - (aD - 1) * cos_w0D;
tmp2D = (aD + 1) + (aD - 1) * cos_w0D;

b0D = aD * (tmp2D + tmp0D);
b1D = -2 * aD * ((aD - 1) + (aD + 1) * cos_w0D);
b2D = aD * (tmp2D - tmp0D);
a0D = tmp1D + tmp0D;
a1D = 2 * ((aD - 1) - (aD + 1) * cos_w0D);
a2D = tmp1D - tmp0D;

a1D /= a0D;
a2D /= a0D;
b0D /= a0D;
b1D /= a0D;
b2D /= a0D;


outvol = 10^(slider12/20);

@block

d_wetA = (tgt_wetA-src_wetA)/samplesblock;
twetA = src_wetA;
src_wetA = tgt_wetA;
d_wetB = (tgt_wetB-src_wetB)/samplesblock;
twetB = src_wetB;
src_wetB = tgt_wetB;

@sample

twetA += d_wetA;
wetA = twetA;

twetB += d_wetB;
wetB = twetB;


inA = spl0;
inB = spl1;


//Left
x2AA = x1AA;
x1AA = x0AA;
x0AA = inA;

y2AA = y1AA;
y1AA = y0AA;
y0AA = b0A*x0AA + b1A*x1AA + b2A*x2AA - a1A*y1AA - a2A*y2AA;

//Right
x2BA = x1BA;
x1BA = x0BA;
x0BA = inB;

y2BA = y1BA;
y1BA = y0BA;
y0BA = b0A*x0BA + b1A*x1BA + b2A*x2BA - a1A*y1BA - a2A*y2BA;


//Left
x2AB = x1AB;
x1AB = x0AB;
x0AB = inA;

y2AB = y1AB;
y1AB = y0AB;
y0AB = b0B*x0AB + b1B*x1AB + b2B*x2AB - a1B*y1AB - a2B*y2AB;

//Right
x2BB = x1BB;
x1BB = x0BB;
x0BB = inB;

y2BB = y1BB;
y1BB = y0BB;
y0BB = b0B*x0BB + b1B*x1BB + b2B*x2BB - a1B*y1BB - a2B*y2BB;

//Output
out0 = y0AA*wetA + y0AB*wetB*-1 + inA*dry;
out1 = y0BA*wetA + y0BB*wetB*-1 + inB*dry;


//Left
x2AC = x1AC;
x1AC = x0AC;
x0AC = out0;

y2AC = y1AC;
y1AC = y0AC;
y0AC = b0C*x0AC + b1C*x1AC + b2C*x2AC - a1C*y1AC - a2C*y2AC;

//Right
x2BC = x1BC;
x1BC = x0BC;
x0BC = out1;

y2BC = y1BC;
y1BC = y0BC;
y0BC = b0C*x0BC + b1C*x1BC + b2C*x2BC - a1C*y1BC - a2C*y2BC;

//Output
out2 = y0AC;
out3 = y0BC;


//Left
x2AD = x1AD;
x1AD = x0AD;
x0AD = out2;

y2AD = y1AD;
y1AD = y0AD;
y0AD = b0D*x0AD + b1D*x1AD + b2D*x2AD - a1D*y1AD - a2D*y2AD;

//Right
x2BD = x1BD;
x1BD = x0BD;
x0BD = out3;

y2BD = y1BD;
y1BD = y0BD;
y0BD = b0D*x0BD + b1D*x1BD + b2D*x2BD - a1D*y1BD - a2D*y2BD;

//Output
spl0 = y0AD;
spl1 = y0BD;


spl0 *= outvol;
spl1 *= outvol;
