Someone here helped me with this script a while ago to do exactly what you want:
Code:
desc:MIDI time adjustment
slider1:0<-2000,2000,1>delay amount (ms)
slider2:0<-3840,3840,1> or (ticks)
slider4:0<-44100,44100,1>additional delay amount (samples)
slider6:0<-150000,150000,1>=> resulting delay (samples)
slider7:0<-150000,150000,1> (ticks)
in_pin:none
out_pin:none
// ------------------------------------------
@init
ext_noinit = 1;
bpos=0;
ticksperbeat = 960;
delaylenXX = 0;
// ------------------------------------------
@slider
slider4 = (slider4 | 0);
slider1 != old_s1 ? (
old_s1 = slider1;
slider2 = 0;
old_s2 = 0;
delaylenXX = (slider1 * srate * 0.001) | 0;
):(
slider2 != old_s2 ? (
old_s2 = slider2;
slider1 = 0;
old_s1 = 0;
delaylenXX = (slider2 / ticksperbeat * 60 / tempoX *srate) | 0;
); );
delaylen = delaylenXX + slider4;
delaylen<0?(
pdc_delay=-delaylen;
pdc_top_ch=2;
pdc_bot_ch=0;
delaylen=0;
pdc_midi = 1;
):(
delaylen+=pdc_delay;
pdc_delay=0;
);
bufsize=srate *2.0 * 4.0; // extra in case the user wants to go over
slider6 = delaylenXX +slider4;
slider7 = ((slider6 / srate * tempoX / 60 * ticksperbeat) * 100 | 0) / 100;
// ------------------------------------------
@sample
tempoX = tempo;
midirecv(mpos, msg1, msg23) ? (
msg = (msg1 / 16) | 0;
channel = 1 + msg1 - (msg * 16); // result is 01 .. 16
msg_number = msg23 & 127;
msg_value = (msg23 / 256) | 0;
bpos[0] = msg1;
bpos[1] = msg23;
):(
bpos[0] = 0;
bpos[1] = 0;
);
rdpos=bpos-delaylen*2;
rdpos<0 ? rdpos+=bufsize*2;
rdpos[0] > 0 && rdpos[1] > 0 ? (
msg1 = rdpos[0];
msg23 = rdpos[1];
midisend(mpos, msg1, msg23);
);
bpos+=2;
bpos>=bufsize*2 ? bpos=0;
Move the "delay" slider to the left for negative delay.
If you don't know what to do with this, PM me and I can email the file to you.