KEYnote
Screenshot is highlighting the major 3rd of an A chord: 440, 550 and 660Hz. Note the FFT bin is not a precise pitch so the closest concert pitch is displayed.
See the source on GitHub.
Note mapping
#include <iostream>
#include <map>
#include <vector>
const std::map<double, std::string> notes{
// Catch all for lower bound search
{0.0, "Bx"},
// All the notes we're interested in. At the low end a single Fourier bin
// will map to multiple notes. Further up multiple bins will be assigned
// the same note.
{16.35, "C0"},
{17.32, "C#0"},
{18.35, "D0"},
{19.45, "D#0"},
{20.60, "E0"},
{21.83, "F0"},
{23.12, "F#0"},
{24.50, "G0"},
{25.96, "G#0"},
{27.50, "A0"},
{29.14, "A#0"},
{30.87, "B0"},
{32.70, "C1"},
{34.65, "C#1"},
{36.71, "D1"},
{38.89, "D#1"},
{41.20, "E1"},
{43.65, "F1"},
{46.25, "F#1"},
{49.00, "G1"},
{51.91, "G#1"},
{55.00, "A1"},
{58.27, "A#1"},
{61.74, "B1"},
{65.41, "C2"},
{69.30, "C#2"},
{73.42, "D2"},
{77.78, "D#2"},
{82.41, "E2"},
{87.31, "F2"},
{92.50, "F#2"},
{98.00, "G2"},
{103.83, "G#2"},
{110.00, "A2"},
{116.54, "A#2"},
{123.47, "B2"},
{130.81, "C3"},
{138.59, "C#3"},
{146.83, "D3"},
{155.56, "D#3"},
{164.81, "E3"},
{174.61, "F3"},
{185.00, "F#3"},
{196.00, "G3"},
{207.65, "G#3"},
{220.00, "A3"},
{233.08, "A#3"},
{246.94, "B3"},
{261.63, "C4"},
{277.18, "C#4"},
{293.66, "D4"},
{311.13, "D#4"},
{329.63, "E4"},
{349.23, "F4"},
{369.99, "F#4"},
{392.00, "G4"},
{415.30, "G#4"},
{440.00, "A4"},
{466.16, "A#4"},
{493.88, "B4"},
{523.25, "C5"},
{554.37, "C#5"},
{587.33, "D5"},
{622.25, "D#5"},
{659.25, "E5"},
{698.46, "F5"},
{739.99, "F#5"},
{783.99, "G5"},
{830.61, "G#5"},
{880.00, "A5"},
{932.33, "A#5"},
{987.77, "B5"},
{1046.50, "C6"},
{1108.73, "C#6"},
{1174.66, "D6"},
{1244.51, "D#6"},
{1318.51, "E6"},
{1396.91, "F6"},
{1479.98, "F#6"},
{1567.98, "G6"},
{1661.22, "G#6"},
{1760.00, "A6"},
{1864.66, "A#6"},
{1975.53, "B6"},
{2093.00, "C7"},
{2217.46, "C#7"},
{2349.32, "D7"},
{2489.02, "D#7"},
{2637.02, "E7"},
{2793.83, "F7"},
{2959.96, "F#7"},
{3135.96, "G7"},
{3322.44, "G#7"},
{3520.00, "A7"},
{3729.31, "A#7"},
{3951.07, "B7"},
{4186.01, "C8"},
{4434.92, "C#8"},
{4698.63, "D8"},
{4978.03, "D#8"},
{5274.04, "E8"},
{5587.65, "F8"},
{5919.91, "F#8"},
{6271.93, "G8"},
{6644.88, "G#8"},
{7040.00, "A8"},
{7458.62, "A#8"},
{7902.13, "B8"},
};