From e79260231f20eedc346fa9942f4ceae0588e017c Mon Sep 17 00:00:00 2001 From: Tobias Nauen Date: Wed, 29 Apr 2026 15:57:37 +0200 Subject: [PATCH] first commit --- LICENSE | 21 ++ README.md | 65 ++++++ android-chrome-192x192.png | Bin 0 -> 15992 bytes android-chrome-512x512.png | Bin 0 -> 40983 bytes apple-touch-icon.png | Bin 0 -> 14662 bytes css/style.css | 406 +++++++++++++++++++++++++++++++++++++ favicon-16x16.png | Bin 0 -> 620 bytes favicon-32x32.png | Bin 0 -> 1532 bytes favicon.ico | Bin 0 -> 15406 bytes index.html | 101 +++++++++ js/app.js | 393 +++++++++++++++++++++++++++++++++++ js/fretboard.js | 154 ++++++++++++++ js/music.js | 31 +++ js/quiz.js | 44 ++++ site.webmanifest | 1 + 15 files changed, 1216 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 android-chrome-192x192.png create mode 100644 android-chrome-512x512.png create mode 100644 apple-touch-icon.png create mode 100644 css/style.css create mode 100644 favicon-16x16.png create mode 100644 favicon-32x32.png create mode 100644 favicon.ico create mode 100644 index.html create mode 100644 js/app.js create mode 100644 js/fretboard.js create mode 100644 js/music.js create mode 100644 js/quiz.js create mode 100644 site.webmanifest diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..ee04545 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Tobias Nauen + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..5348128 --- /dev/null +++ b/README.md @@ -0,0 +1,65 @@ +# Guitar Fretboard Trainer + +![No build step](https://img.shields.io/badge/build-none-brightgreen?style=flat-square) +![Vanilla JS](https://img.shields.io/badge/vanilla-JS-f7df1e?style=flat-square&logo=javascript&logoColor=000) +![ES Modules](https://img.shields.io/badge/ES-modules-blue?style=flat-square) +![PWA ready](https://img.shields.io/badge/PWA-ready-5A0FC8?style=flat-square&logo=pwa) +![License MIT](https://img.shields.io/badge/license-MIT-lightgrey?style=flat-square) + +A browser app to drill guitar fretboard note recognition. No framework, no build step — just plain HTML, CSS, and ES modules. + +## Usage + +Serve with any HTTP server and open in a browser (ES modules require a server — `file://` won't work): + +```bash +python3 -m http.server 8080 +# or +npx serve . +``` + +Then open http://localhost:8080. + +## Quiz Modes + +### Mode 1 — Name the Note +A position (string + fret) is highlighted on the fretboard. Choose the correct note from 9 buttons — by clicking, pressing `1`–`9`, or typing the note name on your keyboard. + +### Mode 2 — Find All Occurrences +A target note and a 4–5 fret range are shown. Click every position in the range where that note appears, then hit **Submit**. Green = correct, red = wrong selection, faded green = missed. + +## Keyboard Shortcuts + +| Key | Action | +|-----|--------| +| `Space` / `Enter` | Next question (or submit in mode 2) | +| `1`–`9` | Select answer button by position (mode 1) | +| `A`–`G` | Type a note name directly (mode 1) | +| `A` then `#` | Sharp — e.g. `A#` | +| `A` then `b` | Flat — e.g. `Ab` (resolved to `G#` internally) | +| `Tab` | Cycle between modes | + +## Settings + +- **6-string / 7-string** — standard tuning +- **Sharps only** — show only sharp names (no `D#/Eb` dual labels) +- **Natural notes only** — restrict to C D E F G A B + +## Stats + +A lifetime stats screen tracks accuracy per mode, accuracy per note, total questions answered, and best streak. Stats persist in `localStorage`. + +## Project Structure + +``` +guitar-trainer/ +├── index.html # Markup only +├── site.webmanifest # PWA manifest +├── css/ +│ └── style.css # All styles, CSS custom properties for theming +└── js/ + ├── music.js # Music theory: notes, tunings, display helpers + ├── fretboard.js # SVG fretboard builder + ├── quiz.js # Question generation and answer evaluation + └── app.js # State, rendering, DOM wiring, keyboard shortcuts +``` diff --git a/android-chrome-192x192.png b/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..bf5c4a6b32d983496ca0b99bdd2b241e5bb68988 GIT binary patch literal 15992 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

a%mXJCttDxX6sn2NnkYXFB)o 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

yLF!z#nK9_M0C?t{s~PRCSU^*w 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 literal 0 HcmV?d00001 diff --git a/apple-touch-icon.png b/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4978e28e5acd4dcf30c7942c747d6abd4d9780c9 GIT binary patch literal 14662 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 Gf&T)->61+W literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 0000000..3a7291d --- /dev/null +++ b/index.html @@ -0,0 +1,101 @@ + + + + + + Fretboard Trainer + + + + + + + +

Fretboard Trainer

+

Learn the notes on your guitar

+ +
+ + + +
+ +
+
+ + + +
+ +
+
String & Fret
+
Loading…
+
+ +
+
+
+ + +
+ + +
+
+ Click all positions where the note appears, then submit +
+
+ + +
+
+ + + +
+ Space / Enter next  •  19 + answer  •  Tab cycle tabs +
+ +
+ Correct: 0  /  Total: + 0  |  Streak: + 0 +
+
+ +
+ + + + diff --git a/js/app.js b/js/app.js new file mode 100644 index 0000000..2cda068 --- /dev/null +++ b/js/app.js @@ -0,0 +1,393 @@ +import { noteDisplay, CHROMATIC, ENHARMONIC } from './music.js'; +import { buildFretboard } from './fretboard.js'; +import { genMode1Question, genMode2Question, evaluateMode2 } from './quiz.js'; + +// ─── Persistent stats ───────────────────────────────────────────────────────── +const STORAGE_KEY = 'guitarTrainerStats'; + +function defaultLifetimeStats() { + return { total: 0, correct: 0, bestStreak: 0, mode1: { total: 0, correct: 0 }, mode2: { total: 0, correct: 0 }, notes: {} }; +} + +function loadLifetimeStats() { + try { + const raw = localStorage.getItem(STORAGE_KEY); + if (raw) return { ...defaultLifetimeStats(), ...JSON.parse(raw) }; + } catch {} + return defaultLifetimeStats(); +} + +function saveLifetimeStats() { + localStorage.setItem(STORAGE_KEY, JSON.stringify(lifetimeStats)); +} + +let lifetimeStats = loadLifetimeStats(); + +// ─── Note keyboard input ────────────────────────────────────────────────────── +const NOTE_LETTERS = new Set(['a','b','c','d','e','f','g']); +const FLAT_TO_SHARP = Object.fromEntries( + Object.entries(ENHARMONIC).map(([sharp, flat]) => [flat, sharp]) +); +let noteBuffer = ''; +let noteTimer = null; + +function resolveNoteInput(raw) { + const letter = raw[0].toUpperCase(); + const mod = raw[1] || ''; + if (mod === '#') { const n = letter + '#'; return CHROMATIC.includes(n) ? n : null; } + if (mod === 'b') return FLAT_TO_SHARP[letter + 'b'] || null; + return CHROMATIC.includes(letter) ? letter : null; +} + +function submitNoteBuffer() { + clearTimeout(noteTimer); + noteTimer = null; + const raw = noteBuffer; + noteBuffer = ''; + if (!raw || mode !== 1 || answered) return; + const note = resolveNoteInput(raw); + if (note) checkMode1(note); +} + +// ─── State ──────────────────────────────────────────────────────────────────── +let mode = 1; // 1, 2, or 'stats' +let currentQ = null; +let answered = false; +let mode2Selection = new Set(); +let stats = { correct: 0, total: 0, streak: 0 }; + +// ─── Settings helpers ───────────────────────────────────────────────────────── +const getNumStrings = () => parseInt(document.getElementById('stringCount').value); +const getSharpsOnly = () => document.getElementById('sharpsOnly').checked; +const getNaturalOnly = () => document.getElementById('naturalOnly').checked; + +// ─── Rendering ──────────────────────────────────────────────────────────────── +function renderQuestion() { + answered = false; + mode2Selection.clear(); + clearTimeout(noteTimer); noteBuffer = ''; + + const fb = document.getElementById('feedback'); + fb.textContent = ''; + fb.className = 'feedback'; + document.getElementById('nextBtn').disabled = true; + + if (mode === 1) renderMode1(); + else renderMode2(); +} + +function renderMode1() { + currentQ = genMode1Question(getNumStrings(), getNaturalOnly()); + + const numStrings = getNumStrings(); + const stringNames = ['1st', '2nd', '3rd', '4th', '5th', '6th', '7th']; + const stringNumber = numStrings - currentQ.stringIdx; + document.getElementById('promptLabel').textContent = 'What note is this?'; + document.getElementById('promptText').innerHTML = + `${stringNames[stringNumber - 1]} string, ` + + `fret ${currentQ.fret}`; + + document.getElementById('fretboardContainer').innerHTML = buildFretboard({ + numStrings, + highlightPos: { stringIdx: currentQ.stringIdx, fret: currentQ.fret }, + }); + + const btns = document.getElementById('noteButtons'); + btns.innerHTML = ''; + currentQ.choices.forEach((note, i) => { + const btn = document.createElement('button'); + btn.className = 'note-btn'; + btn.textContent = noteDisplay(note, getSharpsOnly()); + btn.dataset.note = note; + if (i < 9) btn.title = `Press ${i + 1}`; + btns.appendChild(btn); + }); + + document.getElementById('noteButtons').style.display = 'flex'; + document.getElementById('mode2Controls').style.display = 'none'; +} + +function renderMode2() { + currentQ = genMode2Question(getNumStrings(), getNaturalOnly()); + + document.getElementById('promptLabel').textContent = 'Find all occurrences of:'; + document.getElementById('promptText').innerHTML = + `${noteDisplay(currentQ.targetNote, getSharpsOnly())}` + + `in frets ${currentQ.fretStart}–${currentQ.fretEnd}`; + + refreshMode2Fretboard(); + + document.getElementById('noteButtons').style.display = 'none'; + document.getElementById('mode2Controls').style.display = 'flex'; +} + +function refreshMode2Fretboard(showCorrect = false) { + document.getElementById('fretboardContainer').innerHTML = buildFretboard({ + numStrings: getNumStrings(), + interactive: true, + fretRange: [currentQ.fretStart, currentQ.fretEnd], + mode2Sel: mode2Selection, + mode2Correct: showCorrect ? currentQ.correctSet : null, + showLabels: showCorrect, + sharpsOnly: getSharpsOnly(), + }); +} + +// ─── Answer checking ────────────────────────────────────────────────────────── +function recordAnswer(isCorrect, note) { + lifetimeStats.total++; + if (isCorrect) lifetimeStats.correct++; + + const modeKey = mode === 1 ? 'mode1' : 'mode2'; + lifetimeStats[modeKey].total++; + if (isCorrect) lifetimeStats[modeKey].correct++; + + if (!lifetimeStats.notes[note]) lifetimeStats.notes[note] = { total: 0, correct: 0 }; + lifetimeStats.notes[note].total++; + if (isCorrect) lifetimeStats.notes[note].correct++; + + if (stats.streak > lifetimeStats.bestStreak) lifetimeStats.bestStreak = stats.streak; + saveLifetimeStats(); +} + +function checkMode1(note) { + if (answered) return; + answered = true; + stats.total++; + + const fb = document.getElementById('feedback'); + document.querySelectorAll('.note-btn').forEach(b => { + if (b.dataset.note === currentQ.note) b.classList.add('correct'); + }); + + const clickedBtn = document.querySelector(`.note-btn[data-note="${note}"]`); + const isCorrect = note === currentQ.note; + + if (isCorrect) { + fb.textContent = '✓ Correct!'; + fb.className = 'feedback correct'; + stats.correct++; + stats.streak++; + } else { + if (clickedBtn) clickedBtn.classList.add('wrong'); + fb.textContent = `✗ It's ${currentQ.note}`; + fb.className = 'feedback wrong'; + stats.streak = 0; + } + + recordAnswer(isCorrect, currentQ.note); + updateStats(); + document.getElementById('nextBtn').disabled = false; + + document.getElementById('fretboardContainer').innerHTML = buildFretboard({ + numStrings: getNumStrings(), + highlightPos: { stringIdx: currentQ.stringIdx, fret: currentQ.fret }, + showLabels: true, + sharpsOnly: getSharpsOnly(), + }); +} + +function checkMode2() { + if (answered) return; + answered = true; + stats.total++; + + const { allCorrect, missed, extra } = evaluateMode2(mode2Selection, currentQ.correctSet); + refreshMode2Fretboard(true); + + const fb = document.getElementById('feedback'); + if (allCorrect) { + const n = currentQ.correctSet.size; + fb.textContent = `✓ Perfect! Found all ${n} position${n !== 1 ? 's' : ''}`; + fb.className = 'feedback correct'; + stats.correct++; + stats.streak++; + } else { + fb.textContent = `✗ Missed ${missed}, extra ${extra} — green = correct positions`; + fb.className = 'feedback wrong'; + stats.streak = 0; + } + + recordAnswer(allCorrect, currentQ.targetNote); + updateStats(); + document.getElementById('nextBtn').disabled = false; +} + +function updateStats() { + document.getElementById('statCorrect').textContent = stats.correct; + document.getElementById('statTotal').textContent = stats.total; + document.getElementById('statStreak').textContent = stats.streak; +} + +// ─── Stats screen ───────────────────────────────────────────────────────────── +function accColor(acc) { + if (acc >= 80) return 'var(--green)'; + if (acc >= 50) return 'var(--accent2)'; + return 'var(--accent)'; +} + +function modeRow(label, mStat) { + const acc = mStat.total ? Math.round(mStat.correct / mStat.total * 100) : 0; + return ` +
+
${label}
+
${mStat.correct}/${mStat.total}
+
+
+ ${mStat.total ? acc + '%' : '—'} +
+
`; +} + +function renderStats() { + const screen = document.getElementById('statsScreen'); + const ls = lifetimeStats; + const overallAcc = ls.total ? Math.round(ls.correct / ls.total * 100) : 0; + + const noteRows = Object.entries(ls.notes) + .map(([note, { correct, total }]) => ({ note, correct, total, acc: Math.round(correct / total * 100) })) + .sort((a, b) => a.acc - b.acc || b.total - a.total); + + screen.innerHTML = ` +
+
+
+
${overallAcc}%
+
Accuracy
+
+
+
${ls.total}
+
Questions
+
+
+
${ls.bestStreak}
+
Best Streak
+
+
+ +
+
By Mode
+ ${modeRow('Name the Note', ls.mode1)} + ${modeRow('Find Occurrences', ls.mode2)} +
+ + ${noteRows.length ? ` +
+
Accuracy by Note
+ + + + ${noteRows.map(r => ` + + + + + + `).join('')} + +
NoteCorrectSeenAccuracy
${noteDisplay(r.note, false)}${r.correct}${r.total} +
+
+ ${r.acc}% +
+
+
` : '
No questions answered yet — start practising!
'} + + +
+ `; + + document.getElementById('resetStatsBtn').addEventListener('click', () => { + if (confirm('Reset all lifetime stats? This cannot be undone.')) { + lifetimeStats = defaultLifetimeStats(); + saveLifetimeStats(); + renderStats(); + } + }); +} + +// ─── Controls ───────────────────────────────────────────────────────────────── +function setMode(m) { + mode = m; + document.getElementById('tab1').classList.toggle('active', m === 1); + document.getElementById('tab2').classList.toggle('active', m === 2); + document.getElementById('tabStats').classList.toggle('active', m === 'stats'); + + const isStats = m === 'stats'; + document.getElementById('quizArea').style.display = isStats ? 'none' : ''; + document.getElementById('statsScreen').style.display = isStats ? 'flex' : 'none'; + + if (isStats) renderStats(); + else renderQuestion(); +} + +function resetQuiz() { + stats = { correct: 0, total: 0, streak: 0 }; + updateStats(); + if (mode !== 'stats') renderQuestion(); +} + +// ─── Event wiring ───────────────────────────────────────────────────────────── +document.getElementById('tab1').addEventListener('click', () => setMode(1)); +document.getElementById('tab2').addEventListener('click', () => setMode(2)); +document.getElementById('tabStats').addEventListener('click', () => setMode('stats')); +document.getElementById('nextBtn').addEventListener('click', renderQuestion); +document.getElementById('submitBtn').addEventListener('click', checkMode2); +document.getElementById('clearBtn').addEventListener('click', () => { + if (!answered) { mode2Selection.clear(); refreshMode2Fretboard(); } +}); +document.getElementById('stringCount').addEventListener('change', resetQuiz); +document.getElementById('sharpsOnly').addEventListener('change', resetQuiz); +document.getElementById('naturalOnly').addEventListener('change', resetQuiz); + +document.getElementById('noteButtons').addEventListener('click', e => { + const btn = e.target.closest('.note-btn'); + if (btn) checkMode1(btn.dataset.note); +}); + +document.getElementById('fretboardContainer').addEventListener('click', e => { + if (mode !== 2 || answered) return; + const cell = e.target.closest('[data-s]'); + if (!cell) return; + const s = parseInt(cell.dataset.s); + const f = parseInt(cell.dataset.f); + const key = `${s},${f}`; + if (mode2Selection.has(key)) mode2Selection.delete(key); + else mode2Selection.add(key); + refreshMode2Fretboard(); +}); + +document.addEventListener('keydown', e => { + if (e.target.tagName === 'SELECT') return; + if (e.key === ' ' || e.key === 'Enter') { + e.preventDefault(); + if (mode === 'stats') return; + if (!document.getElementById('nextBtn').disabled) renderQuestion(); + else if (mode === 2 && !answered) checkMode2(); + } + if (mode === 1 && !answered && e.key >= '1' && e.key <= '9') { + const btns = document.querySelectorAll('.note-btn'); + btns[parseInt(e.key) - 1]?.click(); + } + if (mode === 1 && !answered) { + const k = e.key.toLowerCase(); + if (noteBuffer && k === 'b') { + noteBuffer += 'b'; submitNoteBuffer(); + } else if (noteBuffer && k === '#') { + noteBuffer += '#'; submitNoteBuffer(); + } else if (NOTE_LETTERS.has(k)) { + clearTimeout(noteTimer); + noteBuffer = k; + noteTimer = setTimeout(submitNoteBuffer, 600); + } + } + if (e.key === 'Tab' && !e.shiftKey) { + e.preventDefault(); + if (mode === 1) setMode(2); + else if (mode === 2) setMode('stats'); + else setMode(1); + } +}); + +// ─── Init ───────────────────────────────────────────────────────────────────── +renderQuestion(); diff --git a/js/fretboard.js b/js/fretboard.js new file mode 100644 index 0000000..f2bdf8a --- /dev/null +++ b/js/fretboard.js @@ -0,0 +1,154 @@ +import { OPEN_NOTES, getNoteAt, noteDisplay } from './music.js'; + +export const FRET_COUNT = 12; +const STRING_SPACING = 28; +// Width of each playable fret slot (index = fret number, index 0 unused) +const FRET_WIDTHS = [0, 52, 50, 47, 45, 43, 41, 39, 37, 35, 34, 32, 31]; +const MARKER_FRETS = [3, 5, 7, 9, 12]; + +// Returns cumulative x positions of fret wires 0..FRET_COUNT. +// fretXs[f] is the right edge of the f-th fret slot (= left edge of slot f+1). +function computeFretXs() { + const xs = [0]; + for (let i = 1; i <= FRET_COUNT; i++) xs.push(xs[i - 1] + FRET_WIDTHS[i]); + return xs; +} + +const FRET_XS = computeFretXs(); + +/** + * Builds an SVG fretboard string. + * + * opts: + * numStrings {number} 6 or 7 + * highlightPos {stringIdx, fret} | null — mode 1 position dot + * mode2Sel {Set<"s,f">} — user's current selections + * mode2Correct {Set<"s,f">} | null — revealed after submission + * showLabels {boolean} — show note names on dots + * interactive {boolean} — add data-* click targets + * fretRange [start, end] | null — highlighted fret window + * sharpsOnly {boolean} + */ +export function buildFretboard({ + numStrings = 6, + highlightPos = null, + mode2Sel = new Set(), + mode2Correct = null, + showLabels = false, + interactive = false, + fretRange = null, + sharpsOnly = false, +} = {}) { + const ns = numStrings; + const PAD_LEFT = 30; + const PAD_RIGHT = 16; + const PAD_TOP = 20; + const PAD_BOTTOM = 20; + const totalW = FRET_XS[FRET_COUNT]; + const svgW = totalW + PAD_LEFT + PAD_RIGHT; + const svgH = (ns - 1) * STRING_SPACING + PAD_TOP + PAD_BOTTOM; + + const parts = []; + const p = s => parts.push(s); + + p(``); + + // Fret-range highlight band + if (fretRange) { + const [fr1, fr2] = fretRange; + const x1 = PAD_LEFT + (fr1 > 0 ? FRET_XS[fr1 - 1] : 0); + const x2 = PAD_LEFT + FRET_XS[fr2]; + p(``); + } + + // Nut + p(``); + + // Fret wires + for (let f = 1; f <= FRET_COUNT; f++) { + const x = PAD_LEFT + FRET_XS[f]; + p(``); + } + + // Fret numbers + for (let f = 1; f <= FRET_COUNT; f++) { + const x = PAD_LEFT + (FRET_XS[f - 1] + FRET_XS[f]) / 2; + const inRange = !fretRange || (f >= fretRange[0] && f <= fretRange[1]); + p(`${f}`); + } + + // Position marker dots + for (const mf of MARKER_FRETS) { + const x = PAD_LEFT + (FRET_XS[mf - 1] + FRET_XS[mf]) / 2; + const midY = PAD_TOP + (ns - 1) * STRING_SPACING / 2; + if (mf === 12) { + p(``); + p(``); + } else { + p(``); + } + } + + // Strings + const opens = OPEN_NOTES[ns]; + for (let s = 0; s < ns; s++) { + const y = PAD_TOP + (ns - 1 - s) * STRING_SPACING; + const thickness = 1 + (ns - 1 - s) * 0.22; + p(``); + p(`${opens[s]}`); + } + + // Dots and click targets + for (let s = 0; s < ns; s++) { + const y = PAD_TOP + (ns - 1 - s) * STRING_SPACING; + + for (let f = 0; f <= FRET_COUNT; f++) { + const x = f === 0 ? PAD_LEFT - 22 : PAD_LEFT + (FRET_XS[f - 1] + FRET_XS[f]) / 2; + const key = `${s},${f}`; + const inRange = !fretRange || (f >= fretRange[0] && f <= fretRange[1]); + + const dotColor = resolveDotColor({ key, s, f, highlightPos, mode2Sel, mode2Correct, interactive, inRange }); + + if (dotColor) { + p(``); + if (showLabels) { + const label = noteDisplay(getNoteAt(s, f, ns), sharpsOnly); + p(`${label}`); + } + } + + if (interactive && inRange) { + const cellX = f === 0 ? PAD_LEFT - 36 : PAD_LEFT + FRET_XS[f - 1]; + const cellW = f === 0 ? 30 : FRET_XS[f] - FRET_XS[f - 1]; + p(``); + } + } + } + + p(''); + return parts.join(''); +} + +function resolveDotColor({ key, s, f, highlightPos, mode2Sel, mode2Correct, interactive, inRange }) { + // Mode 1 highlight + if (highlightPos && highlightPos.stringIdx === s && highlightPos.fret === f) { + return { fill: '#e94560', stroke: 'none' }; + } + + if (!interactive || !inRange) return null; + + if (mode2Correct) { + // Post-submission state + const isCorrect = mode2Correct.has(key); + const isSelected = mode2Sel.has(key); + if (isCorrect && isSelected) return { fill: '#4caf50', stroke: '#4caf50' }; + if (isCorrect && !isSelected) return { fill: 'rgba(76,175,80,0.5)', stroke: '#4caf50' }; + if (!isCorrect && isSelected) return { fill: 'rgba(233,69,96,0.7)', stroke: '#e94560' }; + return null; + } + + // Pre-submission: show selected positions + if (mode2Sel.has(key)) return { fill: 'var(--accent2)', stroke: 'none' }; + + return null; +} diff --git a/js/music.js b/js/music.js new file mode 100644 index 0000000..67e4944 --- /dev/null +++ b/js/music.js @@ -0,0 +1,31 @@ +// Canonical pitch representation: sharps only. +// Flats are derived via ENHARMONIC for display purposes only. +export const CHROMATIC = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B']; +export const ENHARMONIC = { 'C#': 'Db', 'D#': 'Eb', 'F#': 'Gb', 'G#': 'Ab', 'A#': 'Bb' }; +export const NATURAL = ['C', 'D', 'E', 'F', 'G', 'A', 'B']; + +// Standard tuning, index 0 = lowest string. +// 6-string: strings 6→1 (low E → high e) +// 7-string: strings 7→1 (low B → high e) +export const OPEN_NOTES = { + 6: ['E', 'A', 'D', 'G', 'B', 'E'], + 7: ['B', 'E', 'A', 'D', 'G', 'B', 'E'], +}; + +export function getNoteAt(stringIdx, fret, numStrings) { + const openIdx = CHROMATIC.indexOf(OPEN_NOTES[numStrings][stringIdx]); + return CHROMATIC[(openIdx + fret) % 12]; +} + +// Returns "D#/Eb" for accidentals unless sharpsOnly is set. +export function noteDisplay(note, sharpsOnly) { + if (sharpsOnly || !ENHARMONIC[note]) return note; + return `${note}/${ENHARMONIC[note]}`; +} + +// Returns 9 answer choices including the correct note (all in sharp form). +export function getAnswerChoices(correct, naturalOnly) { + const pool = naturalOnly ? NATURAL : CHROMATIC; + const others = pool.filter(n => n !== correct).sort(() => Math.random() - 0.5).slice(0, 8); + return [...others, correct].sort(() => Math.random() - 0.5); +} diff --git a/js/quiz.js b/js/quiz.js new file mode 100644 index 0000000..08ade69 --- /dev/null +++ b/js/quiz.js @@ -0,0 +1,44 @@ +import { CHROMATIC, NATURAL, getNoteAt, getAnswerChoices } from './music.js'; +import { FRET_COUNT } from './fretboard.js'; + +export function genMode1Question(numStrings, naturalOnly) { + let stringIdx, fret, note; + let attempts = 0; + do { + stringIdx = Math.floor(Math.random() * numStrings); + fret = Math.floor(Math.random() * (FRET_COUNT + 1)); + note = getNoteAt(stringIdx, fret, numStrings); + attempts++; + } while (naturalOnly && !NATURAL.includes(note) && attempts < 100); + + const choices = getAnswerChoices(note, naturalOnly); + return { stringIdx, fret, note, choices }; +} + +export function genMode2Question(numStrings, naturalOnly) { + const pool = naturalOnly ? NATURAL : CHROMATIC; + const targetNote = pool[Math.floor(Math.random() * pool.length)]; + + const rangeLen = Math.random() < 0.5 ? 4 : 5; + const fretStart = Math.floor(Math.random() * (FRET_COUNT - rangeLen + 1)); + const fretEnd = fretStart + rangeLen; + + const correctSet = new Set(); + for (let s = 0; s < numStrings; s++) { + for (let f = fretStart; f <= fretEnd; f++) { + if (getNoteAt(s, f, numStrings) === targetNote) { + correctSet.add(`${s},${f}`); + } + } + } + + return { targetNote, fretStart, fretEnd, correctSet }; +} + +export function evaluateMode2(selection, correctSet) { + const allCorrect = [...correctSet].every(k => selection.has(k)) && + [...selection].every(k => correctSet.has(k)); + const missed = [...correctSet].filter(k => !selection.has(k)).length; + const extra = [...selection].filter(k => !correctSet.has(k)).length; + return { allCorrect, missed, extra }; +} diff --git a/site.webmanifest b/site.webmanifest new file mode 100644 index 0000000..a1414c8 --- /dev/null +++ b/site.webmanifest @@ -0,0 +1 @@ +{"name":"Guitar Fretboard Trainer","short_name":"Fretboard","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file