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}
+ />
+