summaryrefslogtreecommitdiff
path: root/client/index.js
diff options
context:
space:
mode:
authorjulian laplace <julescarbon@gmail.com>2025-07-07 01:21:17 +0200
committerjulian laplace <julescarbon@gmail.com>2025-07-07 01:21:17 +0200
commit784bf3ff435f5236c8d32e90cedd1a1e488c9159 (patch)
treea68bdea6ea04a99c80c29830080cf56b397e5577 /client/index.js
parentc7ac66d10cb0040544ff840e38b0b8e23a6b8866 (diff)
pythagorean interval mode
Diffstat (limited to 'client/index.js')
-rw-r--r--client/index.js57
1 files changed, 41 insertions, 16 deletions
diff --git a/client/index.js b/client/index.js
index cb632de..19cae7b 100644
--- a/client/index.js
+++ b/client/index.js
@@ -12,7 +12,13 @@ import sampler from "./lib/sampler";
import organ from "./lib/organ";
import midi from "./lib/midi";
import { getOutput } from "./lib/output";
-import { browser, requestAudioContext, choice, roundFreq } from "./lib/util";
+import {
+ browser,
+ requestAudioContext,
+ choice,
+ roundFreq,
+ mod,
+} from "./lib/util";
import { PRIMES } from "./lib/primes";
let instrument = kalimba;
@@ -33,6 +39,7 @@ let notes = [];
let base_x = 0;
let base_y = 0;
let scaleMode = 0;
+let scaleModeCount = 5;
let is_split = false;
let frequencies;
@@ -69,7 +76,7 @@ function log() {
for (let i = 0; i < 8; i++) {
for (let j = 0; j < 8; j++) {
const rounded = roundFreq(notes[i][j].frequency);
- if (!seen[rounded]) {
+ if (!seen[rounded] && 20 < rounded && rounded < 12000) {
seen[rounded] = notes[i][j].frequency;
}
}
@@ -97,7 +104,9 @@ function play(freq) {
}
}
function trigger(freq) {
- instrument.play(freq.frequency);
+ if (20 && freq.frequency && freq.frequency < 15000) {
+ instrument.play(freq.frequency);
+ }
}
function trigger_index(index) {
const frequency = frequencies[index];
@@ -122,24 +131,36 @@ function toggle(freq) {
}
function add(i, j) {
+ const ii = i + base_x;
+ const jj = j + base_y;
let a, b;
- switch (scaleMode % 4) {
+ switch (scaleMode % scaleModeCount) {
case 1:
- a = i + 1 + base_x;
- b = i + j + 2 + base_y;
+ a = ii + 1;
+ b = ii + jj + 2;
break;
case 2:
- a = i + j + 1 + base_x;
- b = j + 1 + base_y;
+ a = ii + jj + 2;
+ b = jj + 1;
break;
case 3:
- a = PRIMES[i];
- b = PRIMES[j];
+ 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 = i + 1 + base_x;
- b = j + 1 + base_y;
+ a = ii + 1;
+ b = jj + 1;
break;
}
const div = document.createElement("div");
@@ -158,7 +179,7 @@ function add(i, j) {
j,
playing: false,
destroy: () => {
- div.parentNode.removeChild(div);
+ div.parentNode && div.parentNode.removeChild(div);
},
recolor: (numerator, denominator) => {
let aa = a / numerator;
@@ -288,7 +309,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);
@@ -309,8 +330,12 @@ function keydown(e) {
case 220: // \
midi.enable(trigger_index);
break;
- case 187: // \
- scaleMode += 1;
+ case 189: // -
+ scaleMode = mod(scaleMode - 1, scaleModeCount);
+ rebuild();
+ break;
+ case 187: // =
+ scaleMode = mod(scaleMode + 1, scaleModeCount);
rebuild();
break;
}