// Always start playback at start of a measure.
// Loop sections should also fit to measures.

desc: Read info...

slider1:1<0,1,1{NO,YES}>Sync
slider2:120<40,240,1>Tempo
slider3:4<1,8,1>Numerator
slider4:4<1,8,1>Denominator
slider5:800<60,3200,10>1. Tone (Hz)
slider6:-6<-30,0,1>1. Tone (dB)
slider7:1600<60,3200,10>2. Tone (Hz)
slider8:-12<-30,0,1>2. Tone (dB)
slider9:25<10,500,1>Tone Length (ms)
slider10:0<0,3,1{Playing/Recording,Playing,Recording,Stopping}>While

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

@init
c_ampdB = 8.6858896380650365530225783783321;
//denorm = 10^-30;

time = 0;
click_count = 1000;

wave1_pos = 0;
wave2_pos = 0;

@slider
wave1_speed = (2*$pi*slider5)/srate;
volume1 = slider6 <= -30.0 ? 0.0 : exp(slider6/c_ampdB);

wave2_speed = (2*$pi*slider7)/srate;
volume2 = slider8 <= -30.0 ? 0.0 : exp(slider8/c_ampdB);

fade_out = exp(30/max(slider9*srate/1000,0)/c_ampdB);

@block
slider1 ? (
slider2 = tempo;
sliderchange(2);
slider3 = ts_num;
sliderchange(3);
slider4 = ts_denom;
sliderchange(4);
clicks_per_sec = ((tempo*ts_denom*0.25)/60);
):(
ts_num = slider3;
ts_denom = slider4;
clicks_per_sec = ((slider2*ts_denom*0.25)/60);
);

bx = 1/(srate/clicks_per_sec);

@sample
spl0 = spl0 + sin(wave1_pos)*volume1*vol1c + sin(wave2_pos)*volume2*vol2c;
(wave1_pos += wave1_speed) > 2*$pi ? wave1_pos -= 2*$pi;
spl1 = spl1 + sin(wave1_pos)*volume1*vol1c + sin(wave2_pos)*volume2*vol2c;
(wave2_pos += wave2_speed) > 2*$pi ? wave2_pos -= 2*$pi;

mode = (slider10 == 0 ? (play_state == 1) || (play_state == 5) : (slider10 == 1 ? (play_state == 1) : (slider10 == 2 ? (play_state == 5) : (play_state == 0))));

mode ?
(
// 2nd click
(time += bx) > 1 ? (
vol2c = 1; time-=1; click_count+=1;
wave2_pos = 0;
):(
vol2c /= fade_out;
//vol2c < denorm ? vol2c=0;
);

// 1st click
click_count >= ts_num ? (
wave1_pos = click_count = 0; vol1c = 1; vol2c = 0;
):(
vol1c /= fade_out;
//vol1c < denorm ? vol1c=0;
);
):(
vol2c=0;
vol1c=0;
);
