desc:REA-2A

// version 0.17
// Belov Vladimir
// 24.12.2020

slider1:-10<-100,0,1>Treshold
slider2:0<0,1,1{4,Lim}>Ratio
slider3:13<0.1,100,1>-Attack
slider4:269<1,1000,1>-Release
slider5:0<0,100,1>-Gain
slider6:0<0,100,0>-Knee
slider7:-3<-9,0,1>-Histerezis
slider8:1<0,1,1{Old,New}>-Mode


@init
bpos=0;
a=c=1;
n=3*srate;
gr_meter=1;
in=ind=0.000001;
tau=1000/srate/20;

@slider
tresh=10^(slider1/20);
ratio=4*(1-slider2)+10000*slider2;
att=1000/srate/slider3;
release=1000/srate/slider4;
//GR_Meter=slider7;
H=10^(slider7/20);


@block
blah+=samplesblock;

@sample
in=max(abs(spl0),abs(spl1));//in=in/2;
ind>in? (ind=ind-ind*tau): (ind=in);
// ind>in? (ind=ind * (1-tau)) : ind=in;
/*
ind>in ? (
            d=d+(1-d)*tau;
            ind=ind-ind*d;
         ):
         (
          ind=in
        );  
   */         
//ind=in; 
b=1-1/srate;
q=ind/tresh;
qq=1/q;

//slider8==0 ? (ind>tresh ? (a=a-((a-tresh/ind)*att)):(a=a+(1-a)*release);Mode=0);
/*
ind>tresh ? (a=a-((a-(tresh/ind)^(1-1/ratio))*att)):(a=a+(1-a)*release);
c=min(c,a);

spl0=spl0*a;
spl1=spl1*a;
*/

//gain < max(tresh,ind) ?  gain=gain+(

//rms=sqrt(( rms^2+in^2-rm[0]^2)/n); rm[0]=in; rm+=1; rm>n? (rm=0) ; irms=rms;


T=min((tresh/ind)^(1-1/ratio),1);


slider8==0 ? (
              mode=0; ind>tresh ? (a=a+(T-a)*att) : (a=a+(1-a)*release) 


)
;
slider8==1 ? (mode=1;
               
               
T<a ? (a=a+((T-a)*att);a0=a):
                              (a0>a^(1/H) ? a=a+((T-a)*att/3):(a=a+(1-a)*release));


  );

 
spl0=spl0*a;
spl1=spl1*a;

@gfx 0 32 // request horizontal/vertical heights (0 means dont care)

  gr_meter<a ? gr_meter *= exp(1/120):gr_meter=a; 
  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=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;
  gr = s2;
  while(
    gfx_x=gfx_w + log10(gr)*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(gr)*20,0);
      gfx_drawchar($'d');
      gfx_drawchar($'B');
    );
    gr*=s2;
    gfx_x >=0;
  );
  gfx_a=1;

  gfx_x=0; gfx_y=meter_h/2 - gfx_texth/2;
  gfx_drawchar($'-');
  gfx_drawnumber(abs(log10(gr_meter)*20)   ,1);
  gfx_drawchar($'d');
  gfx_drawchar($'B');
