Escaping loop right at the end of a bar plays the next section twice

Describe your issue here:

I’ve hit this issue a few times now during performances the last two nights, where if I hit “GO” (/setlist/go) right on the bar line, the next section (or at least bar) is played twice. I’ve now managed to replicate it on video, and have logs.

(I’ve turned down the audio on this video because I accidentally included the timecode in the recording)

Logs (can’t seem to upload directly) https://drive.google.com/file/d/1ko8PyKgWGk0ue6IhuilhCvTtvUdE8wL-/view?usp=sharing

This seems to be the important bit of the logs:

{"address":"/canvas/executeOsc","args":["/setlist/go","GO","uuid=wchhkCrDKcDr3Ymcm5zUZk"],"ip":"192.168.1.134","level":"debug","message":"Received WebSocket OSC message","module":"osc","timestamp":"2025-06-06T04:21:44.005Z"}
{"command":{"address":"/setlist/go"},"level":"info","message":"Running command","module":"osc-commands","timestamp":"2025-06-06T04:21:44.005Z"}
{"address":"/setlist/go","args":["uuid=wchhkCrDKcDr3Ymcm5zUZk-2"],"level":"info","message":"Processing internal OSC command","module":"osc","timestamp":"2025-06-06T04:21:44.005Z"}
{"command":"escapeLoop","count":0,"level":"info","message":"Sending command to hosts","module":"udp-server","timestamp":"2025-06-06T04:21:44.006Z","uuid":"wchhkCrDKcDr3Ymcm5zUZk-2"}
{"isCountingIn":false,"lastSongTime":4482.935708333333,"level":"info","message":"Loop escape queued:","module":"setlist","queued":true,"timestamp":"2025-06-06T04:21:44.009Z"}
{"isCountingIn":false,"lastSongTime":4482.935708333333,"level":"info","message":"Jumping to time","module":"setlist","queueCue":true,"time":4483,"timestamp":"2025-06-06T04:21:44.009Z"}
{"delay":null,"isCountingIn":false,"lastSongTime":4482.935708333333,"level":"info","message":"Song countdown:","module":"setlist","timestamp":"2025-06-06T04:21:44.010Z"}
{"cue":"> b73.5","jumpTime":4483,"level":"info","message":"Cue exists, jumping to cue","module":"setlist","timestamp":"2025-06-06T04:21:44.010Z"}
{"isCountingIn":false,"lastSongTime":4482.935708333333,"level":"info","loopBracketEnabled":false,"message":"Is loop bracket enabled:","module":"setlist","timestamp":"2025-06-06T04:21:44.023Z"}
{"isCountingIn":false,"lastSongTime":4482.935708333333,"level":"info","message":"Queued cue:","module":"setlist","timestamp":"2025-06-06T04:21:44.031Z"}
{"isCountingIn":false,"lastSongTime":4482.935708333333,"level":"info","message":"Queued song:","module":"setlist","timestamp":"2025-06-06T04:21:44.031Z"}
{"cueChanged":true,"currentNextTime":4485,"isPlaying":true,"level":"info","message":"Updating active cue","module":"setlist","oldNextTime":4483,"timestamp":"2025-06-06T04:21:44.031Z"}
{"id":"live_13677818736","isCountingIn":false,"lastSongTime":4483.015708333333,"level":"info","message":"Active cue:","module":"setlist","name":"> b73.5","timestamp":"2025-06-06T04:21:44.031Z"}
{"isCountingIn":false,"lastSongTime":4483.015708333333,"level":"info","message":"Loop escape queued:","module":"setlist","queued":false,"timestamp":"2025-06-06T04:21:44.031Z"}
{"id":"live_13677818736","isCountingIn":false,"lastSongTime":4483.015708333333,"level":"info","message":"Matched cue:","module":"setlist","name":"> b73.5","timestamp":"2025-06-06T04:21:44.031Z"}
{"currentCue":"> b73.5","level":"info","message":"Playback started from cue, not doing any checks.","module":"setlist","timestamp":"2025-06-06T04:21:44.031Z"}
{"activeCueTime":4483,"isLoopBracketEnabled":false,"level":"info","loopBracketLength":2,"loopBracketStart":4481,"message":"Updating guide tracks:","module":"setlist","nextCueTime":4485,"timestamp":"2025-06-06T04:21:44.111Z"}
{"level":"info","loopGuide":false,"message":"Setting guide track state:","module":"setlist","primaryGuide":true,"timestamp":"2025-06-06T04:21:44.111Z"}
{"id":"live_13677802008","isCountingIn":false,"lastSongTime":4484.655708333334,"level":"info","message":"Matched cue:","module":"setlist","name":"> b74","timestamp":"2025-06-06T04:21:44.849Z"}
{"currentActiveCue":"> b73.5","level":"info","matchedCue":"> b74","matchingCue":"> b74","message":"Starting checks for new cue","module":"setlist","timestamp":"2025-06-06T04:21:44.849Z"}
{"isCountingIn":false,"lastSongTime":4483.035708333334,"level":"warn","message":"Jumped while playing, likely triggered externally","module":"setlist","songTimeDistance":1.8799999999991996,"timestamp":"2025-06-06T04:21:45.030Z"}
{"id":"live_13677818736","isCountingIn":false,"lastSongTime":4483.035708333334,"level":"info","message":"Matched cue:","module":"setlist","name":"> b73.5","timestamp":"2025-06-06T04:21:45.030Z"}
{"currentCue":"> b73.5","level":"info","message":"Playback started from cue, not doing any checks.","module":"setlist","timestamp":"2025-06-06T04:21:45.030Z"}
{"id":"live_13677802008","isCountingIn":false,"lastSongTime":4484.675708333333,"level":"info","message":"Matched cue:","module":"setlist","name":"> b74","timestamp":"2025-06-06T04:21:45.849Z"}
{"currentActiveCue":"> b73.5","level":"info","matchedCue":"> b74","matchingCue":"> b74","message":"Starting checks for new cue","module":"setlist","timestamp":"2025-06-06T04:21:45.850Z"}
{"cueChanged":true,"currentNextTime":4505,"isPlaying":true,"level":"info","message":"Updating active cue","module":"setlist","oldNextTime":4485,"timestamp":"2025-06-06T04:21:46.009Z"}
{"id":"live_13677802008","isCountingIn":false,"lastSongTime":4484.995708333333,"level":"info","message":"Active cue:","module":"setlist","name":"> b74","timestamp":"2025-06-06T04:21:46.010Z"}
{"activeCueTime":4485,"isLoopBracketEnabled":false,"level":"info","loopBracketLength":2,"loopBracketStart":4481,"message":"Updating guide tracks:","module":"setlist","nextCueTime":4505,"timestamp":"2025-06-06T04:21:46.090Z"}
{"level":"info","loopGuide":false,"message":"Setting guide track state:","module":"setlist","primaryGuide":true,"timestamp":"2025-06-06T04:21:46.091Z"}

Particularly these two lines:

{"currentCue":"> b73.5","level":"info","message":"Playback started from cue, not doing any checks.","module":"setlist","timestamp":"2025-06-06T04:21:44.031Z"}
...
{"currentCue":"> b73.5","level":"info","message":"Playback started from cue, not doing any checks.","module":"setlist","timestamp":"2025-06-06T04:21:45.030Z"}

which (if I’m interpreting it correctly) show it jumping back to the same cue twice without other input.

I realised I’ve been running beta 6 in rehearsals and beta 7 on my production machine, and I haven’t had this in rehearsals, so I’m going to downgrade to beta 6 for the moment. I’d test it on the new beta 8, but I don’t have the time right now, and don’t want to risk using that in production given your warning about it being a big refactor.

Please fill out these values to make it easier to troubleshoot:

  • OS and Version: macOS Sequoia
  • Version of AbleSet: 3.0.0-beta.7
  • Version of Ableton Live: 11.3.42

Unfortunately I’ve just managed to replicate the issue in beta.6 as well :frowning: I’d go back to v2, but I need the improvements you made to the Go command

I’ve also replicated it on a handful of different vamps

Any chance there’s a setting I could enable or disable that might change the behaviour that’s causing this bug?

Hey @dbarrell,

Thank you for reporting this issue!

When you escape a regular loop, AbleSet triggers the locator that follows it, in your case that would be “b73.5”. It seems that Live receives this jump command too late which means the playhead has already crossed that locator and Live will jump to it again.

I’ll look into fixing this in the next beta. In the meantime, replacing +LOOP with +LOOPFULL should work around this issue. With this flag, AbleSet just disables the loop bracket when you escape the loop.

I hope this helps :slight_smile:

That certainly makes sense! I was assuming it’d be something like that. Out of curiosity, with a +LOOP, are you first disabling the loop bracket, then jumping to the next locator? Or just jumping?

If it’s the former, could you reverse the order of operations (jump then disable)?

If it’s the latter, that reveals something interesting as to how loops work in ableton, that even when the loop is enabled, the playhead still actually does pass the next locator before jumping back.

Thanks for the workaround! I had only used +LOOPFULL when I had loops of two or more bars, but I’ll go and add it to the rest. There are still some multi-bar loops I need to jump out of at any bar though, so the risk is still there, but this’ll be much better.

Hey @dbarrell,

When escaping a loop, AbleSet first disables the loop bracket and then jumps to the locator of the next section. I could imagine that in some scenarios, the playhead crosses the locator before Live receives the command to jump to it, which would lead to the behavior you experienced.

Let me know if using +LOOPFULL works as a workaround for you :slight_smile: