diff --git a/packages/codemirror/examples/strudelmirror/.gitignore b/packages/codemirror/examples/strudelmirror/.gitignore
deleted file mode 100644
index a547bf36..00000000
--- a/packages/codemirror/examples/strudelmirror/.gitignore
+++ /dev/null
@@ -1,24 +0,0 @@
-# Logs
-logs
-*.log
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-pnpm-debug.log*
-lerna-debug.log*
-
-node_modules
-dist
-dist-ssr
-*.local
-
-# Editor directories and files
-.vscode/*
-!.vscode/extensions.json
-.idea
-.DS_Store
-*.suo
-*.ntvs*
-*.njsproj
-*.sln
-*.sw?
diff --git a/packages/codemirror/examples/strudelmirror/index.html b/packages/codemirror/examples/strudelmirror/index.html
deleted file mode 100644
index 0e1d43ce..00000000
--- a/packages/codemirror/examples/strudelmirror/index.html
+++ /dev/null
@@ -1,87 +0,0 @@
-
-
-
-
-
-
- StrudelMirror Example
-
-
-
-
-
-
-
-
-
diff --git a/packages/codemirror/examples/strudelmirror/main.js b/packages/codemirror/examples/strudelmirror/main.js
deleted file mode 100644
index 676f4b97..00000000
--- a/packages/codemirror/examples/strudelmirror/main.js
+++ /dev/null
@@ -1,199 +0,0 @@
-import { logger, getDrawContext, silence, controls, evalScope, hash2code, code2hash } from '@strudel.cycles/core';
-import { StrudelMirror } from '@strudel/codemirror';
-import { transpiler } from '@strudel.cycles/transpiler';
-import {
- getAudioContext,
- webaudioOutput,
- registerSynthSounds,
- registerZZFXSounds,
- samples,
-} from '@strudel.cycles/webaudio';
-import './style.css';
-
-let editor;
-const initialSettings = {
- keybindings: 'codemirror',
- isLineNumbersDisplayed: true,
- isActiveLineHighlighted: true,
- isAutoCompletionEnabled: false,
- isPatternHighlightingEnabled: true,
- isFlashEnabled: true,
- isTooltipEnabled: false,
- isLineWrappingEnabled: false,
- theme: 'teletext',
- fontFamily: 'monospace',
- fontSize: 18,
-};
-
-async function run() {
- const container = document.getElementById('code');
- if (!container) {
- console.warn('could not init: no container found');
- return;
- }
-
- const drawContext = getDrawContext();
- const drawTime = [-2, 2];
- editor = new StrudelMirror({
- defaultOutput: webaudioOutput,
- getTime: () => getAudioContext().currentTime,
- transpiler,
- root: container,
- initialCode: '// LOADING',
- pattern: silence,
- settings: initialSettings,
- drawTime,
- onDraw: (haps, time, frame, painters) => {
- painters.length && drawContext.clearRect(0, 0, drawContext.canvas.width * 2, drawContext.canvas.height * 2);
- painters?.forEach((painter) => {
- // ctx time haps drawTime paintOptions
- painter(drawContext, time, haps, drawTime, { clear: false });
- });
- },
- prebake: async () => {
- // populate scope / lazy load modules
- const modulesLoading = evalScope(
- import('@strudel.cycles/core'),
- import('@strudel.cycles/tonal'),
- import('@strudel.cycles/mini'),
- // import('@strudel.cycles/xen'),
- import('@strudel.cycles/webaudio'),
- import('@strudel/codemirror'),
- /* import('@strudel/hydra'), */
- // import('@strudel.cycles/serial'),
- /* import('@strudel.cycles/soundfonts'), */
- // import('@strudel.cycles/csound'),
- /* import('@strudel.cycles/midi'), */
- // import('@strudel.cycles/osc'),
- controls, // sadly, this cannot be exported from core directly (yet)
- );
- // load samples
- const ds = 'https://raw.githubusercontent.com/felixroos/dough-samples/main/';
- await Promise.all([
- modulesLoading,
- registerSynthSounds(),
- registerZZFXSounds(),
- samples(`${ds}/tidal-drum-machines.json`),
- samples(`${ds}/piano.json`),
- samples(`${ds}/Dirt-Samples.json`),
- samples(`${ds}/EmuSP12.json`),
- samples(`${ds}/vcsl.json`),
- ]);
- },
- afterEval: ({ code }) => {
- window.location.hash = '#' + code2hash(code);
- },
- });
-
- // init settings
- editor.updateSettings(initialSettings);
-
- logger(`Welcome to Strudel! Click into the editor and then hit ctrl+enter to run the code!`, 'highlight');
- const codeParam = window.location.href.split('#')[1] || '';
-
- const initialCode = codeParam
- ? hash2code(codeParam)
- : `// @date 23-11-30
-// "teigrührgerät" @by froos
-
-stack(
- stack(
- s("bd(<3!3 5>,6)/2").bank('RolandTR707')
- ,
- s("~ sd:<0 1>").bank('RolandTR707').room("<0 .5>")
- .lastOf(8, x=>x.segment("12").end(.2).gain(isaw))
- ,
- s("[tb ~ tb]").bank('RolandTR707')
- .clip(0).release(.08).room(.2)
- ).off(-1/6, x=>x.speed(.7).gain(.2).degrade())
- ,
- stack(
- note(",6) ~!2 [f1?]*2>")
- .s("sawtooth").lpf(perlin.range(400,1000))
- .lpa(.1).lpenv(-3).room(.2)
- .lpq(8).noise(.2)
- .add(note("0,.1"))
- ,
- chord("<~ Gm9 ~!2>")
- .dict('ireal').voicing()
- .s("sawtooth").vib("2:.1")
- .lpf(1000).lpa(.1).lpenv(-4)
- .room(.5)
- ,
- n(run(3)).chord("/8")
- .dict('ireal-ext')
- .off(1/2, add(n(4)))
- .voicing()
- .clip(.1).release(.05)
- .s("sine").jux(rev)
- .sometimesBy(sine.slow(16), add(note(12)))
- .room(.75)
- .lpf(sine.range(200,2000).slow(16))
- .gain(saw.slow(4).div(2))
- ).add(note(perlin.range(0,.5)))
-)`;
-
- editor.setCode(initialCode); // simpler alternative to above init
-
- // settingsMap.listen((settings, key) => editor.changeSetting(key, settings[key]));
- onEvent('strudel-toggle-play', () => editor.toggle());
-}
-
-run();
-
-function onEvent(key, callback) {
- const listener = (e) => {
- if (e.data === key) {
- callback();
- }
- };
- window.addEventListener('message', listener);
- return () => window.removeEventListener('message', listener);
-}
-
-// settings form
-function getInput(form, name) {
- return form.querySelector(`input[name=${name}]`) || form.querySelector(`select[name=${name}]`);
-}
-function getFormValues(form, initial) {
- const entries = Object.entries(initial).map(([key, initialValue]) => {
- const input = getInput(form, key);
- if (!input) {
- return [key, initialValue]; // fallback
- }
- if (input.type === 'checkbox') {
- return [key, input.checked];
- }
- if (input.type === 'number') {
- return [key, Number(input.value)];
- }
- if (input.tagName === 'SELECT') {
- return [key, input.value];
- }
- return [key, input.value];
- });
- return Object.fromEntries(entries);
-}
-function setFormValues(form, values) {
- Object.entries(values).forEach(([key, value]) => {
- const input = getInput(form, key);
- if (!input) {
- return;
- }
- if (input.type === 'checkbox') {
- input.checked = !!value;
- } else if (input.type === 'number') {
- input.value = value;
- } else if (input.tagName) {
- input.value = value;
- }
- });
-}
-
-const form = document.querySelector('form[name=settings]');
-setFormValues(form, initialSettings);
-form.addEventListener('change', () => {
- const values = getFormValues(form, initialSettings);
- // console.log('values', values);
- editor.updateSettings(values);
-});
diff --git a/packages/codemirror/examples/strudelmirror/package.json b/packages/codemirror/examples/strudelmirror/package.json
deleted file mode 100644
index 5c946bff..00000000
--- a/packages/codemirror/examples/strudelmirror/package.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
- "name": "strudelmirror",
- "private": true,
- "version": "0.0.0",
- "type": "module",
- "scripts": {
- "dev": "vite",
- "build": "vite build",
- "preview": "vite preview"
- },
- "devDependencies": {
- "vite": "^5.0.8"
- },
- "dependencies": {
- "@strudel/codemirror": "workspace:*",
- "@strudel.cycles/core":"workspace:*",
- "@strudel.cycles/transpiler":"workspace:*",
- "@strudel.cycles/tonal":"workspace:*",
- "@strudel.cycles/mini":"workspace:*",
- "@strudel.cycles/xen":"workspace:*",
- "@strudel.cycles/webaudio":"workspace:*",
- "@strudel/hydra":"workspace:*",
- "@strudel.cycles/serial":"workspace:*",
- "@strudel.cycles/soundfonts":"workspace:*",
- "@strudel.cycles/csound":"workspace:*",
- "@strudel.cycles/midi":"workspace:*",
- "@strudel.cycles/osc":"workspace:*"
- }
-}
diff --git a/packages/codemirror/examples/strudelmirror/style.css b/packages/codemirror/examples/strudelmirror/style.css
deleted file mode 100644
index fabc795c..00000000
--- a/packages/codemirror/examples/strudelmirror/style.css
+++ /dev/null
@@ -1,33 +0,0 @@
-:root {
- --foreground: white;
-}
-
-body,
-input {
- font-family: monospace;
- background: black;
- color: white;
-}
-
-html,
-body,
-#code,
-.cm-editor,
-.cm-scroller {
- padding: 0;
- margin: 0;
- height: 100%;
-}
-
-.settings {
- position: fixed;
- right: 0;
- top: 0;
- z-index: 1000;
- display: flex-col;
- padding: 10px;
-}
-
-.settings > form > * + * {
- margin-top: 10px;
-}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 67599cd9..6fecabff 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -99,6 +99,9 @@ importers:
'@lezer/highlight':
specifier: ^1.1.4
version: 1.1.4
+ '@nanostores/persistent':
+ specifier: ^0.8.0
+ version: 0.8.0(nanostores@0.8.1)
'@replit/codemirror-emacs':
specifier: ^6.0.1
version: 6.0.1(@codemirror/autocomplete@6.6.0)(@codemirror/commands@6.2.4)(@codemirror/search@6.2.3)(@codemirror/state@6.2.0)(@codemirror/view@6.10.0)
@@ -117,6 +120,9 @@ importers:
'@uiw/codemirror-themes-all':
specifier: ^4.19.16
version: 4.19.16(@codemirror/language@6.6.0)(@codemirror/state@6.2.0)(@codemirror/view@6.10.0)
+ nanostores:
+ specifier: ^0.8.1
+ version: 0.8.1
react-dom:
specifier: ^18.2.0
version: 18.2.0(react@18.2.0)
@@ -125,52 +131,6 @@ importers:
specifier: ^4.3.3
version: 4.3.3
- packages/codemirror/examples/strudelmirror:
- dependencies:
- '@strudel.cycles/core':
- specifier: workspace:*
- version: link:../../../core
- '@strudel.cycles/csound':
- specifier: workspace:*
- version: link:../../../csound
- '@strudel.cycles/midi':
- specifier: workspace:*
- version: link:../../../midi
- '@strudel.cycles/mini':
- specifier: workspace:*
- version: link:../../../mini
- '@strudel.cycles/osc':
- specifier: workspace:*
- version: link:../../../osc
- '@strudel.cycles/serial':
- specifier: workspace:*
- version: link:../../../serial
- '@strudel.cycles/soundfonts':
- specifier: workspace:*
- version: link:../../../soundfonts
- '@strudel.cycles/tonal':
- specifier: workspace:*
- version: link:../../../tonal
- '@strudel.cycles/transpiler':
- specifier: workspace:*
- version: link:../../../transpiler
- '@strudel.cycles/webaudio':
- specifier: workspace:*
- version: link:../../../webaudio
- '@strudel.cycles/xen':
- specifier: workspace:*
- version: link:../../../xen
- '@strudel/codemirror':
- specifier: workspace:*
- version: link:../..
- '@strudel/hydra':
- specifier: workspace:*
- version: link:../../../hydra
- devDependencies:
- vite:
- specifier: ^5.0.8
- version: 5.0.8
-
packages/core:
dependencies:
fraction.js:
@@ -4200,110 +4160,6 @@ packages:
picomatch: 2.3.1
dev: false
- /@rollup/rollup-android-arm-eabi@4.9.0:
- resolution: {integrity: sha512-+1ge/xmaJpm1KVBuIH38Z94zj9fBD+hp+/5WLaHgyY8XLq1ibxk/zj6dTXaqM2cAbYKq8jYlhHd6k05If1W5xA==}
- cpu: [arm]
- os: [android]
- requiresBuild: true
- dev: true
- optional: true
-
- /@rollup/rollup-android-arm64@4.9.0:
- resolution: {integrity: sha512-im6hUEyQ7ZfoZdNvtwgEJvBWZYauC9KVKq1w58LG2Zfz6zMd8gRrbN+xCVoqA2hv/v6fm9lp5LFGJ3za8EQH3A==}
- cpu: [arm64]
- os: [android]
- requiresBuild: true
- dev: true
- optional: true
-
- /@rollup/rollup-darwin-arm64@4.9.0:
- resolution: {integrity: sha512-u7aTMskN6Dmg1lCT0QJ+tINRt+ntUrvVkhbPfFz4bCwRZvjItx2nJtwJnJRlKMMaQCHRjrNqHRDYvE4mBm3DlQ==}
- cpu: [arm64]
- os: [darwin]
- requiresBuild: true
- dev: true
- optional: true
-
- /@rollup/rollup-darwin-x64@4.9.0:
- resolution: {integrity: sha512-8FvEl3w2ExmpcOmX5RJD0yqXcVSOqAJJUJ29Lca29Ik+3zPS1yFimr2fr5JSZ4Z5gt8/d7WqycpgkX9nocijSw==}
- cpu: [x64]
- os: [darwin]
- requiresBuild: true
- dev: true
- optional: true
-
- /@rollup/rollup-linux-arm-gnueabihf@4.9.0:
- resolution: {integrity: sha512-lHoKYaRwd4gge+IpqJHCY+8Vc3hhdJfU6ukFnnrJasEBUvVlydP8PuwndbWfGkdgSvZhHfSEw6urrlBj0TSSfg==}
- cpu: [arm]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@rollup/rollup-linux-arm64-gnu@4.9.0:
- resolution: {integrity: sha512-JbEPfhndYeWHfOSeh4DOFvNXrj7ls9S/2omijVsao+LBPTPayT1uKcK3dHW3MwDJ7KO11t9m2cVTqXnTKpeaiw==}
- cpu: [arm64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@rollup/rollup-linux-arm64-musl@4.9.0:
- resolution: {integrity: sha512-ahqcSXLlcV2XUBM3/f/C6cRoh7NxYA/W7Yzuv4bDU1YscTFw7ay4LmD7l6OS8EMhTNvcrWGkEettL1Bhjf+B+w==}
- cpu: [arm64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@rollup/rollup-linux-riscv64-gnu@4.9.0:
- resolution: {integrity: sha512-uwvOYNtLw8gVtrExKhdFsYHA/kotURUmZYlinH2VcQxNCQJeJXnkmWgw2hI9Xgzhgu7J9QvWiq9TtTVwWMDa+w==}
- cpu: [riscv64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@rollup/rollup-linux-x64-gnu@4.9.0:
- resolution: {integrity: sha512-m6pkSwcZZD2LCFHZX/zW2aLIISyzWLU3hrLLzQKMI12+OLEzgruTovAxY5sCZJkipklaZqPy/2bEEBNjp+Y7xg==}
- cpu: [x64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@rollup/rollup-linux-x64-musl@4.9.0:
- resolution: {integrity: sha512-VFAC1RDRSbU3iOF98X42KaVicAfKf0m0OvIu8dbnqhTe26Kh6Ym9JrDulz7Hbk7/9zGc41JkV02g+p3BivOdAg==}
- cpu: [x64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
-
- /@rollup/rollup-win32-arm64-msvc@4.9.0:
- resolution: {integrity: sha512-9jPgMvTKXARz4inw6jezMLA2ihDBvgIU9Ml01hjdVpOcMKyxFBJrn83KVQINnbeqDv0+HdO1c09hgZ8N0s820Q==}
- cpu: [arm64]
- os: [win32]
- requiresBuild: true
- dev: true
- optional: true
-
- /@rollup/rollup-win32-ia32-msvc@4.9.0:
- resolution: {integrity: sha512-WE4pT2kTXQN2bAv40Uog0AsV7/s9nT9HBWXAou8+++MBCnY51QS02KYtm6dQxxosKi1VIz/wZIrTQO5UP2EW+Q==}
- cpu: [ia32]
- os: [win32]
- requiresBuild: true
- dev: true
- optional: true
-
- /@rollup/rollup-win32-x64-msvc@4.9.0:
- resolution: {integrity: sha512-aPP5Q5AqNGuT0tnuEkK/g4mnt3ZhheiXrDIiSVIHN9mcN21OyXDVbEMqmXPE7e2OplNLDkcvV+ZoGJa2ZImFgw==}
- cpu: [x64]
- os: [win32]
- requiresBuild: true
- dev: true
- optional: true
-
/@sigstore/protobuf-specs@0.1.0:
resolution: {integrity: sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
@@ -12791,27 +12647,6 @@ packages:
optionalDependencies:
fsevents: 2.3.3
- /rollup@4.9.0:
- resolution: {integrity: sha512-bUHW/9N21z64gw8s6tP4c88P382Bq/L5uZDowHlHx6s/QWpjJXivIAbEw6LZthgSvlEizZBfLC4OAvWe7aoF7A==}
- engines: {node: '>=18.0.0', npm: '>=8.0.0'}
- hasBin: true
- optionalDependencies:
- '@rollup/rollup-android-arm-eabi': 4.9.0
- '@rollup/rollup-android-arm64': 4.9.0
- '@rollup/rollup-darwin-arm64': 4.9.0
- '@rollup/rollup-darwin-x64': 4.9.0
- '@rollup/rollup-linux-arm-gnueabihf': 4.9.0
- '@rollup/rollup-linux-arm64-gnu': 4.9.0
- '@rollup/rollup-linux-arm64-musl': 4.9.0
- '@rollup/rollup-linux-riscv64-gnu': 4.9.0
- '@rollup/rollup-linux-x64-gnu': 4.9.0
- '@rollup/rollup-linux-x64-musl': 4.9.0
- '@rollup/rollup-win32-arm64-msvc': 4.9.0
- '@rollup/rollup-win32-ia32-msvc': 4.9.0
- '@rollup/rollup-win32-x64-msvc': 4.9.0
- fsevents: 2.3.3
- dev: true
-
/run-async@2.4.1:
resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==}
engines: {node: '>=0.12.0'}
@@ -14470,41 +14305,6 @@ packages:
optionalDependencies:
fsevents: 2.3.3
- /vite@5.0.8:
- resolution: {integrity: sha512-jYMALd8aeqR3yS9xlHd0OzQJndS9fH5ylVgWdB+pxTwxLKdO1pgC5Dlb398BUxpfaBxa4M9oT7j1g503Gaj5IQ==}
- engines: {node: ^18.0.0 || >=20.0.0}
- hasBin: true
- peerDependencies:
- '@types/node': ^18.0.0 || >=20.0.0
- less: '*'
- lightningcss: ^1.21.0
- sass: '*'
- stylus: '*'
- sugarss: '*'
- terser: ^5.4.0
- peerDependenciesMeta:
- '@types/node':
- optional: true
- less:
- optional: true
- lightningcss:
- optional: true
- sass:
- optional: true
- stylus:
- optional: true
- sugarss:
- optional: true
- terser:
- optional: true
- dependencies:
- esbuild: 0.19.5
- postcss: 8.4.32
- rollup: 4.9.0
- optionalDependencies:
- fsevents: 2.3.3
- dev: true
-
/vitefu@0.2.4(vite@4.5.0):
resolution: {integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==}
peerDependencies:
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index baafa3c3..615475e4 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -7,4 +7,3 @@ packages:
- "packages/react/examples/nano-repl"
- "packages/web/examples/repl-example"
- "packages/superdough/example"
- - "packages/codemirror/examples/strudelmirror"