summaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
authorjulian laplace <julescarbon@gmail.com>2025-07-07 14:41:20 +0200
committerjulian laplace <julescarbon@gmail.com>2025-07-07 14:41:20 +0200
commit95a494a5570ba7933943cfe2093f1357c5f087f4 (patch)
treec99ecbcf879bf567dfff66f3825a10ea7a5d26c2 /client
parent966e3b080f039fa1c62113e75e1e1481d7e19439 (diff)
number sequences
Diffstat (limited to 'client')
-rw-r--r--client/index.js51
-rw-r--r--client/lib/scales.js73
m---------client/vendor/number-sequences0
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