From d753eedb901c1ead239f8f288d887af292f3ce66 Mon Sep 17 00:00:00 2001 From: Aria Date: Sat, 10 Jan 2026 11:20:17 -0600 Subject: [PATCH] Make latency consistent across all cps --- packages/core/repl.mjs | 3 ++- packages/core/time.mjs | 9 +++++++++ packages/midi/midi.mjs | 6 ++++-- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/packages/core/repl.mjs b/packages/core/repl.mjs index 4d59f5990..77ceac8c5 100644 --- a/packages/core/repl.mjs +++ b/packages/core/repl.mjs @@ -2,7 +2,7 @@ import { NeoCyclist } from './neocyclist.mjs'; import { Cyclist } from './cyclist.mjs'; import { evaluate as _evaluate } from './evaluate.mjs'; import { errorLogger, logger } from './logger.mjs'; -import { setTime } from './time.mjs'; +import { setCpsFunc, setTime } from './time.mjs'; import { evalScope } from './evaluate.mjs'; import { register, Pattern, isPattern, silence, stack } from './pattern.mjs'; @@ -61,6 +61,7 @@ export function repl({ // NeoCyclist uses a shared worker to communicate between instances, which is not supported on mobile chrome const scheduler = sync && typeof SharedWorker != 'undefined' ? new NeoCyclist(schedulerOptions) : new Cyclist(schedulerOptions); + setCpsFunc(() => scheduler.cps); let pPatterns = {}; let anonymousIndex = 0; let allTransform; diff --git a/packages/core/time.mjs b/packages/core/time.mjs index 80daaf53c..3d94a694c 100644 --- a/packages/core/time.mjs +++ b/packages/core/time.mjs @@ -1,4 +1,5 @@ let time; +let cpsFunc; export function getTime() { if (!time) { throw new Error('no time set! use setTime to define a time source'); @@ -9,3 +10,11 @@ export function getTime() { export function setTime(func) { time = func; } + +export function setCpsFunc(func) { + cpsFunc = func; +} + +export function getCps() { + return cpsFunc?.(); +} diff --git a/packages/midi/midi.mjs b/packages/midi/midi.mjs index d4f6093a0..6233bf60d 100644 --- a/packages/midi/midi.mjs +++ b/packages/midi/midi.mjs @@ -5,7 +5,7 @@ This program is free software: you can redistribute it and/or modify it under th */ import * as _WebMidi from 'webmidi'; -import { Hap, Pattern, TimeSpan, getTime, isPattern, logger, ref, reify } from '@strudel/core'; +import { Hap, Pattern, TimeSpan, getCps, getTime, isPattern, logger, ref, reify } from '@strudel/core'; import { noteToMidi, getControlName } from '@strudel/core'; import { Note } from 'webmidi'; import { scheduleAtTime } from '../superdough/helpers.mjs'; @@ -586,7 +586,9 @@ export async function midikeys(input) { const [note, velocity] = dataBytes; const noteoff = message.command === 8; const key = `${input}_${note}`; - const t = getTime() + 0.03; // slight delay so it's not too late for cyclist to catch + const cps = getCps() ?? 0.5; + const latencySeconds = 0.06; // slight delay so it's not too late for cyclist to catch + const t = getTime() + latencySeconds * cps; const span = new TimeSpan(t, t); let value = { midikey: key }; if (noteoff) {