slider1:-120<-120,0,0.1>Threshold (dB)
slider2:0.01<0.1,10,0.01>Attack (ms)
slider3:50<20,200,1>(read only in bpm mode) Release (ms)
slider4:50<10,100,1>(read only in bpm mode) Env Decay (ms)
slider5:0<-24,24,0.1>Output (dB)
slider6:1<0,3,1{OFF,ON,ON - Release only,ON - Env Decay only}>BPM sync
slider7:10<0,21,1{1,1T,1/2,1/2T,1/4,1/4T,1/8,1/8T,1/16,1/16T,1/32,1/32T,1/64,1/64T,1/128,1/128T,1/256,1/256T,1/512,1/512T,1/1024,1/1024T}>Release Units
slider8:10<0,21,1{1,1T,1/2,1/2T,1/4,1/4T,1/8,1/8T,1/16,1/16T,1/32,1/32T,1/64,1/64T,1/128,1/128T,1/256,1/256T,1/512,1/512T,1/1024,1/1024T}>Env Decay Units

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

@init
gain = 1;
env = 0;

@block
slider6==0?(
release = exp(-1/(slider3/1000*srate));
envelope_decay = exp(-1/(slider4/1000*srate));
);
slider6==1?(
Rms = (60000 / tempo * multR);
slider3 = Rms;
sliderchange(slider3);
Ems = (60000 / tempo * multE);
slider4 = Ems;
sliderchange(slider4);
release = exp(-1/(Rms/1000*srate));
envelope_decay = exp(-1/(Ems/1000*srate));
);
slider6==2?(
Rms = (60000 / tempo * multR);
slider3 = Rms;
sliderchange(slider3);
release = exp(-1/(Rms/1000*srate));
envelope_decay = exp(-1/(slider4/1000*srate));
);
slider6==3?(
Ems = (60000 / tempo * multE);
slider4 = Ems;
sliderchange(slider4);
release = exp(-1/(slider3/1000*srate));
envelope_decay = exp(-1/(Ems/1000*srate));
);

@slider
threshold = 10^(slider1/20);
attack = exp(-1/(slider2/1000*srate));
vol = 10^(slider5/20);

multR = (slider7 & 1) ? 2 ^ -(slider7 >> 1 - 3) / 3 : 2 ^ -(slider7 >> 1 - 2);
multE = (slider8 & 1) ? 2 ^ -(slider8 >> 1 - 3) / 3 : 2 ^ -(slider8 >> 1 - 2);

@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,0):0;
gain = transfer_gain > gain ? transfer_gain+attack*(gain-transfer_gain) : transfer_gain+release*(gain-transfer_gain);

spl0 = inL * gain * vol;
spl1 = inR * gain * vol;
