diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index 8a2e82c77..c9b14891e 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -1256,6 +1256,20 @@ const ALIGNMENT_KEYS = ALIGNMENTS.map((how) => how.toLowerCase()); }; })(); +/** + * Sets the default [alignment](https://strudel.cc/technical-manual/alignment/) to be used by Strudel. + * The default default alignment is `in`, meaning that patterns to the left will (typically) dictate + * the event timings when combined with patterns to the right. By changing alignment to `out`, the opposite + * will happen. With `mix`, they will combine their event timings. + * + * Note that we say the _default_ alignment, because alignments can also be set explicitly with calls like + * `add.mix`, `set.squeeze`, etc. + * + * @param {string} name Default alignment to use. Options: 'in', 'out', 'mix', 'squeeze', 'squeezeout', 'reset', 'restart', 'poly' + * @example + * setDefaultAlignment('mix') // also try 'in', 'out', 'squeeze', etc. + * s("saw").vel("1 0.5").note("F A C E").delay("0 0.2 0.3") + */ export const setDefaultAlignment = (alignment) => { alignment = alignment?.toLowerCase(); if (DEFAULT_ALIGNMENT !== alignment && ALIGNMENT_KEYS.includes(alignment)) { diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index 284f18557..1713993bc 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -10874,6 +10874,35 @@ exports[`runs examples > example "seqPLoop" example index 0 1`] = ` ] `; +exports[`runs examples > example "setDefaultAlignment" example index 0 1`] = ` +[ + "[ 0/1 → 1/4 | s:saw velocity:1 note:F delay:0 ]", + "[ 1/4 → 1/3 | s:saw velocity:1 note:A delay:0 ]", + "[ 1/3 → 1/2 | s:saw velocity:1 note:A delay:0.2 ]", + "[ 1/2 → 2/3 | s:saw velocity:0.5 note:C delay:0.2 ]", + "[ 2/3 → 3/4 | s:saw velocity:0.5 note:C delay:0.3 ]", + "[ 3/4 → 1/1 | s:saw velocity:0.5 note:E delay:0.3 ]", + "[ 1/1 → 5/4 | s:saw velocity:1 note:F delay:0 ]", + "[ 5/4 → 4/3 | s:saw velocity:1 note:A delay:0 ]", + "[ 4/3 → 3/2 | s:saw velocity:1 note:A delay:0.2 ]", + "[ 3/2 → 5/3 | s:saw velocity:0.5 note:C delay:0.2 ]", + "[ 5/3 → 7/4 | s:saw velocity:0.5 note:C delay:0.3 ]", + "[ 7/4 → 2/1 | s:saw velocity:0.5 note:E delay:0.3 ]", + "[ 2/1 → 9/4 | s:saw velocity:1 note:F delay:0 ]", + "[ 9/4 → 7/3 | s:saw velocity:1 note:A delay:0 ]", + "[ 7/3 → 5/2 | s:saw velocity:1 note:A delay:0.2 ]", + "[ 5/2 → 8/3 | s:saw velocity:0.5 note:C delay:0.2 ]", + "[ 8/3 → 11/4 | s:saw velocity:0.5 note:C delay:0.3 ]", + "[ 11/4 → 3/1 | s:saw velocity:0.5 note:E delay:0.3 ]", + "[ 3/1 → 13/4 | s:saw velocity:1 note:F delay:0 ]", + "[ 13/4 → 10/3 | s:saw velocity:1 note:A delay:0 ]", + "[ 10/3 → 7/2 | s:saw velocity:1 note:A delay:0.2 ]", + "[ 7/2 → 11/3 | s:saw velocity:0.5 note:C delay:0.2 ]", + "[ 11/3 → 15/4 | s:saw velocity:0.5 note:C delay:0.3 ]", + "[ 15/4 → 4/1 | s:saw velocity:0.5 note:E delay:0.3 ]", +] +`; + exports[`runs examples > example "setGainCurve" example index 0 1`] = ` [ "[ 0/1 → 1/4 | s:bd gain:0.5 ]", diff --git a/vitest.setup.mjs b/vitest.setup.mjs index ea965df6d..654aab42d 100644 --- a/vitest.setup.mjs +++ b/vitest.setup.mjs @@ -1,7 +1,9 @@ import { afterEach } from 'vitest'; import { useRNG } from './packages/core/signal.mjs'; +import { setDefaultAlignment } from './packages/core/pattern.mjs'; afterEach(() => { // Avoid bleed between tests useRNG('legacy'); + setDefaultAlignment('in'); });