From 04502b05d469f4fe82b246329b134f1ff330aced Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Thu, 18 Aug 2022 15:16:29 +0200 Subject: [PATCH] better default tune + fix dirty state --- packages/react/examples/nano-repl/src/App.jsx | 44 ++++++++++++++++++- packages/react/src/hooks/useEvaluator.jsx | 2 +- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/packages/react/examples/nano-repl/src/App.jsx b/packages/react/examples/nano-repl/src/App.jsx index 9e4887a9..c6cd52a1 100644 --- a/packages/react/examples/nano-repl/src/App.jsx +++ b/packages/react/examples/nano-repl/src/App.jsx @@ -1,4 +1,3 @@ -import '@strudel.cycles/core'; import controls from '@strudel.cycles/core/controls.mjs'; import { evalScope } from '@strudel.cycles/eval'; import { webaudioOutput } from '@strudel.cycles/webaudio'; @@ -7,6 +6,7 @@ import useScheduler from '../../../src/hooks/useScheduler'; import useEvaluator from '../../../src/hooks/useEvaluator'; // import { prebake } from '../../../../../repl/src/prebake.mjs'; +// TODO: only import stuff when play is pressed? await evalScope( controls, import('@strudel.cycles/core'), @@ -22,10 +22,50 @@ await evalScope( import('@strudel.cycles/soundfonts'), ); +const defaultTune = `samples({ + bd: ['bd/BT0AADA.wav','bd/BT0AAD0.wav','bd/BT0A0DA.wav','bd/BT0A0D3.wav','bd/BT0A0D0.wav','bd/BT0A0A7.wav'], + sd: ['sd/rytm-01-classic.wav','sd/rytm-00-hard.wav'], + hh: ['hh27/000_hh27closedhh.wav','hh/000_hh3closedhh.wav'], +}, 'github:tidalcycles/Dirt-Samples/master/'); +stack( + s("bd,[~ ],hh(3,4)") // drums + .speed(perlin.range(.7,.9)) // random sample speed variation + //.hush() + ,"" // bassline + .off(1/8,x=>x.add(12).degradeBy(.5)) // random octave jumps + .add(perlin.range(0,.5)) // random pitch variation + .superimpose(add(.05)) // add second, slightly detuned voice + .n() // wrap in "n" + .decay(.15).sustain(0) // make each note of equal length + .s('sawtooth') // waveform + .gain(.4) // turn down + .cutoff(sine.slow(7).range(300,5000)) // automate cutoff + //.hush() + ,">".voicings() // chords + .superimpose(x=>x.add(.04)) // add second, slightly detuned voice + .add(perlin.range(0,.5)) // random pitch variation + .n() // wrap in "n" + .s('sawtooth') // waveform + .gain(.16) // turn down + .cutoff(500) // fixed cutoff + .attack(1) // slowly fade in + //.hush() + ,"a4 c5 ".struct("x(5,8)") + .superimpose(x=>x.add(.04)) // add second, slightly detuned voice + .add(perlin.range(0,.5)) // random pitch variation + .n() // wrap in "n" + .decay(.1).sustain(0) // make notes short + .s('triangle') // waveform + .degradeBy(perlin.range(0,.5)) // randomly controlled random removal :) + .echoWith(4,.125,(x,n)=>x.gain(.15*1/(n+1))) // echo notes + //.hush() +) +.cps(2/3)`; + // await prebake(); function App() { - const [code, setCode] = useState(`"c3 [eb3,g3]".note()`); + const [code, setCode] = useState(defaultTune); const { evaluate, pattern, isDirty, error: evaluatorError } = useEvaluator({ code }); const { scheduler, error: schedulerError } = useScheduler(pattern, webaudioOutput); const error = evaluatorError || schedulerError; diff --git a/packages/react/src/hooks/useEvaluator.jsx b/packages/react/src/hooks/useEvaluator.jsx index 983a272a..26ee86ae 100644 --- a/packages/react/src/hooks/useEvaluator.jsx +++ b/packages/react/src/hooks/useEvaluator.jsx @@ -15,7 +15,7 @@ function useEvaluator({ code, evalOnMount = true }) { try { // TODO: let user inject custom eval function? const { pattern: _pattern } = await _evaluate(code); - setActiveCode(activeCode); + setActiveCode(code); setPattern(_pattern); setError(); } catch (err) {