diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index 66e75083..1d737df4 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -2276,7 +2276,7 @@ const _loopAt = function (factor, pat, cps = 1) { * s("breaks165").slice(8, "0 1 <2 2*2> 3 [4 0] 5 6 7".every(3, rev)).slow(1.5) */ -const slice = register( +export const slice = register( 'slice', function (npat, ipat, opat) { return npat.innerBind((n) => @@ -2304,7 +2304,7 @@ const slice = register( * s("breaks165").splice(8, "0 1 [2 3 0]@2 3 0@2 7").hurry(0.65) */ -const splice = register( +export const splice = register( 'splice', function (npat, ipat, opat) { const sliced = slice(npat, ipat, opat); @@ -2321,10 +2321,6 @@ const splice = register( false, // turns off auto-patternification ); -const { loopAt, loopat } = register(['loopAt', 'loopat'], function (factor, pat) { - return _loopAt(factor, pat, 1); -}); - /** * Makes the sample fit the given number of cycles and cps value, by * changing the speed. Please note that at some point cps will be @@ -2338,6 +2334,6 @@ const { loopAt, loopat } = register(['loopAt', 'loopat'], function (factor, pat) * s("rhodes").loopAtCps(4,1.5).cps(1.5) */ // TODO - global cps clock -const { loopAtCps, loopatcps } = register(['loopAtCps', 'loopatcps'], function (factor, cps, pat) { +export const { loopAtCps, loopatcps } = register(['loopAtCps', 'loopatcps'], function (factor, cps, pat) { return _loopAt(factor, pat, cps); }); diff --git a/packages/core/repl.mjs b/packages/core/repl.mjs index c88145d1..3d542a9c 100644 --- a/packages/core/repl.mjs +++ b/packages/core/repl.mjs @@ -3,6 +3,7 @@ import { evaluate as _evaluate } from './evaluate.mjs'; import { logger } from './logger.mjs'; import { setTime } from './time.mjs'; import { evalScope } from './evaluate.mjs'; +import { register } from './pattern.mjs'; export function repl({ interval, @@ -50,10 +51,32 @@ export function repl({ const start = () => scheduler.start(); const pause = () => scheduler.pause(); const setCps = (cps) => scheduler.setCps(cps); + const setCpm = (cpm) => scheduler.setCps(cpm / 60); + + // the following functions use the cps value, which is why they are defined here.. + const loopAt = register('loopAt', (cycles, pat) => { + return pat.loopAtCps(cycles, scheduler.cps); + }); + + const fay = register('fay', (pat) => + pat.withHap((hap) => + hap.withValue((v) => ({ + ...v, + speed: scheduler.cps / hap.whole.duration, // overwrite speed completely? + unit: 'c', + })), + ), + ); + evalScope({ + loopAt, + fay, setCps, setcps: setCps, + setCpm, + setcpm: setCpm, }); + return { scheduler, evaluate, start, stop, pause, setCps, setPattern }; }