// threshold = sets 'clipping' value

slider1:1<1,100,1>Strength (%)
slider2:50<0,100,1>Threshold (%)
slider3:0<-30,30,0.1>Gain (dB)
slider4:100<0,100,1>Mix (%)
slider5:0<0,1,1{Mono,Stereo}>Mode

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

@slider
power = 100.01/slider1;
gain = 1-(slider2*0.01*0.99);
gain2 = 10^(slider3/20)*1/gain;
mix = slider4*0.01;
mode = slider5;

@sample
mode == 0 ? (
x = (spl0+spl1)*0.5;

s = x * (1/gain);
neg = 1;
(s<0) ? (neg = -1; s = -s;);
(s>1) ? s = 1;
s = (s - (s^power/power)) * (power / (power-1))* gain * gain2;
x = s * neg * mix + x * (1-mix);

spl1 = spl0 = x;
);

mode == 1 ? (
xA = spl0;
xB = spl1;

sA = xA * (1/gain);
negA = 1;
(sA<0) ? (negA = -1; sA = -sA;);
(sA>1) ? sA = 1;
sA = (sA - (sA^power/power)) * (power / (power-1))* gain * gain2;
xA = sA * negA * mix + xA * (1-mix);

sB = xB * (1/gain);
negB = 1;
(sB<0) ? (negB = -1; sB = -sB;);
(sB>1) ? sB = 1;
sB = (sB - (sB^power/power)) * (power / (power-1))* gain * gain2;
xB = sB * negB * mix + xB * (1-mix);

spl0 = xA;
spl1 = xB;
);
