diff --git a/strudel.mjs b/strudel.mjs index c08519a9..1c249711 100644 --- a/strudel.mjs +++ b/strudel.mjs @@ -426,6 +426,27 @@ class Pattern { return patterned } + _fastGap (factor) { + // Maybe it's better without this fallback.. + // if (factor < 1) { + // // there is no gap.. so maybe revert to _fast? + // return this._fast(factor) + // } + const qf = function(span) { + const cycle = span.begin.sam() + const begin = cycle.add(span.begin.sub(span.cycle).mul(factor).min(1)) + const end = cycle.add(span.end.sub(span.cycle).mul(factor).min(1)) + return new TimeSpan(begin, end) + } + const ef = function(span) { + const cycle = span.begin.sam() + const begin = cycle.add(span.begin.sub(span.cycle).div(factor).min(1)) + const end = cycle.add(span.end.sub(span.cycle).div(factor).min(1)) + return new TimeSpan(begin, end) + } + return this.withQuerySpan(qf).withEventSpan(ef)._splitQueries() + } + _fast(factor) { const fastQuery = this.withQueryTime(t => t.mul(factor)) return fastQuery.withEventTime(t => t.div(factor)) diff --git a/test/pattern.test.mjs b/test/pattern.test.mjs index bd13c4d3..b1afb3d9 100644 --- a/test/pattern.test.mjs +++ b/test/pattern.test.mjs @@ -89,6 +89,24 @@ describe('Pattern', function() { assert.equal(pure("a")._fast(2).firstCycle.length, 2) }) }) + describe('_fastGap()', function () { + it('Makes things faster, with a gap', function () { + assert.deepStrictEqual( + sequence("a", "b", "c")._fastGap(2).firstCycle, + sequence(["a","b","c"], silence).firstCycle + ) + assert.deepStrictEqual( + sequence("a", "b", "c")._fastGap(3).firstCycle, + sequence(["a","b","c"], silence, silence).firstCycle + ) + }) + it('Makes things faster, with a gap, when speeded up further', function () { + assert.deepStrictEqual( + sequence("a", "b", "c")._fastGap(2).fast(2).firstCycle, + sequence(["a","b","c"], silence, ["a","b","c"], silence).firstCycle + ) + }) + }) describe('fast()', function () { it('Makes things faster', function () { assert.equal(pure("a").fast(2).firstCycle.length, 2)