nano-repl add modules + proper eval

This commit is contained in:
Felix Roos 2022-08-18 00:27:16 +02:00
parent 48bf17614f
commit e3e3a8404a
2 changed files with 33 additions and 10 deletions

View File

@ -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 (

View File

@ -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 };
}