Compare commits

..

11 Commits

Author SHA1 Message Date
prezmop d92d93e37d Merge branch 'tidalcycles:main' into prepare 2025-06-01 12:07:24 +00:00
prezmop 685937911c correct the signnature of prepare() in README 2025-05-24 05:55:04 +09:00
prezmop 31a164a09f document prepare() in the README file 2025-05-24 05:40:01 +09:00
prezmop be8b4d7873 make prepare() async 2025-05-24 04:34:02 +09:00
prezmop 60388e5798 lint 2025-04-26 18:09:48 +09:00
prezmop 88823d26b1 formatting 2025-04-26 18:08:07 +09:00
prezmop e4099946cd use prepare in web 2025-04-26 18:05:16 +09:00
prezmop 3a49ba6eb1 use prepare in repl 2025-04-26 18:04:50 +09:00
prezmop eac45d06b3 add prepare to cyclist 2025-04-26 18:03:44 +09:00
prezmop 8674b61c2c add prepare functionality to webaudio 2025-04-26 17:47:54 +09:00
prezmop af27364c45 add prepare() to superdough 2025-04-26 17:47:27 +09:00
119 changed files with 1022 additions and 1441 deletions
+24 -12
View File
@@ -2,6 +2,13 @@ name: Build and Deploy
on: [workflow_dispatch]
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions:
contents: read
pages: write
id-token: write
deployments: write
# Allow one concurrent deployment
concurrency:
group: "pages"
@@ -9,9 +16,10 @@ concurrency:
jobs:
build:
runs-on: docker
env:
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
@@ -20,18 +28,22 @@ jobs:
- uses: actions/setup-node@v4
with:
node-version: 20
# cache: "pnpm"
cache: "pnpm"
- name: Install Dependencies
run: pnpm install
- name: Build
run: pnpm build
- name: Deploy
run: |
eval $(ssh-agent -s)
echo "$SSH_PRIVATE_KEY" | ssh-add -
apt update && apt install -y rsync
mkdir ~/.ssh
ssh-keyscan matrix.toplap.org > ~/.ssh/known_hosts
rsync -atv --delete --delete-after --progress ./website/dist/ strudel@matrix.toplap.org:/home/strudel/deploy
- name: Setup Pages
uses: actions/configure-pages@v2
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
# Upload entire repository
path: "./website/dist"
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
+2 -2
View File
@@ -4,7 +4,7 @@ on: [push, pull_request]
jobs:
build:
runs-on: docker
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [20]
@@ -17,7 +17,7 @@ jobs:
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
# cache: 'pnpm'
cache: 'pnpm'
- run: pnpm install
- run: pnpm run format-check
- run: pnpm run lint
-1
View File
@@ -130,4 +130,3 @@ fabric.properties
samples/*
!samples/README.md
.idea/
-1
View File
@@ -13,4 +13,3 @@ pnpm-workspace.yaml
website/.astro
!tidal-drum-machines.json
!tidal-drum-machines-alias.json
.pnpm-store
+5 -15
View File
@@ -2,21 +2,11 @@
Thanks for wanting to contribute!!! There are many ways you can add value to this project
## Move to codeberg
We are currently in the process of moving from github to codeberg -- not everything is working, please bear with us.
To update your local clone, you can run this command:
```
git remote set-url origin git@codeberg.org:uzu/strudel.git
```
## Communication Channels
To get in touch with the contributors, either
- open a [github discussion](https://github.com/tidalcycles/strudel/discussions) or
- [join the Tidal Discord Channel](https://discord.gg/remJ6gQA) and go to the #strudel channel
- Find related discussions on the [tidal club forum](https://club.tidalcycles.org/)
@@ -42,7 +32,7 @@ Use one of the Communication Channels listed above.
## Improve the Docs
If you find some weak spots in the [docs](https://strudel.cc/workshop/getting-started/),
you can edit each file directly on codeburg. (we are currently fixing the "Edit this page" links in the right sidebar)
you can edit each file directly on github via the "Edit this page" link located in the right sidebar.
## Propose a Feature
@@ -51,7 +41,7 @@ Maybe you even want to help with the implementation of that feature!
## Report a Bug
If you've found a bug, or some behaviour that does not seem right, you are welcome to file an [issue](https://codeberg.org/uzu/strudel/issues).
If you've found a bug, or some behaviour that does not seem right, you are welcome to file an [issue](https://github.com/tidalcycles/strudel/issues).
Please check that it has not been reported before.
## Fix a Bug
@@ -81,7 +71,7 @@ To get the project up and running for development, make sure you have installed:
then, do the following:
```sh
git clone https://codeberg.org/uzu/strudel.git && cd strudel
git clone https://github.com/tidalcycles/strudel.git && cd strudel
pnpm i # install at root to symlink packages
pnpm start # start repl
```
@@ -123,7 +113,7 @@ You can run the same check with `pnpm check`
## Package Workflow
The project is split into multiple [packages](https://codeberg.org/uzu/strudel/src/branch/main/packages) with independent versioning.
The project is split into multiple [packages](https://github.com/tidalcycles/strudel/tree/main/packages) with independent versioning.
When you run `pnpm i` on the root folder, [pnpm workspaces](https://pnpm.io/workspaces) will install all dependencies of all subpackages. This will allow any js file to import `@strudel/<package-name>` to get the local version,
allowing to develop multiple packages at the same time.
+3 -4
View File
@@ -1,9 +1,8 @@
# strudel
Live coding patterns on the web
https://strudel.cc/
[![Strudel test status](https://github.com/tidalcycles/strudel/actions/workflows/test.yml/badge.svg)](https://github.com/tidalcycles/strudel/actions) [![DOI](https://zenodo.org/badge/450927247.svg)](https://doi.org/10.5281/zenodo.6659278)
Development is moving to https://codeberg.org/uzu/strudel
An experiment in making a [Tidal](https://github.com/tidalcycles/tidal/) using web technologies. This software is a bit more stable now, but please continue to tread carefully.
- Try it here: <https://strudel.cc>
- Docs: <https://strudel.cc/learn>
@@ -40,7 +39,7 @@ Licensing info for the default sound banks can be found over on the [dough-sampl
There are many ways to contribute to this project! See [contribution guide](./CONTRIBUTING.md).
<a href="https://codeberg.org/uzu/strudel/activity/contributors">
<a href="https://github.com/tidalcycles/strudel/graphs/contributors">
<img src="https://contrib.rocks/image?repo=tidalcycles/strudel" />
</a>
+3 -3
View File
@@ -11,7 +11,7 @@
},
"repository": {
"type": "git",
"url": "git+https://codeberg.org/uzu/strudel.git"
"url": "git+https://github.com/tidalcycles/strudel.git"
},
"keywords": [
"titdalcycles",
@@ -23,9 +23,9 @@
"author": "Felix Roos <flix91@gmail.com>",
"license": "AGPL-3.0-or-later",
"bugs": {
"url": "https://codeberg.org/uzu/strudel/issues"
"url": "https://github.com/tidalcycles/strudel/issues"
},
"homepage": "https://codeberg.org/uzu/strudel#readme",
"homepage": "https://github.com/tidalcycles/strudel#readme",
"dependencies": {
"@strudel/web": "workspace:*",
"hs2js": "workspace:*"
+1 -1
View File
@@ -1,6 +1,6 @@
/*
jsdoc-synonyms.js - Add support for @synonym tag
Copyright (C) 2023 Strudel contributors - see <https://codeberg.org/uzu/strudel/activity/contributors>
Copyright (C) 2023 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/midi/midi.mjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+13 -9
View File
@@ -5,24 +5,22 @@ made into a pattern swatch.
Example: <https://felixroos.github.io/strudel/swatch/>
Please note: These instructions have not been fully tested/adapted since strudel moved to codeberg from github. PRs welcome!
## deploy
### 1. fork the [strudel repo on codeberg](https://codeberg.org/uzu/strudel.git)
### 1. fork the [strudel repo on github](https://github.com/tidalcycles/strudel.git)
### 2. clone your fork to your machine `git clone https://codeberg.org/<your-username>/strudel.git strudel && cd strudel`
### 2. clone your fork to your machine `git clone https://github.com/<your-username>/strudel.git strudel && cd strudel`
### 3. create a separate branch like `git branch patternuary && git checkout patternuary`
### 4. save one or more .txt files in the my-patterns folder
### 5. edit `website/public/CNAME` to contain `<your-username>.codeberg.page/strudel`
### 5. edit `website/public/CNAME` to contain `<your-username>.github.io/strudel`
### 6. edit `website/astro.config.mjs` to use site: `https://<your-username>.codeberg.page` and base `/strudel`, like this
### 6. edit `website/astro.config.mjs` to use site: `https://<your-username>.github.io` and base `/strudel`, like this
```js
const site = 'https://<your-username>.codeberg.page';
const site = 'https://<your-username>.github.io';
const base = '/strudel';
```
@@ -32,9 +30,15 @@ const base = '/strudel';
git add . && git commit -m "site config" && git push --set-upstream origin
```
### 8. deploy to codeberg pages
### 8. deploy to github pages
### 9. view your patterns at `<your-username>.codeberg.page/strudel/swatch/`
- go to settings -> pages and select "Github Actions" as source
- go to settings -> environments -> github-pages and press the edit button next to `main` and type in `patternuary` (under "Deployment branches")
- go to Actions -> `Build and Deploy` and click `Run workflow` with branch `patternuary`
### 9. view your patterns at `<your-username>.github.io/strudel/swatch/`
Alternatively, github pages allows you to use a custom domain, like https://mycooldomain.org/swatch/. [See their documentation for details](https://docs.github.com/en/pages/configuring-a-custom-domain-for-your-github-pages-site).
### 10. optional: automatic deployment
+3 -3
View File
@@ -31,7 +31,7 @@
},
"repository": {
"type": "git",
"url": "git+https://codeberg.org/uzu/strudel.git"
"url": "git+https://github.com/tidalcycles/strudel.git"
},
"keywords": [
"tidalcycles",
@@ -43,7 +43,7 @@
"author": "Alex McLean <alex@slab.org> (https://slab.org)",
"license": "AGPL-3.0-or-later",
"bugs": {
"url": "https://codeberg.org/uzu/strudel/issues"
"url": "https://github.com/tidalcycles/strudel/issues"
},
"homepage": "https://strudel.cc",
"dependencies": {
@@ -74,4 +74,4 @@
"vitest": "^3.0.4",
"vite-plugin-bundle-audioworklet": "workspace:*"
}
}
}
+1 -1
View File
@@ -2,4 +2,4 @@
Each folder represents one of the @strudel/* packages [published to npm](https://www.npmjs.com/org/strudel).
To understand how those pieces connect, refer to the [Technical Manual](https://codeberg.org/uzu/strudel/src/branch/main/technical-manual.md) or the individual READMEs.
To understand how those pieces connect, refer to the [Technical Manual](https://github.com/tidalcycles/strudel/wiki/Technical-Manual) or the individual READMEs.
+3 -3
View File
@@ -13,7 +13,7 @@
"type": "module",
"repository": {
"type": "git",
"url": "git+https://codeberg.org/uzu/strudel.git"
"url": "git+https://github.com/tidalcycles/strudel.git"
},
"keywords": [
"tidalcycles",
@@ -28,9 +28,9 @@
],
"license": "AGPL-3.0-or-later",
"bugs": {
"url": "https://codeberg.org/uzu/strudel/issues"
"url": "https://github.com/tidalcycles/strudel/issues"
},
"homepage": "https://codeberg.org/uzu/strudel#readme",
"homepage": "https://github.com/tidalcycles/strudel#readme",
"dependencies": {
"@codemirror/autocomplete": "^6.18.4",
"@codemirror/commands": "^6.8.0",
+1 -1
View File
@@ -113,7 +113,7 @@ self.onconnect = function (e) {
port.start(); // Required when using addEventListener. Otherwise called implicitly by onmessage setter.
};
// used to consistently schedule events, for use in a service worker - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/core/clockworker.mjs>
// used to consistently schedule events, for use in a service worker - see <https://github.com/tidalcycles/strudel/blob/main/packages/core/clockworker.mjs>
function createClock(
getTime,
callback, // called slightly before each cycle
+6 -6
View File
@@ -1,6 +1,6 @@
/*
controls.mjs - Registers audio controls for pattern manipulation and effects.
Copyright (C) 2022 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/core/controls.mjs>
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/core/controls.mjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
@@ -96,7 +96,7 @@ export const { source, src } = registerControl('source', 'src');
* @example
* s("bd sd [~ bd] sd,hh*6").n("<0 1>")
*/
// also see https://codeberg.org/uzu/strudel/pulls/63
// also see https://github.com/tidalcycles/strudel/pull/63
export const { n } = registerControl('n');
/**
* Plays the given note name or midi number. A note name consists of
@@ -348,7 +348,7 @@ export const { bandf, bpf, bp } = registerControl(['bandf', 'bandq', 'bpenv'], '
* s("bd sd [~ bd] sd").bpf(500).bpq("<0 1 2 3>")
*
*/
// currently an alias of 'bandq' https://codeberg.org/uzu/strudel/issues/496
// currently an alias of 'bandq' https://github.com/tidalcycles/strudel/issues/496
// ['bpq'],
export const { bandq, bpq } = registerControl('bandq', 'bpq');
/**
@@ -855,7 +855,7 @@ export const { fanchor } = registerControl('fanchor');
* s("bd sd [~ bd] sd,hh*8").hpf("<2000 2000:25>")
*
*/
// currently an alias of 'hcutoff' https://codeberg.org/uzu/strudel/issues/496
// currently an alias of 'hcutoff' https://github.com/tidalcycles/strudel/issues/496
// ['hpf'],
/**
* Applies a vibrato to the frequency of the oscillator.
@@ -922,7 +922,7 @@ export const { hresonance, hpq } = registerControl('hresonance', 'hpq');
* s("bd sd [~ bd] sd,hh*8").lpf(2000).lpq("<0 10 20 30>")
*
*/
// currently an alias of 'resonance' https://codeberg.org/uzu/strudel/issues/496
// currently an alias of 'resonance' https://github.com/tidalcycles/strudel/issues/496
export const { resonance, lpq } = registerControl('resonance', 'lpq');
/**
* DJ filter, below 0.5 is low pass filter, above is high pass filter.
@@ -1288,7 +1288,7 @@ export const { semitone } = registerControl('semitone');
// TODO: synth param
export const { voice } = registerControl('voice');
// voicings // https://codeberg.org/uzu/strudel/issues/506
// voicings // https://github.com/tidalcycles/strudel/issues/506
// chord to voice, like C Eb Fm7 G7. the symbols can be defined via addVoicings
export const { chord } = registerControl('chord');
// which dictionary to use for the voicings
+38 -3
View File
@@ -1,6 +1,6 @@
/*
cyclist.mjs - event scheduler for a single strudel instance. for multi-instance scheduler, see - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/core/neocyclist.mjs>
Copyright (C) 2022 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/core/cyclist.mjs>
cyclist.mjs - event scheduler for a single strudel instance. for multi-instance scheduler, see - see <https://github.com/tidalcycles/strudel/blob/main/packages/core/neocyclist.mjs>
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/core/cyclist.mjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
@@ -11,6 +11,7 @@ export class Cyclist {
constructor({
interval,
onTrigger,
onPrepare,
onToggle,
onError,
getTime,
@@ -18,6 +19,7 @@ export class Cyclist {
setInterval,
clearInterval,
beforeStart,
prepareTime = 4,
}) {
this.started = false;
this.beforeStart = beforeStart;
@@ -26,6 +28,8 @@ export class Cyclist {
this.lastTick = 0; // absolute time when last tick (clock callback) happened
this.lastBegin = 0; // query begin of last tick
this.lastEnd = 0; // query end of last tick
this.preparedUntil = 0;
this.prepareTime = prepareTime;
this.getTime = getTime; // get absolute time
this.num_cycles_at_cps_change = 0;
this.seconds_at_cps_change; // clock phase when cps was changed
@@ -65,7 +69,7 @@ export class Cyclist {
(hap.whole.begin - this.num_cycles_at_cps_change) / this.cps + this.seconds_at_cps_change + latency;
const duration = hap.duration / this.cps;
// the following line is dumb and only here for backwards compatibility
// see https://codeberg.org/uzu/strudel/pulls/1004
// see https://github.com/tidalcycles/strudel/pull/1004
const deadline = targetTime - phase;
onTrigger?.(hap, deadline, duration, this.cps, targetTime);
if (hap.value.cps !== undefined && this.cps != hap.value.cps) {
@@ -85,6 +89,33 @@ export class Cyclist {
setInterval,
clearInterval,
);
onPrepare
? (this.prepClock = createClock(
getTime,
(phase, duration, _, t) => {
try {
const start = Math.max(t, this.preparedUntil);
const end = t + this.prepareTime;
this.preparedUntil = end;
const haps = this.pattern.queryArc(start, end, { _cps: 1 });
haps.forEach((hap) => {
onPrepare?.(hap);
});
} catch (e) {
logger(`[cyclist] error: ${e.message}`);
onError?.(e);
}
},
1, // duration of each cycle
1,
0,
setInterval,
clearInterval,
))
: null;
}
now() {
if (!this.started) {
@@ -106,16 +137,19 @@ export class Cyclist {
}
logger('[cyclist] start');
this.clock.start();
this.prepClock?.start();
this.setStarted(true);
}
pause() {
logger('[cyclist] pause');
this.clock.pause();
this.prepClock?.pause();
this.setStarted(false);
}
stop() {
logger('[cyclist] stop');
this.clock.stop();
this.prepClock?.stop();
this.lastEnd = 0;
this.setStarted(false);
}
@@ -130,6 +164,7 @@ export class Cyclist {
return;
}
this.cps = cps;
this.preparedUntil = 0;
this.num_ticks_since_cps_change = 0;
}
log(begin, end, haps) {
+1 -1
View File
@@ -1,6 +1,6 @@
/*
drawLine.mjs - <short description TODO>
Copyright (C) 2022 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/core/drawLine.mjs>
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/core/drawLine.mjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+24 -23
View File
@@ -2,7 +2,7 @@
euclid.mjs - Bjorklund/Euclidean/Diaspora rhythms
Copyright (C) 2023 Rohan Drape and strudel contributors
See <https://codeberg.org/uzu/strudel/src/branch/main/packages/core/euclid.mjs> for authors of this file.
See <https://github.com/tidalcycles/strudel/blob/main/packages/core/euclid.mjs> for authors of this file.
The Bjorklund algorithm implementation is ported from the Haskell Music Theory Haskell module by Rohan Drape -
https://rohandrape.net/?t=hmt
@@ -10,9 +10,9 @@ https://rohandrape.net/?t=hmt
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import { timeCat, register, silence } from './pattern.mjs';
import { Pattern, timeCat, register, silence } from './pattern.mjs';
import { rotate, flatten, splitAt, zipWith } from './util.mjs';
import Fraction, { lcm } from './fraction.mjs';
import Fraction from './fraction.mjs';
const left = function (n, x) {
const [ons, offs] = n;
@@ -42,26 +42,29 @@ const _bjork = function (n, x) {
export const bjork = function (ons, steps) {
const inverted = ons < 0;
const absOns = Math.abs(ons);
const offs = steps - absOns;
const ones = Array(absOns).fill([1]);
const zeros = Array(offs).fill([0]);
const result = _bjork([absOns, offs], [ones, zeros]);
const pattern = flatten(result[1][0]).concat(flatten(result[1][1]));
return inverted ? pattern.map((x) => 1 - x) : pattern;
ons = Math.abs(ons);
const offs = steps - ons;
const x = Array(ons).fill([1]);
const y = Array(offs).fill([0]);
const result = _bjork([ons, offs], [x, y]);
const p = flatten(result[1][0]).concat(flatten(result[1][1]));
if (inverted) {
return p.map((x) => (x === 0 ? 1 : 0));
}
return p;
};
/**
* Changes the structure of the pattern to form an Euclidean rhythm.
* Euclidean rhythms are rhythms obtained using the greatest common
* Changes the structure of the pattern to form an euclidean rhythm.
* Euclidian rhythms are rhythms obtained using the greatest common
* divisor of two numbers. They were described in 2004 by Godfried
* Toussaint, a Canadian computer scientist. Euclidean rhythms are
* Toussaint, a canadian computer scientist. Euclidian rhythms are
* really useful for computer/algorithmic music because they can
* describe a large number of rhythms with a couple of numbers.
*
* @memberof Pattern
* @name euclid
* @param {number} pulses the number of onsets/beats
* @param {number} pulses the number of onsets / beats
* @param {number} steps the number of steps to fill
* @returns Pattern
* @example
@@ -73,7 +76,7 @@ export const bjork = function (ons, steps) {
* Like `euclid`, but has an additional parameter for 'rotating' the resulting sequence.
* @memberof Pattern
* @name euclidRot
* @param {number} pulses the number of onsets/beats
* @param {number} pulses the number of onsets / beats
* @param {number} steps the number of steps to fill
* @param {number} rotation offset in steps
* @returns Pattern
@@ -83,13 +86,13 @@ export const bjork = function (ons, steps) {
*/
/**
* @example // A thirteenth-century Persian rhythm called Khafif-e-ramal.
* @example // A thirteenth century Persian rhythm called Khafif-e-ramal.
* note("c3").euclid(2,5)
* @example // The archetypal pattern of the Cumbia from Colombia, as well as a Calypso rhythm from Trinidad.
* note("c3").euclid(3,4)
* @example // Another thirteenth century Persian rhythm by the name of Khafif-e-ramal, as well as a Rumanian folk-dance rhythm.
* note("c3").euclidRot(3,5,2)
* @example // A Ruchenitza rhythm used in a Bulgarian folk dance.
* @example // A Ruchenitza rhythm used in a Bulgarian folk-dance.
* note("c3").euclid(3,7)
* @example // The Cuban tresillo pattern.
* note("c3").euclid(3,8)
@@ -148,10 +151,8 @@ export const { euclidrot, euclidRot } = register(['euclidrot', 'euclidRot'], fun
* so there will be no gaps.
* @name euclidLegato
* @memberof Pattern
* @param {number} pulses the number of onsets/beats
* @param {number} pulses the number of onsets / beats
* @param {number} steps the number of steps to fill
* @param rotation offset in steps
* @param pat
* @example
* note("c3").euclidLegato(3,8)
*/
@@ -160,13 +161,13 @@ const _euclidLegato = function (pulses, steps, rotation, pat) {
if (pulses < 1) {
return silence;
}
const bin_pat = _euclidRot(pulses, steps, 0);
const bin_pat = _euclidRot(pulses, steps, rotation);
const gapless = bin_pat
.join('')
.split('1')
.slice(1)
.map((s) => [s.length + 1, true]);
return pat.struct(timeCat(...gapless)).late(Fraction(rotation).div(steps));
return pat.struct(timeCat(...gapless));
};
export const euclidLegato = register(['euclidLegato'], function (pulses, steps, pat) {
@@ -179,7 +180,7 @@ export const euclidLegato = register(['euclidLegato'], function (pulses, steps,
* the resulting sequence
* @name euclidLegatoRot
* @memberof Pattern
* @param {number} pulses the number of onsets/beats
* @param {number} pulses the number of onsets / beats
* @param {number} steps the number of steps to fill
* @param {number} rotation offset in steps
* @example
+1 -1
View File
@@ -1,6 +1,6 @@
/*
evaluate.mjs - <short description TODO>
Copyright (C) 2022 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/core/evaluate.mjs>
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/core/evaluate.mjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+1 -1
View File
@@ -1,6 +1,6 @@
/*
fraction.mjs - <short description TODO>
Copyright (C) 2022 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/core/fraction.mjs>
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/core/fraction.mjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+1 -1
View File
@@ -1,6 +1,6 @@
/*
hap.mjs - <short description TODO>
Copyright (C) 2022 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/core/hap.mjs>
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/core/hap.mjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import Fraction from './fraction.mjs';
+1 -1
View File
@@ -1,6 +1,6 @@
/*
index.mjs - <short description TODO>
Copyright (C) 2022 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/core/index.mjs>
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/core/index.mjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+1 -1
View File
@@ -1,6 +1,6 @@
/*
neocyclist.mjs - event scheduler like cyclist, except recieves clock pulses from clockworker in order to sync across multiple instances.
Copyright (C) 2022 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/core/neocyclist.mjs>
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/core/neocyclist.mjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+2 -2
View File
@@ -15,7 +15,7 @@
},
"repository": {
"type": "git",
"url": "git+https://codeberg.org/uzu/strudel.git"
"url": "git+https://github.com/tidalcycles/strudel.git"
},
"keywords": [
"tidalcycles",
@@ -27,7 +27,7 @@
"author": "Alex McLean <alex@slab.org> (https://slab.org)",
"license": "AGPL-3.0-or-later",
"bugs": {
"url": "https://codeberg.org/uzu/strudel/issues"
"url": "https://github.com/tidalcycles/strudel/issues"
},
"homepage": "https://strudel.cc",
"dependencies": {
+1 -20
View File
@@ -1,6 +1,6 @@
/*
pattern.mjs - Core pattern representation for strudel
Copyright (C) 2025 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/core/pattern.mjs>
Copyright (C) 2025 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/core/pattern.mjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
@@ -3192,25 +3192,6 @@ export const slice = register(
false, // turns off auto-patternification
);
/**
*
* make something happen on event time
* uses browser timeout which is innacurate for audio tasks
* @name onTriggerTime
* @memberof Pattern
* @returns Pattern
* @example
* s("bd!8").onTriggerTime((hap) => {console.info(hap)})
*/
Pattern.prototype.onTriggerTime = function (func) {
return this.onTrigger((t_deprecate, hap, currentTime, cps = 1, targetTime) => {
const diff = targetTime - currentTime;
window.setTimeout(() => {
func(hap);
}, diff * 1000);
}, false);
};
/**
* Works the same as slice, but changes the playback speed of each slice to match the duration of its step.
* @name splice
+1 -1
View File
@@ -1,6 +1,6 @@
/*
pick.mjs - methods that use one pattern to pick events from other patterns.
Copyright (C) 2024 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/core/signal.mjs>
Copyright (C) 2024 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/core/signal.mjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+13 -1
View File
@@ -8,6 +8,7 @@ import { register, Pattern, isPattern, silence, stack } from './pattern.mjs';
export function repl({
defaultOutput,
defaultPrepare,
onEvalError,
beforeEval,
beforeStart,
@@ -47,6 +48,7 @@ export function repl({
const schedulerOptions = {
onTrigger: getTrigger({ defaultOutput, getTime }),
onPrepare: getPrepare({ defaultPrepare }),
getTime,
onToggle: (started) => {
updateState({ started });
@@ -225,7 +227,7 @@ export function repl({
export const getTrigger =
({ getTime, defaultOutput }) =>
async (hap, deadline, duration, cps, t) => {
// TODO: get rid of deadline after https://codeberg.org/uzu/strudel/pulls/1004
// TODO: get rid of deadline after https://github.com/tidalcycles/strudel/pull/1004
try {
if (!hap.context.onTrigger || !hap.context.dominantTrigger) {
await defaultOutput(hap, deadline, duration, cps, t);
@@ -238,3 +240,13 @@ export const getTrigger =
logger(`[cyclist] error: ${err.message}`, 'error');
}
};
export const getPrepare =
({ defaultPrepare }) =>
async (hap) => {
try {
await defaultPrepare(hap);
} catch (err) {
logger(`[cyclist] error: ${err.message}`, 'error');
}
};
+6 -39
View File
@@ -1,6 +1,6 @@
/*
signal.mjs - continuous patterns
Copyright (C) 2024 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/core/signal.mjs>
Copyright (C) 2024 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/core/signal.mjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
@@ -486,34 +486,13 @@ export const wchooseCycles = (...pairs) => _wchooseWith(rand.segment(1), ...pair
export const wrandcat = wchooseCycles;
function _perlin(t) {
let ta = Math.floor(t);
let tb = ta + 1;
// this function expects pat to be a pattern of floats...
export const perlinWith = (pat) => {
const pata = pat.fmap(Math.floor);
const patb = pat.fmap((t) => Math.floor(t) + 1);
const smootherStep = (x) => 6.0 * x ** 5 - 15.0 * x ** 4 + 10.0 * x ** 3;
const interp = (x) => (a) => (b) => a + smootherStep(x) * (b - a);
const v = interp(t - ta)(timeToRand(ta))(timeToRand(tb));
return v;
}
export const perlinWith = (tpat) => {
return tpat.fmap(_perlin);
};
function _berlin(t) {
const prevRidgeStartIndex = Math.floor(t);
const nextRidgeStartIndex = prevRidgeStartIndex + 1;
const prevRidgeBottomPoint = timeToRand(prevRidgeStartIndex);
const nextRidgeTopPoint = timeToRand(nextRidgeStartIndex) + prevRidgeBottomPoint;
const currentPercent = (t - prevRidgeStartIndex) / (nextRidgeStartIndex - prevRidgeStartIndex);
const interp = (a, b, t) => {
return a + (b - a) * t;
};
return interp(prevRidgeBottomPoint, nextRidgeTopPoint, currentPercent) / 2;
}
export const berlinWith = (tpat) => {
return tpat.fmap(_berlin);
return pat.sub(pata).fmap(interp).appBoth(pata.fmap(timeToRand)).appBoth(patb.fmap(timeToRand));
};
/**
@@ -527,18 +506,6 @@ export const berlinWith = (tpat) => {
*/
export const perlin = perlinWith(time.fmap((v) => Number(v)));
/**
* Generates a continuous pattern of [berlin noise](conceived by Jame Coyne and Jade Rowland as a joke but turned out to be surprisingly cool and useful,
* like perlin noise but with sawtooth waves), in the range 0..1.
*
* @name berlin
* @example
* // ascending arpeggios
* n("0!16".add(berlin.fast(4).mul(14))).scale("d:minor")
*
*/
export const berlin = berlinWith(time.fmap((v) => Number(v)));
export const degradeByWith = register(
'degradeByWith',
(withPat, x, pat) => pat.fmap((a) => (_) => a).appLeft(withPat.filterValues((v) => v > x)),
+1 -1
View File
@@ -1,6 +1,6 @@
/*
speak.mjs - <short description TODO>
Copyright (C) 2022 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/core/speak.mjs>
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/core/speak.mjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+1 -1
View File
@@ -1,6 +1,6 @@
/*
state.mjs - <short description TODO>
Copyright (C) 2022 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/core/state.mjs>
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/core/state.mjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-89
View File
@@ -1,89 +0,0 @@
import { bjork } from '../euclid.mjs';
import { describe, expect, it } from 'vitest';
import { fastcat } from '../pattern.mjs';
describe('bjork', () => {
it('should apply bjorklund to ons and steps', () => {
expect(bjork(3, 8)).toStrictEqual([1, 0, 0, 1, 0, 0, 1, 0]);
expect(bjork(-3, 8)).toStrictEqual([0, 1, 1, 0, 1, 1, 0, 1]);
expect(bjork(8, 8)).toStrictEqual([1, 1, 1, 1, 1, 1, 1, 1]);
expect(bjork(-8, 8)).toStrictEqual([0, 0, 0, 0, 0, 0, 0, 0]);
expect(bjork(5, 8)).toStrictEqual([1, 0, 1, 1, 0, 1, 1, 0]);
});
});
describe('euclid', () => {
it('Can create euclid', () => {
expect(
fastcat('a')
.euclid(3, 8)
.firstCycle()
.sort((a, b) => a.part.begin.sub(b.part.begin))
.map((a) => a.showWhole(true)),
).toStrictEqual(['0/1 → 1/8: a', '3/8 → 1/2: a', '3/4 → 7/8: a']);
expect(
fastcat('a')
.euclid(5, 8)
.firstCycle()
.sort((a, b) => a.part.begin.sub(b.part.begin))
.map((a) => a.showWhole(true)),
).toStrictEqual(['0/1 → 1/8: a', '1/4 → 3/8: a', '3/8 → 1/2: a', '5/8 → 3/4: a', '3/4 → 7/8: a']);
});
});
describe('euclidRot', () => {
it('Can create euclidRot', () => {
expect(
fastcat('a')
.euclidRot(3, 8, 2)
.firstCycle()
.sort((a, b) => a.part.begin.sub(b.part.begin))
.map((a) => a.showWhole(true)),
).toStrictEqual(['0/1 → 1/8: a', '1/4 → 3/8: a', '5/8 → 3/4: a']);
expect(
fastcat('a')
.euclidRot(5, 8, 2)
.firstCycle()
.sort((a, b) => a.part.begin.sub(b.part.begin))
.map((a) => a.showWhole(true)),
).toStrictEqual(['0/1 → 1/8: a', '1/4 → 3/8: a', '1/2 → 5/8: a', '5/8 → 3/4: a', '7/8 → 1/1: a']);
});
});
describe('euclidLegato', () => {
it('Can create euclidLegato', () => {
expect(
fastcat('a')
.euclidLegato(3, 8)
.firstCycle()
.sort((a, b) => a.part.begin.sub(b.part.begin))
.map((a) => a.showWhole(true)),
).toStrictEqual(['0/1 → 3/8: a', '3/8 → 3/4: a', '3/4 → 1/1: a']);
expect(
fastcat('a')
.euclidLegato(5, 8)
.firstCycle()
.sort((a, b) => a.part.begin.sub(b.part.begin))
.map((a) => a.showWhole(true)),
).toStrictEqual(['0/1 → 1/4: a', '1/4 → 3/8: a', '3/8 → 5/8: a', '5/8 → 3/4: a', '3/4 → 1/1: a']);
});
});
describe('euclidLegatoRot', () => {
it('Can create euclidLegatoRot', () => {
expect(
fastcat('a')
.euclidLegatoRot(3, 8, 2)
.firstCycle()
.sort((a, b) => a.part.begin.sub(b.part.begin))
.map((a) => a.showWhole(true)),
).toStrictEqual(['0/1 → 1/4: a', '1/4 → 5/8: a', '5/8 → 1/1: a']);
expect(
fastcat('a')
.euclidLegatoRot(5, 8, 2)
.firstCycle()
.sort((a, b) => a.part.begin.sub(b.part.begin))
.map((a) => a.showWhole(true)),
).toStrictEqual(['0/1 → 1/4: a', '1/4 → 1/2: a', '1/2 → 5/8: a', '5/8 → 7/8: a', '7/8 → 1/1: a']);
});
});
+9 -56
View File
@@ -6,25 +6,21 @@ This program is free software: you can redistribute it and/or modify it under th
import { pure } from '../pattern.mjs';
import {
isNote,
tokenizeNote,
noteToMidi,
midiToFreq,
freqToMidi,
_mod,
compose,
flatten,
fractionalArgs,
freqToMidi,
getFrequency,
getPlayableNoteValue,
isNote,
midiToFreq,
noteToMidi,
numeralArgs,
parseFractional,
parseNumeral,
rotate,
splitAt,
tokenizeNote,
zipWith,
parseFractional,
numeralArgs,
fractionalArgs,
} from '../util.mjs';
import { describe, expect, it } from 'vitest';
import { describe, it, expect } from 'vitest';
describe('isNote', () => {
it('should recognize notes without accidentals', () => {
@@ -237,46 +233,3 @@ describe('fractionalArgs', () => {
expect(add('q', 2)).toBe(2.25);
});
});
describe('rotate', () => {
it('should rotate array to the left', () => {
expect(rotate([0, 1, 2, 3], 2)).toStrictEqual([2, 3, 0, 1]);
expect(rotate([0, 1, 2, 3], 0)).toStrictEqual([0, 1, 2, 3]);
expect(rotate([0, 1, 2, 3], -3)).toStrictEqual([1, 2, 3, 0]);
expect(rotate([0, 1, 2, 3], 3)).toStrictEqual([3, 0, 1, 2]);
expect(rotate([0], 3)).toStrictEqual([0]);
expect(rotate([], 3)).toStrictEqual([]);
});
});
describe('flatten', () => {
it('should flatten array by one level', () => {
expect(flatten([0, 1, 2, 3])).toStrictEqual([0, 1, 2, 3]);
expect(flatten([0, 1, [2, 3]])).toStrictEqual([0, 1, 2, 3]);
expect(flatten([0, [1, [2, 3]]])).toStrictEqual([0, 1, [2, 3]]);
expect(flatten([0])).toStrictEqual([0]);
expect(flatten([])).toStrictEqual([]);
});
});
describe('splitAt', () => {
it('should split array into two', () => {
expect(splitAt(2, [0, 1, 2, 3])).toStrictEqual([
[0, 1],
[2, 3],
]);
expect(splitAt(0, [0, 1, 2, 3])).toStrictEqual([[], [0, 1, 2, 3]]);
expect(splitAt(-3, [0, 1, 2, 3])).toStrictEqual([[0], [1, 2, 3]]);
expect(splitAt(3, [0, 1, 2, 3])).toStrictEqual([[0, 1, 2], [3]]);
});
});
describe('zipWith', () => {
it('should use the function to combine the two arrays element-wise', () => {
expect(zipWith((a, b) => a + b, [0, 1, 2, 3], [0, 1, 2, 3])).toStrictEqual([0, 2, 4, 6]);
expect(zipWith((a, b) => a + b, [0, 1, 2, 3], [0, 1, 2])).toStrictEqual([0, 2, 4, NaN]);
expect(zipWith((a, b) => a + b, [0, 1, 2], [0, 1, 2, 3])).toStrictEqual([0, 2, 4]);
expect(zipWith((a) => a, [0, 1, 2], [1, 2, 3, 0])).toStrictEqual([0, 1, 2]);
expect(zipWith((a, b) => b, [0, 1, 2], [1, 2, 3, 0])).toStrictEqual([1, 2, 3]);
});
});
+1 -1
View File
@@ -1,6 +1,6 @@
/*
value.test.mjs - <short description TODO>
Copyright (C) 2025 Strudel contributors - see <https://codeberg.org/uzu/strudel/activity/contributors>
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/core/test/value.test.mjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+1 -1
View File
@@ -1,6 +1,6 @@
/*
timespan.mjs - <short description TODO>
Copyright (C) 2022 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/core/timespan.mjs>
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/core/timespan.mjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+1 -1
View File
@@ -1,6 +1,6 @@
/*
ui.mjs - <short description TODO>
Copyright (C) 2022 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/core/ui.mjs>
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/core/ui.mjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+1 -3
View File
@@ -1,6 +1,6 @@
/*
util.mjs - <short description TODO>
Copyright (C) 2022 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/core/util.mjs>
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/core/util.mjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
@@ -162,7 +162,6 @@ export const compose = (...funcs) => pipe(...funcs.reverse());
// Removes 'None' values from given list
export const removeUndefineds = (xs) => xs.filter((x) => x != undefined);
// flattens by one level
export const flatten = (arr) => [].concat(...arr);
export const id = (a) => a;
@@ -238,7 +237,6 @@ export const splitAt = function (index, value) {
return [value.slice(0, index), value.slice(index)];
};
// Uses the function f to combine the arrays xs, ys element-wise
export const zipWith = (f, xs, ys) => xs.map((n, i) => f(n, ys[i]));
export const pairs = function (xs) {
+2 -2
View File
@@ -1,6 +1,6 @@
/*
value.mjs - <short description TODO>
Copyright (C) 2022 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/core/value.mjs>
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/core/value.mjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
@@ -9,7 +9,7 @@ import { logger } from './logger.mjs';
export function unionWithObj(a, b, func) {
if (b?.value !== undefined && Object.keys(b).length === 1) {
// https://codeberg.org/uzu/strudel/issues/1026
// https://github.com/tidalcycles/strudel/issues/1026
logger(`[warn]: Can't do arithmetic on control pattern.`);
return a;
}
+3 -3
View File
@@ -13,7 +13,7 @@
},
"repository": {
"type": "git",
"url": "git+https://codeberg.org/uzu/strudel.git"
"url": "git+https://github.com/tidalcycles/strudel.git"
},
"keywords": [
"tidalcycles",
@@ -28,9 +28,9 @@
],
"license": "AGPL-3.0-or-later",
"bugs": {
"url": "https://codeberg.org/uzu/strudel/issues"
"url": "https://github.com/tidalcycles/strudel/issues"
},
"homepage": "https://codeberg.org/uzu/strudel#readme",
"homepage": "https://github.com/tidalcycles/strudel#readme",
"dependencies": {
"@csound/browser": "6.18.7",
"@strudel/core": "workspace:*",
+1 -1
View File
@@ -1,6 +1,6 @@
/*
index.mjs - <short description TODO>
Copyright (C) 2022 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/desktopbridge/index.mjs>
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/desktopbridge/index.mjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+4 -4
View File
@@ -7,7 +7,7 @@
"type": "module",
"repository": {
"type": "git",
"url": "git+https://codeberg.org/uzu/strudel.git"
"url": "git+https://github.com/tidalcycles/strudel.git"
},
"keywords": [
"tidalcycles",
@@ -19,11 +19,11 @@
"author": "Jade Rowland <jaderowlanddev@gmail.com>",
"license": "AGPL-3.0-or-later",
"bugs": {
"url": "https://codeberg.org/uzu/strudel/issues"
"url": "https://github.com/tidalcycles/strudel/issues"
},
"dependencies": {
"@strudel/core": "workspace:*",
"@tauri-apps/api": "^2.2.0"
},
"homepage": "https://codeberg.org/uzu/strudel#readme"
}
"homepage": "https://github.com/tidalcycles/strudel#readme"
}
+1 -1
View File
@@ -1,6 +1,6 @@
/*
draw.mjs - <short description TODO>
Copyright (C) 2022 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/canvas/draw.mjs>
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/canvas/draw.mjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+3 -3
View File
@@ -13,7 +13,7 @@
},
"repository": {
"type": "git",
"url": "git+https://codeberg.org/uzu/strudel.git"
"url": "git+https://github.com/tidalcycles/strudel.git"
},
"keywords": [
"titdalcycles",
@@ -25,9 +25,9 @@
"author": "Felix Roos <flix91@gmail.com>",
"license": "AGPL-3.0-or-later",
"bugs": {
"url": "https://codeberg.org/uzu/strudel/issues"
"url": "https://github.com/tidalcycles/strudel/issues"
},
"homepage": "https://codeberg.org/uzu/strudel#readme",
"homepage": "https://github.com/tidalcycles/strudel#readme",
"dependencies": {
"@strudel/core": "workspace:*"
},
+1 -1
View File
@@ -1,6 +1,6 @@
/*
pianoroll.mjs - <short description TODO>
Copyright (C) 2022 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/canvas/pianoroll.mjs>
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/canvas/pianoroll.mjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+3 -3
View File
@@ -6,7 +6,7 @@
"type": "module",
"repository": {
"type": "git",
"url": "git+https://codeberg.org/uzu/strudel.git"
"url": "git+https://github.com/tidalcycles/strudel.git"
},
"keywords": [
"tidalcycles",
@@ -18,7 +18,7 @@
"author": "Felix Roos <flix91@gmail.com>",
"license": "AGPL-3.0-or-later",
"bugs": {
"url": "https://codeberg.org/uzu/strudel/issues"
"url": "https://github.com/tidalcycles/strudel/issues"
},
"homepage": "https://codeberg.org/uzu/strudel#readme"
"homepage": "https://github.com/tidalcycles/strudel#readme"
}
+3 -3
View File
@@ -13,7 +13,7 @@
},
"repository": {
"type": "git",
"url": "git+https://codeberg.org/uzu/strudel.git"
"url": "git+https://github.com/tidalcycles/strudel.git"
},
"keywords": [
"titdalcycles",
@@ -25,9 +25,9 @@
"author": "Yuta Nakayama <nkymut@gmail.com>",
"license": "AGPL-3.0-or-later",
"bugs": {
"url": "https://codeberg.org/uzu/strudel/issues"
"url": "https://github.com/tidalcycles/strudel/issues"
},
"homepage": "https://codeberg.org/uzu/strudel#readme",
"homepage": "https://github.com/tidalcycles/strudel#readme",
"dependencies": {
"@strudel/core": "workspace:*"
},
+1 -1
View File
@@ -2,7 +2,7 @@
Experimental haskell in javascript interpreter. Many haskell features are not implemented.
This projects mainly exists to be able to write and interpret [Tidal Cycles](https://tidalcycles.org/) code in the browser,
as part of [Strudel](https://codeberg.org/uzu/strudel). This project could only exist thanks to [tree-sitter-haskell](https://github.com/tree-sitter/tree-sitter-haskell).
as part of [Strudel](https://github.com/tidalcycles/strudel). This project could only exist thanks to [tree-sitter-haskell](https://github.com/tree-sitter/tree-sitter-haskell).
## Installation
+3 -3
View File
@@ -16,7 +16,7 @@
},
"repository": {
"type": "git",
"url": "git+https://codeberg.org/uzu/strudel.git"
"url": "git+https://github.com/tidalcycles/strudel.git"
},
"keywords": [
"haskell",
@@ -25,9 +25,9 @@
"author": "Felix Roos <flix91@gmail.com>",
"license": "AGPL-3.0-or-later",
"bugs": {
"url": "https://codeberg.org/uzu/strudel/issues"
"url": "https://github.com/tidalcycles/strudel/issues"
},
"homepage": "https://codeberg.org/uzu/strudel/",
"homepage": "https://github.com/tidalcycles/strudel",
"dependencies": {
"web-tree-sitter": "^0.24.7"
},
+3 -3
View File
@@ -17,7 +17,7 @@
},
"repository": {
"type": "git",
"url": "git+https://codeberg.org/uzu/strudel.git"
"url": "git+https://github.com/tidalcycles/strudel.git"
},
"keywords": [
"tidalcycles",
@@ -29,9 +29,9 @@
"author": "Felix Roos <flix91@gmail.com>",
"license": "AGPL-3.0-or-later",
"bugs": {
"url": "https://codeberg.org/uzu/strudel/issues"
"url": "https://github.com/tidalcycles/strudel/issues"
},
"homepage": "https://codeberg.org/uzu/strudel#readme",
"homepage": "https://github.com/tidalcycles/strudel#readme",
"dependencies": {
"@strudel/core": "workspace:*",
"@strudel/draw": "workspace:*",
+1 -1
View File
@@ -1,6 +1,6 @@
/*
midi.mjs - <short description TODO>
Copyright (C) 2022 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/midi/midi.mjs>
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/midi/midi.mjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+3 -3
View File
@@ -13,7 +13,7 @@
},
"repository": {
"type": "git",
"url": "git+https://codeberg.org/uzu/strudel.git"
"url": "git+https://github.com/tidalcycles/strudel.git"
},
"keywords": [
"titdalcycles",
@@ -25,9 +25,9 @@
"author": "Felix Roos <flix91@gmail.com>",
"license": "AGPL-3.0-or-later",
"bugs": {
"url": "https://codeberg.org/uzu/strudel/issues"
"url": "https://github.com/tidalcycles/strudel/issues"
},
"homepage": "https://codeberg.org/uzu/strudel#readme",
"homepage": "https://github.com/tidalcycles/strudel#readme",
"dependencies": {
"@strudel/core": "workspace:*",
"@strudel/webaudio": "workspace:*",
+1 -1
View File
@@ -1,6 +1,6 @@
/*
krill.pegjs - <short description TODO>
Copyright (C) 2022 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/mini/krill.pegjs>
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/mini/krill.pegjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+1 -1
View File
@@ -1,6 +1,6 @@
/*
mini.mjs - <short description TODO>
Copyright (C) 2022 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/mini/mini.mjs>
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/mini/mini.mjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+3 -3
View File
@@ -16,7 +16,7 @@
},
"repository": {
"type": "git",
"url": "git+https://codeberg.org/uzu/strudel.git"
"url": "git+https://github.com/tidalcycles/strudel.git"
},
"keywords": [
"tidalcycles",
@@ -28,9 +28,9 @@
"author": "Felix Roos <flix91@gmail.com>",
"license": "AGPL-3.0-or-later",
"bugs": {
"url": "https://codeberg.org/uzu/strudel/issues"
"url": "https://github.com/tidalcycles/strudel/issues"
},
"homepage": "https://codeberg.org/uzu/strudel#readme",
"homepage": "https://github.com/tidalcycles/strudel#readme",
"dependencies": {
"@strudel/core": "workspace:*"
},
+3 -3
View File
@@ -13,7 +13,7 @@
},
"repository": {
"type": "git",
"url": "git+https://codeberg.org/uzu/strudel.git"
"url": "git+https://github.com/tidalcycles/strudel.git"
},
"keywords": [
"titdalcycles",
@@ -25,9 +25,9 @@
"author": "Yuta Nakayama <nkymut@gmail.com>",
"license": "AGPL-3.0-or-later",
"bugs": {
"url": "https://codeberg.org/uzu/strudel/issues"
"url": "https://github.com/tidalcycles/strudel/issues"
},
"homepage": "https://codeberg.org/uzu/strudel#readme",
"homepage": "https://github.com/tidalcycles/strudel#readme",
"dependencies": {
"@strudel/core": "workspace:*"
},
+1 -1
View File
@@ -1,6 +1,6 @@
/*
mqtt.mjs - for patterning the internet of things from strudel
Copyright (C) 2022 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/serial/serial.mjs>
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/serial/serial.mjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+3 -3
View File
@@ -13,7 +13,7 @@
},
"repository": {
"type": "git",
"url": "git+https://codeberg.org/uzu/strudel.git"
"url": "git+https://github.com/tidalcycles/strudel.git"
},
"keywords": [
"titdalcycles",
@@ -25,9 +25,9 @@
"author": "Alex McLean <alex@slab.org>",
"license": "AGPL-3.0-or-later",
"bugs": {
"url": "https://codeberg.org/uzu/strudel/issues"
"url": "https://github.com/tidalcycles/strudel/issues"
},
"homepage": "https://codeberg.org/uzu/strudel#readme",
"homepage": "https://github.com/tidalcycles/strudel#readme",
"dependencies": {
"@strudel/core": "workspace:*",
"paho-mqtt": "^1.1.0"
+1 -1
View File
@@ -1,6 +1,6 @@
/*
osc.mjs - <short description TODO>
Copyright (C) 2022 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/osc/osc.mjs>
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/osc/osc.mjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+3 -3
View File
@@ -17,7 +17,7 @@
},
"repository": {
"type": "git",
"url": "git+https://codeberg.org/uzu/strudel.git"
"url": "git+https://github.com/tidalcycles/strudel.git"
},
"keywords": [
"tidalcycles",
@@ -32,9 +32,9 @@
],
"license": "AGPL-3.0-or-later",
"bugs": {
"url": "https://codeberg.org/uzu/strudel/issues"
"url": "https://github.com/tidalcycles/strudel/issues"
},
"homepage": "https://codeberg.org/uzu/strudel#readme",
"homepage": "https://github.com/tidalcycles/strudel#readme",
"dependencies": {
"@strudel/core": "workspace:*",
"osc-js": "^2.4.1"
+1 -1
View File
@@ -1,6 +1,6 @@
/*
server.js - <short description TODO>
Copyright (C) 2022 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/osc/server.js>
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/osc/server.js>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+1 -1
View File
@@ -1,6 +1,6 @@
/*
tidal-sniffer.js - <short description TODO>
Copyright (C) 2022 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/osc/tidal-sniffer.js>
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/osc/tidal-sniffer.js>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+3 -3
View File
@@ -13,7 +13,7 @@
},
"repository": {
"type": "git",
"url": "git+https://codeberg.org/uzu/strudel.git"
"url": "git+https://github.com/tidalcycles/strudel.git"
},
"keywords": [
"tidalcycles",
@@ -28,9 +28,9 @@
],
"license": "AGPL-3.0-or-later",
"bugs": {
"url": "https://codeberg.org/uzu/strudel/issues"
"url": "https://github.com/tidalcycles/strudel/issues"
},
"homepage": "https://codeberg.org/uzu/strudel#readme",
"homepage": "https://github.com/tidalcycles/strudel#readme",
"devDependencies": {
"vite": "^6.0.11"
}
+3 -3
View File
@@ -14,7 +14,7 @@
"type": "module",
"repository": {
"type": "git",
"url": "git+https://codeberg.org/uzu/strudel.git"
"url": "git+https://github.com/tidalcycles/strudel.git"
},
"keywords": [
"tidalcycles",
@@ -29,9 +29,9 @@
],
"license": "AGPL-3.0-or-later",
"bugs": {
"url": "https://codeberg.org/uzu/strudel/issues"
"url": "https://github.com/tidalcycles/strudel/issues"
},
"homepage": "https://codeberg.org/uzu/strudel#readme",
"homepage": "https://github.com/tidalcycles/strudel#readme",
"dependencies": {
"@strudel/codemirror": "workspace:*",
"@strudel/core": "workspace:*",
+3 -3
View File
@@ -13,7 +13,7 @@
},
"repository": {
"type": "git",
"url": "git+https://codeberg.org/uzu/strudel.git"
"url": "git+https://github.com/tidalcycles/strudel.git"
},
"keywords": [
"titdalcycles",
@@ -25,9 +25,9 @@
"author": "Alex McLean <alex@slab.org>",
"license": "AGPL-3.0-or-later",
"bugs": {
"url": "https://codeberg.org/uzu/strudel/issues"
"url": "https://github.com/tidalcycles/strudel/issues"
},
"homepage": "https://codeberg.org/uzu/strudel#readme",
"homepage": "https://github.com/tidalcycles/strudel#readme",
"dependencies": {
"@strudel/core": "workspace:*"
},
+1 -1
View File
@@ -1,6 +1,6 @@
/*
serial.mjs - <short description TODO>
Copyright (C) 2022 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/serial/serial.mjs>
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/serial/serial.mjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+3 -3
View File
@@ -13,7 +13,7 @@
"type": "module",
"repository": {
"type": "git",
"url": "git+https://codeberg.org/uzu/strudel.git"
"url": "git+https://github.com/tidalcycles/strudel.git"
},
"keywords": [
"tidalcycles",
@@ -25,9 +25,9 @@
"author": "Felix Roos <flix91@gmail.com>",
"license": "AGPL-3.0-or-later",
"bugs": {
"url": "https://codeberg.org/uzu/strudel/issues"
"url": "https://github.com/tidalcycles/strudel/issues"
},
"homepage": "https://codeberg.org/uzu/strudel#readme",
"homepage": "https://github.com/tidalcycles/strudel#readme",
"dependencies": {
"@strudel/core": "workspace:*",
"@strudel/webaudio": "workspace:*",
+23
View File
@@ -92,6 +92,29 @@ superdough({ s: 'bd', delay: 0.5 }, 0, 1);
- `deadline`: seconds until the sound should play (0 = immediate)
- `duration`: seconds the sound should last. optional for one shot samples, required for synth sounds
### prepare(value)
Informs superdough that a sound will be needed in the future.
If the sound is a sample that is not loaded yet, it will be fetched.
Otherwise does nothing.
`value` has a syntax identical to the one used `superdough()`.
```js
prepare({ s: 'bd', delay: 0.5 });
// some time later
superdough({ s: 'bd', delay: 0.5 }, 0, 1);
```
Can be awaited to ensure that a given sound is ready to play.
```js
const sound = { s: 'hh' };
await prepare(sound);
superdough(sound, 0, 1);
```
### registerSynthSounds()
Loads the default waveforms `sawtooth`, `square`, `triangle` and `sine`. Use them like this:
+1 -1
View File
@@ -1,6 +1,6 @@
/*
index.mjs - <short description TODO>
Copyright (C) 2022 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/superdough/index.mjs>
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/superdough/index.mjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+3 -3
View File
@@ -16,7 +16,7 @@
},
"repository": {
"type": "git",
"url": "git+https://codeberg.org/uzu/strudel.git"
"url": "git+https://github.com/tidalcycles/strudel.git"
},
"keywords": [
"tidalcycles",
@@ -28,9 +28,9 @@
"author": "Felix Roos <flix91@gmail.com>",
"license": "AGPL-3.0-or-later",
"bugs": {
"url": "https://codeberg.org/uzu/strudel/issues"
"url": "https://github.com/tidalcycles/strudel/issues"
},
"homepage": "https://codeberg.org/uzu/strudel#readme",
"homepage": "https://github.com/tidalcycles/strudel#readme",
"devDependencies": {
"vite": "^6.0.11",
"vite-plugin-bundle-audioworklet": "workspace:*"
+16 -7
View File
@@ -265,19 +265,28 @@ export const samples = async (sampleMap, baseUrl = sampleMap._base || '', option
processSampleMap(
sampleMap,
(key, bank) =>
registerSound(key, (t, hapValue, onended) => onTriggerSample(t, hapValue, onended, bank), {
type: 'sample',
samples: bank,
baseUrl,
prebake,
tag,
}),
registerSound(
key,
(t, hapValue, onended) => onTriggerSample(t, hapValue, onended, bank),
{
type: 'sample',
samples: bank,
baseUrl,
prebake,
tag,
},
(hapValue) => onPrepareSample(hapValue, bank),
),
baseUrl,
);
};
const cutGroups = [];
export async function onPrepareSample(hapValue, bank, resolveUrl) {
await getSampleBuffer(hapValue, bank, resolveUrl);
}
export async function onTriggerSample(t, value, onended, bank, resolveUrl) {
let {
s,
+13 -3
View File
@@ -1,6 +1,6 @@
/*
superdough.mjs - <short description TODO>
Copyright (C) 2022 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/superdough/superdough.mjs>
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/superdough/superdough.mjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
@@ -30,9 +30,9 @@ export function setMultiChannelOrbits(bool) {
export const soundMap = map();
export function registerSound(key, onTrigger, data = {}) {
export function registerSound(key, onTrigger, data = {}, onPrepare = () => {}) {
key = key.toLowerCase().replace(/\s+/g, '_');
soundMap.setKey(key, { onTrigger, data });
soundMap.setKey(key, { onTrigger, data, onPrepare });
}
let gainCurveFunc = (val) => val;
@@ -757,3 +757,13 @@ export const superdough = async (value, t, hapDuration, cps) => {
export const superdoughTrigger = (t, hap, ct, cps) => {
superdough(hap, t - ct, hap.duration / cps, cps);
};
export const prepare = async (value) => {
const { onPrepare } = getSound(value.s);
if (onPrepare) {
if (value.bank && value.s) {
value.s = `${value.bank}_${value.s}`;
}
await onPrepare(value);
}
};
+1
View File
@@ -882,6 +882,7 @@ class ByteBeatProcessor extends AudioWorkletProcessor {
const funcValue = this.func(local_t);
let signal = (funcValue & 255) / 127.5 - 1;
const out = signal * 0.2;
for (let c = 0; c < output.length; c++) {
//prevent speaker blowout via clipping if threshold exceeds
output[c][i] = clamp(out, -0.4, 0.4);
+3 -3
View File
@@ -6,7 +6,7 @@
"module": "tidal.mjs",
"repository": {
"type": "git",
"url": "git+https://codeberg.org/uzu/strudel/src/branch/main/packages/tidal"
"url": "git+https://github.com/tidalcycles/strudel/tree/main/packages/tidal"
},
"keywords": [
"haskell",
@@ -15,9 +15,9 @@
"author": "Felix Roos <flix91@gmail.com>",
"license": "AGPL-3.0-or-later",
"bugs": {
"url": "https://codeberg.org/uzu/strudel/issues"
"url": "https://github.com/tidalcycles/strudel/issues"
},
"homepage": "https://codeberg.org/uzu/strudel/src/branch/main/packages/hs2js",
"homepage": "https://github.com/tidalcycles/strudel/tree/main/packages/hs2js",
"dependencies": {
"@strudel/core": "workspace:*",
"@strudel/mini": "workspace:*",
+3 -3
View File
@@ -14,7 +14,7 @@
"type": "module",
"repository": {
"type": "git",
"url": "git+https://codeberg.org/uzu/strudel.git"
"url": "git+https://github.com/tidalcycles/strudel.git"
},
"keywords": [
"tidalcycles",
@@ -26,9 +26,9 @@
"author": "Felix Roos <flix91@gmail.com>",
"license": "AGPL-3.0-or-later",
"bugs": {
"url": "https://codeberg.org/uzu/strudel/issues"
"url": "https://github.com/tidalcycles/strudel/issues"
},
"homepage": "https://codeberg.org/uzu/strudel#readme",
"homepage": "https://github.com/tidalcycles/strudel#readme",
"dependencies": {
"@strudel/core": "workspace:*",
"@tonaljs/tonal": "^4.10.0",
+1 -1
View File
@@ -1,6 +1,6 @@
/*
tonal.mjs - <short description TODO>
Copyright (C) 2022 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/tonal/tonal.mjs>
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/tonal/tonal.mjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+1 -1
View File
@@ -178,7 +178,7 @@ export function renderVoicing({ chord, dictionary, offset = 0, n, mode = 'below'
return notes;
}
// https://codeberg.org/uzu/strudel/blob/14184993d0ee7d69c47df57ac864a1a0f99a893f/packages/tonal/tonleiter.mjs
// https://github.com/tidalcycles/strudel/blob/14184993d0ee7d69c47df57ac864a1a0f99a893f/packages/tonal/tonleiter.mjs
const steps = [1, 0, 2, 0, 3, 4, 0, 5, 0, 6, 0, 7];
const notes = ['C', '', 'D', '', 'E', 'F', '', 'G', '', 'A', '', 'B'];
const noteLetters = ['C', 'D', 'E', 'F', 'G', 'A', 'B'];
+1 -1
View File
@@ -1,6 +1,6 @@
/*
voicings.mjs - <short description TODO>
Copyright (C) 2022 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/tonal/voicings.mjs>
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/tonal/voicings.mjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+3 -3
View File
@@ -14,7 +14,7 @@
},
"repository": {
"type": "git",
"url": "git+https://codeberg.org/uzu/strudel.git"
"url": "git+https://github.com/tidalcycles/strudel.git"
},
"keywords": [
"tidalcycles",
@@ -26,9 +26,9 @@
"author": "Felix Roos <flix91@gmail.com>",
"license": "AGPL-3.0-or-later",
"bugs": {
"url": "https://codeberg.org/uzu/strudel/issues"
"url": "https://github.com/tidalcycles/strudel/issues"
},
"homepage": "https://codeberg.org/uzu/strudel#readme",
"homepage": "https://github.com/tidalcycles/strudel#readme",
"dependencies": {
"@strudel/core": "workspace:*",
"@strudel/mini": "workspace:*",
+1 -1
View File
@@ -194,7 +194,7 @@ function isLabelStatement(node) {
}
// converts label expressions to p calls: "x: y" to "y.p('x')"
// see https://codeberg.org/uzu/strudel/issues/990
// see https://github.com/tidalcycles/strudel/issues/990
function labelToP(node) {
return {
type: 'ExpressionStatement',
+3 -3
View File
@@ -14,7 +14,7 @@
"type": "module",
"repository": {
"type": "git",
"url": "git+https://codeberg.org/uzu/strudel.git"
"url": "git+https://github.com/tidalcycles/strudel.git"
},
"keywords": [
"tidalcycles",
@@ -29,9 +29,9 @@
],
"license": "AGPL-3.0-or-later",
"bugs": {
"url": "https://codeberg.org/uzu/strudel/issues"
"url": "https://github.com/tidalcycles/strudel/issues"
},
"homepage": "https://codeberg.org/uzu/strudel#readme",
"homepage": "https://github.com/tidalcycles/strudel#readme",
"dependencies": {
"@strudel/core": "workspace:*",
"@strudel/mini": "workspace:*",
+1 -1
View File
@@ -1,6 +1,6 @@
/*
index.mjs - <short description TODO>
Copyright (C) 2022 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/webaudio/index.mjs>
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/webaudio/index.mjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+3 -3
View File
@@ -17,7 +17,7 @@
},
"repository": {
"type": "git",
"url": "git+https://codeberg.org/uzu/strudel.git"
"url": "git+https://github.com/tidalcycles/strudel.git"
},
"keywords": [
"tidalcycles",
@@ -29,9 +29,9 @@
"author": "Felix Roos <flix91@gmail.com>",
"license": "AGPL-3.0-or-later",
"bugs": {
"url": "https://codeberg.org/uzu/strudel/issues"
"url": "https://github.com/tidalcycles/strudel/issues"
},
"homepage": "https://codeberg.org/uzu/strudel#readme",
"homepage": "https://github.com/tidalcycles/strudel#readme",
"dependencies": {
"@strudel/core": "workspace:*",
"@strudel/draw": "workspace:*",
+6 -3
View File
@@ -1,11 +1,11 @@
/*
webaudio.mjs - <short description TODO>
Copyright (C) 2022 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/webaudio/webaudio.mjs>
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/webaudio/webaudio.mjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import * as strudel from '@strudel/core';
import { superdough, getAudioContext, setLogger, doughTrigger } from 'superdough';
import { superdough, prepare, getAudioContext, setLogger, doughTrigger } from 'superdough';
const { Pattern, logger, repl } = strudel;
setLogger(logger);
@@ -16,10 +16,12 @@ const hap2value = (hap) => {
};
export const webaudioOutputTrigger = (t, hap, ct, cps) => superdough(hap2value(hap), t - ct, hap.duration / cps, cps);
// uses more precise, absolute t if available, see https://codeberg.org/uzu/strudel/pulls/1004
// uses more precise, absolute t if available, see https://github.com/tidalcycles/strudel/pull/1004
export const webaudioOutput = (hap, deadline, hapDuration, cps, t) =>
superdough(hap2value(hap), t ? `=${t}` : deadline, hapDuration);
export const webaudioPrepare = (hap) => prepare(hap2value(hap));
Pattern.prototype.webaudio = function () {
return this.onTrigger(webaudioOutputTrigger);
};
@@ -28,6 +30,7 @@ export function webaudioRepl(options = {}) {
options = {
getTime: () => getAudioContext().currentTime,
defaultOutput: webaudioOutput,
defaultPrepare: webaudioPrepare,
...options,
};
return repl(options);
+3 -3
View File
@@ -14,7 +14,7 @@
},
"repository": {
"type": "git",
"url": "git+https://codeberg.org/uzu/strudel.git"
"url": "git+https://github.com/tidalcycles/strudel.git"
},
"keywords": [
"tidalcycles",
@@ -26,9 +26,9 @@
"author": "Felix Roos <flix91@gmail.com>",
"license": "AGPL-3.0-or-later",
"bugs": {
"url": "https://codeberg.org/uzu/strudel/issues"
"url": "https://github.com/tidalcycles/strudel/issues"
},
"homepage": "https://codeberg.org/uzu/strudel#readme",
"homepage": "https://github.com/tidalcycles/strudel#readme",
"dependencies": {
"@strudel/core": "workspace:*"
},
+1 -1
View File
@@ -1,6 +1,6 @@
/*
tune.mjs - <short description TODO>
Copyright (C) 2022 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/xen/tune.mjs>
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/xen/tune.mjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+1 -1
View File
@@ -1,6 +1,6 @@
/*
tunejs.js - <short description TODO>
Copyright (C) 2022 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/xen/tunejs.js>
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/xen/tunejs.js>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+1 -1
View File
@@ -1,6 +1,6 @@
/*
xen.mjs - <short description TODO>
Copyright (C) 2022 Strudel contributors - see <https://codeberg.org/uzu/strudel/src/branch/main/packages/xen/xen.mjs>
Copyright (C) 2022 Strudel contributors - see <https://github.com/tidalcycles/strudel/blob/main/packages/xen/xen.mjs>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+5 -11
View File
@@ -1,12 +1,6 @@
packages:
- packages/*
- examples/*
- tools/dbpatch
- website/
onlyBuiltDependencies:
- esbuild
- nx
- sharp
- tree-sitter
- tree-sitter-haskell
# all packages in direct subdirs of packages/
- "packages/*"
- "examples/*"
- "tools/dbpatch"
- "website/"
-193
View File
@@ -1,193 +0,0 @@
This document introduces you to Strudel in a technical sense. If you just want to *use* Strudel, have a look at the [Tutorial](https://strudel.tidalcycles.org/tutorial/).
## Strudel Packages
There are different packages for different purposes. They..
- split up the code into smaller chunks
- can be selectively used to implement some sort of time based system
Please refer to the individual README files in the [packages folder](https://codeberg.org/uzu/strudel/src/branch/main/packages)
## REPL
The [REPL](https://strudel.tidalcycles.org/) is the place where all packages come together to form a live coding system. It can also be seen as a reference implementation for users of the library.
More info in the [REPL README](https://codeberg.org/uzu/strudel/src/branch/main/packages/repl/README.md)
# High Level Overview
<img src="https://github.com/tidalcycles/strudel/blob/talk/talk/public/strudelflow.png?raw=true" width="600" />
## 1. End User Code
The End User Code is written in JavaScript with added syntax sugar. The [eval package](https://codeberg.org/uzu/strudel/src/branch/main/packages/eval#strudelcycleseval) evaluates the user code
after a transpilation step, which resolves the syntax sugar. If you don't want the syntax sugar, you can omit the eval package and call the native javascript `eval` instead.
### 🍭 Syntax Sugar
JavaScript Transpilation = converting valid JavaScript to valid JavaScript:
```js
"c3 [e3 g3]".fast(2)
```
becomes
```js
mini('c3 [e3 g3]')
.withMiniLocation([1, 0, 0], [1, 11, 11]) // source location
.fast(2);
```
- double quoted strings and backtick strings are turned into `mini` calls (single quoted strings are left as is)
- The source location is added by chaining `withMiniLocation`, which enables the real time highlighting later
- (psuedo) variable names that look like notes (like `c4`, `bb2` or `fs3`) are turned into strings
- support for top level await
- operator overloading could be implemented in the future
This is how it works:
<img src="https://github.com/tidalcycles/strudel/blob/talk/talk/public/shiftflow.png?raw=true" width="800" />
- The user code is parsed with a [shift parser](https://github.com/shapesecurity/shift-parser-js), generating an AST
- The AST is transformed to resolve the syntax sugar
- The AST is used to generate code again (shift-codegen)
Shift will most likely be replaced with acorn in the future, see https://codeberg.org/uzu/strudel/issues/174
### Mini Notation
Another important part of the user code is the mini notation, which allows to express rhythms in a short manner.
- the mini notation is [implemented as a PEG grammar](https://codeberg.org/uzu/strudel/src/branch/main/packages/mini/krill.pegjs), living in the [mini package](https://codeberg.org/uzu/strudel/src/branch/main/packages/mini)
- it is based on [krill](https://github.com/Mdashdotdashn/krill) by Mdashdotdashn
- the peg grammar is used to generate a parser with [peggyjs](https://peggyjs.org/)
- the generated parser takes a mini notation string and outputs an AST
- the AST can then be used to construct a pattern using the regular Strudel API
Here's an example AST:
```json
{
"type_": "pattern",
"arguments_": { "alignment": "h" },
"source_": [
{
"type_": "element", "source_": "c3",
"location_": { "start": { "offset": 1, "line": 1, "column": 2 }, "end": { "offset": 4, "line": 1, "column": 5 } }
},
{
"type_": "element",
"location_": { "start": { "offset": 4, "line": 1, "column": 5 }, "end": { "offset": 11, "line": 1, "column": 12 } }
"source_": {
"type_": "pattern", "arguments_": { "alignment": "h" },
"source_": [
{
"type_": "element", "source_": "e3",
"location_": { "start": { "offset": 5, "line": 1, "column": 6 }, "end": { "offset": 8, "line": 1, "column": 9 } }
},
{
"type_": "element", "source_": "g3",
"location_": { "start": { "offset": 8, "line": 1, "column": 9 }, "end": { "offset": 10, "line": 1, "column": 11 } }
}
]
},
}
]
}
```
which translates to `seq(c3, seq(e3, g3))`
## 2. Querying & Scheduling
When the user code has been evaluated, we hopefully get a Pattern instance, which we can use to query events from.
These events can then be used to trigger side effects in the real world. On that note, Events are mostly called Hap(s) in the codebase, because JS already has a built in `Event` class.
### Querying
> Querying = Asking a Pattern for Events within a certain time span
```js
seq('c3', ['e3', 'g3']) // <--- Pattern
.queryArc(0, 2) // query events within 0 and 2 cycles
.map((hap) => hap.showWhole()); // make readable
```
yields
```js
[
'0/1 -> 1/2: c3', // cycle 0
'1/2 -> 3/4: e3',
'3/4 -> 1/1: g3',
'1/1 -> 3/2: c3', // cycle 1
'3/2 -> 7/4: e3',
'7/4 -> 2/1: g3',
];
```
### 🗓️ Scheduling
The scheduler will query events repeatedly, creating a possibly endless loop of time slices.
Here is a simplified example of how it works
```js
let step = 0.5; // query interval in seconds
let tick = 0; // how many intervals have passed
let pattern = seq('c3', ['e3', 'g3']); // pattern from user
setInterval(() => {
const events = pattern.queryArc(tick * step, ++tick * step);
events.forEach((event) => {
console.log(event.showWhole());
const o = getAudioContext().createOscillator();
o.frequency.value = getFreq(event.value);
o.start(event.whole.begin);
o.stop(event.whole.begin + event.duration);
o.connect(getAudioContext().destination);
});
}, step * 1000); // query each "step" seconds
```
## 3. Sound Output
The third and last step is to use the scheduled events to make sound.
Patterns are wrapped with param functions to compose different properties of the sound.
```js
note("[c2(3,8) [<eb2 g1> bb1]]") // sets frequency
.s("<sawtooth square>") // sound source
.gain(.5) // turn down volume
.cutoff(sine.range(200,1000).slow(4)) // modulated cutoff
.slow(2)
.out().logValues()`,
]}
/>
```
Here is an example Hap value with different properties:
```js
{ note: 'a4', s: 'sawtooth', gain: 0.5, cutoff: 267 }
```
<img src="https://github.com/tidalcycles/strudel/blob/talk/talk/public/waa-nodes.png?raw=true" width="600" />
<div className="text-left">
- Patterns represent just values in time!
- Suitable for any time based output (music, visuals, movement, .. ?)
### Supported Outputs
At the time of writing this doc, the following outputs are supported:
- Web Audio API `.out()` see [/webaudio](https://codeberg.org/uzu/strudel/src/branch/main/packages/webaudio)
- MIDI `.midi()` see [/midi](https://codeberg.org/uzu/strudel/src/branch/main/packages/midi)
- OSC `.osc()` see [/osc](https://codeberg.org/uzu/strudel/src/branch/main/packages/osc)
- Serial `.serial()` see [/serial](https://codeberg.org/uzu/strudel/src/branch/main/packages/serial)
- Tone.js `.tone()` (deprecated?) [/tone](https://codeberg.org/uzu/strudel/src/branch/main/packages/tone)
- WebDirt `.webdirt()` (deprecated?) [/webdirt](https://codeberg.org/uzu/strudel/src/branch/main/packages/webdirt)
- Speech `.speak()` (experimental) part of [/core](https://codeberg.org/uzu/strudel/src/branch/main/packages/core)
These could change, so make sure to check the [packages folder](https://codeberg.org/uzu/strudel/src/branch/main/packages).
+12 -119
View File
@@ -1051,75 +1051,6 @@ exports[`runs examples > example "begin" example index 0 1`] = `
]
`;
exports[`runs examples > example "berlin" example index 0 1`] = `
[
"[ 0/1 → 1/16 | note:D3 ]",
"[ 1/16 → 1/8 | note:E3 ]",
"[ 1/8 → 3/16 | note:F3 ]",
"[ 3/16 → 1/4 | note:G3 ]",
"[ 1/4 → 5/16 | note:A3 ]",
"[ 5/16 → 3/8 | note:C4 ]",
"[ 3/8 → 7/16 | note:D4 ]",
"[ 7/16 → 1/2 | note:F4 ]",
"[ 1/2 → 9/16 | note:D4 ]",
"[ 9/16 → 5/8 | note:E4 ]",
"[ 5/8 → 11/16 | note:E4 ]",
"[ 11/16 → 3/4 | note:E4 ]",
"[ 3/4 → 13/16 | note:F3 ]",
"[ 13/16 → 7/8 | note:F3 ]",
"[ 7/8 → 15/16 | note:F3 ]",
"[ 15/16 → 1/1 | note:F3 ]",
"[ 1/1 → 17/16 | note:E3 ]",
"[ 17/16 → 9/8 | note:E3 ]",
"[ 9/8 → 19/16 | note:E3 ]",
"[ 19/16 → 5/4 | note:F3 ]",
"[ 5/4 → 21/16 | note:E3 ]",
"[ 21/16 → 11/8 | note:F3 ]",
"[ 11/8 → 23/16 | note:G3 ]",
"[ 23/16 → 3/2 | note:A3 ]",
"[ 3/2 → 25/16 | note:A3 ]",
"[ 25/16 → 13/8 | note:Bb3 ]",
"[ 13/8 → 27/16 | note:Bb3 ]",
"[ 27/16 → 7/4 | note:Bb3 ]",
"[ 7/4 → 29/16 | note:F3 ]",
"[ 29/16 → 15/8 | note:G3 ]",
"[ 15/8 → 31/16 | note:Bb3 ]",
"[ 31/16 → 2/1 | note:C4 ]",
"[ 2/1 → 33/16 | note:C4 ]",
"[ 33/16 → 17/8 | note:D4 ]",
"[ 17/8 → 35/16 | note:F4 ]",
"[ 35/16 → 9/4 | note:G4 ]",
"[ 9/4 → 37/16 | note:Bb3 ]",
"[ 37/16 → 19/8 | note:Bb3 ]",
"[ 19/8 → 39/16 | note:Bb3 ]",
"[ 39/16 → 5/2 | note:C4 ]",
"[ 5/2 → 41/16 | note:F3 ]",
"[ 41/16 → 21/8 | note:F3 ]",
"[ 21/8 → 43/16 | note:G3 ]",
"[ 43/16 → 11/4 | note:A3 ]",
"[ 11/4 → 45/16 | note:A3 ]",
"[ 45/16 → 23/8 | note:A3 ]",
"[ 23/8 → 47/16 | note:A3 ]",
"[ 47/16 → 3/1 | note:A3 ]",
"[ 3/1 → 49/16 | note:E3 ]",
"[ 49/16 → 25/8 | note:G3 ]",
"[ 25/8 → 51/16 | note:Bb3 ]",
"[ 51/16 → 13/4 | note:C4 ]",
"[ 13/4 → 53/16 | note:D4 ]",
"[ 53/16 → 27/8 | note:E4 ]",
"[ 27/8 → 55/16 | note:G4 ]",
"[ 55/16 → 7/2 | note:A4 ]",
"[ 7/2 → 57/16 | note:Bb3 ]",
"[ 57/16 → 29/8 | note:Bb3 ]",
"[ 29/8 → 59/16 | note:C4 ]",
"[ 59/16 → 15/4 | note:C4 ]",
"[ 15/4 → 61/16 | note:F3 ]",
"[ 61/16 → 31/8 | note:G3 ]",
"[ 31/8 → 63/16 | note:G3 ]",
"[ 63/16 → 4/1 | note:A3 ]",
]
`;
exports[`runs examples > example "binary" example index 0 1`] = `
[
"[ 0/1 → 1/3 | s:hh ]",
@@ -3145,19 +3076,18 @@ exports[`runs examples > example "euclidLegato" example index 0 1`] = `
exports[`runs examples > example "euclidLegatoRot" example index 0 1`] = `
[
"[ -1/5 ⇜ (0/1 → 1/5) | note:c3 ]",
"[ 1/52/5 | note:c3 ]",
"[ 2/5 → 4/5 | note:c3 ]",
"[ 4/5 → 6/5 | note:c3 ]",
"[ 6/5 → 7/5 | note:c3 ]",
"[ 7/59/5 | note:c3 ]",
"[ 9/5 → 11/5 | note:c3 ]",
"[ 11/5 → 12/5 | note:c3 ]",
"[ 12/5 → 14/5 | note:c3 ]",
"[ 14/5 → 16/5 | note:c3 ]",
"[ 16/5 → 17/5 | note:c3 ]",
"[ 17/5 → 19/5 | note:c3 ]",
"[ (19/5 → 4/1) ⇝ 21/5 | note:c3 ]",
"[ 0/1 → 1/4 | note:c3 ]",
"[ 1/43/4 | note:c3 ]",
"[ 3/4 → 1/1 | note:c3 ]",
"[ 1/1 → 5/4 | note:c3 ]",
"[ 5/4 → 7/4 | note:c3 ]",
"[ 7/42/1 | note:c3 ]",
"[ 2/1 → 9/4 | note:c3 ]",
"[ 9/4 → 11/4 | note:c3 ]",
"[ 11/4 → 3/1 | note:c3 ]",
"[ 3/1 → 13/4 | note:c3 ]",
"[ 13/4 → 15/4 | note:c3 ]",
"[ 15/4 → 4/1 | note:c3 ]",
]
`;
@@ -6020,43 +5950,6 @@ exports[`runs examples > example "often" example index 0 1`] = `
]
`;
exports[`runs examples > example "onTriggerTime" example index 0 1`] = `
[
"[ 0/1 → 1/8 | s:bd ]",
"[ 1/8 → 1/4 | s:bd ]",
"[ 1/4 → 3/8 | s:bd ]",
"[ 3/8 → 1/2 | s:bd ]",
"[ 1/2 → 5/8 | s:bd ]",
"[ 5/8 → 3/4 | s:bd ]",
"[ 3/4 → 7/8 | s:bd ]",
"[ 7/8 → 1/1 | s:bd ]",
"[ 1/1 → 9/8 | s:bd ]",
"[ 9/8 → 5/4 | s:bd ]",
"[ 5/4 → 11/8 | s:bd ]",
"[ 11/8 → 3/2 | s:bd ]",
"[ 3/2 → 13/8 | s:bd ]",
"[ 13/8 → 7/4 | s:bd ]",
"[ 7/4 → 15/8 | s:bd ]",
"[ 15/8 → 2/1 | s:bd ]",
"[ 2/1 → 17/8 | s:bd ]",
"[ 17/8 → 9/4 | s:bd ]",
"[ 9/4 → 19/8 | s:bd ]",
"[ 19/8 → 5/2 | s:bd ]",
"[ 5/2 → 21/8 | s:bd ]",
"[ 21/8 → 11/4 | s:bd ]",
"[ 11/4 → 23/8 | s:bd ]",
"[ 23/8 → 3/1 | s:bd ]",
"[ 3/1 → 25/8 | s:bd ]",
"[ 25/8 → 13/4 | s:bd ]",
"[ 13/4 → 27/8 | s:bd ]",
"[ 27/8 → 7/2 | s:bd ]",
"[ 7/2 → 29/8 | s:bd ]",
"[ 29/8 → 15/4 | s:bd ]",
"[ 15/4 → 31/8 | s:bd ]",
"[ 31/8 → 4/1 | s:bd ]",
]
`;
exports[`runs examples > example "orbit" example index 0 1`] = `
[
"[ 0/1 → 1/6 | s:hh delay:0.5 delaytime:0.25 orbit:1 ]",
+12 -12
View File
@@ -7318,12 +7318,12 @@ exports[`renders tunes > tune: randomBells 1`] = `
[
"[ -9/8 ⇜ (0/1 → 3/8) | gain:0.6 note:A3 velocity:0.5989903202280402 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]",
"[ -3/4 ⇜ (0/1 → 3/4) | gain:0.6 note:C5 velocity:0.8369929669424891 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]",
"[ 0/1 → 3/2 | note:F2 s:bass clip:1 gain:0.8 ]",
"[ 0/1 → 3/2 | note:D2 s:bass clip:1 gain:0.8 ]",
"[ 0/1 → 9/4 | gain:0.6 note:D3 velocity:0.5 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]",
"[ 3/8 → 21/8 | gain:0.6 note:F5 velocity:0.9213038925081491 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]",
"[ 3/4 → 3/1 | gain:0.6 note:C5 velocity:0.8426077850162983 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]",
"[ 3/2 → 9/4 | note:F2 s:bass clip:1 gain:0.8 ]",
"[ 9/4 → 3/1 | note:F2 s:bass clip:1 gain:0.8 ]",
"[ 3/2 → 9/4 | note:D2 s:bass clip:1 gain:0.8 ]",
"[ 9/4 → 3/1 | note:D2 s:bass clip:1 gain:0.8 ]",
"[ 9/4 → 9/2 | gain:0.6 note:D4 velocity:0.7006962578743696 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]",
"[ 21/8 → 39/8 | gain:0.6 note:C4 velocity:0.6507943943142891 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]",
"[ 3/1 → 9/2 | note:D2 s:bass clip:1 gain:0.8 ]",
@@ -7335,12 +7335,12 @@ exports[`renders tunes > tune: randomBells 1`] = `
"[ (21/4 → 6/1) ⇝ 27/4 | gain:0.6 note:D4 velocity:0.6988155404105783 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]",
"[ 39/8 ⇜ (6/1 → 51/8) | gain:0.6 note:D5 velocity:0.8758113365620375 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]",
"[ 21/4 ⇜ (6/1 → 27/4) | gain:0.6 note:D4 velocity:0.6988155404105783 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]",
"[ 6/1 → 15/2 | note:D2 s:bass clip:1 gain:0.8 ]",
"[ 6/1 → 15/2 | note:A2 s:bass clip:1 gain:0.8 ]",
"[ 6/1 → 33/4 | gain:0.6 note:G4 velocity:0.7597710825502872 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]",
"[ 51/8 → 69/8 | gain:0.6 note:G4 velocity:0.7743164440616965 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]",
"[ 27/4 → 9/1 | gain:0.6 note:C5 velocity:0.8362447572872043 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]",
"[ 15/2 → 33/4 | note:D2 s:bass clip:1 gain:0.8 ]",
"[ 33/4 → 9/1 | note:D2 s:bass clip:1 gain:0.8 ]",
"[ 15/2 → 33/4 | note:A2 s:bass clip:1 gain:0.8 ]",
"[ 33/4 → 9/1 | note:A2 s:bass clip:1 gain:0.8 ]",
"[ 33/4 → 21/2 | gain:0.6 note:A3 velocity:0.5914018759503961 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]",
"[ 69/8 → 87/8 | gain:0.6 note:G4 velocity:0.754063542932272 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]",
"[ 9/1 → 21/2 | note:A2 s:bass clip:1 gain:0.8 ]",
@@ -7352,12 +7352,12 @@ exports[`renders tunes > tune: randomBells 1`] = `
"[ (45/4 → 12/1) ⇝ 51/4 | gain:0.6 note:A4 velocity:0.7972785895690322 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]",
"[ 87/8 ⇜ (12/1 → 99/8) | gain:0.6 note:F4 velocity:0.7347871446982026 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]",
"[ 45/4 ⇜ (12/1 → 51/4) | gain:0.6 note:A4 velocity:0.7972785895690322 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]",
"[ 12/1 → 27/2 | note:A2 s:bass clip:1 gain:0.8 ]",
"[ 12/1 → 27/2 | note:G2 s:bass clip:1 gain:0.8 ]",
"[ 12/1 → 57/4 | gain:0.6 note:G5 velocity:0.9797635599970818 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]",
"[ 99/8 → 117/8 | gain:0.6 note:C4 velocity:0.6662392104044557 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]",
"[ 51/4 → 15/1 | gain:0.6 note:F5 velocity:0.9516951469704509 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]",
"[ 27/2 → 57/4 | note:A2 s:bass clip:1 gain:0.8 ]",
"[ 57/4 → 15/1 | note:A2 s:bass clip:1 gain:0.8 ]",
"[ 27/2 → 57/4 | note:G2 s:bass clip:1 gain:0.8 ]",
"[ 57/4 → 15/1 | note:G2 s:bass clip:1 gain:0.8 ]",
"[ 57/4 → 33/2 | gain:0.6 note:F5 velocity:0.9182533202692866 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]",
"[ 117/8 → 135/8 | gain:0.6 note:G3 velocity:0.5711571052670479 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]",
"[ 15/1 → 33/2 | note:G2 s:bass clip:1 gain:0.8 ]",
@@ -7369,12 +7369,12 @@ exports[`renders tunes > tune: randomBells 1`] = `
"[ (69/4 → 18/1) ⇝ 75/4 | gain:0.6 note:F3 velocity:0.5081270858645439 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]",
"[ 135/8 ⇜ (18/1 → 147/8) | gain:0.6 note:F5 velocity:0.9456470254808664 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]",
"[ 69/4 ⇜ (18/1 → 75/4) | gain:0.6 note:F3 velocity:0.5081270858645439 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]",
"[ 18/1 → 39/2 | note:G2 s:bass clip:1 gain:0.8 ]",
"[ 18/1 → 39/2 | note:F2 s:bass clip:1 gain:0.8 ]",
"[ 18/1 → 81/4 | gain:0.6 note:A3 velocity:0.6086445553228259 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]",
"[ 147/8 → 165/8 | gain:0.6 note:F3 velocity:0.5062594395130873 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]",
"[ 75/4 → 21/1 | gain:0.6 note:D4 velocity:0.6716219391673803 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]",
"[ 39/2 → 81/4 | note:G2 s:bass clip:1 gain:0.8 ]",
"[ 81/4 → 21/1 | note:G2 s:bass clip:1 gain:0.8 ]",
"[ 39/2 → 81/4 | note:F2 s:bass clip:1 gain:0.8 ]",
"[ 81/4 → 21/1 | note:F2 s:bass clip:1 gain:0.8 ]",
"[ 81/4 → 45/2 | gain:0.6 note:D4 velocity:0.7043459005653858 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]",
"[ 165/8 → 183/8 | gain:0.6 note:D5 velocity:0.8878388572484255 s:bell delay:0.2 delaytime:0.3333333333333333 delayfeedback:0.8 ]",
"[ 21/1 → 45/2 | note:F2 s:bass clip:1 gain:0.8 ]",
+2 -2
View File
@@ -1,10 +1,10 @@
/*
Strudel - javascript-based environment for live coding algorithmic (musical) patterns
https://strudel.cc / https://codeberg.org/uzu/strudel/
https://strudel.cc / https://github.com/tidalcycles/strudel/
Copyright (C) Strudel contributors
https://codeberg.org/uzu/strudel/activity/contributors
https://github.com/tidalcycles/strudel/graphs/contributors
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
+2 -2
View File
@@ -28,7 +28,7 @@ export const KNOWN_LANGUAGES = {
} as const;
export const KNOWN_LANGUAGE_CODES = Object.values(KNOWN_LANGUAGES);
export const GITHUB_EDIT_URL = `https://codeberg.org/uzu/strudel/src/branch/main/website`;
export const GITHUB_EDIT_URL = `https://github.com/tidalcycles/strudel/tree/main/website`;
export const COMMUNITY_INVITE_URL = `https://discord.com/invite/HGEdXmRkzT`;
@@ -58,7 +58,7 @@ export const SIDEBAR: Sidebar = {
{ text: 'What is Strudel?', link: 'workshop/getting-started' },
{ text: 'Showcase', link: 'intro/showcase' },
{ text: 'Blog', link: 'blog' },
/* { text: 'Community Bakery', link: 'bakery' }, */
{ text: 'Community Bakery', link: 'bakery' },
],
Workshop: [
// { text: 'Getting Started', link: 'workshop/getting-started' },
@@ -8,33 +8,33 @@ author: froos
## What's Changed
- Most work done as [commits to main](https://codeberg.org/uzu/strudel/commit/2a0d8c3f77ff7b34e82602e2d02400707f367316)
- repl + reify functions by @felixroos in https://codeberg.org/uzu/strudel/pulls/2
- Fix path by @yaxu in https://codeberg.org/uzu/strudel/pulls/3
- update readme for local dev by @kindohm in https://codeberg.org/uzu/strudel/pulls/4
- Patternify all the things by @yaxu in https://codeberg.org/uzu/strudel/pulls/5
- krill parser + improved repl by @felixroos in https://codeberg.org/uzu/strudel/pulls/6
- fixed editor crash by @felixroos in https://codeberg.org/uzu/strudel/pulls/7
- timeCat by @yaxu in https://codeberg.org/uzu/strudel/pulls/8
- Bugfix every, and create more top level functions by @yaxu in https://codeberg.org/uzu/strudel/pulls/9
- Failing test for `when` WIP by @yaxu in https://codeberg.org/uzu/strudel/pulls/10
- Added mask() and struct() by @yaxu in https://codeberg.org/uzu/strudel/pulls/11
- Add continuous signals (sine, cosine, saw, etc) by @yaxu in https://codeberg.org/uzu/strudel/pulls/13
- add apply and layer, and missing div/mul methods by @yaxu in https://codeberg.org/uzu/strudel/pulls/15
- higher latencyHint by @felixroos in https://codeberg.org/uzu/strudel/pulls/16
- test: 📦 Add missing dependency and a CI check, to prevent oversights ;p by @puria in https://codeberg.org/uzu/strudel/pulls/17
- fix: 💄 Enhance visualisation of the Tutorial on mobile by @puria in https://codeberg.org/uzu/strudel/pulls/19
- Stateful queries and events (WIP) by @yaxu in https://codeberg.org/uzu/strudel/pulls/14
- Fix resolveState by @yaxu in https://codeberg.org/uzu/strudel/pulls/22
- added \_asNumber + interpret numbers as midi by @felixroos in https://codeberg.org/uzu/strudel/pulls/21
- Update package.json by @ChiakiUehira in https://codeberg.org/uzu/strudel/pulls/23
- packaging by @felixroos in https://codeberg.org/uzu/strudel/pulls/24
- Most work done as [commits to main](https://github.com/tidalcycles/strudel/commits/2a0d8c3f77ff7b34e82602e2d02400707f367316)
- repl + reify functions by @felixroos in https://github.com/tidalcycles/strudel/pull/2
- Fix path by @yaxu in https://github.com/tidalcycles/strudel/pull/3
- update readme for local dev by @kindohm in https://github.com/tidalcycles/strudel/pull/4
- Patternify all the things by @yaxu in https://github.com/tidalcycles/strudel/pull/5
- krill parser + improved repl by @felixroos in https://github.com/tidalcycles/strudel/pull/6
- fixed editor crash by @felixroos in https://github.com/tidalcycles/strudel/pull/7
- timeCat by @yaxu in https://github.com/tidalcycles/strudel/pull/8
- Bugfix every, and create more top level functions by @yaxu in https://github.com/tidalcycles/strudel/pull/9
- Failing test for `when` WIP by @yaxu in https://github.com/tidalcycles/strudel/pull/10
- Added mask() and struct() by @yaxu in https://github.com/tidalcycles/strudel/pull/11
- Add continuous signals (sine, cosine, saw, etc) by @yaxu in https://github.com/tidalcycles/strudel/pull/13
- add apply and layer, and missing div/mul methods by @yaxu in https://github.com/tidalcycles/strudel/pull/15
- higher latencyHint by @felixroos in https://github.com/tidalcycles/strudel/pull/16
- test: 📦 Add missing dependency and a CI check, to prevent oversights ;p by @puria in https://github.com/tidalcycles/strudel/pull/17
- fix: 💄 Enhance visualisation of the Tutorial on mobile by @puria in https://github.com/tidalcycles/strudel/pull/19
- Stateful queries and events (WIP) by @yaxu in https://github.com/tidalcycles/strudel/pull/14
- Fix resolveState by @yaxu in https://github.com/tidalcycles/strudel/pull/22
- added \_asNumber + interpret numbers as midi by @felixroos in https://github.com/tidalcycles/strudel/pull/21
- Update package.json by @ChiakiUehira in https://github.com/tidalcycles/strudel/pull/23
- packaging by @felixroos in https://github.com/tidalcycles/strudel/pull/24
## New Contributors
- @felixroos made their first contribution in https://codeberg.org/uzu/strudel/pulls/2
- @kindohm made their first contribution in https://codeberg.org/uzu/strudel/pulls/4
- @puria made their first contribution in https://codeberg.org/uzu/strudel/pulls/17
- @ChiakiUehira made their first contribution in https://codeberg.org/uzu/strudel/pulls/23
- @felixroos made their first contribution in https://github.com/tidalcycles/strudel/pull/2
- @kindohm made their first contribution in https://github.com/tidalcycles/strudel/pull/4
- @puria made their first contribution in https://github.com/tidalcycles/strudel/pull/17
- @ChiakiUehira made their first contribution in https://github.com/tidalcycles/strudel/pull/23
**Full Changelog**: https://codeberg.org/uzu/strudel/commit/2a0d8c3f77ff7b34e82602e2d02400707f367316
**Full Changelog**: https://github.com/tidalcycles/strudel/commits/2a0d8c3f77ff7b34e82602e2d02400707f367316
@@ -7,47 +7,47 @@ author: froos
## What's Changed
- Add chunk, chunkBack and iterBack by @yaxu in https://codeberg.org/uzu/strudel/pulls/25
- Update tutorial.mdx by @bwagner in https://codeberg.org/uzu/strudel/pulls/37
- Update tutorial.mdx by @bwagner in https://codeberg.org/uzu/strudel/pulls/38
- Compose by @felixroos in https://codeberg.org/uzu/strudel/pulls/40
- Fix polymeter by @yaxu in https://codeberg.org/uzu/strudel/pulls/44
- First run at squeezeBind, ref #32 by @yaxu in https://codeberg.org/uzu/strudel/pulls/48
- Implement `chop()` by @yaxu in https://codeberg.org/uzu/strudel/pulls/50
- OSC and SuperDirt support by @yaxu in https://codeberg.org/uzu/strudel/pulls/27
- More functions by @yaxu in https://codeberg.org/uzu/strudel/pulls/56
- More functions by @yaxu in https://codeberg.org/uzu/strudel/pulls/61
- Separate out strudel.mjs, make index.mjs aggregate module by @yaxu in https://codeberg.org/uzu/strudel/pulls/62
- Speech output by @felixroos in https://codeberg.org/uzu/strudel/pulls/67
- use new fixed version of osc-js package by @felixroos in https://codeberg.org/uzu/strudel/pulls/68
- First effort at rand() by @yaxu in https://codeberg.org/uzu/strudel/pulls/69
- More randomness, fix `rand`, and add `brand`, `irand` and `choose` by @yaxu in https://codeberg.org/uzu/strudel/pulls/70
- webaudio package by @felixroos in https://codeberg.org/uzu/strudel/pulls/26
- Port `perlin` noise, `rangex`, and `palindrome` by @yaxu in https://codeberg.org/uzu/strudel/pulls/73
- More random functions by @yaxu in https://codeberg.org/uzu/strudel/pulls/74
- Try to fix appLeft / appRight by @yaxu in https://codeberg.org/uzu/strudel/pulls/75
- Basic webserial support by @yaxu in https://codeberg.org/uzu/strudel/pulls/80
- Webaudio in REPL by @felixroos in https://codeberg.org/uzu/strudel/pulls/77
- add `striate()` by @yaxu in https://codeberg.org/uzu/strudel/pulls/76
- Tidy up a couple of old files by @mindofmatthew in https://codeberg.org/uzu/strudel/pulls/84
- Add pattern composers, implements #82 by @yaxu in https://codeberg.org/uzu/strudel/pulls/83
- Fiddles with cat/stack by @yaxu in https://codeberg.org/uzu/strudel/pulls/90
- Paper by @felixroos in https://codeberg.org/uzu/strudel/pulls/98
- Change to Affero GPL by @yaxu in https://codeberg.org/uzu/strudel/pulls/101
- Work on Codemirror 6 highlighting by @mindofmatthew in https://codeberg.org/uzu/strudel/pulls/102
- Codemirror 6 by @felixroos in https://codeberg.org/uzu/strudel/pulls/97
- Tune tests by @felixroos in https://codeberg.org/uzu/strudel/pulls/104
- /embed package: web component for repl by @felixroos in https://codeberg.org/uzu/strudel/pulls/106
- Reset, Restart and other composers by @felixroos in https://codeberg.org/uzu/strudel/pulls/88
- Embed style by @felixroos in https://codeberg.org/uzu/strudel/pulls/109
- In source doc by @yaxu in https://codeberg.org/uzu/strudel/pulls/105
- `.brak()`, `.inside()` and `.outside()` by @yaxu in https://codeberg.org/uzu/strudel/pulls/112
- loopAt by @yaxu in https://codeberg.org/uzu/strudel/pulls/114
- Osc timing improvements by @yaxu in https://codeberg.org/uzu/strudel/pulls/113
- Add chunk, chunkBack and iterBack by @yaxu in https://github.com/tidalcycles/strudel/pull/25
- Update tutorial.mdx by @bwagner in https://github.com/tidalcycles/strudel/pull/37
- Update tutorial.mdx by @bwagner in https://github.com/tidalcycles/strudel/pull/38
- Compose by @felixroos in https://github.com/tidalcycles/strudel/pull/40
- Fix polymeter by @yaxu in https://github.com/tidalcycles/strudel/pull/44
- First run at squeezeBind, ref #32 by @yaxu in https://github.com/tidalcycles/strudel/pull/48
- Implement `chop()` by @yaxu in https://github.com/tidalcycles/strudel/pull/50
- OSC and SuperDirt support by @yaxu in https://github.com/tidalcycles/strudel/pull/27
- More functions by @yaxu in https://github.com/tidalcycles/strudel/pull/56
- More functions by @yaxu in https://github.com/tidalcycles/strudel/pull/61
- Separate out strudel.mjs, make index.mjs aggregate module by @yaxu in https://github.com/tidalcycles/strudel/pull/62
- Speech output by @felixroos in https://github.com/tidalcycles/strudel/pull/67
- use new fixed version of osc-js package by @felixroos in https://github.com/tidalcycles/strudel/pull/68
- First effort at rand() by @yaxu in https://github.com/tidalcycles/strudel/pull/69
- More randomness, fix `rand`, and add `brand`, `irand` and `choose` by @yaxu in https://github.com/tidalcycles/strudel/pull/70
- webaudio package by @felixroos in https://github.com/tidalcycles/strudel/pull/26
- Port `perlin` noise, `rangex`, and `palindrome` by @yaxu in https://github.com/tidalcycles/strudel/pull/73
- More random functions by @yaxu in https://github.com/tidalcycles/strudel/pull/74
- Try to fix appLeft / appRight by @yaxu in https://github.com/tidalcycles/strudel/pull/75
- Basic webserial support by @yaxu in https://github.com/tidalcycles/strudel/pull/80
- Webaudio in REPL by @felixroos in https://github.com/tidalcycles/strudel/pull/77
- add `striate()` by @yaxu in https://github.com/tidalcycles/strudel/pull/76
- Tidy up a couple of old files by @mindofmatthew in https://github.com/tidalcycles/strudel/pull/84
- Add pattern composers, implements #82 by @yaxu in https://github.com/tidalcycles/strudel/pull/83
- Fiddles with cat/stack by @yaxu in https://github.com/tidalcycles/strudel/pull/90
- Paper by @felixroos in https://github.com/tidalcycles/strudel/pull/98
- Change to Affero GPL by @yaxu in https://github.com/tidalcycles/strudel/pull/101
- Work on Codemirror 6 highlighting by @mindofmatthew in https://github.com/tidalcycles/strudel/pull/102
- Codemirror 6 by @felixroos in https://github.com/tidalcycles/strudel/pull/97
- Tune tests by @felixroos in https://github.com/tidalcycles/strudel/pull/104
- /embed package: web component for repl by @felixroos in https://github.com/tidalcycles/strudel/pull/106
- Reset, Restart and other composers by @felixroos in https://github.com/tidalcycles/strudel/pull/88
- Embed style by @felixroos in https://github.com/tidalcycles/strudel/pull/109
- In source doc by @yaxu in https://github.com/tidalcycles/strudel/pull/105
- `.brak()`, `.inside()` and `.outside()` by @yaxu in https://github.com/tidalcycles/strudel/pull/112
- loopAt by @yaxu in https://github.com/tidalcycles/strudel/pull/114
- Osc timing improvements by @yaxu in https://github.com/tidalcycles/strudel/pull/113
## New Contributors
- @bwagner made their first contribution in https://codeberg.org/uzu/strudel/pulls/37
- @mindofmatthew made their first contribution in https://codeberg.org/uzu/strudel/pulls/84
- @bwagner made their first contribution in https://github.com/tidalcycles/strudel/pull/37
- @mindofmatthew made their first contribution in https://github.com/tidalcycles/strudel/pull/84
**Full Changelog**: https://codeberg.org/uzu/strudel/compare/v0.0.2...@strudel.cycles/core@0.1.0
**Full Changelog**: https://github.com/tidalcycles/strudel/compare/v0.0.2...@strudel.cycles/core@0.1.0
@@ -8,59 +8,59 @@ author: froos
## What's Changed
- Add chunk, chunkBack and iterBack by @yaxu in https://codeberg.org/uzu/strudel/pulls/25
- Update tutorial.mdx by @bwagner in https://codeberg.org/uzu/strudel/pulls/37
- Update tutorial.mdx by @bwagner in https://codeberg.org/uzu/strudel/pulls/38
- Compose by @felixroos in https://codeberg.org/uzu/strudel/pulls/40
- Fix polymeter by @yaxu in https://codeberg.org/uzu/strudel/pulls/44
- First run at squeezeBind, ref #32 by @yaxu in https://codeberg.org/uzu/strudel/pulls/48
- Implement `chop()` by @yaxu in https://codeberg.org/uzu/strudel/pulls/50
- OSC and SuperDirt support by @yaxu in https://codeberg.org/uzu/strudel/pulls/27
- More functions by @yaxu in https://codeberg.org/uzu/strudel/pulls/56
- More functions by @yaxu in https://codeberg.org/uzu/strudel/pulls/61
- Separate out strudel.mjs, make index.mjs aggregate module by @yaxu in https://codeberg.org/uzu/strudel/pulls/62
- Speech output by @felixroos in https://codeberg.org/uzu/strudel/pulls/67
- use new fixed version of osc-js package by @felixroos in https://codeberg.org/uzu/strudel/pulls/68
- First effort at rand() by @yaxu in https://codeberg.org/uzu/strudel/pulls/69
- More randomness, fix `rand`, and add `brand`, `irand` and `choose` by @yaxu in https://codeberg.org/uzu/strudel/pulls/70
- webaudio package by @felixroos in https://codeberg.org/uzu/strudel/pulls/26
- Port `perlin` noise, `rangex`, and `palindrome` by @yaxu in https://codeberg.org/uzu/strudel/pulls/73
- More random functions by @yaxu in https://codeberg.org/uzu/strudel/pulls/74
- Try to fix appLeft / appRight by @yaxu in https://codeberg.org/uzu/strudel/pulls/75
- Basic webserial support by @yaxu in https://codeberg.org/uzu/strudel/pulls/80
- Webaudio in REPL by @felixroos in https://codeberg.org/uzu/strudel/pulls/77
- add `striate()` by @yaxu in https://codeberg.org/uzu/strudel/pulls/76
- Tidy up a couple of old files by @mindofmatthew in https://codeberg.org/uzu/strudel/pulls/84
- Add pattern composers, implements #82 by @yaxu in https://codeberg.org/uzu/strudel/pulls/83
- Fiddles with cat/stack by @yaxu in https://codeberg.org/uzu/strudel/pulls/90
- Paper by @felixroos in https://codeberg.org/uzu/strudel/pulls/98
- Change to Affero GPL by @yaxu in https://codeberg.org/uzu/strudel/pulls/101
- Work on Codemirror 6 highlighting by @mindofmatthew in https://codeberg.org/uzu/strudel/pulls/102
- Codemirror 6 by @felixroos in https://codeberg.org/uzu/strudel/pulls/97
- Tune tests by @felixroos in https://codeberg.org/uzu/strudel/pulls/104
- /embed package: web component for repl by @felixroos in https://codeberg.org/uzu/strudel/pulls/106
- Reset, Restart and other composers by @felixroos in https://codeberg.org/uzu/strudel/pulls/88
- Embed style by @felixroos in https://codeberg.org/uzu/strudel/pulls/109
- In source doc by @yaxu in https://codeberg.org/uzu/strudel/pulls/105
- `.brak()`, `.inside()` and `.outside()` by @yaxu in https://codeberg.org/uzu/strudel/pulls/112
- loopAt by @yaxu in https://codeberg.org/uzu/strudel/pulls/114
- Osc timing improvements by @yaxu in https://codeberg.org/uzu/strudel/pulls/113
- react package + vite build by @felixroos in https://codeberg.org/uzu/strudel/pulls/116
- In source doc by @felixroos in https://codeberg.org/uzu/strudel/pulls/117
- fix: #108 by @felixroos in https://codeberg.org/uzu/strudel/pulls/123
- fix: #122 ctrl enter would add newline by @felixroos in https://codeberg.org/uzu/strudel/pulls/124
- Webdirt by @felixroos in https://codeberg.org/uzu/strudel/pulls/121
- Fix link to contributing to tutorial docs by @stephendwolff in https://codeberg.org/uzu/strudel/pulls/129
- Pianoroll enhancements by @felixroos in https://codeberg.org/uzu/strudel/pulls/131
- add createParam + createParams by @felixroos in https://codeberg.org/uzu/strudel/pulls/110
- remove cycle + delta from onTrigger by @felixroos in https://codeberg.org/uzu/strudel/pulls/135
- Scheduler improvements by @felixroos in https://codeberg.org/uzu/strudel/pulls/134
- add onTrigger helper by @felixroos in https://codeberg.org/uzu/strudel/pulls/136
- Add chunk, chunkBack and iterBack by @yaxu in https://github.com/tidalcycles/strudel/pull/25
- Update tutorial.mdx by @bwagner in https://github.com/tidalcycles/strudel/pull/37
- Update tutorial.mdx by @bwagner in https://github.com/tidalcycles/strudel/pull/38
- Compose by @felixroos in https://github.com/tidalcycles/strudel/pull/40
- Fix polymeter by @yaxu in https://github.com/tidalcycles/strudel/pull/44
- First run at squeezeBind, ref #32 by @yaxu in https://github.com/tidalcycles/strudel/pull/48
- Implement `chop()` by @yaxu in https://github.com/tidalcycles/strudel/pull/50
- OSC and SuperDirt support by @yaxu in https://github.com/tidalcycles/strudel/pull/27
- More functions by @yaxu in https://github.com/tidalcycles/strudel/pull/56
- More functions by @yaxu in https://github.com/tidalcycles/strudel/pull/61
- Separate out strudel.mjs, make index.mjs aggregate module by @yaxu in https://github.com/tidalcycles/strudel/pull/62
- Speech output by @felixroos in https://github.com/tidalcycles/strudel/pull/67
- use new fixed version of osc-js package by @felixroos in https://github.com/tidalcycles/strudel/pull/68
- First effort at rand() by @yaxu in https://github.com/tidalcycles/strudel/pull/69
- More randomness, fix `rand`, and add `brand`, `irand` and `choose` by @yaxu in https://github.com/tidalcycles/strudel/pull/70
- webaudio package by @felixroos in https://github.com/tidalcycles/strudel/pull/26
- Port `perlin` noise, `rangex`, and `palindrome` by @yaxu in https://github.com/tidalcycles/strudel/pull/73
- More random functions by @yaxu in https://github.com/tidalcycles/strudel/pull/74
- Try to fix appLeft / appRight by @yaxu in https://github.com/tidalcycles/strudel/pull/75
- Basic webserial support by @yaxu in https://github.com/tidalcycles/strudel/pull/80
- Webaudio in REPL by @felixroos in https://github.com/tidalcycles/strudel/pull/77
- add `striate()` by @yaxu in https://github.com/tidalcycles/strudel/pull/76
- Tidy up a couple of old files by @mindofmatthew in https://github.com/tidalcycles/strudel/pull/84
- Add pattern composers, implements #82 by @yaxu in https://github.com/tidalcycles/strudel/pull/83
- Fiddles with cat/stack by @yaxu in https://github.com/tidalcycles/strudel/pull/90
- Paper by @felixroos in https://github.com/tidalcycles/strudel/pull/98
- Change to Affero GPL by @yaxu in https://github.com/tidalcycles/strudel/pull/101
- Work on Codemirror 6 highlighting by @mindofmatthew in https://github.com/tidalcycles/strudel/pull/102
- Codemirror 6 by @felixroos in https://github.com/tidalcycles/strudel/pull/97
- Tune tests by @felixroos in https://github.com/tidalcycles/strudel/pull/104
- /embed package: web component for repl by @felixroos in https://github.com/tidalcycles/strudel/pull/106
- Reset, Restart and other composers by @felixroos in https://github.com/tidalcycles/strudel/pull/88
- Embed style by @felixroos in https://github.com/tidalcycles/strudel/pull/109
- In source doc by @yaxu in https://github.com/tidalcycles/strudel/pull/105
- `.brak()`, `.inside()` and `.outside()` by @yaxu in https://github.com/tidalcycles/strudel/pull/112
- loopAt by @yaxu in https://github.com/tidalcycles/strudel/pull/114
- Osc timing improvements by @yaxu in https://github.com/tidalcycles/strudel/pull/113
- react package + vite build by @felixroos in https://github.com/tidalcycles/strudel/pull/116
- In source doc by @felixroos in https://github.com/tidalcycles/strudel/pull/117
- fix: #108 by @felixroos in https://github.com/tidalcycles/strudel/pull/123
- fix: #122 ctrl enter would add newline by @felixroos in https://github.com/tidalcycles/strudel/pull/124
- Webdirt by @felixroos in https://github.com/tidalcycles/strudel/pull/121
- Fix link to contributing to tutorial docs by @stephendwolff in https://github.com/tidalcycles/strudel/pull/129
- Pianoroll enhancements by @felixroos in https://github.com/tidalcycles/strudel/pull/131
- add createParam + createParams by @felixroos in https://github.com/tidalcycles/strudel/pull/110
- remove cycle + delta from onTrigger by @felixroos in https://github.com/tidalcycles/strudel/pull/135
- Scheduler improvements by @felixroos in https://github.com/tidalcycles/strudel/pull/134
- add onTrigger helper by @felixroos in https://github.com/tidalcycles/strudel/pull/136
## New Contributors
- @bwagner made their first contribution in https://codeberg.org/uzu/strudel/pulls/37
- @mindofmatthew made their first contribution in https://codeberg.org/uzu/strudel/pulls/84
- @stephendwolff made their first contribution in https://codeberg.org/uzu/strudel/pulls/129
- @bwagner made their first contribution in https://github.com/tidalcycles/strudel/pull/37
- @mindofmatthew made their first contribution in https://github.com/tidalcycles/strudel/pull/84
- @stephendwolff made their first contribution in https://github.com/tidalcycles/strudel/pull/129
**Full Changelog**: https://codeberg.org/uzu/strudel/compare/v0.0.2...v0.0.3
**Full Changelog**: https://github.com/tidalcycles/strudel/compare/v0.0.2...v0.0.3
@@ -8,38 +8,38 @@ author: froos
## What's Changed
- Webaudio rewrite by @felixroos in https://codeberg.org/uzu/strudel/pulls/138
- Fix createParam() by @yaxu in https://codeberg.org/uzu/strudel/pulls/140
- Soundfont Support by @felixroos in https://codeberg.org/uzu/strudel/pulls/139
- Serial twiddles by @yaxu in https://codeberg.org/uzu/strudel/pulls/141
- Pianoroll Object Support by @felixroos in https://codeberg.org/uzu/strudel/pulls/142
- flash effect on ctrl enter by @felixroos in https://codeberg.org/uzu/strudel/pulls/144
- can now generate short link for sharing by @felixroos in https://codeberg.org/uzu/strudel/pulls/146
- Sampler optimizations and more by @felixroos in https://codeberg.org/uzu/strudel/pulls/148
- Final update to demo.pdf by @yaxu in https://codeberg.org/uzu/strudel/pulls/151
- add webdirt drum samples to prebake for general availability by @larkob in https://codeberg.org/uzu/strudel/pulls/150
- update to tutorial documentation by @larkob in https://codeberg.org/uzu/strudel/pulls/162
- add chooseInWith/chooseCycles by @yaxu in https://codeberg.org/uzu/strudel/pulls/166
- fix: jsdoc comments by @felixroos in https://codeberg.org/uzu/strudel/pulls/169
- Pianoroll fixes by @felixroos in https://codeberg.org/uzu/strudel/pulls/163
- Talk fixes by @felixroos in https://codeberg.org/uzu/strudel/pulls/164
- Amend shapeshifter to allow use of dynamic import by @debrisapron in https://codeberg.org/uzu/strudel/pulls/171
- add more shapeshifter flags by @felixroos in https://codeberg.org/uzu/strudel/pulls/99
- Replace react-codemirror6 with @uiw/react-codemirror by @felixroos in https://codeberg.org/uzu/strudel/pulls/173
- fix some annoying bugs by @felixroos in https://codeberg.org/uzu/strudel/pulls/177
- incorporate elements of randomness to the mini notation by @bpow in https://codeberg.org/uzu/strudel/pulls/165
- replace mocha with vitest by @felixroos in https://codeberg.org/uzu/strudel/pulls/175
- scheduler improvements by @felixroos in https://codeberg.org/uzu/strudel/pulls/181
- Fix codemirror bug by @felixroos in https://codeberg.org/uzu/strudel/pulls/186
- wait for prebake to finish before evaluating by @felixroos in https://codeberg.org/uzu/strudel/pulls/189
- fix regression: old way of setting frequencies was broken by @felixroos in https://codeberg.org/uzu/strudel/pulls/190
- Soundfont file support by @felixroos in https://codeberg.org/uzu/strudel/pulls/183
- change "stride"/"offset" of successive degradeBy/chooseIn by @bpow in https://codeberg.org/uzu/strudel/pulls/185
- Webaudio rewrite by @felixroos in https://github.com/tidalcycles/strudel/pull/138
- Fix createParam() by @yaxu in https://github.com/tidalcycles/strudel/pull/140
- Soundfont Support by @felixroos in https://github.com/tidalcycles/strudel/pull/139
- Serial twiddles by @yaxu in https://github.com/tidalcycles/strudel/pull/141
- Pianoroll Object Support by @felixroos in https://github.com/tidalcycles/strudel/pull/142
- flash effect on ctrl enter by @felixroos in https://github.com/tidalcycles/strudel/pull/144
- can now generate short link for sharing by @felixroos in https://github.com/tidalcycles/strudel/pull/146
- Sampler optimizations and more by @felixroos in https://github.com/tidalcycles/strudel/pull/148
- Final update to demo.pdf by @yaxu in https://github.com/tidalcycles/strudel/pull/151
- add webdirt drum samples to prebake for general availability by @larkob in https://github.com/tidalcycles/strudel/pull/150
- update to tutorial documentation by @larkob in https://github.com/tidalcycles/strudel/pull/162
- add chooseInWith/chooseCycles by @yaxu in https://github.com/tidalcycles/strudel/pull/166
- fix: jsdoc comments by @felixroos in https://github.com/tidalcycles/strudel/pull/169
- Pianoroll fixes by @felixroos in https://github.com/tidalcycles/strudel/pull/163
- Talk fixes by @felixroos in https://github.com/tidalcycles/strudel/pull/164
- Amend shapeshifter to allow use of dynamic import by @debrisapron in https://github.com/tidalcycles/strudel/pull/171
- add more shapeshifter flags by @felixroos in https://github.com/tidalcycles/strudel/pull/99
- Replace react-codemirror6 with @uiw/react-codemirror by @felixroos in https://github.com/tidalcycles/strudel/pull/173
- fix some annoying bugs by @felixroos in https://github.com/tidalcycles/strudel/pull/177
- incorporate elements of randomness to the mini notation by @bpow in https://github.com/tidalcycles/strudel/pull/165
- replace mocha with vitest by @felixroos in https://github.com/tidalcycles/strudel/pull/175
- scheduler improvements by @felixroos in https://github.com/tidalcycles/strudel/pull/181
- Fix codemirror bug by @felixroos in https://github.com/tidalcycles/strudel/pull/186
- wait for prebake to finish before evaluating by @felixroos in https://github.com/tidalcycles/strudel/pull/189
- fix regression: old way of setting frequencies was broken by @felixroos in https://github.com/tidalcycles/strudel/pull/190
- Soundfont file support by @felixroos in https://github.com/tidalcycles/strudel/pull/183
- change "stride"/"offset" of successive degradeBy/chooseIn by @bpow in https://github.com/tidalcycles/strudel/pull/185
## New Contributors
- @larkob made their first contribution in https://codeberg.org/uzu/strudel/pulls/150
- @debrisapron made their first contribution in https://codeberg.org/uzu/strudel/pulls/171
- @bpow made their first contribution in https://codeberg.org/uzu/strudel/pulls/165
- @larkob made their first contribution in https://github.com/tidalcycles/strudel/pull/150
- @debrisapron made their first contribution in https://github.com/tidalcycles/strudel/pull/171
- @bpow made their first contribution in https://github.com/tidalcycles/strudel/pull/165
**Full Changelog**: https://codeberg.org/uzu/strudel/compare/v0.0.3...v0.0.4
**Full Changelog**: https://github.com/tidalcycles/strudel/compare/v0.0.3...v0.0.4
@@ -22,44 +22,44 @@ author: froos
## What's Changed
- Fix numbers in sampler by @felixroos in https://codeberg.org/uzu/strudel/pulls/196
- document random functions by @felixroos in https://codeberg.org/uzu/strudel/pulls/199
- add rollup-plugin-visualizer to build by @felixroos in https://codeberg.org/uzu/strudel/pulls/200
- add vowel to .out by @felixroos in https://codeberg.org/uzu/strudel/pulls/201
- Coarse crush shape by @felixroos in https://codeberg.org/uzu/strudel/pulls/205
- Webaudio guide by @felixroos in https://codeberg.org/uzu/strudel/pulls/207
- Even more docs by @felixroos in https://codeberg.org/uzu/strudel/pulls/212
- Just another docs PR by @felixroos in https://codeberg.org/uzu/strudel/pulls/215
- sampler features + fixes by @felixroos in https://codeberg.org/uzu/strudel/pulls/217
- samples now have envelopes by @felixroos in https://codeberg.org/uzu/strudel/pulls/218
- encapsulate webaudio output by @felixroos in https://codeberg.org/uzu/strudel/pulls/219
- Fix squeeze join by @yaxu in https://codeberg.org/uzu/strudel/pulls/220
- Feedback Delay by @felixroos in https://codeberg.org/uzu/strudel/pulls/213
- support negative speeds by @felixroos in https://codeberg.org/uzu/strudel/pulls/222
- focus tweak for squeezeJoin - another go at fixing #216 by @yaxu in https://codeberg.org/uzu/strudel/pulls/221
- Reverb by @felixroos in https://codeberg.org/uzu/strudel/pulls/224
- fix fastgap for events that go across cycle boundaries by @yaxu in https://codeberg.org/uzu/strudel/pulls/225
- Core util tests by @mystery-house in https://codeberg.org/uzu/strudel/pulls/226
- Refactor tunes away from tone by @felixroos in https://codeberg.org/uzu/strudel/pulls/230
- Just another docs branch by @felixroos in https://codeberg.org/uzu/strudel/pulls/228
- Patternify range by @yaxu in https://codeberg.org/uzu/strudel/pulls/231
- Out by default by @felixroos in https://codeberg.org/uzu/strudel/pulls/232
- Fix zero length queries WIP by @yaxu in https://codeberg.org/uzu/strudel/pulls/234
- add vcsl sample library by @felixroos in https://codeberg.org/uzu/strudel/pulls/235
- fx on stereo speakers by @felixroos in https://codeberg.org/uzu/strudel/pulls/236
- Tidal drum machines by @felixroos in https://codeberg.org/uzu/strudel/pulls/237
- Object arithmetic by @felixroos in https://codeberg.org/uzu/strudel/pulls/238
- Load samples from url by @felixroos in https://codeberg.org/uzu/strudel/pulls/239
- feat: support github: links by @felixroos in https://codeberg.org/uzu/strudel/pulls/240
- in source example tests by @felixroos in https://codeberg.org/uzu/strudel/pulls/242
- Readme + TLC by @felixroos in https://codeberg.org/uzu/strudel/pulls/244
- patchday by @felixroos in https://codeberg.org/uzu/strudel/pulls/246
- Some tunes by @felixroos in https://codeberg.org/uzu/strudel/pulls/247
- snapshot tests on shared snippets by @felixroos in https://codeberg.org/uzu/strudel/pulls/243
- General purpose scheduler by @felixroos in https://codeberg.org/uzu/strudel/pulls/248
- Fix numbers in sampler by @felixroos in https://github.com/tidalcycles/strudel/pull/196
- document random functions by @felixroos in https://github.com/tidalcycles/strudel/pull/199
- add rollup-plugin-visualizer to build by @felixroos in https://github.com/tidalcycles/strudel/pull/200
- add vowel to .out by @felixroos in https://github.com/tidalcycles/strudel/pull/201
- Coarse crush shape by @felixroos in https://github.com/tidalcycles/strudel/pull/205
- Webaudio guide by @felixroos in https://github.com/tidalcycles/strudel/pull/207
- Even more docs by @felixroos in https://github.com/tidalcycles/strudel/pull/212
- Just another docs PR by @felixroos in https://github.com/tidalcycles/strudel/pull/215
- sampler features + fixes by @felixroos in https://github.com/tidalcycles/strudel/pull/217
- samples now have envelopes by @felixroos in https://github.com/tidalcycles/strudel/pull/218
- encapsulate webaudio output by @felixroos in https://github.com/tidalcycles/strudel/pull/219
- Fix squeeze join by @yaxu in https://github.com/tidalcycles/strudel/pull/220
- Feedback Delay by @felixroos in https://github.com/tidalcycles/strudel/pull/213
- support negative speeds by @felixroos in https://github.com/tidalcycles/strudel/pull/222
- focus tweak for squeezeJoin - another go at fixing #216 by @yaxu in https://github.com/tidalcycles/strudel/pull/221
- Reverb by @felixroos in https://github.com/tidalcycles/strudel/pull/224
- fix fastgap for events that go across cycle boundaries by @yaxu in https://github.com/tidalcycles/strudel/pull/225
- Core util tests by @mystery-house in https://github.com/tidalcycles/strudel/pull/226
- Refactor tunes away from tone by @felixroos in https://github.com/tidalcycles/strudel/pull/230
- Just another docs branch by @felixroos in https://github.com/tidalcycles/strudel/pull/228
- Patternify range by @yaxu in https://github.com/tidalcycles/strudel/pull/231
- Out by default by @felixroos in https://github.com/tidalcycles/strudel/pull/232
- Fix zero length queries WIP by @yaxu in https://github.com/tidalcycles/strudel/pull/234
- add vcsl sample library by @felixroos in https://github.com/tidalcycles/strudel/pull/235
- fx on stereo speakers by @felixroos in https://github.com/tidalcycles/strudel/pull/236
- Tidal drum machines by @felixroos in https://github.com/tidalcycles/strudel/pull/237
- Object arithmetic by @felixroos in https://github.com/tidalcycles/strudel/pull/238
- Load samples from url by @felixroos in https://github.com/tidalcycles/strudel/pull/239
- feat: support github: links by @felixroos in https://github.com/tidalcycles/strudel/pull/240
- in source example tests by @felixroos in https://github.com/tidalcycles/strudel/pull/242
- Readme + TLC by @felixroos in https://github.com/tidalcycles/strudel/pull/244
- patchday by @felixroos in https://github.com/tidalcycles/strudel/pull/246
- Some tunes by @felixroos in https://github.com/tidalcycles/strudel/pull/247
- snapshot tests on shared snippets by @felixroos in https://github.com/tidalcycles/strudel/pull/243
- General purpose scheduler by @felixroos in https://github.com/tidalcycles/strudel/pull/248
## New Contributors
- @mystery-house made their first contribution in https://codeberg.org/uzu/strudel/pulls/226
- @mystery-house made their first contribution in https://github.com/tidalcycles/strudel/pull/226
**Full Changelog**: https://codeberg.org/uzu/strudel/compare/v0.0.4...v0.3.0
**Full Changelog**: https://github.com/tidalcycles/strudel/compare/v0.0.4...v0.3.0
@@ -8,8 +8,8 @@ author: froos
## What's Changed
- new transpiler based on acorn by @felixroos in https://codeberg.org/uzu/strudel/pulls/249
- Webaudio build by @felixroos in https://codeberg.org/uzu/strudel/pulls/250
- Repl refactoring by @felixroos in https://codeberg.org/uzu/strudel/pulls/255
- new transpiler based on acorn by @felixroos in https://github.com/tidalcycles/strudel/pull/249
- Webaudio build by @felixroos in https://github.com/tidalcycles/strudel/pull/250
- Repl refactoring by @felixroos in https://github.com/tidalcycles/strudel/pull/255
**Full Changelog**: https://codeberg.org/uzu/strudel/compare/v0.3.0...v0.4.0
**Full Changelog**: https://github.com/tidalcycles/strudel/compare/v0.3.0...v0.4.0
@@ -26,34 +26,34 @@ author: froos
## What's Changed
- Binaries by @felixroos in https://codeberg.org/uzu/strudel/pulls/254
- fix tutorial bugs by @felixroos in https://codeberg.org/uzu/strudel/pulls/263
- fix performance bottleneck by @felixroos in https://codeberg.org/uzu/strudel/pulls/266
- Tidying up core by @yaxu in https://codeberg.org/uzu/strudel/pulls/256
- tonal update with fixed memory leak by @felixroos in https://codeberg.org/uzu/strudel/pulls/272
- add eslint by @felixroos in https://codeberg.org/uzu/strudel/pulls/271
- release version bumps by @felixroos in https://codeberg.org/uzu/strudel/pulls/273
- Support sending CRC16 bytes with serial messages by @yaxu in https://codeberg.org/uzu/strudel/pulls/276
- add licenses / credits to all tunes + remove some by @felixroos in https://codeberg.org/uzu/strudel/pulls/277
- add basic csound output by @felixroos in https://codeberg.org/uzu/strudel/pulls/275
- do not recompile orc by @felixroos in https://codeberg.org/uzu/strudel/pulls/278
- implement collect + arp function by @felixroos in https://codeberg.org/uzu/strudel/pulls/281
- Switch 'operators' from .whatHow to .what.how by @yaxu in https://codeberg.org/uzu/strudel/pulls/285
- Fancy hap show, include part in snapshots by @yaxu in https://codeberg.org/uzu/strudel/pulls/291
- Reorganise pattern.mjs with a 'toplevel first' regime by @yaxu in https://codeberg.org/uzu/strudel/pulls/286
- add prettier task by @felixroos in https://codeberg.org/uzu/strudel/pulls/296
- Move stuff to new register function by @felixroos in https://codeberg.org/uzu/strudel/pulls/295
- can now add bare numbers to numeral object props by @felixroos in https://codeberg.org/uzu/strudel/pulls/287
- update vitest by @felixroos in https://codeberg.org/uzu/strudel/pulls/297
- remove whitespace from highlighted region by @felixroos in https://codeberg.org/uzu/strudel/pulls/298
- .defragmentHaps() for merging touching haps that share a whole and value by @yaxu in https://codeberg.org/uzu/strudel/pulls/299
- fix whitespace trimming by @felixroos in https://codeberg.org/uzu/strudel/pulls/300
- add freq support to sampler by @felixroos in https://codeberg.org/uzu/strudel/pulls/301
- add lint + prettier check before test by @felixroos in https://codeberg.org/uzu/strudel/pulls/305
- Updated csoundm to use the register facility . by @gogins in https://codeberg.org/uzu/strudel/pulls/303
- Binaries by @felixroos in https://github.com/tidalcycles/strudel/pull/254
- fix tutorial bugs by @felixroos in https://github.com/tidalcycles/strudel/pull/263
- fix performance bottleneck by @felixroos in https://github.com/tidalcycles/strudel/pull/266
- Tidying up core by @yaxu in https://github.com/tidalcycles/strudel/pull/256
- tonal update with fixed memory leak by @felixroos in https://github.com/tidalcycles/strudel/pull/272
- add eslint by @felixroos in https://github.com/tidalcycles/strudel/pull/271
- release version bumps by @felixroos in https://github.com/tidalcycles/strudel/pull/273
- Support sending CRC16 bytes with serial messages by @yaxu in https://github.com/tidalcycles/strudel/pull/276
- add licenses / credits to all tunes + remove some by @felixroos in https://github.com/tidalcycles/strudel/pull/277
- add basic csound output by @felixroos in https://github.com/tidalcycles/strudel/pull/275
- do not recompile orc by @felixroos in https://github.com/tidalcycles/strudel/pull/278
- implement collect + arp function by @felixroos in https://github.com/tidalcycles/strudel/pull/281
- Switch 'operators' from .whatHow to .what.how by @yaxu in https://github.com/tidalcycles/strudel/pull/285
- Fancy hap show, include part in snapshots by @yaxu in https://github.com/tidalcycles/strudel/pull/291
- Reorganise pattern.mjs with a 'toplevel first' regime by @yaxu in https://github.com/tidalcycles/strudel/pull/286
- add prettier task by @felixroos in https://github.com/tidalcycles/strudel/pull/296
- Move stuff to new register function by @felixroos in https://github.com/tidalcycles/strudel/pull/295
- can now add bare numbers to numeral object props by @felixroos in https://github.com/tidalcycles/strudel/pull/287
- update vitest by @felixroos in https://github.com/tidalcycles/strudel/pull/297
- remove whitespace from highlighted region by @felixroos in https://github.com/tidalcycles/strudel/pull/298
- .defragmentHaps() for merging touching haps that share a whole and value by @yaxu in https://github.com/tidalcycles/strudel/pull/299
- fix whitespace trimming by @felixroos in https://github.com/tidalcycles/strudel/pull/300
- add freq support to sampler by @felixroos in https://github.com/tidalcycles/strudel/pull/301
- add lint + prettier check before test by @felixroos in https://github.com/tidalcycles/strudel/pull/305
- Updated csoundm to use the register facility . by @gogins in https://github.com/tidalcycles/strudel/pull/303
## New Contributors
- @gogins made their first contribution in https://codeberg.org/uzu/strudel/pulls/303
- @gogins made their first contribution in https://github.com/tidalcycles/strudel/pull/303
**Full Changelog**: https://codeberg.org/uzu/strudel/compare/v0.4.0...v0.5.0
**Full Changelog**: https://github.com/tidalcycles/strudel/compare/v0.4.0...v0.5.0
@@ -26,59 +26,59 @@ author: froos
## What's Changed
- support freq in pianoroll by @felixroos in https://codeberg.org/uzu/strudel/pulls/308
- ICLC2023 paper WIP by @yaxu in https://codeberg.org/uzu/strudel/pulls/306
- fix: copy share link to clipboard was broken for some browsers by @felixroos in https://codeberg.org/uzu/strudel/pulls/311
- Jsdoc component by @felixroos in https://codeberg.org/uzu/strudel/pulls/312
- object support for .scale by @felixroos in https://codeberg.org/uzu/strudel/pulls/307
- Astro build by @felixroos in https://codeberg.org/uzu/strudel/pulls/315
- Reference tab sort by @felixroos in https://codeberg.org/uzu/strudel/pulls/318
- tutorial updates by @jarmitage in https://codeberg.org/uzu/strudel/pulls/320
- support notes without octave by @felixroos in https://codeberg.org/uzu/strudel/pulls/323
- mini repl improvements by @felixroos in https://codeberg.org/uzu/strudel/pulls/324
- fix: workaround Object.assign globalThis by @felixroos in https://codeberg.org/uzu/strudel/pulls/326
- add examples route by @felixroos in https://codeberg.org/uzu/strudel/pulls/327
- add my-patterns by @felixroos in https://codeberg.org/uzu/strudel/pulls/328
- my-patterns build + deploy by @felixroos in https://codeberg.org/uzu/strudel/pulls/329
- my-patterns: fix paths + update readme by @felixroos in https://codeberg.org/uzu/strudel/pulls/330
- improve displaying 's' in pianoroll by @felixroos in https://codeberg.org/uzu/strudel/pulls/331
- fix: can now multiply floats in mini notation by @felixroos in https://codeberg.org/uzu/strudel/pulls/332
- Embed mode improvements by @felixroos in https://codeberg.org/uzu/strudel/pulls/333
- testing + docs docs by @felixroos in https://codeberg.org/uzu/strudel/pulls/334
- animate mvp by @felixroos in https://codeberg.org/uzu/strudel/pulls/335
- Tidy parser, implement polymeters by @yaxu in https://codeberg.org/uzu/strudel/pulls/336
- animation options by @felixroos in https://codeberg.org/uzu/strudel/pulls/337
- move /my-patterns to /swatch by @yaxu in https://codeberg.org/uzu/strudel/pulls/338
- more animate functions + mini repl fix by @felixroos in https://codeberg.org/uzu/strudel/pulls/340
- Patternify euclid, fast, slow and polymeter step parameters in mininotation by @yaxu in https://codeberg.org/uzu/strudel/pulls/341
- fixes #346 by @felixroos in https://codeberg.org/uzu/strudel/pulls/347
- Fix prebake base path by @felixroos in https://codeberg.org/uzu/strudel/pulls/345
- Fix Bjorklund by @yaxu in https://codeberg.org/uzu/strudel/pulls/343
- docs: tidal comparison + add global fx + add missing sampler fx by @felixroos in https://codeberg.org/uzu/strudel/pulls/356
- Fix .out(), renaming webaudio's out() to webaudio() by @yaxu in https://codeberg.org/uzu/strudel/pulls/361
- Support for multiple mininotation operators by @yaxu in https://codeberg.org/uzu/strudel/pulls/350
- doc structuring by @felixroos in https://codeberg.org/uzu/strudel/pulls/360
- add https to url by @urswilke in https://codeberg.org/uzu/strudel/pulls/364
- document more functions + change arp join by @felixroos in https://codeberg.org/uzu/strudel/pulls/369
- improve new draw logic by @felixroos in https://codeberg.org/uzu/strudel/pulls/372
- Draw fixes by @felixroos in https://codeberg.org/uzu/strudel/pulls/377
- update my-patterns instructions by @felixroos in https://codeberg.org/uzu/strudel/pulls/384
- docs: use note instead of n to mitigate confusion by @felixroos in https://codeberg.org/uzu/strudel/pulls/385
- add run + test + docs by @felixroos in https://codeberg.org/uzu/strudel/pulls/386
- Rename a to angle by @felixroos in https://codeberg.org/uzu/strudel/pulls/387
- document csound by @felixroos in https://codeberg.org/uzu/strudel/pulls/391
- Notes are not essential :) by @yaxu in https://codeberg.org/uzu/strudel/pulls/393
- add ribbon + test + docs by @felixroos in https://codeberg.org/uzu/strudel/pulls/388
- Add tidal-drum-patterns to examples by @urswilke in https://codeberg.org/uzu/strudel/pulls/379
- add pattern methods hurry, press and pressBy by @yaxu in https://codeberg.org/uzu/strudel/pulls/397
- proper builds + use pnpm workspaces by @felixroos in https://codeberg.org/uzu/strudel/pulls/396
- fix: minirepl styles by @felixroos in https://codeberg.org/uzu/strudel/pulls/398
- can now await initAudio + initAudioOnFirstClick by @felixroos in https://codeberg.org/uzu/strudel/pulls/399
- release webaudio by @felixroos in https://codeberg.org/uzu/strudel/pulls/400
- support freq in pianoroll by @felixroos in https://github.com/tidalcycles/strudel/pull/308
- ICLC2023 paper WIP by @yaxu in https://github.com/tidalcycles/strudel/pull/306
- fix: copy share link to clipboard was broken for some browsers by @felixroos in https://github.com/tidalcycles/strudel/pull/311
- Jsdoc component by @felixroos in https://github.com/tidalcycles/strudel/pull/312
- object support for .scale by @felixroos in https://github.com/tidalcycles/strudel/pull/307
- Astro build by @felixroos in https://github.com/tidalcycles/strudel/pull/315
- Reference tab sort by @felixroos in https://github.com/tidalcycles/strudel/pull/318
- tutorial updates by @jarmitage in https://github.com/tidalcycles/strudel/pull/320
- support notes without octave by @felixroos in https://github.com/tidalcycles/strudel/pull/323
- mini repl improvements by @felixroos in https://github.com/tidalcycles/strudel/pull/324
- fix: workaround Object.assign globalThis by @felixroos in https://github.com/tidalcycles/strudel/pull/326
- add examples route by @felixroos in https://github.com/tidalcycles/strudel/pull/327
- add my-patterns by @felixroos in https://github.com/tidalcycles/strudel/pull/328
- my-patterns build + deploy by @felixroos in https://github.com/tidalcycles/strudel/pull/329
- my-patterns: fix paths + update readme by @felixroos in https://github.com/tidalcycles/strudel/pull/330
- improve displaying 's' in pianoroll by @felixroos in https://github.com/tidalcycles/strudel/pull/331
- fix: can now multiply floats in mini notation by @felixroos in https://github.com/tidalcycles/strudel/pull/332
- Embed mode improvements by @felixroos in https://github.com/tidalcycles/strudel/pull/333
- testing + docs docs by @felixroos in https://github.com/tidalcycles/strudel/pull/334
- animate mvp by @felixroos in https://github.com/tidalcycles/strudel/pull/335
- Tidy parser, implement polymeters by @yaxu in https://github.com/tidalcycles/strudel/pull/336
- animation options by @felixroos in https://github.com/tidalcycles/strudel/pull/337
- move /my-patterns to /swatch by @yaxu in https://github.com/tidalcycles/strudel/pull/338
- more animate functions + mini repl fix by @felixroos in https://github.com/tidalcycles/strudel/pull/340
- Patternify euclid, fast, slow and polymeter step parameters in mininotation by @yaxu in https://github.com/tidalcycles/strudel/pull/341
- fixes #346 by @felixroos in https://github.com/tidalcycles/strudel/pull/347
- Fix prebake base path by @felixroos in https://github.com/tidalcycles/strudel/pull/345
- Fix Bjorklund by @yaxu in https://github.com/tidalcycles/strudel/pull/343
- docs: tidal comparison + add global fx + add missing sampler fx by @felixroos in https://github.com/tidalcycles/strudel/pull/356
- Fix .out(), renaming webaudio's out() to webaudio() by @yaxu in https://github.com/tidalcycles/strudel/pull/361
- Support for multiple mininotation operators by @yaxu in https://github.com/tidalcycles/strudel/pull/350
- doc structuring by @felixroos in https://github.com/tidalcycles/strudel/pull/360
- add https to url by @urswilke in https://github.com/tidalcycles/strudel/pull/364
- document more functions + change arp join by @felixroos in https://github.com/tidalcycles/strudel/pull/369
- improve new draw logic by @felixroos in https://github.com/tidalcycles/strudel/pull/372
- Draw fixes by @felixroos in https://github.com/tidalcycles/strudel/pull/377
- update my-patterns instructions by @felixroos in https://github.com/tidalcycles/strudel/pull/384
- docs: use note instead of n to mitigate confusion by @felixroos in https://github.com/tidalcycles/strudel/pull/385
- add run + test + docs by @felixroos in https://github.com/tidalcycles/strudel/pull/386
- Rename a to angle by @felixroos in https://github.com/tidalcycles/strudel/pull/387
- document csound by @felixroos in https://github.com/tidalcycles/strudel/pull/391
- Notes are not essential :) by @yaxu in https://github.com/tidalcycles/strudel/pull/393
- add ribbon + test + docs by @felixroos in https://github.com/tidalcycles/strudel/pull/388
- Add tidal-drum-patterns to examples by @urswilke in https://github.com/tidalcycles/strudel/pull/379
- add pattern methods hurry, press and pressBy by @yaxu in https://github.com/tidalcycles/strudel/pull/397
- proper builds + use pnpm workspaces by @felixroos in https://github.com/tidalcycles/strudel/pull/396
- fix: minirepl styles by @felixroos in https://github.com/tidalcycles/strudel/pull/398
- can now await initAudio + initAudioOnFirstClick by @felixroos in https://github.com/tidalcycles/strudel/pull/399
- release webaudio by @felixroos in https://github.com/tidalcycles/strudel/pull/400
## New Contributors
- @jarmitage made their first contribution in https://codeberg.org/uzu/strudel/pulls/320
- @urswilke made their first contribution in https://codeberg.org/uzu/strudel/pulls/364
- @jarmitage made their first contribution in https://github.com/tidalcycles/strudel/pull/320
- @urswilke made their first contribution in https://github.com/tidalcycles/strudel/pull/364
**Full Changelog**: https://codeberg.org/uzu/strudel/compare/v0.5.0...v0.6.0
**Full Changelog**: https://github.com/tidalcycles/strudel/compare/v0.5.0...v0.6.0
@@ -23,66 +23,66 @@ author: froos
## What's Changed
- pin @csound/browser to 6.18.3 + bump by @felixroos in https://codeberg.org/uzu/strudel/pulls/403
- update csound + fix sound output by @felixroos in https://codeberg.org/uzu/strudel/pulls/404
- fix: share url on subpath by @felixroos in https://codeberg.org/uzu/strudel/pulls/405
- add shabda doc by @felixroos in https://codeberg.org/uzu/strudel/pulls/407
- Update effects.mdx by @bwagner in https://codeberg.org/uzu/strudel/pulls/410
- improve effects doc by @felixroos in https://codeberg.org/uzu/strudel/pulls/409
- google gtfo by @felixroos in https://codeberg.org/uzu/strudel/pulls/413
- improve samples doc by @felixroos in https://codeberg.org/uzu/strudel/pulls/411
- PWA with offline support by @felixroos in https://codeberg.org/uzu/strudel/pulls/417
- add caching strategy for missing file types + cache all samples loaded from github by @felixroos in https://codeberg.org/uzu/strudel/pulls/419
- add more offline caching by @felixroos in https://codeberg.org/uzu/strudel/pulls/421
- add cdn.freesound to cache list by @felixroos in https://codeberg.org/uzu/strudel/pulls/425
- minirepl: add keyboard shortcuts by @felixroos in https://codeberg.org/uzu/strudel/pulls/429
- Themes by @felixroos in https://codeberg.org/uzu/strudel/pulls/431
- autocomplete preparations by @felixroos in https://codeberg.org/uzu/strudel/pulls/427
- Fix anchors by @felixroos in https://codeberg.org/uzu/strudel/pulls/433
- Update code.mdx by @bwagner in https://codeberg.org/uzu/strudel/pulls/436
- Update mini-notation.mdx by @bwagner in https://codeberg.org/uzu/strudel/pulls/437
- Update synths.mdx by @bwagner in https://codeberg.org/uzu/strudel/pulls/438
- FIXES: Warning about jsxBracketSameLine deprecation by @bwagner in https://codeberg.org/uzu/strudel/pulls/461
- Composable functions by @yaxu in https://codeberg.org/uzu/strudel/pulls/390
- weave and weaveWith by @yaxu in https://codeberg.org/uzu/strudel/pulls/465
- slice and splice by @yaxu in https://codeberg.org/uzu/strudel/pulls/466
- fix: osc should not return a promise by @felixroos in https://codeberg.org/uzu/strudel/pulls/472
- FIXES: freqs instead of pitches by @bwagner in https://codeberg.org/uzu/strudel/pulls/464
- Update input-output.mdx by @bwagner in https://codeberg.org/uzu/strudel/pulls/471
- settings tab with vim / emacs modes + additional themes and fonts by @felixroos in https://codeberg.org/uzu/strudel/pulls/467
- fix: hash links by @felixroos in https://codeberg.org/uzu/strudel/pulls/473
- midi cc support by @felixroos in https://codeberg.org/uzu/strudel/pulls/478
- Fix array args by @felixroos in https://codeberg.org/uzu/strudel/pulls/480
- docs: packages + offline by @felixroos in https://codeberg.org/uzu/strudel/pulls/482
- Update mini-notation.mdx by @yaxu in https://codeberg.org/uzu/strudel/pulls/365
- Revert "Another attempt at composable functions - WIP (#390)" by @felixroos in https://codeberg.org/uzu/strudel/pulls/484
- fix app height by @felixroos in https://codeberg.org/uzu/strudel/pulls/485
- add algolia creds + optimize sidebar for crawling by @felixroos in https://codeberg.org/uzu/strudel/pulls/488
- refactor react package by @felixroos in https://codeberg.org/uzu/strudel/pulls/490
- react style fixes by @felixroos in https://codeberg.org/uzu/strudel/pulls/491
- implement cps in scheduler by @felixroos in https://codeberg.org/uzu/strudel/pulls/493
- Add control aliases by @yaxu in https://codeberg.org/uzu/strudel/pulls/497
- fix: nano-repl highlighting by @felixroos in https://codeberg.org/uzu/strudel/pulls/501
- Reinstate slice and splice by @yaxu in https://codeberg.org/uzu/strudel/pulls/500
- can now use : as a replacement for space in scales by @felixroos in https://codeberg.org/uzu/strudel/pulls/502
- Support list syntax in mininotation by @yaxu in https://codeberg.org/uzu/strudel/pulls/512
- update react to 18 by @felixroos in https://codeberg.org/uzu/strudel/pulls/514
- add arrange function by @felixroos in https://codeberg.org/uzu/strudel/pulls/508
- Update README.md by @bwagner in https://codeberg.org/uzu/strudel/pulls/474
- add 2 illegible fonts by @felixroos in https://codeberg.org/uzu/strudel/pulls/518
- registerSound API + improved sounds tab + regroup soundfonts by @felixroos in https://codeberg.org/uzu/strudel/pulls/516
- fix: envelopes in chrome by @felixroos in https://codeberg.org/uzu/strudel/pulls/521
- Update samples.mdx by @bwagner in https://codeberg.org/uzu/strudel/pulls/524
- Update intro.mdx by @bwagner in https://codeberg.org/uzu/strudel/pulls/525
- fix(footer): fix link to tidalcycles by @revolunet in https://codeberg.org/uzu/strudel/pulls/529
- FIXES: alias pm for polymeter by @bwagner in https://codeberg.org/uzu/strudel/pulls/527
- Maintain random seed state in parser, not globally by @ijc8 in https://codeberg.org/uzu/strudel/pulls/531
- feat: add freq support to gm soundfonts by @felixroos in https://codeberg.org/uzu/strudel/pulls/534
- Update lerna by @felixroos in https://codeberg.org/uzu/strudel/pulls/535
- pin @csound/browser to 6.18.3 + bump by @felixroos in https://github.com/tidalcycles/strudel/pull/403
- update csound + fix sound output by @felixroos in https://github.com/tidalcycles/strudel/pull/404
- fix: share url on subpath by @felixroos in https://github.com/tidalcycles/strudel/pull/405
- add shabda doc by @felixroos in https://github.com/tidalcycles/strudel/pull/407
- Update effects.mdx by @bwagner in https://github.com/tidalcycles/strudel/pull/410
- improve effects doc by @felixroos in https://github.com/tidalcycles/strudel/pull/409
- google gtfo by @felixroos in https://github.com/tidalcycles/strudel/pull/413
- improve samples doc by @felixroos in https://github.com/tidalcycles/strudel/pull/411
- PWA with offline support by @felixroos in https://github.com/tidalcycles/strudel/pull/417
- add caching strategy for missing file types + cache all samples loaded from github by @felixroos in https://github.com/tidalcycles/strudel/pull/419
- add more offline caching by @felixroos in https://github.com/tidalcycles/strudel/pull/421
- add cdn.freesound to cache list by @felixroos in https://github.com/tidalcycles/strudel/pull/425
- minirepl: add keyboard shortcuts by @felixroos in https://github.com/tidalcycles/strudel/pull/429
- Themes by @felixroos in https://github.com/tidalcycles/strudel/pull/431
- autocomplete preparations by @felixroos in https://github.com/tidalcycles/strudel/pull/427
- Fix anchors by @felixroos in https://github.com/tidalcycles/strudel/pull/433
- Update code.mdx by @bwagner in https://github.com/tidalcycles/strudel/pull/436
- Update mini-notation.mdx by @bwagner in https://github.com/tidalcycles/strudel/pull/437
- Update synths.mdx by @bwagner in https://github.com/tidalcycles/strudel/pull/438
- FIXES: Warning about jsxBracketSameLine deprecation by @bwagner in https://github.com/tidalcycles/strudel/pull/461
- Composable functions by @yaxu in https://github.com/tidalcycles/strudel/pull/390
- weave and weaveWith by @yaxu in https://github.com/tidalcycles/strudel/pull/465
- slice and splice by @yaxu in https://github.com/tidalcycles/strudel/pull/466
- fix: osc should not return a promise by @felixroos in https://github.com/tidalcycles/strudel/pull/472
- FIXES: freqs instead of pitches by @bwagner in https://github.com/tidalcycles/strudel/pull/464
- Update input-output.mdx by @bwagner in https://github.com/tidalcycles/strudel/pull/471
- settings tab with vim / emacs modes + additional themes and fonts by @felixroos in https://github.com/tidalcycles/strudel/pull/467
- fix: hash links by @felixroos in https://github.com/tidalcycles/strudel/pull/473
- midi cc support by @felixroos in https://github.com/tidalcycles/strudel/pull/478
- Fix array args by @felixroos in https://github.com/tidalcycles/strudel/pull/480
- docs: packages + offline by @felixroos in https://github.com/tidalcycles/strudel/pull/482
- Update mini-notation.mdx by @yaxu in https://github.com/tidalcycles/strudel/pull/365
- Revert "Another attempt at composable functions - WIP (#390)" by @felixroos in https://github.com/tidalcycles/strudel/pull/484
- fix app height by @felixroos in https://github.com/tidalcycles/strudel/pull/485
- add algolia creds + optimize sidebar for crawling by @felixroos in https://github.com/tidalcycles/strudel/pull/488
- refactor react package by @felixroos in https://github.com/tidalcycles/strudel/pull/490
- react style fixes by @felixroos in https://github.com/tidalcycles/strudel/pull/491
- implement cps in scheduler by @felixroos in https://github.com/tidalcycles/strudel/pull/493
- Add control aliases by @yaxu in https://github.com/tidalcycles/strudel/pull/497
- fix: nano-repl highlighting by @felixroos in https://github.com/tidalcycles/strudel/pull/501
- Reinstate slice and splice by @yaxu in https://github.com/tidalcycles/strudel/pull/500
- can now use : as a replacement for space in scales by @felixroos in https://github.com/tidalcycles/strudel/pull/502
- Support list syntax in mininotation by @yaxu in https://github.com/tidalcycles/strudel/pull/512
- update react to 18 by @felixroos in https://github.com/tidalcycles/strudel/pull/514
- add arrange function by @felixroos in https://github.com/tidalcycles/strudel/pull/508
- Update README.md by @bwagner in https://github.com/tidalcycles/strudel/pull/474
- add 2 illegible fonts by @felixroos in https://github.com/tidalcycles/strudel/pull/518
- registerSound API + improved sounds tab + regroup soundfonts by @felixroos in https://github.com/tidalcycles/strudel/pull/516
- fix: envelopes in chrome by @felixroos in https://github.com/tidalcycles/strudel/pull/521
- Update samples.mdx by @bwagner in https://github.com/tidalcycles/strudel/pull/524
- Update intro.mdx by @bwagner in https://github.com/tidalcycles/strudel/pull/525
- fix(footer): fix link to tidalcycles by @revolunet in https://github.com/tidalcycles/strudel/pull/529
- FIXES: alias pm for polymeter by @bwagner in https://github.com/tidalcycles/strudel/pull/527
- Maintain random seed state in parser, not globally by @ijc8 in https://github.com/tidalcycles/strudel/pull/531
- feat: add freq support to gm soundfonts by @felixroos in https://github.com/tidalcycles/strudel/pull/534
- Update lerna by @felixroos in https://github.com/tidalcycles/strudel/pull/535
## New Contributors
- @revolunet made their first contribution in https://codeberg.org/uzu/strudel/pulls/529
- @ijc8 made their first contribution in https://codeberg.org/uzu/strudel/pulls/531
- @revolunet made their first contribution in https://github.com/tidalcycles/strudel/pull/529
- @ijc8 made their first contribution in https://github.com/tidalcycles/strudel/pull/531
**Full Changelog**: https://codeberg.org/uzu/strudel/compare/v0.6.0...v0.7.0
**Full Changelog**: https://github.com/tidalcycles/strudel/compare/v0.6.0...v0.7.0

Some files were not shown because too many files have changed in this diff Show More