mirror of
https://github.com/eliasstepanik/strudel-docker.git
synced 2026-01-28 05:58:28 +00:00
commit
86bb92d3be
@ -583,7 +583,7 @@ class Pattern {
|
|||||||
return this.innerBind(id);
|
return this.innerBind(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
squeezeJoin() {
|
_squeezeJoin() {
|
||||||
const pat_of_pats = this;
|
const pat_of_pats = this;
|
||||||
function query(state) {
|
function query(state) {
|
||||||
const haps = pat_of_pats.query(state);
|
const haps = pat_of_pats.query(state);
|
||||||
@ -607,15 +607,19 @@ class Pattern {
|
|||||||
const context = inner.combineContext(outer);
|
const context = inner.combineContext(outer);
|
||||||
return new Hap(whole, part, inner.value, context);
|
return new Hap(whole, part, inner.value, context);
|
||||||
}
|
}
|
||||||
return innerHaps.map(innerHap => munge(outerHap, innerHap))
|
return innerHaps.map((innerHap) => munge(outerHap, innerHap));
|
||||||
}
|
}
|
||||||
const result = flatten(haps.map(flatHap));
|
const result = flatten(haps.map(flatHap));
|
||||||
// remove undefineds
|
// remove undefineds
|
||||||
return result.filter(x => x);
|
return result.filter((x) => x);
|
||||||
}
|
}
|
||||||
return new Pattern(query);
|
return new Pattern(query);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_squeezeBind(func) {
|
||||||
|
return this.fmap(func)._squeezeJoin();
|
||||||
|
}
|
||||||
|
|
||||||
_apply(func) {
|
_apply(func) {
|
||||||
return func(this);
|
return func(this);
|
||||||
}
|
}
|
||||||
@ -678,7 +682,16 @@ class Pattern {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_ply(factor) {
|
_ply(factor) {
|
||||||
return this.fmap(x => pure(x)._fast(factor)).squeezeJoin()
|
return this.fmap((x) => pure(x)._fast(factor))._squeezeJoin();
|
||||||
|
}
|
||||||
|
|
||||||
|
_chop(n) {
|
||||||
|
const slices = Array.from({length: n}, (x, i) => i);
|
||||||
|
const slice_objects = slices.map(i => ({begin: i/n, end: (i+1)/n}));
|
||||||
|
const func = function(o) {
|
||||||
|
return(sequence(slice_objects.map(slice_o => Object.assign({}, o, slice_o))))
|
||||||
|
}
|
||||||
|
return(this._squeezeBind(func));
|
||||||
}
|
}
|
||||||
|
|
||||||
// cpm = cycles per minute
|
// cpm = cycles per minute
|
||||||
@ -878,6 +891,7 @@ Pattern.prototype.patternified = [
|
|||||||
'fast',
|
'fast',
|
||||||
'slow',
|
'slow',
|
||||||
'ply',
|
'ply',
|
||||||
|
'chop',
|
||||||
'cpm',
|
'cpm',
|
||||||
'early',
|
'early',
|
||||||
'late',
|
'late',
|
||||||
@ -885,7 +899,7 @@ Pattern.prototype.patternified = [
|
|||||||
'legato',
|
'legato',
|
||||||
'velocity',
|
'velocity',
|
||||||
'segment',
|
'segment',
|
||||||
'color'
|
'color',
|
||||||
];
|
];
|
||||||
// methods that create patterns, which are added to patternified Pattern methods
|
// methods that create patterns, which are added to patternified Pattern methods
|
||||||
Pattern.prototype.factories = { pure, stack, slowcat, fastcat, cat, timeCat, sequence, polymeter, pm, polyrhythm, pr };
|
Pattern.prototype.factories = { pure, stack, slowcat, fastcat, cat, timeCat, sequence, polymeter, pm, polyrhythm, pr };
|
||||||
|
|||||||
@ -491,10 +491,10 @@ describe('Pattern', function() {
|
|||||||
)
|
)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
describe("squeezeJoin", () => {
|
describe("_squeezeJoin", () => {
|
||||||
it("Can squeeze", () => {
|
it("Can squeeze", () => {
|
||||||
assert.deepStrictEqual(
|
assert.deepStrictEqual(
|
||||||
sequence("a", ["a","a"]).fmap(a => fastcat("b", "c")).squeezeJoin().firstCycle(),
|
sequence("a", ["a","a"]).fmap(a => fastcat("b", "c"))._squeezeJoin().firstCycle(),
|
||||||
sequence(["b", "c"],[["b", "c"],["b", "c"]]).firstCycle()
|
sequence(["b", "c"],[["b", "c"],["b", "c"]]).firstCycle()
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
@ -507,4 +507,27 @@ describe('Pattern', function() {
|
|||||||
)
|
)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
describe("chop", () => {
|
||||||
|
it("Can _chop(2)", () => {
|
||||||
|
assert.deepStrictEqual(
|
||||||
|
sequence({sound: "a"}, {sound: "b"})._chop(2).firstCycle(),
|
||||||
|
sequence({sound: "a", begin: 0, end: 0.5},
|
||||||
|
{sound: "a", begin: 0.5, end: 1},
|
||||||
|
{sound: "b", begin: 0, end: 0.5},
|
||||||
|
{sound: "b", begin: 0.5, end: 1}
|
||||||
|
).firstCycle()
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it("Can chop(2,3)", () => {
|
||||||
|
assert.deepStrictEqual(
|
||||||
|
pure({sound: "a"}).fast(2).chop(2,3)._sortEventsByPart().firstCycle(),
|
||||||
|
sequence([{sound: "a", begin: 0, end: 0.5},
|
||||||
|
{sound: "a", begin: 0.5, end: 1}],
|
||||||
|
[{sound: "a", begin: 0, end: 1/3},
|
||||||
|
{sound: "a", begin: 1/3, end: 2/3},
|
||||||
|
{sound: "a", begin: 2/3, end: 1}
|
||||||
|
])._sortEventsByPart().firstCycle()
|
||||||
|
)
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user