slider1:0<-30,0,0.1>Threshold (dB)
slider2:0<0,4,1{4,8,12,20,Fixed Ratio/Attack; Output=Ceiling}>Ratio
slider3:0<0,2,0.01>over Ratio
slider4:3000<20,8000,1>Attack (s)
slider5:100<20,500,1>Release (ms)
slider6:50<10,100,1>Env Decay (ms)
slider7:0<-24,24,0.1>Output (dB)
slider8:1<1,10,1>Lookahead (ms)

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

@init
output = 1;
transfer_A = 0;
transfer_B = 1;
gain = 1;
env=0;

log2dB = 8.6858896380650365530225783783321;
db2log = 0.11512925464970228420089957273422;
gr_meter=1;
gr_meter_decay = exp(1/(1*srate));

@slider
threshold=10^(slider1/20);

look = floor(max( min( slider8/1000*srate , 500000) , 0));
pdc_delay = look;
pdc_bot_ch = 0;
pdc_top_ch = 2;

ratio = (slider2 == 0 ? (1/4)-(1+slider3) : (slider2 == 1 ? (1/8)-(1+slider3) : (slider2 == 2 ? (1/12)-(1+slider3) : (slider2 == 3 ? (1/20)-(1+slider3) :  -1 ))));
transfer_A = ratio;
transfer_B = output * pow(threshold,-transfer_A);

attackcoeff = (slider2 > 3 ? 0.004 : slider4;);
attack = exp(-1/(attackcoeff/1000000*srate));
release = exp(-1/(slider5/1000*srate));
envelope_decay = exp(-1/(slider6/1000*srate));

slider2 > 3 ?
(
slider7 > 0 ? slider7 = 0; 
vol=10^(slider7/20);
outvol=vol/threshold;
):(
outvol=10^(slider7/20);
);

@sample
det = max(abs(spl0),abs(spl1));

bufPos[0] = spl0;
bufPos[look] = spl1;
(bufPos += 1) >= look ? bufPos = 0 ;
spl0 = bufPos[0];
spl1 = bufPos[look];

env = det >= env ? det : det+envelope_decay*(env-det);
transfer_gain = env > threshold ? pow(env,transfer_A)*transfer_B:output;
gain = transfer_gain < gain ? transfer_gain+attack *(gain-transfer_gain) : transfer_gain+release*(gain-transfer_gain);

spl0 *= gain * outvol;
spl1 *= gain * outvol;

gr = log(gain)*log2dB;
grv = exp(gr * db2log);
grv < gr_meter ? gr_meter=grv : ( gr_meter*=gr_meter_decay; gr_meter>1?gr_meter=1; );

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

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

gfx_y=0;
gfx_x=gfx_w + log10(gr_meter)*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);
);
g*=s2;
gfx_x >=0;
);
