Skip to content

Low latency time manipulation #313

Open
@yaxu

Description

@yaxu

It's great that sync protocols like link solve synchronisation perfectly, so we don't have to think about it. However, there are downsides to that. As mentioned on tidal club, I'd like hands-on, low latency control of time, for turntable-style beat matching with other performers etc. E.g. I'd like to be able to play with percussionists, and follow them through tap tempo with jogwheel adjustments, being able to stop and restart time (potentially from cycle 0) at will with as low latency buttons as possible.

Currently tidal sends events to superdirt ahead of time, so it has time to process and schedule things. This means that the live coder has a lot of latency. That's fine in the usual case where they are triggering high-level changes rather than individual events, but not so good when e.g. midi controllers go via tidal.

A different approach would be to have time driven by superdirt. I don't think the link protocol is useful here however, it has some way to synchronise stopping and starting clocks, but no facility to align timelines beyond that, apart from setting a common beat modulo ('quantum').

So instead maybe the scheduler could run in superdirt, and request events from tidal ahead of time as before, via an OSC protocol. It could request say 16 cycles at a time, well ahead of time. It could also keep a history of events, then the live coder could jump forward and backward in time, start and stop it, and speed it up/slow it down/play it backwards immediately, without any pattern recalculation.

When tidal's pattern is changed it could tell superdirt, which would then request an update, in order to replace already scheduled events. Probably it wouldn't replace events that have already happened (although I'm not sure what happens with events that have happened but where we have jumped back in time so they're in the future again..)

At least I think superdirt should request both future events, and the events from the first few cycles.. So it's ready if the live coder suddenly wants to restart the current state of a pattern from the start.

Hope that makes some sense!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions