diff options
Diffstat (limited to 'client')
| -rw-r--r-- | client/index.js | 51 | ||||
| -rw-r--r-- | client/lib/scales.js | 73 | ||||
| m--------- | client/vendor/number-sequences | 0 |
3 files changed, 87 insertions, 37 deletions
diff --git a/client/index.js b/client/index.js index 3c56825..2c986dd 100644 --- a/client/index.js +++ b/client/index.js @@ -20,7 +20,7 @@ import { frequencyInRange, mod, } from "./lib/util"; -import { PRIMES } from "./lib/primes"; +import { scales } from "./lib/scales"; let instrument = kalimba; @@ -40,7 +40,6 @@ let notes = []; let base_x = 0; let base_y = 0; let scaleMode = 0; -let scaleModeCount = 5; let is_split = false; let frequencies; @@ -60,6 +59,10 @@ function build() { h = window.innerHeight; ws = Math.ceil(w / s); hs = Math.ceil(h / s); + const scale = scales[scaleMode % scales.length]; + if (scale.reset) { + scale.reset(base_x, base_y, ws, hs); + } for (var i = 0; i < ws; i++) { notes[i] = []; for (var j = 0; j < hs; j++) { @@ -74,7 +77,7 @@ function rebuild() { } function log() { const seen = {}; - console.log(notes); + // console.log(notes); for (let i = 0; i < 8; i++) { for (let j = 0; j < 8; j++) { const frequency = notes[i][j].frequency; @@ -85,7 +88,7 @@ function log() { } } frequencies = Object.values(seen).sort((a, b) => a - b); - console.log(frequencies); + // console.log(frequencies); console.log(frequencies.length, "unique frequencies in 8x8"); } function play(freq) { @@ -138,36 +141,10 @@ function toggle(freq) { function add(i, j) { const ii = i + base_x; const jj = j + base_y; - let a, b; - switch (scaleMode % scaleModeCount) { - case 1: - a = ii + 1; - b = ii + jj + 2; - break; - case 2: - a = ii + jj + 2; - b = jj + 1; - break; - case 3: - a = PRIMES[ii % PRIMES.length]; - b = PRIMES[jj % PRIMES.length]; - break; - case 4: - if (ii < jj) { - a = 3 ** (ii + 1); - b = 2 ** (jj + Math.ceil(Math.max(0, (ii * 1.0) / 2))); - } else { - a = 2 ** (ii + Math.ceil(Math.max(0, (jj * 1.2) / 2))); - b = 3 ** jj; - } - // b = 2 ** jj; - break; - case 0: - default: - a = ii + 1; - b = jj + 1; - break; - } + + const scale = scales[scaleMode % scales.length]; + const [a, b] = scale.get(ii, jj, i, j, base_x, base_y); + const div = document.createElement("div"); const frequency = (root * a) / b; // const frequency = root * Math.pow(2, ((b / a) % 1) + 1); @@ -314,7 +291,7 @@ function keydown(e) { if (e.shiftKey) { step += 4; } - console.log(e.keyCode); + // console.log(e.keyCode); switch (e.keyCode) { case 37: // left base_x = Math.max(0, base_x - step); @@ -336,11 +313,11 @@ function keydown(e) { midi.enable(trigger_index); break; case 189: // - - scaleMode = mod(scaleMode - 1, scaleModeCount); + scaleMode = mod(scaleMode - 1, scales.length); rebuild(); break; case 187: // = - scaleMode = mod(scaleMode + 1, scaleModeCount); + scaleMode = mod(scaleMode + 1, scales.length); rebuild(); break; } diff --git a/client/lib/scales.js b/client/lib/scales.js new file mode 100644 index 0000000..87dcb0e --- /dev/null +++ b/client/lib/scales.js @@ -0,0 +1,73 @@ +/** + * Scales + * @module client/lib/scales.js; + */ + +import "core-js/stable"; +import "regenerator-runtime/runtime"; + +import { + Arithmetic, + Collatz, + Fibonacci, + Geometric, + Power, + Prime, + Triangle, +} from "../vendor/number-sequences/dist/index.js"; + +let a, b; + +export const scales = [ + { name: "integer", get: (i, j) => [i + 1, j + 1] }, + { name: "subharmonic", get: (i, j) => [i + 1, i + j + 2] }, + { name: "harmonic", get: (i, j) => [i + j + 2, j + 1] }, + { + name: "prime", + reset: (x, y, w, h) => { + a = Prime().skip(x).take(w).toJS(); + b = Prime().skip(y).take(h).toJS(); + }, + get: (ii, jj, i, j) => [a[i], b[j]], + }, + { + name: "arithmetic", + reset: (x, y, w, h) => { + a = Arithmetic(x + 1, x + 1) + .take(w) + .toJS(); + b = Arithmetic(y + 1, y + 1) + .take(h) + .toJS(); + console.log(a); + }, + get: (ii, jj, i, j) => [a[i], b[j]], + }, + // { + // name: "triangle", + // reset: (x, y, w, h) => { + // a = Triangle().skip(x).take(w).toJS(); + // b = Triangle().skip(y).take(h).toJS(); + // }, + // get: (ii, jj, i, j) => [a[i], b[j]], + // }, + { + name: "collatz", + reset: (x, y, w, h) => { + a = Collatz(x + 1) + .take(w) + .toJS(); + b = Collatz(y + 1) + .take(h) + .toJS(); + }, + get: (ii, jj, i, j) => [a[i], b[j]], + }, + { + name: "pythagorean", + get: (i, j) => + i < j + ? [3 ** (i + 1), 2 ** (j + Math.ceil(Math.max(0, (i * 1.0) / 2)))] + : [2 ** (i + Math.ceil(Math.max(0, (j * 1.2) / 2))), 3 ** j], + }, +]; diff --git a/client/vendor/number-sequences b/client/vendor/number-sequences new file mode 160000 +Subproject 9af8a3d9401d891c86fd314b5fb00d50a9a059c |
