diff --git a/packages/core/neocyclist.mjs b/packages/core/neocyclist.mjs index 5c175dc1f..6f62bb132 100644 --- a/packages/core/neocyclist.mjs +++ b/packages/core/neocyclist.mjs @@ -8,7 +8,7 @@ import { logger } from './logger.mjs'; import { ClockCollator, cycleToSeconds } from './util.mjs'; export class NeoCyclist { - constructor({ onTrigger, onToggle, getTime }) { + constructor({ onTrigger, onToggle, getTime, latency = 0.1 }) { this.started = false; this.cps = 0.5; this.lastTick = 0; // absolute time when last tick (clock callback) happened @@ -20,7 +20,7 @@ export class NeoCyclist { // in order to schedule events consistently. this.collator = new ClockCollator({ getTargetClockTime: getTime }); this.onToggle = onToggle; - this.latency = 0.1; // fixed trigger time offset + this.latency = latency; // fixed trigger time offset this.cycle = 0; this.id = Math.round(Date.now() * Math.random()); this.worker = new SharedWorker(new URL('./clockworker.js', import.meta.url)); diff --git a/packages/core/repl.mjs b/packages/core/repl.mjs index aeaa6418e..5a5bba5df 100644 --- a/packages/core/repl.mjs +++ b/packages/core/repl.mjs @@ -18,6 +18,7 @@ export function repl({ editPattern, onUpdateState, sync = false, + latency = 0.1, setInterval, clearInterval, id, @@ -56,6 +57,7 @@ export function repl({ setInterval, clearInterval, beforeStart, + latency, }; // NeoCyclist uses a shared worker to communicate between instances, which is not supported on mobile chrome diff --git a/website/src/repl/components/panel/SettingsTab.jsx b/website/src/repl/components/panel/SettingsTab.jsx index cf2978a1a..2cc2ab6db 100644 --- a/website/src/repl/components/panel/SettingsTab.jsx +++ b/website/src/repl/components/panel/SettingsTab.jsx @@ -108,6 +108,7 @@ export function SettingsTab({ started }) { audioEngineTarget, togglePanelTrigger, maxPolyphony, + latency, multiChannelOrbits, isTabIndentationEnabled, isMultiCursorEnabled, @@ -165,6 +166,24 @@ export function SettingsTab({ started }) { value={maxPolyphony ?? ''} /> + + { + let v = parseFloat(e.target.value); + v = isNaN(v) ? 0.1 : v; + settingsMap.setKey('latency', v); + }} + onChange={(v) => { + v = parseFloat(v); + settingsMap.setKey('latency', isNaN(v) ? undefined : v); + }} + type="number" + placeholder="" + value={latency ?? 0.1} + /> +