From 283e5fde693df5ddf93f70bcb01223160bccbe19 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sun, 24 Apr 2022 01:40:26 +0200 Subject: [PATCH] fix drawLine polyrhythm --- packages/core/drawLine.mjs | 10 ++++------ packages/core/test/drawLine.test.mjs | 6 +++++- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/core/drawLine.mjs b/packages/core/drawLine.mjs index 2fcdb07d..2d88367f 100644 --- a/packages/core/drawLine.mjs +++ b/packages/core/drawLine.mjs @@ -5,17 +5,15 @@ function drawLine(pat, chars = 60) { let pos = Fraction(0); let lines = ['']; let emptyLine = ''; // this will be the "reference" empty line, which will be copied into extra lines - const slots = []; while (lines[0].length < chars) { const haps = pat.queryArc(cycle, cycle + 1); const durations = haps.filter((hap) => hap.hasOnset()).map((hap) => hap.duration); - const totalSlots = gcd(...durations).inverse(); // number of character slots for the current cycle - slots.push(totalSlots); // remember slots for possible empty lines needed in a later cycle - const minDuration = durations.reduce((a, b) => a.min(b), durations[0]); // min duration = step length + const charFraction = gcd(...durations); + const totalSlots = charFraction.inverse(); // number of character slots for the current cycle lines = lines.map((line) => line + '|'); // add pipe character before each cycle emptyLine += '|'; for (let i = 0; i < totalSlots; i++) { - const [begin, end] = [pos, pos.add(minDuration)]; + const [begin, end] = [pos, pos.add(charFraction)]; const matches = haps.filter((hap) => hap.whole.begin.lte(begin) && hap.whole.end.gte(end)); const missingLines = matches.length - lines.length; if (missingLines > 0) { @@ -31,7 +29,7 @@ function drawLine(pat, chars = 60) { return line + '.'; }); emptyLine += '.'; - pos = pos.add(minDuration); + pos = pos.add(charFraction); } cycle++; } diff --git a/packages/core/test/drawLine.test.mjs b/packages/core/test/drawLine.test.mjs index 4300b119..587c45fb 100644 --- a/packages/core/test/drawLine.test.mjs +++ b/packages/core/test/drawLine.test.mjs @@ -1,4 +1,4 @@ -import { fastcat, stack, slowcat, silence } from '../pattern.mjs'; +import { fastcat, stack, slowcat, silence, pure } from '../pattern.mjs'; import { strict as assert } from 'assert'; import drawLine from '../drawLine.mjs'; @@ -16,6 +16,10 @@ describe('drawLine', () => { it('supports unequal silence', () => { assert.equal(drawLine(fastcat(0, silence, [1, 2]), 10), '|0-..12|0-..12'); }); + it('supports polyrhythms', () => { + '0*2 1*3'; + assert.equal(drawLine(fastcat(pure(0).fast(2), pure(1).fast(3)), 10), '|0--0--1-1-1-'); + }); it('supports multiple lines', () => { assert.equal( drawLine(fastcat(0, stack(1, 2)), 10),