{post.data.title}
17 | 18 |20 | 23 |
24 |├── .eslintrc.json ├── .github ├── FUNDING.yml └── workflows │ ├── deploy.yml │ └── test.yml ├── .gitignore ├── .prettierignore ├── .prettierrc ├── .vscode └── settings.json ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── bench └── tunes.bench.mjs ├── eslint.config.mjs ├── examples ├── README.md ├── buildless │ ├── README.md │ ├── basic.html │ ├── canvas.html │ ├── headless-simple.html │ ├── headless-with-samples.html │ ├── hs2js.html │ ├── minimal-repl.html │ ├── tidal.html │ ├── web-component-iframe.html │ ├── web-component-no-iframe.html │ └── web.html ├── codemirror-repl │ ├── .gitignore │ ├── README.md │ ├── index.html │ ├── main.js │ ├── package.json │ ├── style.css │ └── tunes.mjs ├── headless-repl │ ├── .gitignore │ ├── README.md │ ├── index.html │ └── package.json ├── minimal-repl │ ├── .gitignore │ ├── README.md │ ├── index.html │ ├── main.js │ ├── package.json │ └── tune.mjs ├── superdough │ ├── .gitignore │ ├── README.md │ ├── index.html │ └── package.json └── tidal-repl │ ├── .gitignore │ ├── README.md │ ├── index.html │ ├── main.js │ ├── package.json │ └── public │ └── README.md ├── index.mjs ├── jsdoc ├── jsdoc-synonyms.js ├── jsdoc.config.json └── undocumented.mjs ├── lerna.json ├── my-patterns └── README.md ├── package.json ├── packages ├── README.md ├── codemirror │ ├── README.md │ ├── autocomplete.mjs │ ├── codemirror.mjs │ ├── flash.mjs │ ├── highlight.mjs │ ├── html.mjs │ ├── index.mjs │ ├── keybindings.mjs │ ├── package.json │ ├── slider.mjs │ ├── themes.mjs │ ├── themes │ │ ├── CutiePi.mjs │ │ ├── algoboy.mjs │ │ ├── androidstudio.mjs │ │ ├── atomone.mjs │ │ ├── aura.mjs │ │ ├── bbedit.mjs │ │ ├── blackscreen.mjs │ │ ├── bluescreen.mjs │ │ ├── darcula.mjs │ │ ├── dracula.mjs │ │ ├── duotoneDark.mjs │ │ ├── duotoneLight.mjs │ │ ├── eclipse.mjs │ │ ├── githubDark.mjs │ │ ├── githubLight.mjs │ │ ├── green-text.mjs │ │ ├── gruvboxDark.mjs │ │ ├── gruvboxLight.mjs │ │ ├── materialDark.mjs │ │ ├── materialLight.mjs │ │ ├── monokai.mjs │ │ ├── noctisLilac.mjs │ │ ├── nord.mjs │ │ ├── red-text.mjs │ │ ├── solarizedDark.mjs │ │ ├── solarizedLight.mjs │ │ ├── sonic-pink.mjs │ │ ├── strudel-theme.mjs │ │ ├── sublime.mjs │ │ ├── teletext.mjs │ │ ├── terminal.mjs │ │ ├── theme-helper.mjs │ │ ├── tokioNightStorm.mjs │ │ ├── tokyoNight.mjs │ │ ├── tokyoNightDay.mjs │ │ ├── vscodeDark.mjs │ │ ├── vscodeLight.mjs │ │ ├── whitescreen.mjs │ │ └── xcodeLight.mjs │ ├── tooltip.mjs │ ├── vite.config.js │ └── widget.mjs ├── core │ ├── .npmignore │ ├── README.md │ ├── bench │ │ └── pattern.bench.mjs │ ├── clockworker.js │ ├── controls.mjs │ ├── cyclist.mjs │ ├── drawLine.mjs │ ├── euclid.mjs │ ├── evaluate.mjs │ ├── fraction.mjs │ ├── hap.mjs │ ├── index.mjs │ ├── logger.mjs │ ├── neocyclist.mjs │ ├── package.json │ ├── pattern.mjs │ ├── pick.mjs │ ├── repl.mjs │ ├── signal.mjs │ ├── speak.mjs │ ├── state.mjs │ ├── test │ │ ├── controls.test.mjs │ │ ├── drawLine.test.mjs │ │ ├── fraction.test.mjs │ │ ├── pattern.test.mjs │ │ ├── solmization.test.js │ │ ├── util.test.mjs │ │ └── value.test.mjs │ ├── time.mjs │ ├── timespan.mjs │ ├── ui.mjs │ ├── util.mjs │ ├── value.mjs │ ├── vite.config.js │ └── zyklus.mjs ├── csound │ ├── README.md │ ├── index.mjs │ ├── livecode.orc │ ├── package.json │ ├── presets.orc │ ├── project.csd │ └── vite.config.js ├── desktopbridge │ ├── README.md │ ├── index.mjs │ ├── loggerbridge.mjs │ ├── midibridge.mjs │ ├── oscbridge.mjs │ ├── package.json │ └── utils.mjs ├── draw │ ├── README.md │ ├── animate.mjs │ ├── color.mjs │ ├── draw.mjs │ ├── index.mjs │ ├── package.json │ ├── pianoroll.mjs │ ├── pitchwheel.mjs │ ├── spiral.mjs │ └── vite.config.js ├── embed │ ├── README.md │ ├── embed.js │ └── package.json ├── gamepad │ ├── README.md │ ├── docs │ │ └── gamepad.mdx │ ├── gamepad.mjs │ ├── index.mjs │ ├── package.json │ └── vite.config.js ├── hs2js │ ├── .npmignore │ ├── LICENSE │ ├── README.md │ ├── package.json │ ├── pnpm-lock.yaml │ ├── src │ │ ├── hs2js.mjs │ │ ├── index.mjs │ │ └── parser.mjs │ └── vite.config.js ├── hydra │ ├── README.md │ ├── hydra.mjs │ ├── package.json │ └── vite.config.js ├── midi │ ├── README.md │ ├── index.mjs │ ├── midi.mjs │ ├── package.json │ └── vite.config.js ├── mini │ ├── README.md │ ├── bench │ │ └── mini.bench.mjs │ ├── index.mjs │ ├── krill-parser.js │ ├── krill.pegjs │ ├── mini.mjs │ ├── package.json │ ├── test │ │ └── mini.test.mjs │ └── vite.config.js ├── motion │ ├── README.md │ ├── docs │ │ └── devicemotion.mdx │ ├── index.mjs │ ├── motion.mjs │ ├── package.json │ └── vite.config.js ├── mqtt │ ├── README.md │ ├── mqtt.mjs │ ├── package.json │ └── vite.config.js ├── osc │ ├── README.md │ ├── index.html │ ├── osc.mjs │ ├── package.json │ ├── server.js │ ├── superdirtoutput.js │ ├── tidal-sniffer.js │ └── vite.config.js ├── reference │ ├── README.md │ ├── index.mjs │ ├── package.json │ └── vite.config.js ├── repl │ ├── .gitignore │ ├── README.md │ ├── index.mjs │ ├── package.json │ ├── prebake.mjs │ ├── repl-component.mjs │ └── vite.config.js ├── sampler │ ├── README.md │ ├── package.json │ └── sample-server.mjs ├── serial │ ├── README.md │ ├── package.json │ ├── serial.mjs │ └── vite.config.js ├── soundfonts │ ├── README.md │ ├── convert.js │ ├── fontloader.mjs │ ├── gm.mjs │ ├── index.mjs │ ├── list.mjs │ ├── package.json │ ├── sfumato.mjs │ └── vite.config.js ├── superdough │ ├── README.md │ ├── dspworklet.mjs │ ├── feedbackdelay.mjs │ ├── fft.js │ ├── helpers.mjs │ ├── index.mjs │ ├── logger.mjs │ ├── noise.mjs │ ├── ola-processor.js │ ├── package.json │ ├── reverb.mjs │ ├── reverbGen.mjs │ ├── sampler.mjs │ ├── superdough.mjs │ ├── synth.mjs │ ├── util.mjs │ ├── vite.config.js │ ├── vowel.mjs │ ├── worklets.mjs │ ├── zzfx.mjs │ └── zzfx_fork.mjs ├── tidal │ ├── package.json │ └── tidal.mjs ├── tonal │ ├── README.md │ ├── index.mjs │ ├── ireal.mjs │ ├── package.json │ ├── test │ │ ├── tonal.test.mjs │ │ └── tonleiter.test.mjs │ ├── tonal.mjs │ ├── tonleiter.mjs │ ├── vite.config.js │ └── voicings.mjs ├── transpiler │ ├── README.md │ ├── index.mjs │ ├── package.json │ ├── test │ │ └── transpiler.test.mjs │ ├── transpiler.mjs │ └── vite.config.js ├── vite-plugin-bundle-audioworklet │ ├── package.json │ └── vite-plugin-bundle-audioworklet.js ├── web │ ├── README.md │ ├── package.json │ ├── vite.config.js │ └── web.mjs ├── webaudio │ ├── README.md │ ├── index.mjs │ ├── package.json │ ├── scope.mjs │ ├── spectrum.mjs │ ├── vite.config.js │ └── webaudio.mjs └── xen │ ├── README.md │ ├── index.mjs │ ├── package.json │ ├── test │ └── xen.test.mjs │ ├── tune.mjs │ ├── tunejs.js │ ├── vite.config.js │ └── xen.mjs ├── paper ├── Makefile ├── README.md ├── bin │ └── code-filter.py ├── citations.json ├── demo-preprocessed.md ├── demo.md ├── demo.pdf ├── iclc-reviews.md ├── iclc2023.html ├── iclc2023.md ├── iclc2023.pdf ├── iclc2023x.pdf ├── images │ ├── cc.png │ ├── strudel-screenshot.png │ ├── strudel-screenshot2.png │ └── strudelflow.png ├── inconsolata.sty ├── make.sh ├── pandoc │ ├── iclc.html │ ├── iclc.latex │ └── iclc.sty ├── paper-preprocessed.md ├── paper.md ├── paper.pdf └── tex │ ├── latex-template.tex │ ├── sig-alternate.cls │ └── waccopyright.sty ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── samples └── README.md ├── src-tauri ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── README.md ├── build.rs ├── icons │ ├── 128x128.png │ ├── 128x128@2x.png │ ├── 32x32.png │ ├── Square107x107Logo.png │ ├── Square142x142Logo.png │ ├── Square150x150Logo.png │ ├── Square284x284Logo.png │ ├── Square30x30Logo.png │ ├── Square310x310Logo.png │ ├── Square44x44Logo.png │ ├── Square71x71Logo.png │ ├── Square89x89Logo.png │ ├── StoreLogo.png │ ├── icon.icns │ ├── icon.ico │ └── icon.png ├── src │ ├── loggerbridge.rs │ ├── main.rs │ ├── midibridge.rs │ └── oscbridge.rs └── tauri.conf.json ├── test ├── __snapshots__ │ ├── examples.test.mjs.snap │ └── tunes.test.mjs.snap ├── examples.test.mjs ├── metadata.test.mjs ├── runtime.mjs ├── testtunes.mjs └── tunes.test.mjs ├── tools └── dbpatch │ ├── README.md │ ├── dbpatch.mjs │ └── package.json ├── undocumented.json ├── vitest.config.mjs └── website ├── .gitignore ├── .vscode ├── extensions.json └── launch.json ├── README.md ├── agpl-header.txt ├── astro.config.mjs ├── database.types.ts ├── package.json ├── public ├── CNAME ├── EmuSP12.json ├── favicon.ico ├── fonts │ ├── 3270 │ │ ├── 3270-Regular.ttf │ │ └── LICENSE.txt │ ├── BigBlueTerminal │ │ ├── BigBlue_TerminalPlus.TTF │ │ └── LICENSE.txt │ ├── CutiePi │ │ ├── Cute_Aurora_demo.ttf │ │ └── LICENSE.txt │ ├── FiraCode │ │ ├── FiraCode-Regular.ttf │ │ ├── FiraCode-SemiBold.ttf │ │ └── LICENSE.txt │ ├── Hack │ │ ├── Hack-Regular.ttf │ │ └── license.txt │ ├── JetBrains │ │ ├── JetBrainsMono.woff2 │ │ └── license.txt │ ├── Monocraft │ │ ├── Monocraft.ttf │ │ └── license.txt │ ├── PressStart2P │ │ ├── OFL.txt │ │ └── PressStart2P-Regular.ttf │ ├── galactico │ │ ├── Galactico-Basic.otf │ │ └── fontinfo.txt │ ├── mode7 │ │ ├── MODE7GX3.TTF │ │ └── credit.txt │ ├── teletext │ │ ├── EuropeanTeletext.ttf │ │ ├── EuropeanTeletextNuevo.ttf │ │ └── LICENSE.txt │ └── we-come-in-peace │ │ ├── fontinfo.txt │ │ └── we-come-in-peace-bb.regular.ttf ├── icon.png ├── icons │ ├── apple-icon-180.png │ ├── manifest-icon-192.maskable.png │ ├── manifest-icon-512.maskable.png │ └── strudel_icon.png ├── img │ ├── autocomplete.png │ ├── drumset.png │ ├── strudel-alien-live-coding.png │ ├── strudel-collaborative-coding.png │ ├── strudel-live-coding-mars-college.jpg │ ├── strudel-monkeys.png │ ├── strudel-scope.png │ ├── strudel-themes.png │ └── workshop-space.png ├── logo.svg ├── make-scrollable-code-focusable.js ├── manifest.json ├── mridangam.json ├── piano.json ├── pwa │ ├── strudel-linux.png │ └── strudel-macos.png ├── robots.txt ├── tidal-drum-machines-alias.json ├── tidal-drum-machines.json └── vcsl.json ├── src ├── components │ ├── BlogPost.astro │ ├── BlogVideo.astro │ ├── Box.astro │ ├── Claviature.jsx │ ├── Footer │ │ └── AvatarList.astro │ ├── HeadCommon.astro │ ├── HeadCommonNext.astro │ ├── HeadSEO.astro │ ├── Header │ │ ├── Header.astro │ │ ├── LanguageSelect.css │ │ ├── LanguageSelect.tsx │ │ ├── Search.css │ │ └── Search.tsx │ ├── LeftSidebar │ │ └── LeftSidebar.astro │ ├── Oven │ │ └── Oven.jsx │ ├── PageContent │ │ └── PageContent.astro │ ├── PitchSlider.jsx │ ├── QA.tsx │ ├── RightSidebar │ │ ├── MoreMenu.astro │ │ ├── RightSidebar.astro │ │ └── TableOfContents.tsx │ ├── Showcase.jsx │ ├── Udels │ │ ├── UdelFrame.jsx │ │ ├── Udels.jsx │ │ ├── UdelsEditor.jsx │ │ └── UdelsHeader.jsx │ └── Youtube.jsx ├── config.ts ├── content │ ├── blog │ │ ├── release-0.0.2-schwindlig.mdx │ │ ├── release-0.0.2.1-stuermisch.mdx │ │ ├── release-0.0.3-maelstrom.mdx │ │ ├── release-0.0.4-gischt.mdx │ │ ├── release-0.3.0-donauwelle.mdx │ │ ├── release-0.4.0-brandung.mdx │ │ ├── release-0.5.0-wirbel.mdx │ │ ├── release-0.6.0-zimtschnecke.mdx │ │ ├── release-0.7.0-zuckerguss.mdx │ │ ├── release-0.8.0-himbeermuffin.mdx │ │ ├── release-0.9.0-bananenbrot.mdx │ │ ├── release-1.0.0-geburtstagskuchen.mdx │ │ └── year-2.mdx │ └── config.ts ├── cx.mjs ├── docs │ ├── ApiDoc.jsx │ ├── Colors.jsx │ ├── Icon.jsx │ ├── JsDoc.astro │ ├── JsDoc.jsx │ ├── MiniRepl.astro │ ├── MiniRepl.css │ ├── MiniRepl.jsx │ ├── MobileNav.jsx │ ├── docs.css │ └── link.svg ├── env.d.ts ├── examples.mjs ├── languages.ts ├── layouts │ └── MainLayout.astro ├── metadata_parser.js ├── my_patterns.js ├── pages │ ├── bakery.astro │ ├── blog.astro │ ├── de │ │ └── workshop │ │ │ ├── first-effects.mdx │ │ │ ├── first-notes.mdx │ │ │ ├── first-sounds.mdx │ │ │ ├── getting-started.mdx │ │ │ ├── index.astro │ │ │ ├── pattern-effects.mdx │ │ │ └── recap.mdx │ ├── embed.astro │ ├── examples │ │ └── index.astro │ ├── functions │ │ ├── intro.mdx │ │ └── value-modifiers.mdx │ ├── index.astro │ ├── intro │ │ └── showcase.mdx │ ├── learn │ │ ├── accumulation.mdx │ │ ├── code.mdx │ │ ├── colors.mdx │ │ ├── conditional-modifiers.mdx │ │ ├── csound.mdx │ │ ├── devicemotion.mdx │ │ ├── effects.mdx │ │ ├── factories.mdx │ │ ├── getting-started.mdx │ │ ├── hydra.mdx │ │ ├── index.astro │ │ ├── input-devices.mdx │ │ ├── input-output.mdx │ │ ├── metadata.mdx │ │ ├── mini-notation.mdx │ │ ├── notes.mdx │ │ ├── pwa.mdx │ │ ├── random-modifiers.mdx │ │ ├── samples.mdx │ │ ├── signals.mdx │ │ ├── sounds.mdx │ │ ├── stepwise.mdx │ │ ├── strudel-vs-tidal.mdx │ │ ├── synths.mdx │ │ ├── time-modifiers.mdx │ │ ├── tonal.mdx │ │ └── visual-feedback.mdx │ ├── recipes │ │ ├── arpeggios.mdx │ │ ├── microrhythms.mdx │ │ ├── recipes.mdx │ │ └── rhythms.mdx │ ├── rss.xml.js │ ├── swatch │ │ └── index.astro │ ├── technical-manual │ │ ├── about.mdx │ │ ├── alignment.mdx │ │ ├── docs.mdx │ │ ├── internals.mdx │ │ ├── packages.mdx │ │ ├── patterns.mdx │ │ ├── project-start.mdx │ │ ├── repl.mdx │ │ ├── sounds.mdx │ │ └── testing.mdx │ ├── tutorial │ │ └── index.astro │ ├── udels │ │ └── index.astro │ ├── understand │ │ ├── cycles.mdx │ │ ├── pitch.mdx │ │ └── voicings.mdx │ └── workshop │ │ ├── first-effects.mdx │ │ ├── first-notes.mdx │ │ ├── first-sounds.mdx │ │ ├── getting-started.mdx │ │ ├── index.astro │ │ ├── pattern-effects.mdx │ │ └── recap.mdx ├── pwa.ts ├── repl │ ├── Repl.css │ ├── Repl.jsx │ ├── components │ │ ├── BigPlayButton.jsx │ │ ├── Code.jsx │ │ ├── EmbeddedReplEditor.jsx │ │ ├── Header.jsx │ │ ├── Loader.jsx │ │ ├── NumberInput.jsx │ │ ├── ReplEditor.jsx │ │ ├── UserFacingErrorMessage.jsx │ │ ├── incrementor │ │ │ └── Incrementor.jsx │ │ ├── pagination │ │ │ └── Pagination.jsx │ │ ├── panel │ │ │ ├── AudioDeviceSelector.jsx │ │ │ ├── AudioEngineTargetSelector.jsx │ │ │ ├── ConsoleTab.jsx │ │ │ ├── FilesTab.jsx │ │ │ ├── Forms.jsx │ │ │ ├── ImportSoundsButton.jsx │ │ │ ├── Panel.jsx │ │ │ ├── PatternsTab.jsx │ │ │ ├── Reference.jsx │ │ │ ├── SelectInput.jsx │ │ │ ├── SettingsTab.jsx │ │ │ ├── SoundsTab.jsx │ │ │ └── WelcomeTab.jsx │ │ ├── textbox │ │ │ └── Textbox.jsx │ │ ├── useLogger.jsx │ │ └── usedebounce.jsx │ ├── drawings.mjs │ ├── drum_patterns.mjs │ ├── favicon.ico │ ├── files.mjs │ ├── idbutils.mjs │ ├── piano.mjs │ ├── prebake.mjs │ ├── tunes.mjs │ ├── useExamplePatterns.jsx │ ├── useReplContext.jsx │ └── util.mjs ├── settings.mjs ├── styles │ └── index.css ├── tauri.mjs ├── useClient.mjs ├── useEvent.mjs ├── useFrame.mjs └── user_pattern_utils.mjs ├── tailwind.config.cjs └── tsconfig.json /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "node": true, 4 | "browser": true, 5 | "es2021": true 6 | }, 7 | "extends": ["eslint:recommended"], 8 | "overrides": [], 9 | "parserOptions": { 10 | "ecmaVersion": "latest", 11 | "sourceType": "module" 12 | }, 13 | "plugins": ["import"], 14 | "rules": { 15 | "no-unused-vars": ["warn", { "destructuredArrayIgnorePattern": ".", "ignoreRestSiblings": false }], 16 | "import/no-extraneous-dependencies": ["error", {"devDependencies": true}] 17 | }, 18 | "files": ["**/*.mjs", "**/*.js"] 19 | } 20 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | open_collective: tidalcycles 4 | -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: Build and Deploy 2 | 3 | on: [workflow_dispatch] 4 | 5 | # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages 6 | permissions: 7 | contents: read 8 | pages: write 9 | id-token: write 10 | deployments: write 11 | 12 | # Allow one concurrent deployment 13 | concurrency: 14 | group: "pages" 15 | cancel-in-progress: true 16 | 17 | jobs: 18 | build: 19 | runs-on: ubuntu-latest 20 | environment: 21 | name: github-pages 22 | url: ${{ steps.deployment.outputs.page_url }} 23 | steps: 24 | - uses: actions/checkout@v4 25 | - uses: pnpm/action-setup@v4 26 | with: 27 | version: 9.12.2 28 | - uses: actions/setup-node@v4 29 | with: 30 | node-version: 20 31 | cache: "pnpm" 32 | - name: Install Dependencies 33 | run: pnpm install 34 | 35 | - name: Build 36 | run: pnpm build 37 | 38 | - name: Setup Pages 39 | uses: actions/configure-pages@v2 40 | 41 | - name: Upload artifact 42 | uses: actions/upload-pages-artifact@v3 43 | with: 44 | # Upload entire repository 45 | path: "./website/dist" 46 | 47 | - name: Deploy to GitHub Pages 48 | id: deployment 49 | uses: actions/deploy-pages@v4 50 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Strudel tests 2 | 3 | on: [push, pull_request] 4 | 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | strategy: 9 | matrix: 10 | node-version: [20] 11 | 12 | steps: 13 | - uses: actions/checkout@v4 14 | - uses: pnpm/action-setup@v4 15 | with: 16 | version: 9.12.2 17 | - uses: actions/setup-node@v4 18 | with: 19 | node-version: ${{ matrix.node-version }} 20 | cache: 'pnpm' 21 | - run: pnpm install 22 | - run: pnpm run format-check 23 | - run: pnpm run lint 24 | - run: pnpm test 25 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | *.md 2 | *.json 3 | *.yml 4 | *. 5 | **/out 6 | **/dist 7 | packages/mini/krill-parser.js 8 | packages/xen/tunejs.js 9 | paper 10 | pnpm-lock.yaml 11 | pnpm-workspace.yaml 12 | **/dev-dist 13 | website/.astro 14 | !tidal-drum-machines.json 15 | !tidal-drum-machines-alias.json 16 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 120, 3 | "useTabs": false, 4 | "tabWidth": 2, 5 | "semi": true, 6 | "singleQuote": true, 7 | "jsxSingleQuote": false, 8 | "trailingComma": "all", 9 | "bracketSpacing": true, 10 | "bracketSameLine": false, 11 | "arrowParens": "always", 12 | "proseWrap": "preserve", 13 | "htmlWhitespaceSensitivity": "css", 14 | "endOfLine": "lf" 15 | } 16 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "cSpell.words": [ 3 | "subspan", 4 | "vals" 5 | ], 6 | "yaml.schemas": { 7 | "https://json.schemastore.org/github-workflow.json": "file:///home/felix/projects/strudel/.github/workflows/deploy.yml" 8 | }, 9 | "testing.automaticallyOpenPeekView": "never" 10 | } -------------------------------------------------------------------------------- /bench/tunes.bench.mjs: -------------------------------------------------------------------------------- 1 | import { queryCode, testCycles } from '../test/runtime.mjs'; 2 | import * as tunes from '../website/src/repl/tunes.mjs'; 3 | import { describe, bench } from 'vitest'; 4 | import { calculateSteps } from '../packages/core/index.mjs'; 5 | 6 | const tuneKeys = Object.keys(tunes); 7 | 8 | describe('renders tunes', () => { 9 | tuneKeys.forEach((key) => { 10 | describe(key, () => { 11 | calculateSteps(true); 12 | bench(`+steps`, async () => { 13 | await queryCode(tunes[key], testCycles[key] || 1); 14 | }); 15 | calculateSteps(false); 16 | bench(`-steps`, async () => { 17 | await queryCode(tunes[key], testCycles[key] || 1); 18 | }); 19 | calculateSteps(true); 20 | }); 21 | }); 22 | }); 23 | -------------------------------------------------------------------------------- /examples/README.md: -------------------------------------------------------------------------------- 1 | # examples 2 | 3 | This folder contains usage examples for different scenarios. 4 | -------------------------------------------------------------------------------- /examples/buildless/README.md: -------------------------------------------------------------------------------- 1 | # buildless examples 2 | 3 | These examples show you how strudel can be used in a regular html file, without the need for a build tool. 4 | 5 | Most examples are using [skypack](https://www.skypack.dev/) 6 | -------------------------------------------------------------------------------- /examples/buildless/basic.html: -------------------------------------------------------------------------------- 1 | 8 |
9 | 23 |
24 | This page shows how skypack can be used to import strudel core directly into a simple html page.
25 | No server, no bundler and no build setup is needed to run this!
26 |
20 | 23 |
24 |
21 |
21 |
24 | {!isZen && panelPosition === 'right' && 20 | ⚠ All events routed to OSC, audio is silenced! See{' '} 21 | 22 | Docs 23 | 24 |
25 |