diff options
| author | julian laplace <julescarbon@gmail.com> | 2025-07-07 01:21:17 +0200 |
|---|---|---|
| committer | julian laplace <julescarbon@gmail.com> | 2025-07-07 01:21:17 +0200 |
| commit | 784bf3ff435f5236c8d32e90cedd1a1e488c9159 (patch) | |
| tree | a68bdea6ea04a99c80c29830080cf56b397e5577 /client | |
| parent | c7ac66d10cb0040544ff840e38b0b8e23a6b8866 (diff) | |
pythagorean interval mode
Diffstat (limited to 'client')
| -rw-r--r-- | client/index.js | 57 |
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; } |
