cool ideas. i should have given my gear for reference, as well as the fact that i hope to achieve this with midi rather than with more direct sample-editing/looping techniques.
jjos128xl, reaper, a boatload of midi fx (vst and js). you can step anywhere between them.
REAPER comes with a simple js note repeater function. there is 1 parameter: size (in beats).

js is easily configurable. code is at the bottom. i'm realizing that i could clone this fx and simply tweak the upper/lower threshold for the slider. assign the slider to a CC, create a learned bypass switch, route the midi output to the mpc and boom, liquid note repeat.
the only things i'd have to change are in the slider1:1 line at the very top: <low, increment, high>
Code: Select alldesc:simple MIDI note repeater
slider1:1<0.1,4>size (beats)
@init
status=0;
status2=128;
memset(status,-1,128);
memset(status2,0,128);
@slider
div=slider1;
@block
while (
midirecv(ts,msg1,msg23) ?
(
m=msg1&240;
note=msg23&127;
(m == 9*16 && msg23>=256) ? (
status[note]=0;
vel=(msg23/256);
vel<1?vel=1:vel>=127?vel=127:vel|=0;
status2[note]=vel;
midisend(ts,9*16,note+vel*256); // send note on
) : (m == 8*16 || m == 9*16) ? (
status[note]=-1;
status2[note]>0.0 ? (
midisend(ts,8*16,note); // send note off
status2[note]=0;
);
) : (
midisend(ts,msg1,msg23);
);
bla=1;
);
);
inc = samplesblock/srate*(tempo/60)*2/div;
x=0;
loop(128,
status[x]>=0.0 ?
(
status[x] += inc;
status[x] >= 1.0 ?
(
status[x] -= 1.0;
status2[x]>0.0 ? midisend(0,8*16,x) : midisend(0,9*16,x - status2[x]*256);
status2[x]*=-1;
);
);
x+=1;
);
@sample