slider1:0<-60,0,0.1>comp1 ---------- Threshold (dB)
slider2:2<1,20,0.1>Ratio
slider3:12<1,20,0.1>Attack (ms)
slider4:200<20,1000,1>Release (ms)
slider5:50<10,100,1>Env Decay (ms)
slider6:0<-24,24,0.1>Output (dB)

slider11:0<-60,0,0.1>comp2 ---------- Threshold (dB)
slider12:2<1,20,0.1>Ratio
slider13:6<1,20,0.1>Attack (ms)
slider14:100<20,1000,1>Release (ms)
slider15:50<10,100,1>Env Decay (ms)
slider16:0<-24,24,0.1>Output (dB)

slider21:0<-60,0,0.1>comp3 ---------- Threshold (dB)
slider22:2<1,20,0.1>Ratio
slider23:3<1,20,0.1>Attack (ms)
slider24:50<20,1000,1>Release (ms)
slider25:50<10,100,1>Env Decay (ms)
slider26:0<-24,24,0.1>Output (dB)

slider51:0<0,3,1{-----------,Band 1,Band 2,Band 3}>|------------------------------------ Solo
slider52:0<-24,24,0.1>Main Output (dB)

slider61:100<20,18000,1>Split Freq 1 (Hz)
slider62:8000<20,18000,1>Split Freq 2 (Hz)

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

@init
cDenorm = 10^-30;

outputA = 1;
transfer_AA = 0;
transfer_BA = 1;
gainA = 1;
envA = 0;
outputB = 1;
transfer_AB = 0;
transfer_BB = 1;
gainB = 1;
envB = 0;
outputC = 1;
transfer_AC = 0;
transfer_BC = 1;
gainC = 1;
envC = 0;

log2dB = 8.6858896380650365530225783783321;
db2log = 0.11512925464970228420089957273422;
gr_meterA = 1;
gr_meterB = 1;
gr_meterC = 1;
gr_meter_decay = exp(1/(1*srate));

@slider
(old_s61 != slider61 && slider61 > slider62) ? slider62 = slider61;
(old_s62 != slider62 && slider62 < slider61) ? slider61 = slider62;
old_s61 = slider61;
old_s62 = slider62;

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

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

//comp1
thresholdA = 10^(slider1/20);

transfer_AA = (1/slider2)-1;
transfer_BA = outputA * pow(thresholdA,-transfer_AA);

attackA = exp(-1/(slider3/1000*srate));
releaseA = exp(-1/(slider4/1000*srate));
envelope_decayA = exp(-1/(slider5/1000*srate));

volA = 10^(slider6/20);

//comp2
thresholdB = 10^(slider11/20);

transfer_AB = (1/slider12)-1;
transfer_BB = outputB * pow(thresholdB,-transfer_AB);

attackB = exp(-1/(slider13/1000*srate));
releaseB = exp(-1/(slider14/1000*srate));
envelope_decayB = exp(-1/(slider15/1000*srate));

volB = 10^(slider16/20);

//comp3
thresholdC = 10^(slider21/20);

transfer_AC = (1/slider22)-1;
transfer_BC = outputC * pow(thresholdC,-transfer_AC);

attackC = exp(-1/(slider23/1000*srate));
releaseC = exp(-1/(slider24/1000*srate));
envelope_decayC = exp(-1/(slider25/1000*srate));

volC = 10^(slider26/20);

master_vol = 10^(slider52/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;

//comp1
in0 = out0;
in1 = out1;
detA = max(abs(in0),abs(in1));
envA = detA >= envA ? detA : detA+envelope_decayA*(envA-detA);
transfer_gainA = envA > thresholdA ? pow(envA,transfer_AA)*transfer_BA:outputA;
gainA = transfer_gainA < gainA ? transfer_gainA+attackA*(gainA-transfer_gainA) : transfer_gainA+releaseA*(gainA-transfer_gainA);

//comp2
in2 = out2;
in3 = out3;
detB = max(abs(in2),abs(in3));
envB = detB >= envB ? detB : detB+envelope_decayB*(envB-detB);
transfer_gainB = envB > thresholdB ? pow(envB,transfer_AB)*transfer_BB:outputB;
gainB = transfer_gainB < gainB ? transfer_gainB+attackB*(gainB-transfer_gainB) : transfer_gainB+releaseB*(gainB-transfer_gainB);

//comp3
in4 = out4;
in5 = out5;
detC = max(abs(in4),abs(in5));
envC = detC >= envC ? detC : detC+envelope_decayC*(envC-detC);
transfer_gainC = envC > thresholdC ? pow(envC,transfer_AC)*transfer_BC:outputC;
gainC = transfer_gainC < gainC ? transfer_gainC+attackC*(gainC-transfer_gainC) : transfer_gainC+releaseC*(gainC-transfer_gainC);

slider51==0?(
spl0 = ((in0 * gainA*volA) + (in2 * gainB*volB) + (in4 * gainC*volC))*master_vol;
spl1 = ((in1 * gainA*volA) + (in3 * gainB*volB) + (in5 * gainC*volC))*master_vol;
);
slider51==1?(
spl0 = (in0 * gainA*volA)*master_vol;
spl1 = (in1 * gainA*volA)*master_vol;
);
slider51==2?(
spl0 = (in2 * gainB*volB)*master_vol;
spl1 = (in3 * gainB*volB)*master_vol;
);
slider51==3?(
spl0 = (in4 * gainC*volC)*master_vol;
spl1 = (in5 * gainC*volC)*master_vol;
);

grA = log(gainA)*log2dB;
grvA = exp(grA*db2log);
grvA < gr_meterA ? gr_meterA=grvA : ( gr_meterA*=gr_meter_decay; gr_meterA>1?gr_meterA=1; );
grminA = min( min(grA,grA) , grminA);

grB = log(gainB)*log2dB;
grvB = exp(grB*db2log);
grvB < gr_meterB ? gr_meterB=grvB : ( gr_meterB*=gr_meter_decay; gr_meterB>1?gr_meterB=1; );
grminB = min( min(grB,grB) , grminB);

grC = log(gainC)*log2dB;
grvC = exp(grC*db2log);
grvC < gr_meterC ? gr_meterC=grvC : ( gr_meterC*=gr_meter_decay; gr_meterC>1?gr_meterC=1; );
grminC = min( min(grC,grC) , grminC);

@gfx 0 52
gfx_a=0.8;

meter_bot=21;
meter_h=min(gfx_h,gfx_h-4);
xscale=gfx_w*20/meter_bot;

gfx_r=1; gfx_g=gfx_b=0;
gfx_y=0;
gfx_x=gfx_w + log10(gr_meterA)*xscale;
gfx_rectto(gfx_w,meter_h/3);

gfx_r=1; gfx_g=0.5; gfx_b=0;
gfx_y=meter_h/3;
gfx_x=gfx_w + log10(gr_meterB)*xscale;
gfx_rectto(gfx_w,meter_h/1.5);

gfx_r=0; gfx_g=0.5; gfx_b=1;
gfx_y=meter_h/1.5;
gfx_x=gfx_w + log10(gr_meterC)*xscale;
gfx_rectto(gfx_w,meter_h);

gfx_r=gfx_g=gfx_b=1; gfx_a=0.6;

s2=sqrt(2)/2;
g = s2;
while(
gfx_x=gfx_w + log10(g)*xscale;
gfx_x >= 0 ? (
gfx_y=0;
gfx_lineto(gfx_x,meter_h,0);
gfx_y=meter_h-gfx_texth;
gfx_x+=2;
gfx_drawnumber(log10(g)*20,0);
gfx_drawchar($'d');
gfx_drawchar($'B');
);
g*=s2;
gfx_x >=0;
);

(mouse_cap) ? (grminA=grminB=grminC=0;);
gfx_x=2; gfx_y=1/3*meter_h/2 - gfx_texth/2;
gfx_drawnumber(grminA,1);
gfx_x=2; gfx_y=1*meter_h/2 - gfx_texth/2;
gfx_drawnumber(grminB,1);
gfx_x=2; gfx_y=5/3*meter_h/2 - gfx_texth/2;
gfx_drawnumber(grminC,1);
