mirror of
https://github.com/eliasstepanik/strudel-docker.git
synced 2026-01-11 05:38:34 +00:00
update core examples
This commit is contained in:
parent
c032f6dde1
commit
0aa2f72a3a
@ -33,6 +33,7 @@ b: 3/2 - 7/4
|
|||||||
c: 7/4 - 2
|
c: 7/4 - 2
|
||||||
```
|
```
|
||||||
|
|
||||||
- [play with @strudel.cycles/core on codesandbox](https://codesandbox.io/s/strudel-core-test-qmz6qr?file=/src/index.js).
|
- [play with @strudel.cycles/core on codesandbox](https://codesandbox.io/s/strudel-core-test-forked-9ywhv7?file=/src/index.js).
|
||||||
- [open color pattern example](https://raw.githack.com/tidalcycles/strudel/package-examples/packages/core/examples/canvas.html)
|
- [open color pattern example](https://raw.githack.com/tidalcycles/strudel/main/packages/core/examples/canvas.html)
|
||||||
- [open minimal repl example](https://raw.githack.com/tidalcycles/strudel/package-examples/packages/core/examples/metro.html)
|
- [open minimal repl example](https://raw.githack.com/tidalcycles/strudel/main/packages/core/examples/vanilla.html)
|
||||||
|
- [open minimal vite example](./examples/vite-vanilla-repl/)
|
||||||
@ -1,13 +1,13 @@
|
|||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
id="text"
|
id="text"
|
||||||
value="cat('a', 'b')"
|
value="seq('a', ['b', 'c'])"
|
||||||
style="width: 100%; font-size: 2em; outline: none; margin-bottom: 10px"
|
style="width: 100%; font-size: 2em; outline: none; margin-bottom: 10px"
|
||||||
spellcheck="false"
|
spellcheck="false"
|
||||||
/>
|
/>
|
||||||
<div id="output"></div>
|
<div id="output"></div>
|
||||||
<script type="module">
|
<script type="module">
|
||||||
const strudel = await import('https://cdn.skypack.dev/@strudel.cycles/core@0.0.2');
|
const strudel = await import('https://cdn.skypack.dev/@strudel.cycles/core@0.6.8');
|
||||||
Object.assign(window, strudel); // assign all strudel functions to global scope to use with eval
|
Object.assign(window, strudel); // assign all strudel functions to global scope to use with eval
|
||||||
const input = document.getElementById('text');
|
const input = document.getElementById('text');
|
||||||
const getEvents = () => {
|
const getEvents = () => {
|
||||||
|
|||||||
@ -2,13 +2,13 @@
|
|||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
id="text"
|
id="text"
|
||||||
value="cat('orange', 'indigo')"
|
value="seq('tomato', 'indigo', ['white', 'steelblue']).fast(4)"
|
||||||
style="width: 100%; font-size: 2em; background: black; color: white; outline: none; position: absolute; top: 0"
|
style="width: 100%; font-size: 2em; background: black; color: white; outline: none; position: absolute; top: 0"
|
||||||
spellcheck="false"
|
spellcheck="false"
|
||||||
/>
|
/>
|
||||||
<canvas id="canvas"></canvas>
|
<canvas id="canvas"></canvas>
|
||||||
<script type="module">
|
<script type="module">
|
||||||
const strudel = await import('https://cdn.skypack.dev/@strudel.cycles/core@0.0.2');
|
const strudel = await import('https://cdn.skypack.dev/@strudel.cycles/core@0.6.8');
|
||||||
// this adds all strudel functions to the global scope, to be used by eval
|
// this adds all strudel functions to the global scope, to be used by eval
|
||||||
Object.assign(window, strudel);
|
Object.assign(window, strudel);
|
||||||
// setup elements
|
// setup elements
|
||||||
|
|||||||
@ -1,90 +0,0 @@
|
|||||||
<div style="position: absolute; bottom: 0; right: 0; padding: 4px; width: 100vw; display: flex">
|
|
||||||
<button id="start" style="font-size: 2em">start</button>
|
|
||||||
<button id="stop" style="font-size: 2em">stop</button>
|
|
||||||
<button id="slower" style="font-size: 2em">slower</button>
|
|
||||||
<button id="faster" style="font-size: 2em">faster</button>
|
|
||||||
</div>
|
|
||||||
<textarea
|
|
||||||
style="font-size: 2em; background: #052b49; color: #fff; height: 100%; width: 100%; outline: none; border: 0"
|
|
||||||
id="text"
|
|
||||||
spellcheck="false"
|
|
||||||
>
|
|
||||||
Loading...</textarea
|
|
||||||
>
|
|
||||||
<script type="module">
|
|
||||||
document.body.style = 'margin: 0';
|
|
||||||
import * as strudel from '@strudel.cycles/core';
|
|
||||||
|
|
||||||
const { cat, State, TimeSpan, Scheduler, getPlayableNoteValue, getFreq } = strudel;
|
|
||||||
Object.assign(window, strudel); // add strudel to eval scope
|
|
||||||
|
|
||||||
const ctx = new AudioContext();
|
|
||||||
const scheduler = new Scheduler({
|
|
||||||
// audioContext: getAudioContext(),
|
|
||||||
interval: 0.1,
|
|
||||||
onTrigger: (hap, time, duration) => {
|
|
||||||
const freq = getFrequency(hap);
|
|
||||||
const osc = ctx.createOscillator();
|
|
||||||
const gain = 0.2;
|
|
||||||
osc.frequency.value = freq;
|
|
||||||
osc.type = 'triangle';
|
|
||||||
const onset = ctx.currentTime + time;
|
|
||||||
const offset = onset + duration;
|
|
||||||
const attack = 0.05;
|
|
||||||
const release = 0.05;
|
|
||||||
osc.start(onset);
|
|
||||||
osc.stop(offset + release);
|
|
||||||
|
|
||||||
const g = ctx.createGain();
|
|
||||||
g.gain.setValueAtTime(gain, onset);
|
|
||||||
g.gain.linearRampToValueAtTime(gain, onset + attack);
|
|
||||||
g.gain.setValueAtTime(gain, offset - release);
|
|
||||||
g.gain.linearRampToValueAtTime(0, offset);
|
|
||||||
osc.connect(g);
|
|
||||||
g.connect(ctx.destination);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
let initialCode = `stack('c4','e4',cat('g4','a4','b4','a4'))
|
|
||||||
.add(cat(0,1,2,3,4,3,2,1).slow(8))
|
|
||||||
.fast(2)
|
|
||||||
.cps(tri.range(1,8).slow(32))`;
|
|
||||||
|
|
||||||
try {
|
|
||||||
const base64 = decodeURIComponent(window.location.href.split('#')[1]);
|
|
||||||
initialCode = atob(base64);
|
|
||||||
} catch (err) {
|
|
||||||
console.warn('failed to decode', err);
|
|
||||||
}
|
|
||||||
const input = document.getElementById('text');
|
|
||||||
input.value = initialCode;
|
|
||||||
const evaluate = () => {
|
|
||||||
try {
|
|
||||||
const pattern = eval(input.value);
|
|
||||||
scheduler.setPattern(pattern);
|
|
||||||
window.location.hash = '#' + encodeURIComponent(btoa(input.value)); // update url hash
|
|
||||||
} catch (err) {
|
|
||||||
console.warn(err);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
evaluate();
|
|
||||||
input.addEventListener('input', () => evaluate());
|
|
||||||
document.getElementById('start').addEventListener('click', async () => {
|
|
||||||
await ctx.resume();
|
|
||||||
scheduler.start();
|
|
||||||
});
|
|
||||||
document.getElementById('stop').addEventListener('click', () => scheduler.stop());
|
|
||||||
document.getElementById('slower').addEventListener('click', () => scheduler.setCps(scheduler.cps - 0.1));
|
|
||||||
document.getElementById('faster').addEventListener('click', () => scheduler.setCps(scheduler.cps + 0.1));
|
|
||||||
</script>
|
|
||||||
<!--
|
|
||||||
sequence(1,2).mul(55/2) // frequencies
|
|
||||||
.mul(slowcat(1,2))
|
|
||||||
.mul(slowcat(1,3/2,4/3,5/3).slow(8))
|
|
||||||
.fast(3)
|
|
||||||
.freq()
|
|
||||||
.velocity(.5)
|
|
||||||
.s('sawtooth')
|
|
||||||
.cutoff(800)
|
|
||||||
.out()
|
|
||||||
-->
|
|
||||||
@ -1,44 +0,0 @@
|
|||||||
<input
|
|
||||||
type="text"
|
|
||||||
id="text"
|
|
||||||
value="seq('c3','eb3','g3').note().s('sawtooth').out()"
|
|
||||||
style="width: 100%; font-size: 2em; outline: none; margin-bottom: 10px"
|
|
||||||
spellcheck="false"
|
|
||||||
/>
|
|
||||||
<button id="start">play</button>
|
|
||||||
<div id="output"></div>
|
|
||||||
<script type="module">
|
|
||||||
const strudel = await import('https://cdn.skypack.dev/@strudel.cycles/core@latest');
|
|
||||||
|
|
||||||
const controls = await import('https://cdn.skypack.dev/@strudel.cycles/core@latest/controls.mjs');
|
|
||||||
const { getAudioContext, Scheduler } = await import('https://cdn.skypack.dev/@strudel.cycles/webaudio@latest');
|
|
||||||
let scheduler;
|
|
||||||
|
|
||||||
const audioContext = getAudioContext();
|
|
||||||
const latency = 0.2;
|
|
||||||
|
|
||||||
Object.assign(window, strudel);
|
|
||||||
Object.assign(window, controls.default);
|
|
||||||
scheduler = new Scheduler({
|
|
||||||
audioContext,
|
|
||||||
interval: 0.1,
|
|
||||||
latency,
|
|
||||||
onEvent: (hap) => {
|
|
||||||
if (!hap.context.onTrigger) {
|
|
||||||
console.warn('no output chosen. use one of .out() .webdirt() .osc()');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
});
|
|
||||||
let started;
|
|
||||||
document.getElementById('start').addEventListener('click', async () => {
|
|
||||||
const code = document.getElementById('text').value;
|
|
||||||
const pattern = eval(code);
|
|
||||||
const events = pattern._firstCycleValues;
|
|
||||||
console.log(code, '->', events);
|
|
||||||
scheduler.setPattern(pattern);
|
|
||||||
if (!started) {
|
|
||||||
scheduler.start();
|
|
||||||
started = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
@ -6,46 +6,36 @@
|
|||||||
<title>Buildless Vanilla Strudel REPL</title>
|
<title>Buildless Vanilla Strudel REPL</title>
|
||||||
</head>
|
</head>
|
||||||
<body style="margin: 0; background: #222">
|
<body style="margin: 0; background: #222">
|
||||||
<div style="display: grid; height: 100vh">
|
<div style="display: grid; height: 100vh; grid-template-rows: 32px auto">
|
||||||
|
<button id="start" style="width: 100vw; height: 32px">evaluate</button>
|
||||||
<textarea
|
<textarea
|
||||||
id="text"
|
id="text"
|
||||||
style="font-size: 2em; border: 0; color: white; background: transparent; outline: none; padding: 20px"
|
style="font-size: 2em; border: 0; color: white; background: transparent; outline: none; padding: 20px"
|
||||||
spellcheck="false"
|
spellcheck="false"
|
||||||
></textarea>
|
></textarea>
|
||||||
</div>
|
</div>
|
||||||
<button
|
|
||||||
id="start"
|
|
||||||
style="
|
|
||||||
position: absolute;
|
|
||||||
border-radius: 10px;
|
|
||||||
top: 20px;
|
|
||||||
right: 20px;
|
|
||||||
padding: 20px;
|
|
||||||
border: 2px solid white;
|
|
||||||
background: transparent;
|
|
||||||
color: white;
|
|
||||||
cursor: pointer;
|
|
||||||
"
|
|
||||||
>
|
|
||||||
evaluate
|
|
||||||
</button>
|
|
||||||
<div id="output"></div>
|
<div id="output"></div>
|
||||||
<script type="module">
|
<script type="module">
|
||||||
import { controls, repl, evalScope } from 'https://cdn.skypack.dev/@strudel.cycles/core@0.3.2';
|
import { controls, repl, evalScope } from 'https://cdn.skypack.dev/@strudel.cycles/core@0.6.8';
|
||||||
import { mini } from 'https://cdn.skypack.dev/@strudel.cycles/mini@0.3.2';
|
import { mini } from 'https://cdn.skypack.dev/@strudel.cycles/mini@0.6.0';
|
||||||
import { transpiler } from 'https://cdn.skypack.dev/@strudel.cycles/transpiler@0.3.2';
|
import { transpiler } from 'https://cdn.skypack.dev/@strudel.cycles/transpiler@0.6.0';
|
||||||
import { getAudioContext, webaudioOutput } from 'https://cdn.skypack.dev/@strudel.cycles/webaudio@0.3.3';
|
import {
|
||||||
|
getAudioContext,
|
||||||
|
webaudioOutput,
|
||||||
|
initAudioOnFirstClick,
|
||||||
|
} from 'https://cdn.skypack.dev/@strudel.cycles/webaudio@0.6.0';
|
||||||
|
|
||||||
|
initAudioOnFirstClick();
|
||||||
const ctx = getAudioContext();
|
const ctx = getAudioContext();
|
||||||
const input = document.getElementById('text');
|
const input = document.getElementById('text');
|
||||||
input.innerHTML = getTune();
|
input.innerHTML = getTune();
|
||||||
|
|
||||||
evalScope(
|
evalScope(
|
||||||
controls,
|
controls,
|
||||||
import('https://cdn.skypack.dev/@strudel.cycles/core@0.3.2'),
|
import('https://cdn.skypack.dev/@strudel.cycles/core@0.6.8'),
|
||||||
import('https://cdn.skypack.dev/@strudel.cycles/mini@0.3.2'),
|
import('https://cdn.skypack.dev/@strudel.cycles/mini@0.6.0'),
|
||||||
import('https://cdn.skypack.dev/@strudel.cycles/tonal@0.3.3'),
|
import('https://cdn.skypack.dev/@strudel.cycles/tonal@0.6.0'),
|
||||||
import('https://cdn.skypack.dev/@strudel.cycles/webaudio@0.3.3'),
|
import('https://cdn.skypack.dev/@strudel.cycles/webaudio@0.6.0'),
|
||||||
);
|
);
|
||||||
|
|
||||||
const { evaluate } = repl({
|
const { evaluate } = repl({
|
||||||
|
|||||||
@ -1,12 +1,12 @@
|
|||||||
import { controls, repl, evalScope, setStringParser } from '@strudel.cycles/core';
|
import { controls, repl, evalScope } from '@strudel.cycles/core';
|
||||||
import { mini } from '@strudel.cycles/mini';
|
import { getAudioContext, webaudioOutput, initAudioOnFirstClick } from '@strudel.cycles/webaudio';
|
||||||
import { getAudioContext, webaudioOutput } from '@strudel.cycles/webaudio';
|
import { transpiler } from '@strudel.cycles/transpiler';
|
||||||
// import { transpiler } from '@strudel.cycles/transpiler';
|
|
||||||
import tune from './tune.mjs';
|
import tune from './tune.mjs';
|
||||||
|
|
||||||
const ctx = getAudioContext();
|
const ctx = getAudioContext();
|
||||||
const input = document.getElementById('text');
|
const input = document.getElementById('text');
|
||||||
input.innerHTML = tune;
|
input.innerHTML = tune;
|
||||||
|
initAudioOnFirstClick();
|
||||||
|
|
||||||
evalScope(
|
evalScope(
|
||||||
controls,
|
controls,
|
||||||
@ -16,14 +16,13 @@ evalScope(
|
|||||||
import('@strudel.cycles/tonal'),
|
import('@strudel.cycles/tonal'),
|
||||||
);
|
);
|
||||||
|
|
||||||
setStringParser(mini);
|
|
||||||
|
|
||||||
const { evaluate } = repl({
|
const { evaluate } = repl({
|
||||||
defaultOutput: webaudioOutput,
|
defaultOutput: webaudioOutput,
|
||||||
getTime: () => ctx.currentTime,
|
getTime: () => ctx.currentTime,
|
||||||
// transpiler,
|
transpiler,
|
||||||
});
|
});
|
||||||
document.getElementById('start').addEventListener('click', () => {
|
document.getElementById('start').addEventListener('click', () => {
|
||||||
ctx.resume();
|
ctx.resume();
|
||||||
|
console.log('eval', input.value);
|
||||||
evaluate(input.value);
|
evaluate(input.value);
|
||||||
});
|
});
|
||||||
|
|||||||
@ -15,6 +15,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@strudel.cycles/core": "workspace:*",
|
"@strudel.cycles/core": "workspace:*",
|
||||||
"@strudel.cycles/mini": "workspace:*",
|
"@strudel.cycles/mini": "workspace:*",
|
||||||
|
"@strudel.cycles/transpiler": "workspace:*",
|
||||||
"@strudel.cycles/webaudio": "workspace:*",
|
"@strudel.cycles/webaudio": "workspace:*",
|
||||||
"@strudel.cycles/tonal": "workspace:*"
|
"@strudel.cycles/tonal": "workspace:*"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
/* export default `await samples('github:tidalcycles/Dirt-Samples/master')
|
export default `await samples('github:tidalcycles/Dirt-Samples/master')
|
||||||
|
|
||||||
stack(
|
stack(
|
||||||
// amen
|
// amen
|
||||||
@ -29,11 +29,3 @@ stack(
|
|||||||
,
|
,
|
||||||
n("0 1").s("east").delay(.5).degradeBy(.8).speed(rand.range(.5,1.5))
|
n("0 1").s("east").delay(.5).degradeBy(.8).speed(rand.range(.5,1.5))
|
||||||
).reset("<x@7 x(5,8)>")`;
|
).reset("<x@7 x(5,8)>")`;
|
||||||
*/
|
|
||||||
|
|
||||||
export default `stack(
|
|
||||||
n("c3 [eb3,g3]")
|
|
||||||
.delay("<0 .5>")
|
|
||||||
.delaytime(".16 | .33")
|
|
||||||
.delayfeedback(".6 | .8")
|
|
||||||
).sometimes(x=>x.speed("-1"))`;
|
|
||||||
|
|||||||
@ -1,65 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
<title>Buildless Vanilla Strudel REPL</title>
|
|
||||||
</head>
|
|
||||||
<body style="margin: 0; background: #222">
|
|
||||||
<div style="display: grid; height: 100vh">
|
|
||||||
<textarea
|
|
||||||
id="text"
|
|
||||||
style="font-size: 2em; border: 0; color: white; background: transparent; outline: none; padding: 20px"
|
|
||||||
spellcheck="false"
|
|
||||||
>
|
|
||||||
// LOADING</textarea
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
<button
|
|
||||||
id="start"
|
|
||||||
style="
|
|
||||||
position: absolute;
|
|
||||||
border-radius: 10px;
|
|
||||||
top: 20px;
|
|
||||||
right: 20px;
|
|
||||||
padding: 20px;
|
|
||||||
border: 2px solid white;
|
|
||||||
background: transparent;
|
|
||||||
color: white;
|
|
||||||
cursor: pointer;
|
|
||||||
"
|
|
||||||
>
|
|
||||||
evaluate
|
|
||||||
</button>
|
|
||||||
<div id="output"></div>
|
|
||||||
<script type="module">
|
|
||||||
import { controls, repl, evalScope } from 'https://cdn.skypack.dev/@strudel.cycles/core@0.4.1';
|
|
||||||
import { transpiler } from 'https://cdn.skypack.dev/@strudel.cycles/transpiler@0.4.1';
|
|
||||||
|
|
||||||
const modules = [
|
|
||||||
import('https://cdn.skypack.dev/@strudel.cycles/core@0.4.1'),
|
|
||||||
import('https://cdn.skypack.dev/@strudel.cycles/mini@0.4.1'),
|
|
||||||
];
|
|
||||||
|
|
||||||
const input = document.getElementById('text');
|
|
||||||
|
|
||||||
Promise.all(modules).then(() => {
|
|
||||||
input.innerHTML = `note("<c3 [d3 e3]>").cutoff(1000)`;
|
|
||||||
document.getElementById('start').addEventListener('click', () => {
|
|
||||||
evaluate(input.value);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
evalScope(controls, ...modules);
|
|
||||||
|
|
||||||
const { evaluate } = repl({
|
|
||||||
defaultOutput: (hap, deadline, duration) => {
|
|
||||||
console.log(deadline, duration, hap.value);
|
|
||||||
},
|
|
||||||
getTime: () => Date.now() / 1000,
|
|
||||||
transpiler,
|
|
||||||
beforeEval: (code) => console.log('evaluate', code),
|
|
||||||
afterEval: (code) => {},
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
15
pnpm-lock.yaml
generated
15
pnpm-lock.yaml
generated
@ -60,6 +60,21 @@ importers:
|
|||||||
vite: 3.2.5
|
vite: 3.2.5
|
||||||
vitest: 0.25.8
|
vitest: 0.25.8
|
||||||
|
|
||||||
|
packages/core/examples/vite-vanilla-repl:
|
||||||
|
specifiers:
|
||||||
|
'@strudel.cycles/core': workspace:*
|
||||||
|
'@strudel.cycles/mini': workspace:*
|
||||||
|
'@strudel.cycles/tonal': workspace:*
|
||||||
|
'@strudel.cycles/webaudio': workspace:*
|
||||||
|
vite: ^3.2.0
|
||||||
|
dependencies:
|
||||||
|
'@strudel.cycles/core': link:../..
|
||||||
|
'@strudel.cycles/mini': link:../../../mini
|
||||||
|
'@strudel.cycles/tonal': link:../../../tonal
|
||||||
|
'@strudel.cycles/webaudio': link:../../../webaudio
|
||||||
|
devDependencies:
|
||||||
|
vite: 3.2.5
|
||||||
|
|
||||||
packages/csound:
|
packages/csound:
|
||||||
specifiers:
|
specifiers:
|
||||||
'@csound/browser': ^6.18.3
|
'@csound/browser': ^6.18.3
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
packages:
|
packages:
|
||||||
# all packages in direct subdirs of packages/
|
# all packages in direct subdirs of packages/
|
||||||
- "packages/*"
|
- "packages/*"
|
||||||
- "website/"
|
- "website/"
|
||||||
|
- "packages/core/examples/vite-vanilla-repl"
|
||||||
Loading…
x
Reference in New Issue
Block a user