From e3e3a8404a7052f24e381e4ac05c6ebf7638f088 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Thu, 18 Aug 2022 00:27:16 +0200 Subject: [PATCH] nano-repl add modules + proper eval --- packages/react/examples/nano-repl/src/App.jsx | 27 +++++++++++++++---- packages/react/src/hooks/useEvaluator.jsx | 16 +++++++---- 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/packages/react/examples/nano-repl/src/App.jsx b/packages/react/examples/nano-repl/src/App.jsx index bdcbf8ee..9e4887a9 100644 --- a/packages/react/examples/nano-repl/src/App.jsx +++ b/packages/react/examples/nano-repl/src/App.jsx @@ -1,15 +1,32 @@ -import * as strudel from '@strudel.cycles/core'; -import * as webaudio from '@strudel.cycles/webaudio'; +import '@strudel.cycles/core'; +import controls from '@strudel.cycles/core/controls.mjs'; +import { evalScope } from '@strudel.cycles/eval'; import { webaudioOutput } from '@strudel.cycles/webaudio'; import { useState } from 'react'; import useScheduler from '../../../src/hooks/useScheduler'; import useEvaluator from '../../../src/hooks/useEvaluator'; +// import { prebake } from '../../../../../repl/src/prebake.mjs'; -Object.assign(globalThis, strudel, webaudio); // add strudel to eval scope +await evalScope( + controls, + import('@strudel.cycles/core'), + import('@strudel.cycles/tone'), + 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/webdirt'), + import('@strudel.cycles/serial'), + import('@strudel.cycles/soundfonts'), +); + +// await prebake(); function App() { - const [code, setCode] = useState(`seq('c3','eb3').note()`); - const { evaluate, pattern, isDirty, error: evaluatorError } = useEvaluator(code); + const [code, setCode] = useState(`"c3 [eb3,g3]".note()`); + const { evaluate, pattern, isDirty, error: evaluatorError } = useEvaluator({ code }); const { scheduler, error: schedulerError } = useScheduler(pattern, webaudioOutput); const error = evaluatorError || schedulerError; return ( diff --git a/packages/react/src/hooks/useEvaluator.jsx b/packages/react/src/hooks/useEvaluator.jsx index e9929555..983a272a 100644 --- a/packages/react/src/hooks/useEvaluator.jsx +++ b/packages/react/src/hooks/useEvaluator.jsx @@ -1,14 +1,20 @@ import { useRef, useState, useCallback, useEffect } from 'react'; +import { evaluate as _evaluate } from '@strudel.cycles/eval'; -function useEvaluator(code, evalOnMount = true) { +function useEvaluator({ code, evalOnMount = true }) { const [error, setError] = useState(); const [activeCode, setActiveCode] = useState(code); const [pattern, setPattern] = useState(); const isDirty = code !== activeCode; - const evaluate = useCallback(() => { + + const evaluate = useCallback(async () => { + if (!code) { + console.log('no code..'); + return; + } try { - // TODO: use @strudel.cycles/eval or let user inject custom eval function - const _pattern = eval(code); + // TODO: let user inject custom eval function? + const { pattern: _pattern } = await _evaluate(code); setActiveCode(activeCode); setPattern(_pattern); setError(); @@ -20,9 +26,9 @@ function useEvaluator(code, evalOnMount = true) { const inited = useRef(); useEffect(() => { if (!inited.current && evalOnMount) { + inited.current = true; evaluate(); } - inited.current = true; }, [evaluate, evalOnMount]); return { error, evaluate, activeCode, pattern, isDirty }; }