desc:MIDI Time Adjustment

slider1:0<-2000,2000,1>Delay (ms)
slider2:0<-3840,3840,1>Delay (ticks)
slider4:0<-44100,44100,1>Additional Delay Amount (spls)

//slider6:0<-150000,150000,1>=> Resulting delay (spls)
//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;

