From b71f8a33d734129306e72a772f010add2e3f201f Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Thu, 2 Nov 2023 10:21:39 +0100 Subject: [PATCH] refactor: pull module loading into prebake --- website/src/docs/MiniRepl.jsx | 22 +++---------------- website/src/repl/Repl.jsx | 35 +++--------------------------- website/src/repl/prebake.mjs | 40 +++++++++++++++++++++++++++++++---- 3 files changed, 42 insertions(+), 55 deletions(-) diff --git a/website/src/docs/MiniRepl.jsx b/website/src/docs/MiniRepl.jsx index 251410c5e..15eb9cb5b 100644 --- a/website/src/docs/MiniRepl.jsx +++ b/website/src/docs/MiniRepl.jsx @@ -7,26 +7,10 @@ import './MiniRepl.css'; import { useSettings } from '../settings.mjs'; import Claviature from '@components/Claviature'; -let modules; -if (typeof window !== 'undefined') { - modules = evalScope( - controls, - import('@strudel.cycles/core'), - import('@strudel.cycles/tonal'), - import('@strudel.cycles/mini'), - import('@strudel.cycles/midi'), - import('@strudel.cycles/xen'), - import('@strudel.cycles/webaudio'), - import('@strudel.cycles/osc'), - import('@strudel.cycles/csound'), - import('@strudel.cycles/soundfonts'), - import('@strudel/hydra'), - ); -} - +let init; if (typeof window !== 'undefined') { initAudioOnFirstClick(); - prebake(); + init = prebake(); } export function MiniRepl({ @@ -46,7 +30,7 @@ export function MiniRepl({ useEffect(() => { // we have to load this package on the client // because codemirror throws an error on the server - Promise.all([import('@strudel.cycles/react'), modules]) + Promise.all([import('@strudel.cycles/react'), init]) .then(([res]) => setRepl(() => res.MiniRepl)) .catch((err) => console.error(err)); }, []); diff --git a/website/src/repl/Repl.jsx b/website/src/repl/Repl.jsx index d9eb7001e..afdb617c8 100644 --- a/website/src/repl/Repl.jsx +++ b/website/src/repl/Repl.jsx @@ -4,7 +4,7 @@ Copyright (C) 2022 Strudel contributors - see . */ -import { cleanupDraw, cleanupUi, controls, evalScope, getDrawContext, logger } from '@strudel.cycles/core'; +import { cleanupDraw, cleanupUi, getDrawContext, logger } from '@strudel.cycles/core'; import { CodeMirror, cx, flash, useHighlighting, useStrudel, useKeydown } from '@strudel.cycles/react'; import { getAudioContext, initAudioOnFirstClick, resetLoadedSounds, webaudioOutput } from '@strudel.cycles/webaudio'; import { createClient } from '@supabase/supabase-js'; @@ -19,7 +19,6 @@ import PlayCircleIcon from '@heroicons/react/20/solid/PlayCircleIcon'; import { themes } from './themes.mjs'; import { settingsMap, useSettings, setLatestCode } from '../settings.mjs'; import Loader from './Loader'; -import { settingPatterns } from '../settings.mjs'; import { code2hash, hash2code } from './helpers.mjs'; import { isTauri } from '../tauri.mjs'; import { useWidgets } from '@strudel.cycles/react/src/hooks/useWidgets.mjs'; @@ -35,35 +34,7 @@ const supabase = createClient( 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InBpZHhkc3hwaGxoempuem1pZnRoIiwicm9sZSI6ImFub24iLCJpYXQiOjE2NTYyMzA1NTYsImV4cCI6MTk3MTgwNjU1Nn0.bqlw7802fsWRnqU5BLYtmXk_k-D1VFmbkHMywWc15NM', ); -let modules = [ - import('@strudel.cycles/core'), - import('@strudel.cycles/tonal'), - import('@strudel.cycles/mini'), - import('@strudel.cycles/xen'), - import('@strudel.cycles/webaudio'), - import('@strudel/codemirror'), - import('@strudel/hydra'), - import('@strudel.cycles/serial'), - import('@strudel.cycles/soundfonts'), - import('@strudel.cycles/csound'), -]; -if (isTauri()) { - modules = modules.concat([ - import('@strudel/desktopbridge/loggerbridge.mjs'), - import('@strudel/desktopbridge/midibridge.mjs'), - import('@strudel/desktopbridge/oscbridge.mjs'), - ]); -} else { - modules = modules.concat([import('@strudel.cycles/midi'), import('@strudel.cycles/osc')]); -} - -const modulesLoading = evalScope( - controls, // sadly, this cannot be exported from core direclty - settingPatterns, - ...modules, -); - -const presets = prebake(); +const init = prebake(); let drawContext, clearCanvas; if (typeof window !== 'undefined') { @@ -140,7 +111,7 @@ export function Repl({ embedded = false }) { getTime, beforeEval: async () => { setPending(true); - await modulesLoading; + await init; cleanupUi(); cleanupDraw(); }, diff --git a/website/src/repl/prebake.mjs b/website/src/repl/prebake.mjs index 28678c9d3..61b124a1b 100644 --- a/website/src/repl/prebake.mjs +++ b/website/src/repl/prebake.mjs @@ -1,12 +1,42 @@ -import { Pattern, noteToMidi, valueToMidi } from '@strudel.cycles/core'; +import { Pattern, noteToMidi, valueToMidi, controls, evalScope } from '@strudel.cycles/core'; import { registerSynthSounds, registerZZFXSounds, samples } from '@strudel.cycles/webaudio'; import './piano.mjs'; import './files.mjs'; +import { isTauri } from '../tauri.mjs'; +import { settingPatterns } from '../settings.mjs'; export async function prebake() { - // https://archive.org/details/SalamanderGrandPianoV3 - // License: CC-by http://creativecommons.org/licenses/by/3.0/ Author: Alexander Holm - await Promise.all([ + // lazy load modules + let modules = [ + import('@strudel.cycles/core'), + import('@strudel.cycles/tonal'), + import('@strudel.cycles/mini'), + import('@strudel.cycles/xen'), + import('@strudel.cycles/webaudio'), + import('@strudel/codemirror'), + import('@strudel/hydra'), + import('@strudel.cycles/serial'), + import('@strudel.cycles/soundfonts'), + import('@strudel.cycles/csound'), + ]; + if (isTauri()) { + modules = modules.concat([ + import('@strudel/desktopbridge/loggerbridge.mjs'), + import('@strudel/desktopbridge/midibridge.mjs'), + import('@strudel/desktopbridge/oscbridge.mjs'), + ]); + } else { + modules = modules.concat([import('@strudel.cycles/midi'), import('@strudel.cycles/osc')]); + } + // register modules in global scope + const modulesLoading = evalScope( + controls, // sadly, this cannot be exported from core direclty + settingPatterns, + ...modules, + ); + // register sounds and samples + return Promise.all([ + modulesLoading, registerSynthSounds(), registerZZFXSounds(), //registerSoundfonts(), @@ -14,6 +44,8 @@ export async function prebake() { // => getting "window is not defined", as soon as "@strudel.cycles/soundfonts" is imported statically // seems to be a problem with soundfont2 import('@strudel.cycles/soundfonts').then(({ registerSoundfonts }) => registerSoundfonts()), + // https://archive.org/details/SalamanderGrandPianoV3 + // License: CC-by http://creativecommons.org/licenses/by/3.0/ Author: Alexander Holm samples(`./piano.json`, `./piano/`, { prebake: true }), // https://github.com/sgossner/VCSL/ // https://api.github.com/repositories/126427031/contents/