/*
Time Delay
-------------
Put it at the start of a chain, as it delays midi.

Can also Pre-delay MIDI, and control MIDI pan	
*/

desc: Read info...

slider1:0<0,10,0.001>Seconds
slider2:0<0,192000,1>Samples
slider3:0<0,1,1>x1 Beats
slider4:0<0,2,1>x1/2 Beats
slider5:0<0,4,1>x1/4 Beats
slider6:0<0,8,1>x1/8 Beats
slider7:0<0,16,1>x1/16 Beats
slider8:0<0,32,1>x1/32 Beats
slider9:0<0,64,1>x1/64 Beats
slider10:0<0,128,1>x1/128 Beats
slider11:1<0,1,1{Pre (delay Audio too),Post}>Pre/Post
slider12:0<-64,63,1>MIDI Pan (0..127)
slider13:1<1,16,1>MIDI Channel

@init

//ext_noinit = 1;

//MIDIBuf = 0;
//TimeBuf = 4096;

@slider

len0=(srate*slider1)+slider2;

len1=slider3;
len1+=slider4*0.5;
len1+=slider5*0.25;
len1+=slider6*0.125;
len1+=slider7*0.0625;
len1+=slider8*0.03125;
len1+=slider9*0.015625;
len1+=slider10*0.0078125;
len1*=srate;

myTempo = 0;

slider11 &= 1;

slider12 |= 0;
(slider12 < -64) ? slider12 = -64 : (slider12 > 64) ? slider12 = 63;

MIDIchannel = (slider13 - 1) & $x0F;

@block

(myTempo != tempo) ?
(
myTempo = tempo;
MIDILen = floor((len1*(myTempo/60))+len0);

(slider11) ?
(
pdc_delay = 0;
pdc_midi = 0;

MIDIPtr1 = 0;
MIDIPtr2 = 0;
TimePos1 = 0;
TimePos2 = 0 - MIDILen;
lastmsgpos = 0;
) :
(
pdc_delay = MIDILen;
pdc_top_ch=32;  // 1+top spl
pdc_bot_ch=30;  // start spl
pdc_midi = 1;
);
freembuf(1048576);
);
(slider12 != sMIDIpan) ?
(
sMIDIpan = slider12;
midisend(0,MIDIchannel|$x00B0,10|((sMIDIpan + 64)*256));  // send Pan CC
);

(slider11) ?
(
// MIDI - buffering
while
(
midirecv(msgpos,msg1,msg23) ?
(
TimePos1 += msgpos - lastmsgpos;
(MIDIPtr1 != MIDIPtr2) ?
(
(TimePtr1 >= 1048576) ? TimePtr = 1;
TimePtr1[] = TimePos1;
TimePtr1 += 2;
) : (TimePtr1 = MIDIPtr1 + 1; TimeLen = TimePos1);
(MIDIPtr1 >= 1048575) ? MIDIPtr1 = 0;
MIDIPtr1[] = (msg1 * 65536) + msg23;
lastmsgpos = msgpos;
TimePos1 = 0;
MIDIPtr1 += 2;
);
);
TimePos1 += samplesblock;
msgpos = 0;
);

@sample

(slider11) ?
(
// MIDI - sending
while
(
(MIDIPtr1 != MIDIPtr2) ?
(
(TimePos2 >= TimeLen) ?
(
TimePos2 = 0;
(MIDIPtr2 >= 1048575) ? MIDIPtr2 = 0;
msg23 = MIDIPtr2[];
msg1 = (msg23 / 65536) & $x00FF;
msg23 &= $x0FFFF;
midisend(msgpos,msg1,msg23);
TimeLen = MIDIPtr2[1];
MIDIPtr2 += 2;
);
);
);

TimePos2 += 1;
msgpos += 1;
);
