diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index c5b7953c..6ae8718a 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -2546,6 +2546,20 @@ export const { juxBy, juxby } = register(['juxBy', 'juxby'], function (by, func, return stack(left, right).setSteps(__steps ? lcm(left._steps, right._steps) : undefined); }); +/** + * Like juxBy, except it flips the ears each cycle. + * @name juxFlipBy + * @synonyms juxflipby, fluxBy, fluxby + * @example + * s("bd lt [~ ht] mt cp ~ bd hh").juxFlipBy(".8", rev) + */ +export const { juxFlipBy, juxflipby, fluxBy, fluxby } = register( + ['juxFlipBy', 'juxflipby', 'fluxBy', 'fluxby'], + function (by, func, pat) { + return pat.juxBy(slowcat(by, -by), func); + }, +); + /** * The jux function creates strange stereo effects, by applying a function to a pattern, but only in the right-hand channel. * @tags temporal, superdough @@ -2560,6 +2574,21 @@ export const jux = register('jux', function (func, pat) { return pat._juxBy(1, func, pat); }); +/** + * Like jux, but flips the ears each cycle. + * @name juxFlip + * @synonyms juxflip, flux + * @example + * s("bd lt [~ ht] mt cp ~ bd hh").juxFlip(rev) + * @example + * s("bd lt [~ ht] mt cp ~ bd hh").juxFlip(press) + * @example + * s("bd lt [~ ht] mt cp ~ bd hh").juxFlip(iter(4)) + */ +export const { juxFlip, flux } = register(['juxFlip', 'juxflip', 'flux'], function (func, pat) { + return pat._juxFlipBy(1, func, pat); +}); + /** * Superimpose and offset multiple times, applying the given function each time. * @tags temporal, functional diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index 7ea844a1..f7989dc7 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -6527,6 +6527,250 @@ exports[`runs examples > example "juxBy" example index 0 1`] = ` ] `; +exports[`runs examples > example "juxFlip" example index 0 1`] = ` +[ + "[ 0/1 → 1/8 | s:bd pan:0 ]", + "[ 0/1 → 1/8 | s:hh pan:1 ]", + "[ 1/8 → 1/4 | s:lt pan:0 ]", + "[ 1/8 → 1/4 | s:bd pan:1 ]", + "[ 5/16 → 3/8 | s:ht pan:0 ]", + "[ 3/8 → 1/2 | s:mt pan:0 ]", + "[ 3/8 → 1/2 | s:cp pan:1 ]", + "[ 1/2 → 5/8 | s:cp pan:0 ]", + "[ 1/2 → 5/8 | s:mt pan:1 ]", + "[ 5/8 → 11/16 | s:ht pan:1 ]", + "[ 3/4 → 7/8 | s:bd pan:0 ]", + "[ 3/4 → 7/8 | s:lt pan:1 ]", + "[ 7/8 → 1/1 | s:hh pan:0 ]", + "[ 7/8 → 1/1 | s:bd pan:1 ]", + "[ 1/1 → 9/8 | s:bd pan:1 ]", + "[ 1/1 → 9/8 | s:hh pan:0 ]", + "[ 9/8 → 5/4 | s:lt pan:1 ]", + "[ 9/8 → 5/4 | s:bd pan:0 ]", + "[ 21/16 → 11/8 | s:ht pan:1 ]", + "[ 11/8 → 3/2 | s:mt pan:1 ]", + "[ 11/8 → 3/2 | s:cp pan:0 ]", + "[ 3/2 → 13/8 | s:cp pan:1 ]", + "[ 3/2 → 13/8 | s:mt pan:0 ]", + "[ 13/8 → 27/16 | s:ht pan:0 ]", + "[ 7/4 → 15/8 | s:bd pan:1 ]", + "[ 7/4 → 15/8 | s:lt pan:0 ]", + "[ 15/8 → 2/1 | s:hh pan:1 ]", + "[ 15/8 → 2/1 | s:bd pan:0 ]", + "[ 2/1 → 17/8 | s:bd pan:0 ]", + "[ 2/1 → 17/8 | s:hh pan:1 ]", + "[ 17/8 → 9/4 | s:lt pan:0 ]", + "[ 17/8 → 9/4 | s:bd pan:1 ]", + "[ 37/16 → 19/8 | s:ht pan:0 ]", + "[ 19/8 → 5/2 | s:mt pan:0 ]", + "[ 19/8 → 5/2 | s:cp pan:1 ]", + "[ 5/2 → 21/8 | s:cp pan:0 ]", + "[ 5/2 → 21/8 | s:mt pan:1 ]", + "[ 21/8 → 43/16 | s:ht pan:1 ]", + "[ 11/4 → 23/8 | s:bd pan:0 ]", + "[ 11/4 → 23/8 | s:lt pan:1 ]", + "[ 23/8 → 3/1 | s:hh pan:0 ]", + "[ 23/8 → 3/1 | s:bd pan:1 ]", + "[ 3/1 → 25/8 | s:bd pan:1 ]", + "[ 3/1 → 25/8 | s:hh pan:0 ]", + "[ 25/8 → 13/4 | s:lt pan:1 ]", + "[ 25/8 → 13/4 | s:bd pan:0 ]", + "[ 53/16 → 27/8 | s:ht pan:1 ]", + "[ 27/8 → 7/2 | s:mt pan:1 ]", + "[ 27/8 → 7/2 | s:cp pan:0 ]", + "[ 7/2 → 29/8 | s:cp pan:1 ]", + "[ 7/2 → 29/8 | s:mt pan:0 ]", + "[ 29/8 → 59/16 | s:ht pan:0 ]", + "[ 15/4 → 31/8 | s:bd pan:1 ]", + "[ 15/4 → 31/8 | s:lt pan:0 ]", + "[ 31/8 → 4/1 | s:hh pan:1 ]", + "[ 31/8 → 4/1 | s:bd pan:0 ]", +] +`; + +exports[`runs examples > example "juxFlip" example index 1 1`] = ` +[ + "[ 0/1 → 1/8 | s:bd pan:0 ]", + "[ 1/16 → 1/8 | s:bd pan:1 ]", + "[ 1/8 → 1/4 | s:lt pan:0 ]", + "[ 3/16 → 1/4 | s:lt pan:1 ]", + "[ 5/16 → 3/8 | s:ht pan:0 ]", + "[ 11/32 → 3/8 | s:ht pan:1 ]", + "[ 3/8 → 1/2 | s:mt pan:0 ]", + "[ 7/16 → 1/2 | s:mt pan:1 ]", + "[ 1/2 → 5/8 | s:cp pan:0 ]", + "[ 9/16 → 5/8 | s:cp pan:1 ]", + "[ 3/4 → 7/8 | s:bd pan:0 ]", + "[ 13/16 → 7/8 | s:bd pan:1 ]", + "[ 7/8 → 1/1 | s:hh pan:0 ]", + "[ 15/16 → 1/1 | s:hh pan:1 ]", + "[ 1/1 → 9/8 | s:bd pan:1 ]", + "[ 17/16 → 9/8 | s:bd pan:0 ]", + "[ 9/8 → 5/4 | s:lt pan:1 ]", + "[ 19/16 → 5/4 | s:lt pan:0 ]", + "[ 21/16 → 11/8 | s:ht pan:1 ]", + "[ 43/32 → 11/8 | s:ht pan:0 ]", + "[ 11/8 → 3/2 | s:mt pan:1 ]", + "[ 23/16 → 3/2 | s:mt pan:0 ]", + "[ 3/2 → 13/8 | s:cp pan:1 ]", + "[ 25/16 → 13/8 | s:cp pan:0 ]", + "[ 7/4 → 15/8 | s:bd pan:1 ]", + "[ 29/16 → 15/8 | s:bd pan:0 ]", + "[ 15/8 → 2/1 | s:hh pan:1 ]", + "[ 31/16 → 2/1 | s:hh pan:0 ]", + "[ 2/1 → 17/8 | s:bd pan:0 ]", + "[ 33/16 → 17/8 | s:bd pan:1 ]", + "[ 17/8 → 9/4 | s:lt pan:0 ]", + "[ 35/16 → 9/4 | s:lt pan:1 ]", + "[ 37/16 → 19/8 | s:ht pan:0 ]", + "[ 75/32 → 19/8 | s:ht pan:1 ]", + "[ 19/8 → 5/2 | s:mt pan:0 ]", + "[ 39/16 → 5/2 | s:mt pan:1 ]", + "[ 5/2 → 21/8 | s:cp pan:0 ]", + "[ 41/16 → 21/8 | s:cp pan:1 ]", + "[ 11/4 → 23/8 | s:bd pan:0 ]", + "[ 45/16 → 23/8 | s:bd pan:1 ]", + "[ 23/8 → 3/1 | s:hh pan:0 ]", + "[ 47/16 → 3/1 | s:hh pan:1 ]", + "[ 3/1 → 25/8 | s:bd pan:1 ]", + "[ 49/16 → 25/8 | s:bd pan:0 ]", + "[ 25/8 → 13/4 | s:lt pan:1 ]", + "[ 51/16 → 13/4 | s:lt pan:0 ]", + "[ 53/16 → 27/8 | s:ht pan:1 ]", + "[ 107/32 → 27/8 | s:ht pan:0 ]", + "[ 27/8 → 7/2 | s:mt pan:1 ]", + "[ 55/16 → 7/2 | s:mt pan:0 ]", + "[ 7/2 → 29/8 | s:cp pan:1 ]", + "[ 57/16 → 29/8 | s:cp pan:0 ]", + "[ 15/4 → 31/8 | s:bd pan:1 ]", + "[ 61/16 → 31/8 | s:bd pan:0 ]", + "[ 31/8 → 4/1 | s:hh pan:1 ]", + "[ 63/16 → 4/1 | s:hh pan:0 ]", +] +`; + +exports[`runs examples > example "juxFlip" example index 2 1`] = ` +[ + "[ 0/1 → 1/8 | s:bd pan:0 ]", + "[ 0/1 → 1/8 | s:bd pan:1 ]", + "[ 1/8 → 1/4 | s:lt pan:0 ]", + "[ 1/8 → 1/4 | s:lt pan:1 ]", + "[ 5/16 → 3/8 | s:ht pan:0 ]", + "[ 5/16 → 3/8 | s:ht pan:1 ]", + "[ 3/8 → 1/2 | s:mt pan:0 ]", + "[ 3/8 → 1/2 | s:mt pan:1 ]", + "[ 1/2 → 5/8 | s:cp pan:0 ]", + "[ 1/2 → 5/8 | s:cp pan:1 ]", + "[ 3/4 → 7/8 | s:bd pan:0 ]", + "[ 3/4 → 7/8 | s:bd pan:1 ]", + "[ 7/8 → 1/1 | s:hh pan:0 ]", + "[ 7/8 → 1/1 | s:hh pan:1 ]", + "[ 1/1 → 9/8 | s:bd pan:1 ]", + "[ 17/16 → 9/8 | s:ht pan:0 ]", + "[ 9/8 → 5/4 | s:lt pan:1 ]", + "[ 9/8 → 5/4 | s:mt pan:0 ]", + "[ 5/4 → 11/8 | s:cp pan:0 ]", + "[ 21/16 → 11/8 | s:ht pan:1 ]", + "[ 11/8 → 3/2 | s:mt pan:1 ]", + "[ 3/2 → 13/8 | s:cp pan:1 ]", + "[ 3/2 → 13/8 | s:bd pan:0 ]", + "[ 13/8 → 7/4 | s:hh pan:0 ]", + "[ 7/4 → 15/8 | s:bd pan:1 ]", + "[ 7/4 → 15/8 | s:bd pan:0 ]", + "[ 15/8 → 2/1 | s:hh pan:1 ]", + "[ 15/8 → 2/1 | s:lt pan:0 ]", + "[ 2/1 → 17/8 | s:bd pan:0 ]", + "[ 2/1 → 17/8 | s:cp pan:1 ]", + "[ 17/8 → 9/4 | s:lt pan:0 ]", + "[ 9/4 → 19/8 | s:bd pan:1 ]", + "[ 37/16 → 19/8 | s:ht pan:0 ]", + "[ 19/8 → 5/2 | s:mt pan:0 ]", + "[ 19/8 → 5/2 | s:hh pan:1 ]", + "[ 5/2 → 21/8 | s:cp pan:0 ]", + "[ 5/2 → 21/8 | s:bd pan:1 ]", + "[ 21/8 → 11/4 | s:lt pan:1 ]", + "[ 11/4 → 23/8 | s:bd pan:0 ]", + "[ 45/16 → 23/8 | s:ht pan:1 ]", + "[ 23/8 → 3/1 | s:hh pan:0 ]", + "[ 23/8 → 3/1 | s:mt pan:1 ]", + "[ 3/1 → 25/8 | s:bd pan:1 ]", + "[ 3/1 → 25/8 | s:bd pan:0 ]", + "[ 25/8 → 13/4 | s:lt pan:1 ]", + "[ 25/8 → 13/4 | s:hh pan:0 ]", + "[ 13/4 → 27/8 | s:bd pan:0 ]", + "[ 53/16 → 27/8 | s:ht pan:1 ]", + "[ 27/8 → 7/2 | s:mt pan:1 ]", + "[ 27/8 → 7/2 | s:lt pan:0 ]", + "[ 7/2 → 29/8 | s:cp pan:1 ]", + "[ 57/16 → 29/8 | s:ht pan:0 ]", + "[ 29/8 → 15/4 | s:mt pan:0 ]", + "[ 15/4 → 31/8 | s:bd pan:1 ]", + "[ 15/4 → 31/8 | s:cp pan:0 ]", + "[ 31/8 → 4/1 | s:hh pan:1 ]", +] +`; + +exports[`runs examples > example "juxFlipBy" example index 0 1`] = ` +[ + "[ 0/1 → 1/8 | s:bd pan:0.09999999999999998 ]", + "[ 0/1 → 1/8 | s:hh pan:0.9 ]", + "[ 1/8 → 1/4 | s:lt pan:0.09999999999999998 ]", + "[ 1/8 → 1/4 | s:bd pan:0.9 ]", + "[ 5/16 → 3/8 | s:ht pan:0.09999999999999998 ]", + "[ 3/8 → 1/2 | s:mt pan:0.09999999999999998 ]", + "[ 3/8 → 1/2 | s:cp pan:0.9 ]", + "[ 1/2 → 5/8 | s:cp pan:0.09999999999999998 ]", + "[ 1/2 → 5/8 | s:mt pan:0.9 ]", + "[ 5/8 → 11/16 | s:ht pan:0.9 ]", + "[ 3/4 → 7/8 | s:bd pan:0.09999999999999998 ]", + "[ 3/4 → 7/8 | s:lt pan:0.9 ]", + "[ 7/8 → 1/1 | s:hh pan:0.09999999999999998 ]", + "[ 7/8 → 1/1 | s:bd pan:0.9 ]", + "[ 1/1 → 9/8 | s:bd pan:0.9 ]", + "[ 1/1 → 9/8 | s:hh pan:0.09999999999999998 ]", + "[ 9/8 → 5/4 | s:lt pan:0.9 ]", + "[ 9/8 → 5/4 | s:bd pan:0.09999999999999998 ]", + "[ 21/16 → 11/8 | s:ht pan:0.9 ]", + "[ 11/8 → 3/2 | s:mt pan:0.9 ]", + "[ 11/8 → 3/2 | s:cp pan:0.09999999999999998 ]", + "[ 3/2 → 13/8 | s:cp pan:0.9 ]", + "[ 3/2 → 13/8 | s:mt pan:0.09999999999999998 ]", + "[ 13/8 → 27/16 | s:ht pan:0.09999999999999998 ]", + "[ 7/4 → 15/8 | s:bd pan:0.9 ]", + "[ 7/4 → 15/8 | s:lt pan:0.09999999999999998 ]", + "[ 15/8 → 2/1 | s:hh pan:0.9 ]", + "[ 15/8 → 2/1 | s:bd pan:0.09999999999999998 ]", + "[ 2/1 → 17/8 | s:bd pan:0.09999999999999998 ]", + "[ 2/1 → 17/8 | s:hh pan:0.9 ]", + "[ 17/8 → 9/4 | s:lt pan:0.09999999999999998 ]", + "[ 17/8 → 9/4 | s:bd pan:0.9 ]", + "[ 37/16 → 19/8 | s:ht pan:0.09999999999999998 ]", + "[ 19/8 → 5/2 | s:mt pan:0.09999999999999998 ]", + "[ 19/8 → 5/2 | s:cp pan:0.9 ]", + "[ 5/2 → 21/8 | s:cp pan:0.09999999999999998 ]", + "[ 5/2 → 21/8 | s:mt pan:0.9 ]", + "[ 21/8 → 43/16 | s:ht pan:0.9 ]", + "[ 11/4 → 23/8 | s:bd pan:0.09999999999999998 ]", + "[ 11/4 → 23/8 | s:lt pan:0.9 ]", + "[ 23/8 → 3/1 | s:hh pan:0.09999999999999998 ]", + "[ 23/8 → 3/1 | s:bd pan:0.9 ]", + "[ 3/1 → 25/8 | s:bd pan:0.9 ]", + "[ 3/1 → 25/8 | s:hh pan:0.09999999999999998 ]", + "[ 25/8 → 13/4 | s:lt pan:0.9 ]", + "[ 25/8 → 13/4 | s:bd pan:0.09999999999999998 ]", + "[ 53/16 → 27/8 | s:ht pan:0.9 ]", + "[ 27/8 → 7/2 | s:mt pan:0.9 ]", + "[ 27/8 → 7/2 | s:cp pan:0.09999999999999998 ]", + "[ 7/2 → 29/8 | s:cp pan:0.9 ]", + "[ 7/2 → 29/8 | s:mt pan:0.09999999999999998 ]", + "[ 29/8 → 59/16 | s:ht pan:0.09999999999999998 ]", + "[ 15/4 → 31/8 | s:bd pan:0.9 ]", + "[ 15/4 → 31/8 | s:lt pan:0.09999999999999998 ]", + "[ 31/8 → 4/1 | s:hh pan:0.9 ]", + "[ 31/8 → 4/1 | s:bd pan:0.09999999999999998 ]", +] +`; + exports[`runs examples > example "keep" example index 0 1`] = ` [ "[ 0/1 → 1/4 | note:c s:piano ]",