I just uploaded this – it’s one thing to read about how to use sync methods, and another thing to see them in action.
hjh
I just uploaded this – it’s one thing to read about how to use sync methods, and another thing to see them in action.
hjh
Thanks a lot! Very helpful and super clear explanation!
Thanks, great explanation. I would love to see Link support in Tidal Cycles, would be perfect to sync it with Supercollider I think. But not easy to implement apparently: https://github.com/tidalcycles/Tidal/issues/660
That’s true – Tidal is its own client with its own scheduling mechanism, so there’s little that SC can do to help with that.
I’ve run my own live coding system (100% SC) alongside other software using Link and it’s so cool for live coding. Looking forward to a Tidal person improving the Link support on their side.
hjh
Update: I’ve added latency compensation to MIDISyncClock. You can now manually specify a number of ticks by which to offset the time for which processes are scheduled.
You have to tune it manually – it isn’t calculated automatically from latency and tempo, because you may or may not need to account for audio driver latency.
The clock time passed to processes will be different from normal TempoClock. For most processes, this shouldn’t be an issue. If the process depends on specific numbers of beats, you might have problems with it. (I tried an approach to deal with that, but ran into unexpected problems and also ran out of time. Would welcome solutions from others.) Edit, one day later: After finding bugs with that approach, I thought of a simpler way today. Now, the clock time passed in will be consistent; instead, the time base shifts. It’s much more reliable.
It will not support tempo changes well. I’m afraid I don’t have time to handle that properly.
Hope this is helpful to someone,
hjh
Link implementation in Tidal seems to have started.
He could use some (C++?) help though:
Ref tidal ticket https://github.com/tidalcycles/Tidal/issues/660 and short di…
Apologies for reviving this thread.
I’m having difficulty starting and stopping SC from an external DAW as demonstrated in the LinkClock
helpfile. For me, the suggested method to use SimpleController
does not appear to respond to Ableton transport commands. I’m currently using Ableton 12 and am wondering if perhaps others are successful in enabling control over SC from an external DAW. Or perhaps there better strategies?
Small note, (and really not a priory though its left me scratcing my head) the following line in the opening of @jamshark70’s code appears to chain assignments resulting in an error, though it works for James:
TempoClock.default = 1 = LinkClock.new.latency_(s.latency);
TempoClock.default = 1 = LinkClock.new.latency_(s.latency)
Use a lowercase l
instead of a 1
. l
(interpreter variable) is a valid target for an assignment; the integer 1
is not.
For me, the suggested method to use
SimpleController
does not appear to respond to Ableton transport commands.
Since that example says SimpleController(l)
, it won’t work if l
isn’t assigned a LinkClock. Perhaps check that first. (Or, if you ran SimpleController(1)
, then it definitely wouldn’t respond to .changed
messages from a clock.)
LinkClock code hasn’t changed in a long time, so I can’t think of a reason why the message callbacks would be broken.
hjh
Ah of course. In YouTube my eyes saw a number. I should have recognized my error. Thanks!
However I have been working with the included LinkClock object example files provided and overall it seems to work… Apart from handling the SimpleController functionality. I’m using Ableton 12 and SC 3.13. It would be nice to know if it is just me. Thanks!
Overall i guess I’m trying to find the best and most consistent way of an integrated workflow between both programmes without having to execute code in SC and then press play in Ableton etc. Perhaps it would be better to send OSC messages from a M4L object to start and stop programmes in SC. Having LinkClock really is a great resource for this though.
However I have been working with the included LinkClock object example files provided and overall it seems to work… Apart from handling the SimpleController functionality. I’m using Ableton 12 and SC 3.13.
That’s weird. Maybe something drifted in their implementation.
I don’t have a Link-capable DAW on my laptop, so I’m afraid I can’t do any testing. Anyone else care to try with Ableton or Logic?
hjh
I don’t have a Link-capable DAW on my laptop, so I’m afraid I can’t do any testing.
Ah but then I remembered, I do have Pure Data, whose abl_link~ external does send play/stop status.
TempoClock.default = l = LinkClock.new;
c = SimpleController(l)
.put(\linkStart, { "LC started".postln })
.put(\linkStop, { "LC stopped".postln });
Then, sending “play 1” → abl_link~ produces “LC started” in the SC post window, and “play 0” produces “LC stopped” – so in 3.13 at least, there’s no problem with the clock notifications.
So the problem could be either that the link wasn’t made (no communication), or the SimpleController was set up incorrectly, or maybe a problem on the DAW side (unlikely – except – I just remembered that some DAWs require an option to be set, to send play/stop, this might not be enabled by default).
hjh
Using Ableton Live 11, I have to go into preferences > Link tempo MIDI > start stop sync set to ON
and then James’s code will post when I start and stop playback.
I guess this doesn’t send any information about what beat number playback started on?