From 1b0427e9434e7045445411be20199fe63081271b Mon Sep 17 00:00:00 2001 From: "Alexandre G.-Raymond" Date: Sat, 11 Nov 2023 16:23:58 +0100 Subject: [PATCH 01/13] Document wordfall --- packages/core/pianoroll.mjs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/core/pianoroll.mjs b/packages/core/pianoroll.mjs index c10460a4..254dd94a 100644 --- a/packages/core/pianoroll.mjs +++ b/packages/core/pianoroll.mjs @@ -262,6 +262,12 @@ Pattern.prototype.punchcard = function (options) { ); }; +/** + * Displays a vertical pianoroll with event labels. + * Supports all the same options as pianoroll. + * + * @name wordfall + */ Pattern.prototype.wordfall = function (options) { return this.punchcard({ vertical: 1, labels: 1, stroke: 0, fillActive: 1, active: 'white', ...options }); }; From 2d6654b234509a683bb4ee3d4ad9525f864397ae Mon Sep 17 00:00:00 2001 From: "Alexandre G.-Raymond" Date: Sat, 11 Nov 2023 16:24:09 +0100 Subject: [PATCH 02/13] Document slider --- packages/codemirror/slider.mjs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/codemirror/slider.mjs b/packages/codemirror/slider.mjs index 519e5610..a22f4d2a 100644 --- a/packages/codemirror/slider.mjs +++ b/packages/codemirror/slider.mjs @@ -111,6 +111,15 @@ export const sliderPlugin = ViewPlugin.fromClass( }, ); +/** + * Displays a slider widget to allow the user manipulate a value + * + * @name slider + * @param {number} value Initial value + * @param {number} min Minimum value + * @param {number} max Maximum value + * @param {number} step Step size + */ export let slider = (value) => { console.warn('slider will only work when the transpiler is used... passing value as is'); return pure(value); From e52e257d9b533e2005e97772d75178393bd36a76 Mon Sep 17 00:00:00 2001 From: "Alexandre G.-Raymond" Date: Sat, 11 Nov 2023 17:03:21 +0100 Subject: [PATCH 03/13] Document euclidLegatoRot --- packages/core/euclid.mjs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/packages/core/euclid.mjs b/packages/core/euclid.mjs index 29539cf9..e6240920 100644 --- a/packages/core/euclid.mjs +++ b/packages/core/euclid.mjs @@ -145,6 +145,8 @@ export const { euclidrot, euclidRot } = register(['euclidrot', 'euclidRot'], fun * so there will be no gaps. * @name euclidLegato * @memberof Pattern + * @param {number} pulses the number of onsets / beats + * @param {number} steps the number of steps to fill * @example * n("g2").decay(.1).sustain(.3).euclidLegato(3,8) */ @@ -166,6 +168,18 @@ export const euclidLegato = register(['euclidLegato'], function (pulses, steps, return _euclidLegato(pulses, steps, 0, pat); }); +/** + * Similar to `euclid`, but each pulse is held until the next pulse, + * so there will be no gaps, and has an additional parameter for 'rotating' + * the resulting sequence + * @name euclidLegatoRot + * @memberof Pattern + * @param {number} pulses the number of onsets / beats + * @param {number} steps the number of steps to fill + * @param {number} rotation offset in steps + * @example + * note("c3").euclidLegatoRot(3,5,2) + */ export const euclidLegatoRot = register(['euclidLegatoRot'], function (pulses, steps, rotation, pat) { return _euclidLegato(pulses, steps, rotation, pat); }); From 8a7ff9e01d329b2b838a045e78f306690cec450a Mon Sep 17 00:00:00 2001 From: "Alexandre G.-Raymond" Date: Sat, 11 Nov 2023 17:24:18 +0100 Subject: [PATCH 04/13] Add snapshot for euclidLegatoRot --- test/__snapshots__/examples.test.mjs.snap | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index d02acdef..446e8d2d 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -1798,6 +1798,23 @@ exports[`runs examples > example "euclidLegato" example index 0 1`] = ` ] `; +exports[`runs examples > example "euclidLegatoRot" example index 0 1`] = ` +[ + "[ 0/1 → 1/4 | note:c3 ]", + "[ 1/4 → 3/4 | note:c3 ]", + "[ 3/4 → 1/1 | note:c3 ]", + "[ 1/1 → 5/4 | note:c3 ]", + "[ 5/4 → 7/4 | note:c3 ]", + "[ 7/4 → 2/1 | note:c3 ]", + "[ 2/1 → 9/4 | note:c3 ]", + "[ 9/4 → 11/4 | note:c3 ]", + "[ 11/4 → 3/1 | note:c3 ]", + "[ 3/1 → 13/4 | note:c3 ]", + "[ 13/4 → 15/4 | note:c3 ]", + "[ 15/4 → 4/1 | note:c3 ]", +] +`; + exports[`runs examples > example "euclidRot" example index 0 1`] = ` [ "[ 3/16 → 1/4 | note:c3 ]", From ef14074164833db89e6d0dc222a1c1089faff524 Mon Sep 17 00:00:00 2001 From: Kaspars Date: Wed, 15 Nov 2023 22:38:00 +0100 Subject: [PATCH 05/13] add option to disable active line highlighting in Code Settings --- packages/react/src/components/CodeMirror6.jsx | 9 ++++++++- packages/react/src/components/MiniRepl.jsx | 2 ++ website/src/docs/MiniRepl.jsx | 3 ++- website/src/repl/Footer.jsx | 6 ++++++ website/src/repl/Repl.jsx | 2 ++ website/src/settings.mjs | 2 ++ 6 files changed, 22 insertions(+), 2 deletions(-) diff --git a/packages/react/src/components/CodeMirror6.jsx b/packages/react/src/components/CodeMirror6.jsx index 667cd7e6..4852b287 100644 --- a/packages/react/src/components/CodeMirror6.jsx +++ b/packages/react/src/components/CodeMirror6.jsx @@ -33,6 +33,7 @@ export default function CodeMirror({ theme, keybindings, isLineNumbersDisplayed, + isActiveLineHighlighted, isAutoCompletionEnabled, isTooltipEnabled, isLineWrappingEnabled, @@ -109,7 +110,13 @@ export default function CodeMirror({ return _extensions; }, [keybindings, isAutoCompletionEnabled, isTooltipEnabled, isLineWrappingEnabled]); - const basicSetup = useMemo(() => ({ lineNumbers: isLineNumbersDisplayed }), [isLineNumbersDisplayed]); + const basicSetup = useMemo( + () => ({ + lineNumbers: isLineNumbersDisplayed, + highlightActiveLine: isActiveLineHighlighted, + }), + [isLineNumbersDisplayed, isActiveLineHighlighted], + ); return (
diff --git a/packages/react/src/components/MiniRepl.jsx b/packages/react/src/components/MiniRepl.jsx index 12500874..edf0a325 100644 --- a/packages/react/src/components/MiniRepl.jsx +++ b/packages/react/src/components/MiniRepl.jsx @@ -30,6 +30,7 @@ export function MiniRepl({ theme, keybindings, isLineNumbersDisplayed, + isActiveLineHighlighted, }) { drawTime = drawTime || (punchcard ? [0, 4] : undefined); const evalOnMount = !!drawTime; @@ -164,6 +165,7 @@ export function MiniRepl({ fontSize={fontSize} keybindings={keybindings} isLineNumbersDisplayed={isLineNumbersDisplayed} + highlightActiveLineGutter={isActiveLineHighlighted} /> )} {error &&
{error.message}
} diff --git a/website/src/docs/MiniRepl.jsx b/website/src/docs/MiniRepl.jsx index 4b2fcfa8..4b37ebad 100644 --- a/website/src/docs/MiniRepl.jsx +++ b/website/src/docs/MiniRepl.jsx @@ -41,7 +41,7 @@ export function MiniRepl({ claviatureLabels, }) { const [Repl, setRepl] = useState(); - const { theme, keybindings, fontSize, fontFamily, isLineNumbersDisplayed } = useSettings(); + const { theme, keybindings, fontSize, fontFamily, isLineNumbersDisplayed, isActiveLineHighlighted } = useSettings(); const [activeNotes, setActiveNotes] = useState([]); useEffect(() => { // we have to load this package on the client @@ -66,6 +66,7 @@ export function MiniRepl({ fontFamily={fontFamily} fontSize={fontSize} isLineNumbersDisplayed={isLineNumbersDisplayed} + isActiveLineHighlighted={isActiveLineHighlighted} onPaint={ claviature ? (ctx, time, haps, drawTime) => { diff --git a/website/src/repl/Footer.jsx b/website/src/repl/Footer.jsx index 62dcbcdf..b03f62d0 100644 --- a/website/src/repl/Footer.jsx +++ b/website/src/repl/Footer.jsx @@ -384,6 +384,7 @@ function SettingsTab({ scheduler }) { theme, keybindings, isLineNumbersDisplayed, + isActiveLineHighlighted, isAutoCompletionEnabled, isTooltipEnabled, isLineWrappingEnabled, @@ -453,6 +454,11 @@ function SettingsTab({ scheduler }) { onChange={(cbEvent) => settingsMap.setKey('isLineNumbersDisplayed', cbEvent.target.checked)} value={isLineNumbersDisplayed} /> + settingsMap.setKey('isActiveLineHighlighted', cbEvent.target.checked)} + value={isActiveLineHighlighted} + /> settingsMap.setKey('isAutoCompletionEnabled', cbEvent.target.checked)} diff --git a/website/src/repl/Repl.jsx b/website/src/repl/Repl.jsx index 41d4a35f..2700bcf9 100644 --- a/website/src/repl/Repl.jsx +++ b/website/src/repl/Repl.jsx @@ -125,6 +125,7 @@ export function Repl({ embedded = false }) { fontSize, fontFamily, isLineNumbersDisplayed, + isActiveLineHighlighted, isAutoCompletionEnabled, isTooltipEnabled, isLineWrappingEnabled, @@ -335,6 +336,7 @@ export function Repl({ embedded = false }) { value={code} keybindings={keybindings} isLineNumbersDisplayed={isLineNumbersDisplayed} + isActiveLineHighlighted={isActiveLineHighlighted} isAutoCompletionEnabled={isAutoCompletionEnabled} isTooltipEnabled={isTooltipEnabled} isLineWrappingEnabled={isLineWrappingEnabled} diff --git a/website/src/settings.mjs b/website/src/settings.mjs index ab58494c..9f6d2d90 100644 --- a/website/src/settings.mjs +++ b/website/src/settings.mjs @@ -6,6 +6,7 @@ export const defaultSettings = { activeFooter: 'intro', keybindings: 'codemirror', isLineNumbersDisplayed: true, + isActiveLineHighlighted: true, isAutoCompletionEnabled: false, isTooltipEnabled: false, isLineWrappingEnabled: false, @@ -26,6 +27,7 @@ export function useSettings() { ...state, isZen: [true, 'true'].includes(state.isZen) ? true : false, isLineNumbersDisplayed: [true, 'true'].includes(state.isLineNumbersDisplayed) ? true : false, + isActiveLineHighlighted: [true, 'true'].includes(state.isActiveLineHighlighted) ? true : false, isAutoCompletionEnabled: [true, 'true'].includes(state.isAutoCompletionEnabled) ? true : false, isTooltipEnabled: [true, 'true'].includes(state.isTooltipEnabled) ? true : false, isLineWrappingEnabled: [true, 'true'].includes(state.isLineWrappingEnabled) ? true : false, From 2d1fcf4a8d1230980b4d56a70c402bcae476043b Mon Sep 17 00:00:00 2001 From: Kaspars Date: Wed, 15 Nov 2023 22:53:56 +0100 Subject: [PATCH 06/13] fix typo --- packages/react/src/components/MiniRepl.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react/src/components/MiniRepl.jsx b/packages/react/src/components/MiniRepl.jsx index edf0a325..c7f70907 100644 --- a/packages/react/src/components/MiniRepl.jsx +++ b/packages/react/src/components/MiniRepl.jsx @@ -165,7 +165,7 @@ export function MiniRepl({ fontSize={fontSize} keybindings={keybindings} isLineNumbersDisplayed={isLineNumbersDisplayed} - highlightActiveLineGutter={isActiveLineHighlighted} + isActiveLineHighlighted={isActiveLineHighlighted} /> )} {error &&
{error.message}
} From ee7cd8cd4c38cd57450509a3f7911554f3383715 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Thu, 16 Nov 2023 06:51:51 +0100 Subject: [PATCH 07/13] remove pseudo note variables --- packages/transpiler/transpiler.mjs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/packages/transpiler/transpiler.mjs b/packages/transpiler/transpiler.mjs index 256be1d2..4e66a57c 100644 --- a/packages/transpiler/transpiler.mjs +++ b/packages/transpiler/transpiler.mjs @@ -47,11 +47,6 @@ export function transpiler(input, options = {}) { }); return this.replace(widgetWithLocation(node)); } - // TODO: remove pseudo note variables? - if (node.type === 'Identifier' && isNoteWithOctave(node.name)) { - this.skip(); - return this.replace({ type: 'Literal', value: node.name }); - } }, leave(node, parent, prop, index) {}, }); From a7b799f1544096de99ef2aeff4e32c98a21697bd Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Thu, 16 Nov 2023 06:52:47 +0100 Subject: [PATCH 08/13] p and q methods + all function --- packages/core/evaluate.mjs | 5 ----- packages/core/repl.mjs | 44 +++++++++++++++++++++++++++++--------- 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/packages/core/evaluate.mjs b/packages/core/evaluate.mjs index 9627a2ad..340febe5 100644 --- a/packages/core/evaluate.mjs +++ b/packages/core/evaluate.mjs @@ -47,10 +47,5 @@ export const evaluate = async (code, transpiler) => { // if no transpiler is given, we expect a single instruction (!wrapExpression) const options = { wrapExpression: !!transpiler }; 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 }; }; diff --git a/packages/core/repl.mjs b/packages/core/repl.mjs index 67e2812d..91b8ea26 100644 --- a/packages/core/repl.mjs +++ b/packages/core/repl.mjs @@ -3,7 +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'; +import { register, Pattern, isPattern } from './pattern.mjs'; export function repl({ interval, @@ -24,7 +24,8 @@ export function repl({ getTime, onToggle, }); - let playPatterns = []; + let pPatterns = {}; + let allTransform; const setPattern = (pattern, autostart = true) => { pattern = editPattern?.(pattern) || pattern; scheduler.setPattern(pattern, autostart); @@ -36,10 +37,18 @@ export function repl({ } try { await beforeEval?.({ code }); - playPatterns = []; + pPatterns = {}; + allTransform = undefined; let { pattern, meta } = await _evaluate(code, transpiler); - if (playPatterns.length) { - pattern = pattern.stack(...playPatterns); + if (Object.keys(pPatterns).length) { + 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`); setPattern(pattern, autostart); @@ -62,10 +71,25 @@ export function repl({ return pat.loopAtCps(cycles, scheduler.cps); }); - const play = register('play', (pat) => { - playPatterns.push(pat); - return pat; - }); + Pattern.prototype.p = function (id) { + pPatterns[id] = this; + 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) => pat.withHap((hap) => @@ -80,7 +104,7 @@ export function repl({ evalScope({ loopAt, fit, - play, + all, setCps, setcps: setCps, setCpm, From f43f627037fd7b5e7824c7180d574d1ef15087f3 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Thu, 16 Nov 2023 07:17:59 +0100 Subject: [PATCH 09/13] + add hush + add the ability to evaluate without clearing --- packages/core/pattern.mjs | 4 ++-- packages/core/repl.mjs | 19 +++++++++++++------ 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index f30d21c8..16a310ce 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -1975,9 +1975,9 @@ export const press = register('press', function (pat) { * s("hh*3") * ) */ -export const hush = register('hush', function (pat) { +Pattern.prototype.hush = function () { return silence; -}); +}; /** * Applies `rev` to a pattern every other cycle, so that the pattern alternates between forwards and backwards. diff --git a/packages/core/repl.mjs b/packages/core/repl.mjs index 91b8ea26..42726786 100644 --- a/packages/core/repl.mjs +++ b/packages/core/repl.mjs @@ -26,25 +26,31 @@ export function repl({ }); let pPatterns = {}; let allTransform; + + const hush = function () { + pPatterns = {}; + allTransform = undefined; + return silence; + }; + const setPattern = (pattern, autostart = true) => { pattern = editPattern?.(pattern) || pattern; scheduler.setPattern(pattern, autostart); }; setTime(() => scheduler.now()); // TODO: refactor? - const evaluate = async (code, autostart = true) => { + const evaluate = async (code, autostart = true, shouldHush = true) => { if (!code) { throw new Error('no code to evaluate'); } try { await beforeEval?.({ code }); - pPatterns = {}; - allTransform = undefined; + shouldHush && hush(); let { pattern, meta } = await _evaluate(code, transpiler); if (Object.keys(pPatterns).length) { pattern = stack(...Object.values(pPatterns)); - if (allTransform) { - pattern = allTransform(pattern); - } + } + if (allTransform) { + pattern = allTransform(pattern); } if (!isPattern(pattern)) { const message = `got "${typeof evaluated}" instead of pattern`; @@ -105,6 +111,7 @@ export function repl({ loopAt, fit, all, + hush, setCps, setcps: setCps, setCpm, From a4487179a5a5b10af4c7874fb1c425c1b8e62256 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Thu, 16 Nov 2023 07:25:20 +0100 Subject: [PATCH 10/13] fix tests --- packages/core/pattern.mjs | 10 +++++----- packages/core/repl.mjs | 2 +- packages/transpiler/test/transpiler.test.mjs | 3 --- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index 16a310ce..5a9a3fe8 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -1178,7 +1178,7 @@ export function reify(thing) { * @return {Pattern} * @synonyms polyrhythm, pr * @example - * stack(g3, b3, [e4, d4]).note() // "g3,b3,[e4,d4]".note() + * stack("g3", "b3", ["e4", "d4"]).note() // "g3,b3,[e4,d4]".note() */ export function stack(...pats) { // Array test here is to avoid infinite recursions.. @@ -1193,7 +1193,7 @@ export function stack(...pats) { * * @return {Pattern} * @example - * slowcat(e5, b4, [d5, c5]) + * slowcat("e5", "b4", ["d5", "c5"]) * */ export function slowcat(...pats) { @@ -1237,7 +1237,7 @@ export function slowcatPrime(...pats) { * @synonyms slowcat * @return {Pattern} * @example - * cat(e5, b4, [d5, c5]).note() // "".note() + * cat("e5", "b4", ["d5", "c5"]).note() // "".note() * */ export function cat(...pats) { @@ -1247,7 +1247,7 @@ export function cat(...pats) { /** Like {@link Pattern.seq}, but each step has a length, relative to the whole. * @return {Pattern} * @example - * timeCat([3,e3],[1, g3]).note() // "e3@3 g3".note() + * timeCat([3,"e3"],[1, "g3"]).note() // "e3@3 g3".note() */ export function timeCat(...timepats) { const total = timepats.map((a) => a[0]).reduce((a, b) => a.add(b), Fraction(0)); @@ -1287,7 +1287,7 @@ export function sequence(...pats) { /** Like **cat**, but the items are crammed into one cycle. * @synonyms fastcat, sequence * @example - * seq(e5, b4, [d5, c5]).note() // "e5 b4 [d5 c5]".note() + * seq("e5", "b4", ["d5", "c5"]).note() // "e5 b4 [d5 c5]".note() * */ export function seq(...pats) { diff --git a/packages/core/repl.mjs b/packages/core/repl.mjs index 42726786..c67e97d9 100644 --- a/packages/core/repl.mjs +++ b/packages/core/repl.mjs @@ -3,7 +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, Pattern, isPattern } from './pattern.mjs'; +import { register, Pattern, isPattern, silence, stack } from './pattern.mjs'; export function repl({ interval, diff --git a/packages/transpiler/test/transpiler.test.mjs b/packages/transpiler/test/transpiler.test.mjs index 1d14986d..5f1b754f 100644 --- a/packages/transpiler/test/transpiler.test.mjs +++ b/packages/transpiler/test/transpiler.test.mjs @@ -17,9 +17,6 @@ describe('transpiler', () => { it('wraps backtick string with mini and adds location', () => { expect(transpiler('`c3`', simple).output).toEqual("m('c3', 0);"); }); - it('replaces note variables with note strings', () => { - expect(transpiler('seq(c3, d3)', simple).output).toEqual("seq('c3', 'd3');"); - }); it('keeps tagged template literal as is', () => { expect(transpiler('xxx`c3`', simple).output).toEqual('xxx`c3`;'); }); From cb9ef3ee6adcf5190f6fcfb7241e0a655eef7115 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Fri, 17 Nov 2023 09:45:44 +0100 Subject: [PATCH 11/13] add q1 .. q9 shortcuts --- packages/core/repl.mjs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/core/repl.mjs b/packages/core/repl.mjs index c67e97d9..9e8097d9 100644 --- a/packages/core/repl.mjs +++ b/packages/core/repl.mjs @@ -87,6 +87,7 @@ export function repl({ const all = function (transform) { allTransform = transform; + return silence; }; for (let i = 1; i < 10; ++i) { @@ -95,6 +96,7 @@ export function repl({ return this.p(i); }, }); + Pattern.prototype[`q${i}`] = silence; } const fit = register('fit', (pat) => From 265f01eb0611c8fb3273717fa3645a83edefc427 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Fri, 17 Nov 2023 10:50:45 +0100 Subject: [PATCH 12/13] add p1 .. p9 shortcuts as well --- packages/core/repl.mjs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/core/repl.mjs b/packages/core/repl.mjs index 9e8097d9..3645d594 100644 --- a/packages/core/repl.mjs +++ b/packages/core/repl.mjs @@ -96,6 +96,11 @@ export function repl({ return this.p(i); }, }); + Object.defineProperty(Pattern.prototype, `p${i}`, { + get() { + return this.p(i); + }, + }); Pattern.prototype[`q${i}`] = silence; } From a3bf6975c403897ef2d2e407a260fd7434e6314b Mon Sep 17 00:00:00 2001 From: Alexandre Gravel-Raymond Date: Fri, 17 Nov 2023 15:33:53 +0100 Subject: [PATCH 13/13] Mark optional slider params --- packages/codemirror/slider.mjs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/codemirror/slider.mjs b/packages/codemirror/slider.mjs index a22f4d2a..1ae3deaf 100644 --- a/packages/codemirror/slider.mjs +++ b/packages/codemirror/slider.mjs @@ -116,9 +116,9 @@ export const sliderPlugin = ViewPlugin.fromClass( * * @name slider * @param {number} value Initial value - * @param {number} min Minimum value - * @param {number} max Maximum value - * @param {number} step Step size + * @param {number} min Minimum value - optional, defaults to 0 + * @param {number} max Maximum value - optional, defaults to 1 + * @param {number} step Step size - optional */ export let slider = (value) => { console.warn('slider will only work when the transpiler is used... passing value as is');