slider1:0.65<0,1,0.01>|---------------- hat thresh
slider2:0.5<0,1,0.01>hat rate
slider3:0.55<0,1,0.01>hat mix
slider4:0.15<0,1,0.01>|-------------- kick thresh
slider5:0.12<0,1,0.01>kick trigger
slider6:0.35<0,1,0.01>kick mix
slider7:0.6<0,1,0.01>|------------ snare thresh
slider8:0.48<0,1,0.01>snare trigger
slider9:0.45<0,1,0.01>snare mix
slider10:0<0,1,0.01>|---------------- dynamics
slider11:0<0,2,1{Output,Kick Trigger,Snare Trigger}>monitor
slider12:0<0,1,1{Off,On}>|-------------------- dry mix
slider13:0.5<0,1,0.01>dry level
slider14:0.5<0,1,0.01>wet level
slider15:0.5<0,1,0.01>main out

in_pin:L in
in_pin:R in
out_pin:L out
out_pin:R out

@init
ext_noinit = 1;

hbuflen = 20000;
kbuflen = 40000;
sbuflen = 80000;
//(srate>49000) ? ( hbuflen*=2; kbuflen*=2; sbuflen*=2; ); //???

hbuf = hbuflen;
kbuf = kbuflen;
sbuf = sbuflen;
sbuf2 = sbuflen;

mix2 = 0;

dyne = 0;
dyna = pow(10,-300/srate); //pow(10,-1000/srate);
dynr = pow(10,-6/srate); //-12

//synth

p = 0.2;
e = 0.00012;
o1 = 0;
o2 = 0;

memset(hbuf, 0, hbuflen); //generate hi-hat
de = pow(10,-36/srate); //-36
t=0;
while(t<5000) (
t+=1;
o = ((rand(5000) % 2000) - 1000);
buf[hbuf + t] =  e * ( 2 * o1 - o2 - o);
e *= de;
o2 = o1;
o1 = o;
);

memset(kbuf, 0, kbuflen); //generate kick
de = pow(10,-4/srate); //-3.8
e = 0.5;
dp = 1588 / srate;
t=0;
while(t<14000) (
t+=1;
buf[kbuf + t] =  e * sin(p);
e *= de;
//p = mod(p + dp * e ,6.2831853);
test0 = p + dp * e;
test1 = (test0 / 6.2831853) |0;
test2 = test1 * 6.2831853;
p = test0 - test2;
);

memset(sbuf, 0, sbuflen); //generate snare
de = pow(10,-16/srate); //-16
e = 0.38;
//dp = 1103 / srate;
t=0;
while(t<7000) (
t+=1;
o = (0.3 * o) + ((rand(7000) % 2000) - 1000);
buf[sbuf + t] =  (e * (sin(p) + 0.0004 * o));
buf[sbuf2 + t] = buf[sbuf + t];
e *= de;
//p = mod(p + 0.025 ,6.2831853);
test10 = p + 0.025; //p + dp;
test11 = (test10 / 6.2831853) |0;
test12 = test11 * 6.2831853;
p = test10 - test12;
);

@slider
fParam1 = slider1; //hat thresh
fParam2 = slider2; //hat rate
fParam3 = slider3; //hat mix
fParam4 = slider4; //kick thresh
fParam5 = slider5; //kick key (trigger)
fParam6 = slider6; //kick mix
fParam7 = slider7; //snare thresh
fParam8 = slider8; //snare key (trigger)
fParam9 = slider9; //snare mix
fParam10 = slider10; //dynamics
fParam11 = slider11; //monitor
fParam12 = slider12; //dry thru
fParam13 = slider13; //dry level
fParam14 = slider14; //wet level
fParam15 = slider15; //main out

hthr = pow(10, 2 * fParam1 - 2); //hat
hdel = ((0.04 + 0.2 * fParam2) * srate); //hat rate

kthr = (220 * pow(10, 2 * fParam4 - 2)); //kick
kdel = (0.10 * srate); //kick rate

sthr = (40.0 * pow(10, 2 * fParam7 - 2)); //snare
sdel = (0.12 * srate); //snare rate

hlev = (0.0001 + fParam3 * fParam3 * 4);
klev = (0.0001 + fParam6 * fParam6 * 4);
slev = (0.0001 + fParam9 * fParam9 * 4);

kww = pow(10,-3 + 2.2 * fParam5);
ksf1 = cos(3.1415927 * kww); //p
ksf2 = sin(3.1415927 * kww); //q

ww = pow(10,-3 + 2.2 * fParam8);
sf1 = cos(3.1415927 * ww); //p
sf2 = sin(3.1415927 * ww); //q
sf3 = 0.991; //r

dynm = fParam10;

monitor = fParam11;

mix = fParam12;

dry = pow(10, 2 * fParam13 - 1);
wet = pow(10, 2 * fParam14 - 1);
main = pow(10, 2 * fParam15 - 1);

@sample
hf=hfil;

ht=hthr;
hp=hbufpos;
hl=hbuflen-2;
hd=hdel;

kt=kthr;
kp=kbufpos;
kl=kbuflen-2;
kd=kdel;

st=sthr;
sp=sbufpos;
sl=sbuflen-2;
sd=sdel;

monitor==0 ? (
mix2=0;

hlv=hlev;
klv=klev;
slv=slev;

b1=sf1;
b2=sf2;
b3=sf3;

f1=sb1;
f2=sb2;
kf1=ksb1;
kf2=ksb2;

kb1=ksf1;
kb2=ksf2;
);

monitor==1 ? (
mix2=0.05;

hlv=0;
klv=0;
slv=0;

b1=ksf1;
b2=ksf2;
b3=sf3;

f1=sb1;
f2=sb2;

kf1=ksb1;
kf2=ksb2;

kb1=0;
kb2=0;

mix=0;
);

monitor==2 ? (
mix2=0.05;

hlv=0;
klv=0;
slv=0;

b1=sf1;
b2=sf2;
b3=sf3;

f1=sb1;
f2=sb2;

kf1=ksb1;
kf2=ksb2;

kb1=ksf1;
kb2=ksf2;

mix=0;
);

ya=dyna;
yr=dynr;
ye=dyne;
ym=dynm;

a = spl0; //input
b = spl1;
e = a + b;

//ye = (e<ye) ? ye * yr : e - ya * (e - ye); //dynamics envelope
ye = (e<ye) ? e - yr * (e - ye) : e - ya * (e - ye); //dynamics envelope mod

hf = e - hf; //high
((hp>hd) && (hf>ht)) ? ( hp=0; ):( hp+=1; (hp>hl) ? hp=hl; ); //hat
o = hlv * buf[hbuf + hp];

k = e + (kf1 * kb1) - (kf2 * kb2);
kf2 = b3 * ((kf1 * kb2) + (kf2 * kb1));
kf1 = b3 * k;
((kp>kd) && (k>kt)) ? ( kp=0; ):( kp+=1; (kp>kl) ? kp=kl; ); //kick
o += klv * buf[kbuf + kp];

s = hf + (0.3 * e) + (f1 * b1) - (f2 * b2);
f2 = b3 * ((f1 * b2) + (f2 * b1));
f1 = b3 * s;
((sp>sd) && (s>st)) ? ( sp=0; ):( sp+=1; (sp>sl) ? sp=sl; ); //snare

//mix3 = 1 + ym * (ye + ye - 1); //dynamics
mix3 = 1 - ym * ((ye + ye) * 0.25); //dynamics mod

c = mix*a*dry + mix2*s + mix3*(o*wet + slv * buf[sbuf + sp]*wet);
d = mix*b*dry + mix2*s + mix3*(o*wet + slv * buf[sbuf2 + sp]*wet);

spl0 = c*main;
spl1 = d*main;

hf=e;
hfil=hf;

hbufpos=hp;
sbufpos=sp;
kbufpos=kp;

sb1=f1;
sb2=f2;
ksb1=f1;
ksb2=f2;

dyne=ye;

@gfx 0 280
gfx_r=0.2; gfx_g=0.8; gfx_b=0.8; gfx_a=1;
gfx_setfont(1,"Arial", 16);

gfx_x =20; gfx_y =10;  gfx_printf("%.1f",(40*fParam1 - 40) );
gfx_x =80; gfx_y =10;  gfx_printf("dB");
gfx_x =110; gfx_y =10;  gfx_printf("Hat Thresh");

gfx_x =20; gfx_y =30;  gfx_printf("%.0f",(1000 * hdel / srate) );
gfx_x =80; gfx_y =30;  gfx_printf("ms");
gfx_x =110; gfx_y =30;  gfx_printf("Hat Rate");

gfx_x =20; gfx_y =50;  gfx_printf("%.1f",(20 * log10(hlev)) );
gfx_x =80; gfx_y =50;  gfx_printf("dB");
gfx_x =110; gfx_y =50;  gfx_printf("Hat Mix");

gfx_r=0.8; gfx_g=0.5; gfx_b=0.2;

gfx_x =20; gfx_y =70;  gfx_printf("%.1f",(40*fParam4 - 40) );
gfx_x =80; gfx_y =70;  gfx_printf("dB");
gfx_x =110; gfx_y =70;  gfx_printf("Kick Thresh");

gfx_x =20; gfx_y =90;  gfx_printf("%.1f",(0.5 * kww * srate) );
gfx_x =80; gfx_y =90;  gfx_printf("Hz");
gfx_x =110; gfx_y =90;  gfx_printf("Kick Trigger");

gfx_x =20; gfx_y =110;  gfx_printf("%.1f",(20 * log10(klev)) );
gfx_x =80; gfx_y =110;  gfx_printf("dB");
gfx_x =110; gfx_y =110;  gfx_printf("Kick Mix");

gfx_r=0.8; gfx_g=0.8; gfx_b=0.2;

gfx_x =20; gfx_y =130;  gfx_printf("%.1f",(40*fParam7 - 40) );
gfx_x =80; gfx_y =130;  gfx_printf("dB");
gfx_x =110; gfx_y =130;  gfx_printf("Snare Thresh");

gfx_x =20; gfx_y =150;  gfx_printf("%.1f",(0.5 * ww * srate) );
gfx_x =80; gfx_y =150;  gfx_printf("Hz");
gfx_x =110; gfx_y =150;  gfx_printf("Snare Trigger");

gfx_x =20; gfx_y =170;  gfx_printf("%.1f",(20 * log10(slev)) );
gfx_x =80; gfx_y =170;  gfx_printf("dB");
gfx_x =110; gfx_y =170;  gfx_printf("Snare Mix");

gfx_r=0.9; gfx_g=0.2; gfx_b=0.4;

gfx_x =20; gfx_y =190;  gfx_printf("%.0f",(100 * fParam10) );
gfx_x =80; gfx_y =190;  gfx_drawchar($'%');
gfx_x =110; gfx_y =190;  gfx_printf("Dynamics");

gfx_r=0; gfx_g=0.9; gfx_b=0;

gfx_x =20; gfx_y =210;  gfx_printf("%.1f",(40 * fParam13 - 20) );
gfx_x =80; gfx_y =210;  gfx_printf("dB");
gfx_x =110; gfx_y =210;  gfx_printf("Dry Level");

gfx_x =20; gfx_y =230;  gfx_printf("%.1f",(40 * fParam14 - 20) );
gfx_x =80; gfx_y =230;  gfx_printf("dB");
gfx_x =110; gfx_y =230;  gfx_printf("Wet Level");

gfx_x =20; gfx_y =250;  gfx_printf("%.1f",(40 * fParam15 - 20) );
gfx_x =80; gfx_y =250;  gfx_printf("dB");
gfx_x =110; gfx_y =250;  gfx_printf("Main Out");
