From e8f6124a07f8d61145e57629cc704ae4c9f5b270 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Fri, 22 Mar 2024 01:22:35 +0100 Subject: [PATCH] + make cyclist trigger backwards compatible for now + add absolute time as new 5th onTrigger param --- packages/core/cyclist.mjs | 9 ++++++--- packages/core/repl.mjs | 7 ++++--- packages/webaudio/webaudio.mjs | 4 +++- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/packages/core/cyclist.mjs b/packages/core/cyclist.mjs index 6a0b27ac..b0727ee5 100644 --- a/packages/core/cyclist.mjs +++ b/packages/core/cyclist.mjs @@ -23,7 +23,7 @@ export class Cyclist { this.clock = createClock( getTime, // called slightly before each cycle - (phase, duration) => { + (phase, duration, _, t) => { if (this.num_ticks_since_cps_change === 0) { this.num_cycles_at_cps_change = this.lastEnd; this.seconds_at_cps_change = phase; @@ -45,10 +45,13 @@ export class Cyclist { haps.forEach((hap) => { if (hap.hasOnset()) { - const deadline = + const targetTime = (hap.whole.begin - this.num_cycles_at_cps_change) / this.cps + this.seconds_at_cps_change + latency; const duration = hap.duration / this.cps; - onTrigger?.(hap, '=' + deadline, duration, this.cps); + // the following line is dumb and only here for backwards compatibility + // see https://github.com/tidalcycles/strudel/pull/1004 + const deadline = targetTime - phase; + onTrigger?.(hap, deadline, duration, this.cps, targetTime); } }); } catch (e) { diff --git a/packages/core/repl.mjs b/packages/core/repl.mjs index 626a5ae1..d2a61d96 100644 --- a/packages/core/repl.mjs +++ b/packages/core/repl.mjs @@ -166,14 +166,15 @@ export function repl({ export const getTrigger = ({ getTime, defaultOutput }) => - async (hap, deadline, duration, cps) => { + async (hap, deadline, duration, cps, t) => { + // TODO: get rid of deadline after https://github.com/tidalcycles/strudel/pull/1004 try { if (!hap.context.onTrigger || !hap.context.dominantTrigger) { - await defaultOutput(hap, deadline, duration, cps); + await defaultOutput(hap, deadline, duration, cps, t); } if (hap.context.onTrigger) { // call signature of output / onTrigger is different... - await hap.context.onTrigger(getTime() + deadline, hap, getTime(), cps); + await hap.context.onTrigger(getTime() + deadline, hap, getTime(), cps, t); } } catch (err) { logger(`[cyclist] error: ${err.message}`, 'error'); diff --git a/packages/webaudio/webaudio.mjs b/packages/webaudio/webaudio.mjs index 7f28b8b7..f82a436a 100644 --- a/packages/webaudio/webaudio.mjs +++ b/packages/webaudio/webaudio.mjs @@ -16,7 +16,9 @@ const hap2value = (hap) => { }; export const webaudioOutputTrigger = (t, hap, ct, cps) => superdough(hap2value(hap), t - ct, hap.duration / cps, cps); -export const webaudioOutput = (hap, deadline, hapDuration) => superdough(hap2value(hap), deadline, hapDuration); +// uses more precise, absolute t if available, see https://github.com/tidalcycles/strudel/pull/1004 +export const webaudioOutput = (hap, deadline, hapDuration, cps, t) => + superdough(hap2value(hap), t ? `=${t}` : deadline, hapDuration); Pattern.prototype.webaudio = function () { return this.onTrigger(webaudioOutputTrigger);