diff --git a/packages/core/cyclist.mjs b/packages/core/cyclist.mjs index 2251dcf60..08b893752 100644 --- a/packages/core/cyclist.mjs +++ b/packages/core/cyclist.mjs @@ -37,12 +37,17 @@ export class Cyclist { this.lastBegin = begin; const end = this.num_cycles_at_cps_change + num_cycles_since_cps_change; this.lastEnd = end; + this.lastTick = phase; + + if (phase < t) { + // avoid querying haps that are in the past anyway + console.log(`skip query: too late`); + return; + } // query the pattern for events const haps = this.pattern.queryArc(begin, end, { _cps: this.cps }); - this.lastTick = phase; - haps.forEach((hap) => { if (hap.hasOnset()) { const targetTime = diff --git a/packages/core/zyklus.mjs b/packages/core/zyklus.mjs index 0fb4ccc4d..a09ace8c8 100644 --- a/packages/core/zyklus.mjs +++ b/packages/core/zyklus.mjs @@ -26,8 +26,7 @@ function createClock( // callback as long as we're inside the lookahead while (phase < lookahead) { phase = round ? Math.round(phase * precision) / precision : phase; - phase >= t && callback(phase, duration, tick, t); - phase < t && console.log('TOO LATE', phase); // what if latency is added from outside? + callback(phase, duration, tick, t); // callback has to skip / handle phase < t! phase += duration; // increment phase by duration tick++; } diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index f899052f3..c0ba96e06 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -273,6 +273,12 @@ export const superdough = async (value, t, hapDuration) => { value.duration = hapDuration; // calculate absolute time t = typeof t === 'string' && t.startsWith('=') ? Number(t.slice(1)) : ac.currentTime + t; + if (t < ac.currentTime) { + console.warn( + `[superdough]: cannot schedule sounds in the past (target: ${t.toFixed(2)}, now: ${ac.currentTime.toFixed(2)})`, + ); + return; + } // destructure let { s = 'triangle',