Merge pull request 'add revv() for reversing whole patterns' (#1791) from revv into main
Reviewed-on: https://codeberg.org/uzu/strudel/pulls/1791
This commit is contained in:
commit
4061dd4cf8
3 changed files with 43 additions and 1 deletions
|
|
@ -2234,7 +2234,7 @@ export const brak = register('brak', function (pat) {
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reverse all haps in a pattern
|
* Reverse all cycles in a pattern. See also `revv` for reversing a whole pattern.
|
||||||
*
|
*
|
||||||
* @name rev
|
* @name rev
|
||||||
* @memberof Pattern
|
* @memberof Pattern
|
||||||
|
|
@ -2266,6 +2266,23 @@ export const rev = register(
|
||||||
true,
|
true,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse a whole pattern. See also `rev` for reversing each cycle.
|
||||||
|
*
|
||||||
|
* @name revv
|
||||||
|
* @memberof Pattern
|
||||||
|
* @returns Pattern
|
||||||
|
* @example
|
||||||
|
* // This is the same as `<[g e] [d c]>`. If `rev()` is used, you get
|
||||||
|
* // the same as `<[d c] [g e]>`, where each cycle reverses, but the order of
|
||||||
|
* // cycles stays the same.
|
||||||
|
* note("<[c d] [e g]>").revv()
|
||||||
|
*/
|
||||||
|
export const revv = register('revv', function (pat) {
|
||||||
|
const negateSpan = (span) => new TimeSpan(Fraction(0).sub(span.end), Fraction(0).sub(span.begin));
|
||||||
|
return pat.withQuerySpan(negateSpan).withHapSpan(negateSpan);
|
||||||
|
});
|
||||||
|
|
||||||
/** Like press, but allows you to specify the amount by which each
|
/** Like press, but allows you to specify the amount by which each
|
||||||
* event is shifted. pressBy(0.5) is the same as press, while
|
* event is shifted. pressBy(0.5) is the same as press, while
|
||||||
* pressBy(1/3) shifts each event by a third of its timespan.
|
* pressBy(1/3) shifts each event by a third of its timespan.
|
||||||
|
|
|
||||||
|
|
@ -586,6 +586,18 @@ describe('Pattern', () => {
|
||||||
.map((a) => a.value),
|
.map((a) => a.value),
|
||||||
).toStrictEqual(['c', 'b', 'a']);
|
).toStrictEqual(['c', 'b', 'a']);
|
||||||
});
|
});
|
||||||
|
it('Does not reverse the order of cycles', () => {
|
||||||
|
expect(fastcat('a', 'b', 'c', 'd').slow(2).rev().fast(2).sortHapsByPart().firstCycle()).toStrictEqual(
|
||||||
|
fastcat('b', 'a', 'd', 'c').firstCycle(),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
describe('revv()', () => {
|
||||||
|
it('Does reverse the order of cycles', () => {
|
||||||
|
expect(fastcat('a', 'b', 'c', 'd').slow(2).revv().fast(2).sortHapsByPart().firstCycle()).toStrictEqual(
|
||||||
|
fastcat('d', 'c', 'b', 'a').firstCycle(),
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
describe('sequence()', () => {
|
describe('sequence()', () => {
|
||||||
it('Can work like fastcat', () => {
|
it('Can work like fastcat', () => {
|
||||||
|
|
|
||||||
|
|
@ -9256,6 +9256,19 @@ exports[`runs examples > example "rev" example index 0 1`] = `
|
||||||
]
|
]
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
exports[`runs examples > example "revv" example index 0 1`] = `
|
||||||
|
[
|
||||||
|
"[ 0/1 → 1/2 | note:g ]",
|
||||||
|
"[ 1/2 → 1/1 | note:e ]",
|
||||||
|
"[ 1/1 → 3/2 | note:d ]",
|
||||||
|
"[ 3/2 → 2/1 | note:c ]",
|
||||||
|
"[ 2/1 → 5/2 | note:g ]",
|
||||||
|
"[ 5/2 → 3/1 | note:e ]",
|
||||||
|
"[ 3/1 → 7/2 | note:d ]",
|
||||||
|
"[ 7/2 → 4/1 | note:c ]",
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
exports[`runs examples > example "ribbon" example index 0 1`] = `
|
exports[`runs examples > example "ribbon" example index 0 1`] = `
|
||||||
[
|
[
|
||||||
"[ 0/1 → 1/1 | note:d ]",
|
"[ 0/1 → 1/1 | note:d ]",
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue