slider1:0<-30,0,0.1>Threshold (dB)
slider2:2<1,20,0.1>Ratio
slider3:3<0,100,1>Attack (ms)
slider4:100<0,1000,1>Release (ms)
slider5:50<10,100,1>Env Decay (ms)
slider6:0<-24,24,0.1>Output (dB)
slider7:1<0,31,1{---------,3+4,5+6,7+8,9+10,11+12,13+14,15+16,17+18,19+20,21+22,23+24,25+26,27+28,29+30,31+32,33+34,35+36,37+38,39+40,41+42,43+44,45+46,47+48,49+50,51+52,53+54,55+56,57+58,59+60,61+62,63+64}>'Meter' output channel

@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));
gr_meter_decay = exp(1/30);

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

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

vol=10^(slider6/20);

channel = slider7*2;
out = channel;
out2 = out+1;

@sample
inL=spl0;
inR=spl1;

det = max(abs(inL),abs(inR));
det += 0.000000000001;
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 = inL * gain*vol;
spl1 = inR * gain*vol;

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

slider7 >0 ? (
offset = gr_meter-0.000000000001;
spl(out) = spl(out2) = offset;
);
