desc:REA-2A Legacy Beta 0.22

// version 0.21
// Belov Vladimir
// 24.12.2020

slider9:0<-12,12,1>Input Gain
slider1:-10<-40,0,1>Treshold
slider2:0<0,1,1{4,Lim}>Ratio
slider3:14<0.1,100,1>-Attack
slider4:145<1,1000,1>-Release
slider5:0<-12,12,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=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;
H=10^(slider7/20);
g=10^(slider5/20);
ig=10^(slider9/20);

@block
blah+=samplesblock;

@sample
spl0*=ig; spl1*=ig;
in=max(abs(spl0),abs(spl1));
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; 


//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-(a-T)*att) : (a=a+(1-a)*release) 


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


  );


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

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