🎵 Chord Library

Essential Open Chords

Master these 6 fundamental chords and you can play thousands of songs.

🎯
Practice tip: Start with Em and Am — they only need 2 fingers! Once those feel natural, move to C and G. Don't rush it. 🌱
Index (1)
Middle (2)
Ring (3)
Pinky (4)
Open
Muted
💡 Tip: Numbers inside dots = which finger. "O" above = play open. "X" = don't play that string.

Beginner Chord Path

Start Here

Work through the chords in order. Start with Em and Am, then add C and G before taking on the rest.

Essential Switch Drills

Unlocking

Finish the early chord path, then rehearse the most useful beginner switches in short clean rounds.

Next Chord Expansion

Intermediate

Once the six core open chords are stable, add color, power, and hand strength with these next shapes.

7th Chords

  • Try `A7`, `D7`, and `E7` for blues and singer-songwriter grooves.
  • They usually remove one finger instead of adding a harder stretch.
  • Best first move: switch from `A` to `A7` and listen for the color change.

Power Chords

  • Use two-note shapes on the low strings for rock rhythm.
  • Start with the root on the low E string and add the fifth two frets up on the A string.
  • Mute unused strings with the side of the index finger.

Barre Prep

  • Flatten the index finger across the first two strings first, not all six at once.
  • Practice short holds for 5 seconds before strumming full shapes.
  • Use `E major` as the mental template for your future F-barre shape.

Common Progressions

  • `G → D → Em → C` for pop and folk.
  • `C → G → Am → F` for ballads and piano-style songs.
  • `A5 → C5 → G5 → D5` for early rock power-chord work.
const FC = { 1: "#f87171", 2: "#60a5fa", 3: "#6ee7a0", 4: "#fbbf6e", 5: "#818cf8" }; let currentUser = null; let instConfig = null; let activeDetector = null; function buildSVG(c) { if (!instConfig || !c) return ''; // Piano uses keyboard visualization (has keys property) if (instConfig.id === 'piano' || c.keys) { return buildPianoSVG(c); } // Violin/ukulele/guitar use fretboard (has strings property) if (c.strings || instConfig.id === 'violin' || instConfig.id === 'ukulele' || instConfig.id === 'guitar') { return buildFretboardSVG(c); } // Fallback: show nothing return '
No visualization
'; } function buildFretboardSVG(c) { if (!instConfig || !c) return ''; const stringCount = (instConfig.id === 'ukulele' || instConfig.id === 'violin') ? 4 : 6; const W = 180, H = 240, L = 40, T = 45, S = 24, F = 38, NF = 4; const fretboardWidth = S * (stringCount - 1); let s = ``; // Nut s += ``; // Frets for (let f = 1; f <= NF; f++) s += ``; // Strings for (let i = 0; i < stringCount; i++) { const x = L + i * S; s += ``; } if (c.strings) { for (let i = 0; i < stringCount; i++) { const x = L + i * S, fr = c.strings[i], fi = c.fingers ? c.fingers[i] : 0; if (fr === -1) s += ``; else if (fr === 0) s += ``; else { const cy = T + (fr - 0.5) * F, col = FC[fi] || "#888"; s += ``; if (fi > 0) s += `${fi}`; } if (c.notes && c.notes[i]) s += `${c.notes[i]}`; } } return s + ``; } function buildPianoSVG(c) { const W = 200, H = 120, keyW = 24, keyH = 80, blackW = 14, blackH = 50; let s = ``; const startMidi = 48; // Middle C const whiteKeys = [0, 2, 4, 5, 7, 9, 11, 12]; const blackKeys = [1, 3, 6, 8, 10]; whiteKeys.forEach((offset, i) => { const midi = startMidi + offset; const active = c.keys && c.keys.includes(midi); s += ``; if (active) { const finger = c.fingers[c.keys.indexOf(midi)]; s += ``; s += `${finger}`; } }); blackKeys.forEach((offset, i) => { const midi = startMidi + offset; const active = c.keys && c.keys.includes(midi); const x = (offset === 1) ? keyW - blackW/2 : (offset === 3) ? keyW * 2 - blackW/2 : (offset === 6) ? keyW * 4 - blackW/2 : (offset === 8) ? keyW * 5 - blackW/2 : (offset === 10) ? keyW * 6 - blackW/2 : 0; s += ``; if (active) { const finger = c.fingers[c.keys.indexOf(midi)]; s += ``; } }); return s + ``; } function renderChordGrid(user) { if (!window.InstrumentConfig || !window.ProgressService) return; instConfig = window.InstrumentConfig.getForUser(user); const urlParams = new URLSearchParams(window.location.search); const mode = urlParams.get('mode') || 'chords'; const chords = instConfig.chords || []; const abilities = window.InstrumentConfig.getAbilities(instConfig.id); const term = abilities.terminology; const headerBadge = document.querySelector('header .badge'); const headerTitle = document.querySelector('header h1'); const headerDesc = document.querySelector('header p'); const modeLabel = mode === 'scales' ? 'Scales' : term.chordLabel; const modeEmoji = mode === 'scales' ? '🎼' : '🎵'; if (headerBadge) headerBadge.textContent = `${modeEmoji} ${instConfig.name} ${modeLabel}`; if (headerTitle) headerTitle.textContent = mode === 'scales' ? `Essential ${modeLabel}` : `Essential ${instConfig.name} ${modeLabel}`; if (headerDesc) { let baseDesc = mode === 'scales' ? `Master these foundational ${modeLabel.toLowerCase()} for better orientation.` : `Master these fundamental ${term.chordLabel.toLowerCase()} to play thousands of songs.`; // Add instrument-specific caveats if (instConfig.id === 'violin') { baseDesc += ' Violin "chords" are single notes/scales, not guitar-style chords.'; } else if (!instConfig.abilities.hasFretboard && !instConfig.abilities.hasKeyboard) { baseDesc = 'Chord library not available for this instrument yet.'; } headerDesc.innerHTML = baseDesc; } const grid = document.getElementById('chordGrid'); if (grid && chords.length > 0) { grid.innerHTML = chords.map(c => `
Ready
${c.name} ${c.type || ''}
${buildSVG(c)}
Instructions:

${c.placement || 'Standard fingering.'}

`).join(''); } else if (grid) { grid.innerHTML = `

No ${modeLabel.toLowerCase()} available yet for ${instConfig.name}. More content coming soon!

`; } const drillGrid = document.getElementById('drillGrid'); if (drillGrid && instConfig.drills && instConfig.drills.length > 0) { drillGrid.innerHTML = instConfig.drills.map(d => `
Ready

${d.title}

${d.summary}

    ${d.steps.map(s => `
  • ${s}
  • `).join('')}
`).join(''); } } document.addEventListener('DOMContentLoaded', () => { const wait = setInterval(() => { if (!window.ProgressService || !window.InstrumentConfig) return; clearInterval(wait); const user = window.ProgressService.getCurrentUser(); const inst = window.InstrumentConfig.getForUser(user); document.title = `${inst.name} Chords — ${inst.name}Mastery`; renderChordGrid(user); }, 50); });