From 43293dc80f203932e17e841eb6e866862d15fdee Mon Sep 17 00:00:00 2001 From: robmckinnon Date: Sat, 28 Jun 2025 19:13:41 +0100 Subject: [PATCH] Import packages/edo into strudel --- examples/codemirror-repl/main.js | 1 + examples/codemirror-repl/package.json | 1 + index.mjs | 1 + package.json | 1 + packages/edo/edo.mjs | 41 ++++++++++- packages/edo/pitches.mjs | 2 +- packages/repl/package.json | 1 + packages/repl/prebake.mjs | 1 + packages/web/package.json | 1 + packages/web/web.mjs | 2 + pnpm-lock.yaml | 38 ++++++++++ test/__snapshots__/examples.test.mjs.snap | 87 +++++++++++++++++++++++ test/runtime.mjs | 2 + website/package.json | 1 + website/src/repl/util.mjs | 1 + 15 files changed, 179 insertions(+), 2 deletions(-) diff --git a/examples/codemirror-repl/main.js b/examples/codemirror-repl/main.js index 5b5714fb7..5b5f20289 100644 --- a/examples/codemirror-repl/main.js +++ b/examples/codemirror-repl/main.js @@ -29,6 +29,7 @@ const editor = new StrudelMirror({ import('@strudel/core'), import('@strudel/draw'), import('@strudel/mini'), + import('@strudel/edo'), import('@strudel/tonal'), import('@strudel/webaudio'), ); diff --git a/examples/codemirror-repl/package.json b/examples/codemirror-repl/package.json index e0ce35b8a..55b152f36 100644 --- a/examples/codemirror-repl/package.json +++ b/examples/codemirror-repl/package.json @@ -15,6 +15,7 @@ "@strudel/codemirror": "workspace:*", "@strudel/core": "workspace:*", "@strudel/draw": "workspace:*", + "@strudel/edo": "workspace:*", "@strudel/mini": "workspace:*", "@strudel/soundfonts": "workspace:*", "@strudel/tonal": "workspace:*", diff --git a/index.mjs b/index.mjs index 08339bdea..6576be47f 100644 --- a/index.mjs +++ b/index.mjs @@ -4,6 +4,7 @@ export * from './packages/core/index.mjs'; export * from './packages/csound/index.mjs'; export * from './packages/desktopbridge/index.mjs'; export * from './packages/draw/index.mjs'; +export * from './packages/edo/index.mjs'; export * from './packages/embed/index.mjs'; export * from './packages/hydra/index.mjs'; export * from './packages/midi/index.mjs'; diff --git a/package.json b/package.json index d18291eb2..399bd7b10 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "homepage": "https://strudel.cc", "dependencies": { "@strudel/core": "workspace:*", + "@strudel/edo": "workspace:*", "@strudel/mini": "workspace:*", "@strudel/tonal": "workspace:*", "@strudel/transpiler": "workspace:*", diff --git a/packages/edo/edo.mjs b/packages/edo/edo.mjs index 22e44be68..1e99c2434 100644 --- a/packages/edo/edo.mjs +++ b/packages/edo/edo.mjs @@ -11,6 +11,45 @@ import { Pitches } from './pitches.mjs'; const pitchesCache = new Map(); +/** + * Turns numbers into notes in the given EDO scale (zero indexed). + * + * An EDO scale definition looks like this: + * + * e.g. C:LLsLLLs:2:1 <- this is the C major scale, 12 EDO + * + * e.g. C:LLsLLL:3:1 <- this is the Gorgo 6 note scale, 16 EDO + * + * An EDO scale, e.g. C:LLsLLLs:2:1, consists of a root note (e.g. C) + * followed by semicolon (':') + * and then a [Large/small step notation sequence](https://en.xen.wiki/w/MOS_scale) + * (e.g. LLsLLLs) + * followed by semicolon, then the large step size (e.g. 2) + * followed by semicolon, then the small step size (e.g. 1). + * + * The number of divisions of the octave is calculated as the sum + * of the steps in the EDO scale definition. + * + * e.g. C:LLsLLLs:2:1 is 2+2+1+2+2+2+1 = 12 EDO, 7 note scale + * + * e.g. C:LLsLLL:3:1 is 3+3+1+3+3+3 = 16 EDO, 6 note scale + * + * The root note defaults to octave 3, if no octave number is given. + * + * @name edoScale + * @param {string} scale Definition of EDO scale. + * @returns Pattern + * @example + * n("0 2 4 6 4 2").edoScale("C:LLsLLLs:2:1") + * @example + * n("[0,7] 4 [2,7] 4") + * .edoScale("G2::3:1") + * .s("piano")._pitchwheel() + * @example + * n(rand.range(0,5).segment(6)) + * .edoScale(":LLsLL:3:1") + * .s("piano")._pitchwheel() + */ export const edoScale = register( 'edoScale', function (scaleDefinition, pat) { @@ -51,7 +90,7 @@ export const edoScale = register( // legacy.. return pure(n); } - const deg = (typeof n === 'string' ? parseInt(n, 10) : n) + 1; + const deg = (typeof n === 'string' ? parseInt(n, 10) : Number.isInteger(n) ? n : Math.round(n)) + 1; const [oct, degree] = pitches.octdeg(deg); const freq = pitches.octdegfreq(oct, degree); diff --git a/packages/edo/pitches.mjs b/packages/edo/pitches.mjs index 1cd5187bc..003e15b72 100644 --- a/packages/edo/pitches.mjs +++ b/packages/edo/pitches.mjs @@ -76,7 +76,7 @@ export class Pitches { const higherOcatve = deg > this.scale.length; const octave = this.root_octave + (higherOcatve ? Math.floor((deg - 1) / this.scale.length) : 0); const degree = higherOcatve ? (deg % this.scale.length === 0 ? this.scale.length : deg % this.scale.length) : deg; - console.log([octave, degree]); + // console.log([octave, degree]); return [octave, degree]; } diff --git a/packages/repl/package.json b/packages/repl/package.json index bfa404c75..8fae08f44 100644 --- a/packages/repl/package.json +++ b/packages/repl/package.json @@ -36,6 +36,7 @@ "@strudel/codemirror": "workspace:*", "@strudel/core": "workspace:*", "@strudel/draw": "workspace:*", + "@strudel/edo": "workspace:*", "@strudel/hydra": "workspace:*", "@strudel/midi": "workspace:*", "@strudel/mini": "workspace:*", diff --git a/packages/repl/prebake.mjs b/packages/repl/prebake.mjs index dd0023fb5..0c60101a5 100644 --- a/packages/repl/prebake.mjs +++ b/packages/repl/prebake.mjs @@ -8,6 +8,7 @@ export async function prebake() { core, import('@strudel/draw'), import('@strudel/mini'), + import('@strudel/edo'), import('@strudel/tonal'), import('@strudel/webaudio'), import('@strudel/codemirror'), diff --git a/packages/web/package.json b/packages/web/package.json index 0feddc82d..6d9e04300 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -34,6 +34,7 @@ "homepage": "https://codeberg.org/uzu/strudel#readme", "dependencies": { "@strudel/core": "workspace:*", + "@strudel/edo": "workspace:*", "@strudel/mini": "workspace:*", "@strudel/tonal": "workspace:*", "@strudel/transpiler": "workspace:*", diff --git a/packages/web/web.mjs b/packages/web/web.mjs index 2e2df84da..eebe6bdc1 100644 --- a/packages/web/web.mjs +++ b/packages/web/web.mjs @@ -3,6 +3,7 @@ export * from '@strudel/webaudio'; //export * from '@strudel/soundfonts'; export * from '@strudel/transpiler'; export * from '@strudel/mini'; +export * from '@strudel/edo'; export * from '@strudel/tonal'; export * from '@strudel/webaudio'; import { Pattern, evalScope, setTime } from '@strudel/core'; @@ -17,6 +18,7 @@ export async function defaultPrebake() { evalScope, import('@strudel/core'), import('@strudel/mini'), + import('@strudel/edo'), import('@strudel/tonal'), import('@strudel/webaudio'), { hush, evaluate }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7aecd35bd..c88da0784 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,9 @@ importers: '@strudel/core': specifier: workspace:* version: link:packages/core + '@strudel/edo': + specifier: workspace:* + version: link:packages/edo '@strudel/mini': specifier: workspace:* version: link:packages/mini @@ -93,6 +96,9 @@ importers: '@strudel/draw': specifier: workspace:* version: link:../../packages/draw + '@strudel/edo': + specifier: workspace:* + version: link:../../packages/edo '@strudel/mini': specifier: workspace:* version: link:../../packages/mini @@ -271,6 +277,28 @@ importers: specifier: ^6.0.11 version: 6.0.11(@types/node@22.10.10)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.37.0)(yaml@2.7.0) + packages/edo: + dependencies: + '@strudel/core': + specifier: workspace:* + version: link:../core + '@tonaljs/tonal': + specifier: ^4.10.0 + version: 4.10.0 + chord-voicings: + specifier: ^0.0.1 + version: 0.0.1 + webmidi: + specifier: ^3.1.12 + version: 3.1.12 + devDependencies: + vite: + specifier: ^6.0.11 + version: 6.0.11(@types/node@22.10.10)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.37.0)(yaml@2.7.0) + vitest: + specifier: ^3.0.4 + version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.37.0)(yaml@2.7.0) + packages/embed: {} packages/gamepad: @@ -434,6 +462,9 @@ importers: '@strudel/draw': specifier: workspace:* version: link:../draw + '@strudel/edo': + specifier: workspace:* + version: link:../edo '@strudel/hydra': specifier: workspace:* version: link:../hydra @@ -591,6 +622,9 @@ importers: '@strudel/core': specifier: workspace:* version: link:../core + '@strudel/edo': + specifier: workspace:* + version: link:../edo '@strudel/mini': specifier: workspace:* version: link:../mini @@ -702,6 +736,9 @@ importers: '@strudel/draw': specifier: workspace:* version: link:../packages/draw + '@strudel/edo': + specifier: workspace:* + version: link:../packages/edo '@strudel/gamepad': specifier: workspace:* version: link:../packages/gamepad @@ -7657,6 +7694,7 @@ packages: workbox-google-analytics@7.0.0: resolution: {integrity: sha512-MEYM1JTn/qiC3DbpvP2BVhyIH+dV/5BjHk756u9VbwuAhu0QHyKscTnisQuz21lfRpOwiS9z4XdqeVAKol0bzg==} + deprecated: It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained workbox-navigation-preload@7.0.0: resolution: {integrity: sha512-juWCSrxo/fiMz3RsvDspeSLGmbgC0U9tKqcUPZBCf35s64wlaLXyn2KdHHXVQrb2cqF7I0Hc9siQalainmnXJA==} diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index cc45848bf..806b9a1d9 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -3149,6 +3149,93 @@ exports[`runs examples > example "echoWith" example index 0 1`] = ` ] `; +exports[`runs examples > example "edoScale" example index 0 1`] = ` +[ + "[ 0/1 → 1/6 | degree:1 degreeIndexes:[0 2 4 5 7 9 11] intLabels:[null M2 M3 P4 P5 M6 T7 P8] root:130.8128 freq:130.813 edo:12 ]", + "[ 1/6 → 1/3 | degree:3 degreeIndexes:[0 2 4 5 7 9 11] intLabels:[null M2 M3 P4 P5 M6 T7 P8] root:130.8128 freq:164.814 edo:12 ]", + "[ 1/3 → 1/2 | degree:5 degreeIndexes:[0 2 4 5 7 9 11] intLabels:[null M2 M3 P4 P5 M6 T7 P8] root:130.8128 freq:195.998 edo:12 ]", + "[ 1/2 → 2/3 | degree:7 degreeIndexes:[0 2 4 5 7 9 11] intLabels:[null M2 M3 P4 P5 M6 T7 P8] root:130.8128 freq:246.942 edo:12 ]", + "[ 2/3 → 5/6 | degree:5 degreeIndexes:[0 2 4 5 7 9 11] intLabels:[null M2 M3 P4 P5 M6 T7 P8] root:130.8128 freq:195.998 edo:12 ]", + "[ 5/6 → 1/1 | degree:3 degreeIndexes:[0 2 4 5 7 9 11] intLabels:[null M2 M3 P4 P5 M6 T7 P8] root:130.8128 freq:164.814 edo:12 ]", + "[ 1/1 → 7/6 | degree:1 degreeIndexes:[0 2 4 5 7 9 11] intLabels:[null M2 M3 P4 P5 M6 T7 P8] root:130.8128 freq:130.813 edo:12 ]", + "[ 7/6 → 4/3 | degree:3 degreeIndexes:[0 2 4 5 7 9 11] intLabels:[null M2 M3 P4 P5 M6 T7 P8] root:130.8128 freq:164.814 edo:12 ]", + "[ 4/3 → 3/2 | degree:5 degreeIndexes:[0 2 4 5 7 9 11] intLabels:[null M2 M3 P4 P5 M6 T7 P8] root:130.8128 freq:195.998 edo:12 ]", + "[ 3/2 → 5/3 | degree:7 degreeIndexes:[0 2 4 5 7 9 11] intLabels:[null M2 M3 P4 P5 M6 T7 P8] root:130.8128 freq:246.942 edo:12 ]", + "[ 5/3 → 11/6 | degree:5 degreeIndexes:[0 2 4 5 7 9 11] intLabels:[null M2 M3 P4 P5 M6 T7 P8] root:130.8128 freq:195.998 edo:12 ]", + "[ 11/6 → 2/1 | degree:3 degreeIndexes:[0 2 4 5 7 9 11] intLabels:[null M2 M3 P4 P5 M6 T7 P8] root:130.8128 freq:164.814 edo:12 ]", + "[ 2/1 → 13/6 | degree:1 degreeIndexes:[0 2 4 5 7 9 11] intLabels:[null M2 M3 P4 P5 M6 T7 P8] root:130.8128 freq:130.813 edo:12 ]", + "[ 13/6 → 7/3 | degree:3 degreeIndexes:[0 2 4 5 7 9 11] intLabels:[null M2 M3 P4 P5 M6 T7 P8] root:130.8128 freq:164.814 edo:12 ]", + "[ 7/3 → 5/2 | degree:5 degreeIndexes:[0 2 4 5 7 9 11] intLabels:[null M2 M3 P4 P5 M6 T7 P8] root:130.8128 freq:195.998 edo:12 ]", + "[ 5/2 → 8/3 | degree:7 degreeIndexes:[0 2 4 5 7 9 11] intLabels:[null M2 M3 P4 P5 M6 T7 P8] root:130.8128 freq:246.942 edo:12 ]", + "[ 8/3 → 17/6 | degree:5 degreeIndexes:[0 2 4 5 7 9 11] intLabels:[null M2 M3 P4 P5 M6 T7 P8] root:130.8128 freq:195.998 edo:12 ]", + "[ 17/6 → 3/1 | degree:3 degreeIndexes:[0 2 4 5 7 9 11] intLabels:[null M2 M3 P4 P5 M6 T7 P8] root:130.8128 freq:164.814 edo:12 ]", + "[ 3/1 → 19/6 | degree:1 degreeIndexes:[0 2 4 5 7 9 11] intLabels:[null M2 M3 P4 P5 M6 T7 P8] root:130.8128 freq:130.813 edo:12 ]", + "[ 19/6 → 10/3 | degree:3 degreeIndexes:[0 2 4 5 7 9 11] intLabels:[null M2 M3 P4 P5 M6 T7 P8] root:130.8128 freq:164.814 edo:12 ]", + "[ 10/3 → 7/2 | degree:5 degreeIndexes:[0 2 4 5 7 9 11] intLabels:[null M2 M3 P4 P5 M6 T7 P8] root:130.8128 freq:195.998 edo:12 ]", + "[ 7/2 → 11/3 | degree:7 degreeIndexes:[0 2 4 5 7 9 11] intLabels:[null M2 M3 P4 P5 M6 T7 P8] root:130.8128 freq:246.942 edo:12 ]", + "[ 11/3 → 23/6 | degree:5 degreeIndexes:[0 2 4 5 7 9 11] intLabels:[null M2 M3 P4 P5 M6 T7 P8] root:130.8128 freq:195.998 edo:12 ]", + "[ 23/6 → 4/1 | degree:3 degreeIndexes:[0 2 4 5 7 9 11] intLabels:[null M2 M3 P4 P5 M6 T7 P8] root:130.8128 freq:164.814 edo:12 ]", +] +`; + +exports[`runs examples > example "edoScale" example index 1 1`] = ` +[ + "[ 0/1 → 1/4 | degree:1 degreeIndexes:[0 3 6 7 10 13] intLabels:[null S2 d4 N4 s6 s7 P8] root:97.9989 freq:97.999 edo:16 s:piano ]", + "[ 0/1 → 1/4 | degree:2 degreeIndexes:[0 3 6 7 10 13] intLabels:[null S2 d4 N4 s6 s7 P8] root:97.9989 freq:223.2 edo:16 s:piano ]", + "[ 1/4 → 1/2 | degree:5 degreeIndexes:[0 3 6 7 10 13] intLabels:[null S2 d4 N4 s6 s7 P8] root:97.9989 freq:151.135 edo:16 s:piano ]", + "[ 1/2 → 3/4 | degree:3 degreeIndexes:[0 3 6 7 10 13] intLabels:[null S2 d4 N4 s6 s7 P8] root:97.9989 freq:127.089 edo:16 s:piano ]", + "[ 1/2 → 3/4 | degree:2 degreeIndexes:[0 3 6 7 10 13] intLabels:[null S2 d4 N4 s6 s7 P8] root:97.9989 freq:223.2 edo:16 s:piano ]", + "[ 3/4 → 1/1 | degree:5 degreeIndexes:[0 3 6 7 10 13] intLabels:[null S2 d4 N4 s6 s7 P8] root:97.9989 freq:151.135 edo:16 s:piano ]", + "[ 1/1 → 5/4 | degree:1 degreeIndexes:[0 3 6 9 12 13] intLabels:[null S2 d4 M6 s7 P8] root:97.9989 freq:97.999 edo:16 s:piano ]", + "[ 1/1 → 5/4 | degree:2 degreeIndexes:[0 3 6 9 12 13] intLabels:[null S2 d4 M6 s7 P8] root:97.9989 freq:223.2 edo:16 s:piano ]", + "[ 5/4 → 3/2 | degree:5 degreeIndexes:[0 3 6 9 12 13] intLabels:[null S2 d4 M6 s7 P8] root:97.9989 freq:164.814 edo:16 s:piano ]", + "[ 3/2 → 7/4 | degree:3 degreeIndexes:[0 3 6 9 12 13] intLabels:[null S2 d4 M6 s7 P8] root:97.9989 freq:127.089 edo:16 s:piano ]", + "[ 3/2 → 7/4 | degree:2 degreeIndexes:[0 3 6 9 12 13] intLabels:[null S2 d4 M6 s7 P8] root:97.9989 freq:223.2 edo:16 s:piano ]", + "[ 7/4 → 2/1 | degree:5 degreeIndexes:[0 3 6 9 12 13] intLabels:[null S2 d4 M6 s7 P8] root:97.9989 freq:164.814 edo:16 s:piano ]", + "[ 2/1 → 9/4 | degree:1 degreeIndexes:[0 3 6 7 10 13] intLabels:[null S2 d4 N4 s6 s7 P8] root:97.9989 freq:97.999 edo:16 s:piano ]", + "[ 2/1 → 9/4 | degree:2 degreeIndexes:[0 3 6 7 10 13] intLabels:[null S2 d4 N4 s6 s7 P8] root:97.9989 freq:223.2 edo:16 s:piano ]", + "[ 9/4 → 5/2 | degree:5 degreeIndexes:[0 3 6 7 10 13] intLabels:[null S2 d4 N4 s6 s7 P8] root:97.9989 freq:151.135 edo:16 s:piano ]", + "[ 5/2 → 11/4 | degree:3 degreeIndexes:[0 3 6 7 10 13] intLabels:[null S2 d4 N4 s6 s7 P8] root:97.9989 freq:127.089 edo:16 s:piano ]", + "[ 5/2 → 11/4 | degree:2 degreeIndexes:[0 3 6 7 10 13] intLabels:[null S2 d4 N4 s6 s7 P8] root:97.9989 freq:223.2 edo:16 s:piano ]", + "[ 11/4 → 3/1 | degree:5 degreeIndexes:[0 3 6 7 10 13] intLabels:[null S2 d4 N4 s6 s7 P8] root:97.9989 freq:151.135 edo:16 s:piano ]", + "[ 3/1 → 13/4 | degree:1 degreeIndexes:[0 3 6 9 12 13] intLabels:[null S2 d4 M6 s7 P8] root:97.9989 freq:97.999 edo:16 s:piano ]", + "[ 3/1 → 13/4 | degree:2 degreeIndexes:[0 3 6 9 12 13] intLabels:[null S2 d4 M6 s7 P8] root:97.9989 freq:223.2 edo:16 s:piano ]", + "[ 13/4 → 7/2 | degree:5 degreeIndexes:[0 3 6 9 12 13] intLabels:[null S2 d4 M6 s7 P8] root:97.9989 freq:164.814 edo:16 s:piano ]", + "[ 7/2 → 15/4 | degree:3 degreeIndexes:[0 3 6 9 12 13] intLabels:[null S2 d4 M6 s7 P8] root:97.9989 freq:127.089 edo:16 s:piano ]", + "[ 7/2 → 15/4 | degree:2 degreeIndexes:[0 3 6 9 12 13] intLabels:[null S2 d4 M6 s7 P8] root:97.9989 freq:223.2 edo:16 s:piano ]", + "[ 15/4 → 4/1 | degree:5 degreeIndexes:[0 3 6 9 12 13] intLabels:[null S2 d4 M6 s7 P8] root:97.9989 freq:164.814 edo:16 s:piano ]", +] +`; + +exports[`runs examples > example "edoScale" example index 2 1`] = ` +[ + "[ 0/1 → 1/6 | degree:1 degreeIndexes:[0 3 6 7 10] intLabels:[null s3 n4 t5 d7 P8] root:97.9989 freq:97.999 edo:13 s:piano ]", + "[ 1/6 → 1/3 | degree:5 degreeIndexes:[0 3 6 7 10] intLabels:[null s3 n4 t5 d7 P8] root:97.9989 freq:167.025 edo:13 s:piano ]", + "[ 1/3 → 1/2 | degree:3 degreeIndexes:[0 3 6 7 10] intLabels:[null s3 n4 t5 d7 P8] root:97.9989 freq:134.945 edo:13 s:piano ]", + "[ 1/2 → 2/3 | degree:2 degreeIndexes:[0 3 6 7 10] intLabels:[null s3 n4 t5 d7 P8] root:97.9989 freq:114.998 edo:13 s:piano ]", + "[ 2/3 → 5/6 | degree:3 degreeIndexes:[0 3 6 7 10] intLabels:[null s3 n4 t5 d7 P8] root:97.9989 freq:134.945 edo:13 s:piano ]", + "[ 5/6 → 1/1 | degree:1 degreeIndexes:[0 3 6 7 10] intLabels:[null s3 n4 t5 d7 P8] root:97.9989 freq:97.999 edo:13 s:piano ]", + "[ 1/1 → 7/6 | degree:4 degreeIndexes:[0 3 6 7 10] intLabels:[null s3 n4 t5 d7 P8] root:130.8128 freq:189.995 edo:13 s:piano ]", + "[ 7/6 → 4/3 | degree:2 degreeIndexes:[0 3 6 7 10] intLabels:[null s3 n4 t5 d7 P8] root:130.8128 freq:153.504 edo:13 s:piano ]", + "[ 4/3 → 3/2 | degree:3 degreeIndexes:[0 3 6 7 10] intLabels:[null s3 n4 t5 d7 P8] root:130.8128 freq:180.13 edo:13 s:piano ]", + "[ 3/2 → 5/3 | degree:4 degreeIndexes:[0 3 6 7 10] intLabels:[null s3 n4 t5 d7 P8] root:130.8128 freq:189.995 edo:13 s:piano ]", + "[ 5/3 → 11/6 | degree:1 degreeIndexes:[0 3 6 7 10] intLabels:[null s3 n4 t5 d7 P8] root:130.8128 freq:130.813 edo:13 s:piano ]", + "[ 11/6 → 2/1 | degree:5 degreeIndexes:[0 3 6 7 10] intLabels:[null s3 n4 t5 d7 P8] root:130.8128 freq:222.952 edo:13 s:piano ]", + "[ 2/1 → 13/6 | degree:1 degreeIndexes:[0 3 6 7 10] intLabels:[null s3 n4 t5 d7 P8] root:97.9989 freq:195.998 edo:13 s:piano ]", + "[ 13/6 → 7/3 | degree:4 degreeIndexes:[0 3 6 7 10] intLabels:[null s3 n4 t5 d7 P8] root:97.9989 freq:142.336 edo:13 s:piano ]", + "[ 7/3 → 5/2 | degree:3 degreeIndexes:[0 3 6 7 10] intLabels:[null s3 n4 t5 d7 P8] root:97.9989 freq:134.945 edo:13 s:piano ]", + "[ 5/2 → 8/3 | degree:3 degreeIndexes:[0 3 6 7 10] intLabels:[null s3 n4 t5 d7 P8] root:97.9989 freq:134.945 edo:13 s:piano ]", + "[ 8/3 → 17/6 | degree:4 degreeIndexes:[0 3 6 7 10] intLabels:[null s3 n4 t5 d7 P8] root:97.9989 freq:142.336 edo:13 s:piano ]", + "[ 17/6 → 3/1 | degree:2 degreeIndexes:[0 3 6 7 10] intLabels:[null s3 n4 t5 d7 P8] root:97.9989 freq:114.998 edo:13 s:piano ]", + "[ 3/1 → 19/6 | degree:2 degreeIndexes:[0 3 6 7 10] intLabels:[null s3 n4 t5 d7 P8] root:130.8128 freq:153.504 edo:13 s:piano ]", + "[ 19/6 → 10/3 | degree:2 degreeIndexes:[0 3 6 7 10] intLabels:[null s3 n4 t5 d7 P8] root:130.8128 freq:153.504 edo:13 s:piano ]", + "[ 10/3 → 7/2 | degree:1 degreeIndexes:[0 3 6 7 10] intLabels:[null s3 n4 t5 d7 P8] root:130.8128 freq:261.626 edo:13 s:piano ]", + "[ 7/2 → 11/3 | degree:3 degreeIndexes:[0 3 6 7 10] intLabels:[null s3 n4 t5 d7 P8] root:130.8128 freq:180.13 edo:13 s:piano ]", + "[ 11/3 → 23/6 | degree:3 degreeIndexes:[0 3 6 7 10] intLabels:[null s3 n4 t5 d7 P8] root:130.8128 freq:180.13 edo:13 s:piano ]", + "[ 23/6 → 4/1 | degree:4 degreeIndexes:[0 3 6 7 10] intLabels:[null s3 n4 t5 d7 P8] root:130.8128 freq:189.995 edo:13 s:piano ]", +] +`; + exports[`runs examples > example "end" example index 0 1`] = ` [ "[ 0/1 → 1/8 | s:oh end:0.1 ]", diff --git a/test/runtime.mjs b/test/runtime.mjs index 2a29de3f5..1125550ff 100644 --- a/test/runtime.mjs +++ b/test/runtime.mjs @@ -13,6 +13,7 @@ import { mini, m } from '@strudel/mini/mini.mjs'; // import euclid from '@strudel/core/euclid.mjs'; //import '@strudel/midi/midi.mjs'; import * as tonalHelpers from '@strudel/tonal'; +import * as edoHelpers from '@strudel/edo'; import '@strudel/xen/xen.mjs'; // import '@strudel/xen/tune.mjs'; // import '@strudel/core/euclid.mjs'; @@ -140,6 +141,7 @@ evalScope( toneHelpersMocked, uiHelpersMocked, webaudio, + edoHelpers, tonalHelpers, gamepadHelpers, /* diff --git a/website/package.json b/website/package.json index 499758147..f3cd6b719 100644 --- a/website/package.json +++ b/website/package.json @@ -29,6 +29,7 @@ "@strudel/csound": "workspace:*", "@strudel/desktopbridge": "workspace:*", "@strudel/draw": "workspace:*", + "@strudel/edo": "workspace:*", "@strudel/gamepad": "workspace:*", "@strudel/hydra": "workspace:*", "@strudel/midi": "workspace:*", diff --git a/website/src/repl/util.mjs b/website/src/repl/util.mjs index ac27158f4..5ea823f67 100644 --- a/website/src/repl/util.mjs +++ b/website/src/repl/util.mjs @@ -71,6 +71,7 @@ export function loadModules() { let modules = [ import('@strudel/core'), import('@strudel/draw'), + import('@strudel/edo'), import('@strudel/tonal'), import('@strudel/mini'), import('@strudel/xen'),