From 9690f78c3088e705bc0a54e29513e4781e093a23 Mon Sep 17 00:00:00 2001 From: tyow Date: Thu, 12 Feb 2026 21:13:17 -0500 Subject: [PATCH 1/6] Initial `set` documentation --- packages/core/pattern.mjs | 30 +++++++ test/__snapshots__/examples.test.mjs.snap | 95 +++++++++++++++++++++++ 2 files changed, 125 insertions(+) diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index b63a702f8..2063e3695 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -1056,6 +1056,36 @@ function _composeOp(a, b, func) { // pattern composers const COMPOSERS = { + /** + * When called on a pattern `a`, with a input pattern `b` (`a.set(b)`), + * combines `a` and `b` such that anything defined in `b` + * overwrites the corresponding value in `a` + * + * See examples below + * @name set + * @param {Pattern} pat + * @returns Pattern + * @memberof Pattern + * @tags internal, combiners + * @example + * // because input pattern has `s` set, + * // it overrides the "sine" declared earlier + * note("c a f e").s("sine").set(s("triangle")) + * @example + * // Structure from original pattern is + * // maintained, even when explicitly set + * note("c a f e").s("sine").set(note("c a") + * .struct("x!8")) + * @example + * // Using something like `apply`, we can + * // invert which pattern overrides the other + * // Here, the struct will be "x!8", and the + * // notes will be c c a a f f e e + * note("c a f e").apply(x=>{ + * // pure(0) here is used as a dummy pattern + * return pure(0).struct("x!8").set(x) + * }) + */ set: [(a, b) => b], keep: [(a) => a], keepif: [(a, b) => (b ? a : undefined)], diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index 831e48767..a66c939a3 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -11110,6 +11110,101 @@ exports[`runs examples > example "seqPLoop" example index 0 1`] = ` ] `; +exports[`runs examples > example "set" example index 0 1`] = ` +[ + "[ 0/1 → 1/4 | note:c s:triangle ]", + "[ 1/4 → 1/2 | note:a s:triangle ]", + "[ 1/2 → 3/4 | note:f s:triangle ]", + "[ 3/4 → 1/1 | note:e s:triangle ]", + "[ 1/1 → 5/4 | note:c s:triangle ]", + "[ 5/4 → 3/2 | note:a s:triangle ]", + "[ 3/2 → 7/4 | note:f s:triangle ]", + "[ 7/4 → 2/1 | note:e s:triangle ]", + "[ 2/1 → 9/4 | note:c s:triangle ]", + "[ 9/4 → 5/2 | note:a s:triangle ]", + "[ 5/2 → 11/4 | note:f s:triangle ]", + "[ 11/4 → 3/1 | note:e s:triangle ]", + "[ 3/1 → 13/4 | note:c s:triangle ]", + "[ 13/4 → 7/2 | note:a s:triangle ]", + "[ 7/2 → 15/4 | note:f s:triangle ]", + "[ 15/4 → 4/1 | note:e s:triangle ]", +] +`; + +exports[`runs examples > example "set" example index 1 1`] = ` +[ + "[ (0/1 → 1/8) ⇝ 1/4 | note:c s:sine ]", + "[ 0/1 ⇜ (1/8 → 1/4) | note:c s:sine ]", + "[ (1/4 → 3/8) ⇝ 1/2 | note:c s:sine ]", + "[ 1/4 ⇜ (3/8 → 1/2) | note:c s:sine ]", + "[ (1/2 → 5/8) ⇝ 3/4 | note:a s:sine ]", + "[ 1/2 ⇜ (5/8 → 3/4) | note:a s:sine ]", + "[ (3/4 → 7/8) ⇝ 1/1 | note:a s:sine ]", + "[ 3/4 ⇜ (7/8 → 1/1) | note:a s:sine ]", + "[ (1/1 → 9/8) ⇝ 5/4 | note:c s:sine ]", + "[ 1/1 ⇜ (9/8 → 5/4) | note:c s:sine ]", + "[ (5/4 → 11/8) ⇝ 3/2 | note:c s:sine ]", + "[ 5/4 ⇜ (11/8 → 3/2) | note:c s:sine ]", + "[ (3/2 → 13/8) ⇝ 7/4 | note:a s:sine ]", + "[ 3/2 ⇜ (13/8 → 7/4) | note:a s:sine ]", + "[ (7/4 → 15/8) ⇝ 2/1 | note:a s:sine ]", + "[ 7/4 ⇜ (15/8 → 2/1) | note:a s:sine ]", + "[ (2/1 → 17/8) ⇝ 9/4 | note:c s:sine ]", + "[ 2/1 ⇜ (17/8 → 9/4) | note:c s:sine ]", + "[ (9/4 → 19/8) ⇝ 5/2 | note:c s:sine ]", + "[ 9/4 ⇜ (19/8 → 5/2) | note:c s:sine ]", + "[ (5/2 → 21/8) ⇝ 11/4 | note:a s:sine ]", + "[ 5/2 ⇜ (21/8 → 11/4) | note:a s:sine ]", + "[ (11/4 → 23/8) ⇝ 3/1 | note:a s:sine ]", + "[ 11/4 ⇜ (23/8 → 3/1) | note:a s:sine ]", + "[ (3/1 → 25/8) ⇝ 13/4 | note:c s:sine ]", + "[ 3/1 ⇜ (25/8 → 13/4) | note:c s:sine ]", + "[ (13/4 → 27/8) ⇝ 7/2 | note:c s:sine ]", + "[ 13/4 ⇜ (27/8 → 7/2) | note:c s:sine ]", + "[ (7/2 → 29/8) ⇝ 15/4 | note:a s:sine ]", + "[ 7/2 ⇜ (29/8 → 15/4) | note:a s:sine ]", + "[ (15/4 → 31/8) ⇝ 4/1 | note:a s:sine ]", + "[ 15/4 ⇜ (31/8 → 4/1) | note:a s:sine ]", +] +`; + +exports[`runs examples > example "set" example index 2 1`] = ` +[ + "[ 0/1 → 1/8 | value:0 note:c ]", + "[ 1/8 → 1/4 | value:0 note:c ]", + "[ 1/4 → 3/8 | value:0 note:a ]", + "[ 3/8 → 1/2 | value:0 note:a ]", + "[ 1/2 → 5/8 | value:0 note:f ]", + "[ 5/8 → 3/4 | value:0 note:f ]", + "[ 3/4 → 7/8 | value:0 note:e ]", + "[ 7/8 → 1/1 | value:0 note:e ]", + "[ 1/1 → 9/8 | value:0 note:c ]", + "[ 9/8 → 5/4 | value:0 note:c ]", + "[ 5/4 → 11/8 | value:0 note:a ]", + "[ 11/8 → 3/2 | value:0 note:a ]", + "[ 3/2 → 13/8 | value:0 note:f ]", + "[ 13/8 → 7/4 | value:0 note:f ]", + "[ 7/4 → 15/8 | value:0 note:e ]", + "[ 15/8 → 2/1 | value:0 note:e ]", + "[ 2/1 → 17/8 | value:0 note:c ]", + "[ 17/8 → 9/4 | value:0 note:c ]", + "[ 9/4 → 19/8 | value:0 note:a ]", + "[ 19/8 → 5/2 | value:0 note:a ]", + "[ 5/2 → 21/8 | value:0 note:f ]", + "[ 21/8 → 11/4 | value:0 note:f ]", + "[ 11/4 → 23/8 | value:0 note:e ]", + "[ 23/8 → 3/1 | value:0 note:e ]", + "[ 3/1 → 25/8 | value:0 note:c ]", + "[ 25/8 → 13/4 | value:0 note:c ]", + "[ 13/4 → 27/8 | value:0 note:a ]", + "[ 27/8 → 7/2 | value:0 note:a ]", + "[ 7/2 → 29/8 | value:0 note:f ]", + "[ 29/8 → 15/4 | value:0 note:f ]", + "[ 15/4 → 31/8 | value:0 note:e ]", + "[ 31/8 → 4/1 | value:0 note:e ]", +] +`; + exports[`runs examples > example "setDefaultJoin" example index 0 1`] = ` [ "[ 0/1 → 1/4 | s:saw velocity:1 note:F delay:0 ]", From a39c9e6096073f14f4f79e590817f482c090863e Mon Sep 17 00:00:00 2001 From: tyow Date: Thu, 12 Feb 2026 21:52:54 -0500 Subject: [PATCH 2/6] Attempt at keep documentation --- packages/core/pattern.mjs | 23 +++++++++++++- test/__snapshots__/examples.test.mjs.snap | 37 +++++++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index 2063e3695..9339ea50b 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -1061,10 +1061,12 @@ const COMPOSERS = { * combines `a` and `b` such that anything defined in `b` * overwrites the corresponding value in `a` * + * This is the inverse of `keep` + * * See examples below * @name set * @param {Pattern} pat - * @returns Pattern + * @returns {Pattern} * @memberof Pattern * @tags internal, combiners * @example @@ -1087,6 +1089,25 @@ const COMPOSERS = { * }) */ set: [(a, b) => b], + /** + * When called on a pattern `a`, with a input pattern `b` (`a.keep(b)`), + * combines `a` and `b` such that anything defined in `a` + * overwrites the corresponding value in `b` + * + * This is the inverse of `set` + * + * See examples below + * @name keep + * @param {Pattern} pat + * @memberof Pattern + * @returns {Pattern} + * @tags internal, combiners + * @example + * // Struct, already defined in original pattern + * // Is combined with the input, such that we get + * // c c a a f f e e + * pure(0).struct("x!8").keep(note("c a f e")) + */ keep: [(a) => a], keepif: [(a, b) => (b ? a : undefined)], diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index a66c939a3..f733971fc 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -6403,6 +6403,43 @@ exports[`runs examples > example "juxBy" example index 0 1`] = ` ] `; +exports[`runs examples > example "keep" example index 0 1`] = ` +[ + "[ 0/1 → 1/8 | value:0 note:c ]", + "[ 1/8 → 1/4 | value:0 note:c ]", + "[ 1/4 → 3/8 | value:0 note:a ]", + "[ 3/8 → 1/2 | value:0 note:a ]", + "[ 1/2 → 5/8 | value:0 note:f ]", + "[ 5/8 → 3/4 | value:0 note:f ]", + "[ 3/4 → 7/8 | value:0 note:e ]", + "[ 7/8 → 1/1 | value:0 note:e ]", + "[ 1/1 → 9/8 | value:0 note:c ]", + "[ 9/8 → 5/4 | value:0 note:c ]", + "[ 5/4 → 11/8 | value:0 note:a ]", + "[ 11/8 → 3/2 | value:0 note:a ]", + "[ 3/2 → 13/8 | value:0 note:f ]", + "[ 13/8 → 7/4 | value:0 note:f ]", + "[ 7/4 → 15/8 | value:0 note:e ]", + "[ 15/8 → 2/1 | value:0 note:e ]", + "[ 2/1 → 17/8 | value:0 note:c ]", + "[ 17/8 → 9/4 | value:0 note:c ]", + "[ 9/4 → 19/8 | value:0 note:a ]", + "[ 19/8 → 5/2 | value:0 note:a ]", + "[ 5/2 → 21/8 | value:0 note:f ]", + "[ 21/8 → 11/4 | value:0 note:f ]", + "[ 11/4 → 23/8 | value:0 note:e ]", + "[ 23/8 → 3/1 | value:0 note:e ]", + "[ 3/1 → 25/8 | value:0 note:c ]", + "[ 25/8 → 13/4 | value:0 note:c ]", + "[ 13/4 → 27/8 | value:0 note:a ]", + "[ 27/8 → 7/2 | value:0 note:a ]", + "[ 7/2 → 29/8 | value:0 note:f ]", + "[ 29/8 → 15/4 | value:0 note:f ]", + "[ 15/4 → 31/8 | value:0 note:e ]", + "[ 31/8 → 4/1 | value:0 note:e ]", +] +`; + exports[`runs examples > example "keyDown" example index 0 1`] = `[]`; exports[`runs examples > example "lastOf" example index 0 1`] = ` From d7067f3562729b298f163fb8573472e3a9175970 Mon Sep 17 00:00:00 2001 From: tyow Date: Thu, 12 Feb 2026 22:55:30 -0500 Subject: [PATCH 3/6] typo --- website/src/pages/technical-manual/alignment.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/src/pages/technical-manual/alignment.mdx b/website/src/pages/technical-manual/alignment.mdx index dd3a6db5f..c2a70f1a9 100644 --- a/website/src/pages/technical-manual/alignment.mdx +++ b/website/src/pages/technical-manual/alignment.mdx @@ -1,11 +1,11 @@ --- -title: Pattern Aligment +title: Pattern Alignment layout: ../../layouts/MainLayout.astro --- import { MiniRepl } from '../../docs/MiniRepl'; -# Pattern Aligment & Combination +# Pattern Alignment & Combination One core aspect of Strudel, inherited from Tidal, is the flexible way that patterns can be combined, irrespective of their structure. Its declarative approach means a live coder does not have to think about the details of _how_ this is done, only _what_ is to be done. From 7cb8a151a4036ffcb4950d227326f9066899a8df Mon Sep 17 00:00:00 2001 From: tyow Date: Fri, 13 Feb 2026 14:36:22 -0500 Subject: [PATCH 4/6] slight language change --- packages/core/pattern.mjs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index 9339ea50b..85b44b764 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -1059,7 +1059,8 @@ const COMPOSERS = { /** * When called on a pattern `a`, with a input pattern `b` (`a.set(b)`), * combines `a` and `b` such that anything defined in `b` - * overwrites the corresponding value in `a` + * and anything defined in `a` that is *not* defined in `b` + * will be in the resulting pattern * * This is the inverse of `keep` * @@ -1091,8 +1092,9 @@ const COMPOSERS = { set: [(a, b) => b], /** * When called on a pattern `a`, with a input pattern `b` (`a.keep(b)`), - * combines `a` and `b` such that anything defined in `a` - * overwrites the corresponding value in `b` + * combines `a` and `b` such that anything defined in `a`, + * and anything defined in `b` that is *not* defined in `a` + * will be in the resulting pattern * * This is the inverse of `set` * From 161d2ce056582d8da3461226f0ac86734be3ece5 Mon Sep 17 00:00:00 2001 From: tyow Date: Sat, 14 Feb 2026 16:13:37 -0500 Subject: [PATCH 5/6] Added note about pattern alignment --- packages/core/pattern.mjs | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index 85b44b764..f393cdef7 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -1060,7 +1060,12 @@ const COMPOSERS = { * When called on a pattern `a`, with a input pattern `b` (`a.set(b)`), * combines `a` and `b` such that anything defined in `b` * and anything defined in `a` that is *not* defined in `b` - * will be in the resulting pattern + * will be in the resulting pattern. + * + * The structure is maintained from `a`, + * because the default pattern alignment is `in`, + * see the section on `Pattern Alignment` + * in the technical manual in the docs * * This is the inverse of `keep` * @@ -1074,27 +1079,17 @@ const COMPOSERS = { * // because input pattern has `s` set, * // it overrides the "sine" declared earlier * note("c a f e").s("sine").set(s("triangle")) - * @example - * // Structure from original pattern is - * // maintained, even when explicitly set - * note("c a f e").s("sine").set(note("c a") - * .struct("x!8")) - * @example - * // Using something like `apply`, we can - * // invert which pattern overrides the other - * // Here, the struct will be "x!8", and the - * // notes will be c c a a f f e e - * note("c a f e").apply(x=>{ - * // pure(0) here is used as a dummy pattern - * return pure(0).struct("x!8").set(x) - * }) - */ set: [(a, b) => b], /** * When called on a pattern `a`, with a input pattern `b` (`a.keep(b)`), * combines `a` and `b` such that anything defined in `a`, * and anything defined in `b` that is *not* defined in `a` * will be in the resulting pattern + * + * The structure is maintained from `a`, + * because the default pattern alignment is `in`, + * see the section on `Pattern Alignment` + * in the technical manual in the docs * * This is the inverse of `set` * @@ -1105,10 +1100,9 @@ const COMPOSERS = { * @returns {Pattern} * @tags internal, combiners * @example - * // Struct, already defined in original pattern - * // Is combined with the input, such that we get - * // c c a a f f e e - * pure(0).struct("x!8").keep(note("c a f e")) + * // notes, already defined, will stay "c a f e", + * // while "s", not defined, will be set to "piano" + * note("c a f e").keep(note("e f a c").s("piano")) */ keep: [(a) => a], keepif: [(a, b) => (b ? a : undefined)], From d5dbc5c428c7f2b22cc2c288a2eddcfcc966e842 Mon Sep 17 00:00:00 2001 From: tyow Date: Sat, 14 Feb 2026 16:16:16 -0500 Subject: [PATCH 6/6] typo --- packages/core/pattern.mjs | 21 ++-- test/__snapshots__/examples.test.mjs.snap | 131 +++------------------- 2 files changed, 27 insertions(+), 125 deletions(-) diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index f393cdef7..2c1dcfce9 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -1061,10 +1061,10 @@ const COMPOSERS = { * combines `a` and `b` such that anything defined in `b` * and anything defined in `a` that is *not* defined in `b` * will be in the resulting pattern. - * - * The structure is maintained from `a`, - * because the default pattern alignment is `in`, - * see the section on `Pattern Alignment` + * + * The structure is maintained from `a`, + * because the default pattern alignment is `in`, + * see the section on `Pattern Alignment` * in the technical manual in the docs * * This is the inverse of `keep` @@ -1079,16 +1079,17 @@ const COMPOSERS = { * // because input pattern has `s` set, * // it overrides the "sine" declared earlier * note("c a f e").s("sine").set(s("triangle")) + */ set: [(a, b) => b], /** * When called on a pattern `a`, with a input pattern `b` (`a.keep(b)`), * combines `a` and `b` such that anything defined in `a`, * and anything defined in `b` that is *not* defined in `a` * will be in the resulting pattern - * - * The structure is maintained from `a`, - * because the default pattern alignment is `in`, - * see the section on `Pattern Alignment` + * + * The structure is maintained from `a`, + * because the default pattern alignment is `in`, + * see the section on `Pattern Alignment` * in the technical manual in the docs * * This is the inverse of `set` @@ -1100,8 +1101,8 @@ const COMPOSERS = { * @returns {Pattern} * @tags internal, combiners * @example - * // notes, already defined, will stay "c a f e", - * // while "s", not defined, will be set to "piano" + * // notes, already defined, will stay "c a f e", + * // while "s", not defined, will be set to "piano" * note("c a f e").keep(note("e f a c").s("piano")) */ keep: [(a) => a], diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index f733971fc..5d19a0bb0 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -3012,15 +3012,6 @@ exports[`runs examples > example "delayfeedback" example index 0 1`] = ` ] `; -exports[`runs examples > example "delayfeedback" example index 0 2`] = ` -[ - "[ 0/1 → 1/1 | s:bd delay:0.25 delayfeedback:0.25 ]", - "[ 1/1 → 2/1 | s:bd delay:0.25 delayfeedback:0.5 ]", - "[ 2/1 → 3/1 | s:bd delay:0.25 delayfeedback:0.75 ]", - "[ 3/1 → 4/1 | s:bd delay:0.25 delayfeedback:1 ]", -] -`; - exports[`runs examples > example "delayspeed" example index 0 1`] = ` [ "[ 0/1 → 1/8 | note:d s:sawtooth delay:0.8 delaytime:0.5 delayspeed:2 ]", @@ -6405,38 +6396,22 @@ exports[`runs examples > example "juxBy" example index 0 1`] = ` exports[`runs examples > example "keep" example index 0 1`] = ` [ - "[ 0/1 → 1/8 | value:0 note:c ]", - "[ 1/8 → 1/4 | value:0 note:c ]", - "[ 1/4 → 3/8 | value:0 note:a ]", - "[ 3/8 → 1/2 | value:0 note:a ]", - "[ 1/2 → 5/8 | value:0 note:f ]", - "[ 5/8 → 3/4 | value:0 note:f ]", - "[ 3/4 → 7/8 | value:0 note:e ]", - "[ 7/8 → 1/1 | value:0 note:e ]", - "[ 1/1 → 9/8 | value:0 note:c ]", - "[ 9/8 → 5/4 | value:0 note:c ]", - "[ 5/4 → 11/8 | value:0 note:a ]", - "[ 11/8 → 3/2 | value:0 note:a ]", - "[ 3/2 → 13/8 | value:0 note:f ]", - "[ 13/8 → 7/4 | value:0 note:f ]", - "[ 7/4 → 15/8 | value:0 note:e ]", - "[ 15/8 → 2/1 | value:0 note:e ]", - "[ 2/1 → 17/8 | value:0 note:c ]", - "[ 17/8 → 9/4 | value:0 note:c ]", - "[ 9/4 → 19/8 | value:0 note:a ]", - "[ 19/8 → 5/2 | value:0 note:a ]", - "[ 5/2 → 21/8 | value:0 note:f ]", - "[ 21/8 → 11/4 | value:0 note:f ]", - "[ 11/4 → 23/8 | value:0 note:e ]", - "[ 23/8 → 3/1 | value:0 note:e ]", - "[ 3/1 → 25/8 | value:0 note:c ]", - "[ 25/8 → 13/4 | value:0 note:c ]", - "[ 13/4 → 27/8 | value:0 note:a ]", - "[ 27/8 → 7/2 | value:0 note:a ]", - "[ 7/2 → 29/8 | value:0 note:f ]", - "[ 29/8 → 15/4 | value:0 note:f ]", - "[ 15/4 → 31/8 | value:0 note:e ]", - "[ 31/8 → 4/1 | value:0 note:e ]", + "[ 0/1 → 1/4 | note:c s:piano ]", + "[ 1/4 → 1/2 | note:a s:piano ]", + "[ 1/2 → 3/4 | note:f s:piano ]", + "[ 3/4 → 1/1 | note:e s:piano ]", + "[ 1/1 → 5/4 | note:c s:piano ]", + "[ 5/4 → 3/2 | note:a s:piano ]", + "[ 3/2 → 7/4 | note:f s:piano ]", + "[ 7/4 → 2/1 | note:e s:piano ]", + "[ 2/1 → 9/4 | note:c s:piano ]", + "[ 9/4 → 5/2 | note:a s:piano ]", + "[ 5/2 → 11/4 | note:f s:piano ]", + "[ 11/4 → 3/1 | note:e s:piano ]", + "[ 3/1 → 13/4 | note:c s:piano ]", + "[ 13/4 → 7/2 | note:a s:piano ]", + "[ 7/2 → 15/4 | note:f s:piano ]", + "[ 15/4 → 4/1 | note:e s:piano ]", ] `; @@ -11168,80 +11143,6 @@ exports[`runs examples > example "set" example index 0 1`] = ` ] `; -exports[`runs examples > example "set" example index 1 1`] = ` -[ - "[ (0/1 → 1/8) ⇝ 1/4 | note:c s:sine ]", - "[ 0/1 ⇜ (1/8 → 1/4) | note:c s:sine ]", - "[ (1/4 → 3/8) ⇝ 1/2 | note:c s:sine ]", - "[ 1/4 ⇜ (3/8 → 1/2) | note:c s:sine ]", - "[ (1/2 → 5/8) ⇝ 3/4 | note:a s:sine ]", - "[ 1/2 ⇜ (5/8 → 3/4) | note:a s:sine ]", - "[ (3/4 → 7/8) ⇝ 1/1 | note:a s:sine ]", - "[ 3/4 ⇜ (7/8 → 1/1) | note:a s:sine ]", - "[ (1/1 → 9/8) ⇝ 5/4 | note:c s:sine ]", - "[ 1/1 ⇜ (9/8 → 5/4) | note:c s:sine ]", - "[ (5/4 → 11/8) ⇝ 3/2 | note:c s:sine ]", - "[ 5/4 ⇜ (11/8 → 3/2) | note:c s:sine ]", - "[ (3/2 → 13/8) ⇝ 7/4 | note:a s:sine ]", - "[ 3/2 ⇜ (13/8 → 7/4) | note:a s:sine ]", - "[ (7/4 → 15/8) ⇝ 2/1 | note:a s:sine ]", - "[ 7/4 ⇜ (15/8 → 2/1) | note:a s:sine ]", - "[ (2/1 → 17/8) ⇝ 9/4 | note:c s:sine ]", - "[ 2/1 ⇜ (17/8 → 9/4) | note:c s:sine ]", - "[ (9/4 → 19/8) ⇝ 5/2 | note:c s:sine ]", - "[ 9/4 ⇜ (19/8 → 5/2) | note:c s:sine ]", - "[ (5/2 → 21/8) ⇝ 11/4 | note:a s:sine ]", - "[ 5/2 ⇜ (21/8 → 11/4) | note:a s:sine ]", - "[ (11/4 → 23/8) ⇝ 3/1 | note:a s:sine ]", - "[ 11/4 ⇜ (23/8 → 3/1) | note:a s:sine ]", - "[ (3/1 → 25/8) ⇝ 13/4 | note:c s:sine ]", - "[ 3/1 ⇜ (25/8 → 13/4) | note:c s:sine ]", - "[ (13/4 → 27/8) ⇝ 7/2 | note:c s:sine ]", - "[ 13/4 ⇜ (27/8 → 7/2) | note:c s:sine ]", - "[ (7/2 → 29/8) ⇝ 15/4 | note:a s:sine ]", - "[ 7/2 ⇜ (29/8 → 15/4) | note:a s:sine ]", - "[ (15/4 → 31/8) ⇝ 4/1 | note:a s:sine ]", - "[ 15/4 ⇜ (31/8 → 4/1) | note:a s:sine ]", -] -`; - -exports[`runs examples > example "set" example index 2 1`] = ` -[ - "[ 0/1 → 1/8 | value:0 note:c ]", - "[ 1/8 → 1/4 | value:0 note:c ]", - "[ 1/4 → 3/8 | value:0 note:a ]", - "[ 3/8 → 1/2 | value:0 note:a ]", - "[ 1/2 → 5/8 | value:0 note:f ]", - "[ 5/8 → 3/4 | value:0 note:f ]", - "[ 3/4 → 7/8 | value:0 note:e ]", - "[ 7/8 → 1/1 | value:0 note:e ]", - "[ 1/1 → 9/8 | value:0 note:c ]", - "[ 9/8 → 5/4 | value:0 note:c ]", - "[ 5/4 → 11/8 | value:0 note:a ]", - "[ 11/8 → 3/2 | value:0 note:a ]", - "[ 3/2 → 13/8 | value:0 note:f ]", - "[ 13/8 → 7/4 | value:0 note:f ]", - "[ 7/4 → 15/8 | value:0 note:e ]", - "[ 15/8 → 2/1 | value:0 note:e ]", - "[ 2/1 → 17/8 | value:0 note:c ]", - "[ 17/8 → 9/4 | value:0 note:c ]", - "[ 9/4 → 19/8 | value:0 note:a ]", - "[ 19/8 → 5/2 | value:0 note:a ]", - "[ 5/2 → 21/8 | value:0 note:f ]", - "[ 21/8 → 11/4 | value:0 note:f ]", - "[ 11/4 → 23/8 | value:0 note:e ]", - "[ 23/8 → 3/1 | value:0 note:e ]", - "[ 3/1 → 25/8 | value:0 note:c ]", - "[ 25/8 → 13/4 | value:0 note:c ]", - "[ 13/4 → 27/8 | value:0 note:a ]", - "[ 27/8 → 7/2 | value:0 note:a ]", - "[ 7/2 → 29/8 | value:0 note:f ]", - "[ 29/8 → 15/4 | value:0 note:f ]", - "[ 15/4 → 31/8 | value:0 note:e ]", - "[ 31/8 → 4/1 | value:0 note:e ]", -] -`; - exports[`runs examples > example "setDefaultJoin" example index 0 1`] = ` [ "[ 0/1 → 1/4 | s:saw velocity:1 note:F delay:0 ]",