From 796f741a928b8185558edfe3e571d88d18fab4d8 Mon Sep 17 00:00:00 2001 From: "Jade (Rose) Rowland" Date: Fri, 16 Aug 2024 10:46:18 -0400 Subject: [PATCH] use performance clock for osc mode --- packages/core/util.mjs | 5 +++++ packages/osc/osc.mjs | 1 + packages/osc/superdirtoutput.js | 5 ++--- packages/superdough/superdough.mjs | 4 ++++ website/src/repl/useReplContext.jsx | 12 +++++++----- 5 files changed, 19 insertions(+), 8 deletions(-) diff --git a/packages/core/util.mjs b/packages/core/util.mjs index 1958a896..ac8ed8f8 100644 --- a/packages/core/util.mjs +++ b/packages/core/util.mjs @@ -412,6 +412,11 @@ export class ClockCollator { } } + +export function getPerformanceTimeSeconds() { + return performance.now() / 1000 +} + // Floating point versions, see Fraction for rational versions // // greatest common divisor // export const gcd = function (x, y, ...z) { diff --git a/packages/osc/osc.mjs b/packages/osc/osc.mjs index 8c063095..757da5f5 100644 --- a/packages/osc/osc.mjs +++ b/packages/osc/osc.mjs @@ -34,6 +34,7 @@ function connect() { return connection; } +// const collator = new ClockCollator({getTargetClockTime: () => (performance.now() + performance.timeOrigin) / 1000}); const collator = new ClockCollator({}); export async function oscTrigger(t_deprecate, hap, currentTime, cps = 1, targetTime) { diff --git a/packages/osc/superdirtoutput.js b/packages/osc/superdirtoutput.js index 7a08a3f5..d35f0a5f 100644 --- a/packages/osc/superdirtoutput.js +++ b/packages/osc/superdirtoutput.js @@ -1,12 +1,11 @@ import { oscTriggerTauri } from '../desktopbridge/oscbridge.mjs'; import { isTauri } from '../desktopbridge/utils.mjs'; -import { getAudioContext } from '../superdough/superdough.mjs'; import { oscTrigger } from './osc.mjs'; + const trigger = isTauri() ? oscTriggerTauri : oscTrigger; export const superdirtOutput = (hap, deadline, hapDuration, cps, targetTime) => { - const ctx = getAudioContext(); - const currentTime = ctx.currentTime; + const currentTime = performance.now() / 1000 return trigger(null, hap, currentTime, cps, targetTime); }; diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 01569788..376c482e 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -87,6 +87,10 @@ export const getAudioContext = () => { return audioContext; }; +export function getAudioContextCurrentTime() { + return getAudioContext().currentTime +} + let workletsLoading; function loadWorklets() { if (!workletsLoading) { diff --git a/website/src/repl/useReplContext.jsx b/website/src/repl/useReplContext.jsx index 55f12faa..58ac10b9 100644 --- a/website/src/repl/useReplContext.jsx +++ b/website/src/repl/useReplContext.jsx @@ -4,11 +4,11 @@ Copyright (C) 2022 Strudel contributors - see . */ -import { code2hash, logger, silence } from '@strudel/core'; +import { code2hash, getPerformanceTimeSeconds, logger, silence } from '@strudel/core'; import { getDrawContext } from '@strudel/draw'; import { transpiler } from '@strudel/transpiler'; import { - getAudioContext, + getAudioContextCurrentTime, webaudioOutput, resetGlobalEffects, resetLoadedSounds, @@ -56,8 +56,10 @@ async function getModule(name) { } export function useReplContext() { - const { panelPosition, isZen, isSyncEnabled, audioEngineTarget } = useSettings(); - const defaultOutput = audioEngineTarget === audioEngineTargets.superdirt ? superdirtOutput : webaudioOutput; + const { isSyncEnabled, audioEngineTarget } = useSettings(); + const shouldUseWebaudio = audioEngineTarget !== audioEngineTargets.superdirt; + const defaultOutput = shouldUseWebaudio ? webaudioOutput : superdirtOutput; + const getTime = shouldUseWebaudio ? getAudioContextCurrentTime : getPerformanceTimeSeconds; const init = useCallback(() => { const drawTime = [-2, 2]; @@ -65,7 +67,7 @@ export function useReplContext() { const editor = new StrudelMirror({ sync: isSyncEnabled, defaultOutput, - getTime: () => getAudioContext().currentTime, + getTime, setInterval, clearInterval, transpiler,