p and q methods + all function

This commit is contained in:
Felix Roos 2023-11-16 06:52:47 +01:00
parent ee7cd8cd4c
commit a7b799f154
2 changed files with 34 additions and 15 deletions

View File

@ -47,10 +47,5 @@ export const evaluate = async (code, transpiler) => {
// if no transpiler is given, we expect a single instruction (!wrapExpression) // if no transpiler is given, we expect a single instruction (!wrapExpression)
const options = { wrapExpression: !!transpiler }; const options = { wrapExpression: !!transpiler };
let evaluated = await safeEval(code, options); let evaluated = await safeEval(code, options);
if (!isPattern(evaluated)) {
console.log('evaluated', evaluated);
const message = `got "${typeof evaluated}" instead of pattern`;
throw new Error(message + (typeof evaluated === 'function' ? ', did you forget to call a function?' : '.'));
}
return { mode: 'javascript', pattern: evaluated, meta }; return { mode: 'javascript', pattern: evaluated, meta };
}; };

View File

@ -3,7 +3,7 @@ import { evaluate as _evaluate } from './evaluate.mjs';
import { logger } from './logger.mjs'; import { logger } from './logger.mjs';
import { setTime } from './time.mjs'; import { setTime } from './time.mjs';
import { evalScope } from './evaluate.mjs'; import { evalScope } from './evaluate.mjs';
import { register } from './pattern.mjs'; import { register, Pattern, isPattern } from './pattern.mjs';
export function repl({ export function repl({
interval, interval,
@ -24,7 +24,8 @@ export function repl({
getTime, getTime,
onToggle, onToggle,
}); });
let playPatterns = []; let pPatterns = {};
let allTransform;
const setPattern = (pattern, autostart = true) => { const setPattern = (pattern, autostart = true) => {
pattern = editPattern?.(pattern) || pattern; pattern = editPattern?.(pattern) || pattern;
scheduler.setPattern(pattern, autostart); scheduler.setPattern(pattern, autostart);
@ -36,10 +37,18 @@ export function repl({
} }
try { try {
await beforeEval?.({ code }); await beforeEval?.({ code });
playPatterns = []; pPatterns = {};
allTransform = undefined;
let { pattern, meta } = await _evaluate(code, transpiler); let { pattern, meta } = await _evaluate(code, transpiler);
if (playPatterns.length) { if (Object.keys(pPatterns).length) {
pattern = pattern.stack(...playPatterns); pattern = stack(...Object.values(pPatterns));
if (allTransform) {
pattern = allTransform(pattern);
}
}
if (!isPattern(pattern)) {
const message = `got "${typeof evaluated}" instead of pattern`;
throw new Error(message + (typeof evaluated === 'function' ? ', did you forget to call a function?' : '.'));
} }
logger(`[eval] code updated`); logger(`[eval] code updated`);
setPattern(pattern, autostart); setPattern(pattern, autostart);
@ -62,10 +71,25 @@ export function repl({
return pat.loopAtCps(cycles, scheduler.cps); return pat.loopAtCps(cycles, scheduler.cps);
}); });
const play = register('play', (pat) => { Pattern.prototype.p = function (id) {
playPatterns.push(pat); pPatterns[id] = this;
return pat; return this;
}); };
Pattern.prototype.q = function (id) {
return silence;
};
const all = function (transform) {
allTransform = transform;
};
for (let i = 1; i < 10; ++i) {
Object.defineProperty(Pattern.prototype, `d${i}`, {
get() {
return this.p(i);
},
});
}
const fit = register('fit', (pat) => const fit = register('fit', (pat) =>
pat.withHap((hap) => pat.withHap((hap) =>
@ -80,7 +104,7 @@ export function repl({
evalScope({ evalScope({
loopAt, loopAt,
fit, fit,
play, all,
setCps, setCps,
setcps: setCps, setcps: setCps,
setCpm, setCpm,