JSFX Name: RCInflator
Author: RCJacH
Tweaks: Saike
GUI by: Daga

Release Date: Aug 2021
Link: https://github.com/RCJacH/ReaScripts
Version: 21.08.10
Reference: tviler, Sony Oxford

21.08.10 Daga added Clipper button
21.08.10 Saike added clipper and some code tweaks
21.08.09 Daga added GUI in GFX
21.08.08 First release by RCJach

-----------------------------------------------------
About:
JSFX implementation of Sony Oxford Inflator algorithm found on Gearspace.
----------------------------------------------------- 

desc:RCInflator
desc:RCInflator GUI GFX

slider1:0<-60,60,0.1>-Input (dB)
slider2:100<0,100,0.1>-Effect (%)
slider3:curve=0<-50,50,0.0001>-Curve
slider5:0<-60,6,0.1>-Output (dB)
slider6:clip=0<0,1,1{No,Yes}>-Clip

slider11:60 <0,120,0.1   >-Input (dB) Dummy
slider12:100<0,100,0.1   >-Effect (%) Dummy
slider13:50 <0,100,0.0001>-Curve Dummy
slider15:6  <0,66 ,0.1   >-Output (dB) Dummy

@init

function button_rect(x,y,w,h)
(
  mouse_x >= x && mouse_x <= x+w && mouse_y >= y && mouse_y <= y+h ? this.button = 1:this.button = 0;
);

// Select Color Scheme Function
    
    Function color (scheme)(
             scheme == 1 ? (r=r1;g=g1;b=b1;a=a1;);
             scheme == 2 ? (r=r2;g=g2;b=b2;a=a2;);
             scheme == 3 ? (r=r3;g=g3;b=b3;a=a3;);
             scheme == 4 ? (r=r4;g=g4;b=b4;a=a4;);
             scheme == 5 ? (r=r5;g=g5;b=b5;a=a5;);
             scheme == 6 ? (r=r6;g=g6;b=b6;a=a6;);
             scheme == 7 ? (r=r7;g=g7;b=b7;a=a7;);
             scheme == 8 ? (r=r8;g=g8;b=b8;a=a8;);
             scheme == 9 ? (r=r9;g=g9;b=b9;a=a9;);
             scheme == 10? (r=r10;g=g10;b=b10;a=a10;);
             scheme == 11? (r=r11;g=g11;b=b11;a=a11;);
             scheme == 12? (r=r12;g=g12;b=b12;a=a12;);
             gfx_set(r/255,g/255,b/255,a/100);
    );

    
function executeslider()(

in_db = 2 ^ (slider1 / 6);
wet = slider2 * 0.01;
dry = 1 - wet;
out_db = 2 ^ (slider5 / 6);

curvepct = curve * 0.01;
// 1 + (curve + 50) / 100
curveA = 1.5 + curvepct;
// - curve / 50
curveB = -(curvepct + curvepct);
// (curve - 50) / 100
curveC = curvepct - 0.5;
// 1 / 16 - curve / 400 + curve ^ 2 / (4 * 10 ^ 4)
curveD = 0.0625 - curve * 0.0025 + (curve * curve) * 0.000025;

);


@slider

slider1=-1*slider11+60;
slider2=-1*slider12+100;
curve  =-1*slider13+50;
slider5=-1*slider15+6;

executeslider();

@block

slider1=-1*slider11+60;
slider2=-1*slider12+100;
curve  =-1*slider13+50;
slider5=-1*slider15+6;

@sample
s0 = abs(spl0);
s0 *= in_db;
clip ? (
  s0 = s0 > 1 ? 1 : s0;
);
s0_2 = s0 * s0;
s0_3 = s0_2 * s0;
s0 = curveA * s0 + curveB * s0_2 + curveC * s0_3 - curveD * (s0_2 - 2 * s0_3 + s0_2 * s0_2);
s0 *= out_db;
spl0 = sign(spl0) * s0 * wet + spl0 * dry;

s1 = abs(spl1);
s1 *= in_db;
clip ? (
  s1 = s1 > 1 ? 1 : s1;
);
s1_2 = s1 * s1;
s1_3 = s1_2 * s1;
s1 = curveA * s1 + curveB * s1_2 + curveC * s1_3 - curveD * (s1_2 - 2 * s1_3 + s1_2 * s1_2);
s1 *= out_db;
spl1 = sign(spl1) * s1 * wet + spl1 * dry;

@gfx 560 330

// Blue darkest
r1=36; g1=51; b1=70; a1=100;
// Blue medium
r2=84; g2=108; b2=176; a2=100;
// Blue light
r3=103; g3=135; b3=190; a3=100;
// Blue lightest
r4=156; g4=176; b4=215; a4=100;
// Text blocks
r5=41; g5=52; b5=73; a5=100;
r6=41/2; g6=52/2; b6=73/2; a6=100;
//Slider LR
r7=90; g7=121; b7=178; a7=100;
//Slider M
r8=141; g8=161; b8=205; a8=100;
//Inside Slider
r9=79; g9=107; b9=154; a9=100;
// White
r10=243; g10=249; b10=254; a10=100;
// Yellow
r11=255; g11=220; b11=0; a11=100;
// Red
r12=228; g12=39; b12=61; a12=100;

////////////////////////////////////////////////////////////////

Function color_rect (x,y,w,h,fill,color,shade_color,shade,shade_depth)local(color,shade_color)(
// Shade
color(shade_color);
gfx_rect(x*shade,y*shade,w*shade,h*shade);
// Main Shape
shdh=shade_depth;
color(color);
gfx_rect(x+(shade*shdh),y+(shade*shdh),w-(shade*2*shdh),h-(shade*2*shdh));
);

////////////////////////////////////////////////////////////////

//Texts Function //

Function dotext (x,y,fontype,size,string,color)(

fontype == 0 ? gfx_setfont(1,"Roboto Mono Bold",size,1)
             : gfx_setfont(1,"Roboto Mono"     ,size,1);
gfx_x=x; gfx_y=y;
color(color);
gfx_drawstr(string);
);

function doCenterText(ctrX, ctrY, val)(
  str = sprintf(#, "%.1f", val);
  gfx_measurestr(str, str_w, str_h);
  gfx_x = ctrX - str_w/2; gfx_y = ctrY - str_h/2;
  gfx_drawstr(str);
);

////////////////////////////////////////////////////////////////

    function togglestate(button,cap)local(count,toggle)instance(state1,state2)(
      button && mouse_cap == cap ? this.count+=1:this.count=0;
      this.toggle ==  0 ?  this.toggle = -1; //inits toggle to -1
      this.count  ==  1 ?  this.toggle = -this.toggle;
      this.toggle == -1 ? (state1 = 1; state2 = 0;);
      this.toggle ==  1 ? (state2 = 1; state1 = 0;);
     );
     
////////////////////////////////////////////////////////////////

// Background
color_rect(0  ,0  ,560,330,1,1,1,0,1);
color_rect(1  ,50 ,173,280,1,3,1,1,2);
color_rect(387,50 ,173,280,1,3,1,1,2);
color_rect(173,50 ,215,280,1,4,1,1,2);
color_rect(90 ,1  ,470,50 ,1,3,1,1,2);
color_rect(1  ,1  ,90 ,50 ,1,3,1,1,2);
// Slider
color_rect(70 ,115,40 ,200,1,7,1,1,1);
color_rect(450,115,40 ,200,1,7,1,1,1);
color_rect(215,115,40 ,200,1,8,1,1,1);
color_rect(305,115,40 ,200,1,8,1,1,1);
// Inside sliders
color_rect(87 ,115,5  ,200,1,9,1,1,1);
color_rect(233,115,5  ,200,1,9,1,1,1);
color_rect(323,115,5  ,200,1,9,1,1,1);
color_rect(468,115,5  ,200,1,9,1,1,1);
// Text box
color_rect(60 ,70 ,60 ,25 ,1,5,6,1,1);
color_rect(205,70 ,60 ,25 ,1,5,6,1,1);
color_rect(295,70 ,60 ,25 ,1,5,6,1,1);
color_rect(440,70 ,60 ,25 ,1,5,6,1,1);

// Strings
version="v.21.08.09";
tittle="RC INFLATOR";
s1t="Input (dB)";
s2t="Effect (%)";
s3t="Curve";
s5t="Output (dB)";
clip0db="CLIP";
human=" Human being
with feelings";

dotext(222,15 ,1,24,tittle ,10);
dotext(60 ,98 ,1,13,s1t    ,10);
dotext(205,98 ,1,13,s2t    ,6 );
dotext(310,98 ,1,13,s3t    ,6 );
dotext(438,98 ,1,13,s5t    ,10);
dotext(267,209,0,13,clip0db,5);
dotext(490,20 ,0,13,version,10);
dotext(15 ,15 ,0,12,human  ,1 );

// Numbers
gfx_set(1,1,0,1);
gfx_setfont(1,"Roboto Mono",17,1);
doCenterText(90 ,82,slider1);
doCenterText(235,82,slider2);
doCenterText(325,82,curve);
doCenterText(470,82,slider5);

// Slider 1
s11f.button_rect(70,115,40,200);
s11f.button == 1 ? color11f=9;
s11f.button == 0 ? color11f=0;
s11f.button == 1 ? (
    mouse_cap > 0 ? (
    slider11  = min(120,max(((mouse_y-115)*0.6),0));
    mouse_cap == 2 ? slider11 = 60;
  );
);
color_rect(68,115+(slider11*1.5),44,20,1,1+color11f,1,1,1);

// Slider 2 Curve
s12f.button_rect(213,115,40,200);
s12f.button == 1 ? color12f=9;
s12f.button == 0 ? color12f=0;
s12f.button == 1 ? (
    mouse_cap > 0 ? (
    slider12  = min(100,max(((mouse_y-115)*0.5),0));
    mouse_cap == 2 ? slider12 = 100;
  );
);
color_rect(213,115+(slider12*1.8),44,20,1,1+color12f,1,1,1);

// Slider 3
s13f.button_rect(305,115,40,200);
s13f.button == 1 ? color13f=9;
s13f.button == 0 ? color13f=0;
s13f.button == 1 ? (
    mouse_cap > 0 ? (
    slider13  = min(100,max(((mouse_y-115)*0.5),0));
    mouse_cap == 2 ? slider13 = 50;
  );
);
color_rect(303,115+(slider13*1.82),44,20,1,1+color13f,1,1,1);

// Slider 5
s15f.button_rect(450,115,40,200);
s15f.button == 1 ? color15f=9;
s15f.button == 0 ? color15f=0;
s15f.button == 1 ? (
    mouse_cap > 0 ? (
    slider15  = min(66,max(((mouse_y-115)*0.33),0));
    mouse_cap == 2 ? slider15 = 6;
  );
);
color_rect(448,115+(slider15*2.88),44,20,1,1+color15f,1,1,1);

// Slider 6 On/Off
s6.button_rect(260,200,40,30);
s6.togglestate(s6.button,1);
      s6.state1 ? (clip=0;color6f=9 ;tx6f=1;);
      s6.state2 ? (clip=1;color6f=12;tx6f=11;);
      //s6.button == 1 ? color6f=12;
      //s6.button == 0 ? color6f=9;
      
// On/Off
color_rect(260,200,40,30,1,color6f,5,1,2);
dotext    (267,209,0,13,clip0db,tx6f);

executeslider();