mirror of
https://github.com/eliasstepanik/strudel-docker.git
synced 2026-01-26 13:08:28 +00:00
Merge branch 'main' into reset
This commit is contained in:
commit
cbe9c9248d
@ -27,8 +27,10 @@ There are multiple npm packages you can use to use strudel, or only parts of it,
|
|||||||
- [`tone`](./packages/tone): bindings for Tone.js instruments and effects
|
- [`tone`](./packages/tone): bindings for Tone.js instruments and effects
|
||||||
- [`osc`](./packages/osc): bindings to communicate via OSC
|
- [`osc`](./packages/osc): bindings to communicate via OSC
|
||||||
- [`midi`](./packages/midi): webmidi bindings
|
- [`midi`](./packages/midi): webmidi bindings
|
||||||
|
- [`serial`](./packages/serial): webserial bindings
|
||||||
- [`tonal`](./packages/tonal): tonal functions
|
- [`tonal`](./packages/tonal): tonal functions
|
||||||
- [`xen`](./packages/xen): microtonal / xenharmonic functions
|
- [`xen`](./packages/xen): microtonal / xenharmonic functions
|
||||||
|
- ... [and there are more](./packages/)
|
||||||
|
|
||||||
Click on the package names to find out more about each one.
|
Click on the package names to find out more about each one.
|
||||||
|
|
||||||
|
|||||||
@ -3,7 +3,6 @@
|
|||||||
"version": "0.0.1",
|
"version": "0.0.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Port of tidalcycles to javascript",
|
"description": "Port of tidalcycles to javascript",
|
||||||
"main": "strudel.mjs",
|
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "npm run test --workspaces --if-present && cd repl && npm run test",
|
"test": "npm run test --workspaces --if-present && cd repl && npm run test",
|
||||||
"bootstrap": "lerna bootstrap",
|
"bootstrap": "lerna bootstrap",
|
||||||
@ -27,7 +26,7 @@
|
|||||||
"algorave"
|
"algorave"
|
||||||
],
|
],
|
||||||
"author": "Alex McLean <alex@slab.org> (https://slab.org)",
|
"author": "Alex McLean <alex@slab.org> (https://slab.org)",
|
||||||
"license": "GPL-3.0-or-later",
|
"license": "AGPL-3.0-or-later",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/tidalcycles/strudel/issues"
|
"url": "https://github.com/tidalcycles/strudel/issues"
|
||||||
},
|
},
|
||||||
|
|||||||
@ -81,7 +81,7 @@ export class Hap {
|
|||||||
'(' + (this.whole == undefined ? '~' : this.whole.show()) + ', ' + this.part.show() + ', ' + this.value + ')'
|
'(' + (this.whole == undefined ? '~' : this.whole.show()) + ', ' + this.part.show() + ', ' + this.value + ')'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
showWhole() {
|
showWhole() {
|
||||||
return `${this.whole == undefined ? '~' : this.whole.show()}: ${this.value}`;
|
return `${this.whole == undefined ? '~' : this.whole.show()}: ${this.value}`;
|
||||||
}
|
}
|
||||||
@ -100,4 +100,4 @@ export class Hap {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default Hap;
|
export default Hap;
|
||||||
|
|||||||
@ -7,7 +7,7 @@ This program is free software: you can redistribute it and/or modify it under th
|
|||||||
export * from './controls.mjs';
|
export * from './controls.mjs';
|
||||||
export * from './euclid.mjs';
|
export * from './euclid.mjs';
|
||||||
import Fraction from './fraction.mjs';
|
import Fraction from './fraction.mjs';
|
||||||
export {Fraction};
|
export { Fraction };
|
||||||
export * from './hap.mjs';
|
export * from './hap.mjs';
|
||||||
export * from './pattern.mjs';
|
export * from './pattern.mjs';
|
||||||
export * from './signal.mjs';
|
export * from './signal.mjs';
|
||||||
|
|||||||
@ -19,7 +19,7 @@
|
|||||||
"algorave"
|
"algorave"
|
||||||
],
|
],
|
||||||
"author": "Alex McLean <alex@slab.org> (https://slab.org)",
|
"author": "Alex McLean <alex@slab.org> (https://slab.org)",
|
||||||
"license": "GPL-3.0-or-later",
|
"license": "AGPL-3.0-or-later",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/tidalcycles/strudel/issues"
|
"url": "https://github.com/tidalcycles/strudel/issues"
|
||||||
},
|
},
|
||||||
|
|||||||
@ -80,7 +80,10 @@ export const chooseWith = (pat, xs) => {
|
|||||||
if (xs.length == 0) {
|
if (xs.length == 0) {
|
||||||
return silence;
|
return silence;
|
||||||
}
|
}
|
||||||
return pat.range(0, xs.length).fmap((i) => xs[Math.floor(i)]).outerJoin();
|
return pat
|
||||||
|
.range(0, xs.length)
|
||||||
|
.fmap((i) => xs[Math.floor(i)])
|
||||||
|
.outerJoin();
|
||||||
};
|
};
|
||||||
|
|
||||||
export const choose = (...xs) => chooseWith(rand, xs);
|
export const choose = (...xs) => chooseWith(rand, xs);
|
||||||
@ -94,14 +97,14 @@ const _wchooseWith = function (pat, ...pairs) {
|
|||||||
weights.push(accum);
|
weights.push(accum);
|
||||||
}
|
}
|
||||||
const total = accum;
|
const total = accum;
|
||||||
const match = function(r) {
|
const match = function (r) {
|
||||||
const find = r * total;
|
const find = r * total;
|
||||||
return values[weights.findIndex((x) => x > find, weights)];
|
return values[weights.findIndex((x) => x > find, weights)];
|
||||||
};
|
};
|
||||||
return pat.fmap(match);
|
return pat.fmap(match);
|
||||||
};
|
};
|
||||||
|
|
||||||
const wchooseWith = (...args) => _wchooseWith(...args).outerJoin()
|
const wchooseWith = (...args) => _wchooseWith(...args).outerJoin();
|
||||||
|
|
||||||
export const wchoose = (...pairs) => wchooseWith(rand, ...pairs);
|
export const wchoose = (...pairs) => wchooseWith(rand, ...pairs);
|
||||||
|
|
||||||
|
|||||||
@ -33,7 +33,7 @@ export const fromMidi = (n) => {
|
|||||||
|
|
||||||
// modulo that works with negative numbers e.g. mod(-1, 3) = 2
|
// modulo that works with negative numbers e.g. mod(-1, 3) = 2
|
||||||
// const mod = (n: number, m: number): number => (n < 0 ? mod(n + m, m) : n % m);
|
// const mod = (n: number, m: number): number => (n < 0 ? mod(n + m, m) : n % m);
|
||||||
export const mod = (n, m) => (n % m + m) % m;
|
export const mod = (n, m) => ((n % m) + m) % m;
|
||||||
|
|
||||||
export const getPlayableNoteValue = (event) => {
|
export const getPlayableNoteValue = (event) => {
|
||||||
let { value: note, context } = event;
|
let { value: note, context } = event;
|
||||||
|
|||||||
27
packages/embed/README.md
Normal file
27
packages/embed/README.md
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
# @strudel.cycles/embed
|
||||||
|
|
||||||
|
This package contains a embeddable web component for the Strudel REPL.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Either install with `npm i @strudel.cycles/embed` or just use a cdn to import the script:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<script src="https://unpkg.com/@strudel.cycles/embed@latest"></script>
|
||||||
|
<strudel-repl>
|
||||||
|
<!--
|
||||||
|
"a4 [a3 c3] a3 c3".color('#F9D649')
|
||||||
|
.sub("<7 12 5 12>".slow(2))
|
||||||
|
.off(1/4,x=>x.add(7).color("#FFFFFF #0C3AA1 #C63928"))
|
||||||
|
.off(1/8,x=>x.add(12).color('#215CB6'))
|
||||||
|
.slow(2)
|
||||||
|
.legato(sine.range(0.3, 2).slow(28))
|
||||||
|
.wave("sawtooth square".fast(2))
|
||||||
|
.filter('lowpass', cosine.range(500,4000).slow(16))
|
||||||
|
.out()
|
||||||
|
.pianoroll({minMidi:20,maxMidi:120,background:'#202124'})
|
||||||
|
-->
|
||||||
|
</strudel-repl>
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that the Code is placed inside HTML comments to prevent the browser from treating it as HTML.
|
||||||
17
packages/embed/embed.js
Normal file
17
packages/embed/embed.js
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
class Strudel extends HTMLElement {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
connectedCallback() {
|
||||||
|
setTimeout(() => {
|
||||||
|
const code = (this.innerHTML + '').replace('<!--', '').replace('-->', '').trim();
|
||||||
|
const iframe = document.createElement('iframe');
|
||||||
|
const src = `https://strudel.tidalcycles.org/#${encodeURIComponent(btoa(code))}`;
|
||||||
|
iframe.setAttribute('src', src);
|
||||||
|
iframe.setAttribute('width', '600');
|
||||||
|
iframe.setAttribute('height', '400');
|
||||||
|
this.appendChild(iframe);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
customElements.define('strudel-repl', Strudel);
|
||||||
15
packages/embed/example.html
Normal file
15
packages/embed/example.html
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<script src="https://unpkg.com/@strudel.cycles/embed@latest"></script>
|
||||||
|
<strudel-repl>
|
||||||
|
<!--
|
||||||
|
"a4 [a3 c3] a3 c3".color('#F9D649')
|
||||||
|
.sub("<7 12 5 12>".slow(2))
|
||||||
|
.off(1/4,x=>x.add(7).color("#FFFFFF #0C3AA1 #C63928"))
|
||||||
|
.off(1/8,x=>x.add(12).color('#215CB6'))
|
||||||
|
.slow(2)
|
||||||
|
.legato(sine.range(0.3, 2).slow(28))
|
||||||
|
.wave("sawtooth square".fast(2))
|
||||||
|
.filter('lowpass', cosine.range(500,4000).slow(16))
|
||||||
|
.out()
|
||||||
|
.pianoroll({minMidi:20,maxMidi:120,background:'#202124'})
|
||||||
|
-->
|
||||||
|
</strudel-repl>
|
||||||
25
packages/embed/package.json
Normal file
25
packages/embed/package.json
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"name": "@strudel.cycles/embed",
|
||||||
|
"version": "0.0.2",
|
||||||
|
"description": "Embeddable Web Component to load a Strudel REPL into an iframe",
|
||||||
|
"main": "embed.js",
|
||||||
|
"type": "module",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/tidalcycles/strudel.git"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"tidalcycles",
|
||||||
|
"strudel",
|
||||||
|
"pattern",
|
||||||
|
"livecoding",
|
||||||
|
"algorave"
|
||||||
|
],
|
||||||
|
"author": "Felix Roos <flix91@gmail.com>",
|
||||||
|
"license": "AGPL-3.0-or-later",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/tidalcycles/strudel/issues"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/tidalcycles/strudel#readme",
|
||||||
|
"dependencies": {}
|
||||||
|
}
|
||||||
@ -22,7 +22,7 @@
|
|||||||
"algorave"
|
"algorave"
|
||||||
],
|
],
|
||||||
"author": "Felix Roos <flix91@gmail.com>",
|
"author": "Felix Roos <flix91@gmail.com>",
|
||||||
"license": "GPL-3.0-or-later",
|
"license": "AGPL-3.0-or-later",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/tidalcycles/strudel/issues"
|
"url": "https://github.com/tidalcycles/strudel/issues"
|
||||||
},
|
},
|
||||||
|
|||||||
@ -15,7 +15,7 @@
|
|||||||
"algorave"
|
"algorave"
|
||||||
],
|
],
|
||||||
"author": "Felix Roos <flix91@gmail.com>",
|
"author": "Felix Roos <flix91@gmail.com>",
|
||||||
"license": "GPL-3.0-or-later",
|
"license": "AGPL-3.0-or-later",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/tidalcycles/strudel/issues"
|
"url": "https://github.com/tidalcycles/strudel/issues"
|
||||||
},
|
},
|
||||||
|
|||||||
@ -19,7 +19,7 @@
|
|||||||
"algorave"
|
"algorave"
|
||||||
],
|
],
|
||||||
"author": "Felix Roos <flix91@gmail.com>",
|
"author": "Felix Roos <flix91@gmail.com>",
|
||||||
"license": "GPL-3.0-or-later",
|
"license": "AGPL-3.0-or-later",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/tidalcycles/strudel/issues"
|
"url": "https://github.com/tidalcycles/strudel/issues"
|
||||||
},
|
},
|
||||||
|
|||||||
@ -22,7 +22,7 @@
|
|||||||
],
|
],
|
||||||
"author": "Felix Roos <flix91@gmail.com>",
|
"author": "Felix Roos <flix91@gmail.com>",
|
||||||
"contributors": ["Alex McLean <alex@slab.org>"],
|
"contributors": ["Alex McLean <alex@slab.org>"],
|
||||||
"license": "GPL-3.0-or-later",
|
"license": "AGPL-3.0-or-later",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/tidalcycles/strudel/issues"
|
"url": "https://github.com/tidalcycles/strudel/issues"
|
||||||
},
|
},
|
||||||
|
|||||||
@ -15,7 +15,7 @@
|
|||||||
"algorave"
|
"algorave"
|
||||||
],
|
],
|
||||||
"author": "Alex McLean <alex@slab.org>",
|
"author": "Alex McLean <alex@slab.org>",
|
||||||
"license": "GPL-3.0-or-later",
|
"license": "AGPL-3.0-or-later",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/tidalcycles/strudel/issues"
|
"url": "https://github.com/tidalcycles/strudel/issues"
|
||||||
},
|
},
|
||||||
|
|||||||
@ -19,7 +19,7 @@
|
|||||||
"algorave"
|
"algorave"
|
||||||
],
|
],
|
||||||
"author": "Felix Roos <flix91@gmail.com>",
|
"author": "Felix Roos <flix91@gmail.com>",
|
||||||
"license": "GPL-3.0-or-later",
|
"license": "AGPL-3.0-or-later",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/tidalcycles/strudel/issues"
|
"url": "https://github.com/tidalcycles/strudel/issues"
|
||||||
},
|
},
|
||||||
|
|||||||
@ -16,7 +16,7 @@
|
|||||||
"algorave"
|
"algorave"
|
||||||
],
|
],
|
||||||
"author": "Felix Roos <flix91@gmail.com>",
|
"author": "Felix Roos <flix91@gmail.com>",
|
||||||
"license": "GPL-3.0-or-later",
|
"license": "AGPL-3.0-or-later",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/tidalcycles/strudel/issues"
|
"url": "https://github.com/tidalcycles/strudel/issues"
|
||||||
},
|
},
|
||||||
|
|||||||
@ -21,7 +21,7 @@
|
|||||||
"algorave"
|
"algorave"
|
||||||
],
|
],
|
||||||
"author": "Felix Roos <flix91@gmail.com>",
|
"author": "Felix Roos <flix91@gmail.com>",
|
||||||
"license": "GPL-3.0-or-later",
|
"license": "AGPL-3.0-or-later",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/tidalcycles/strudel/issues"
|
"url": "https://github.com/tidalcycles/strudel/issues"
|
||||||
},
|
},
|
||||||
|
|||||||
@ -18,7 +18,7 @@
|
|||||||
"algorave"
|
"algorave"
|
||||||
],
|
],
|
||||||
"author": "Felix Roos <flix91@gmail.com>",
|
"author": "Felix Roos <flix91@gmail.com>",
|
||||||
"license": "GPL-3.0-or-later",
|
"license": "AGPL-3.0-or-later",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/tidalcycles/strudel/issues"
|
"url": "https://github.com/tidalcycles/strudel/issues"
|
||||||
},
|
},
|
||||||
|
|||||||
@ -3,6 +3,7 @@
|
|||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"homepage": "https://strudel.tidalcycles.org",
|
"homepage": "https://strudel.tidalcycles.org",
|
||||||
|
"license": "AGPL-3.0-or-later",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@codemirror/lang-javascript": "^0.19.0",
|
"@codemirror/lang-javascript": "^0.19.0",
|
||||||
"@testing-library/jest-dom": "^5.16.3",
|
"@testing-library/jest-dom": "^5.16.3",
|
||||||
|
|||||||
@ -170,4 +170,16 @@ export const testCycles = {
|
|||||||
jemblung: 12,
|
jemblung: 12,
|
||||||
risingEnemy: 12,
|
risingEnemy: 12,
|
||||||
festivalOfFingers: 16,
|
festivalOfFingers: 16,
|
||||||
|
festivalOfFingers2: 22,
|
||||||
|
undergroundPlumber: 20,
|
||||||
|
bridgeIsOver: 16,
|
||||||
|
goodTimes: 16,
|
||||||
|
echoPiano: 8,
|
||||||
|
sml1: 48,
|
||||||
|
speakerman: 48,
|
||||||
|
randomBells: 24,
|
||||||
|
waa: 16,
|
||||||
|
waar: 16,
|
||||||
|
hyperpop: 60,
|
||||||
|
festivalOfFingers3: 16,
|
||||||
};
|
};
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
Loading…
x
Reference in New Issue
Block a user