// Multiband Tremolo

slider1:120<80,8000,1>Split Frequency (Hz)
slider2:1000<80,8000,1>Split Frequency (Hz)

slider10:4<0,12,1>Low -------- LFO Frequency (Hz)
slider11:-20<-20,0,0.1>Amount (dB)
slider12:0<0,100,1>Stereo Separation (%)
slider13:0<-60,24,0.1>Level (dB)

slider20:4<0,12,1>Mid -------- LFO Frequency (Hz)
slider21:-20<-20,0,0.1>Amount (dB)
slider22:0<0,100,1>Stereo Separation (%)
slider23:0<-60,24,0.1>Level (dB)

slider30:4<0,12,1>High ------- LFO Frequency (Hz)
slider31:-20<-20,0,0.1>Amount (dB)
slider32:0<0,100,1>Stereo Separation (%)
slider33:0<-60,24,0.1>Level (dB)

slider35:0<-24,24,0.1>Main Level (dB)

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

@init
cDenorm=10^-30;

@slider
(old_s1 != slider1 && slider1 > slider2) ? slider2 = slider1;
(old_s2 != slider2 && slider2 < slider1) ? slider1 = slider2;
old_s1 = slider1;
old_s2 = slider2;

freqHP = min(max(slider2,freqLP),srate);
xHP = exp(-2.0*$pi*freqHP/srate);
a0HP = 1.0-xHP;
b1HP = -xHP;

freqLP = min(min(slider1,srate),freqHP);
xLP = exp(-2.0*$pi*freqLP/srate);
a0LP = 1.0-xLP;
b1LP = -xLP;


advA=$pi*2*slider10/srate;
sepA=0.01*slider12*$pi;
amountA= slider11 <= -20.0 ? 0.0 : 10^(slider11/20);
scA=0.5*amountA;
amountA=1-amountA;

advB=$pi*2*slider20/srate;
sepB=0.01*slider22*$pi;
amountB= slider21 <= -20.0 ? 0.0 : 10^(slider21/20);
scB=0.5*amountB;
amountB=1-amountB;

advC=$pi*2*slider30/srate;
sepC=0.01*slider32*$pi;
amountC= slider31 <= -20.0 ? 0.0 : 10^(slider31/20);
scC=0.5*amountC;
amountC=1-amountC;


band1 = slider13 <= -60.0 ? 0.0 : 10^(slider13/20);
band2 = slider23 <= -60.0 ? 0.0 : 10^(slider23/20);
band3 = slider33 <= -60.0 ? 0.0 : 10^(slider33/20);

output = 10^(slider35/20);

@sample
s0 = spl0;
s1 = spl1;

out0 = (tmplLP = a0LP*s0 - b1LP*tmplLP + cDenorm);
out1 = (tmprLP = a0LP*s1 - b1LP*tmprLP + cDenorm);
out4 = s0 - (tmplHP = a0HP*s0 - b1HP*tmplHP + cDenorm);
out5 = s1 - (tmprHP = a0HP*s1 - b1HP*tmprHP + cDenorm);
out2 = s0 - out0 - out4;
out3 = s1 - out1 - out5;


out6=out0*((cos(posA) + 1) * scA + amountA)*band1;
out7=out1*((cos(posA+sepA) + 1) * scA + amountA)*band1;
posA+=advA;

out8=out2*((cos(posB) + 1) * scB + amountB)*band2;
out9=out3*((cos(posB+sepB) + 1) * scB + amountB)*band2;
posB+=advB;

out10=out4*((cos(posC) + 1) * scC + amountC)*band3;
out11=out5*((cos(posC+sepC) + 1) * scC + amountC)*band3;
posC+=advC;


spl0 = (out6 + out8 + out10)*output;
spl1 = (out7 + out9 + out11)*output;
