Here is a rather quick attempt. Define a function which converts frequencies to the nearest pitch.
NoteName[freq_] := Module[{notelist,freqlist,list},
notelist = {"B"}~Join~
Nest[Join[{"C", "C\[Sharp]/D\[Flat]", "D", "D\[Sharp]/E\[Flat]",
"E", "F", "F\[Sharp]/G\[Flat]", "G", "G\[Sharp]/A\[Flat]",
"A", "A\[Sharp]/B\[Flat]", "B"}, #] &, {"C",
"C\[Sharp]/D\[Flat]", "D", "D\[Sharp]/E\[Flat]", "E", "F",
"F\[Sharp]/G\[Flat]", "G", "G\[Sharp]/A\[Flat]", "A",
"A\[Sharp]/B\[Flat]", "B"}, 3]~Join~{"C", "C\[Sharp]/D\[Flat]"};
freqlist = {440.*2^(-2 - 9/12 + #/12 - 1/24),
440.*2^(-2 - 9/12 + #/12 + 1/24)} & /@ Range[-1, 49];
list = Transpose[{notelist,freqlist}];
If[freq < 440.*2^(-2 - 9/12 - 1/12 - 1/24), "Too Low",
If[freq > 440.*2^(-2 - 9/12 + 49/12 + 1/24),"Too High",
Select[list, #[[2, 1]] < freq < #[[2, 2]] &][[1, 1]]
]]
]
Now import the data and perform the wavelet transform.
data = Import["chord.mp3","Data"]//First;
sampleRate = Import["chord.mp3","SampleRate"];
cwt = ContinuousWaveletTransform[data,
GaborWavelet[6], Padding->0.0,
SampleRate->sampleRate,
WaveletScale->Automatic];
Convert the results to frequencies and pitches.
notes =
(* convert scales to frequencies *)
(#1[[1]] -> sampleRate/#1[[2]] &) /@ cwt["Scales"] //
(* remove frequencies which are too low or too high *)
# /. {({u_,v_} -> n_?(# < 440.*2^(-2 - 5/12 - 1/24) || # >
440.*2^(-2 + 40/12 + 1/24) &)) :> Sequence[]} & //
(* Label frequencies with pitches *)
# /. ({a_, b_} -> c_) :> ({a, b} -> {NoteName[c], c}) &
The result
{{6, 2} -> {"B", 1006.68}, {6, 3} -> {"G\[Sharp]/A\[Flat]", 846.515},
{6, 4} -> {"F", 711.832}, {7, 1} -> {"D", 598.577},
{7, 2} -> {"B", 503.341}, {7, 3} -> {"G\[Sharp]/A\[Flat]", 423.258},
{7, 4} -> {"F", 355.916}, {8, 1} -> {"D", 299.288},
{8, 2} -> {"B", 251.67}, {8, 3} -> {"G\[Sharp]/A\[Flat]", 211.629},
{8, 4} -> {"F", 177.958}, {9, 1} -> {"D", 149.644},
{9, 2} -> {"B", 125.835}, {9, 3} -> {"G\[Sharp]/A\[Flat]", 105.814},
{9, 4} -> {"F", 88.979}}
Looks like an Fdim chord.