desc: needs improvements

// 9.6

slider1:0<-48,0,0.1>limit1----------Threshold (dB)
slider2:300<20,1010,1>Release (ms)
slider3:0<-24,0,0.1>Ceiling (dB)

slider11:0<-48,0,0.1>limit2----------Threshold (dB)
slider12:300<20,1010,1>Release (ms)
slider13:0<-24,0,0.1>Ceiling (dB)

slider21:0<-48,0,0.1>limit3----------Threshold (dB)
slider22:300<20,1010,1>Release (ms)
slider23:0<-24,0,0.1>Ceiling (dB)

slider50:50<10,1000,1>|---------------Env Decay (ms)
slider51:0<0,3,1{-----------,Band 1,Band 2,Band 3}>Solo
slider52:0<-24,24,0.1>Main Output (dB)

slider61:200<20,20000,1>Frequency (Hz)
slider62:2000<20,20000,1>Frequency (Hz)

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

@init
cDenorm=10^-30;

transfer_A = 0;

outputA = 1;
transfer_BA = 1;
gainA = 1;
envA=0;
outputB = 1;
transfer_BB = 1;
gainB = 1;
envB=0;
outputC = 1;
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
freqHP = max(min(slider62,srate),slider64);
xHP = exp(-2.0*$pi*freqHP/srate);
a0HP = 1.0-xHP;
b1HP = -xHP;

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

attack = exp(-1/(0.004/1000*srate));
envelope_decay = exp(-1/(slider50/1000*srate));
transfer_A = -1;

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

transfer_BA = outputA * pow(thresholdA,-transfer_A);

releaseA = exp(-1/(slider2/1000*srate));

ceilingA=10^(slider3/20);
volA=ceilingA/thresholdA;

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

transfer_BB = outputB * pow(thresholdB,-transfer_A);

releaseB = exp(-1/(slider12/1000*srate));

ceilingB=10^(slider13/20);
volB=ceilingB/thresholdB;

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

transfer_BC = outputC * pow(thresholdC,-transfer_A);

releaseC = exp(-1/(slider22/1000*srate));

ceilingC=10^(slider23/20);
volC=ceilingC/thresholdC;

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;

//limiter1
in0=out0;
in1=out1;
detA = max(abs(in0),abs(in1));
envA = detA >= envA ? detA : detA+envelope_decay*(envA-detA);
transfer_gainA = envA > thresholdA ? pow(envA,transfer_A)*transfer_BA:outputA;
gainA = transfer_gainA < gainA ? transfer_gainA+attack *(gainA-transfer_gainA) : transfer_gainA+releaseA*(gainA-transfer_gainA);

//limiter2
in2=out2;
in3=out3;
detB = max(abs(in2),abs(in3));
envB = detB >= envB ? detB : detB+envelope_decay*(envB-detB);
transfer_gainB = envB > thresholdB ? pow(envB,transfer_A)*transfer_BB:outputB;
gainB = transfer_gainB < gainB ? transfer_gainB+attack *(gainB-transfer_gainB) : transfer_gainB+releaseB*(gainB-transfer_gainB);

//limiter3
in4=out4;
in5=out5;
detC = max(abs(in4),abs(in5));
envC = detC >= envC ? detC : detC+envelope_decay*(envC-detC);
transfer_gainC = envC > thresholdC ? pow(envC,transfer_A)*transfer_BC:outputC;
gainC = transfer_gainC < gainC ? transfer_gainC+attack *(gainC-transfer_gainC) : transfer_gainC+releaseC*(gainC-transfer_gainC);

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

spl0 *= master_vol;
spl1 *= 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; );

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; );

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; );

@gfx 0 36
gr_meterA *= exp(1/30); gr_meterA>1?gr_meterA=1;
gr_meterB *= exp(1/30); gr_meterB>1?gr_meterB=1;
gr_meterC *= exp(1/30); gr_meterC>1?gr_meterC=1;
gfx_r=1; gfx_g=gfx_b=0; gfx_a=0.8;

meter_bot=20;
meter_h=min(gfx_h,33);
xscale=gfx_w*20/meter_bot;

gfx_y=2;
gfx_x=gfx_w + log10(gr_meterA)*xscale;
gfx_rectto(gfx_w,meter_h-22);

gfx_y=12;
gfx_x=gfx_w + log10(gr_meterB)*xscale;
gfx_rectto(gfx_w,meter_h-11);

gfx_y=23;
gfx_x=gfx_w + log10(gr_meterC)*xscale;
gfx_rectto(gfx_w,meter_h);

gfx_r=gfx_g=gfx_b=1.0; 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;
);
