diff --git a/globals.js b/globals.js index f9bf036..4b4c5a0 100644 --- a/globals.js +++ b/globals.js @@ -17,6 +17,7 @@ let bRadius = 4; // 黑鍵圓角(default: 4) let keyAreaY = 3; // 白鍵從 Y 軸座標多少開始?(default: 3) let keyAreaHeight = 70; // 白鍵多高?(default: 70) let rainbowMode = false; // 彩虹模式 (default: false) +let displayNoteNames = false; // 白鍵要不要顯示音名 (default: false) let cc64now = 0; // 現在的踏板狀態 let cc67now = 0; @@ -136,6 +137,10 @@ function toggleRainbowMode(cb) { select('#colorpicker').removeAttribute('disabled') } +function toggleDisplayNoteNames(cb) { + displayNoteNames = cb.checked; +} + function changeColor() { keyOnColor = pedaledColor = color(select('#colorpicker').value()); darkenedColor = keyOnColor.levels.map(x => floor(x * .7)); diff --git a/index.html b/index.html index 06517f1..b1b32ea 100644 --- a/index.html +++ b/index.html @@ -35,6 +35,13 @@
選擇 MIDI 裝置
+
+ 顯示音名 + + +
diff --git a/piano-visualizer.js b/piano-visualizer.js index ca9b8ee..39c4c8c 100644 --- a/piano-visualizer.js +++ b/piano-visualizer.js @@ -14,9 +14,7 @@ function draw() { pushHistories(); drawWhiteKeys(); drawBlackKeys(); - // drawPedalLines(); - // drawNotes(); - + if (displayNoteNames) {drawNoteNames();}; drawTexts(); } @@ -98,6 +96,25 @@ function drawBlackKeys() { } } +function drawNoteNames() { + let noteNames = ["A", "B", "C", "D", "E", "F", "G"]; // 音名數組 + + textSize(12); // 設置文字大小 + noStroke(); + fill(0, 0, 0, 75); // 設置文字顏色為黑色 + textAlign(CENTER, CENTER); // 設置文字對齊方式為居中 + textStyle(NORMAL); + + let wIndex = 0; // 白鍵索引 + for (let i = 0; i < 52; i++) { // 遍歷所有白鍵 + let thisX = border + wIndex * (whiteKeyWidth + whiteKeySpace); + let thisY = keyAreaY + keyAreaHeight - 11; // 調整文字的垂直位置 + let noteName = noteNames[i % 7]; // 獲取對應的音名 + text(noteName, thisX + whiteKeyWidth / 2, thisY); // 繪製音名文字 + wIndex++; + } +} + function drawTexts() { stroke(0, 0, 10, 100); fill(0, 0, 100, 90) diff --git a/style.css b/style.css index d6a410b..1ea1a12 100644 --- a/style.css +++ b/style.css @@ -552,7 +552,8 @@ input[type=checkbox] { visibility: hidden; } -label[for=rainbow-mode-checkbox] { +label[for=rainbow-mode-checkbox], +label[for=display-note-names-checkbox] { cursor: pointer; width: 50px; height: 25px; @@ -563,7 +564,8 @@ label[for=rainbow-mode-checkbox] { transition: .3s; } -label[for=rainbow-mode-checkbox]:after { +label[for=rainbow-mode-checkbox]:after, +label[for=display-note-names-checkbox]:after { content: ''; position: absolute; top: 1.25px; @@ -575,15 +577,18 @@ label[for=rainbow-mode-checkbox]:after { transition: .3s; } -input:checked + label[for=rainbow-mode-checkbox] { - background: #6f42c1; +input:checked + label[for=rainbow-mode-checkbox], +input:checked + label[for=display-note-names-checkbox] { + background: #6f42c1; } -label[for=rainbow-mode-checkbox]:active:after { - width: 32.5px; +label[for=rainbow-mode-checkbox]:active:after, +label[for=display-note-names-checkbox]:active:after { + width: 32.5px; } -input:checked + label[for=rainbow-mode-checkbox]:after { - left: calc(100% - 1.25px); - transform: translateX(-100%); +input:checked + label[for=rainbow-mode-checkbox]:after, +input:checked + label[for=display-note-names-checkbox]:after { + left: calc(100% - 1.25px); + transform: translateX(-100%); } \ No newline at end of file