What I'm talking about here is the ability to jump to any arbitrary absolute position within a currently playing clip. The ability to jump to beat 1, beat 5, beat 10.5 within a clip.
Honestly, the move_playing_pos function is a poor substitute for this API call. Except for some niche cases, who really cares about moving the playhead relative to the current position, but rather moving the playhead to an absolute position regardless of where it is currently? I think I've thrown every trick in the book at the problem of creating a true bufferless Live session clip chopping patch, so let me document my pain here:
First Attempt:
Try to use move_playing_pos function in conjunction with observing the current position, and then doing some relative beat arithmetic combined with a metronome trigger in a attempt to get the result be a whole number. As anyone else that's tried this has probably realized, you don't get consistent results. You can attempt to call move_playing_pos precisely on beat 3, subtract 2, and end up on beat 1, but depending on your latency you'll end up on beat 1.12034242, or 0.95315, or 1.203444, etc. You can try to compensate for the latency, but this approach is fundamentally flawed because the amount of latency is not consistent. I've put clips in retrigger loops to test the patch and always end up with something that dances ever-so-slightly around the beat you're aiming for. For kicks and snare retriggering which have very quick attacks, this ends up sounding terrible.
I believe this is the current approach of the Live Clip Chopper guys.
Second Attempt:
Putting the arrangement view in a 4 bar loop, creating a set of arrangement view cue points at set intervals, and binding them to keys and triggering the cue points to manipulate the arrangement clock. This actually works surprisingly well. The loop in the arrangement view doesn't affect the playback of session clips, but the triggering of the cue point moves the session clip playhead exactly like you'd want. There is one big flaw that keeps this from being viable, however: it globally affects all currently running session clips. This, of course, makes sense considering what its doing (manipulating the play clock), but sadly makes it nonviable as a method for chopping multiple running clips separate of each other.
Third Attempt:
I thought I was being particularly clever with the next approach, although it appears others have come up with it as well: move the start marker to the desired location and then instantly retrigger the clip. This works...ok. The problems with this approach are as follows:
1) Live compensates for movement of the start marker to ensure that the playhead keeps the same relative distance from it. So if you move the start marker to a position 2 beats later in a clip, the playhead will also instantly jump 2 beats forward. Move it to a position 8 beats earlier, the playhead jumps 8 beats back. Whether this is intentional or a product of how this data is internally represented I don't know, but to overcome this you have to trigger the start marker move as soon as possible before retriggering the clip, and still I've noticed certain jumps (beat 7.75 to beat 1 in particular) comes with a noticeable audio drop, even with the clips stored in RAM.
2) The API call to change the clip start marker position changes when the clip is looped to move the loop start marker. While I'm sure it seemed clever and efficient during the design of the API, it unfortunately runs afoul of this use case, leaving me unable to loop clips if I want to manipulate the start marker. Sure, I could quickly turn off looping for the clip, make the change, and then turn looping back on, but that leads to...
3) The Live anti-feedback system. When you start piling on the hacks, sooner or later you hit this restrictive little bugger. While undoubtedly necessary to keep us hackers from bringing Live to its knees, the accursed "Changes cannot be triggered by notifications" message is maddeningly restrictive. Ok, so I want to move the start marker, but first query the looped state, deactivate looping if enabled, move the start marker, then reactivate the loop. Whoops, you're making a decision based off a notification, so no dice. Even if you "deferlow" your logic like mad, it'll still pop up occasionally, causing a small percentage of actions to fail.
Fourth Attempt:
This is more an extension of the start marker manipulation, and is what I am currently using. In order to circumvent audio problems from moving the start marker on a playing clip and retriggering, I make a copy of the clip, and alternate firing between each clip. In concept, this is actually pretty similar to beat juggling on two decks with identical records. I "cue" the second clip by setting its start marker, then trigger it, cue the first clip's start marker, trigger it, ad infinitum. While the end result is the best sounding solution I've gotten, setting the start marker on a non-playing clip removes any audio issues and drops from manipulating the currently playing clip, the obvious issue of having to manage a second, identical copy of a clip (either creating it myself, or using keyboard macros since the Live API can't create and destroy clips currently) is a hassle and inefficient. Also, point 2) and 3) are still unresolved (although I've managed to work around them mostly by abandoning Live's loop feature and making loops through retriggering clips).
This ended up being a longer rant then I planned, but as you can see the road to absolute clip position manipulation has been a LONG one for me. I'm hoping this gets some attention from the Ableton crew (although I'm hoping they probably already have this feature on their roadmap). Anyone else figure out any better strategies? I'm going to take a look at the Live Clip Chopper code tonight, maybe they figure out something I didn't