use performance clock for osc mode

This commit is contained in:
Jade (Rose) Rowland 2024-08-16 10:46:18 -04:00
parent 8da1d9fbf3
commit 796f741a92
5 changed files with 19 additions and 8 deletions

View File

@ -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) {

View File

@ -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) {

View File

@ -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);
};

View File

@ -87,6 +87,10 @@ export const getAudioContext = () => {
return audioContext;
};
export function getAudioContextCurrentTime() {
return getAudioContext().currentTime
}
let workletsLoading;
function loadWorklets() {
if (!workletsLoading) {

View File

@ -4,11 +4,11 @@ Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/st
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
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,