improve initial loading + wait before eval

This commit is contained in:
Felix Roos 2023-03-23 21:56:20 +01:00
parent d17543d5d9
commit 55c533c947
3 changed files with 13 additions and 7 deletions

View file

@ -41,7 +41,7 @@ export function repl({
throw new Error('no code to evaluate'); throw new Error('no code to evaluate');
} }
try { try {
beforeEval?.({ code }); await beforeEval?.({ code });
scheduler.setCps(1); // reset cps in case the code does not contain a setCps call scheduler.setCps(1); // reset cps in case the code does not contain a setCps call
// problem: when the code does contain a setCps after an awaited promise, // problem: when the code does contain a setCps after an awaited promise,
// the cps will be 1 until the promise resolves // the cps will be 1 until the promise resolves

View file

@ -46,9 +46,9 @@ function useStrudel({
drawContext, drawContext,
transpiler, transpiler,
editPattern, editPattern,
beforeEval: ({ code }) => { beforeEval: async ({ code }) => {
setCode(code); setCode(code);
beforeEval?.(); await beforeEval?.();
}, },
afterEval: (res) => { afterEval: (res) => {
const { pattern: _pattern, code } = res; const { pattern: _pattern, code } = res;

View file

@ -42,7 +42,7 @@ const modules = [
import('@strudel.cycles/csound'), import('@strudel.cycles/csound'),
]; ];
evalScope( const modulesLoading = evalScope(
controls, // sadly, this cannot be exported from core direclty controls, // sadly, this cannot be exported from core direclty
...modules, ...modules,
); );
@ -102,7 +102,7 @@ export function Repl({ embedded = false }) {
const isEmbedded = embedded || window.location !== window.parent.location; const isEmbedded = embedded || window.location !== window.parent.location;
const [view, setView] = useState(); // codemirror view const [view, setView] = useState(); // codemirror view
const [lastShared, setLastShared] = useState(); const [lastShared, setLastShared] = useState();
const [pending, setPending] = useState(false); const [pending, setPending] = useState(true);
const { theme, keybindings, fontSize, fontFamily } = useSettings(); const { theme, keybindings, fontSize, fontFamily } = useSettings();
@ -111,10 +111,11 @@ export function Repl({ embedded = false }) {
initialCode: '// LOADING', initialCode: '// LOADING',
defaultOutput: webaudioOutput, defaultOutput: webaudioOutput,
getTime, getTime,
beforeEval: () => { beforeEval: async () => {
setPending(true);
await modulesLoading;
cleanupUi(); cleanupUi();
cleanupDraw(); cleanupDraw();
setPending(true);
}, },
afterEval: ({ code }) => { afterEval: ({ code }) => {
setPending(false); setPending(false);
@ -135,6 +136,7 @@ export function Repl({ embedded = false }) {
'highlight', 'highlight',
); );
setCode(decoded || latestCode || randomTune); setCode(decoded || latestCode || randomTune);
setPending(false);
}); });
}, []); }, []);
@ -144,6 +146,10 @@ export function Repl({ embedded = false }) {
async (e) => { async (e) => {
if (e.ctrlKey || e.altKey) { if (e.ctrlKey || e.altKey) {
if (e.code === 'Enter') { 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(); e.preventDefault();
flash(view); flash(view);
await activateCode(); await activateCode();