Join our Discord! discord.gg/pianoglow

Multiplayer piano with training, leaderboards and neon visuals

Available onSteam Recommended Available oniOS Available onAndroid

Newbie on real piano?

Level 8 Avg: 1.03 Shift: 25.8%
Notes380 Chords369 RangeC2 – C7
Press [ or ] to semi-auto
Keyboard Settings Optionally set the keyboard and controls to your liking or to match the piano app you are using.
Keyboard
Controls
function convertToLetterNotes(virtualPianoSheet) {
  const keyMap = {
    '1': 'C2', '2': 'D2', '3': 'E2', '4': 'F2', '5': 'G2', '6': 'A2', '7': 'B2', '8': 'C3', '9': 'D3', '0': 'E3',
    'q': 'F3', 'w': 'G3', 'e': 'A3', 'r': 'B3', 't': 'C4', 'y': 'D4', 'u': 'E4', 'i': 'F4', 'o': 'G4', 'p': 'A4',
    'a': 'B4', 's': 'C5', 'd': 'D5', 'f': 'E5', 'g': 'F5', 'h': 'G5', 'j': 'A5', 'k': 'B5', 'l': 'C6', 'z': 'D6',
    'x': 'E6', 'c': 'F6', 'v': 'G6', 'b': 'A6', 'n': 'B6', 'm': 'C7',
    '!': 'C#2', '@': 'D#2', '#': 'F2', '$': 'F#2', '%': 'G#2', '^': 'A#2', '&': 'C3', '*': 'C#3', '(': 'D#3', ')': 'F3',
    'Q': 'F#3', 'W': 'G#3', 'E': 'A#3', 'R': 'C4', 'T': 'C#4', 'Y': 'D#4', 'U': 'F4', 'I': 'F#4', 'O': 'G#4', 'P': 'A#4',
    'A': 'C5', 'S': 'C#5', 'D': 'D#5', 'F': 'F5', 'G': 'F#5', 'H': 'G#5', 'J': 'A#5', 'K': 'C6', 'L': 'C#6', 'Z': 'D#6',
    'X': 'F6', 'C': 'F#6', 'V': 'G#6', 'B': 'A#6', 'N': 'C7', 'M': 'C#7',
    '[': '[', ']': ']', '}': '}', '{': '{', '-': '-', '|': '|', ' ': ' '
  };

  const specialKeyMap = {
    '1': 'A0', '2': 'A#0', '3': 'B0', '4': 'C1', '5': 'C#1', '6': 'D1', '7': 'D#1', '8': 'E1', '9': 'F1', '0': 'F#1',
    'q': 'G1', 'w': 'G#1', 'e': 'A1', 'r': 'A#1', 't': 'B1',
    'y': 'C#7', 'u': 'D7', 'i': 'D#7', 'o': 'E7', 'p': 'F7', 'a': 'F#7', 's': 'G7', 'd': 'G#7', 'f': 'A7', 'g': 'A#7', 'h': 'B7', 'j': 'C8'
  };

  const regex = /(:.{1}'?)|[\s\S]/g;

  const tokens = virtualPianoSheet.match(regex) || [];

  const letterNotes = tokens.map(token => {
    if (token.startsWith(':')) {
      const keyChar = token.charAt(1); 
      return specialKeyMap[keyChar] || ''; 
    } else {
      return keyMap[token] || ''; 
    }
  });

  return letterNotes.filter(n => n).join(' ');
}

const virtualPianoSheet = `SHEET HERE`;
const letterNotes = convertToLetterNotes(virtualPianoSheet);
console.log(letterNotes);

TIP: Use "Copy Text" at the top to copy the sheet instantly.