slider1:0<-30,0,0.1>Threshold (dB)
slider2:-0.025<-0.08,-0.015,0.001>Knee curve (oversoft <-> soft)
slider3:0<-30,30,0.1>Output (dB)

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

@init
amp_dB = 8.6858896380650365530225783783321;
db2log = 0.11512925464970228420089957273422;
gr_meter=1;
gr_meter_decay = exp(1/(1*srate));
a = 1.017;

@slider
b = slider2;
baseline_threshold_dB = slider1;
threshold_dB = baseline_threshold_dB;
gain=10^(slider3/20);

@sample
dB0 = amp_dB * log(abs(spl0));
dB1 = amp_dB * log(abs(spl1));

(dB0 > threshold_dB) ? (
over_dB = dB0 - threshold_dB;
over_dB = a * over_dB + b * over_dB * over_dB;
dB0 = min(threshold_dB + over_dB, 1);
):(
over_dB =0;
);

(dB1 > threshold_dB) ? (
over_dB = dB1 - threshold_dB;
over_dB = a * over_dB + b * over_dB * over_dB;
dB1 = min(threshold_dB + over_dB, 1);
):(
over_dB =0;
);

spl0 = exp(dB0 / amp_dB) * sign(spl0);
spl1 = exp(dB1 / amp_dB) * sign(spl1);

spl0*=gain;
spl1*=gain;

grv = exp(-over_dB * 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=20;
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);
gfx_drawchar($'d');
gfx_drawchar($'B');
);
g*=s2;
gfx_x >=0;
);
