mirror of
https://github.com/eliasstepanik/strudel-docker.git
synced 2026-01-24 03:58:53 +00:00
Merge branch 'main' of github.com:yaxu/strudel into main
This commit is contained in:
commit
cba0084e3d
@ -1,5 +1,6 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
|
<script>import("./js/strudel.js").then(m => strudel = m)
|
||||||
|
</script>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>Bingo</title>
|
<title>Bingo</title>
|
||||||
|
|||||||
@ -191,16 +191,18 @@ class Pattern {
|
|||||||
this.query = query
|
this.query = query
|
||||||
}
|
}
|
||||||
|
|
||||||
splitQueries() {
|
_splitQueries() {
|
||||||
// Splits queries at cycle boundaries. This makes some calculations
|
// Splits queries at cycle boundaries. This makes some calculations
|
||||||
// easier to express, as all events are then constrained to happen within
|
// easier to express, as all events are then constrained to happen within
|
||||||
// a cycle.
|
// a cycle.
|
||||||
var query = function(span) {
|
var pat = this
|
||||||
return flatten(span.spanCycles.map(subspan => this.query(subspan)))
|
var q = function(span) {
|
||||||
|
return flatten(span.spanCycles.map(subspan => pat.query(subspan)))
|
||||||
}
|
}
|
||||||
return new Pattern(query)
|
return new Pattern(q)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
withQuerySpan(func) {
|
withQuerySpan(func) {
|
||||||
return new Pattern(span => this.query(func(span)))
|
return new Pattern(span => this.query(func(span)))
|
||||||
}
|
}
|
||||||
@ -235,7 +237,7 @@ class Pattern {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_filterEvents(event_test) {
|
_filterEvents(event_test) {
|
||||||
return new Pattern(span => this.query(span).filter(event_tespanCyclesst))
|
return new Pattern(span => this.query(span).filter(event_test))
|
||||||
}
|
}
|
||||||
|
|
||||||
_filterValues(value_test) {
|
_filterValues(value_test) {
|
||||||
@ -424,11 +426,15 @@ class Pattern {
|
|||||||
|
|
||||||
when(binary_pat, func) {
|
when(binary_pat, func) {
|
||||||
//binary_pat = sequence(binary_pat)
|
//binary_pat = sequence(binary_pat)
|
||||||
var true_pat = binary_pat._filter_values(id)
|
var true_pat = binary_pat._filterValues(id)
|
||||||
var false_pat = binary_pat._filter_values(val => !val)
|
var false_pat = binary_pat._filterValues(val => !val)
|
||||||
var with_pat = true_pat.fmap(_ => y => y).app_right(func(this))
|
var with_pat = true_pat.fmap(_ => y => y).appRight(func(this))
|
||||||
var without_pat = false_pat.fmap(_ => y => y).app_right(this)
|
var without_pat = false_pat.fmap(_ => y => y).appRight(this)
|
||||||
return stack(with_pat, without_pat)
|
return stack([with_pat, without_pat])
|
||||||
|
}
|
||||||
|
|
||||||
|
off(time_pat, func) {
|
||||||
|
return stack([this, func(this._early(time_pat))])
|
||||||
}
|
}
|
||||||
|
|
||||||
off(time_pat, func) {
|
off(time_pat, func) {
|
||||||
@ -504,5 +510,27 @@ function stack(pats) {
|
|||||||
return new Pattern(query)
|
return new Pattern(query)
|
||||||
}
|
}
|
||||||
|
|
||||||
export {Fraction, TimeSpan, Hap, Pattern, pure, stack}
|
function slowcat(pats) {
|
||||||
|
// Concatenation: combines a list of patterns, switching between them
|
||||||
|
// successively, one per cycle.
|
||||||
|
// (currently behaves slightly differently from Tidal)
|
||||||
|
//var pats = pats.map(reify)
|
||||||
|
var query = function(span) {
|
||||||
|
var pat = pats[Math.floor(span.begin) % pats.length]
|
||||||
|
return pat.query(span)
|
||||||
|
}
|
||||||
|
return new Pattern(query)._splitQueries()
|
||||||
|
}
|
||||||
|
|
||||||
|
function fastcat(pats) {
|
||||||
|
// Concatenation: as with slowcat, but squashes a cycle from each
|
||||||
|
// pattern into one cycle
|
||||||
|
return slowcat(pats)._fast(pats.length)
|
||||||
|
}
|
||||||
|
|
||||||
|
function cat(pats) {
|
||||||
|
return fastcat(pats)
|
||||||
|
}
|
||||||
|
|
||||||
|
export {Fraction, TimeSpan, Hap, Pattern, pure, stack, slowcat, fastcat, cat}
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,7 @@ import Fraction from 'fraction.js'
|
|||||||
|
|
||||||
import { strict as assert } from 'assert';
|
import { strict as assert } from 'assert';
|
||||||
|
|
||||||
import {TimeSpan, Hap, Pattern, pure, stack} from "../js/strudel.mjs";
|
import {TimeSpan, Hap, Pattern, pure, stack, fastcat, slowcat, cat} from "../js/strudel.mjs";
|
||||||
|
|
||||||
describe('TimeSpan', function() {
|
describe('TimeSpan', function() {
|
||||||
describe('equals()', function() {
|
describe('equals()', function() {
|
||||||
@ -91,4 +91,28 @@ describe('Pattern', function() {
|
|||||||
assert.deepStrictEqual(pure("a")._slow(2).firstCycle[0], new Hap(new TimeSpan(Fraction(0),Fraction(2)), new TimeSpan(Fraction(0), Fraction(1)), "a"))
|
assert.deepStrictEqual(pure("a")._slow(2).firstCycle[0], new Hap(new TimeSpan(Fraction(0),Fraction(2)), new TimeSpan(Fraction(0), Fraction(1)), "a"))
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
describe('_filterValues()', function () {
|
||||||
|
it('Filters true', function () {
|
||||||
|
assert.equal(pure(true)._filterValues(x => x).firstCycle.length, 1)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
describe('when()', function () {
|
||||||
|
it('Always faster', function () {
|
||||||
|
assert.equal(pure("a").when(pure(true), x => x._fast(2)).firstCycle.length, 2)
|
||||||
|
})
|
||||||
|
it('Never faster', function () {
|
||||||
|
assert.equal(pure("a").when(pure(false), x => x._fast(2)).firstCycle.length, 1)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
describe('fastcat()', function () {
|
||||||
|
it('Can concatenate two things', function () {
|
||||||
|
assert.deepStrictEqual(fastcat([pure("a"), pure("b")]).firstCycle.map(x => x.value), ["a", "b"])
|
||||||
|
})
|
||||||
|
})
|
||||||
|
describe('slowcat()', function () {
|
||||||
|
it('Can concatenate things slowly', function () {
|
||||||
|
assert.deepStrictEqual(slowcat([pure("a"), pure("b")]).firstCycle.map(x => x.value), ["a"])
|
||||||
|
assert.deepStrictEqual(slowcat([pure("a"), pure("b")])._early(1).firstCycle.map(x => x.value), ["b"])
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
Loading…
x
Reference in New Issue
Block a user