add experimental dur function
This commit is contained in:
@ -18,6 +18,7 @@ declare global {
|
|||||||
repeatEven(amount: number): T;
|
repeatEven(amount: number): T;
|
||||||
repeatOdd(amount: number): T;
|
repeatOdd(amount: number): T;
|
||||||
beat(division: number): T;
|
beat(division: number): T;
|
||||||
|
dur(durations: number[]): T;
|
||||||
b(division: number): T;
|
b(division: number): T;
|
||||||
bar(): T;
|
bar(): T;
|
||||||
pick(): T;
|
pick(): T;
|
||||||
@ -170,6 +171,46 @@ export const makeArrayExtensions = (api: UserAPI) => {
|
|||||||
};
|
};
|
||||||
Array.prototype.b = Array.prototype.beat;
|
Array.prototype.b = Array.prototype.beat;
|
||||||
|
|
||||||
|
// Array.prototype.dur = function(...durations) {
|
||||||
|
// const timepos = api.app.clock.pulses_since_origin;
|
||||||
|
// const ppqn = api.ppqn();
|
||||||
|
// let adjustedDurations = [];
|
||||||
|
// for (let i = 0; i < this.length; i++) {
|
||||||
|
// adjustedDurations.push(durations[i % durations.length]);
|
||||||
|
// }
|
||||||
|
// let cumulativeDuration = 0;
|
||||||
|
// let totalDuration = adjustedDurations.reduce((acc, duration) => acc + duration * ppqn, 0);
|
||||||
|
// let modulatedTimePos = timepos % totalDuration;
|
||||||
|
// for (let i = 0; i < this.length; i++) {
|
||||||
|
// const valueDuration = adjustedDurations[i] as any * ppqn;
|
||||||
|
// if (modulatedTimePos < cumulativeDuration + valueDuration) {
|
||||||
|
// return this[i];
|
||||||
|
// }
|
||||||
|
// cumulativeDuration += valueDuration;
|
||||||
|
// }
|
||||||
|
// // This point should not be reached if durations are correctly specified
|
||||||
|
// throw new Error('Durations array does not match the pattern length.');
|
||||||
|
// };
|
||||||
|
|
||||||
|
Array.prototype.dur = function(...durations) {
|
||||||
|
const timepos = api.app.clock.pulses_since_origin;
|
||||||
|
const ppqn = api.ppqn();
|
||||||
|
const adjustedDurations = this.map((_, index) => durations[index % durations.length]);
|
||||||
|
const totalDurationInPulses = adjustedDurations.reduce((acc, duration) => acc + duration * ppqn, 0);
|
||||||
|
const loopPosition = timepos % totalDurationInPulses;
|
||||||
|
let cumulativeDuration = 0;
|
||||||
|
for (let i = 0; i < this.length; i++) {
|
||||||
|
const valueDurationInPulses = adjustedDurations[i] as any * ppqn;
|
||||||
|
cumulativeDuration += valueDurationInPulses;
|
||||||
|
if (loopPosition < cumulativeDuration) {
|
||||||
|
console.log(`Hit on pulse: ${loopPosition}`);
|
||||||
|
return this[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new Error('Durations array does not match the pattern length.');
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
Array.prototype.shuffle = function() {
|
Array.prototype.shuffle = function() {
|
||||||
/**
|
/**
|
||||||
* Shuffles the array in place.
|
* Shuffles the array in place.
|
||||||
|
|||||||
Reference in New Issue
Block a user