This commit is contained in:
Felix Roos 2022-03-18 17:39:14 +01:00
parent 6691afb9b9
commit 8af4a92fc0
7 changed files with 44 additions and 30 deletions

View File

@ -179,14 +179,6 @@ export class State {
class Pattern { class Pattern {
constructor(query) { constructor(query) {
this.query = query; this.query = query;
const proto = Object.getPrototypeOf(this);
proto.patternified.forEach((prop) => {
this[prop] = (...args) => this._patternify(Pattern.prototype["_" + prop])(...args);
Object.assign(this[prop], Object.fromEntries(Object.entries(Pattern.prototype.factories).map(([type, func]) => [
type,
(...args) => this[prop](func(...args))
])));
});
} }
_splitQueries() { _splitQueries() {
const pat = this; const pat = this;
@ -735,13 +727,18 @@ Pattern.prototype.define = (name, func, options = {}) => {
}; };
Pattern.prototype.define("hush", (pat) => pat.hush(), {patternified: false, composable: true}); Pattern.prototype.define("hush", (pat) => pat.hush(), {patternified: false, composable: true});
Pattern.prototype.define("bypass", (pat) => pat.bypass(on), {patternified: true, composable: true}); Pattern.prototype.define("bypass", (pat) => pat.bypass(on), {patternified: true, composable: true});
Pattern.prototype.bootstrap = () => { Pattern.prototype.bootstrap = function() {
const bootstrapped = Object.fromEntries(Object.entries(Pattern.prototype.composable).map(([functionName, composable]) => { const bootstrapped = Object.fromEntries(Object.entries(Pattern.prototype.composable).map(([functionName, composable]) => {
if (Pattern.prototype[functionName]) { if (Pattern.prototype[functionName]) {
Pattern.prototype[functionName] = makeComposable(Pattern.prototype[functionName]); Pattern.prototype[functionName] = makeComposable(Pattern.prototype[functionName]);
} }
return [functionName, curry(composable, makeComposable)]; return [functionName, curry(composable, makeComposable)];
})); }));
this.patternified.forEach((prop) => {
Pattern.prototype[prop] = function(...args) {
return this._patternify(Pattern.prototype["_" + prop])(...args);
};
});
return bootstrapped; return bootstrapped;
}; };
function withLocationOffset(pat, offset) { function withLocationOffset(pat, offset) {

2
docs/dist/tunes.js vendored
View File

@ -226,7 +226,7 @@ export const magicSofa = `stack(
.every(2, fast(2)) .every(2, fast(2))
.voicings(), .voicings(),
"<c2 f2 g2> <d2 g2 a2 e2>" "<c2 f2 g2> <d2 g2 a2 e2>"
).slow(1).transpose.slowcat(0, 2, 3, 4)`; ).slow(1).transpose(slowcat(0, 2, 3, 4))`;
export const confusedPhone = `"[g2 ~@1.3] [c3 ~@1.3]" export const confusedPhone = `"[g2 ~@1.3] [c3 ~@1.3]"
.superimpose( .superimpose(
transpose(-12).late(0), transpose(-12).late(0),

View File

@ -34,7 +34,7 @@ function useCycle(props) {
}; };
useEffect(() => { useEffect(() => {
ready && query(); ready && query();
}, [onEvent, onSchedule, onQuery, ready]); }, [onEvent, onSchedule, onQuery, onDraw, ready]);
const start = async () => { const start = async () => {
setStarted(true); setStarted(true);
await Tone.start(); await Tone.start();

View File

@ -47,6 +47,11 @@ function useRepl({tune, defaultSynth, autolink = true, onEvent, onDraw}) {
if (_events.length) { if (_events.length) {
} }
}; };
onDraw = useMemo(() => {
if (activeCode && !activeCode.includes("strudel disable-highlighting")) {
return onDraw;
}
}, [activeCode]);
const cycle = useCycle({ const cycle = useCycle({
onDraw, onDraw,
onEvent: useCallback((time, event) => { onEvent: useCallback((time, event) => {

View File

@ -41802,6 +41802,12 @@ function useRepl({ tune , defaultSynth , autolink =true , onEvent , onDraw }) {
const logCycle = (_events, cycle)=>{ const logCycle = (_events, cycle)=>{
_events.length; _events.length;
}; };
// below block allows disabling the highlighting by including "strudel disable-highlighting" in the code (as comment)
onDraw = _react.useMemo(()=>{
if (activeCode && !activeCode.includes('strudel disable-highlighting')) return onDraw;
}, [
activeCode
]);
// cycle hook to control scheduling // cycle hook to control scheduling
const cycle1 = _useCycleDefault.default({ const cycle1 = _useCycleDefault.default({
onDraw, onDraw,
@ -42358,21 +42364,6 @@ class Pattern {
// the following functions will get patternFactories as nested functions: // the following functions will get patternFactories as nested functions:
constructor(query){ constructor(query){
this.query = query; this.query = query;
// the following code will assign `patternFactories` as child functions to all methods of Pattern that don't start with '_'
const proto = Object.getPrototypeOf(this);
// proto.patternified is defined below Pattern class. You can add more patternified functions from outside.
proto.patternified.forEach((prop)=>{
// patternify function
this[prop] = (...args)=>this._patternify(Pattern.prototype['_' + prop])(...args)
;
// with the following, you can do, e.g. `stack(c3).fast.slowcat(1, 2, 4, 8)` instead of `stack(c3).fast(slowcat(1, 2, 4, 8))`
Object.assign(this[prop], Object.fromEntries(Object.entries(Pattern.prototype.factories).map(([type, func])=>[
type,
(...args)=>this[prop](func(...args))
,
]
)));
});
} }
_splitQueries() { _splitQueries() {
// Splits queries at cycle boundaries. This makes some calculations // Splits queries at cycle boundaries. This makes some calculations
@ -43133,7 +43124,7 @@ Pattern.prototype.define('bypass', (pat)=>pat.bypass(on)
composable: true composable: true
}); });
// call this after all Patter.prototype.define calls have been executed! (right before evaluate) // call this after all Patter.prototype.define calls have been executed! (right before evaluate)
Pattern.prototype.bootstrap = ()=>{ Pattern.prototype.bootstrap = function() {
// makeComposable(Pattern.prototype); // makeComposable(Pattern.prototype);
const bootstrapped = Object.fromEntries(Object.entries(Pattern.prototype.composable).map(([functionName, composable])=>{ const bootstrapped = Object.fromEntries(Object.entries(Pattern.prototype.composable).map(([functionName, composable])=>{
if (Pattern.prototype[functionName]) // without this, 'C^7'.m.chordBass.transpose(2) will throw "C^7".m.chordBass.transpose is not a function if (Pattern.prototype[functionName]) // without this, 'C^7'.m.chordBass.transpose(2) will throw "C^7".m.chordBass.transpose is not a function
@ -43143,6 +43134,26 @@ Pattern.prototype.bootstrap = ()=>{
curry(composable, makeComposable) curry(composable, makeComposable)
]; ];
})); }));
// note: this === Pattern.prototypetgh6z
this.patternified.forEach((prop)=>{
// the following will patternify all functions in Pattern.prototype.patternified
Pattern.prototype[prop] = function(...args) {
return this._patternify(Pattern.prototype['_' + prop])(...args);
};
// with the following, you can do, e.g. `stack(c3).fast.slowcat(1, 2, 4, 8)` instead of `stack(c3).fast(slowcat(1, 2, 4, 8))`
// TODO: find a way to implement below outside of constructor (code only worked there)
/* Object.assign(
Pattern.prototype[prop],
Object.fromEntries(
Object.entries(Pattern.prototype.factories).map(([type, func]) => [
type,
function(...args) {
console.log('this', this);
return this[prop](func(...args))
}
])
)
); */ });
return bootstrapped; return bootstrapped;
}; };
// this is wrapped around mini patterns to offset krill parser location into the global js code space // this is wrapped around mini patterns to offset krill parser location into the global js code space
@ -171906,6 +171917,7 @@ function useCycle(props) {
onEvent, onEvent,
onSchedule, onSchedule,
onQuery, onQuery,
onDraw,
ready ready
]); ]);
const start = async ()=>{ const start = async ()=>{
@ -183291,4 +183303,4 @@ exports.default = cx;
},{"@parcel/transformer-js/src/esmodule-helpers.js":"gkKU3"}]},["3uVTb"], "3uVTb", "parcelRequire94c2") },{"@parcel/transformer-js/src/esmodule-helpers.js":"gkKU3"}]},["3uVTb"], "3uVTb", "parcelRequire94c2")
//# sourceMappingURL=index.dd5b0e5b.js.map //# sourceMappingURL=index.f8c9aeff.js.map

File diff suppressed because one or more lines are too long

View File

@ -11,6 +11,6 @@
<body> <body>
<div id="root"></div> <div id="root"></div>
<noscript>You need to enable JavaScript to run this app.</noscript> <noscript>You need to enable JavaScript to run this app.</noscript>
<script src="/tutorial/index.dd5b0e5b.js" defer=""></script> <script src="/tutorial/index.f8c9aeff.js" defer=""></script>
</body> </body>
</html> </html>