+
{show && }
{drawTime && (
diff --git a/packages/react/src/components/MiniRepl.module.css b/packages/react/src/components/MiniRepl.module.css
deleted file mode 100644
index 257268a8..00000000
--- a/packages/react/src/components/MiniRepl.module.css
+++ /dev/null
@@ -1,27 +0,0 @@
-.container {
- @apply overflow-hidden;
-}
-
-.header {
- @apply flex justify-between bg-lineHighlight border-t border-l border-r border-lineHighlight rounded-t-md overflow-hidden;
-}
-
-.buttons {
- @apply flex;
-}
-
-.button {
- @apply cursor-pointer w-16 flex items-center justify-center p-1 border-r border-lineHighlight text-foreground hover:bg-background;
-}
-
-.buttonDisabled {
- @apply w-16 flex items-center justify-center p-1 opacity-50 cursor-not-allowed border-r border-lineHighlight;
-}
-
-.error {
- @apply text-right p-1 text-sm text-red-200;
-}
-
-.body {
- @apply overflow-auto relative;
-}
diff --git a/packages/react/src/components/style.css b/packages/react/src/components/style.css
index ae33a5d2..150c9837 100644
--- a/packages/react/src/components/style.css
+++ b/packages/react/src/components/style.css
@@ -1,3 +1,15 @@
+:root {
+ --background: #222;
+ --lineBackground: #22222250;
+ --foreground: #fff;
+ --caret: #ffcc00;
+ --selection: rgba(128, 203, 196, 0.5);
+ --selectionMatch: #036dd626;
+ --lineHighlight: #00000050;
+ --gutterBackground: transparent;
+ --gutterForeground: #8a919966;
+}
+
.cm-editor {
background-color: transparent !important;
height: 100%;
diff --git a/packages/react/src/hooks/useHighlighting.mjs b/packages/react/src/hooks/useHighlighting.mjs
index 6e336586..4ce2a936 100644
--- a/packages/react/src/hooks/useHighlighting.mjs
+++ b/packages/react/src/hooks/useHighlighting.mjs
@@ -1,5 +1,6 @@
import { useEffect, useRef } from 'react';
import { setHighlights } from '../components/CodeMirror6';
+const round = (x) => Math.round(x * 1000) / 1000;
function useHighlighting({ view, pattern, active, getTime }) {
const highlights = useRef([]);
@@ -14,7 +15,7 @@ function useHighlighting({ view, pattern, active, getTime }) {
// force min framerate of 10 fps => fixes crash on tab refocus, where lastEnd could be far away
// see https://github.com/tidalcycles/strudel/issues/108
const begin = Math.max(lastEnd.current ?? audioTime, audioTime - 1 / 10, -0.01); // negative time seems buggy
- const span = [begin, audioTime + 1 / 60];
+ const span = [round(begin), round(audioTime + 1 / 60)];
lastEnd.current = span[1];
highlights.current = highlights.current.filter((hap) => hap.whole.end > audioTime); // keep only highlights that are still active
const haps = pattern.queryArc(...span).filter((hap) => hap.hasOnset());
diff --git a/packages/react/src/hooks/useStrudel.mjs b/packages/react/src/hooks/useStrudel.mjs
index b0b1062c..0900ebbf 100644
--- a/packages/react/src/hooks/useStrudel.mjs
+++ b/packages/react/src/hooks/useStrudel.mjs
@@ -32,7 +32,7 @@ function useStrudel({
const shouldPaint = useCallback((pat) => !!(pat?.context?.onPaint && drawContext), [drawContext]);
// TODO: make sure this hook reruns when scheduler.started changes
- const { scheduler, evaluate, start, stop, pause } = useMemo(
+ const { scheduler, evaluate, start, stop, pause, setCps } = useMemo(
() =>
repl({
interval,
@@ -153,6 +153,7 @@ function useStrudel({
stop,
pause,
togglePlay,
+ setCps,
};
}
diff --git a/packages/react/src/main.jsx b/packages/react/src/main.jsx
index e9780201..fe0fabf3 100644
--- a/packages/react/src/main.jsx
+++ b/packages/react/src/main.jsx
@@ -1,10 +1,9 @@
import React from 'react';
-import ReactDOM from 'react-dom';
import App from './App';
+import { createRoot } from 'react-dom/client';
-ReactDOM.render(
+createRoot(document.getElementById('root')).render(
,
- document.getElementById('root'),
);
diff --git a/packages/react/tailwind.config.js b/packages/react/tailwind.config.js
index f6cae19b..c5a940fc 100644
--- a/packages/react/tailwind.config.js
+++ b/packages/react/tailwind.config.js
@@ -1,7 +1,21 @@
module.exports = {
content: ['./src/**/*.{js,jsx,ts,tsx}'],
theme: {
- extend: {},
+ extend: {
+ colors: {
+ // codemirror-theme settings
+ background: 'var(--background)',
+ lineBackground: 'var(--lineBackground)',
+ foreground: 'var(--foreground)',
+ caret: 'var(--caret)',
+ selection: 'var(--selection)',
+ selectionMatch: 'var(--selectionMatch)',
+ gutterBackground: 'var(--gutterBackground)',
+ gutterForeground: 'var(--gutterForeground)',
+ gutterBorder: 'var(--gutterBorder)',
+ lineHighlight: 'var(--lineHighlight)',
+ },
+ },
},
plugins: [],
corePlugins: {
diff --git a/packages/tonal/test/tonal.test.mjs b/packages/tonal/test/tonal.test.mjs
index 7459ce3d..7c32989a 100644
--- a/packages/tonal/test/tonal.test.mjs
+++ b/packages/tonal/test/tonal.test.mjs
@@ -9,6 +9,7 @@ This program is free software: you can redistribute it and/or modify it under th
import '../tonal.mjs'; // need to import this to add prototypes
import { pure, controls, seq } from '@strudel.cycles/core';
import { describe, it, expect } from 'vitest';
+import { mini } from '../../mini/mini.mjs';
const { n } = controls;
describe('tonal', () => {
@@ -30,4 +31,18 @@ describe('tonal', () => {
.firstCycleValues.map((h) => h.note),
).toEqual(['C3', 'D3', 'E3']);
});
+ it('scale with colon', () => {
+ expect(
+ n(0, 1, 2)
+ .scale('C:major')
+ .firstCycleValues.map((h) => h.note),
+ ).toEqual(['C3', 'D3', 'E3']);
+ });
+ it('scale with mininotation colon', () => {
+ expect(
+ n(0, 1, 2)
+ .scale(mini('C:major'))
+ .firstCycleValues.map((h) => h.note),
+ ).toEqual(['C3', 'D3', 'E3']);
+ });
});
diff --git a/packages/tonal/tonal.mjs b/packages/tonal/tonal.mjs
index 206ea840..854fd1b6 100644
--- a/packages/tonal/tonal.mjs
+++ b/packages/tonal/tonal.mjs
@@ -123,29 +123,37 @@ export const scaleTranspose = register('scaleTranspose', function (offset /* : n
/**
* Turns numbers into notes in the scale (zero indexed). Also sets scale for other scale operations, like {@link Pattern#scaleTranspose}.
*
- * A scale consists of a root note (e.g. `c4`, `c`, `f#`, `bb4`) followed by a [scale type](https://github.com/tonaljs/tonal/blob/main/packages/scale-type/data.ts).
+ * A scale consists of a root note (e.g. `c4`, `c`, `f#`, `bb4`) followed by semicolon (':') and then a [scale type](https://github.com/tonaljs/tonal/blob/main/packages/scale-type/data.ts).
+ *
* The root note defaults to octave 3, if no octave number is given.
- * Note that you currently cannot pattern `scale` with the mini notation, because the scale name includes a space.
- * This will be improved in the future. Until then, use a sequence function like `cat` or `seq`.
*
* @memberof Pattern
* @name scale
* @param {string} scale Name of scale
* @returns Pattern
* @example
- * "0 2 4 6 4 2".scale('C2 major').note()
+ * "0 2 4 6 4 2".scale("C2:major").note()
* @example
* "0 2 4 6 4 2"
- * .scale(seq('C2 major', 'C2 minor').slow(2))
+ * .scale("C2:
")
* .note()
+ * @example
+ * "0 1 2 3 4 5 6 7".rev().scale("C2:").note()
+ * .s("folkharp")
*/
-export const scale = register('scale', function (scale /* : string */, pat) {
+export const scale = register('scale', function (scale, pat) {
+ // Supports ':' list syntax in mininotation
+ if (Array.isArray(scale)) {
+ scale = scale.join(' ');
+ }
return pat.withHap((hap) => {
const isObject = typeof hap.value === 'object';
let note = isObject ? hap.value.n : hap.value;
const asNumber = Number(note);
if (!isNaN(asNumber)) {
+ // TODO: worth keeping for supporting ':' in (non-mininotation) strings?
+ scale = scale.replaceAll(':', ' ');
let [tonic, scaleName] = Scale.tokenize(scale);
const { pc, oct = 3 } = Note.get(tonic);
note = scaleOffset(pc + ' ' + scaleName, asNumber, pc + oct);
diff --git a/packages/webaudio/webaudio.mjs b/packages/webaudio/webaudio.mjs
index 968cb996..50436d09 100644
--- a/packages/webaudio/webaudio.mjs
+++ b/packages/webaudio/webaudio.mjs
@@ -97,17 +97,6 @@ const getSoundfontKey = (s) => {
return;
};
-const splitSN = (s, n) => {
- if (!s.includes(':')) {
- return [s, n];
- }
- let [s2, n2] = s.split(':');
- if (isNaN(Number(n2))) {
- return [s, n];
- }
- return [s2, n2];
-};
-
let workletsLoading;
function loadWorklets() {
if (workletsLoading) {
@@ -191,23 +180,11 @@ function effectSend(input, effect, wet) {
}
// export const webaudioOutput = async (t, hap, ct, cps) => {
-export const webaudioOutput = async (hap, deadline, hapDuration) => {
+export const webaudioOutput = async (hap, deadline, hapDuration, cps) => {
const ac = getAudioContext();
- /* if (isNote(hap.value)) {
- // supports primitive hap values that look like notes
- hap.value = { note: hap.value };
- } */
- if (typeof hap.value !== 'object') {
- logger(
- `hap.value "${hap.value}" is not supported by webaudio output. Hint: append .note() or .s() to the end`,
- 'error',
- );
- /* throw new Error(
- `hap.value "${hap.value}"" is not supported by webaudio output. Hint: append .note() or .s() to the end`,
- ); */
- return;
- }
- // calculate correct time (tone.js workaround)
+ hap.ensureObjectValue();
+
+ // calculate absolute time
let t = ac.currentTime + deadline;
// destructure value
let {
@@ -220,20 +197,14 @@ export const webaudioOutput = async (hap, deadline, hapDuration) => {
note,
gain = 0.8,
// low pass
- lpf,
- cutoff = lpf,
- lpq = 1,
- resonance = lpq,
+ cutoff,
+ resonance = 1,
// high pass
- hpf,
- hcutoff = hpf,
- hpq = 1,
- hresonance = hpq,
+ hcutoff,
+ hresonance = 1,
// band pass
- bpf,
- bandf = bpf,
- bpq = 1,
- bandq = bpq,
+ bandf,
+ bandq = 1,
//
coarse,
crush,
@@ -253,7 +224,6 @@ export const webaudioOutput = async (hap, deadline, hapDuration) => {
orbit = 1,
room,
size = 2,
- roomsize = size,
} = hap.value;
const { velocity = 1 } = hap.context;
gain *= velocity; // legacy fix for velocity
@@ -262,12 +232,6 @@ export const webaudioOutput = async (hap, deadline, hapDuration) => {
if (bank && s) {
s = `${bank}_${s}`;
}
- if (typeof s === 'string') {
- [s, n] = splitSN(s, n);
- }
- if (typeof note === 'string') {
- [note, n] = splitSN(note, n);
- }
if (!s || ['sine', 'square', 'triangle', 'sawtooth'].includes(s)) {
// destructure adsr here, because the default should be different for synths and samples
const { attack = 0.001, decay = 0.05, sustain = 0.6, release = 0.01 } = hap.value;
@@ -324,7 +288,7 @@ export const webaudioOutput = async (hap, deadline, hapDuration) => {
bufferSource.playbackRate.value = Math.abs(speed) * bufferSource.playbackRate.value;
if (unit === 'c') {
// are there other units?
- bufferSource.playbackRate.value = bufferSource.playbackRate.value * bufferSource.buffer.duration;
+ bufferSource.playbackRate.value = bufferSource.playbackRate.value * bufferSource.buffer.duration * cps;
}
let duration = soundfont || clip ? hapDuration : bufferSource.buffer.duration / bufferSource.playbackRate.value;
// "The computation of the offset into the sound is performed using the sound buffer's natural sample rate,
@@ -385,8 +349,8 @@ export const webaudioOutput = async (hap, deadline, hapDuration) => {
}
// reverb
let reverbSend;
- if (room > 0 && roomsize > 0) {
- const reverbNode = getReverb(orbit, roomsize);
+ if (room > 0 && size > 0) {
+ const reverbNode = getReverb(orbit, size);
reverbSend = effectSend(post, reverbNode, room);
}
@@ -397,7 +361,7 @@ export const webaudioOutput = async (hap, deadline, hapDuration) => {
chain[0].onended = () => chain.concat([delaySend, reverbSend]).forEach((n) => n?.disconnect());
};
-export const webaudioOutputTrigger = (t, hap, ct, cps) => webaudioOutput(hap, t - ct, hap.duration / cps);
+export const webaudioOutputTrigger = (t, hap, ct, cps) => webaudioOutput(hap, t - ct, hap.duration / cps, cps);
Pattern.prototype.webaudio = function () {
// TODO: refactor (t, hap, ct, cps) to (hap, deadline, duration) ?
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index df59deb2..473c8f3b 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -11,6 +11,7 @@ importers:
'@strudel.cycles/webaudio': workspace:*
'@strudel.cycles/xen': workspace:*
'@vitest/ui': ^0.25.7
+ acorn: ^8.8.1
c8: ^7.12.0
canvas: ^2.11.0
dependency-tree: ^9.0.0
@@ -32,6 +33,7 @@ importers:
'@strudel.cycles/transpiler': link:packages/transpiler
'@strudel.cycles/webaudio': link:packages/webaudio
'@strudel.cycles/xen': link:packages/xen
+ acorn: 8.8.2
dependency-tree: 9.0.0
vitest: 0.25.8_@vitest+ui@0.25.8
devDependencies:
@@ -169,15 +171,15 @@ importers:
'@strudel.cycles/core': workspace:*
'@strudel.cycles/transpiler': workspace:*
'@strudel.cycles/webaudio': workspace:*
- '@types/react': ^17.0.2
- '@types/react-dom': ^17.0.2
+ '@types/react': ^18.0.28
+ '@types/react-dom': ^18.0.11
'@uiw/codemirror-themes': ^4.12.4
'@uiw/react-codemirror': ^4.12.4
'@vitejs/plugin-react': ^2.2.0
autoprefixer: ^10.4.7
postcss: ^8.4.18
- react: ^17.0.2
- react-dom: ^17.0.2
+ react: ^18.2.0
+ react-dom: ^18.2.0
react-hook-inview: ^4.5.0
tailwindcss: ^3.0.24
vite: ^3.2.2
@@ -193,16 +195,16 @@ importers:
'@strudel.cycles/transpiler': link:../transpiler
'@strudel.cycles/webaudio': link:../webaudio
'@uiw/codemirror-themes': 4.19.7_a4vbhepr4qhxm5cldqd4jpyase
- '@uiw/react-codemirror': 4.19.7_r3x7zzmc35ug7i3c2vv4bf5iey
- react-hook-inview: 4.5.0_sfoxds7t5ydpegc3knd667wn6m
+ '@uiw/react-codemirror': 4.19.7_mtfgmdsccde6vjsd2vdv2ar7qq
+ react-hook-inview: 4.5.0_biqbaboplfbrettd7655fr4n2y
devDependencies:
- '@types/react': 17.0.53
- '@types/react-dom': 17.0.18
+ '@types/react': 18.0.28
+ '@types/react-dom': 18.0.11
'@vitejs/plugin-react': 2.2.0_vite@3.2.5
autoprefixer: 10.4.13_postcss@8.4.21
postcss: 8.4.21
- react: 17.0.2
- react-dom: 17.0.2_react@17.0.2
+ react: 18.2.0
+ react-dom: 18.2.0_react@18.2.0
tailwindcss: 3.2.4_postcss@8.4.21
vite: 3.2.5
@@ -3965,23 +3967,15 @@ packages:
/@types/prop-types/15.7.5:
resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==}
- /@types/react-dom/17.0.18:
- resolution: {integrity: sha512-rLVtIfbwyur2iFKykP2w0pl/1unw26b5td16d5xMgp7/yjTHomkyxPYChFoCr/FtEX1lN9wY6lFj1qvKdS5kDw==}
- dependencies:
- '@types/react': 17.0.53
- dev: true
-
/@types/react-dom/18.0.10:
resolution: {integrity: sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg==}
dependencies:
- '@types/react': 18.0.27
+ '@types/react': 18.0.28
- /@types/react/17.0.53:
- resolution: {integrity: sha512-1yIpQR2zdYu1Z/dc1OxC+MA6GR240u3gcnP4l6mvj/PJiVaqHsQPmWttsvHsfnhfPbU2FuGmo0wSITPygjBmsw==}
+ /@types/react-dom/18.0.11:
+ resolution: {integrity: sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==}
dependencies:
- '@types/prop-types': 15.7.5
- '@types/scheduler': 0.16.2
- csstype: 3.1.1
+ '@types/react': 18.0.28
dev: true
/@types/react/18.0.27:
@@ -3991,6 +3985,13 @@ packages:
'@types/scheduler': 0.16.2
csstype: 3.1.1
+ /@types/react/18.0.28:
+ resolution: {integrity: sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==}
+ dependencies:
+ '@types/prop-types': 15.7.5
+ '@types/scheduler': 0.16.2
+ csstype: 3.1.1
+
/@types/resolve/1.17.1:
resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==}
dependencies:
@@ -4256,7 +4257,7 @@ packages:
'@codemirror/view': 6.7.3
dev: false
- /@uiw/react-codemirror/4.19.7_r3x7zzmc35ug7i3c2vv4bf5iey:
+ /@uiw/react-codemirror/4.19.7_mtfgmdsccde6vjsd2vdv2ar7qq:
resolution: {integrity: sha512-IHvpYWVSdiaHX0Fk6oY6YyAJigDnyvSpWKNUTRzsMNxB+8/wqZ8lior4TprXH0zyLxW5F1+bTyifFFTeg+X3Sw==}
peerDependencies:
'@codemirror/state': '>=6.0.0'
@@ -4271,8 +4272,8 @@ packages:
'@codemirror/view': 6.7.3
'@uiw/codemirror-extensions-basic-setup': 4.19.7_cgfc5aojxuwjajwhkrgidrzxoa
codemirror: 6.0.1
- react: 17.0.2
- react-dom: 17.0.2_react@17.0.2
+ react: 18.2.0
+ react-dom: 18.2.0_react@18.2.0
transitivePeerDependencies:
- '@codemirror/autocomplete'
dev: false
@@ -10492,6 +10493,17 @@ packages:
- supports-color
dev: true
+ /postcss-import/14.1.0:
+ resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==}
+ engines: {node: '>=10.0.0'}
+ peerDependencies:
+ postcss: ^8.0.0
+ dependencies:
+ postcss-value-parser: 4.2.0
+ read-cache: 1.0.0
+ resolve: 1.22.1
+ dev: false
+
/postcss-import/14.1.0_postcss@8.4.21:
resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==}
engines: {node: '>=10.0.0'}
@@ -10502,6 +10514,16 @@ packages:
postcss-value-parser: 4.2.0
read-cache: 1.0.0
resolve: 1.22.1
+ dev: true
+
+ /postcss-js/4.0.0:
+ resolution: {integrity: sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==}
+ engines: {node: ^12 || ^14 || >= 16}
+ peerDependencies:
+ postcss: ^8.3.3
+ dependencies:
+ camelcase-css: 2.0.1
+ dev: false
/postcss-js/4.0.0_postcss@8.4.21:
resolution: {integrity: sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==}
@@ -10511,6 +10533,23 @@ packages:
dependencies:
camelcase-css: 2.0.1
postcss: 8.4.21
+ dev: true
+
+ /postcss-load-config/3.1.4:
+ resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==}
+ engines: {node: '>= 10'}
+ peerDependencies:
+ postcss: '>=8.0.9'
+ ts-node: '>=9.0.0'
+ peerDependenciesMeta:
+ postcss:
+ optional: true
+ ts-node:
+ optional: true
+ dependencies:
+ lilconfig: 2.0.6
+ yaml: 1.10.2
+ dev: false
/postcss-load-config/3.1.4_postcss@8.4.21:
resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==}
@@ -10528,6 +10567,15 @@ packages:
postcss: 8.4.21
yaml: 1.10.2
+ /postcss-nested/6.0.0:
+ resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==}
+ engines: {node: '>=12.0'}
+ peerDependencies:
+ postcss: ^8.2.14
+ dependencies:
+ postcss-selector-parser: 6.0.11
+ dev: false
+
/postcss-nested/6.0.0_postcss@8.4.21:
resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==}
engines: {node: '>=12.0'}
@@ -10536,6 +10584,7 @@ packages:
dependencies:
postcss: 8.4.21
postcss-selector-parser: 6.0.11
+ dev: true
/postcss-selector-parser/6.0.10:
resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==}
@@ -10817,16 +10866,6 @@ packages:
strip-json-comments: 2.0.1
dev: true
- /react-dom/17.0.2_react@17.0.2:
- resolution: {integrity: sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==}
- peerDependencies:
- react: 17.0.2
- dependencies:
- loose-envify: 1.4.0
- object-assign: 4.1.1
- react: 17.0.2
- scheduler: 0.20.2
-
/react-dom/18.2.0_react@18.2.0:
resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==}
peerDependencies:
@@ -10835,16 +10874,15 @@ packages:
loose-envify: 1.4.0
react: 18.2.0
scheduler: 0.23.0
- dev: false
- /react-hook-inview/4.5.0_sfoxds7t5ydpegc3knd667wn6m:
+ /react-hook-inview/4.5.0_biqbaboplfbrettd7655fr4n2y:
resolution: {integrity: sha512-Hm61BK32/K2Cc3bjBe2bQkndHbQP6NhHvWVX7zYitaitB6T28uUV+wlgxbXU9twxUt7+17HyHq6aezpMUCijQQ==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
dependencies:
- react: 17.0.2
- react-dom: 17.0.2_react@17.0.2
+ react: 18.2.0
+ react-dom: 18.2.0_react@18.2.0
dev: false
/react-refresh/0.14.0:
@@ -10852,19 +10890,11 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
- /react/17.0.2:
- resolution: {integrity: sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==}
- engines: {node: '>=0.10.0'}
- dependencies:
- loose-envify: 1.4.0
- object-assign: 4.1.1
-
/react/18.2.0:
resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==}
engines: {node: '>=0.10.0'}
dependencies:
loose-envify: 1.4.0
- dev: false
/read-cache/1.0.0:
resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
@@ -11521,17 +11551,10 @@ packages:
commander: 2.20.3
dev: false
- /scheduler/0.20.2:
- resolution: {integrity: sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==}
- dependencies:
- loose-envify: 1.4.0
- object-assign: 4.1.1
-
/scheduler/0.23.0:
resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==}
dependencies:
loose-envify: 1.4.0
- dev: false
/section-matter/1.0.0:
resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==}
@@ -12158,6 +12181,8 @@ packages:
resolution: {integrity: sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==}
engines: {node: '>=12.13.0'}
hasBin: true
+ peerDependencies:
+ postcss: ^8.0.9
dependencies:
arg: 5.0.2
chokidar: 3.5.3
@@ -12174,10 +12199,10 @@ packages:
object-hash: 3.0.0
picocolors: 1.0.0
postcss: 8.4.21
- postcss-import: 14.1.0_postcss@8.4.21
- postcss-js: 4.0.0_postcss@8.4.21
- postcss-load-config: 3.1.4_postcss@8.4.21
- postcss-nested: 6.0.0_postcss@8.4.21
+ postcss-import: 14.1.0
+ postcss-js: 4.0.0
+ postcss-load-config: 3.1.4
+ postcss-nested: 6.0.0
postcss-selector-parser: 6.0.11
postcss-value-parser: 4.2.0
quick-lru: 5.1.1
diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap
index 95ae2b41..da9bda11 100644
--- a/test/__snapshots__/examples.test.mjs.snap
+++ b/test/__snapshots__/examples.test.mjs.snap
@@ -848,6 +848,23 @@ exports[`runs examples > example "arpWith" example index 0 1`] = `
]
`;
+exports[`runs examples > example "arrange" example index 0 1`] = `
+[
+ "[ 0/1 → 1/8 | note:c ]",
+ "[ 3/8 → 1/2 | note:c ]",
+ "[ 3/4 → 7/8 | note:c ]",
+ "[ 1/1 → 9/8 | note:a ]",
+ "[ 11/8 → 3/2 | note:a ]",
+ "[ 7/4 → 15/8 | note:a ]",
+ "[ 2/1 → 17/8 | note:f ]",
+ "[ 19/8 → 5/2 | note:f ]",
+ "[ 11/4 → 23/8 | note:f ]",
+ "[ 3/1 → 25/8 | note:e ]",
+ "[ 27/8 → 7/2 | note:e ]",
+ "[ 15/4 → 31/8 | note:e ]",
+]
+`;
+
exports[`runs examples > example "attack" example index 0 1`] = `
[
"[ 0/1 → 1/2 | note:c3 attack:0 ]",
@@ -885,39 +902,39 @@ exports[`runs examples > example "begin" example index 0 1`] = `
exports[`runs examples > example "bpf" example index 0 1`] = `
[
- "[ 0/1 → 1/2 | s:bd bpf:1000 ]",
- "[ 1/2 → 1/1 | s:sd bpf:1000 ]",
- "[ 0/1 → 1/3 | s:hh bpf:1000 ]",
- "[ 1/3 → 2/3 | s:hh bpf:1000 ]",
- "[ 2/3 → 1/1 | s:hh bpf:1000 ]",
- "[ 1/1 → 3/2 | s:bd bpf:2000 ]",
- "[ 3/2 → 2/1 | s:sd bpf:2000 ]",
- "[ 1/1 → 4/3 | s:hh bpf:2000 ]",
- "[ 4/3 → 5/3 | s:hh bpf:2000 ]",
- "[ 5/3 → 2/1 | s:hh bpf:2000 ]",
- "[ 2/1 → 5/2 | s:bd bpf:4000 ]",
- "[ 5/2 → 3/1 | s:sd bpf:4000 ]",
- "[ 2/1 → 7/3 | s:hh bpf:4000 ]",
- "[ 7/3 → 8/3 | s:hh bpf:4000 ]",
- "[ 8/3 → 3/1 | s:hh bpf:4000 ]",
- "[ 3/1 → 7/2 | s:bd bpf:8000 ]",
- "[ 7/2 → 4/1 | s:sd bpf:8000 ]",
- "[ 3/1 → 10/3 | s:hh bpf:8000 ]",
- "[ 10/3 → 11/3 | s:hh bpf:8000 ]",
- "[ 11/3 → 4/1 | s:hh bpf:8000 ]",
+ "[ 0/1 → 1/2 | s:bd bandf:1000 ]",
+ "[ 1/2 → 1/1 | s:sd bandf:1000 ]",
+ "[ 0/1 → 1/3 | s:hh bandf:1000 ]",
+ "[ 1/3 → 2/3 | s:hh bandf:1000 ]",
+ "[ 2/3 → 1/1 | s:hh bandf:1000 ]",
+ "[ 1/1 → 3/2 | s:bd bandf:2000 ]",
+ "[ 3/2 → 2/1 | s:sd bandf:2000 ]",
+ "[ 1/1 → 4/3 | s:hh bandf:2000 ]",
+ "[ 4/3 → 5/3 | s:hh bandf:2000 ]",
+ "[ 5/3 → 2/1 | s:hh bandf:2000 ]",
+ "[ 2/1 → 5/2 | s:bd bandf:4000 ]",
+ "[ 5/2 → 3/1 | s:sd bandf:4000 ]",
+ "[ 2/1 → 7/3 | s:hh bandf:4000 ]",
+ "[ 7/3 → 8/3 | s:hh bandf:4000 ]",
+ "[ 8/3 → 3/1 | s:hh bandf:4000 ]",
+ "[ 3/1 → 7/2 | s:bd bandf:8000 ]",
+ "[ 7/2 → 4/1 | s:sd bandf:8000 ]",
+ "[ 3/1 → 10/3 | s:hh bandf:8000 ]",
+ "[ 10/3 → 11/3 | s:hh bandf:8000 ]",
+ "[ 11/3 → 4/1 | s:hh bandf:8000 ]",
]
`;
exports[`runs examples > example "bpq" example index 0 1`] = `
[
- "[ 0/1 → 1/2 | s:bd bpf:500 bpq:0 ]",
- "[ 1/2 → 1/1 | s:sd bpf:500 bpq:0 ]",
- "[ 1/1 → 3/2 | s:bd bpf:500 bpq:1 ]",
- "[ 3/2 → 2/1 | s:sd bpf:500 bpq:1 ]",
- "[ 2/1 → 5/2 | s:bd bpf:500 bpq:2 ]",
- "[ 5/2 → 3/1 | s:sd bpf:500 bpq:2 ]",
- "[ 3/1 → 7/2 | s:bd bpf:500 bpq:3 ]",
- "[ 7/2 → 4/1 | s:sd bpf:500 bpq:3 ]",
+ "[ 0/1 → 1/2 | s:bd bandf:500 bandq:0 ]",
+ "[ 1/2 → 1/1 | s:sd bandf:500 bandq:0 ]",
+ "[ 1/1 → 3/2 | s:bd bandf:500 bandq:1 ]",
+ "[ 3/2 → 2/1 | s:sd bandf:500 bandq:1 ]",
+ "[ 2/1 → 5/2 | s:bd bandf:500 bandq:2 ]",
+ "[ 5/2 → 3/1 | s:sd bandf:500 bandq:2 ]",
+ "[ 3/1 → 7/2 | s:bd bandf:500 bandq:3 ]",
+ "[ 7/2 → 4/1 | s:sd bandf:500 bandq:3 ]",
]
`;
@@ -1399,6 +1416,19 @@ exports[`runs examples > example "delay" example index 0 1`] = `
]
`;
+exports[`runs examples > example "delay" example index 1 1`] = `
+[
+ "[ 0/1 → 1/2 | s:bd delay:0.65 delaytime:0.25 delayfeedback:0.9 ]",
+ "[ 1/2 → 1/1 | s:bd delay:0.65 delaytime:0.125 delayfeedback:0.7 ]",
+ "[ 1/1 → 3/2 | s:bd delay:0.65 delaytime:0.25 delayfeedback:0.9 ]",
+ "[ 3/2 → 2/1 | s:bd delay:0.65 delaytime:0.125 delayfeedback:0.7 ]",
+ "[ 2/1 → 5/2 | s:bd delay:0.65 delaytime:0.25 delayfeedback:0.9 ]",
+ "[ 5/2 → 3/1 | s:bd delay:0.65 delaytime:0.125 delayfeedback:0.7 ]",
+ "[ 3/1 → 7/2 | s:bd delay:0.65 delaytime:0.25 delayfeedback:0.9 ]",
+ "[ 7/2 → 4/1 | s:bd delay:0.65 delaytime:0.125 delayfeedback:0.7 ]",
+]
+`;
+
exports[`runs examples > example "delayfeedback" example index 0 1`] = `
[
"[ (0/1 → 1/1) ⇝ 2/1 | s:bd delay:0.25 delayfeedback:0.25 ]",
@@ -1896,78 +1926,107 @@ exports[`runs examples > example "gain" example index 0 1`] = `
exports[`runs examples > example "hpf" example index 0 1`] = `
[
- "[ 0/1 → 1/2 | s:bd hpf:4000 ]",
- "[ 1/2 → 1/1 | s:sd hpf:4000 ]",
- "[ 0/1 → 1/4 | s:hh hpf:4000 ]",
- "[ 1/4 → 1/2 | s:hh hpf:4000 ]",
- "[ 1/2 → 3/4 | s:hh hpf:4000 ]",
- "[ 3/4 → 1/1 | s:hh hpf:4000 ]",
- "[ 1/1 → 3/2 | s:bd hpf:2000 ]",
- "[ 3/2 → 2/1 | s:sd hpf:2000 ]",
- "[ 1/1 → 5/4 | s:hh hpf:2000 ]",
- "[ 5/4 → 3/2 | s:hh hpf:2000 ]",
- "[ 3/2 → 7/4 | s:hh hpf:2000 ]",
- "[ 7/4 → 2/1 | s:hh hpf:2000 ]",
- "[ 2/1 → 5/2 | s:bd hpf:1000 ]",
- "[ 5/2 → 3/1 | s:sd hpf:1000 ]",
- "[ 2/1 → 9/4 | s:hh hpf:1000 ]",
- "[ 9/4 → 5/2 | s:hh hpf:1000 ]",
- "[ 5/2 → 11/4 | s:hh hpf:1000 ]",
- "[ 11/4 → 3/1 | s:hh hpf:1000 ]",
- "[ 3/1 → 7/2 | s:bd hpf:500 ]",
- "[ 7/2 → 4/1 | s:sd hpf:500 ]",
- "[ 3/1 → 13/4 | s:hh hpf:500 ]",
- "[ 13/4 → 7/2 | s:hh hpf:500 ]",
- "[ 7/2 → 15/4 | s:hh hpf:500 ]",
- "[ 15/4 → 4/1 | s:hh hpf:500 ]",
+ "[ 0/1 → 1/2 | s:bd hcutoff:4000 ]",
+ "[ 1/2 → 1/1 | s:sd hcutoff:4000 ]",
+ "[ 0/1 → 1/4 | s:hh hcutoff:4000 ]",
+ "[ 1/4 → 1/2 | s:hh hcutoff:4000 ]",
+ "[ 1/2 → 3/4 | s:hh hcutoff:4000 ]",
+ "[ 3/4 → 1/1 | s:hh hcutoff:4000 ]",
+ "[ 1/1 → 3/2 | s:bd hcutoff:2000 ]",
+ "[ 3/2 → 2/1 | s:sd hcutoff:2000 ]",
+ "[ 1/1 → 5/4 | s:hh hcutoff:2000 ]",
+ "[ 5/4 → 3/2 | s:hh hcutoff:2000 ]",
+ "[ 3/2 → 7/4 | s:hh hcutoff:2000 ]",
+ "[ 7/4 → 2/1 | s:hh hcutoff:2000 ]",
+ "[ 2/1 → 5/2 | s:bd hcutoff:1000 ]",
+ "[ 5/2 → 3/1 | s:sd hcutoff:1000 ]",
+ "[ 2/1 → 9/4 | s:hh hcutoff:1000 ]",
+ "[ 9/4 → 5/2 | s:hh hcutoff:1000 ]",
+ "[ 5/2 → 11/4 | s:hh hcutoff:1000 ]",
+ "[ 11/4 → 3/1 | s:hh hcutoff:1000 ]",
+ "[ 3/1 → 7/2 | s:bd hcutoff:500 ]",
+ "[ 7/2 → 4/1 | s:sd hcutoff:500 ]",
+ "[ 3/1 → 13/4 | s:hh hcutoff:500 ]",
+ "[ 13/4 → 7/2 | s:hh hcutoff:500 ]",
+ "[ 7/2 → 15/4 | s:hh hcutoff:500 ]",
+ "[ 15/4 → 4/1 | s:hh hcutoff:500 ]",
+]
+`;
+
+exports[`runs examples > example "hpf" example index 1 1`] = `
+[
+ "[ 0/1 → 1/2 | s:bd hcutoff:2000 ]",
+ "[ 1/2 → 1/1 | s:sd hcutoff:2000 ]",
+ "[ 0/1 → 1/4 | s:hh hcutoff:2000 ]",
+ "[ 1/4 → 1/2 | s:hh hcutoff:2000 ]",
+ "[ 1/2 → 3/4 | s:hh hcutoff:2000 ]",
+ "[ 3/4 → 1/1 | s:hh hcutoff:2000 ]",
+ "[ 1/1 → 3/2 | s:bd hcutoff:2000 hresonance:25 ]",
+ "[ 3/2 → 2/1 | s:sd hcutoff:2000 hresonance:25 ]",
+ "[ 1/1 → 5/4 | s:hh hcutoff:2000 hresonance:25 ]",
+ "[ 5/4 → 3/2 | s:hh hcutoff:2000 hresonance:25 ]",
+ "[ 3/2 → 7/4 | s:hh hcutoff:2000 hresonance:25 ]",
+ "[ 7/4 → 2/1 | s:hh hcutoff:2000 hresonance:25 ]",
+ "[ 2/1 → 5/2 | s:bd hcutoff:2000 ]",
+ "[ 5/2 → 3/1 | s:sd hcutoff:2000 ]",
+ "[ 2/1 → 9/4 | s:hh hcutoff:2000 ]",
+ "[ 9/4 → 5/2 | s:hh hcutoff:2000 ]",
+ "[ 5/2 → 11/4 | s:hh hcutoff:2000 ]",
+ "[ 11/4 → 3/1 | s:hh hcutoff:2000 ]",
+ "[ 3/1 → 7/2 | s:bd hcutoff:2000 hresonance:25 ]",
+ "[ 7/2 → 4/1 | s:sd hcutoff:2000 hresonance:25 ]",
+ "[ 3/1 → 13/4 | s:hh hcutoff:2000 hresonance:25 ]",
+ "[ 13/4 → 7/2 | s:hh hcutoff:2000 hresonance:25 ]",
+ "[ 7/2 → 15/4 | s:hh hcutoff:2000 hresonance:25 ]",
+ "[ 15/4 → 4/1 | s:hh hcutoff:2000 hresonance:25 ]",
]
`;
exports[`runs examples > example "hpq" example index 0 1`] = `
[
- "[ 0/1 → 1/2 | s:bd hpf:2000 hpq:0 ]",
- "[ 1/2 → 1/1 | s:sd hpf:2000 hpq:0 ]",
- "[ 0/1 → 1/4 | s:hh hpf:2000 hpq:0 ]",
- "[ 1/4 → 1/2 | s:hh hpf:2000 hpq:0 ]",
- "[ 1/2 → 3/4 | s:hh hpf:2000 hpq:0 ]",
- "[ 3/4 → 1/1 | s:hh hpf:2000 hpq:0 ]",
- "[ 1/1 → 3/2 | s:bd hpf:2000 hpq:10 ]",
- "[ 3/2 → 2/1 | s:sd hpf:2000 hpq:10 ]",
- "[ 1/1 → 5/4 | s:hh hpf:2000 hpq:10 ]",
- "[ 5/4 → 3/2 | s:hh hpf:2000 hpq:10 ]",
- "[ 3/2 → 7/4 | s:hh hpf:2000 hpq:10 ]",
- "[ 7/4 → 2/1 | s:hh hpf:2000 hpq:10 ]",
- "[ 2/1 → 5/2 | s:bd hpf:2000 hpq:20 ]",
- "[ 5/2 → 3/1 | s:sd hpf:2000 hpq:20 ]",
- "[ 2/1 → 9/4 | s:hh hpf:2000 hpq:20 ]",
- "[ 9/4 → 5/2 | s:hh hpf:2000 hpq:20 ]",
- "[ 5/2 → 11/4 | s:hh hpf:2000 hpq:20 ]",
- "[ 11/4 → 3/1 | s:hh hpf:2000 hpq:20 ]",
- "[ 3/1 → 7/2 | s:bd hpf:2000 hpq:30 ]",
- "[ 7/2 → 4/1 | s:sd hpf:2000 hpq:30 ]",
- "[ 3/1 → 13/4 | s:hh hpf:2000 hpq:30 ]",
- "[ 13/4 → 7/2 | s:hh hpf:2000 hpq:30 ]",
- "[ 7/2 → 15/4 | s:hh hpf:2000 hpq:30 ]",
- "[ 15/4 → 4/1 | s:hh hpf:2000 hpq:30 ]",
+ "[ 0/1 → 1/2 | s:bd hcutoff:2000 hresonance:0 ]",
+ "[ 1/2 → 1/1 | s:sd hcutoff:2000 hresonance:0 ]",
+ "[ 0/1 → 1/4 | s:hh hcutoff:2000 hresonance:0 ]",
+ "[ 1/4 → 1/2 | s:hh hcutoff:2000 hresonance:0 ]",
+ "[ 1/2 → 3/4 | s:hh hcutoff:2000 hresonance:0 ]",
+ "[ 3/4 → 1/1 | s:hh hcutoff:2000 hresonance:0 ]",
+ "[ 1/1 → 3/2 | s:bd hcutoff:2000 hresonance:10 ]",
+ "[ 3/2 → 2/1 | s:sd hcutoff:2000 hresonance:10 ]",
+ "[ 1/1 → 5/4 | s:hh hcutoff:2000 hresonance:10 ]",
+ "[ 5/4 → 3/2 | s:hh hcutoff:2000 hresonance:10 ]",
+ "[ 3/2 → 7/4 | s:hh hcutoff:2000 hresonance:10 ]",
+ "[ 7/4 → 2/1 | s:hh hcutoff:2000 hresonance:10 ]",
+ "[ 2/1 → 5/2 | s:bd hcutoff:2000 hresonance:20 ]",
+ "[ 5/2 → 3/1 | s:sd hcutoff:2000 hresonance:20 ]",
+ "[ 2/1 → 9/4 | s:hh hcutoff:2000 hresonance:20 ]",
+ "[ 9/4 → 5/2 | s:hh hcutoff:2000 hresonance:20 ]",
+ "[ 5/2 → 11/4 | s:hh hcutoff:2000 hresonance:20 ]",
+ "[ 11/4 → 3/1 | s:hh hcutoff:2000 hresonance:20 ]",
+ "[ 3/1 → 7/2 | s:bd hcutoff:2000 hresonance:30 ]",
+ "[ 7/2 → 4/1 | s:sd hcutoff:2000 hresonance:30 ]",
+ "[ 3/1 → 13/4 | s:hh hcutoff:2000 hresonance:30 ]",
+ "[ 13/4 → 7/2 | s:hh hcutoff:2000 hresonance:30 ]",
+ "[ 7/2 → 15/4 | s:hh hcutoff:2000 hresonance:30 ]",
+ "[ 15/4 → 4/1 | s:hh hcutoff:2000 hresonance:30 ]",
]
`;
exports[`runs examples > example "hurry" example index 0 1`] = `
[
"[ 0/1 → 3/4 | s:bd speed:1 ]",
- "[ (3/4 → 1/1) ⇝ 3/2 | s:sd:2 speed:1 ]",
- "[ 3/4 ⇜ (1/1 → 3/2) | s:sd:2 speed:1 ]",
+ "[ (3/4 → 1/1) ⇝ 3/2 | s:sd n:2 speed:1 ]",
+ "[ 3/4 ⇜ (1/1 → 3/2) | s:sd n:2 speed:1 ]",
"[ 3/2 → 15/8 | s:bd speed:2 ]",
- "[ (15/8 → 2/1) ⇝ 9/4 | s:sd:2 speed:2 ]",
- "[ 15/8 ⇜ (2/1 → 9/4) | s:sd:2 speed:2 ]",
+ "[ (15/8 → 2/1) ⇝ 9/4 | s:sd n:2 speed:2 ]",
+ "[ 15/8 ⇜ (2/1 → 9/4) | s:sd n:2 speed:2 ]",
"[ 9/4 → 21/8 | s:bd speed:2 ]",
- "[ 21/8 → 3/1 | s:sd:2 speed:2 ]",
+ "[ 21/8 → 3/1 | s:sd n:2 speed:2 ]",
"[ 3/1 → 51/16 | s:bd speed:4 ]",
- "[ 51/16 → 27/8 | s:sd:2 speed:4 ]",
+ "[ 51/16 → 27/8 | s:sd n:2 speed:4 ]",
"[ 27/8 → 57/16 | s:bd speed:4 ]",
- "[ 57/16 → 15/4 | s:sd:2 speed:4 ]",
+ "[ 57/16 → 15/4 | s:sd n:2 speed:4 ]",
"[ 15/4 → 63/16 | s:bd speed:4 ]",
- "[ (63/16 → 4/1) ⇝ 33/8 | s:sd:2 speed:4 ]",
+ "[ (63/16 → 4/1) ⇝ 33/8 | s:sd n:2 speed:4 ]",
]
`;
@@ -2383,55 +2442,92 @@ exports[`runs examples > example "loopAtCps" example index 0 1`] = `
exports[`runs examples > example "lpf" example index 0 1`] = `
[
- "[ 0/1 → 1/2 | s:bd lpf:4000 ]",
- "[ 1/2 → 1/1 | s:sd lpf:4000 ]",
- "[ 0/1 → 1/3 | s:hh lpf:4000 ]",
- "[ 1/3 → 2/3 | s:hh lpf:4000 ]",
- "[ 2/3 → 1/1 | s:hh lpf:4000 ]",
- "[ 1/1 → 3/2 | s:bd lpf:2000 ]",
- "[ 3/2 → 2/1 | s:sd lpf:2000 ]",
- "[ 1/1 → 4/3 | s:hh lpf:2000 ]",
- "[ 4/3 → 5/3 | s:hh lpf:2000 ]",
- "[ 5/3 → 2/1 | s:hh lpf:2000 ]",
- "[ 2/1 → 5/2 | s:bd lpf:1000 ]",
- "[ 5/2 → 3/1 | s:sd lpf:1000 ]",
- "[ 2/1 → 7/3 | s:hh lpf:1000 ]",
- "[ 7/3 → 8/3 | s:hh lpf:1000 ]",
- "[ 8/3 → 3/1 | s:hh lpf:1000 ]",
- "[ 3/1 → 7/2 | s:bd lpf:500 ]",
- "[ 7/2 → 4/1 | s:sd lpf:500 ]",
- "[ 3/1 → 10/3 | s:hh lpf:500 ]",
- "[ 10/3 → 11/3 | s:hh lpf:500 ]",
- "[ 11/3 → 4/1 | s:hh lpf:500 ]",
+ "[ 0/1 → 1/2 | s:bd cutoff:4000 ]",
+ "[ 1/2 → 1/1 | s:sd cutoff:4000 ]",
+ "[ 0/1 → 1/3 | s:hh cutoff:4000 ]",
+ "[ 1/3 → 2/3 | s:hh cutoff:4000 ]",
+ "[ 2/3 → 1/1 | s:hh cutoff:4000 ]",
+ "[ 1/1 → 3/2 | s:bd cutoff:2000 ]",
+ "[ 3/2 → 2/1 | s:sd cutoff:2000 ]",
+ "[ 1/1 → 4/3 | s:hh cutoff:2000 ]",
+ "[ 4/3 → 5/3 | s:hh cutoff:2000 ]",
+ "[ 5/3 → 2/1 | s:hh cutoff:2000 ]",
+ "[ 2/1 → 5/2 | s:bd cutoff:1000 ]",
+ "[ 5/2 → 3/1 | s:sd cutoff:1000 ]",
+ "[ 2/1 → 7/3 | s:hh cutoff:1000 ]",
+ "[ 7/3 → 8/3 | s:hh cutoff:1000 ]",
+ "[ 8/3 → 3/1 | s:hh cutoff:1000 ]",
+ "[ 3/1 → 7/2 | s:bd cutoff:500 ]",
+ "[ 7/2 → 4/1 | s:sd cutoff:500 ]",
+ "[ 3/1 → 10/3 | s:hh cutoff:500 ]",
+ "[ 10/3 → 11/3 | s:hh cutoff:500 ]",
+ "[ 11/3 → 4/1 | s:hh cutoff:500 ]",
+]
+`;
+
+exports[`runs examples > example "lpf" example index 1 1`] = `
+[
+ "[ 0/1 → 1/8 | s:bd cutoff:1000 resonance:0 ]",
+ "[ 1/8 → 1/4 | s:bd cutoff:1000 resonance:0 ]",
+ "[ 1/4 → 3/8 | s:bd cutoff:1000 resonance:10 ]",
+ "[ 3/8 → 1/2 | s:bd cutoff:1000 resonance:10 ]",
+ "[ 1/2 → 5/8 | s:bd cutoff:1000 resonance:20 ]",
+ "[ 5/8 → 3/4 | s:bd cutoff:1000 resonance:20 ]",
+ "[ 3/4 → 7/8 | s:bd cutoff:1000 resonance:30 ]",
+ "[ 7/8 → 1/1 | s:bd cutoff:1000 resonance:30 ]",
+ "[ 1/1 → 9/8 | s:bd cutoff:1000 resonance:0 ]",
+ "[ 9/8 → 5/4 | s:bd cutoff:1000 resonance:0 ]",
+ "[ 5/4 → 11/8 | s:bd cutoff:1000 resonance:10 ]",
+ "[ 11/8 → 3/2 | s:bd cutoff:1000 resonance:10 ]",
+ "[ 3/2 → 13/8 | s:bd cutoff:1000 resonance:20 ]",
+ "[ 13/8 → 7/4 | s:bd cutoff:1000 resonance:20 ]",
+ "[ 7/4 → 15/8 | s:bd cutoff:1000 resonance:30 ]",
+ "[ 15/8 → 2/1 | s:bd cutoff:1000 resonance:30 ]",
+ "[ 2/1 → 17/8 | s:bd cutoff:1000 resonance:0 ]",
+ "[ 17/8 → 9/4 | s:bd cutoff:1000 resonance:0 ]",
+ "[ 9/4 → 19/8 | s:bd cutoff:1000 resonance:10 ]",
+ "[ 19/8 → 5/2 | s:bd cutoff:1000 resonance:10 ]",
+ "[ 5/2 → 21/8 | s:bd cutoff:1000 resonance:20 ]",
+ "[ 21/8 → 11/4 | s:bd cutoff:1000 resonance:20 ]",
+ "[ 11/4 → 23/8 | s:bd cutoff:1000 resonance:30 ]",
+ "[ 23/8 → 3/1 | s:bd cutoff:1000 resonance:30 ]",
+ "[ 3/1 → 25/8 | s:bd cutoff:1000 resonance:0 ]",
+ "[ 25/8 → 13/4 | s:bd cutoff:1000 resonance:0 ]",
+ "[ 13/4 → 27/8 | s:bd cutoff:1000 resonance:10 ]",
+ "[ 27/8 → 7/2 | s:bd cutoff:1000 resonance:10 ]",
+ "[ 7/2 → 29/8 | s:bd cutoff:1000 resonance:20 ]",
+ "[ 29/8 → 15/4 | s:bd cutoff:1000 resonance:20 ]",
+ "[ 15/4 → 31/8 | s:bd cutoff:1000 resonance:30 ]",
+ "[ 31/8 → 4/1 | s:bd cutoff:1000 resonance:30 ]",
]
`;
exports[`runs examples > example "lpq" example index 0 1`] = `
[
- "[ 0/1 → 1/2 | s:bd lpf:2000 lpq:0 ]",
- "[ 1/2 → 1/1 | s:sd lpf:2000 lpq:0 ]",
- "[ 0/1 → 1/4 | s:hh lpf:2000 lpq:0 ]",
- "[ 1/4 → 1/2 | s:hh lpf:2000 lpq:0 ]",
- "[ 1/2 → 3/4 | s:hh lpf:2000 lpq:0 ]",
- "[ 3/4 → 1/1 | s:hh lpf:2000 lpq:0 ]",
- "[ 1/1 → 3/2 | s:bd lpf:2000 lpq:10 ]",
- "[ 3/2 → 2/1 | s:sd lpf:2000 lpq:10 ]",
- "[ 1/1 → 5/4 | s:hh lpf:2000 lpq:10 ]",
- "[ 5/4 → 3/2 | s:hh lpf:2000 lpq:10 ]",
- "[ 3/2 → 7/4 | s:hh lpf:2000 lpq:10 ]",
- "[ 7/4 → 2/1 | s:hh lpf:2000 lpq:10 ]",
- "[ 2/1 → 5/2 | s:bd lpf:2000 lpq:20 ]",
- "[ 5/2 → 3/1 | s:sd lpf:2000 lpq:20 ]",
- "[ 2/1 → 9/4 | s:hh lpf:2000 lpq:20 ]",
- "[ 9/4 → 5/2 | s:hh lpf:2000 lpq:20 ]",
- "[ 5/2 → 11/4 | s:hh lpf:2000 lpq:20 ]",
- "[ 11/4 → 3/1 | s:hh lpf:2000 lpq:20 ]",
- "[ 3/1 → 7/2 | s:bd lpf:2000 lpq:30 ]",
- "[ 7/2 → 4/1 | s:sd lpf:2000 lpq:30 ]",
- "[ 3/1 → 13/4 | s:hh lpf:2000 lpq:30 ]",
- "[ 13/4 → 7/2 | s:hh lpf:2000 lpq:30 ]",
- "[ 7/2 → 15/4 | s:hh lpf:2000 lpq:30 ]",
- "[ 15/4 → 4/1 | s:hh lpf:2000 lpq:30 ]",
+ "[ 0/1 → 1/2 | s:bd cutoff:2000 resonance:0 ]",
+ "[ 1/2 → 1/1 | s:sd cutoff:2000 resonance:0 ]",
+ "[ 0/1 → 1/4 | s:hh cutoff:2000 resonance:0 ]",
+ "[ 1/4 → 1/2 | s:hh cutoff:2000 resonance:0 ]",
+ "[ 1/2 → 3/4 | s:hh cutoff:2000 resonance:0 ]",
+ "[ 3/4 → 1/1 | s:hh cutoff:2000 resonance:0 ]",
+ "[ 1/1 → 3/2 | s:bd cutoff:2000 resonance:10 ]",
+ "[ 3/2 → 2/1 | s:sd cutoff:2000 resonance:10 ]",
+ "[ 1/1 → 5/4 | s:hh cutoff:2000 resonance:10 ]",
+ "[ 5/4 → 3/2 | s:hh cutoff:2000 resonance:10 ]",
+ "[ 3/2 → 7/4 | s:hh cutoff:2000 resonance:10 ]",
+ "[ 7/4 → 2/1 | s:hh cutoff:2000 resonance:10 ]",
+ "[ 2/1 → 5/2 | s:bd cutoff:2000 resonance:20 ]",
+ "[ 5/2 → 3/1 | s:sd cutoff:2000 resonance:20 ]",
+ "[ 2/1 → 9/4 | s:hh cutoff:2000 resonance:20 ]",
+ "[ 9/4 → 5/2 | s:hh cutoff:2000 resonance:20 ]",
+ "[ 5/2 → 11/4 | s:hh cutoff:2000 resonance:20 ]",
+ "[ 11/4 → 3/1 | s:hh cutoff:2000 resonance:20 ]",
+ "[ 3/1 → 7/2 | s:bd cutoff:2000 resonance:30 ]",
+ "[ 7/2 → 4/1 | s:sd cutoff:2000 resonance:30 ]",
+ "[ 3/1 → 13/4 | s:hh cutoff:2000 resonance:30 ]",
+ "[ 13/4 → 7/2 | s:hh cutoff:2000 resonance:30 ]",
+ "[ 7/2 → 15/4 | s:hh cutoff:2000 resonance:30 ]",
+ "[ 15/4 → 4/1 | s:hh cutoff:2000 resonance:30 ]",
]
`;
@@ -3231,16 +3327,29 @@ exports[`runs examples > example "room" example index 0 1`] = `
]
`;
+exports[`runs examples > example "room" example index 1 1`] = `
+[
+ "[ 0/1 → 1/2 | s:bd room:0.9 size:1 ]",
+ "[ 1/2 → 1/1 | s:sd room:0.9 size:1 ]",
+ "[ 1/1 → 3/2 | s:bd room:0.9 size:4 ]",
+ "[ 3/2 → 2/1 | s:sd room:0.9 size:4 ]",
+ "[ 2/1 → 5/2 | s:bd room:0.9 size:1 ]",
+ "[ 5/2 → 3/1 | s:sd room:0.9 size:1 ]",
+ "[ 3/1 → 7/2 | s:bd room:0.9 size:4 ]",
+ "[ 7/2 → 4/1 | s:sd room:0.9 size:4 ]",
+]
+`;
+
exports[`runs examples > example "roomsize" example index 0 1`] = `
[
- "[ 0/1 → 1/2 | s:bd room:0.8 roomsize:0 ]",
- "[ 1/2 → 1/1 | s:sd room:0.8 roomsize:0 ]",
- "[ 1/1 → 3/2 | s:bd room:0.8 roomsize:1 ]",
- "[ 3/2 → 2/1 | s:sd room:0.8 roomsize:1 ]",
- "[ 2/1 → 5/2 | s:bd room:0.8 roomsize:2 ]",
- "[ 5/2 → 3/1 | s:sd room:0.8 roomsize:2 ]",
- "[ 3/1 → 7/2 | s:bd room:0.8 roomsize:4 ]",
- "[ 7/2 → 4/1 | s:sd room:0.8 roomsize:4 ]",
+ "[ 0/1 → 1/2 | s:bd room:0.8 size:0 ]",
+ "[ 1/2 → 1/1 | s:sd room:0.8 size:0 ]",
+ "[ 1/1 → 3/2 | s:bd room:0.8 size:1 ]",
+ "[ 3/2 → 2/1 | s:sd room:0.8 size:1 ]",
+ "[ 2/1 → 5/2 | s:bd room:0.8 size:2 ]",
+ "[ 5/2 → 3/1 | s:sd room:0.8 size:2 ]",
+ "[ 3/1 → 7/2 | s:bd room:0.8 size:4 ]",
+ "[ 7/2 → 4/1 | s:sd room:0.8 size:4 ]",
]
`;
@@ -3304,6 +3413,27 @@ exports[`runs examples > example "s" example index 0 1`] = `
]
`;
+exports[`runs examples > example "s" example index 1 1`] = `
+[
+ "[ 0/1 → 1/4 | s:bd n:0 ]",
+ "[ 1/4 → 1/2 | s:bd n:1 ]",
+ "[ 1/2 → 3/4 | s:bd n:0 gain:0.3 ]",
+ "[ 3/4 → 1/1 | s:bd n:1 gain:1.4 ]",
+ "[ 1/1 → 5/4 | s:bd n:0 ]",
+ "[ 5/4 → 3/2 | s:bd n:1 ]",
+ "[ 3/2 → 7/4 | s:bd n:0 gain:0.3 ]",
+ "[ 7/4 → 2/1 | s:bd n:1 gain:1.4 ]",
+ "[ 2/1 → 9/4 | s:bd n:0 ]",
+ "[ 9/4 → 5/2 | s:bd n:1 ]",
+ "[ 5/2 → 11/4 | s:bd n:0 gain:0.3 ]",
+ "[ 11/4 → 3/1 | s:bd n:1 gain:1.4 ]",
+ "[ 3/1 → 13/4 | s:bd n:0 ]",
+ "[ 13/4 → 7/2 | s:bd n:1 ]",
+ "[ 7/2 → 15/4 | s:bd n:0 gain:0.3 ]",
+ "[ 15/4 → 4/1 | s:bd n:1 gain:1.4 ]",
+]
+`;
+
exports[`runs examples > example "samples" example index 0 1`] = `
[
"[ 0/1 → 1/4 | s:bd ]",
@@ -3454,6 +3584,43 @@ exports[`runs examples > example "scale" example index 1 1`] = `
]
`;
+exports[`runs examples > example "scale" example index 2 1`] = `
+[
+ "[ 7/8 → 1/1 | note:C2 s:folkharp ]",
+ "[ 3/4 → 7/8 | note:D2 s:folkharp ]",
+ "[ 5/8 → 3/4 | note:E2 s:folkharp ]",
+ "[ 1/2 → 5/8 | note:F2 s:folkharp ]",
+ "[ 3/8 → 1/2 | note:G2 s:folkharp ]",
+ "[ 1/4 → 3/8 | note:A2 s:folkharp ]",
+ "[ 1/8 → 1/4 | note:B2 s:folkharp ]",
+ "[ 0/1 → 1/8 | note:C3 s:folkharp ]",
+ "[ 15/8 → 2/1 | note:C2 s:folkharp ]",
+ "[ 7/4 → 15/8 | note:D2 s:folkharp ]",
+ "[ 13/8 → 7/4 | note:Eb2 s:folkharp ]",
+ "[ 3/2 → 13/8 | note:F2 s:folkharp ]",
+ "[ 11/8 → 3/2 | note:G2 s:folkharp ]",
+ "[ 5/4 → 11/8 | note:Ab2 s:folkharp ]",
+ "[ 9/8 → 5/4 | note:Bb2 s:folkharp ]",
+ "[ 1/1 → 9/8 | note:C3 s:folkharp ]",
+ "[ 23/8 → 3/1 | note:C2 s:folkharp ]",
+ "[ 11/4 → 23/8 | note:D2 s:folkharp ]",
+ "[ 21/8 → 11/4 | note:E2 s:folkharp ]",
+ "[ 5/2 → 21/8 | note:F2 s:folkharp ]",
+ "[ 19/8 → 5/2 | note:G2 s:folkharp ]",
+ "[ 9/4 → 19/8 | note:A2 s:folkharp ]",
+ "[ 17/8 → 9/4 | note:B2 s:folkharp ]",
+ "[ 2/1 → 17/8 | note:C3 s:folkharp ]",
+ "[ 31/8 → 4/1 | note:C2 s:folkharp ]",
+ "[ 15/4 → 31/8 | note:D2 s:folkharp ]",
+ "[ 29/8 → 15/4 | note:Eb2 s:folkharp ]",
+ "[ 7/2 → 29/8 | note:F2 s:folkharp ]",
+ "[ 27/8 → 7/2 | note:G2 s:folkharp ]",
+ "[ 13/4 → 27/8 | note:Ab2 s:folkharp ]",
+ "[ 25/8 → 13/4 | note:Bb2 s:folkharp ]",
+ "[ 3/1 → 25/8 | note:C3 s:folkharp ]",
+]
+`;
+
exports[`runs examples > example "scaleTranspose" example index 0 1`] = `
[
"[ 0/1 → 1/2 | note:C3 ]",
@@ -3690,39 +3857,6 @@ exports[`runs examples > example "sine" example index 0 1`] = `
]
`;
-exports[`runs examples > example "slice" example index 0 1`] = `
-[
- "[ (15/16 → 1/1) ⇝ 9/8 | begin:0.25 end:0.375 _slices:8 s:breaks165 ]",
- "[ 3/4 → 15/16 | begin:0.375 end:0.5 _slices:8 s:breaks165 ]",
- "[ 21/32 → 3/4 | begin:0.5 end:0.625 _slices:8 s:breaks165 ]",
- "[ 9/16 → 21/32 | begin:0 end:0.125 _slices:8 s:breaks165 ]",
- "[ 3/8 → 9/16 | begin:0.625 end:0.75 _slices:8 s:breaks165 ]",
- "[ 3/16 → 3/8 | begin:0.75 end:0.875 _slices:8 s:breaks165 ]",
- "[ 0/1 → 3/16 | begin:0.875 end:1 _slices:8 s:breaks165 ]",
- "[ 21/16 → 3/2 | begin:0 end:0.125 _slices:8 s:breaks165 ]",
- "[ 9/8 → 21/16 | begin:0.125 end:0.25 _slices:8 s:breaks165 ]",
- "[ 15/16 ⇜ (1/1 → 9/8) | begin:0.25 end:0.375 _slices:8 s:breaks165 ]",
- "[ 3/2 → 27/16 | begin:0 end:0.125 _slices:8 s:breaks165 ]",
- "[ 27/16 → 15/8 | begin:0.125 end:0.25 _slices:8 s:breaks165 ]",
- "[ 15/8 → 63/32 | begin:0.25 end:0.375 _slices:8 s:breaks165 ]",
- "[ (63/32 → 2/1) ⇝ 33/16 | begin:0.25 end:0.375 _slices:8 s:breaks165 ]",
- "[ 63/32 ⇜ (2/1 → 33/16) | begin:0.25 end:0.375 _slices:8 s:breaks165 ]",
- "[ 33/16 → 9/4 | begin:0.375 end:0.5 _slices:8 s:breaks165 ]",
- "[ 9/4 → 75/32 | begin:0.5 end:0.625 _slices:8 s:breaks165 ]",
- "[ 75/32 → 39/16 | begin:0 end:0.125 _slices:8 s:breaks165 ]",
- "[ 39/16 → 21/8 | begin:0.625 end:0.75 _slices:8 s:breaks165 ]",
- "[ 21/8 → 45/16 | begin:0.75 end:0.875 _slices:8 s:breaks165 ]",
- "[ 45/16 → 3/1 | begin:0.875 end:1 _slices:8 s:breaks165 ]",
- "[ 3/1 → 51/16 | begin:0 end:0.125 _slices:8 s:breaks165 ]",
- "[ 51/16 → 27/8 | begin:0.125 end:0.25 _slices:8 s:breaks165 ]",
- "[ 27/8 → 57/16 | begin:0.25 end:0.375 _slices:8 s:breaks165 ]",
- "[ 57/16 → 15/4 | begin:0.375 end:0.5 _slices:8 s:breaks165 ]",
- "[ 15/4 → 123/32 | begin:0.5 end:0.625 _slices:8 s:breaks165 ]",
- "[ 123/32 → 63/16 | begin:0 end:0.125 _slices:8 s:breaks165 ]",
- "[ (63/16 → 4/1) ⇝ 33/8 | begin:0.625 end:0.75 _slices:8 s:breaks165 ]",
-]
-`;
-
exports[`runs examples > example "slow" example index 0 1`] = `
[
"[ 0/1 → 1/1 | s:bd ]",
@@ -3848,36 +3982,6 @@ exports[`runs examples > example "speed" example index 1 1`] = `
]
`;
-exports[`runs examples > example "splice" example index 0 1`] = `
-[
- "[ 0/1 → 5/26 | speed:0.65 unit:c begin:0 end:0.125 _slices:8 s:breaks165 ]",
- "[ 5/26 → 5/13 | speed:0.65 unit:c begin:0.125 end:0.25 _slices:8 s:breaks165 ]",
- "[ 5/13 → 20/39 | speed:0.9750000000000001 unit:c begin:0.25 end:0.375 _slices:8 s:breaks165 ]",
- "[ 20/39 → 25/39 | speed:0.9750000000000001 unit:c begin:0.375 end:0.5 _slices:8 s:breaks165 ]",
- "[ 25/39 → 10/13 | speed:0.9750000000000001 unit:c begin:0 end:0.125 _slices:8 s:breaks165 ]",
- "[ 10/13 → 25/26 | speed:0.65 unit:c begin:0.375 end:0.5 _slices:8 s:breaks165 ]",
- "[ (25/26 → 1/1) ⇝ 35/26 | speed:0.325 unit:c begin:0 end:0.125 _slices:8 s:breaks165 ]",
- "[ 25/26 ⇜ (1/1 → 35/26) | speed:0.325 unit:c begin:0 end:0.125 _slices:8 s:breaks165 ]",
- "[ 35/26 → 20/13 | speed:0.65 unit:c begin:0.875 end:1 _slices:8 s:breaks165 ]",
- "[ 20/13 → 45/26 | speed:0.65 unit:c begin:0 end:0.125 _slices:8 s:breaks165 ]",
- "[ 45/26 → 25/13 | speed:0.65 unit:c begin:0.125 end:0.25 _slices:8 s:breaks165 ]",
- "[ (25/13 → 2/1) ⇝ 80/39 | speed:0.9750000000000001 unit:c begin:0.25 end:0.375 _slices:8 s:breaks165 ]",
- "[ 25/13 ⇜ (2/1 → 80/39) | speed:0.9750000000000001 unit:c begin:0.25 end:0.375 _slices:8 s:breaks165 ]",
- "[ 80/39 → 85/39 | speed:0.9750000000000001 unit:c begin:0.375 end:0.5 _slices:8 s:breaks165 ]",
- "[ 85/39 → 30/13 | speed:0.9750000000000001 unit:c begin:0 end:0.125 _slices:8 s:breaks165 ]",
- "[ 30/13 → 5/2 | speed:0.65 unit:c begin:0.375 end:0.5 _slices:8 s:breaks165 ]",
- "[ 5/2 → 75/26 | speed:0.325 unit:c begin:0 end:0.125 _slices:8 s:breaks165 ]",
- "[ (75/26 → 3/1) ⇝ 40/13 | speed:0.65 unit:c begin:0.875 end:1 _slices:8 s:breaks165 ]",
- "[ 75/26 ⇜ (3/1 → 40/13) | speed:0.65 unit:c begin:0.875 end:1 _slices:8 s:breaks165 ]",
- "[ 40/13 → 85/26 | speed:0.65 unit:c begin:0 end:0.125 _slices:8 s:breaks165 ]",
- "[ 85/26 → 45/13 | speed:0.65 unit:c begin:0.125 end:0.25 _slices:8 s:breaks165 ]",
- "[ 45/13 → 140/39 | speed:0.9750000000000001 unit:c begin:0.25 end:0.375 _slices:8 s:breaks165 ]",
- "[ 140/39 → 145/39 | speed:0.9750000000000001 unit:c begin:0.375 end:0.5 _slices:8 s:breaks165 ]",
- "[ 145/39 → 50/13 | speed:0.9750000000000001 unit:c begin:0 end:0.125 _slices:8 s:breaks165 ]",
- "[ (50/13 → 4/1) ⇝ 105/26 | speed:0.65 unit:c begin:0.375 end:0.5 _slices:8 s:breaks165 ]",
-]
-`;
-
exports[`runs examples > example "square" example index 0 1`] = `
[
"[ 0/1 → 1/2 | note:C3 ]",
@@ -4294,48 +4398,6 @@ exports[`runs examples > example "vowel" example index 0 1`] = `
]
`;
-exports[`runs examples > example "weave" example index 0 1`] = `
-[
- "[ 0/1 → 1/8 | pan:0.015625 s:bd ]",
- "[ 3/8 → 1/2 | pan:0.109375 s:bd ]",
- "[ 3/4 → 7/8 | pan:0.203125 s:bd ]",
- "[ 1/1 → 9/8 | pan:0.265625 s:bd ]",
- "[ 11/8 → 3/2 | pan:0.359375 s:bd ]",
- "[ 7/4 → 15/8 | pan:0.453125 s:bd ]",
- "[ 2/1 → 17/8 | pan:0.515625 s:bd ]",
- "[ 19/8 → 5/2 | pan:0.609375 s:bd ]",
- "[ 11/4 → 23/8 | pan:0.703125 s:bd ]",
- "[ 3/1 → 25/8 | pan:0.765625 s:bd ]",
- "[ 27/8 → 7/2 | pan:0.859375 s:bd ]",
- "[ 15/4 → 31/8 | pan:0.953125 s:bd ]",
- "[ 1/2 → 1/1 | pan:0.6875 s:sd ]",
- "[ 3/2 → 2/1 | pan:0.9375 s:sd ]",
- "[ 5/2 → 3/1 | pan:0.1875 s:sd ]",
- "[ 7/2 → 4/1 | pan:0.4375 s:sd ]",
-]
-`;
-
-exports[`runs examples > example "weave" example index 1 1`] = `
-[
- "[ 0/1 → 1/8 | n:0 s:bd ]",
- "[ 3/8 → 1/2 | n:0 s:bd ]",
- "[ 3/4 → 7/8 | n:0 s:bd ]",
- "[ 1/1 → 9/8 | n:1 s:bd ]",
- "[ 11/8 → 3/2 | n:1 s:bd ]",
- "[ 7/4 → 15/8 | n:1 s:bd ]",
- "[ 2/1 → 17/8 | n:2 s:bd ]",
- "[ 19/8 → 5/2 | n:2 s:bd ]",
- "[ 11/4 → 23/8 | n:2 s:bd ]",
- "[ 3/1 → 25/8 | n:3 s:bd ]",
- "[ 27/8 → 7/2 | n:3 s:bd ]",
- "[ 15/4 → 31/8 | n:3 s:bd ]",
- "[ 1/2 → 1/1 | n:4 s:sd ]",
- "[ 3/2 → 2/1 | n:5 s:sd ]",
- "[ 5/2 → 3/1 | n:6 s:sd ]",
- "[ 7/2 → 4/1 | n:7 s:sd ]",
-]
-`;
-
exports[`runs examples > example "webdirt" example index 0 1`] = `
[
"[ 0/1 → 1/8 | s:bd n:0 ]",
diff --git a/test/__snapshots__/tunes.test.mjs.snap b/test/__snapshots__/tunes.test.mjs.snap
index 5a0bb2db..0675938f 100644
--- a/test/__snapshots__/tunes.test.mjs.snap
+++ b/test/__snapshots__/tunes.test.mjs.snap
@@ -298,11 +298,11 @@ exports[`renders tunes > tune: bassFuge 1`] = `
"[ -3/4 ⇜ (0/1 → 3/4) ⇝ 5/4 | note:C5 s:flbass n:0 gain:0.3 cutoff:2924.3791043233605 resonance:10 clip:1 ]",
"[ -3/4 ⇜ (3/4 → 1/1) ⇝ 5/4 | note:A4 s:flbass n:0 gain:0.3 cutoff:2924.3791043233605 resonance:10 clip:1 ]",
"[ -3/4 ⇜ (3/4 → 1/1) ⇝ 5/4 | note:C5 s:flbass n:0 gain:0.3 cutoff:2924.3791043233605 resonance:10 clip:1 ]",
- "[ 0/1 → 1/2 | s:bd:1 ]",
- "[ 1/2 → 1/1 | s:bd:1 ]",
- "[ 1/2 → 1/1 | s:sd:0 ]",
- "[ 1/4 → 1/2 | s:hh:0 ]",
- "[ 3/4 → 1/1 | s:hh:0 ]",
+ "[ 0/1 → 1/2 | s:bd n:1 ]",
+ "[ 1/2 → 1/1 | s:bd n:1 ]",
+ "[ 1/2 → 1/1 | s:sd n:0 ]",
+ "[ 1/4 → 1/2 | s:hh n:0 ]",
+ "[ 3/4 → 1/1 | s:hh n:0 ]",
]
`;
@@ -313,7 +313,7 @@ exports[`renders tunes > tune: belldub 1`] = `
"[ (5/8 → 1/1) ⇝ 5/4 | s:hh room:0 end:0.04483079938329212 ]",
"[ 0/1 → 5/16 | s:mt gain:0.5 room:0.5 ]",
"[ (15/16 → 1/1) ⇝ 5/4 | s:lt gain:0.5 room:0.5 ]",
- "[ (0/1 → 1/1) ⇝ 5/1 | s:misc:2 speed:1 delay:0.5 delaytime:0.3333333333333333 gain:0.4 ]",
+ "[ (0/1 → 1/1) ⇝ 5/1 | s:misc n:2 speed:1 delay:0.5 delaytime:0.3333333333333333 gain:0.4 ]",
"[ (5/8 → 1/1) ⇝ 5/4 | note:F3 s:sawtooth gain:0.5 cutoff:400.16785462816676 decay:0.05380063255866716 sustain:0 delay:0.9 room:1 ]",
"[ (5/8 → 1/1) ⇝ 5/4 | note:A3 s:sawtooth gain:0.5 cutoff:400.16785462816676 decay:0.05380063255866716 sustain:0 delay:0.9 room:1 ]",
"[ (5/8 → 1/1) ⇝ 5/4 | note:Bb3 s:sawtooth gain:0.5 cutoff:400.16785462816676 decay:0.05380063255866716 sustain:0 delay:0.9 room:1 ]",
@@ -6974,16 +6974,16 @@ exports[`renders tunes > tune: flatrave 1`] = `
"[ 1/2 → 1/1 | s:bd bank:RolandTR909 ]",
"[ 1/2 → 1/1 | s:cp bank:RolandTR909 ]",
"[ 1/2 → 1/1 | s:sd bank:RolandTR909 ]",
- "[ 0/1 → 1/4 | s:hh:1 end:0.02000058072071123 bank:RolandTR909 room:0.5 gain:0.4 ]",
- "[ 0/1 ⇜ (1/8 → 1/4) | s:hh:1 end:0.02000058072071123 bank:RolandTR909 room:0.5 gain:0.4 ]",
- "[ 1/4 → 3/8 | s:hh:1 end:0.02000875429921906 bank:RolandTR909 room:0.5 gain:0.4 ]",
- "[ 1/4 → 3/8 | s:hh:1 end:0.02000875429921906 bank:RolandTR909 room:0.5 gain:0.4 ]",
- "[ 3/8 → 1/2 | s:hh:1 end:0.020023446730265706 bank:RolandTR909 room:0.5 gain:0.4 ]",
- "[ 5/8 → 3/4 | s:hh:1 end:0.020086608138500644 bank:RolandTR909 room:0.5 gain:0.4 ]",
- "[ 5/8 → 3/4 | s:hh:1 end:0.020086608138500644 bank:RolandTR909 room:0.5 gain:0.4 ]",
- "[ 3/4 → 7/8 | s:hh:1 end:0.02013941880355398 bank:RolandTR909 room:0.5 gain:0.4 ]",
- "[ 1/8 → 1/4 | s:hh:1 speed:0.5 delay:0.5 end:0.020001936784171157 bank:RolandTR909 room:0.5 gain:0.4 ]",
- "[ 1/8 → 1/4 | s:hh:1 speed:0.5 delay:0.5 end:0.020001936784171157 bank:RolandTR909 room:0.5 gain:0.4 ]",
+ "[ 0/1 → 1/4 | s:hh n:1 end:0.02000058072071123 bank:RolandTR909 room:0.5 gain:0.4 ]",
+ "[ 0/1 ⇜ (1/8 → 1/4) | s:hh n:1 end:0.02000058072071123 bank:RolandTR909 room:0.5 gain:0.4 ]",
+ "[ 1/4 → 3/8 | s:hh n:1 end:0.02000875429921906 bank:RolandTR909 room:0.5 gain:0.4 ]",
+ "[ 1/4 → 3/8 | s:hh n:1 end:0.02000875429921906 bank:RolandTR909 room:0.5 gain:0.4 ]",
+ "[ 3/8 → 1/2 | s:hh n:1 end:0.020023446730265706 bank:RolandTR909 room:0.5 gain:0.4 ]",
+ "[ 5/8 → 3/4 | s:hh n:1 end:0.020086608138500644 bank:RolandTR909 room:0.5 gain:0.4 ]",
+ "[ 5/8 → 3/4 | s:hh n:1 end:0.020086608138500644 bank:RolandTR909 room:0.5 gain:0.4 ]",
+ "[ 3/4 → 7/8 | s:hh n:1 end:0.02013941880355398 bank:RolandTR909 room:0.5 gain:0.4 ]",
+ "[ 1/8 → 1/4 | s:hh n:1 speed:0.5 delay:0.5 end:0.020001936784171157 bank:RolandTR909 room:0.5 gain:0.4 ]",
+ "[ 1/8 → 1/4 | s:hh n:1 speed:0.5 delay:0.5 end:0.020001936784171157 bank:RolandTR909 room:0.5 gain:0.4 ]",
"[ 1/8 → 1/4 | note:G1 s:sawtooth decay:0.1 sustain:0 ]",
"[ 1/4 → 3/8 | note:G1 s:sawtooth decay:0.1 sustain:0 ]",
"[ 1/2 → 5/8 | note:G1 s:sawtooth decay:0.1 sustain:0 ]",
@@ -8127,8 +8127,8 @@ exports[`renders tunes > tune: loungeSponge 1`] = `
exports[`renders tunes > tune: meltingsubmarine 1`] = `
[
- "[ (0/1 → 1/1) ⇝ 3/2 | s:bd:5 speed:0.7519542165100574 ]",
- "[ (3/4 → 1/1) ⇝ 3/2 | s:sd:1 speed:0.7931522866332671 ]",
+ "[ (0/1 → 1/1) ⇝ 3/2 | s:bd n:5 speed:0.7519542165100574 ]",
+ "[ (3/4 → 1/1) ⇝ 3/2 | s:sd n:1 speed:0.7931522866332671 ]",
"[ 3/8 → 3/4 | s:hh27 speed:0.7285963821098448 ]",
"[ (3/4 → 1/1) ⇝ 9/8 | s:hh27 speed:0.77531205091027 ]",
"[ (0/1 → 1/1) ⇝ 3/2 | note:33.129885541275144 decay:0.15 sustain:0 s:sawtooth gain:0.4 cutoff:3669.6267869262615 ]",
@@ -8364,15 +8364,15 @@ exports[`renders tunes > tune: randomBells 1`] = `
exports[`renders tunes > tune: sampleDemo 1`] = `
[
- "[ 0/1 → 1/4 | s:woodblock:1 ]",
- "[ 1/4 → 3/8 | s:woodblock:2 ]",
- "[ 0/1 → 1/8 | s:brakedrum:1 ]",
- "[ 3/4 → 7/8 | s:brakedrum:1 ]",
- "[ 3/8 → 1/2 | s:woodblock:2 speed:2 ]",
- "[ 1/2 → 1/1 | s:snare_rim:0 speed:2 ]",
+ "[ 0/1 → 1/4 | s:woodblock n:1 ]",
+ "[ 1/4 → 3/8 | s:woodblock n:2 ]",
+ "[ 0/1 → 1/8 | s:brakedrum n:1 ]",
+ "[ 3/4 → 7/8 | s:brakedrum n:1 ]",
+ "[ 3/8 → 1/2 | s:woodblock n:2 speed:2 ]",
+ "[ 1/2 → 1/1 | s:snare_rim n:0 speed:2 ]",
"[ (0/1 → 1/1) ⇝ 8/1 | s:gong speed:2 ]",
- "[ 3/8 → 1/2 | s:brakedrum:1 speed:2 ]",
- "[ 3/4 → 1/1 | s:cowbell:3 speed:2 ]",
+ "[ 3/8 → 1/2 | s:brakedrum n:1 speed:2 ]",
+ "[ 3/4 → 1/1 | s:cowbell n:3 speed:2 ]",
"[ -3/4 ⇜ (0/1 → 1/4) | note:Bb3 s:clavisynth gain:0.2 delay:0.25 pan:0 ]",
"[ (3/4 → 1/1) ⇝ 7/4 | note:Bb3 s:clavisynth gain:0.2 delay:0.25 pan:1 ]",
"[ -1/4 ⇜ (0/1 → 3/4) | note:F3 s:clavisynth gain:0.2 delay:0.25 pan:1 ]",
diff --git a/website/public/dependencygraph.svg b/website/public/dependencygraph.svg
new file mode 100644
index 00000000..62fadac7
--- /dev/null
+++ b/website/public/dependencygraph.svg
@@ -0,0 +1,326 @@
+
\ No newline at end of file
diff --git a/website/public/pwa/strudel-linux.png b/website/public/pwa/strudel-linux.png
new file mode 100644
index 00000000..b60edf70
Binary files /dev/null and b/website/public/pwa/strudel-linux.png differ
diff --git a/website/public/pwa/strudel-macos.png b/website/public/pwa/strudel-macos.png
new file mode 100644
index 00000000..cb907d16
Binary files /dev/null and b/website/public/pwa/strudel-macos.png differ
diff --git a/website/src/components/HeadCommon.astro b/website/src/components/HeadCommon.astro
index 24388a20..9e81b0b8 100644
--- a/website/src/components/HeadCommon.astro
+++ b/website/src/components/HeadCommon.astro
@@ -78,7 +78,7 @@ const base = BASE_URL;
// https://medium.com/quick-code/100vh-problem-with-ios-safari-92ab23c852a8
const appHeight = () => {
const doc = document.documentElement;
- doc.style.setProperty('--app-height', `${window.innerHeight}px`);
+ doc.style.setProperty('--app-height', `${window.innerHeight - 1}px`);
};
if (typeof window !== 'undefined') {
window.addEventListener('resize', appHeight);
diff --git a/website/src/components/Header/Header.astro b/website/src/components/Header/Header.astro
index 4055a641..9e2a34c8 100644
--- a/website/src/components/Header/Header.astro
+++ b/website/src/components/Header/Header.astro
@@ -19,7 +19,10 @@ const langCode = 'en'; // getLanguageFromURL(currentPage);
const sidebar = SIDEBAR[langCode];
---
-