/*****************************************
Quadracom MK1.5 [Build 140315] by Stige T.
*****************************************/

Reaper 4.59+ Required

filename:0,quadracom_gfx/slider.png
filename:1,quadracom_gfx/bg.png
filename:2,quadracom_gfx/switch.png
filename:3,quadracom_gfx/lr.png
filename:4,quadracom_gfx/ms.png
filename:5,quadracom_gfx/solo.png
filename:6,quadracom_gfx/bypass.png
filename:7,quadracom_gfx/mono.png

@serialize

file_var(0,input);
file_var(0,tresh1);
file_var(0,trans1);
file_var(0,out1);
file_var(0,tresh2);
file_var(0,trans2);
file_var(0,out2);
file_var(0,tresh3);
file_var(0,trans3);
file_var(0,out3);
file_var(0,tresh4);
file_var(0,trans4);
file_var(0,out4);
file_var(0,speed);
file_var(0,mode);
file_var(0,output);
file_var(0,comp);
file_var(0,punch);
file_var(0,mono);
file_var(0,s1);
file_var(0,s2);
file_var(0,s3);
file_var(0,s4);
file_var(0,bp1);
file_var(0,bp2);
file_var(0,bp3);
file_var(0,bp4);

file_var(0,p1.val_pos);
file_var(0,p2.val_pos);
file_var(0,p3.val_pos);
file_var(0,p4.val_pos);
file_var(0,p5.val_pos);
file_var(0,p6.val_pos);
file_var(0,p7.val_pos);
file_var(0,p8.val_pos);
file_var(0,p9.val_pos);
file_var(0,p10.val_pos);
file_var(0,p11.val_pos);
file_var(0,p12.val_pos);
file_var(0,p18.val_pos);
file_var(0,p19.val_pos);
file_var(0,p20.val_pos);
file_var(0,p21.val_pos);
file_var(0,b5.val_pos);
file_var(0,b10.val_pos);

file_var(0,b1.val_pos);
file_var(0,b2.val_pos);
file_var(0,b3.val_pos);
file_var(0,b4.val_pos);

file_var(0,b6.val_pos);
file_var(0,b7.val_pos);
file_var(0,b8.val_pos);
file_var(0,b9.val_pos);

!p18.val_pos ? p18.val_pos = 5;

@init

meter1 = 1;
meter2 = 1;
meter3 = 1;
meter4 = 1;
meter5 = 1;
meter6 = 1;
meter7 = 1;
meter8 = 1;

t01 = exp(-1/(srate*0.001));
t10 = exp(-1/(srate*0.01));
t20 = exp(-1/(srate*0.02));
t50 = exp(-1/(srate*0.05));
t60 = exp(-1/(srate*0.06));
t100 = exp(-1/(srate*0.1));
t200 = exp(-1/(srate*0.2));
h1 = ceil(srate/44.1);
trw = 1-exp(-2*$pi*((1/3333)*1000)/srate);
trf = 1-exp(-2*$pi*1000/srate);
f20 = 1-exp(-2*$pi*20/srate);
weight = 1-exp(-1/(0.15 / 1000 * srate));

mrange = 12;

function filterLP(input,freq)
instance(temp,freq,out,n0,weight)
(
  temp != freq ? (
    n0 = 0;
    weight = 1-exp(-2*$pi*freq/srate);
    temp = freq;
  );
  
  out = (n0+=((input-n0)*weight));
);

function filterHP(input,freq)
instance(temp,freq,out,n0,weight)
(
  temp != freq ? (
    n0 = 0;
    weight = 1-exp(-2*$pi*freq/srate);
    temp = freq;
  );
  
  out = input - (n0+=((input-n0)*weight));
);

function follower(input,att,rel,inertia)
instance (env,tmp) (
  tmp = input >= tmp ? input : input + inertia * (tmp-input);
  (tmp > env) ? (
      env = att * (env - tmp) + tmp;
  ) : (
      env = rel * (env - tmp) + tmp;
  );
);

function compressor(input,treshold,attack,release,ratio,knee)
instance(env,e0,e1,output,rmod,dB,temp,s1)
(
  treshold ? (
    treshold -= knee;
    dB = 20 * log10( abs(input) );
    !input ? dB = -400; // preventing strange issue
    env = dB - min(dB,treshold);
    env = env^2 / (env+knee);
    env = env * (1-(1/ratio));
    
    rmod = e0.follower(env,0,t200,ti);
    rmod = sqrt(release / (0.00001 * rmod+1));
    
    env = e1.follower(env,attack,rmod,ti);
    env = exp((env / 20) * log(10));
    punch ? (
      env = s1 += f20  * ( env - s1 );
    );
    output = input / env;
  ) : (
    env = 0;
    input;
  );
);

function transient(input,amount)
instance(e0,e1,s1,s2,peak,peak2,attack,rms)
(
  amount ? (
    rms = sqrt(s1 +=  trw * ( input^2 - s1 )) * 2;
    peak = e0.follower(max(abs(input),rms),0,t100,t20);
    peak2 = e1.follower(peak,t50,0,0);
    attack = (-1/( sqrt(peak - peak2) +1) +1)/2 * amount;
    attack = s2 += trf * ( attack - s2 );
  ) : (attack = 0);
);

function channel(input)
instance(
low,mid,mid2,hi,f1,f2,f3,f4,f5,f6,c1,c2,c3,c4,
process_low,process_mid,process_mid2,process_hi,t1,t2,t3,t4
)
(
  low = f1.filterLP(input,80);
  mid = f2.filterHP(input,80);
  mid = f3.filterLP(mid,600);
  mid2 = f4.filterHP(input,600);
  mid2 = f5.filterLP(mid2,6000);  
  hi = f6.filterHP(input,6000);

  bp1 ? (
    process_low = low;
  ) : (
    process_low = c1.compressor(low,tresh1,attack1,release,ratio,knee);
    process_low += (process_low * t1.transient(low,trans1));
    process_low *= out1;
  );

  bp2 ? (
    process_mid = mid;
  ) : (  
    process_mid = c2.compressor(mid,tresh2,attack2,release,ratio,knee);
    process_mid += (process_mid * t2.transient(mid,trans2));
    process_mid *= out2;
  );

  bp3 ? (
    process_mid2 = mid2;
  ) : (
    process_mid2 = c3.compressor(mid2,tresh3,attack3,release,ratio,knee);
    process_mid2 += (process_mid2 * t3.transient(mid2,trans3));
    process_mid2 *= out3;
  );
  
  bp4 ? (
    process_hi = hi;
  ) : (
    process_hi = c4.compressor(hi,tresh4,attack4,release,ratio,knee);
    process_hi += (process_hi * t4.transient(hi,trans4));
    process_hi *= out4;
  );
    
  (process_low*s1) + (process_mid*0.87*s2) + (process_mid2*0.935*s3) + (process_hi*s4);
);

@slider

@block

meter1 = 1/L.c1.env;
meter3 = 1/L.c2.env;
meter5 = 1/L.c3.env;
meter7 = 1/L.c4.env;

meter10 = L.t1.attack;
meter12 = L.t2.attack;
meter14 = L.t3.attack;
meter16 = L.t4.attack;

!mono ? (
  meter2 = 1/R.c1.env;
  meter4 = 1/R.c2.env;
  meter6 = 1/R.c3.env;
  meter8 = 1/R.c4.env;
  
  meter11 = R.t1.attack;
  meter13 = R.t2.attack;
  meter15 = R.t3.attack;
  meter17 = R.t4.attack;  
) : (
meter2 = meter4 = meter6 = meter8 = meter11 = meter13 = meter15 = meter17 = 0;
);

@sample

spl0 = spl0 * input;
spl1 = spl1 * input;

!mono ? (

  !mode ? (
    M = (spl0 + spl1)*0.5;
    S = (spl0 - spl1)*0.5;
    M = L.channel(M)*output;
    S = R.channel(S*2)*output/2;
    spl0 = M+S;
    spl1 = M-S;
  ) : (
    spl0 = L.channel(spl0)*output;
    spl1 = R.channel(spl1)*output;
  );

) : (
  spl0 = spl1 = L.channel( (spl0+spl1)/2 )*output;
);

@gfx 640 334

gfx_a = 1;
gfx_r = gfx_g = gfx_b = 1;
gfx_x = 0; gfx_y = 0;
gfx_blit(1,1,0);

gfx_setfont(1,Arial,12);

function init_mouse() (
  !X ? (X = mouse_x;);
  !Y ? (Y = mouse_y;);
);
function uninit_mouse() (
  X = 0;
  Y = 0;
);
mouse_cap ? init_mouse() : uninit_mouse();

function draw_meter2(redux,y_pos,drawlabels,col)
instance(x_pos,fall)
(
  x_pos = 395;
  gfx_r = 1; gfx_g = 1; gfx_b = 1; gfx_a = 1;
  gfx_x = x_pos; gfx_y = y_pos;
  gfx_rectto(50+x_pos,5+y_pos);
  
  drawlabels ? (
    gfx_x = 49+x_pos; gfx_y = 5+y_pos;
    gfx_lineto(49+x_pos,15+y_pos,0);
    gfx_drawnumber(6,0);
    gfx_x = 30+x_pos; gfx_y = 5+y_pos;
    gfx_lineto(30+x_pos,15+y_pos,0);
    gfx_drawnumber(3,0);
    gfx_x = 17+x_pos; gfx_y = 5+y_pos;
    gfx_lineto(17+x_pos,15+y_pos,0);
    gfx_drawnumber(1,0);        
  );
  col == 2 ? (
    gfx_r = 0; gfx_g = 0.6; gfx_b = 0.1; gfx_a = 1;
  ) : (
    gfx_r = 0.9; gfx_g = 0.3; gfx_b = 0.3; gfx_a = 1;
  );
  gfx_x = x_pos;
  gfx_y = y_pos+1;
  redux = abs(redux);
  redux > fall ? (fall = redux;);
  redux = max(redux,fall);
  fall -= 0.02;
  redux = floor(min(max(sqrt( redux )*49,1),49));
  gfx_rectto(redux+x_pos,4+y_pos);

);

function draw_slider(pot_x,pot_y,min_val,max_val,step_size,frame_width,frame_height,frame_count,showval,gfxindex)
instance(
  total_steps,fpos,pos_temp,
  val_pos,pot_x,pot_y,min_val,
  max_val,step_size,frame_width,
  frame_height,frame_count,showval,
  gfxindex,coordinatelist,prec,
  val_str,str_x,str_y,unit
)
(
  !mouse_cap ? (pos_temp = mouse_y;);

  X > pot_x && X < pot_x+frame_width && Y > pot_y && Y < pot_y+frame_height ? (
    mouse_cap & 4 ? val_pos = 0;
    pos_temp != mouse_y ? (
      mouse_cap & 16 ? (
        mouse_y > pos_temp ? val_pos -= step_size;
        mouse_y < pos_temp ? val_pos += step_size;
      ) : (
        val_pos = floor(  (max_val - (((max_val - min_val)/(frame_height-(frame_height/7.5))) * (mouse_y-pot_y-(frame_height/15)))) * (1/step_size)  ) / (1/step_size);
      );
    );
    pos_temp = mouse_y;
  );
  
  val_pos = max(val_pos,min_val);
  val_pos = min(val_pos,max_val);
  fpos = floor(((val_pos - min_val) * (frame_count-1))/(max_val - min_val)) * frame_height;
  coordinatelist[0] = 0;
  coordinatelist[1] = fpos;
  coordinatelist[2] = coordinatelist[6] = frame_width;
  coordinatelist[3] = coordinatelist[7] = frame_height;
  coordinatelist[4] = pot_x;
  coordinatelist[5] = pot_y;
  gfx_blitext(gfxindex, coordinatelist, 0);
  showval ? (
  
    step_size >= 1 ? prec = "%.0f";
    step_size < 1 ? prec = "%.1f";
    step_size < 0.1 ? prec = "%.2f";
    val_str = sprintf (#,prec,val_pos);
    val_str = strcat(val_str, unit);
    gfx_measurestr(val_str,str_x,str_y);
    gfx_x = pot_x+(frame_width/2)-(str_x/2) ; gfx_y = pot_y+frame_height+5-(str_y/8);
    gfx_drawstr(val_str);
        
  );
  val_pos;
);

function draw_button(pos_x,pos_y,frame_width,frame_height,gfxindex)
instance(val_pos,fpos,coordinatelist,adj)
(
  X > pos_x && X < pos_x+frame_width && Y > pos_y && Y < pos_y+frame_height ? (
    
    !val_pos && !adj ? (
      val_pos = 1;
      adj = 1;
    );
    
    val_pos && !adj ? (
      val_pos = 0;
      adj = 1;
    );
    
  ) : (adj = 0;);
  
  fpos = val_pos * frame_height;

  coordinatelist[0] = 0;
  coordinatelist[1] = fpos;
  coordinatelist[2] = coordinatelist[6] = frame_width;
  coordinatelist[3] = coordinatelist[7] = frame_height;
  coordinatelist[4] = pos_x;
  coordinatelist[5] = pos_y;
  gfx_a=1;
  gfx_blitext(gfxindex, coordinatelist, 0);
  val_pos;
);

function rmeter(input,range_db,psize_db,width,height,x_pos,y_pos)
instance(redux,i,range,dB,peak,i2,pwidth_px,redux2,peak_hold,
rms_input,pos,s,,draw_mode,peak_mode,R1,G1,B1,A1,R2,G2,B2,A2,
ro,ro_x,ro_y,peak_falloff,weight)
(
  range = range_db/psize_db;
  pwidth_px = psize_db/range_db*width;
  input > 1 ? input = 1;
  !input ? input = 1;
  !draw_mode ? draw_mode = 1;
  !peak_mode ? peak_mode = 1;
  !peak_falloff ? peak_falloff = 0.005;
  !weight ? weight = 1-exp(-1/(500/(srate/23)  / 1000 * srate));
  
  draw_mode != 3 ? (
    gfx_r = 1; gfx_g = 1; gfx_b = 1; gfx_a = 1;
    gfx_x = x_pos; gfx_y = y_pos;
    gfx_rectto(width+x_pos,height+y_pos);
  );
  
  draw_mode == 1 || draw_mode == 2 ? (
    
    draw_mode == 2 ? (
      gfx_x = width+x_pos-1; gfx_y = y_pos;
      gfx_lineto(width+x_pos-1,y_pos-10,0);
      gfx_y = y_pos-16;
      gfx_drawnumber(0,0);
    ) : (
      gfx_x = width+x_pos-1; gfx_y = height+y_pos;
      gfx_lineto(width+x_pos-1,height+10+y_pos,0);
      gfx_drawnumber(0,0);
    );
  
    i = 1;
    loop(range-1,
      pos = (width-(pwidth_px*i)+x_pos);
      pwidth_px <=20 ? (
        ((i+1)%(1/pwidth_px*40)) == 1 && (pos+width-55) > width ? (
          draw_mode == 2 ? (
            gfx_x = pos; gfx_y = y_pos;
            gfx_lineto(pos,y_pos-10,0);
            gfx_y = y_pos-16;
            gfx_drawnumber(i*psize_db,0);
          ) : (
            gfx_x = pos; gfx_y = height+y_pos;
            gfx_lineto(pos,height+10+y_pos,0);
            gfx_drawnumber(i*psize_db,0);
          );
        ) : (
          draw_mode == 2 ? (
            gfx_x = pos; gfx_y = y_pos;
            gfx_lineto(pos,y_pos-4,0);          
          ) : (
            gfx_x = pos; gfx_y = height+y_pos;
            gfx_lineto(pos,height+4+y_pos,0);
          );
        );
      ) : (     
        draw_mode == 2 ? (
          gfx_x = pos; gfx_y = y_pos;
          gfx_lineto(pos,y_pos-10,0);
          gfx_y = y_pos-16;
          gfx_drawnumber(i*psize_db,0);
        ) : (
          gfx_x = pos; gfx_y = height+y_pos;
          gfx_lineto(pos,height+10+y_pos,0);
          gfx_drawnumber(i*psize_db,0);
        );    
      );
      
      i +=1;
    );
    
    draw_mode == 2 ? (
      gfx_x = x_pos; gfx_y = y_pos;
      gfx_lineto(x_pos,y_pos-10,0);
      gfx_y = y_pos-15;
      gfx_drawnumber(range_db,0);
    ) : (
      gfx_x = x_pos; gfx_y = height+y_pos;
      gfx_lineto(x_pos,height+10+y_pos,0);
      gfx_drawnumber(range_db,0);
    );
  );
   
  gfx_r = R1; gfx_g = G1; gfx_b = B1; gfx_a = A1;
  
  peak_mode != 2 ? (  
    gfx_x = x_pos+1;
    gfx_y = y_pos+1;
    gfx_x = width+x_pos-1;
    rms_input = sqrt(s +=  weight * ( input^2 - s ));
    redux = ceil( width + ( log( rms_input ) * (43.4 * (10/psize_db) / (50/pwidth_px) ) ) )-1;
    redux = max(redux,1);
    redux = min(redux,width-1);
    gfx_rectto(redux+x_pos,height+y_pos-1);
  ) : (
    redux = width;
  );
  
  peak_mode ? (
    gfx_r = R2; gfx_g = G2; gfx_b = B2; gfx_a = A2;
    
    !peak_hold ? peak_hold = 1;
    input < peak_hold ? peak_hold = input;
    redux2 = ceil( width + ( log( peak_hold ) * (43.4 * (10/psize_db) / (50/pwidth_px) ) ) );
    redux2 = max(redux2,0);
    redux2 = min(redux2,redux);
    gfx_x = redux2+x_pos; gfx_y = y_pos+1;
    gfx_rectto(redux+x_pos,height+y_pos-1);
    
    peak_hold += peak_falloff;
    input == 1 ? (
      peak_hold += 0.01;
    );
  );
  
  ro = sprintf(#,"%d",10);
  gfx_measurestr(ro,ro_x,ro_y);
  
  height >= ro_y-2 ? (
    gfx_r = 0; gfx_g = 0; gfx_b = 0; gfx_a = 1;
    gfx_y = y_pos + (height/2) - (ro_y/2);
    gfx_x = redux2+x_pos-ro_x-10;
    gfx_x = max(gfx_x,x_pos+1);
    
    input < peak ? peak = input;
    dB = 20 * log10(peak);
    gfx_drawnumber(dB,1);    
    
    i2 += 1;
    i2 >= 30 ? (peak = 1; i2 = 0);
  );
  
);

tresh1_lin = p1.draw_slider(85,60,0,40,1,20,150,40,1,0);
tresh1 = -tresh1_lin;
trans1_lin = p2.draw_slider(120,60,-10,10,0.5,20,150,40,1,0);
trans1_lin > 0 ? (
  trans1 = trans1_lin / 1.666;
) : (
  trans1 = trans1_lin / 4;
);
out1_lin = p3.draw_slider(155,60,-20,20,0.5,20,150,40,1,0);
out1 = 10^(out1_lin/20);

tresh2_lin = p4.draw_slider(195,60,0,40,1,20,150,40,1,0);
tresh2 = -tresh2_lin;
trans2_lin = p5.draw_slider(230,60,-10,10,0.5,20,150,40,1,0);
trans2_lin > 0 ? (
  trans2 = trans2_lin / 2;
) : (
  trans2 = trans2_lin / 4;
);
out2_lin = p6.draw_slider(265,60,-20,20,0.5,20,150,40,1,0);
out2 = 10^(out2_lin/20);

tresh3_lin = p7.draw_slider(305,60,0,40,1,20,150,40,1,0);
tresh3 = -tresh3_lin;
trans3_lin = p8.draw_slider(340,60,-10,10,0.5,20,150,40,1,0);
trans3_lin > 0 ? (
  trans3 = trans3_lin / 2;
) : (
  trans3 = trans3_lin / 4;
);
out3_lin = p9.draw_slider(375,60,-20,20,0.5,20,150,40,1,0);
out3 = 10^(out3_lin/20);

tresh4_lin = p10.draw_slider(415,60,0,40,1,20,150,40,1,0);
tresh4 = -sqrt(tresh4_lin*30);
trans4_lin = p11.draw_slider(450,60,-10,10,0.5,20,150,40,1,0);
trans4_lin > 0 ? (
  trans4 = trans4_lin;
) : (
  trans4 = trans4_lin / 4;
);
out4_lin = p12.draw_slider(485,60,-20,20,0.5,20,150,40,1,0);
out4 = 10^(out4_lin/20);

speed_lin = p18.draw_slider(540,60,1,10,1,20,150,40,1,0);
speed = speed_lin;

ratio = (31.6227766-speed^1.5)/30.6227766*4.5+1.5;
knee = (speed^3/100)*2;
attmod = speed/10;

attack1 = exp(-1/(srate*(0.05*attmod)));
attack2 = exp(-1/(srate*(0.035*attmod)));
attack3 = exp(-1/(srate*(0.02*attmod)));
attack4 = exp(-1/(srate*(0.01*attmod)));
release_ms = speed^4/80+30;
release = exp(-1/(srate*release_ms/1000));

mode = p19.draw_slider(570,60,0,1,1,10,20,2,0,2);

output_lin = p20.draw_slider(590,60,-20,20,0.5,20,150,40,1,0);
output = 10 ^ ((output_lin) / 20);

input_lin = p21.draw_slider(30,60,-20,20,0.5,20,150,40,1,0);
input = 10 ^ ((input_lin) / 20);

punch = b5.draw_button(569,194,10,10,5);
punch ? (
  ti = exp(-1/(srate*0.05));
) : (
  ti = exp(-1/(srate*0.01));
);

mono = b10.draw_button(569,118,10,10,6);

!mono ? (
  !mode ? (
    gfx_x = 174; gfx_y = 306;
    gfx_drawstr("M/S");
  ) : (
    gfx_x = 174; gfx_y = 306;
    gfx_drawstr("L/R");
  );
) : (
  gfx_x = 165; gfx_y = 306;
  gfx_drawstr("MONO");
);

trans1_lin < 0 ? sgn1 = 2 : sgn1 = 1;
trans2_lin < 0 ? sgn2 = 2 : sgn2 = 1;
trans3_lin < 0 ? sgn3 = 2 : sgn3 = 1;
trans4_lin < 0 ? sgn4 = 2 : sgn4 = 1;

mtt1.draw_meter2(meter10*sgn1,260,0,sgn1);
mtt2.draw_meter2(meter11*sgn1,265,0,sgn1);
mtt3.draw_meter2(meter12*sgn2,271,0,sgn2);
mtt4.draw_meter2(meter13*sgn2,276,0,sgn2);
mtt5.draw_meter2(meter14*sgn3,282,0,sgn3);
mtt6.draw_meter2(meter15*sgn3,287,0,sgn3);
mtt7.draw_meter2(meter16*sgn4,293,0,sgn4);
mtt8.draw_meter2(meter17*sgn4,298,1,sgn4);

mtr1.rmeter(meter1,mrange,1,200,5,195,260);
mtr2.rmeter(meter2,mrange,1,200,5,195,265);
mtr3.rmeter(meter3,mrange,1,200,5,195,271);
mtr4.rmeter(meter4,mrange,1,200,5,195,276);
mtr5.rmeter(meter5,mrange,1,200,5,195,282);
mtr6.rmeter(meter6,mrange,1,200,5,195,287);
mtr7.rmeter(meter7,mrange,1,200,5,195,293);
mtr8.rmeter(meter8,mrange,1,200,5,195,298);

mtr1.G1 = mtr2.G1 = mtr3.G1 = mtr4.G1 = mtr5.G1 = mtr6.G1 = mtr7.G1 = mtr8.G1 = 0.55;
mtr1.A1 = mtr2.A1 = mtr3.A1 = mtr4.A1 = mtr5.A1 = mtr6.A1 = mtr7.A1 = mtr8.A1 = 1;
mtr1.R2 = mtr2.R2 = mtr3.R2 = mtr4.R2 = mtr5.R2 = mtr6.R2 = mtr7.R2 = mtr8.R2 = 0.3;
mtr1.G2 = mtr2.G2 = mtr3.G2 = mtr4.G2 = mtr5.G2 = mtr6.G2 = mtr7.G2 = mtr8.G2 = 0.4;
mtr1.B2 = mtr2.B2 = mtr3.B2 = mtr4.B2 = mtr5.B2 = mtr6.B2 = mtr7.B2 = mtr8.B2 = 0;
mtr1.A2 = mtr2.A2 = mtr3.A2 = mtr4.A2 = mtr5.A2 = mtr6.A2 = mtr7.A2 = mtr8.A2 = 0.5;
mtr1.draw_mode = mtr2.draw_mode = mtr3.draw_mode = mtr4.draw_mode = mtr5.draw_mode = mtr6.draw_mode = mtr7.draw_mode = 4;

but1 = b1.draw_button(165,232,10,10,5);
but2 = b2.draw_button(275,232,10,10,5);
but3 = b3.draw_button(385,232,10,10,5);
but4 = b4.draw_button(495,232,10,10,5);

bp1 = b6.draw_button(85,232,10,10,6);
bp2 = b7.draw_button(195,232,10,10,6);
bp3 = b8.draw_button(305,232,10,10,6);
bp4 = b9.draw_button(415,232,10,10,6);

(but1 || but2 || but3 || but4) ? (s1 = s2 = s3 = s4 = 0;) : (s1 = s2 = s3 = s4 = 1;);
but1 ? (s1 = 1;);
but2 ? (s2 = 1;);
but3 ? (s3 = 1;);
but4 ? (s4 = 1;);

gfx_r = 0; gfx_g = 0; gfx_b = 0; gfx_a = 0.3;
bp1 ? (
  gfx_x = 195; gfx_y = 260;
  gfx_rectto(445,270);
  L.c1.env = R.c1.env = 1;
  L.t1.attack = R.t1.attack = 0;
);

bp2 ? (
  gfx_x = 195; gfx_y = 271;
  gfx_rectto(445,281);
  L.c2.env = R.c2.env = 1;
  L.t2.attack = R.t2.attack = 0;  
);

bp3 ? (
  gfx_x = 195; gfx_y = 282;
  gfx_rectto(445,292);
  L.c3.env = R.c3.env = 1;
  L.t3.attack = R.t3.attack = 0;  
);

bp4 ? (
  gfx_x = 195; gfx_y = 293;
  gfx_rectto(445,303);
  L.c4.env = R.c4.env = 1;
  L.t4.attack = R.t4.attack = 0;  
);

p3.unit = "dB";
p1.unit = "dB";
p4.unit = "dB";
p6.unit = "dB";
p7.unit = "dB";
p9.unit = "dB";
p10.unit = "dB";
p12.unit = "dB";
p20.unit = "dB";
p21.unit = "dB";

gfx_a = 0.5;
gfx_x = 550; gfx_y = 250;
gfx_drawstr(sprintf (#, "At1: %.0fms",attmod*50));
gfx_x = 550; gfx_y = 260;
gfx_drawstr(sprintf (#, "At2: %.0fms",attmod*35));
gfx_x = 550; gfx_y = 270;
gfx_drawstr(sprintf (#, "At3: %.0fms",attmod*20));
gfx_x = 550; gfx_y = 280;
gfx_drawstr(sprintf (#, "At4: %.0fms",attmod*10));
gfx_x = 550; gfx_y = 290;
gfx_drawstr(sprintf (#, "Rel: %.0fms",release_ms));
gfx_x = 550; gfx_y = 300;
gfx_drawstr(sprintf (#, "Kne: %.0fdB",knee));
gfx_x = 550; gfx_y = 310;
gfx_drawstr(sprintf (#, "Rat: %.0f:1",ratio));
