// 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:1<1,16,1>1. Channel
slider6:36<0,127,1>1. Note
slider7:96<0,127,1>1. Note Velocity
slider8:1<1,16,1>2. Channel
slider9:38<0,127,1>2. Note
slider10:96<0,127,1>2. Note Velocity
slider11:100<10,500,10>Note Length (ms)
slider12:0<0,3,1{Playing/Recording,Playing,Recording,Stopping}>While

in_pin:none
out_pin:none

@init
time = 0;
click_count = 1000;

@slider
chan1 = slider5-1;
note1 = slider6;
chan2 = slider8-1;
note2 = slider9;

midisendon1 = 9*16+chan1;
midisendon2 = 9*16+chan2;
midisendoff1 = 8*16+chan1;
midisendoff2 = 8*16+chan2;

length = slider11/1000*srate;

velocity1 = slider7;
velocity2 = slider10;

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

blockpos = 0;

@sample
mode = (slider12 == 0 ? (play_state == 1) || (play_state == 5) : (slider12 == 1 ? (play_state == 1) : (slider12 == 2 ? (play_state == 5) : (play_state == 0))));

mode ?
(
// 2nd click
(time += bx) > 1 ? (
time -= 1;
click_count += 1;
click_count < ts_num ? (
midisend(blockpos, midisendon2, note2|velocity2*256);
send2 = 1;);
):(
send2 >= length ? (
send2 = 0;
midisend(blockpos, midisendoff2, note2);
):(send2 ? send2+=1);
);

// 1st click
click_count >= ts_num ? (
midisend(blockpos, midisendon1, note1|velocity1*256);
click_count = 0;
send1 = 1;
):(
send1 >= length ? (
send1 = 0;
midisend(blockpos, midisendoff1, note1);
):(send1 ? send1+=1);
);
);

blockpos += 1;
