desc: KickbAss 0.33  [mrelwood]

// (Copyright) 2018 - mrelwood plugins
//
//  This program is a free software plugin: you can redistribute it and/or modify
//  it under the terms of the GNU General Public License as published by
//  the Free Software Foundation, either version 3 of the License, or
//  (at your option) any later version.
//
//  This plugin is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU General Public License for more details.
//  <https://www.gnu.org/licenses/>.



// For code from other JS plugins:

// (C) 2008-2009, Lubomir I. Ivanov
//
// NO WARRANTY IS GRANTED. THIS PLUG-IN IS PROVIDED ON AN "AS IS" BASIS, WITHOUT
// WARRANTY OF ANY KIND. NO LIABILITY IS GRANTED, INCLUDING, BUT NOT LIMITED TO,
// ANY DIRECT OR INDIRECT,  SPECIAL,  INCIDENTAL OR CONSEQUENTIAL DAMAGE ARISING
// OUT OF  THE  USE  OR INABILITY  TO  USE  THIS PLUG-IN,  COMPUTER FAILTURE  OF
// MALFUNCTION INCLUDED.  THE USE OF THE SOURCE CODE,  EITHER  PARTIALLY  OR  IN
// TOTAL, IS ONLY GRANTED,  IF USED IN THE SENSE OF THE AUTHOR'S INTENTION,  AND
// USED WITH ACKNOWLEDGEMENT OF THE AUTHOR. FURTHERMORE IS THIS PLUG-IN A  THIRD
// PARTY CONTRIBUTION,  EVEN IF INCLUDED IN REAPER(TM),  COCKOS INCORPORATED  OR
// ITS AFFILIATES HAVE NOTHING TO DO WITH IT.  LAST BUT NOT LEAST, BY USING THIS
// PLUG-IN YOU RELINQUISH YOUR CLAIM TO SUE IT'S AUTHOR, AS WELL AS THE CLAIM TO
// ENTRUST SOMEBODY ELSE WITH DOING SO.
//
// Released under GPL:
// <http://www.gnu.org/licenses/>.
//
//******************************************************************************
// butterworth filter implementation -
// original port from apple.com au tutorial (c+)
// added HP version
// added 12 poles cascade
// * see note below about efficiency
//******************************************************************************

//tags: filter
//author: Liteon, mrelwood

//slider1:0<0,1,1{Stereo,Mono}>Processing
//slider1:0<0,1,1{Low Pass,Notch}>Processing Band
//slider2:0<0,6,1{Off,12 dB/oct (2-pole),24 dB/oct (4-pole),36 dB/oct (6-pole),
//48 dB/oct (8-pole),60 dB/oct (10-pole),72 dB/oct (12-pole)}>HP Slope

slider1:1<0,1,1{Main Input (Low Pass),Sidechain (Fullrange)}>-Detector input

//slider3:19.77<0,100,0.01>-Crossover Frequency (Scale)
//slider4:200<50,4000,1>-Crossover Frequency
slider4:31<0,100,1>-Crossover Frequency multiplier
//slider3:60<0,100,0.01>HP Cutoff (Scale)
//slider4:-6<-16,16,0.01>HP Resonance (dB)
//slider4:-6<-16,16,0.01>Resonances (dB)

//slider5:1<1,50,0.01>Attack (ms)
//slider5:20<1,20,0.1>Ratio
slider5:100<0,200,10>-Ratio (%)
slider6:1<1,50,0.1>-Attack (ms)
slider7:10<5,200,1>-Release (ms)
slider8:0<-3,6,0.1>-Makeup (Low Pass) (dB)
//slider5:2<1,4,0.1>Notch Width (Octaves)
//slider5:0<0,6,1{Off,12 dB/oct (2-pole),24 dB/oct (4-pole),36 dB/oct (6-pole),48 dB/oct (8-pole),60 dB/oct (10-pole),72 dB/oct (12-pole)}>LP Slope
//slider6:68.7<0,100,0.01>LP Cutoff (Scale)
//slider8:-6<-16,16,0.01>LP Resonance (dB)
slider10:0<0,2,1{Output,Processing Band}>-Monitor
slider12:-24<-36,0,0.5>-Threshold (dB)




in_pin:Main L in
in_pin:Main R in
in_pin:Sidechain L in
in_pin:Sidechain R in
out_pin:Out L
out_pin:Out R


@init

ver = "0.33";

gfx_ext_retina = 2;

r = gfx_ext_retina;
//r = 2;

/*
sl4 = slider4 = 200;
sl12 = slider12 = -24;
*/
noob = 2;

  log2db = 8.6858896380650365530225783783321; // 20 / ln(10)
  db2log = 0.11512925464970228420089957273422; // ln(10) / 20
  
  attime=attack/1000;
//  reltime=0.007;
  ratio=0;
  cratio=0;
  rundb=0;
  overdb=0;
  ratatcoef = exp(-1/(0.00001 * srate));
  ratrelcoef = exp(-1/(0.5 * srate));
  atcoef=exp(-1/(attime * srate));
  relcoef=exp(-1/(reltime * srate));
  mix=1;
  gr_meter=1;
//  gr_meter_decay = exp(1/(1*srate));
//  gr_meter_decay = exp(1/(1*srate));

//  gr_meter_decay = 1.00005; //fast
//  gr_meter_decay = 1.00001; //slow
  gr_meter_decay = 1/srate * 10 +1;
  sc_decay       = 1/srate * 5 +1;


//  sc_decay =       exp(1/(1*srate))*1.00006;    // SC Meter decay

  hold = 1.2;  // 1-3, hold meter at max

  clip=0;

sc_meter = 0;

scv = 0;
inv = 0;

attack = ((slider6-1)/49)^1.5 *49 +1;

resonances = -5.2;

sidechain = 1;

ratio = cratio = 20;

allin = 1;


update = 1;

@serialize


store_01 = file_var(0, betw);


@slider

/*
drag == 12 ? (
  slider12 = sl12 = thrstart + (mouse_x - mousexstart) / xscale * meter_bot /3 *2;
  slider_automate(slider12);
  thresh = slider12 - (attack/4);
  threshv = exp(thresh * db2log);
  cthresh = (softknee ? (thresh -3) : thresh);
  cthreshv = exp(cthresh * db2log);
  );
*/
//resonances = -6;

//mono = slider1;
//notch = slider1;
monitor = slider10;
notch = 0;
//width = slider5;
outgain = 10^(slider8/20);

/*
// Also in @gfx:
thresh = slider12 - (attack/5);
threshv = exp(thresh * db2log);
cthresh = (softknee ? (thresh -3) : thresh);
cthreshv = exp(cthresh * db2log);
*/

//ratio = slider5^0.25;


// Actual ratio slider to old "ratio":
/*
slider5 >= 3 ? (
  ratio = ((slider5*0.4+3)/(10+slider5*0.1))+1.14 ;
  ) : (
  ratio = (slider5*0.8+3)/(1+slider5*0.12)-2.39 ;
);
*/


//  ratio = (slider5 + 1.5 * slider5 - 1.5) ^0.2;


//  ratio = slider5;
ratio = 20;
//allin = 1;
  cratio = ratio;

//attime = slider5 / 1000000;
//attime = attack / 1000000;

attack = ((slider6-1)/49)^1.5 *49 +1;
attime = attack / 1000;
reltime = slider7 / 1000;

//gr_meter_decay = (exp(1/(1*srate))-1) //* (1/(slider6/5))    +1 ;
//;


//  gr_meter_decay = 0.1/srate * 0.01 * exp(1- (slider6/100) ) +1;
  gr_meter_decay = 1/(srate *0.8) + (0.0003/ slider7 ) +1 ;
// speed at fastest release ̂              speed at slowest release


  atcoef=exp(-1/(attime * srate));
  relcoef=exp(-1/(reltime * srate));


//sx = 16+slider6*1.20103;


//   vvvv    Lowest F (slider 0.0)
//sx = 16+slider3*1.20103;


//cx_lp = min ( floor(exp(sx*log(1.059))*8.17742) * 1.82 , 20000);

//notch == 1 ? (

//cx_lp = min ( floor(exp(sx*log(1.059))*8.17742) , 10000 ) * pow(2,(width/2)) ;

//  ) : (

//cx_lp = min ( floor(exp(sx*log(1.059))*8.17742) * (1.0 - (cx_hp*cx_hp / pow(10.85,8))) , 12793);



// Increase LP F? increase log(1.059)
//cx_lp = min ( floor(exp(sx*log(1.059))*9) * (1.0 - (cx_hp*cx_hp / pow(10.85,8.55))) , 12793);
                               // Increase LP at high F, increase pow(10.85,x.x)



//);

/*
 Closest for HP 41Hz:
60dB/oct,  Res -7, LP =* 1.8
7.3KHz: -7 LP *1.52

*/


// COMPRESSOR

//  slider2 == 10 ? ( allin = 1 && thresh *= 0.65  ) : (allin = 0);

//Also in @gfx:
//  cthresh = (softknee ? (thresh -3) : thresh);
//  cthreshv = exp(cthresh * db2log);



@block

sidechain = slider1;

//upf = 0;
update ? (
  //****************************
  //hp


  //n_hp = slider2;
  n_hp = 5;
  //sx = 16+slider3*1.20103;
  //sx = 16+slider2*1.20103;

  //notch == 1 ? (

  //sx = 16+slider2*1.20103;
  //cx_hp = min ( floor(exp(sx*log(1.059))*8.17742) , 10000 ) / pow(2,(width/2)) ;

  //  ) : (



  // Slider range:

  //sx = 33.5+slider3*1.20103;
  sx = 33.5+slider3*0.76193;
  //cx_sx = sx; (temp);

  //sx = (16+slider3*1.20103)*srate/100;
  //cx_hp = floor(exp(sx*log(1.059))*8.17742);
  //cx_hp = min ( floor(exp(sx*log(1.059))*8.17742) , 10000 );









  // Increase Crossover (Hi Pass) frequency by increasing log(1.0xx).
  //cx_hp = min ( floor(exp(sx*log(1.059))*6) , 10000 );

  //);


  cutoff_hp = 2*cx_hp/srate;
  //res_hp = 10^(0.05*(-slider4/n_hp+1.5));
  res_hp = 10^(0.05*(-resonances/n_hp+1.5));
  //res_hp = 10^(0.05*(6/n_hp+1.5));

  k = 0.5*res_hp*sin($pi*cutoff_hp);
  c1 = 0.5*(1-k)/(1+k);
  c2 = (0.5+c1)*cos($pi*cutoff_hp);
  c3 = (0.5+c1+c2)*0.25;

  a0_hp = 2*c3;
  a1_hp = -4*c3;
  a2_hp = 2*c3;
  b1_hp = -2*c2;
  b2_hp = 2*c1;

  //****************************
  //lp

  //n_lp = slider5;
  n_lp = 5;

  cutoff_lp = 2*cx_lp/srate;
  //res_lp = 10^(0.05*(-slider7/n_lp+1.5));
  //res_lp = 10^(0.05*(-slider4/n_lp+1.5));
  res_lp = 10^(0.05*(-resonances/n_lp+1.5));
  //res_lp = 10^(0.05*(6/n_lp+1.5));

  k = 0.5*res_lp*sin($pi*cutoff_lp);
  c1 = 0.5*(1-k)/(1+k);
  c2 = (0.5+c1)*cos($pi*cutoff_lp);
  c3 = (0.5+c1-c2)*0.25;

  a0_lp = 2*c3;
  a1_lp = 4*c3;
  a2_lp = 2*c3;
  b1_lp = -2*c2;
  b2_lp = 2*c1;
  
  
/*
  thresh = slider12 - (attack/4);
  threshv = exp(thresh * db2log);
  cthresh = (softknee ? (thresh -3) : thresh);
  cthreshv = exp(cthresh * db2log);
*/  
  
  attime = attack / 1000;
  reltime = slider7 / 1000;
  
  atcoef=exp(-1/(attime * srate));
  relcoef=exp(-1/(reltime * srate));
  

  upf = 0;
  );

rmsl = floor(sc*log(sqrt(suml/cs))*100)/100;

ab1 = log(sqrt(suml/cs));
ab2 = sqrt(suml/cs);

rms_i == i_max ? (
  rmsl_gfx = rmsl;
  rms_i = 0;
);
rms_i += 1;

bscnt > st ? (

  ool = log(pvl)*sc;

  //get x from exp scale
  xlt = floor(exp(log(1.055)*2.1*ool)*285);

  //get y from x and radius - r
  l=sqrt(sqr(r)+sqr(212-xlt));
  h=((l-r)*r/l);
  m=sqrt(sqr(l-r)-sqr(h));
  ylt=35+h;
  xlt < 212 ? xlt=xlt+m : xlt=xlt-m;

  //update x,y,out
  old_xl < xlt ? (xl = min(max(xlt,66),375); yl = ylt; olt = ool;);
  bscnt = pvl = pvr = 0;
);

old_xl = xl;

bscnt += samplesblock;

//indicator fall-back
fallback = rel/2*samplesblock/1024;
fbi_l = exp(xl/512)*fallback;
xl > 66 ? xl -= fbi_l;

//limit x
xl = min(max(xl,66),375);

//get y after fall-back
yl=35;
l=sqrt(sqr(r)+sqr(212-xl));
h=((l-r)*r/l);
yl=floor(yl+h);




@sample


/*
drag == 12 ? (
  slider12 = sl12 = thrstart + (mouse_x - mousexstart) / xscale * meter_bot /3 *2;
  slider_automate(slider12);
  thresh = slider12 - (attack/4);
  threshv = exp(thresh * db2log);
  cthresh = (softknee ? (thresh -3) : thresh);
  cthreshv = exp(cthresh * db2log);
  );
*/

// *NOTE: You can use 'loop' for the cascade (see example below)
// however its many times less efficient !
//
// comparison for - mono, lp, 72db:
// --------------------
// using loop - 13.8% cpu
// long version - 3.3% cpu


/*
//*****************************************************************************
//stereo
) : (
*/

scv = max(abs(spl2),abs(spl3));
inv = max(abs(spl0),abs(spl1));


//inl = spl0;
//inr = spl1;
hpinl = spl0;
hpinr = spl1;
//*********************************************
//hp
n_hp > 0 ? (
out_hp_l_1 = a0_hp*hpinl+a1_hp*mem_hp_l_11+a2_hp*mem_hp_l_12-b1_hp*mem_hp_l_13-b2_hp*mem_hp_l_14;
mem_hp_l_12 = mem_hp_l_11;
mem_hp_l_11 = hpinl;
mem_hp_l_14 = mem_hp_l_13;
mem_hp_l_13 = out_hp_l_1;
out_hp_l = out_hp_l_1;
out_hp_r_1 = a0_hp*hpinr+a1_hp*mem_hp_r_11+a2_hp*mem_hp_r_12-b1_hp*mem_hp_r_13-b2_hp*mem_hp_r_14;
mem_hp_r_12 = mem_hp_r_11;
mem_hp_r_11 = hpinr;
mem_hp_r_14 = mem_hp_r_13;
mem_hp_r_13 = out_hp_r_1;
out_hp_r = out_hp_r_1;
n_hp > 1 ? (
out_hp_l_2 = a0_hp*out_hp_l_1+a1_hp*mem_hp_l_21+a2_hp*mem_hp_l_22-b1_hp*mem_hp_l_23-b2_hp*mem_hp_l_24;
mem_hp_l_22 = mem_hp_l_21;
mem_hp_l_21 = out_hp_l_1;
mem_hp_l_24 = mem_hp_l_23;
mem_hp_l_23 = out_hp_l_2;
out_hp_l = out_hp_l_2;
out_hp_r_2 = a0_hp*out_hp_r_1+a1_hp*mem_hp_r_21+a2_hp*mem_hp_r_22-b1_hp*mem_hp_r_23-b2_hp*mem_hp_r_24;
mem_hp_r_22 = mem_hp_r_21;
mem_hp_r_21 = out_hp_r_1;
mem_hp_r_24 = mem_hp_r_23;
mem_hp_r_23 = out_hp_r_2;
out_hp_r = out_hp_r_2;
);
n_hp > 2 ? (
out_hp_l_3 = a0_hp*out_hp_l_2+a1_hp*mem_hp_l_31+a2_hp*mem_hp_l_32-b1_hp*mem_hp_l_33-b2_hp*mem_hp_l_34;
mem_hp_l_32 = mem_hp_l_31;
mem_hp_l_31 = out_hp_l_2;
mem_hp_l_34 = mem_hp_l_33;
mem_hp_l_33 = out_hp_l_3;
out_hp_l = out_hp_l_3;
out_hp_r_3 = a0_hp*out_hp_r_2+a1_hp*mem_hp_r_31+a2_hp*mem_hp_r_32-b1_hp*mem_hp_r_33-b2_hp*mem_hp_r_34;
mem_hp_r_32 = mem_hp_r_31;
mem_hp_r_31 = out_hp_r_2;
mem_hp_r_34 = mem_hp_r_33;
mem_hp_r_33 = out_hp_r_3;
out_hp_r = out_hp_r_3;
);
n_hp > 3 ? (
out_hp_l_4 = a0_hp*out_hp_l_3+a1_hp*mem_hp_l_41+a2_hp*mem_hp_l_42-b1_hp*mem_hp_l_43-b2_hp*mem_hp_l_44;
mem_hp_l_42 = mem_hp_l_41;
mem_hp_l_41 = out_hp_l_3;
mem_hp_l_44 = mem_hp_l_43;
mem_hp_l_43 = out_hp_l_4;
out_hp_l = out_hp_l_4;
out_hp_r_4 = a0_hp*out_hp_r_3+a1_hp*mem_hp_r_41+a2_hp*mem_hp_r_42-b1_hp*mem_hp_r_43-b2_hp*mem_hp_r_44;
mem_hp_r_42 = mem_hp_r_41;
mem_hp_r_41 = out_hp_r_3;
mem_hp_r_44 = mem_hp_r_43;
mem_hp_r_43 = out_hp_r_4;
out_hp_r = out_hp_r_4;
);
n_hp > 4 ? (
out_hp_l_5 = a0_hp*out_hp_l_4+a1_hp*mem_hp_l_51+a2_hp*mem_hp_l_52-b1_hp*mem_hp_l_53-b2_hp*mem_hp_l_54;
mem_hp_l_52 = mem_hp_l_51;
mem_hp_l_51 = out_hp_l_4;
mem_hp_l_54 = mem_hp_l_53;
mem_hp_l_53 = out_hp_l_5;
out_hp_l = out_hp_l_5;
out_hp_r_5 = a0_hp*out_hp_r_4+a1_hp*mem_hp_r_51+a2_hp*mem_hp_r_52-b1_hp*mem_hp_r_53-b2_hp*mem_hp_r_54;
mem_hp_r_52 = mem_hp_r_51;
mem_hp_r_51 = out_hp_r_4;
mem_hp_r_54 = mem_hp_r_53;
mem_hp_r_53 = out_hp_r_5;
out_hp_r = out_hp_r_5;
);
n_hp > 5 ? (
out_hp_l_6 = a0_hp*out_hp_l_5+a1_hp*mem_hp_l_61+a2_hp*mem_hp_l_62-b1_hp*mem_hp_l_63-b2_hp*mem_hp_l_64;
mem_hp_l_62 = mem_hp_l_61;
mem_hp_l_61 = out_hp_l_5;
mem_hp_l_64 = mem_hp_l_63;
mem_hp_l_63 = out_hp_l_6;
out_hp_l = out_hp_l_6;
out_hp_r_6 = a0_hp*out_hp_r_5+a1_hp*mem_hp_r_61+a2_hp*mem_hp_r_62-b1_hp*mem_hp_r_63-b2_hp*mem_hp_r_64;
mem_hp_r_62 = mem_hp_r_61;
mem_hp_r_61 = out_hp_r_5;
mem_hp_r_64 = mem_hp_r_63;
mem_hp_r_63 = out_hp_r_6;
out_hp_r = out_hp_r_6;
);
);

//) : (
//out_hp_l = inl;
//out_hp_r = inr;
//);
//*/
//*********************************************
//lp

/*
notch == 1 ? (
  lpinl = out_hp_l;
  lpinr = out_hp_r;

  ) : (
*/
lpinl = spl0;
lpinr = spl1;
//);



n_lp > 0 ? (
//out_lp_l_1 = a0_lp*out_hp_l+a1_lp*mem_lp_l_11+a2_lp*mem_lp_l_12-b1_lp*mem_lp_l_13-b2_lp*mem_lp_l_14;
out_lp_l_1 = a0_lp*lpinl+a1_lp*mem_lp_l_11+a2_lp*mem_lp_l_12-b1_lp*mem_lp_l_13-b2_lp*mem_lp_l_14;
mem_lp_l_12 = mem_lp_l_11;
//mem_lp_l_11 = out_hp_l;
mem_lp_l_11 = lpinl;
mem_lp_l_14 = mem_lp_l_13;
mem_lp_l_13 = out_lp_l_1;
out_lp_l = out_lp_l_1;
//out_lp_r_1 = a0_lp*out_hp_r+a1_lp*mem_lp_r_11+a2_lp*mem_lp_r_12-b1_lp*mem_lp_r_13-b2_lp*mem_lp_r_14;
out_lp_r_1 = a0_lp*lpinr+a1_lp*mem_lp_r_11+a2_lp*mem_lp_r_12-b1_lp*mem_lp_r_13-b2_lp*mem_lp_r_14;
mem_lp_r_12 = mem_lp_r_11;
//mem_lp_r_11 = out_hp_r;
mem_lp_r_11 = lpinr;
mem_lp_r_14 = mem_lp_r_13;
mem_lp_r_13 = out_lp_r_1;
out_lp_r = out_lp_r_1;
n_lp > 1 ? (
out_lp_l_2 = a0_lp*out_lp_l_1+a1_lp*mem_lp_l_21+a2_lp*mem_lp_l_22-b1_lp*mem_lp_l_23-b2_lp*mem_lp_l_24;
mem_lp_l_22 = mem_lp_l_21;
mem_lp_l_21 = out_lp_l_1;
mem_lp_l_24 = mem_lp_l_23;
mem_lp_l_23 = out_lp_l_2;
out_lp_l = out_lp_l_2;
out_lp_r_2 = a0_lp*out_lp_r_1+a1_lp*mem_lp_r_21+a2_lp*mem_lp_r_22-b1_lp*mem_lp_r_23-b2_lp*mem_lp_r_24;
mem_lp_r_22 = mem_lp_r_21;
mem_lp_r_21 = out_lp_r_1;
mem_lp_r_24 = mem_lp_r_23;
mem_lp_r_23 = out_lp_r_2;
out_lp_r = out_lp_r_2;
);
n_lp > 2 ? (
out_lp_l_3 = a0_lp*out_lp_l_2+a1_lp*mem_lp_l_31+a2_lp*mem_lp_l_32-b1_lp*mem_lp_l_33-b2_lp*mem_lp_l_34;
mem_lp_l_32 = mem_lp_l_31;
mem_lp_l_31 = out_lp_l_2;
mem_lp_l_34 = mem_lp_l_33;
mem_lp_l_33 = out_lp_l_3;
out_lp_l = out_lp_l_3;
out_lp_r_3 = a0_lp*out_lp_r_2+a1_lp*mem_lp_r_31+a2_lp*mem_lp_r_32-b1_lp*mem_lp_r_33-b2_lp*mem_lp_r_34;
mem_lp_r_32 = mem_lp_r_31;
mem_lp_r_31 = out_lp_r_2;
mem_lp_r_34 = mem_lp_r_33;
mem_lp_r_33 = out_lp_r_3;
out_lp_r = out_lp_r_3;
);
n_lp > 3 ? (
out_lp_l_4 = a0_lp*out_lp_l_3+a1_lp*mem_lp_l_41+a2_lp*mem_lp_l_42-b1_lp*mem_lp_l_43-b2_lp*mem_lp_l_44;
mem_lp_l_42 = mem_lp_l_41;
mem_lp_l_41 = out_lp_l_3;
mem_lp_l_44 = mem_lp_l_43;
mem_lp_l_43 = out_lp_l_4;
out_lp_l = out_lp_l_4;
out_lp_r_4 = a0_lp*out_lp_r_3+a1_lp*mem_lp_r_41+a2_lp*mem_lp_r_42-b1_lp*mem_lp_r_43-b2_lp*mem_lp_r_44;
mem_lp_r_42 = mem_lp_r_41;
mem_lp_r_41 = out_lp_r_3;
mem_lp_r_44 = mem_lp_r_43;
mem_lp_r_43 = out_lp_r_4;
out_lp_r = out_lp_r_4;
);
n_lp > 4 ? (
out_lp_l_5 = a0_lp*out_lp_l_4+a1_lp*mem_lp_l_51+a2_lp*mem_lp_l_52-b1_lp*mem_lp_l_53-b2_lp*mem_lp_l_54;
mem_lp_l_52 = mem_lp_l_51;
mem_lp_l_51 = out_lp_l_4;
mem_lp_l_54 = mem_lp_l_53;
mem_lp_l_53 = out_lp_l_5;
out_lp_l = out_lp_l_5;
out_lp_r_5 = a0_lp*out_lp_r_4+a1_lp*mem_lp_r_51+a2_lp*mem_lp_r_52-b1_lp*mem_lp_r_53-b2_lp*mem_lp_r_54;
mem_lp_r_52 = mem_lp_r_51;
mem_lp_r_51 = out_lp_r_4;
mem_lp_r_54 = mem_lp_r_53;
mem_lp_r_53 = out_lp_r_5;
out_lp_r = out_lp_r_5;
);
n_lp > 5 ? (
out_lp_l_6 = a0_lp*out_lp_l_5+a1_lp*mem_lp_l_61+a2_lp*mem_lp_l_62-b1_lp*mem_lp_l_63-b2_lp*mem_lp_l_64;
mem_lp_l_62 = mem_lp_l_61;
mem_lp_l_61 = out_lp_l_5;
mem_lp_l_64 = mem_lp_l_63;
mem_lp_l_63 = out_lp_l_6;
out_lp_l = out_lp_l_6;
out_lp_r_6 = a0_lp*out_lp_r_5+a1_lp*mem_lp_r_61+a2_lp*mem_lp_r_62-b1_lp*mem_lp_r_63-b2_lp*mem_lp_r_64;
mem_lp_r_62 = mem_lp_r_61;
mem_lp_r_61 = out_lp_r_5;
mem_lp_r_64 = mem_lp_r_63;
mem_lp_r_63 = out_lp_r_6;
out_lp_r = out_lp_r_6;
);
);




////////////////
// COMPRESSOR //
////////////////

sidechain == 1 ? (
  cospl0 = max(abs(spl2),abs(spl3));
  cospl1 = max(abs(spl2),abs(spl3));
  
  
  ) : (
//  lowpass == 1 ? (
//  cospl0 = spl0+xl11;
//  cospl1 = spl1+xr11;
//    cospl0 = xl11-xl13-yl13;
//    cospl1 = xr11-xr13-yr13;
    cospl0 = out_lp_l;
    cospl1 = out_lp_r;
//    ) : (
//    cospl0 = spl0-lpspl0-hpspl0;
//    cospl1 = spl1;
  );
//);

  aspl0 = abs(cospl0);
  aspl1 = abs(cospl1);
  maxspl = max(aspl0, aspl1);
  maxdb = 20* log10(maxspl);
  maxspl = maxspl * maxspl;
  runave = maxspl + rmscoef * (runave - maxspl);
  det = sqrt(max(0,runave));

  overdb = 2.08136898 * log(det/cthreshv) * log2db;
//  overdb = /*2.08136898 * */ log(det/cthreshv) * log2db;
//  overdb = max(aspl0,aspl1) * log2db - thresh ;

// Actual overdb would be (= rundb?)
//overdb = max ( log(inv) * log2db /* / 1.15 */ - (thresh+0.25) , 0);
//indb = log(inv) * log2db ;


  overdb = max(0,overdb);

  overdb - rundb > 5 ? (averatio = 4;);

  overdb > rundb ? (
    rundb = overdb + atcoef * (rundb - overdb);
    runratio = averatio + ratatcoef * (runratio - averatio);
  ) : (
    rundb = overdb + relcoef * (rundb - overdb);
    runratio = averatio + ratrelcoef * (runratio - averatio);
  );

  overdb = rundb;

//  overdb =  max(0, maxdb-thresh) ;// tmp

/*
  rate = 0.1;
  overdb > overdbold ? (
    over += rate;
    ):(
//    over -= 6/(reltime*srate);
    over -= rate;
    );
  over < 0 ? over = 0;
  overdbold = overdb;
*/


  averatio = runratio;

  allin ? (
    cratio = 12 + averatio;
  ) : (
    cratio = ratio;
  );


grmode = 2;
grmode == 1 ? (
//  gr = -overdb * (cratio-1)/cratio;
  gr = -overdb * ratpercent * 0.55;
  );

/*
  (overdb < 0.5) ? (over = (overdb)^2);
  (overdb > 0.5) ? (over = overdb - 0.25);
*/

grmode == 2 ? (
  overdb > over ? (
//   over += ( ((overdb+1)/(over+1)-1)^2 *0.1);
   over += ( ((overdb/6)-(over/6))^2 *0.1);

    ):(
    over -= ( ((over/4)-(overdb/4)) *0.2);
    );
  over < 0 ? over = 0;



  gr = -over * ratpercent * 0.57;
//  gr = -over * ratpercent;
  );  
  
  grv = exp(gr * db2log);

    //tmp

  runmax = maxover + relcoef * (runmax - maxover);  // highest peak for setting att/rel decays in reltime
  maxover = runmax;



  gr_meter_decay = 1.0003;

//  (grv < gr_meter) ? (gr_meter = grv) : ( (gr_meter < 1) ? (gr_meter *= gr_meter_decay) );

  gr_meter = min(grv , gr_meter);

/*
  (grv < gr_meter) ? (
    gr_meter = min(grv , gr_meter);
    ) : (
    (gr_meter < 1) ? (gr_meter *= gr_meter_decay);
    );
*/


//gr_hold = gr_meter = 1;
// GR Meter hold
//gr_meter = grv;

// GR Meter hold (wait for 20Hz)
//gr_fps = min(gr_fps , grv);

/*
gr_fps < gr_meter ? (
  gr_meter = gr_fps;
  grcnt = 0;
  ):(
  grcnt += 1;
  grcnt > (srate / 40) ? gr_meter *= (( (grv)/(gr_meter)/2-0.5)^2 * 0.1 +1);
  );
*/



metergfx == 0 ? (
  
  (gr_meter < gr_meterold) ? (gr_meterdir = 1) : (gr_meterdir = -1);
  (gr_meterdirold != gr_meterdir) && (gr_meterdir == -1) ? (gr_turned = 1) : (gr_turned = 0);
  gr_turned == 1 ? grvgrv += 1; // tmp
  //(grv_turned == 1) ? (grv_turned = 0); // tmp
  
  
  //gr_hold1a = 0;
  (gr_turned == 1) ? (
    gr_hold1go == 0 ? (
      gr_hold1 = gr_meter;
      gr_hold1a = gr_holda;
      gr_hold1go = 1;
      ):(
      gr_hold2go == 0 ? (
        gr_hold2 = gr_meter;
        gr_hold2a = gr_holda;
        gr_hold2go = 1;
        ):(
        gr_hold3go == 0 ? (
          gr_hold3 = gr_meter;
          gr_hold3a = gr_holda;
          gr_hold3go = 1;
          );
        );
      );
    gr_turned = 0;
    );
  gr_meterold = gr_meter;
  gr_meterdirold = gr_meterdir;
  );

/*
(grv <= grv_old) ? (grv_dir = 1) : (grv_dir = -1);
(grv_dirold != grv_dir) ? (grv_turned = 1);
grv_turned == 1 ? grvgrv += 1; // tmp
(grv_turned == 1) ? (grv_turned = 0); // tmp

grv_old = grv;
grv_dirold = grv_dir;

gr_meter = grv;
//gr_hold1a = 0;
(grv_turned == 1) ? (
  gr_hold1go == 0 ? (
    gr_hold1 = gr_meter;
    gr_hold1a = gr_holda;
    gr_hold1go = 1;
    ):(
    gr_hold2go == 0 ? (
      gr_hold2 = gr_meter;
      gr_hold2a = gr_holda;
      gr_hold2go = 1;
      ):(
      gr_hold3go == 0 ? (
        gr_hold3 = gr_meter;
        gr_hold3a = gr_holda;
        gr_hold3go = 1;
        );
      );
    );
  grv_turned = 0;
  );
*/
/*
gr_hold > (gr_meter) ? (
  gr_holdir = 1;
  gr_hold = gr_meter;
  gr_holdcnt = 0;
  ):(
  gr_holdir = -1;
  gr_holdcnt += 1;
  gr_holdcnt > 300 /1000 * srate ? (
    gr_hold *= 1 + 4/srate;
    );
  );

gr_hold > 1 ? gr_hold = 1;
gr_hold < 0.01 ? gr_hold = 0.01;


(gr_holda < 0.5) && (gr_dir == 1) ? (

  gr_hold2 > (gr_meter) ? (
    gr_hold2dir = 1;
    gr_hold2 = gr_meter;
    gr_hold2cnt = 0;
    ):(
    gr_hold2dir = -1;
    gr_hold2cnt += 1;
    gr_hold2cnt > 300 /1000 * srate ? (
      gr_hold2 *= 1 + 4/srate;
      );
    );
  );

gr_hold2 > 1 ? gr_hold2 = 1;
gr_hold2 < 0.01 ? gr_hold2 = 0.01;

*/

/*
grv < gr_meter ? (
  gr_meter = grv;
  gr_holdrst += 1;
  gr_holdrst > 10 ? gr_hold = 0;
  ):(
  gr_hold += 1;
  gr_hold > 150 /1000 * srate ? (
//  gr_hold > gr_meter_decay ? gr_hold = gr_meter_decay;
    gr_meter *= gr_meter_decay;
    gr_holdrst = 0;
    );
  );

//(gr_meter_old > gr_meter) ? (gr_meter_dir = 1) : (gr_meter_dir = -1);
(grold > gr_meter) ? (
  grdir = 1;
  ) : (
  grdir = -1;
  gr_hold = 10000;
  );
grold = gr_meter;
*/

/*
grv < gr_meter ? (
  gr_meter=grv;
  gr_dir = 1;
  gr_hold = 0;

  ) : (

  gr_dir == -1 ? (
    gr_meter *= gr_meter_decay ;
//      gr_meter = grv; // tmp
    gr_hold = 0;
    ) : (
    gr_hold < srate* 0.1 * hold ? (
      gr_hold += 1 ;
      gr_dir = 0;
      ) : (
      gr_dir = -1 ;
      gr_meter *= gr_meter_decay ;
//        gr_meter = grv; // tmp
      );
    );
  );
*/

gr_meter > 1 ? (
  gr_meter=1;
//  gr_hold=0;
  );



sidechain == 1 ? (
//sc_meter = scv;

// Sidechain meter decay
//  scv > sc_meter ? sc_meter=scv : ( sc_meter/=((gr_meter_decay+2)/3);
//  scv > sc_meter ? sc_meter=scv : ( sc_meter/=sc_decay);

  coospl0 = out_lp_l * grv;
  coospl1 = out_lp_r * grv;

  ) : (

//  inv > sc_meter ? sc_meter=inv : ( sc_meter/=sc_decay);

//sc_meter/=((gr_meter_decay+2)/3);

//  coospl0 *= grv;
  coospl0 = cospl0 * grv;
  coospl1 = cospl1 * grv;
//  coospl1 *= grv * mix;
);

//sc_mem > sc_meter ? ( sc_decay = 1 ) : ( sc_decay = 0 );
//sc_mem = sc_meter;      // Set memory for meter decay



// SC Meter hold
sidechain == 1 ? (
  sc_meterv = scv;
  scv > 0.989 ? ( sc_peak = 1 ) : ( sc_peak = 0);
    ) : (
  sc_meterv = max(cospl0,cospl1);
//  inv*grv;
  inv > 0.989 ? ( sc_peak = 1 ) : ( sc_peak = 0);
);


  sc_meterv > sc_meter ? (

    sc_meter=sc_meterv;
    sc_dir = 1;
    sc_hold = 0;
    sc_metercv = max(coospl0,coospl1);

    ) : (

    sc_dir == -1 ? (
      sc_decay = 1.0002; // tmp
      sc_meter /= sc_decay ;
      sc_hold = 0;
      sc_metercv /= (sc_decay-1) * 0.6 + 1 ;
      sc_metercv > 1 ? (sc_metercv = 1);

      ) : (
      sc_hold < srate* 0.1 * hold ? (
        sc_hold += 1 ;
        sc_dir = 0;
        ) : (
        sc_dir = -1 ;
        );
      );
    );







//sc_meter > 1 ? sc_meter = 1 ;







////////////
// OUTPUT //
////////////

//notch == 1 ? (

//spl0 = out_lp_l * outgain;

monitor == 0 ? (
  spl0 = coospl0*outgain + out_hp_l;
  spl1 = coospl1*outgain + out_hp_r;
//  spl1 = ( out_hp_r + out_lp_r ) * outgain;
  );
monitor == 1 ? (
  spl0 = coospl0 * outgain;
  spl1 = coospl1 * outgain;
//  spl1 = ( out_hp_r + out_lp_r ) * outgain;
  );
monitor == 2 ? (
  spl0 = out_hp_l;
  spl1 = out_hp_r;
//  spl1 = ( out_hp_r + out_lp_r ) * outgain;
  );





// SIDECHAIN meter


@gfx 450*r 100*r // request horizontal/vertical heights (0 means dont care)
/*
gfx_setfont(1,"Skia",12*r, 'b'); // Regular
gfx_setfont(2,"Skia",12*r ); // Thin
gfx_setfont(3,"Verdana",12*r, 'b'); // Large numbers
gfx_setfont(4,"Skia",14*r, 'b');
*/
gfx_setfont(1,"Trebuchet MS",12*r, 'b'); // Regular
gfx_setfont(2,"Trebuchet MS",12*r ); // Thin
gfx_setfont(3,"Verdana",12*r, 'b'); // Large numbers
gfx_setfont(4,"Trebuchet MS",14*r, 'b');

function button (x1b str)(
  x1 = x1b;
  gfx_setfont(1);
  gfx_measurestr(str, wt, ht);
  x2 = x1 + wt + pad*4;
  xt = x1 + pad*2;
  w = x2 - x1;
  y1 = metery2 + pad*3;
  y2 = metery3 - pad*3;
  h = y2 - y1;
  yt = (y1+y2)/2 - ht/2;
  gfx_set(1,0,0,0.25);
  gfx_rect(x1,y1,w,h);
  gfx_set(1,0,0,0.7);
  gfx_rect(x1,y1,w,h , 0,0);
  gfx_set(0.8,1,0.6,0.9);
  xout = x1 +w + pad*1;
  
  gfx_x = xt;
  gfx_y = yt;
  gfx_drawstr(str);
  );
function button2 (x1b str1 par parmax w4 str2)(
  x1 = x1b;
//  w2 = w2b;
  gfx_setfont(1);
  gfx_measurestr(str1, w1, h1);
  (str1 == "") ? (w1 = 0);
  x2 = x1 + w1 + pad;

//  x3 = x2 + w2 + w3 + pad * 2;

  y1 = metery2 + pad*3;
  y2 = metery3 - pad*3;
  h2 = y2 - y1;
  yt = (y1+y2)/2 - h1/2 ;
  gfx_set(0.7,1,0.1,0.7);
  gfx_x = x1;  gfx_y = yt;
  gfx_drawstr(str1);

  gfx_setfont(3);
//  sprintf(par2, "%d", par);
  sprintf(parmax2, "%d", parmax);
//  par2 = par;
//  gfx_measurestr(par2, w2, h2);
  gfx_measurestr(str2, w3b, 0);
  gfx_measurestr(parmax2, w2, 0);
  w3 = w3b + pad;
  x3 = x2+w2+w3+w4+pad*2;
//  h3 = h3b;
  gfx_set(1,0,0,0.25);
//  gfx_rect(x2,y1,x3-x2,h2);
  gfx_rect(x2,y1,x3-x2,h2);
  gfx_set(1,0,0,0.7);
  gfx_rect(x2,y1,x3-x2,h2 , 0,0);
  gfx_set(0.8,1,0.6,0.9);
  xout = x2 +w2 +w3 + pad*4;
  gfx_x = x2 + pad*2;
  gfx_y = y = y1 - gfx_texth * 0.05;
  par < 10 ? gfx_drawstr("  ");
  parmax >= 100 ? (
    par < 100 ? gfx_drawstr("  ");
    parmax >= 1000 ? (
      par < 1000 ? gfx_drawstr("  ");
      );
    );
  gfx_drawnumber(par,0);
  gfx_setfont(2);
  gfx_y = y + gfx_texth * 0.05;
  gfx_set(0.7,1,0.1,0.7);
  gfx_drawstr(" ");
  gfx_drawstr(str2);
  );
function button3 (x1b str par)(
  gfx_setfont(1);
  gfx_measurestr(str, wt, ht);
  x1 = x1b;
  x2 = x1 + wt + pad*4;
  xt = x1 + pad*2;
  w = x2 - x1;
  y1 = metery2 + pad*3;
  y2 = metery3 - pad*3;
  h = y2 - y1;
  yt = (y1+y2)/2 - ht/2;
  par == 0 ? (
    gfx_set(1,0,0,0.25);
    ):(
    gfx_set(1,0,0,0.4);
    );    
  gfx_rect(x1,y1,w,h);
  gfx_set(1,0,0,0.7);
  gfx_rect(x1,y1,w,h , 0,0);
  xout = x1 + w + pad;
  par == 0 ? (
    gfx_set(0.8,1,0.6,0.5);
    ):(
    gfx_set(1,1,0.8,0.9);
    );
  gfx_x = xt;
  gfx_y = yt;
  gfx_drawstr(str);
  );
function button4 (x1b par parmax str1)(
  x1 = x1b;
//  w2 = w2b;
  gfx_setfont(1);
  gfx_measurestr(str1, w1, h1);

//  x3 = x2 + w2 + w3 + pad * 2;

  y1 = metery4 + pad*3;
  h2 = (metery3 - pad*3) - (metery2 + pad*3);
  y2 = y1 + h2;
  yt = (y1+y2)/2 - h1/2 ;
  gfx_set(0.7,1,0.1,0.7);

  gfx_setfont(3);
//  sprintf(par2, "%d", par);
  sprintf(parmax2, "%d.1", parmax);
//  par2 = par;
//  gfx_measurestr(par2, w2, h2);
  gfx_measurestr(parmax2, w2, 0);
  x2 = x1 + w1 + w2 + pad*6;


  gfx_set(1,0,0,0.25);
//  gfx_rect(x2,y1,x3-x2,h2);
  gfx_rect(x1,y1,x2-x1,h2);
  gfx_set(1,0,0,0.7);
  gfx_rect(x1,y1,x2-x1,h2 , 0,0);
  gfx_set(0.8,1,0.6,0.85);
  xout = x1 + w1 + w2 + pad;
  gfx_x = x1 + pad*1;
  gfx_y = y = y1 - gfx_texth * 0.05;
  par > -10 ? (
    par < 10 ? gfx_drawstr("  ");
    par >= 0 ? gfx_drawstr(" ");
    );
  gfx_drawnumber(par,1);
  gfx_y = y + gfx_texth * 0.07;
  gfx_setfont(2);
  gfx_set(0.7,1,0.1,0.7);
  gfx_drawstr(" ");
  gfx_drawstr(str1);
  );




pad = 2*r;
meter_h = 54*r ;
metery = pad;
metery1 = metery + pad;
metery2 = metery + meter_h/3 -pad*2;
metery3 = metery + meter_h/3 *2 +pad*2;
metery4 = metery + meter_h -pad;

gr_texty = metery1 - gfx_texth * 0.05 ;
sc_texty = metery3 - gfx_texth * 0.05 ;

//sc_texth = metery3+0*r;



//  gr_meter *= exp(1/1000);
//  sc_meter *= exp(1/1000);

  gr_meter > 1 ? gr_meter = 1; // decay meter here so if the audio processing stops it doesnt "stick"
//  gfx_r=1; gfx_g=gfx_b=0; gfx_a=0.8;

  meter_bot=30;

// GR meter
//  meter_h=min(gfx_h,16);
  xscale=gfx_w*20/meter_bot;
//  gfx_x=gfx_w + log10(gr_meter)*xscale;
//  gfx_rectto(gfx_w,metery2);

  
// Hold
  gfx_set(0.7,0.5,0.1,0.6);
  gr_holda = gfx_a;



metergfx = 1;

metergfx == 1 ? (

  (gr_meter < gr_meterold) ? (gr_meterdir = 1) : (gr_meterdir = -1);
  (gr_meterdirold == 1) && (gr_meterdir == -1) ? (gr_turned = 1) : (gr_turned = 0);
  //gr_turned == 1 ? grvgrv += 1; // tmp
  //(grv_turned == 1) ? (grv_turned = 0); // tmp
  
  
  //gr_hold1a = 0;
  (gr_turned == 1) && (gr_meterold < 0.7) ? (
    gr_hold1go == 0 ? (
      gr_hold1 = gr_meterold;
      gr_hold1a = gr_holda;
      gr_hold1go = 1;
      ):(
      gr_hold2go == 0 ? (
        gr_hold2 = gr_meterold;
        gr_hold2a = gr_holda;
        gr_hold2go = 1;
        ):(
        gr_hold3go == 0 ? (
          gr_hold3 = gr_meterold;
          gr_hold3a = gr_holda;
          gr_hold3go = 1;
          );
        );
      );
    grv_turned = 0;
    );
  gr_meterold = gr_meter;
  gr_meterdirold = gr_meterdir;
  );



//(gr_hold1a > 0) ? (gr_hold1go = 1) : (gr_hold1go = 0);
gr_hold1a <= 0 ? gr_hold1go = 0;
gr_hold1go == 1 ? (
  gfx_a = gr_hold1a;
  hold1_x = gfx_w + log10(gr_hold1)*xscale;
  hold1_w = gfx_w - hold1_x;
//  gfx_rect(hold_x,gr_y , gfx_w-hold_x,metery2-gr_y);
  gfx_gradrect(hold1_x,gr_y , hold1_w,metery2-gr_y  ,  0.8,0.5,0.1,gr_hold1a  ,  0,0,0,-0.8/hold1_w/2);
  gr_hold1a -= 0.1;
  );

gr_hold2a <= 0 ? gr_hold2go = 0;
gr_hold2go == 1 ? (
  gfx_a = gr_hold2a;
  hold2_x = gfx_w + log10(gr_hold2)*xscale;
  hold2_w = gfx_w - hold2_x;
//  gfx_rect(hold_x,gr_y , gfx_w-hold_x,metery2-gr_y);
  gfx_gradrect(hold2_x,gr_y , hold2_w,metery2-gr_y  ,  0.8,0.5,0.1,gr_hold2a  ,  0,0,0,-0.8/hold2_w/2);
  gr_hold2a -= 0.1;
  );

gr_hold3a <= 0 ? gr_hold3go = 0;
gr_hold3go == 1 ? (
  gfx_a = gr_hold3a;
  hold3_x = gfx_w + log10(gr_hold3)*xscale;
  hold3_w = gfx_w - hold3_x;
//  gfx_rect(hold_x,gr_y , gfx_w-hold_x,metery2-gr_y);
  gfx_gradrect(hold3_x,gr_y , hold3_w,metery2-gr_y  ,  0.8,0.5,0.1,gr_hold3a  ,  0,0,0,-0.8/hold3_w/2);
  gr_hold3a -= 0.1;
  );


/*
  gr_holdir == 1 ? (
    gr_holda = gfx_a;
    ):(
    gr_holda -= 0.05;
    );
  gr_holda <= 0.1 ? (
    gr_hold = 1;
    );
*/
/*  (gr_holda < 0.5) && (gr_meter < (gr_hold +0.5 ) /1.5) ? (
    gr_hold = 1;
    );
*/
/*
  gfx_a = gr_holda;
  hold_x = gfx_w + log10(gr_hold)*xscale;
  hold_w = gfx_w - hold_x;
//  gfx_rect(hold_x,gr_y , gfx_w-hold_x,metery2-gr_y);
  gfx_gradrect(hold_x,gr_y , hold_w,metery2-gr_y  ,  0.8,0.5,0.1,gr_holda  ,  0,0,0,-0.8/hold_w/2);

//  (gfx_a < 0.5) && (gr_dir == 1) ? (
  
  gr_hold2 < 1 ? (
    gr_holdir == 1 ? (
      gr_hold2a = 0.6;
      ):(
      gr_hold2a -= 0.05;
      );
    gr_hold2a <= 0.1 ? (
      gr_hold2 = 1;
      );
    
    gfx_a = gr_hold2a;
    hold2_x = gfx_w + log10(gr_hold2)*xscale;
    hold2_w = gfx_w - hold2_x;
  //  gfx_rect(hold_x,gr_y , gfx_w-hold_x,metery2-gr_y);
    gfx_gradrect(hold2_x,gr_y , hold2_w,metery2-gr_y  ,  0.8,0.5,0.1,gr_hold2a  ,  0,0,0,-0.8/hold_w/2);
  
    );

*/




// GR Meter
  gr_x=gfx_w + log10(gr_meter)*xscale;
  gr_y = metery1;
  gfx_r=0.5; gfx_g=0.7; gfx_b=0.3; gfx_a=0.9;
  gfx_rect(gr_x,gr_y , gfx_w-gr_x,metery2-gr_y);


gr_meter = 1;



// sc meter colors

//  sc_meter /= exp(1/30);
    sidechain == 1 ? (
      gfx_r=0.2; gfx_g=0.4; gfx_b=0.8; gfx_a=0.5;       // Sidechain input meter color
      ) : (
      gfx_r=0.4; gfx_g=0.4; gfx_b=0.8; gfx_a=0.4;       // Main input meter color

    );


  xscale=gfx_w*20/meter_bot;



// Draw SC meter action

gfx_xg = gfx_w + (log10(sc_meter*outgain)*xscale) / 2 ;
gfx_xc = gfx_w + (log10(sc_metercv)*xscale) / 2 ;
gfx_xt = gfx_w + (log10(threshv)*xscale) / 1 ;
gfx_x_ = gfx_w + (log10(sc_meter)*xscale) / 1 ;



  gfx_y=metery4;

  sidechain == 1 ? (
//    gfx_x = gfx_w + (log10(sc_meter)*xscale) / 2 ;
    gfx_x = gfx_x_ ;
    gfx_a -= 0.1;
    gfx_rectto(0,metery3);

    gfx_x_ > gfx_xt ? (
      gfx_a -= 0.1;
      gfx_x = gfx_x_ ;
      gfx_rectto(gfx_xt,metery4);
      );


    ) : (

// Main in meter
//    grv == 1 ? (
//    gfx_a -= 0.2;
    gfx_x = gfx_x_ ;
    gfx_rectto(0,metery3);
    gfx_y=metery4;

//    grv < 1 ? (                               // Meter above threshold
    gfx_x_ > gfx_xt ? (
      gfx_a -= 0.1;
      gfx_x = gfx_x_ ;
      gfx_rectto(gfx_xt,metery3);
//      gfx_y=meter_h-3;
    );

/*
      outgain != 1 ? (
        gfx_x = gfx_xg ;
        gfx_a -= 0.1;
        gfx_rectto(0,meter_h/3*2);
        gfx_a += 0.1;


/*
    grv < 1 ? (                               // Meter above threshold
      gfx_x = gfx_xc ;
      gfx_y=meter_h-3;
      gfx_rectto(gfx_xt,meter_h/3*2);
*/
/*
      gfx_x = gfx_w + (log10(sc_meter)*xscale) / 2 ;
      gfx_y=meter_h-3;
      gfx_rectto(0,meter_h/3*2);
*/
//      ) : (





/*
      gfx_at = gfx_a;
      gfx_a=0.7;
      gfx_rectto(thr_line+1,meter_h/3*2);
      gfx_x = thr_line -1 ;
      gfx_y=meter_h-3;
      gfx_a=gfx_at;
      gfx_rectto(0,meter_h/3*2);
*/

  );




//




  gfx_r=gfx_g=gfx_b=1.0; gfx_a=0.7;

  s2=sqrt(2)/2;
  g = s2;
  number = 1;
  while(
    number == 0 ? number = 1 : number = 0;
    gfx_x=gfx_w + log10(g)*xscale;
    gfx_y=metery1-pad;                           // Top height of dB meter lines
//    gfx_a=0.8;
    number == 0 ? (gfx_a=0.3) : (gfx_a = 0.8);

//    gfx_x < 100 ? ( gfx_a = 0.5 );
    gfx_x < (gr_textx2 + pad) ? ( gfx_a = 0 );


//    gfx_lineto(gfx_x,meter_h-2,0);
    gfx_lineto(gfx_x,metery2+pad,0);
    gfx_y=metery3-pad;

/*
    gfx_x < 100 ? (
      gfx_y > meter_h/2 ? ( gfx_a = 0.3 );
      );
*/
    number == 0 ? (gfx_a=0.3) : (gfx_a = 0.8);
    gfx_x < (sc_textx2 + pad) ? ( gfx_a = 0 );
    gfx_lineto(gfx_x,metery4+pad,0);

    
    gfx_setfont(2);
//    gfx_x >= 100 ? (
    gfx_a=0.4;
    gfx_y = gr_texty -r;             //GR dB scale
    gfx_x += pad;
    xtmp = gfx_x;
    gfx_x > (gr_textx2 + pad) ?     gfx_a=0.4 : gfx_a = 0;
    number == 1 ? gfx_drawnumber(log10(g)*20,0);

    gfx_y=sc_texty -r;             //SC dB scale
//      gfx_x-=gfx_w/12 - 21 ;                 //SC dB scale -3 x-location
    gfx_x = xtmp;
//    gfx_x -= 16*r ;                 //SC dB scale -6 x-location
//      gfx_x < gfx_w*0.45 ? ( gfx_x-=gfx_w/55 ); //SC dB scale X when below 0.6 width
    gfx_x > (sc_textx2 + pad) ?     gfx_a=0.4 : gfx_a = 0;
//    (log10(g)*20) < -10*r ? ( gfx_x-=8*r ); //SC dB X when GR below -10
    number == 1 ? gfx_drawnumber(log10(g)*20,0);
//      gfx_y=16-gfx_texth-3;             //
/*      gfx_x < 50 ? (
      gfx_drawchar($' ');
      gfx_drawchar($'d');
      gfx_drawchar($'B');
      );
*/
//      );


    g*=s2;
    gfx_x >=0;
    );








gfx_x = 8;
gfx_y = gr_texty;

gfx_set(0.7,1,0.1,0.72);
gfx_printf("Gain Reduction:");
gr_textx2 = gfx_x  ;

gfx_r=0.7; gfx_g=1; gfx_b=0.1; gfx_a=0.5;
//gfx_rect(4,gr_texty -4 , gr_textx2 ,gfx_texth +8, 0,0);
gfx_rect(pad,metery1-pad , gr_textx2,(metery2-metery1+pad*2), 0,0);



gfx_x = 8;

gfx_y = sc_texty;// = sc_texth;



sidechain == 1 ? (
  gfx_set(0.7,1,1,0.4);
//  gfx_rect(pad,sc_texty -4 , sc_textx2 ,gfx_texth +8, 0,0);
  gfx_rect(pad,metery3-pad , sc_textx2 ,metery4-metery3+pad*2, 0,0);
//  gfx_r=1; gfx_g=1; gfx_b=1;
  gfx_a=0.65;

  gfx_printf("Sidechain:");
  sc_textx2 = gfx_x  ;
  
  ) : (
  gfx_set(1,0.95,0.7,0.4);
  gfx_rect(pad,metery3-pad , sc_textx2 ,metery4-metery3+pad*2, 0,0);


//  gfx_r=1; gfx_g=0.9; gfx_b=1;
  gfx_a=0.8;
  gfx_printf("Main Input:");
  sc_textx2 = gfx_x  ;

  );


// Makeup

makey1 = metery4 + pad*2.5;
makeyh = (metery2-metery1+pad*2);
makey2 = makey1 + makeyh;
makex2 = gfx_w - spad*2;
gfx_setfont(2);
gfx_set(0.7,1,0.1,0.5);
gfx_measurestr("= Makeup (LP) ", makewt, 0);
gfx_measurestr("=", equalw, 0);
makex1 = makex2 - makewt - pad*2;

gfx_y = makey1 + pad;
gfx_x = makex1 + pad;
//gfx_r=0.7; gfx_g=1; gfx_b=0.1; gfx_a = 0.8;
gfx_printf("= Makeup (LP)");
//gr_textx2 = gfx_x  ;



gfx_x = makex1 + pad + equalw ;

while(gfx_a > 0)(
  gfx_a -= 0.05;
  gfx_x -= equalw*1.7;
  gfx_printf("=");
  );  


//gfx_r=0.7; gfx_g=1; gfx_b=0.1; gfx_a=0.5;
//gfx_rect(4,gr_texty -4 , gr_textx2 ,gfx_texth +8, 0,0);
//gfx_rect(makex1,makey1 , makewt,(makeyh), 0,0);

// Makeup slider
gfx_set(1,1,1,0.1,1);
trackx1 = gfx_w*0.1;
trackw = gfx_w * 0.6;
tracky1 = makmy1+gfx_texth/2;
trackh = gfx_texth * 0.3;
gfx_rect(trackx1,tracky1 , trackw,trackh);

makescale = (gfx_w * 0.6) /24;
makeupx = gfx_w * 0.33 + slider8 * makescale ;

button4( makeupx , slider8, 12, " dB" );
makmx1 = x1;
makmx2 = x2;
makmy1 = y1;
makmy2 = y2;
makw = makmx2-makmx1;


// Title
gfx_set(0.8,1,0.6,0.4,1);
gfx_setfont(4);
gfx_measurestr("KickbAss     ", titw1, 0);
gfx_measurestr(ver, verw, 0);

gfx_setfont(1);
gfx_measurestr("[mrelwood]", titw2, 0);

//gfx_x = gfx_w * 0.07;
gfx_setfont(1);
gfx_x = titx2 = gfx_w * 0.33 - pad*2;
gfx_y = (metery4 * 1.5) + gfx_texth * 0.1;
gfx_printf("[mrelwood]");
gfx_setfont(4);
//gfx_x = max( pad*2 , makmx2 - titw1 - titw2 + pad*2);
gfx_x = max( pad*2 , titx2 - titw1 - verw - pad);
gfx_y = (metery4 * 1.5);
gfx_printf("KickbAss  ");
gfx_printf(ver);
//gfx_drawstr(ver);
gfx_printf("   ");








// Threshold box & line

gfx_x = max(1, gfx_w - ( gfx_w / meter_bot  * abs(slider12) )*1.004 );
//gfx_x = gfx_w + (log10(threshv)*xscale * 1.004);
thr_line = gfx_x;
thresh > -0.35 ? ( gfx_x = gfx_x - 1 );
thresh == -(meter_bot*2)-0.25 ? ( gfx_x = 1 );
//thresh == -24.25 ? ( gfx_x = gfx_x - 1 );

sc_line = gfx_y = metery3 ;

gfx_set(1,0,0,0.3,0);
thrboxw = 12*r;
thrboxx = gfx_x-thrboxw/2;
//thrboxy = gfx_y-pad;
thrboxy = metery3-pad*2;
thrboxh = metery4+pad*2 - thrboxy+1;

gfx_rect(thrboxx , thrboxy , thrboxw+1 , thrboxh);//-gfx_y -1);
gfx_a=0.7;
gfx_rect(gfx_x-r,metery3-pad , 3*r,metery4-metery3 +pad*2+1);


sc_peak == 0 ? (
  sc_peakcnt += 1;
  sc_peakcnt > 10 ? (
    sc_peak2 = 0;
    );
  ):(
  sc_peak2 = 1;
  sc_peakcnt = 0;
  );
sc_peakold = sc_peak;

sc_peak2 == 1 ? (
  gfx_measurestr("PEAK", peakw, 0);
  gfx_x=gfx_w-peakw-pad*2;
  gfx_y=sc_texth;
  gfx_r=1; gfx_g=0; gfx_b=0; gfx_a=1;
  pkflcnt += 1;
  pkflcnt > 5 ? (
    gfx_r = 0.8;
    pkflcnt > 8 ? pkflcnt = 0;
    );
  gfx_printf("PEAK");
  ):(
  pkflcnt = 0;
  );




// Buttons
wtotal = gfx_w;
button (betw/2 , "Detect");
betbet = xout;
detmx1 = x1;
detmx2 = x2;
detmy1 = y1;
detmy2 = y2;
wtotal -= xout-x1;
button2(xout+betw, "X-Over", freq + 0.1, 4000, 2*r, "Hz");
fmx1 = x2;
fmx2 = x3;
fmy1 = y1;
fmy2 = y2;
wtotal -= xout-x1;
button2(xout+betw, "Att", attack, 50, 0, "ms");
atmx1 = x2;
atmx2 = x3;
atmy1 = y1;
atmy2 = y2;
wtotal -= xout-x1;
button2(xout+betw, "Rel", release, 200, 0, "ms");
relmx1 = x2;
relmx2 = x3;
relmy1 = y1;
relmy2 = y2;
wtotal -= xout-x1;
button2(xout+betw -pad*2, "", slider5, 300, 0, "%");
permx1 = x2;
permx2 = x3;
permy1 = y1;
permy2 = y2;
wtotal -= xout-x1;

gfx_setfont(1);
gfx_measurestr(" HP Monitor ", monw, 0);
monxmin = xout ;

monitor == 0 ? button3(max(monxmin, min(650*r , gfx_w - monw - betw/2)) , "  Monitor  ", monitor);
monitor == 1 ? button3(max(monxmin, min(650*r , gfx_w - monw - betw/2)) , "LP Monitor", monitor);
monitor == 2 ? button3(max(monxmin, min(650*r , gfx_w - monw - betw/2)) , "HP Monitor", monitor);
monmx1 = x1;
monmx2 = x2;
//monmx2 = gfx_w-2*pad;
monmy1 = y1;
monmy2 = y2;
wtotal -= monw;
//wtotal -= gfx_w - monmx1;

betw = min(40*r, max(3*r, wtotal/6) );


// Mouse drags

/*
precisego > 0 ? (
  mouse_cap = precisego;
  precisego = 0;
  );
*/

mouse_cap > 1 ? precise = 3 : precise = 1;
preciseold != precise ? (
  mouseystart = mouse_y;
  mousexstart = mouse_x;
  start4 = slider4;
  start5 = slider5;
  start6 = slider6;
  start7 = slider7;
  start8 = slider8;
  start12 = slider12;
//  precisego = mouse_cap;
//  mouse_cap = 0;
  );
preciseold = precise;

mouse_cap > 0 ? (


  (mouse_x > detmx1) && (mouse_x < detmx2) && (mouse_y > detmy1) && (mouse_y < detmy2) && (drag == 0 || drag == 1 )  ? (
    lastcap = 1;
    click == 0 ? (
      click = 1;
      );
    );

  (mouse_x > fmx1) && (mouse_x < fmx2) && (mouse_y > fmy1) && (mouse_y < fmy2) && (drag == 0 || drag == 4 )  ? (
    drag = lastcap = 4;
    click == 0 ? (
      start4 = slider4;
      mouseystart = mouse_y;
      mousexstart = mouse_x;
      click = 4;
      );
    );
  (mouse_x > permx1) && (mouse_x < permx2) && (mouse_y > permy1) && (mouse_y < permy2) && (drag == 0 || drag == 5 )  ? (
    drag = lastcap = 5;
    click == 0 ? (
      start5 = slider5;
      mouseystart = mouse_y;
      mousexstart = mouse_x;
      click = 5;
      );
    );
  (mouse_x > atmx1) && (mouse_x < atmx2) && (mouse_y > atmy1) && (mouse_y < atmy2) && (drag == 0 || drag == 6 )  ? (
    drag = lastcap = 6;
    click == 0 ? (
      start6 = slider6;
      mouseystart = mouse_y;
      mousexstart = mouse_x;
      click = 6;
      );
    );
  (mouse_x > relmx1) && (mouse_x < relmx2) && (mouse_y > relmy1) && (mouse_y < relmy2) && (drag == 0 || drag == 7 )  ? (
    drag = lastcap = 7;
    click == 0 ? (
      start7 = slider7;
      mouseystart = mouse_y;
      mousexstart = mouse_x;
      click = 7;
      );
    );
  (mouse_x > makmx1) && (mouse_x < makmx2) && (mouse_y > makmy1) && (mouse_y < makmy2) && (drag == 0 || drag == 8 )  ? (
    drag = lastcap = 8;
    click == 0 ? (
      start8 = slider8;
      mouseystart = mouse_y;
      mousexstart = mouse_x;
      click = 8;
      );
    );


  (mouse_x > monmx1) && (mouse_x < monmx2) && (mouse_y > monmy1) && (mouse_y < monmy2) && (drag == 0 || drag == 10 )  ? (
    lastcap = 10;
/*    drag == 0 ? (
      drag = 10;
      );
*/
    );

  (mouse_x > thrboxx) && (mouse_x < thrboxx + thrboxw) && (mouse_y > thrboxy) && (mouse_y < thrboxy + thrboxh) && (drag == 0 || drag == 12 ) ? (
    drag = lastcap = 12;
    click == 0 ? (
      start12 = slider12;
      mousexstart = mouse_x;
      mouseystart = mouse_y;
      click = 12;
      );
    );


  ):(
  click = 0;
  );

// Double-click
lastcap > 0 ? (
  mouse_cap != cap_old ? cap_cnt += 1;
  (dc_cnt > 3) && (cap_cnt == 2) ? (
    sclk >= 0 ? sclk = lastcap;
//    lastcap = dc_cnt = cap_cnt = dblclk = 0;
    );    
  cap_cnt >= 4 ? (
    dblclk = lastcap;
    lastcap = dc_cnt = cap_cnt = 0;
    );
  dc_cnt += 1;
  dc_cnt > 15 ? (
    mouse_cap == 0 ? drag = 0;
    lastcap = dc_cnt = cap_cnt = sclk = 0;
    );
  );

cap_old = mouse_cap;

// Click buttons


drag == 1 ? (
  slider1 == 0 ? slider1 = 1 : slider1 = 0;
  drag = -1;
  );
slider1 != detector ? (
  detector = slider1;
  slider_automate(slider1);
  );

sclk == 4 ? (
  mouse_cap == 0 ? (
    slider4 == 24 ? (
      slider4 = 27;
      ):(
      slider4 = 24;
      );
    sclk = -1;
    up4 = 1;
    );
  );

sclk == 5 ? (
  mouse_cap == 0 ? (
    slider5 == 200 ? (
      slider5 = 50;
      ):(
      slider5 = 200;
      );
    sclk = -1;
    );
  );

sclk == 6 ? (
  mouse_cap == 0 ? (
    slider6 == 19.6 ? (
      slider6 = 12;
      ):(
      slider6 = 19.6;
      );
    sclk = -1;
    );
  );

sclk == 7 ? (
  mouse_cap == 0 ? (
    slider7 == 40 ? (
      slider7 = 20;
      ):(
      slider7 = 40;
      );
    sclk = -1;
    );
  );

/*
sclk == 10 ? (
//  slider10 == 2 ? slider10 = 0 : slider10 += 1;
  slider10 = 0;
  sclk = -1;
  );
*/


slider10 != monitor ? (
  monitor = slider10;
  slider_automate(slider10);
  );


mouse_cap == 0 && drag == -1 ? drag = 0;

moutravel = (mouseystart - mouse_y) + (mouse_x - mousexstart);
mouxtravel = (mouse_x - mousexstart);


//yscale = log(slider4) * 2 -7;
(drag == 4) ? ( // && (dblclk == 0) ? (
  slider4 = start4 + (moutravel) / (3 *r *precise);
  slider4 = floor(slider4+0.5);
  
//(drag == 4) || (up4 == 1) ? (
  
/*
  = (start4 + floor(mouse4+0.5) * 5);
    ):(
    slider4 > 1000 ? (
      start4 < 1000 ? start4 = 1000;
      slider4 = (start4 + floor(mouse4+0.5) * 100);
      ):(
      slider4 > 500 ? (
        start4 < 500 ? start4 = 500;  start4 > 1000 ? start4 = 1000;
        slider4 = (start4 + floor(mouse4+0.5) * 50);
        ):(
        start4 < 100 ? start4 = 100;  start4 > 500 ? start4 = 500;
        slider4 = (start4 + floor(mouse4+0.5) * 10);
        );
      );
    );
*/

/*
  slider4 = start4 * ( max(1, (mouseystart - mouse_y + (mouse_x-mousexstart)) / 60 +1)
   /  max(1, -(mouseystart - mouse_y + (mouse_x-mousexstart))/60 +1) );
*/
//  slider4 > 4000 ? slider4 = 4000;
//  slider4 < 50 ? slider4 = 50;
  slider4 < 10 ? slider4 = 10;
  slider4 > 103 ? slider4 = 103;
  slider_automate(slider4);
  mouse_cap == 0 ? (
//    slider4 = floor(slider4+0.5);
    drag = 0;
    );
//  up4 = 0;
  );
//slider4 = 100;

(drag == 5) ? (
  slider5 = start5 + (moutravel) *1.5 / (r * precise);
//  slider5 = start5 * ( (mouseystart - mouse_y + (mouse_x-mousexstart)) / 30 +1);
//   /  max(1, -(mouseystart - mouse_y + (mouse_x-mousexstart))/30 +1) );
  slider5 > 300 ? slider5 = 300;
  slider5 < 0 ? slider5 = 0;
  slider_automate(slider5);
  (mouse_cap == 0) ? (
//    slider5 = floor(slider5/5+0.5)*5;
    drag = 0;
    );
  );


// 1-10  10-30


(drag == 6) ? (
/*  slider6 = start6 * ( max(1, moutravel / 15 /r +1)
   /  max(1, -(moutravel)/30 +1) );
*/
//  slider6 = start6 + ( (moutravel * (1+ slider6/20) ) / 15 /r)  ;
//  slider6multi = ( (moutravel * log(abs(moutravel+0.0001)) ) / 20 /r);
//  slider6multi = ( (moutravel ) / 5 /r) * log(max(1,slider6+1));
//  slider6multi = ( (moutravel * slider6) / 10000 /r);
  slider6 = start6 + moutravel/ (5 *r *precise) ;


  slider6 > 50 ? slider6 = 50;
  slider6 < 1 ? slider6 = 1;
  slider_automate(slider6);
  mouse_cap == 0 ? (
    slider6 = floor(slider6*10+0.5)/10;
    drag = 0;
    );
  );

(drag == 7) ? (
//  slider7 = start7 * ( max(1, (mouseystart - mouse_y + (mouse_x-mousexstart)) / 30 +1)
//   /  max(1, -(mouseystart - mouse_y + (mouse_x-mousexstart))/30 +1) );

//  slider7 = start7 + ( (moutravel * (1+ slider7/50) ) / 10 /r)  ;
  slider7 = start7 + ( moutravel ) / (4 *r *precise)  ;
  
  

  slider7 > 54 ? slider7 = 54;
  slider7 < 5 ? slider7 = 5;
  slider_automate(slider7);
  mouse_cap == 0 ? (
    slider7 = floor(slider7*10+0.5)/10;
    drag = 0;
    );
  );

// Drag Makeup Gain
(drag == 8) ? (
//  slider8 = start8 * ( max(1, (mouseystart - mouse_y + (mouse_x-mousexstart)) / 30 +1)
//   /  max(1, -(mouseystart - mouse_y + (mouse_x-mousexstart))/30 +1) );
  slider8 = start8 +  ((mouxtravel)/(gfx_w *0.6) * 24) / precise;
  slider8 > 12 ? slider8 = 12;
  slider8 < -12 ? slider8 = -12;
  slider_automate(slider8);
  mouse_cap == 0 ? (
    slider8 = floor(slider8*10+0.5)/10;
    drag = 0;
    );
  );



(drag == 12) ? (
  slider12 = start12 + (mouxtravel) / xscale * meter_bot / 1.5 /precise;
  slider12 > 0 ? slider12 = 0;
  slider12 < -meter_bot ? slider12 = -meter_bot;
  slider_automate(slider12);
  mouse_cap == 0 ? (
    slider12 = floor(slider12*10+0.5)/10;
    drag = 0;
    );
  );




dblclk == 1 ? (
  slider1 == 0 ? slider1 = 1 : slider1 = 0;
  slider_automate(slider1);
  dblclk = 0;

  );
dblclk == 4 ? (
  slider4 = 31;
  slider_automate(slider4);
  up4 = 1;
  dblclk = 0;
  );
dblclk == 5 ? (
  slider5 = 100;
  slider_automate(slider5);
  dblclk = 0;
  );
dblclk == 6 ? (
  slider6 = 1;
  slider_automate(slider6);
  dblclk = 0;
  );
dblclk == 7 ? (
  slider7 = 10;
  slider_automate(slider7);
  dblclk = 0;
  );
dblclk == 8 ? (
  slider8 = 0;
  slider_automate(slider8);
  dblclk = 0;
  );
dblclk == 10 ? (
  slider10 == 2 ? slider10 = 0 : slider10 += 1;
  slider_automate(slider10);
  dblclk = 0;
  );


dblclk == 12 ? (
  slider12 = -24;
  dblclk = 0;
  );




slider4 != sl4 || noob > 0 ? (
//  sl4 *= max(0.9, min(1.1, (slider4/sl4)));
/*
  slider4 < 200 ? (
    sl4 = floor(slider4/5 +0.5)*5;
    ):(
    slider4 < 500 ? (
      sl4 = floor(slider4/10 +0.5)*10;
      ):(
      slider4 < 1000 ? (
        sl4 = floor(slider4/50 +0.5)*50;
        ):(
        sl4 = floor(slider4/100 +0.5)*100;
        );
      );
    );
*/
  sl4 = slider4;
  
//  slider4 = sl4;
  slider_automate(slider4);
  (slider4 >= 10) && (slider4 < 21) ? ( freq = slider4*5 );   // f = 50-100
  (slider4 >= 21) && (slider4 < 62) ? (freq = 100 + max(0, slider4-21) * 10 );   // f = 100-500
  (slider4 >= 62) && (slider4 < 73) ? (freq = 500 + max(0, slider4-62) * 50 );   // f = 500-1000
  (slider4 >= 73) && (slider4 < 105) ? (freq = 1000 + max(0, slider4-73) * 100 );  // f = 1000-4000
  cx_lp = freq * 1.2;
  cx_hp = freq * 0.8;
  );


// Ratio percent
slider5 != sl5 ? (
  slider5 = floor(slider5/10+0.5)*10;
  sl5 = slider5;
//  ratio = slider5;
// Ratio % and Attack multiplier:
//  ratpercent = (slider5/100);
//  ratpercent = (slider5/100) + (slider6-1)^1 /100 * 3.36;
//  ratpercent = (slider5/100) + (slider6-1)^0.8 /100 * 7.35;
//  ratpercent = (slider5/100) + (slider6-1)^0.78 /100 * 7.99;
//  ratpercent = (slider5/100) * ( 1 + (slider6-1)^0.79 * 0.077);
//  ratpercent = (slider5/100) * ( 1 + (slider6-1)^1.5 * 0.009 ) / (slider7/200 * 0.1 +1) ;
//  attratio = ( 1 + (slider6-1)^1.5 * 0.009 );
  upratio = 1;
  );

// Attack  
slider6 != sl6 ? (
  sl6 = slider6;
  attack = floor( slider6 * (((slider6+50)/100)^2 ) *0.99 +1);
  attime = attack / 1000;
  atcoef=exp(-1/(attime * srate));
  sl5 -= 1;
  upratio = 1;
  );

// Release  
slider7 != sl7 ? (
  sl7 = slider7;

  slider7 > 44 ? (
    release = 100 + floor(slider7-44 + 0.5) * 10;
    ):(
    slider7 > 30 ? (
      release = 30 + floor(slider7-30 + 0.5) * 5;
      ):(
      release = slider7;
      );
    );
  reltime = release / 1000;
  relcoef=exp(-1/(reltime * srate));
  upratio = 1;
  );

slider8 != sl8 ? (
  sl8 = slider8;
  outgain = 10^(slider8/20);

  );


slider12 != sl12 ? (
  sl12 = slider12;
  thresh = slider12;
  threshv = exp(thresh * db2log);
  cthresh = (softknee ? (thresh -3) : thresh);
  cthreshv = exp(cthresh * db2log);
  );

upratio == 1 ? (
  attratio = ( (slider6/50)^1.6 * 3 ) +1;
  relratio = (slider7/54) * 0.12 +1;
  attrelratiomulti = (((slider7-5)/49)^0.5 + (1- (slider7-5)/49)^0.5 -1) * (attratio-1)/3 +1;
  attrelratio = (attratio-1.0057) * (relratio-1.011) * 5 +1;
//  relratio = 1;
  ratpercent = ((slider5/100) * attratio ) / ((relratio) * (attrelratio ) * attrelratiomulti) ;

  upratio = 0;
  );


(lastcap == 0) && (sclk == -1) ? sclk = 0;

//dblclk = 0;
noob -= 1;
