mirror of
https://github.com/eliasstepanik/strudel-docker.git
synced 2026-01-27 05:28:41 +00:00
Merge branch 'main' into osc
This commit is contained in:
commit
9da114d965
111
CONTRIBUTING.md
Normal file
111
CONTRIBUTING.md
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
# 🌀 Contributing to Strudel 🌀
|
||||||
|
|
||||||
|
Thanks for wanting to contribute!!! There are many ways you can add value to this project
|
||||||
|
|
||||||
|
## 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/)
|
||||||
|
|
||||||
|
## Ask a Question
|
||||||
|
|
||||||
|
If you have any questions about strudel, make sure you've read the
|
||||||
|
[tutorial](https://strudel.tidalcycles.org/tutorial/) to find out if it answers your question.
|
||||||
|
If not, use one of the Communication Channels above!
|
||||||
|
|
||||||
|
Don't be afraid to ask! Your question might be of great value for other people too.
|
||||||
|
|
||||||
|
## Give Feedback
|
||||||
|
|
||||||
|
No matter if you've used the Strudel REPL or if you are using the strudel packages, we are happy to hear some feedback.
|
||||||
|
Use one of the Communication Channels listed above and drop us a line or two!
|
||||||
|
|
||||||
|
## Share Music
|
||||||
|
|
||||||
|
If you made some music with strudel, you can give back some love and share what you've done!
|
||||||
|
Your creation could also be part of the random selection in the REPL if you want.
|
||||||
|
Use one of the Communication Channels listed above.
|
||||||
|
|
||||||
|
## Improve the Tutorial
|
||||||
|
|
||||||
|
If you find some weak spots in the [tutorial](https://strudel.tidalcycles.org/),
|
||||||
|
you are welcome to improve them by editing [this file](https://github.com/tidalcycles/strudel/blob/main/repl/src/tutorial/tutorial.mdx).
|
||||||
|
This will even work without setting up a development environment, only a github account is required.
|
||||||
|
|
||||||
|
## Propose a Feature
|
||||||
|
|
||||||
|
If you want a specific feature that is not part of strudel yet, feel free to use one of the communication channels above.
|
||||||
|
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://github.com/tidalcycles/strudel/issues).
|
||||||
|
Please check that it has not been reported before.
|
||||||
|
|
||||||
|
## Fix a Bug
|
||||||
|
|
||||||
|
To fix a bug that has been reported,
|
||||||
|
|
||||||
|
1. check that nobody else is already fixing it and respond to the issue to let people know you're on it
|
||||||
|
3. fork the repository
|
||||||
|
4. make sure you've setup the project (see below)
|
||||||
|
5. hopefully fix the bug
|
||||||
|
6. make sure the tests pass
|
||||||
|
7. send a pull request
|
||||||
|
|
||||||
|
## Write Tests
|
||||||
|
|
||||||
|
There are still many tests that have not been written yet! Reading and writing tests is a great opportunity to get familiar with the codebase.
|
||||||
|
You can find the tests in each package in the `test` folder. To run all tests, run `npm test` from the root folder.
|
||||||
|
|
||||||
|
## Project Setup
|
||||||
|
|
||||||
|
To get the project up and running for development, make sure you have installed:
|
||||||
|
|
||||||
|
- git
|
||||||
|
- node, preferably v16
|
||||||
|
|
||||||
|
then, do the following:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git clone https://github.com/tidalcycles/strudel.git && cd strudel
|
||||||
|
npm i # install at root to symlink packages
|
||||||
|
npx lerna bootstrap # install all dependencies in packages
|
||||||
|
cd repl && npm i # install repl dependencies
|
||||||
|
npm run start # start repl
|
||||||
|
```
|
||||||
|
|
||||||
|
Those commands might look slightly different for your OS.
|
||||||
|
Please report any problems you've had with the setup instructions!
|
||||||
|
|
||||||
|
## Code Style
|
||||||
|
|
||||||
|
To make sure the code changes only where it should, we are using prettier to unify the code style.
|
||||||
|
If you use VSCode, you can
|
||||||
|
|
||||||
|
1. install [the prettier extension](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)
|
||||||
|
2. open command palette and run "Format Document With..."
|
||||||
|
3. Choose "Configure Default Formatter..."
|
||||||
|
4. Select prettier
|
||||||
|
|
||||||
|
## Package Workflow
|
||||||
|
|
||||||
|
The project is split into multiple [packages](https://github.com/tidalcycles/strudel/tree/main/packages) with independent versioning.
|
||||||
|
When you run `npm i` on the root folder, [npm workspaces](https://docs.npmjs.com/cli/v7/using-npm/workspaces) will symlink all packages
|
||||||
|
in the `node_modules` folder. This will allow any js file to import `@strudel.cycles/<package-name>` to get the local version,
|
||||||
|
which allows developing multiple packages at the same time
|
||||||
|
|
||||||
|
## Package Publishing
|
||||||
|
|
||||||
|
To publish all packages that have been changed since the last release, run:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npx lerna publish
|
||||||
|
```
|
||||||
|
|
||||||
|
## Have Fun
|
||||||
|
|
||||||
|
Remember to have fun, and that this project is driven by the passion of volunteers!
|
||||||
@ -25,7 +25,7 @@ npm run start
|
|||||||
To publish, just run:
|
To publish, just run:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
npx lerna version
|
npx lerna publish
|
||||||
```
|
```
|
||||||
|
|
||||||
This will publish all packages that changed since the last version.
|
This will publish all packages that changed since the last version.
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
- [ ] setcps
|
- [ ] setcps
|
||||||
- [ ] naming patterns? block based evaluation?
|
- [ ] naming patterns? block based evaluation?
|
||||||
- [ ] once
|
- [ ] once
|
||||||
- [ ] silence
|
- [x] silence
|
||||||
- [x] hush
|
- [x] hush
|
||||||
- [ ] panic
|
- [ ] panic
|
||||||
|
|
||||||
@ -30,22 +30,23 @@ https://tidalcycles.org/docs/patternlib/tour/concatenation
|
|||||||
- [ ] overlay => like stack? "The overlay function is similar to cat" => wrong?
|
- [ ] overlay => like stack? "The overlay function is similar to cat" => wrong?
|
||||||
- [ ] `<>` operator (=== overlay)
|
- [ ] `<>` operator (=== overlay)
|
||||||
- [x] stack
|
- [x] stack
|
||||||
- [x] superimpose => strudel supports multiple args => is this layer?
|
- [x] superimpose
|
||||||
- [ ] layer => is this like superimpose but with multiple args?
|
- [x] layer
|
||||||
- [ ] steps ?
|
- [ ] steps ?
|
||||||
- [ ] iter, iter'
|
- [x] iter
|
||||||
|
- [x] iter' = iterBack
|
||||||
|
|
||||||
## Alteration
|
## Alteration
|
||||||
|
|
||||||
- [ ] range, rangex
|
- [ ] range, rangex
|
||||||
- [ ] quantise
|
- [ ] quantise
|
||||||
- [ ] ply
|
- [ ] ply
|
||||||
- [ ] stutter
|
- [x] stutter = echo
|
||||||
- [ ] stripe, slowstripe
|
- [ ] stripe, slowstripe
|
||||||
- [ ] palindrome = every(2, rev)
|
- [ ] palindrome = every(2, rev)
|
||||||
- [ ] trunc
|
- [ ] trunc
|
||||||
- [ ] linger
|
- [ ] linger
|
||||||
- [ ] chunk, chunk'
|
- [x] chunk, chunk'
|
||||||
- [ ] shuffle
|
- [ ] shuffle
|
||||||
- [ ] scramble
|
- [ ] scramble
|
||||||
- [ ] rot
|
- [ ] rot
|
||||||
@ -68,7 +69,8 @@ https://tidalcycles.org/docs/patternlib/tour/concatenation
|
|||||||
- [ ] select, selectF
|
- [ ] select, selectF
|
||||||
- [ ] pickF
|
- [ ] pickF
|
||||||
- [ ] squeeze
|
- [ ] squeeze
|
||||||
- [ ] euclid, euclidInv, euclidFull
|
- [x] euclid, euclidLegato
|
||||||
|
- [ ] euclidInv, euclidFull
|
||||||
- [ ] ifp
|
- [ ] ifp
|
||||||
|
|
||||||
## Time
|
## Time
|
||||||
@ -83,7 +85,8 @@ https://tidalcycles.org/docs/patternlib/tour/concatenation
|
|||||||
- [x] off
|
- [x] off
|
||||||
- [ ] rotL / rotR
|
- [ ] rotL / rotR
|
||||||
- [x] rev
|
- [x] rev
|
||||||
- [ ] jux / juxBy
|
- [x] jux
|
||||||
|
- [ ] juxBy
|
||||||
- [ ] swingBy / swing
|
- [ ] swingBy / swing
|
||||||
- [ ] ghost
|
- [ ] ghost
|
||||||
- [ ] inside / outside
|
- [ ] inside / outside
|
||||||
@ -114,7 +117,7 @@ https://tidalcycles.org/docs/patternlib/tour/concatenation
|
|||||||
- [ ] chop
|
- [ ] chop
|
||||||
- [ ] striate / striateBy
|
- [ ] striate / striateBy
|
||||||
- [ ] loopAt
|
- [ ] loopAt
|
||||||
- [ ] segment
|
- [x] segment
|
||||||
- [ ] discretise
|
- [ ] discretise
|
||||||
|
|
||||||
## Randomness
|
## Randomness
|
||||||
|
|||||||
2
packages/core/package-lock.json
generated
2
packages/core/package-lock.json
generated
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel.cycles/core",
|
"name": "@strudel.cycles/core",
|
||||||
"version": "0.0.2",
|
"version": "0.0.3",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel.cycles/core",
|
"name": "@strudel.cycles/core",
|
||||||
"version": "0.0.2",
|
"version": "0.0.3",
|
||||||
"description": "Port of Tidal Cycles to JavaScript",
|
"description": "Port of Tidal Cycles to JavaScript",
|
||||||
"main": "strudel.mjs",
|
"main": "strudel.mjs",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|||||||
@ -780,7 +780,7 @@ class Pattern {
|
|||||||
|
|
||||||
// known as iter' in tidalcycles
|
// known as iter' in tidalcycles
|
||||||
iterBack(times) {
|
iterBack(times) {
|
||||||
return this.iter(times, true)
|
return this.iter(times, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
_chunk(n, func, back = false) {
|
_chunk(n, func, back = false) {
|
||||||
@ -791,7 +791,7 @@ class Pattern {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_chunkBack(n, func) {
|
_chunkBack(n, func) {
|
||||||
return this._chunk(n, func, true)
|
return this._chunk(n, func, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
edit(...funcs) {
|
edit(...funcs) {
|
||||||
|
|||||||
2
packages/eval/package-lock.json
generated
2
packages/eval/package-lock.json
generated
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel.cycles/eval",
|
"name": "@strudel.cycles/eval",
|
||||||
"version": "0.0.2",
|
"version": "0.0.3",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel.cycles/eval",
|
"name": "@strudel.cycles/eval",
|
||||||
"version": "0.0.2",
|
"version": "0.0.3",
|
||||||
"description": "Code evaluator for strudel",
|
"description": "Code evaluator for strudel",
|
||||||
"main": "evaluate.mjs",
|
"main": "evaluate.mjs",
|
||||||
"directories": {
|
"directories": {
|
||||||
@ -28,7 +28,7 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/tidalcycles/strudel#readme",
|
"homepage": "https://github.com/tidalcycles/strudel#readme",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@strudel.cycles/core": "^0.0.2",
|
"@strudel.cycles/core": "^0.0.3",
|
||||||
"estraverse": "^5.3.0",
|
"estraverse": "^5.3.0",
|
||||||
"shift-ast": "^6.1.0",
|
"shift-ast": "^6.1.0",
|
||||||
"shift-codegen": "^7.0.3",
|
"shift-codegen": "^7.0.3",
|
||||||
|
|||||||
2
packages/midi/package-lock.json
generated
2
packages/midi/package-lock.json
generated
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel.cycles/midi",
|
"name": "@strudel.cycles/midi",
|
||||||
"version": "0.0.3",
|
"version": "0.0.4",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel.cycles/midi",
|
"name": "@strudel.cycles/midi",
|
||||||
"version": "0.0.3",
|
"version": "0.0.4",
|
||||||
"description": "Midi API for strudel",
|
"description": "Midi API for strudel",
|
||||||
"main": "midi.mjs",
|
"main": "midi.mjs",
|
||||||
"repository": {
|
"repository": {
|
||||||
@ -21,7 +21,7 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/tidalcycles/strudel#readme",
|
"homepage": "https://github.com/tidalcycles/strudel#readme",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@strudel.cycles/tone": "^0.0.3",
|
"@strudel.cycles/tone": "^0.0.4",
|
||||||
"tone": "^14.7.77",
|
"tone": "^14.7.77",
|
||||||
"webmidi": "^2.5.2"
|
"webmidi": "^2.5.2"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel.cycles/mini",
|
"name": "@strudel.cycles/mini",
|
||||||
"version": "0.0.3",
|
"version": "0.0.4",
|
||||||
"description": "Mini notation for strudel",
|
"description": "Mini notation for strudel",
|
||||||
"main": "mini.mjs",
|
"main": "mini.mjs",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
@ -25,7 +25,7 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/tidalcycles/strudel#readme",
|
"homepage": "https://github.com/tidalcycles/strudel#readme",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@strudel.cycles/eval": "^0.0.2",
|
"@strudel.cycles/eval": "^0.0.3",
|
||||||
"@strudel.cycles/tone": "^0.0.3"
|
"@strudel.cycles/tone": "^0.0.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
2
packages/tonal/package-lock.json
generated
2
packages/tonal/package-lock.json
generated
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel.cycles/tonal",
|
"name": "@strudel.cycles/tonal",
|
||||||
"version": "0.0.2",
|
"version": "0.0.3",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel.cycles/tonal",
|
"name": "@strudel.cycles/tonal",
|
||||||
"version": "0.0.2",
|
"version": "0.0.3",
|
||||||
"description": "Tonal functions for strudel",
|
"description": "Tonal functions for strudel",
|
||||||
"main": "tonal.mjs",
|
"main": "tonal.mjs",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
@ -25,7 +25,7 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/tidalcycles/strudel#readme",
|
"homepage": "https://github.com/tidalcycles/strudel#readme",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@strudel.cycles/core": "^0.0.2",
|
"@strudel.cycles/core": "^0.0.3",
|
||||||
"@tonaljs/tonal": "^4.6.5",
|
"@tonaljs/tonal": "^4.6.5",
|
||||||
"webmidi": "^3.0.15"
|
"webmidi": "^3.0.15"
|
||||||
}
|
}
|
||||||
|
|||||||
2
packages/tone/package-lock.json
generated
2
packages/tone/package-lock.json
generated
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel.cycles/tone",
|
"name": "@strudel.cycles/tone",
|
||||||
"version": "0.0.3",
|
"version": "0.0.4",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel.cycles/tone",
|
"name": "@strudel.cycles/tone",
|
||||||
"version": "0.0.3",
|
"version": "0.0.4",
|
||||||
"description": "Tone.js API for strudel",
|
"description": "Tone.js API for strudel",
|
||||||
"main": "tone.mjs",
|
"main": "tone.mjs",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
@ -22,7 +22,7 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/tidalcycles/strudel#readme",
|
"homepage": "https://github.com/tidalcycles/strudel#readme",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@strudel.cycles/core": "^0.0.2",
|
"@strudel.cycles/core": "^0.0.3",
|
||||||
"@tonejs/piano": "^0.2.1",
|
"@tonejs/piano": "^0.2.1",
|
||||||
"chord-voicings": "^0.0.1",
|
"chord-voicings": "^0.0.1",
|
||||||
"tone": "^14.7.77"
|
"tone": "^14.7.77"
|
||||||
|
|||||||
@ -30,13 +30,16 @@ import { getPlayableNoteValue } from '@strudel.cycles/core/util.mjs';
|
|||||||
|
|
||||||
// "balanced" | "interactive" | "playback";
|
// "balanced" | "interactive" | "playback";
|
||||||
// Tone.setContext(new Tone.Context({ latencyHint: 'playback', lookAhead: 1 }));
|
// Tone.setContext(new Tone.Context({ latencyHint: 'playback', lookAhead: 1 }));
|
||||||
export const defaultSynth = new PolySynth().chain(new Gain(0.5), getDestination());
|
export const getDefaultSynth = () => {
|
||||||
defaultSynth.set({
|
const s = new PolySynth().chain(new Gain(0.5), getDestination());
|
||||||
oscillator: { type: 'triangle' },
|
s.set({
|
||||||
envelope: {
|
oscillator: { type: 'triangle' },
|
||||||
release: 0.01,
|
envelope: {
|
||||||
},
|
release: 0.01,
|
||||||
});
|
},
|
||||||
|
});
|
||||||
|
return s;
|
||||||
|
};
|
||||||
|
|
||||||
// what about
|
// what about
|
||||||
// https://www.charlie-roberts.com/gibberish/playground/
|
// https://www.charlie-roberts.com/gibberish/playground/
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@strudel.cycles/xen",
|
"name": "@strudel.cycles/xen",
|
||||||
"version": "0.0.2",
|
"version": "0.0.3",
|
||||||
"description": "Xenharmonic API for strudel",
|
"description": "Xenharmonic API for strudel",
|
||||||
"main": "xen.mjs",
|
"main": "xen.mjs",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@ -24,6 +24,6 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/tidalcycles/strudel#readme",
|
"homepage": "https://github.com/tidalcycles/strudel#readme",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@strudel.cycles/core": "^0.0.2"
|
"@strudel.cycles/core": "^0.0.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,7 +3,7 @@ import CodeMirror, { markEvent, markParens } from './CodeMirror';
|
|||||||
import cx from './cx';
|
import cx from './cx';
|
||||||
import logo from './logo.svg';
|
import logo from './logo.svg';
|
||||||
import playStatic from './static.mjs';
|
import playStatic from './static.mjs';
|
||||||
import { defaultSynth } from '@strudel.cycles/tone';
|
import { getDefaultSynth } from '@strudel.cycles/tone';
|
||||||
import * as tunes from './tunes.mjs';
|
import * as tunes from './tunes.mjs';
|
||||||
import useRepl from './useRepl.mjs';
|
import useRepl from './useRepl.mjs';
|
||||||
import { useWebMidi } from './useWebMidi';
|
import { useWebMidi } from './useWebMidi';
|
||||||
@ -54,6 +54,7 @@ function getRandomTune() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const randomTune = getRandomTune();
|
const randomTune = getRandomTune();
|
||||||
|
const defaultSynth = getDefaultSynth();
|
||||||
|
|
||||||
function App() {
|
function App() {
|
||||||
const [editor, setEditor] = useState();
|
const [editor, setEditor] = useState();
|
||||||
|
|||||||
@ -2,7 +2,9 @@ import { Tone } from '@strudel.cycles/tone';
|
|||||||
import { State, TimeSpan } from '@strudel.cycles/core';
|
import { State, TimeSpan } from '@strudel.cycles/core';
|
||||||
import { getPlayableNoteValue } from '@strudel.cycles/core/util.mjs';
|
import { getPlayableNoteValue } from '@strudel.cycles/core/util.mjs';
|
||||||
import { evaluate } from '@strudel.cycles/eval';
|
import { evaluate } from '@strudel.cycles/eval';
|
||||||
import { defaultSynth } from '@strudel.cycles/tone';
|
import { getDefaultSynth } from '@strudel.cycles/tone';
|
||||||
|
|
||||||
|
const defaultSynth = getDefaultSynth();
|
||||||
|
|
||||||
// this is a test to play back events with as less runtime code as possible..
|
// this is a test to play back events with as less runtime code as possible..
|
||||||
// the code asks for the number of seconds to prequery
|
// the code asks for the number of seconds to prequery
|
||||||
|
|||||||
@ -99,7 +99,7 @@ You can also press "play" on the next player without needing to stop the last on
|
|||||||
|
|
||||||
## Sequences
|
## Sequences
|
||||||
|
|
||||||
We can play more notes by seperating them with spaces:
|
We can play more notes by separating them with spaces:
|
||||||
|
|
||||||
<MiniRepl tune={`"e5 b4 d5 c5"`} />
|
<MiniRepl tune={`"e5 b4 d5 c5"`} />
|
||||||
|
|
||||||
@ -640,7 +640,7 @@ Patternified autofilter:
|
|||||||
|
|
||||||
<MiniRepl
|
<MiniRepl
|
||||||
tune={`"c2 c3"
|
tune={`"c2 c3"
|
||||||
.synth('sawtooth16').autofilter("<1 4 8>"")`}
|
.synth('sawtooth16').autofilter("<1 4 8>")`}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
## Tonal API
|
## Tonal API
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user