diff --git a/packages/core/repl.mjs b/packages/core/repl.mjs index 89b4d633..7c96bb66 100644 --- a/packages/core/repl.mjs +++ b/packages/core/repl.mjs @@ -41,7 +41,7 @@ export function repl({ throw new Error('no code to evaluate'); } try { - beforeEval?.({ code }); + await beforeEval?.({ code }); let { pattern } = await _evaluate(code, transpiler); logger(`[eval] code updated`); diff --git a/packages/react/src/hooks/useStrudel.mjs b/packages/react/src/hooks/useStrudel.mjs index 0900ebbf..eee1bf7d 100644 --- a/packages/react/src/hooks/useStrudel.mjs +++ b/packages/react/src/hooks/useStrudel.mjs @@ -46,9 +46,9 @@ function useStrudel({ drawContext, transpiler, editPattern, - beforeEval: ({ code }) => { + beforeEval: async ({ code }) => { setCode(code); - beforeEval?.(); + await beforeEval?.(); }, afterEval: (res) => { const { pattern: _pattern, code } = res; diff --git a/website/src/repl/Repl.jsx b/website/src/repl/Repl.jsx index 2d8f652e..70b5229e 100644 --- a/website/src/repl/Repl.jsx +++ b/website/src/repl/Repl.jsx @@ -42,7 +42,7 @@ const modules = [ import('@strudel.cycles/csound'), ]; -evalScope( +const modulesLoading = evalScope( controls, // sadly, this cannot be exported from core direclty ...modules, ); @@ -102,7 +102,7 @@ export function Repl({ embedded = false }) { const isEmbedded = embedded || window.location !== window.parent.location; const [view, setView] = useState(); // codemirror view const [lastShared, setLastShared] = useState(); - const [pending, setPending] = useState(false); + const [pending, setPending] = useState(true); const { theme, keybindings, fontSize, fontFamily } = useSettings(); @@ -111,10 +111,11 @@ export function Repl({ embedded = false }) { initialCode: '// LOADING', defaultOutput: webaudioOutput, getTime, - beforeEval: () => { + beforeEval: async () => { + setPending(true); + await modulesLoading; cleanupUi(); cleanupDraw(); - setPending(true); }, afterEval: ({ code }) => { setPending(false); @@ -135,6 +136,7 @@ export function Repl({ embedded = false }) { 'highlight', ); setCode(decoded || latestCode || randomTune); + setPending(false); }); }, []); @@ -144,6 +146,10 @@ export function Repl({ embedded = false }) { async (e) => { if (e.ctrlKey || e.altKey) { if (e.code === 'Enter') { + if (getAudioContext().state !== 'running') { + alert('please click play to initialize the audio. you can use shortcuts after that!'); + return; + } e.preventDefault(); flash(view); await activateCode();