From 908c0e44ffa90933bbd80d1d8d36e9c05df82449 Mon Sep 17 00:00:00 2001 From: Nikita Date: Sun, 19 Oct 2025 19:44:53 +0300 Subject: [PATCH] Fix worklets not loading --- packages/codemirror/codemirror.mjs | 4 ++- packages/superdough/helpers.mjs | 2 +- packages/superdough/superdough.mjs | 4 +-- packages/webaudio/webaudio.mjs | 35 ++++++++++--------- website/src/repl/components/Header.jsx | 4 ++- .../src/repl/components/panel/SettingsTab.jsx | 2 +- 6 files changed, 28 insertions(+), 23 deletions(-) diff --git a/packages/codemirror/codemirror.mjs b/packages/codemirror/codemirror.mjs index 645a8a19..acc53f52 100644 --- a/packages/codemirror/codemirror.mjs +++ b/packages/codemirror/codemirror.mjs @@ -269,8 +269,10 @@ export class StrudelMirror { await this.repl.evaluate(this.code); } async exportAudio(begin, end) { - // await this.repl.evaluate(this.code, false) + await this.repl.evaluate(this.code, false) this.repl.exportAudio(begin, end); + this.repl.scheduler.stop(); + } async stop() { this.repl.scheduler.stop(); diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index a471da9d..cf65c390 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -348,7 +348,7 @@ export function applyFM(param, value, begin) { duration, } = value; let modulator; - let stop = () => {}; + let stop = () => { }; if (fmModulationIndex) { const ac = getAudioContext(); diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 0c6a1843..32386621 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -208,11 +208,11 @@ export function registerWorklet(url) { } let workletsLoading; -function loadWorklets() { +export function loadWorklets() { if (!workletsLoading) { const audioCtx = getAudioContext(); const allWorkletURLs = externalWorklets.concat([workletsUrl]); - workletsLoading = Promise.all(allWorkletURLs.map((workletURL) => audioCtx.audioWorklet.addModule(workletURL))); + workletsLoading = Promise.all(allWorkletURLs.map((workletURL) => audioCtx.audioWorklet.addModule(workletURL))).then(() => workletsLoading = undefined); } return workletsLoading; diff --git a/packages/webaudio/webaudio.mjs b/packages/webaudio/webaudio.mjs index 85e78f93..d813b9e8 100644 --- a/packages/webaudio/webaudio.mjs +++ b/packages/webaudio/webaudio.mjs @@ -5,9 +5,10 @@ This program is free software: you can redistribute it and/or modify it under th */ import * as strudel from '@strudel/core'; -import { superdough, getAudioContext, setLogger, doughTrigger, registerWorklet, setAudioContext, getSampleBufferSource, loadBuffer, getSampleInfo, getSound, initAudio, setSuperdoughAudioController } from 'superdough'; +import { superdough, getAudioContext, setLogger, doughTrigger, registerWorklet, setAudioContext, getSampleBufferSource, loadBuffer, getSampleInfo, getSound, initAudio, setSuperdoughAudioController, loadWorklets, setMaxPolyphony, setMultiChannelOrbits } from 'superdough'; import './supradough.mjs'; import { workletUrl } from 'supradough'; +import { SuperdoughAudioController } from 'superdough/superdoughoutput.mjs'; registerWorklet(workletUrl); @@ -27,16 +28,16 @@ export const webaudioOutput = (hap, _deadline, hapDuration, cps, t) => { }; export async function renderPatternAudio(pattern, cps, begin, end) { + const oldAudioCtx = getAudioContext() + await oldAudioCtx.close() let audioContext = new OfflineAudioContext(2, (end - begin) / cps * 48000, 48000); setAudioContext(audioContext) - setSuperdoughAudioController(null) - await initAudio({ - maxPolyphony: 1024, - multiChannelOrbits: true - - }) + let context = getAudioContext() + setSuperdoughAudioController(new SuperdoughAudioController(context)) + setMaxPolyphony(1024) + setMultiChannelOrbits(true) + await loadWorklets() logger('[webaudio] start rendering'); - console.log(audioContext) let haps = pattern.queryArc(begin, end, { _cps: cps }) Promise.all(haps.map(async h => { @@ -48,11 +49,11 @@ export async function renderPatternAudio(pattern, cps, begin, end) { else { s = h.value.s } - } - let bank = getSound(s).data.samples - if (bank) { - let { url: sampleUrl, label } = getSampleInfo(h.value, bank); - await loadBuffer(sampleUrl, audioContext, label) + let bank = getSound(s).data.samples + if (bank) { + let { url: sampleUrl, label } = getSampleInfo(h.value, bank); + await loadBuffer(sampleUrl, context, label) + } } })) haps.forEach(async (hap) => { @@ -62,9 +63,8 @@ export async function renderPatternAudio(pattern, cps, begin, end) { } }) - let context = getAudioContext() - context.startRendering().then((renderedBuffer) => { - // console.log(renderedBuffer) + context.startRendering().then(async (renderedBuffer) => { + console.log(renderedBuffer) const wavBuffer = audioBufferToWav(renderedBuffer); const blob = new Blob([wavBuffer], { type: 'audio/wav' }); let downloadName = '' @@ -82,9 +82,10 @@ export async function renderPatternAudio(pattern, cps, begin, end) { a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); + await context.close() setAudioContext(null) setSuperdoughAudioController(null) - initAudio() + await initAudio() }); } diff --git a/website/src/repl/components/Header.jsx b/website/src/repl/components/Header.jsx index 656aa786..91e942d3 100644 --- a/website/src/repl/components/Header.jsx +++ b/website/src/repl/components/Header.jsx @@ -94,11 +94,13 @@ export function Header({ context, embedded = false }) { {!isEmbedded && update}