mirror of
https://codeberg.org/uzu/strudel
synced 2026-08-01 05:27:18 -04:00
now running smooth without memoization
This commit is contained in:
+1
-1
@@ -31,7 +31,7 @@ Pattern.prototype.draw = function (callback, cycleSpan, lookaheadCycles = 1) {
|
||||
const end = (currentCycle + lookaheadCycles) * cycleSpan;
|
||||
events = this._asNumber(true) // true = silent error
|
||||
.query(new State(new TimeSpan(begin, end)))
|
||||
.filter((event) => event.part.begin.valueOf() === event.whole.begin.valueOf());
|
||||
.filter((event) => event.part.begin.equals(event.whole.begin));
|
||||
}
|
||||
}
|
||||
callback(ctx, events, t, cycleSpan, time);
|
||||
|
||||
+2
-1
@@ -1,6 +1,7 @@
|
||||
import { Pattern, timeCat } from '../../strudel.mjs';
|
||||
import bjork from 'bjork';
|
||||
import { rotate } from '../../util.mjs';
|
||||
import Fraction from 'fraction.js';
|
||||
|
||||
const euclid = (pulses, steps, rotation = 0) => {
|
||||
const b = bjork(steps, pulses);
|
||||
@@ -22,7 +23,7 @@ Pattern.prototype.euclidLegato = function (pulses, steps, rotation = 0) {
|
||||
.split('1')
|
||||
.slice(1)
|
||||
.map((s) => [s.length + 1, true]);
|
||||
return this.struct(timeCat(...gapless)).late(firstOne / steps);
|
||||
return this.struct(timeCat(...gapless)).late(Fraction(firstOne).div(steps));
|
||||
};
|
||||
|
||||
export default euclid;
|
||||
|
||||
+5
-2
@@ -12,7 +12,7 @@ const applyOptions = (parent: any) => (pat: any, i: number) => {
|
||||
if (operator) {
|
||||
switch (operator.type_) {
|
||||
case 'stretch':
|
||||
const speed = new Fraction(operator.arguments_.amount).inverse().valueOf();
|
||||
const speed = new Fraction(operator.arguments_.amount).inverse();
|
||||
return reify(pat).fast(speed);
|
||||
case 'bjorklund':
|
||||
return pat.euclid(operator.arguments_.pulse, operator.arguments_.step, operator.arguments_.rotation);
|
||||
@@ -56,7 +56,9 @@ function resolveReplications(ast) {
|
||||
options_: {
|
||||
operator: {
|
||||
type_: 'stretch',
|
||||
arguments_: { amount: String(new Fraction(replicate).inverse().valueOf()) },
|
||||
// valueOf should be ok here, as we turn it into a string
|
||||
// fraction.js doc: "If you want to keep the number as it is, convert it to a string, as the string parser will not perform any further observations"
|
||||
arguments_: { amount: String(new Fraction(replicate).inverse().valueOf()) },
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -103,6 +105,7 @@ export function patternifyAST(ast: any): any {
|
||||
return ast.source_;
|
||||
}
|
||||
const { start, end } = ast.location_;
|
||||
// should we really parse as number here? strings wont be fareyed...
|
||||
const value = !isNaN(Number(ast.source_)) ? Number(ast.source_) : ast.source_;
|
||||
// return ast.source_;
|
||||
// the following line expects the shapeshifter to wrap this in withLocationOffset
|
||||
|
||||
+1
-1
@@ -24,7 +24,7 @@ async function playStatic(code) {
|
||||
start = performance.now();
|
||||
const events = pat
|
||||
?.query(new State(new TimeSpan(0, seconds)))
|
||||
?.filter((event) => event.part.begin.valueOf() === event.whole.begin.valueOf())
|
||||
?.filter((event) => event.part.begin.equals(event.whole.begin))
|
||||
?.map((event) => ({
|
||||
time: event.whole.begin.valueOf(),
|
||||
duration: event.whole.end.sub(event.whole.begin).valueOf(),
|
||||
|
||||
Vendored
+1
@@ -7,6 +7,7 @@ export declare interface Fraction {
|
||||
s: number;
|
||||
sub: (f: Fraction) => Fraction;
|
||||
sam: () => Fraction;
|
||||
equals: (f: Fraction) => boolean;
|
||||
}
|
||||
export declare interface TimeSpan {
|
||||
constructor: any; //?
|
||||
|
||||
@@ -40,7 +40,7 @@ function useCycle(props: UseCycleProps) {
|
||||
|
||||
// schedule events for next cycle
|
||||
events
|
||||
?.filter((event) => event.part.begin.valueOf() === event.whole.begin.valueOf())
|
||||
?.filter((event) => event.part.begin.equals(event.whole.begin))
|
||||
.forEach((event) => {
|
||||
Tone.getTransport().schedule((time) => {
|
||||
const toneEvent = {
|
||||
|
||||
Reference in New Issue
Block a user