slider1:0<-60,0,0.1>Threshold (dB)
slider2:2<1,20,0.1>Ratio
slider3:3<1,20,0.1>Attack (ms)
slider4:100<20,1000,1>Release (ms)
slider5:50<10,100,1>Env Decay (ms)
slider6:0<-24,24,0.1>Output (dB)
slider7:0<0,3,1{A: 1+2,B: 1+2  Filter,C: 3+4,D: 3+4  Filter}>Feed
slider8:6000<100,10000,1>BP Freq (Hz)
slider9:6<0.1,10,0.1>Bandwidth
slider10:0<0,3,1{A/B: Wet,A/B: Delta,A/C: Dry      -or-    B/D: Filter,A/C: Delta   -or-    B/D: Filter Delta}>Listen to
slider11:0<0,1,1{Off,On}>Auto Make-up

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

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

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

@slider
thresh = slider1;
threshold = exp(thresh * db2log);

transfer_A = (1/slider2)-1;
transfer_B = output * pow(threshold,-transfer_A);

attack = exp(-1/(slider3/1000*srate));
release = exp(-1/(slider4/1000*srate));
envelope_decay = exp(-1/(slider5/1000*srate));

automakeup = slider11;
automakeup ? (
autogain = (abs(thresh) - (abs(thresh)/max(1,slider2-1)))/2;
) : (
autogain = 0;
);
vol = slider6;
volv = exp((vol+autogain) * db2log);

feed = slider7;
listen = slider10;

//Filter
f= 2*$pi * min(slider8, 0.49 * srate) / srate;
q=slider9*1.2;
w0 = f;
alpha = sin(w0) / (2*q);
b0 = alpha;
b1 = 0;
b2 = -alpha;
a0 = 1 + alpha;
a1 = -2 * cos(w0);
a2 = 1 - alpha;
a1 /= a0;
a2 /= a0;
b0 /= a0;
b1 /= a0;
b2 /= a0;

@sample
inL = spl0;
inR = spl1;

feed == 0 ? (
s0 = inL;
s1 = inR;
);

feed == 1 ? (
ss0 = inL;
ss1 = inR;

//Filter Left
x2A = x1A;
x1A = x0A;
x0A = ss0;
y2A = y1A;
y1A = y0A;
y0A = b0*x0A + b1*x1A + b2*x2A - a1*y1A - a2*y2A;
//Filter Right
x2B = x1B;
x1B = x0B;
x0B = ss1;
y2B = y1B;
y1B = y0B;
y0B = b0*x0B + b1*x1B + b2*x2B - a1*y1B - a2*y2B;

s0 = y0A;
s1 = y0B;
);

feed == 2 ? (
s0 = spl2;
s1 = spl3;
);

feed == 3 ? (
ss0 = spl2;
ss1 = spl3;

//Filter Left
x2A = x1A;
x1A = x0A;
x0A = ss0;
y2A = y1A;
y1A = y0A;
y0A = b0*x0A + b1*x1A + b2*x2A - a1*y1A - a2*y2A;
//Filter Right
x2B = x1B;
x1B = x0B;
x0B = ss1;
y2B = y1B;
y1B = y0B;
y0B = b0*x0B + b1*x1B + b2*x2B - a1*y1B - a2*y2B;

s0 = y0A;
s1 = y0B;
);

det = max(abs(s0),abs(s1));
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);

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; );
grmin = min( min(gr,gr) , grmin);

listen == 0 ? (
spl0 = (inL+((s0 * gain)-s0)) * volv;
spl1 = (inR+((s1 * gain)-s1)) * volv;
);
listen == 1 ? (
spl0 = ((inL * gain)-inL) * volv;
spl1 = ((inR * gain)-inR) * volv;
);
listen == 2 ? (
spl0 = s0 * volv;
spl1 = s1 * volv;
);
listen == 3 ? (
spl0 = ((s0 * gain)-s0) * volv;
spl1 = ((s1 * gain)-s1) * volv;
);

@gfx 0 36
gfx_r=1; gfx_g=gfx_b=0; gfx_a=0.8;

meter_bot=21;
meter_h=min(gfx_h,gfx_h-4);
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; 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) ? (grmin=0;);
gfx_x=2;
gfx_y=meter_h/2 - gfx_texth/2;
gfx_drawnumber(grmin,1);
