mirror of
https://github.com/eliasstepanik/strudel-docker.git
synced 2026-01-25 20:48:27 +00:00
commit
f61916fffa
@ -1023,6 +1023,7 @@ function _composeOp(a, b, func) {
|
|||||||
div: [numeralArgs((a, b) => a / b)],
|
div: [numeralArgs((a, b) => a / b)],
|
||||||
mod: [numeralArgs(_mod)],
|
mod: [numeralArgs(_mod)],
|
||||||
pow: [numeralArgs(Math.pow)],
|
pow: [numeralArgs(Math.pow)],
|
||||||
|
log2: [numeralArgs(Math.log2)],
|
||||||
band: [numeralArgs((a, b) => a & b)],
|
band: [numeralArgs((a, b) => a & b)],
|
||||||
bor: [numeralArgs((a, b) => a | b)],
|
bor: [numeralArgs((a, b) => a | b)],
|
||||||
bxor: [numeralArgs((a, b) => a ^ b)],
|
bxor: [numeralArgs((a, b) => a ^ b)],
|
||||||
|
|||||||
@ -5,7 +5,7 @@ This program is free software: you can redistribute it and/or modify it under th
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { Hap } from './hap.mjs';
|
import { Hap } from './hap.mjs';
|
||||||
import { Pattern, fastcat, reify, silence, stack, register } from './pattern.mjs';
|
import { Pattern, fastcat, pure, register, reify, silence, stack } from './pattern.mjs';
|
||||||
import Fraction from './fraction.mjs';
|
import Fraction from './fraction.mjs';
|
||||||
|
|
||||||
import { id, keyAlias, getCurrentKeyboardState } from './util.mjs';
|
import { id, keyAlias, getCurrentKeyboardState } from './util.mjs';
|
||||||
@ -160,6 +160,37 @@ const timeToRands = (t, n) => timeToRandsPrime(timeToIntSeed(t), n);
|
|||||||
*/
|
*/
|
||||||
export const run = (n) => saw.range(0, n).floor().segment(n);
|
export const run = (n) => saw.range(0, n).floor().segment(n);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a pattern from a binary number.
|
||||||
|
*
|
||||||
|
* @name binary
|
||||||
|
* @param {number} n - input number to convert to binary
|
||||||
|
* @example
|
||||||
|
* "hh".s().struct(binary(5))
|
||||||
|
* // "hh".s().struct("1 0 1")
|
||||||
|
*/
|
||||||
|
export const binary = (n) => {
|
||||||
|
const nBits = reify(n).log2(0).floor().add(1);
|
||||||
|
return binaryN(n, nBits);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a pattern from a binary number, padded to n bits long.
|
||||||
|
*
|
||||||
|
* @name binaryN
|
||||||
|
* @param {number} n - input number to convert to binary
|
||||||
|
* @param {number} nBits - pattern length, defaults to 16
|
||||||
|
* @example
|
||||||
|
* "hh".s().struct(binaryN(55532, 16))
|
||||||
|
* // "hh".s().struct("1 1 0 1 1 0 0 0 1 1 1 0 1 1 0 0")
|
||||||
|
*/
|
||||||
|
export const binaryN = (n, nBits = 16) => {
|
||||||
|
nBits = reify(nBits);
|
||||||
|
// Shift and mask, putting msb on the right-side
|
||||||
|
const bitPos = run(nBits).mul(-1).add(nBits.sub(1));
|
||||||
|
return reify(n).segment(nBits).brshift(bitPos).band(pure(1));
|
||||||
|
};
|
||||||
|
|
||||||
export const randrun = (n) => {
|
export const randrun = (n) => {
|
||||||
return signal((t) => {
|
return signal((t) => {
|
||||||
// Without adding 0.5, the first cycle is always 0,1,2,3,...
|
// Without adding 0.5, the first cycle is always 0,1,2,3,...
|
||||||
|
|||||||
@ -46,6 +46,7 @@ import {
|
|||||||
rev,
|
rev,
|
||||||
time,
|
time,
|
||||||
run,
|
run,
|
||||||
|
binaryN,
|
||||||
pick,
|
pick,
|
||||||
stackLeft,
|
stackLeft,
|
||||||
stackRight,
|
stackRight,
|
||||||
@ -959,6 +960,18 @@ describe('Pattern', () => {
|
|||||||
expect(run(4).firstCycle()).toStrictEqual(sequence(0, 1, 2, 3).firstCycle());
|
expect(run(4).firstCycle()).toStrictEqual(sequence(0, 1, 2, 3).firstCycle());
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
describe('binaryN', () => {
|
||||||
|
it('Can make a binary pattern from a decimal', () => {
|
||||||
|
expect(binaryN(55532).firstCycle()).toStrictEqual(
|
||||||
|
sequence(1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0).firstCycle(),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('Can make a binary pattern from patterned inputs', () => {
|
||||||
|
expect(binaryN(pure(0x1337), pure(14)).firstCycle()).toStrictEqual(
|
||||||
|
sequence(0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1).firstCycle(),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
describe('ribbon', () => {
|
describe('ribbon', () => {
|
||||||
it('Can ribbon', () => {
|
it('Can ribbon', () => {
|
||||||
expect(cat(0, 1, 2, 3, 4, 5, 6, 7).ribbon(2, 4).fast(4).firstCycle()).toStrictEqual(
|
expect(cat(0, 1, 2, 3, 4, 5, 6, 7).ribbon(2, 4).fast(4).firstCycle()).toStrictEqual(
|
||||||
|
|||||||
@ -985,6 +985,60 @@ exports[`runs examples > example "begin" example index 0 1`] = `
|
|||||||
]
|
]
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
exports[`runs examples > example "binary" example index 0 1`] = `
|
||||||
|
[
|
||||||
|
"[ 0/1 → 1/3 | s:hh ]",
|
||||||
|
"[ 2/3 → 1/1 | s:hh ]",
|
||||||
|
"[ 1/1 → 4/3 | s:hh ]",
|
||||||
|
"[ 5/3 → 2/1 | s:hh ]",
|
||||||
|
"[ 2/1 → 7/3 | s:hh ]",
|
||||||
|
"[ 8/3 → 3/1 | s:hh ]",
|
||||||
|
"[ 3/1 → 10/3 | s:hh ]",
|
||||||
|
"[ 11/3 → 4/1 | s:hh ]",
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`runs examples > example "binaryN" example index 0 1`] = `
|
||||||
|
[
|
||||||
|
"[ 0/1 → 1/16 | s:hh ]",
|
||||||
|
"[ 1/16 → 1/8 | s:hh ]",
|
||||||
|
"[ 3/16 → 1/4 | s:hh ]",
|
||||||
|
"[ 1/4 → 5/16 | s:hh ]",
|
||||||
|
"[ 1/2 → 9/16 | s:hh ]",
|
||||||
|
"[ 9/16 → 5/8 | s:hh ]",
|
||||||
|
"[ 5/8 → 11/16 | s:hh ]",
|
||||||
|
"[ 3/4 → 13/16 | s:hh ]",
|
||||||
|
"[ 13/16 → 7/8 | s:hh ]",
|
||||||
|
"[ 1/1 → 17/16 | s:hh ]",
|
||||||
|
"[ 17/16 → 9/8 | s:hh ]",
|
||||||
|
"[ 19/16 → 5/4 | s:hh ]",
|
||||||
|
"[ 5/4 → 21/16 | s:hh ]",
|
||||||
|
"[ 3/2 → 25/16 | s:hh ]",
|
||||||
|
"[ 25/16 → 13/8 | s:hh ]",
|
||||||
|
"[ 13/8 → 27/16 | s:hh ]",
|
||||||
|
"[ 7/4 → 29/16 | s:hh ]",
|
||||||
|
"[ 29/16 → 15/8 | s:hh ]",
|
||||||
|
"[ 2/1 → 33/16 | s:hh ]",
|
||||||
|
"[ 33/16 → 17/8 | s:hh ]",
|
||||||
|
"[ 35/16 → 9/4 | s:hh ]",
|
||||||
|
"[ 9/4 → 37/16 | s:hh ]",
|
||||||
|
"[ 5/2 → 41/16 | s:hh ]",
|
||||||
|
"[ 41/16 → 21/8 | s:hh ]",
|
||||||
|
"[ 21/8 → 43/16 | s:hh ]",
|
||||||
|
"[ 11/4 → 45/16 | s:hh ]",
|
||||||
|
"[ 45/16 → 23/8 | s:hh ]",
|
||||||
|
"[ 3/1 → 49/16 | s:hh ]",
|
||||||
|
"[ 49/16 → 25/8 | s:hh ]",
|
||||||
|
"[ 51/16 → 13/4 | s:hh ]",
|
||||||
|
"[ 13/4 → 53/16 | s:hh ]",
|
||||||
|
"[ 7/2 → 57/16 | s:hh ]",
|
||||||
|
"[ 57/16 → 29/8 | s:hh ]",
|
||||||
|
"[ 29/8 → 59/16 | s:hh ]",
|
||||||
|
"[ 15/4 → 61/16 | s:hh ]",
|
||||||
|
"[ 61/16 → 31/8 | s:hh ]",
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
exports[`runs examples > example "bite" example index 0 1`] = `
|
exports[`runs examples > example "bite" example index 0 1`] = `
|
||||||
[
|
[
|
||||||
"[ 0/1 → 1/8 | note:Bb3 ]",
|
"[ 0/1 → 1/8 | note:Bb3 ]",
|
||||||
|
|||||||
@ -55,6 +55,14 @@ These are the equivalents used by the Mini Notation:
|
|||||||
|
|
||||||
## run
|
## run
|
||||||
|
|
||||||
<JsDoc client:idle name="run" h={0} punchcard />
|
<JsDoc client:idle name="run" h={0} />
|
||||||
|
|
||||||
|
## binary
|
||||||
|
|
||||||
|
<JsDoc client:idle name="binary" h={0} />
|
||||||
|
|
||||||
|
## binaryN
|
||||||
|
|
||||||
|
<JsDoc client:idle name="binaryN" h={0} />
|
||||||
|
|
||||||
After Pattern Constructors, let's see what [Time Modifiers](/learn/time-modifiers) are available.
|
After Pattern Constructors, let's see what [Time Modifiers](/learn/time-modifiers) are available.
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user