diff options
| author | julian laplace <julescarbon@gmail.com> | 2025-07-09 19:28:32 +0200 |
|---|---|---|
| committer | julian laplace <julescarbon@gmail.com> | 2025-07-09 19:28:32 +0200 |
| commit | d7cf2d2404d205e9480befaf6a2b454471de75a2 (patch) | |
| tree | 7fc5b47d528cd5a73dd7751bb7f70347701510da /client/index.js | |
| parent | e3bf17a4782cd86bdbfbc51fa5ef3af0ec32a34f (diff) | |
test equal tempered scale
Diffstat (limited to 'client/index.js')
| -rw-r--r-- | client/index.js | 41 |
1 files changed, 30 insertions, 11 deletions
diff --git a/client/index.js b/client/index.js index 59d67f3..324d997 100644 --- a/client/index.js +++ b/client/index.js @@ -42,6 +42,7 @@ let lastNote = 0; let notes = []; let base_x = 0; let base_y = 0; +let scale = scales[0]; let scaleMode = 0; let is_split = false; let intervals; @@ -63,7 +64,7 @@ function build() { h = window.innerHeight; ws = Math.ceil(w / s); hs = Math.ceil(h / s); - const scale = scales[scaleMode % scales.length]; + scale = scales[scaleMode % scales.length]; if (scale.reset) { scale.reset(Math.round(base_x), Math.round(base_y), ws, hs); } @@ -126,6 +127,7 @@ function trigger_index(index) { } function pause(note) { organ.pause(note.interval); + trigger(note); const rounded = roundInterval(note.interval); notes.forEach((row) => row.forEach( @@ -146,7 +148,6 @@ function add(i, j) { const ii = i + Math.round(base_x); const jj = j + Math.round(base_y); - const scale = scales[scaleMode % scales.length]; const [a, b] = scale.get( ii, jj, @@ -155,9 +156,11 @@ function add(i, j) { Math.round(base_x), Math.round(base_y), ); + const isEqualTemperament = scale.name === "equal"; const div = document.createElement("div"); - const interval = a / b; + + const interval = isEqualTemperament ? Math.pow(2, a / b) : a / b; // const interval = root * Math.pow(2, ((b / a) % 1) + 1); let add = 0; let frac; @@ -177,7 +180,7 @@ function add(i, j) { recolor: (numerator, denominator) => { let aa = a / numerator; let bb = b / denominator; - if (aa < bb) { + if (aa < bb && aa !== 0) { add = -Math.log(bb / aa) / 3.5; } else { add = Math.log(aa / bb) / 6; @@ -188,21 +191,35 @@ function add(i, j) { let a_disp = a_inv / ba_gcd; let b_disp = b_inv / ba_gcd; - frac = Math.log2(aa / bb) % 1; + frac = Math.log2(isEqualTemperament ? interval : aa / bb) % 1; + let frac_orig = Math.log2(a / b) % 1; if (frac < 0) { frac += 1; } + if (frac_orig < 0) { frac += 1; } - if (frac_orig === 0) { - div.style.fontWeight = "900"; + + if (isEqualTemperament) { + if (interval % 1 === 0) { + div.style.fontWeight = "900"; + } else { + div.style.fontWeight = "500"; + } } else { - div.style.fontWeight = "500"; + if (frac_orig === 0) { + div.style.fontWeight = "900"; + } else { + div.style.fontWeight = "500"; + } } - div.innerHTML = `<div>${a_disp}</div><div>/</div><div>${b_disp}</div>`; + div.innerHTML = isEqualTemperament + ? `<div>${a}</div><div></div><div>${b}√2</div>` + : `<div>${a_disp}</div><div>/</div><div>${b_disp}</div>`; + if (note.playing) { div.style.backgroundColor = color(frac, add + add_on, mul_on); } else { @@ -376,8 +393,9 @@ function keydown(e) { showMessage(`Root: ${root} hz`); } else { scaleMode = mod(scaleMode - 1, scales.length); + scale = scales[scaleMode]; rebuild(); - showMessage(scales[scaleMode].name); + showMessage(scale.name); } break; case 187: // = @@ -388,8 +406,9 @@ function keydown(e) { showMessage(`Root: ${root} hz`); } else { scaleMode = mod(scaleMode + 1, scales.length); + scale = scales[scaleMode]; rebuild(); - showMessage(scales[scaleMode].name); + showMessage(scale.name); } break; } |
