tone
Version:
A Web Audio framework for making interactive music in the browser.
295 lines • 9.97 kB
JavaScript
import * as tslib_1 from "tslib";
import { assert } from "../core/util/Debug";
import { clamp } from "../core/util/Math";
/**
* Start at the first value and go up to the last
*/
function upPatternGen(values) {
var index;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
index = 0;
_a.label = 1;
case 1:
if (!(index < values.length)) return [3 /*break*/, 3];
index = clampToArraySize(index, values);
return [4 /*yield*/, values[index]];
case 2:
_a.sent();
index++;
return [3 /*break*/, 1];
case 3: return [2 /*return*/];
}
});
}
/**
* Start at the last value and go down to 0
*/
function downPatternGen(values) {
var index;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
index = values.length - 1;
_a.label = 1;
case 1:
if (!(index >= 0)) return [3 /*break*/, 3];
index = clampToArraySize(index, values);
return [4 /*yield*/, values[index]];
case 2:
_a.sent();
index--;
return [3 /*break*/, 1];
case 3: return [2 /*return*/];
}
});
}
/**
* Infinitely yield the generator
*/
function infiniteGen(values, gen) {
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
if (!true) return [3 /*break*/, 2];
return [5 /*yield**/, tslib_1.__values(gen(values))];
case 1:
_a.sent();
return [3 /*break*/, 0];
case 2: return [2 /*return*/];
}
});
}
/**
* Make sure that the index is in the given range
*/
function clampToArraySize(index, values) {
return clamp(index, 0, values.length - 1);
}
/**
* Alternate between two generators
*/
function alternatingGenerator(values, directionUp) {
var index;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
index = directionUp ? 0 : values.length - 1;
_a.label = 1;
case 1:
if (!true) return [3 /*break*/, 3];
index = clampToArraySize(index, values);
return [4 /*yield*/, values[index]];
case 2:
_a.sent();
if (directionUp) {
index++;
if (index >= values.length - 1) {
directionUp = false;
}
}
else {
index--;
if (index <= 0) {
directionUp = true;
}
}
return [3 /*break*/, 1];
case 3: return [2 /*return*/];
}
});
}
/**
* Starting from the bottom move up 2, down 1
*/
function jumpUp(values) {
var index, stepIndex;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
index = 0;
stepIndex = 0;
_a.label = 1;
case 1:
if (!(index < values.length)) return [3 /*break*/, 3];
index = clampToArraySize(index, values);
return [4 /*yield*/, values[index]];
case 2:
_a.sent();
stepIndex++;
index += (stepIndex % 2 ? 2 : -1);
return [3 /*break*/, 1];
case 3: return [2 /*return*/];
}
});
}
/**
* Starting from the top move down 2, up 1
*/
function jumpDown(values) {
var index, stepIndex;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
index = values.length - 1;
stepIndex = 0;
_a.label = 1;
case 1:
if (!(index >= 0)) return [3 /*break*/, 3];
index = clampToArraySize(index, values);
return [4 /*yield*/, values[index]];
case 2:
_a.sent();
stepIndex++;
index += (stepIndex % 2 ? -2 : 1);
return [3 /*break*/, 1];
case 3: return [2 /*return*/];
}
});
}
/**
* Choose a random index each time
*/
function randomGen(values) {
var randomIndex;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
if (!true) return [3 /*break*/, 2];
randomIndex = Math.floor(Math.random() * values.length);
return [4 /*yield*/, values[randomIndex]];
case 1:
_a.sent();
return [3 /*break*/, 0];
case 2: return [2 /*return*/];
}
});
}
/**
* Randomly go through all of the values once before choosing a new random order
*/
function randomOnce(values) {
var copy, i, randVal, index;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
copy = [];
for (i = 0; i < values.length; i++) {
copy.push(i);
}
_a.label = 1;
case 1:
if (!(copy.length > 0)) return [3 /*break*/, 3];
randVal = copy.splice(Math.floor(copy.length * Math.random()), 1);
index = clampToArraySize(randVal[0], values);
return [4 /*yield*/, values[index]];
case 2:
_a.sent();
return [3 /*break*/, 1];
case 3: return [2 /*return*/];
}
});
}
/**
* Randomly choose to walk up or down 1 index in the values array
*/
function randomWalk(values) {
var index;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
index = Math.floor(Math.random() * values.length);
_a.label = 1;
case 1:
if (!true) return [3 /*break*/, 3];
if (index === 0) {
index++; // at bottom of array, so force upward step
}
else if (index === values.length - 1) {
index--; // at top of array, so force downward step
}
else if (Math.random() < 0.5) { // else choose random downward or upward step
index--;
}
else {
index++;
}
return [4 /*yield*/, values[index]];
case 2:
_a.sent();
return [3 /*break*/, 1];
case 3: return [2 /*return*/];
}
});
}
/**
* PatternGenerator returns a generator which will iterate over the given array
* of values and yield the items according to the passed in pattern
* @param values An array of values to iterate over
* @param pattern The name of the pattern use when iterating over
* @param index Where to start in the offset of the values array
*/
export function PatternGenerator(values, pattern, index) {
var _a;
if (pattern === void 0) { pattern = "up"; }
if (index === void 0) { index = 0; }
return tslib_1.__generator(this, function (_b) {
switch (_b.label) {
case 0:
// safeguards
assert(values.length > 0, "The array must have more than one value in it");
_a = pattern;
switch (_a) {
case "up": return [3 /*break*/, 1];
case "down": return [3 /*break*/, 3];
case "upDown": return [3 /*break*/, 5];
case "downUp": return [3 /*break*/, 7];
case "alternateUp": return [3 /*break*/, 9];
case "alternateDown": return [3 /*break*/, 11];
case "random": return [3 /*break*/, 13];
case "randomOnce": return [3 /*break*/, 15];
case "randomWalk": return [3 /*break*/, 17];
}
return [3 /*break*/, 19];
case 1: return [5 /*yield**/, tslib_1.__values(infiniteGen(values, upPatternGen))];
case 2:
_b.sent();
_b.label = 3;
case 3: return [5 /*yield**/, tslib_1.__values(infiniteGen(values, downPatternGen))];
case 4:
_b.sent();
_b.label = 5;
case 5: return [5 /*yield**/, tslib_1.__values(alternatingGenerator(values, true))];
case 6:
_b.sent();
_b.label = 7;
case 7: return [5 /*yield**/, tslib_1.__values(alternatingGenerator(values, false))];
case 8:
_b.sent();
_b.label = 9;
case 9: return [5 /*yield**/, tslib_1.__values(infiniteGen(values, jumpUp))];
case 10:
_b.sent();
_b.label = 11;
case 11: return [5 /*yield**/, tslib_1.__values(infiniteGen(values, jumpDown))];
case 12:
_b.sent();
_b.label = 13;
case 13: return [5 /*yield**/, tslib_1.__values(randomGen(values))];
case 14:
_b.sent();
_b.label = 15;
case 15: return [5 /*yield**/, tslib_1.__values(infiniteGen(values, randomOnce))];
case 16:
_b.sent();
_b.label = 17;
case 17: return [5 /*yield**/, tslib_1.__values(randomWalk(values))];
case 18:
_b.sent();
_b.label = 19;
case 19: return [2 /*return*/];
}
});
}
//# sourceMappingURL=PatternGenerator.js.map