diff --git a/packages/core/strudel.mjs b/packages/core/strudel.mjs index ed33e969..76a1d454 100644 --- a/packages/core/strudel.mjs +++ b/packages/core/strudel.mjs @@ -426,6 +426,9 @@ class Pattern { get _firstCycleValues() { return this.firstCycle().map(hap => hap.value) } + get _showFirstCycle() { + return this.firstCycle().map(hap => `${hap.value}: ${hap.whole.begin.toFraction()} - ${hap.whole.end.toFraction()}`) + } _sortEventsByPart() { return this._withEvents(events => events.sort((a,b) => a.part.begin.sub(b.part.begin).or(a.part.end.sub(b.part.end)).or(a.whole.begin.sub(b.whole.begin).or(a.whole.end.sub(b.whole.end))))) diff --git a/packages/mini/test/mini.test.mjs b/packages/mini/test/mini.test.mjs index b7a24702..7de935f2 100644 --- a/packages/mini/test/mini.test.mjs +++ b/packages/mini/test/mini.test.mjs @@ -1,12 +1,47 @@ import { strict as assert } from 'assert'; import { mini } from '../mini.mjs'; +import '@strudel/core/euclid.mjs'; describe('mini', () => { - it('Should parse mini notation', () => { - const min = (v) => mini(v)._firstCycleValues; - - assert.deepStrictEqual(min('c3'), ['c3']); - assert.deepStrictEqual(min('c3 d3'), ['c3', 'd3']); - assert.deepStrictEqual(min(''), ['c3']); + const minV = (v) => mini(v)._firstCycleValues; + const minS = (v) => mini(v)._showFirstCycle; + it('supports single elements', () => { + assert.deepStrictEqual(minV('a'), ['a']); + }); + it('supports rest', () => { + assert.deepStrictEqual(minV('~'), []); + }); + it('supports cat', () => { + assert.deepStrictEqual(minS('a b'), ['a: 0 - 1/2', 'b: 1/2 - 1']); + assert.deepStrictEqual(minS('a b c'), ['a: 0 - 1/3', 'b: 1/3 - 2/3', 'c: 2/3 - 1']); + }); + it('supports slowcat', () => { + assert.deepStrictEqual(minV(''), ['a']); + }); + it('supports division', () => { + assert.deepStrictEqual(minS('a/2'), ['a: 0 - 2']); + assert.deepStrictEqual(minS('[c3 d3]/2'), ['c3: 0 - 1']); + }); + it('supports multiplication', () => { + assert.deepStrictEqual(minS('c3*2'), ['c3: 0 - 1/2', 'c3: 1/2 - 1']); + assert.deepStrictEqual(minV('[c3 d3]*2'), ['c3', 'd3', 'c3', 'd3']); + }); + it('supports brackets', () => { + assert.deepStrictEqual(minS('c3 [d3 e3]'), ['c3: 0 - 1/2', 'd3: 1/2 - 3/4', 'e3: 3/4 - 1']); + assert.deepStrictEqual(minS('c3 [d3 [e3 f3]]'), ['c3: 0 - 1/2', 'd3: 1/2 - 3/4', 'e3: 3/4 - 7/8', 'f3: 7/8 - 1']); + }); + it('supports commas', () => { + assert.deepStrictEqual(minS('c3,e3,g3'), ['c3: 0 - 1', 'e3: 0 - 1', 'g3: 0 - 1']); + assert.deepStrictEqual(minS('[c3,e3,g3] f3'), ['c3: 0 - 1/2', 'e3: 0 - 1/2', 'g3: 0 - 1/2', 'f3: 1/2 - 1']); + }); + it('supports elongation', () => { + assert.deepStrictEqual(minS('a@3 b'), ['a: 0 - 3/4', 'b: 3/4 - 1']); + assert.deepStrictEqual(minS('a@2 b@3'), ['a: 0 - 2/5', 'b: 2/5 - 1']); + }); + it('supports replication', () => { + assert.deepStrictEqual(minS('a!3 b'), ['a: 0 - 1/4', 'a: 1/4 - 1/2', 'a: 1/2 - 3/4', 'b: 3/4 - 1']); + }); + it('supports euclidean rhythms', () => { + assert.deepStrictEqual(minS('a(3, 8)'), ['a: 0 - 1/8', 'a: 3/8 - 1/2', 'a: 3/4 - 7/8']); }); });