I am currently working on my fourth year project (computer science) which involves the automatic transcription of music -> sheet music. I am doing it in Matlab at the moment but will have to be converted to java at some stage.
My problem:
I have my program returning the correct notes for pure sine tones, I have now encountered a problem when it comes to the retrieval of the fundamental frequency from a note played by a natural instrument. With certain notes, the peak representing the fundamental of the note seems to be missing entirely. For example when I play a G3 note from garageband, it is shown as a G4, as only the 1st, 3rd, 5th and 7th harmonics are appearing in my plot. I tried to add the image but as this is my first post it wouldn’t allow me. Any pointers in the right direction would be greatly appreciated.
This is not unusual. It’s very common for the fundamental to be missing, or nearly so, for male voices, big string instruments, and many other pitched sound sources.
That makes using an FFT peak result alone extremely poor at determining musical notes from actual musical instruments, as opposed to sinewave function generators. That’s because pitch is different from peak spectral frequency. Pitch is a psycho-acoustic perceptual phenomena. So that’s what you need to read up on. There are tons of research papers on the subject.
So you need to look at a completely different set of algorithms. Try cepstrums (cepstral analysis), harmonic product spectrums, autocorrelation and similar (AMDF, ASDF, etc. lags), RAPT (Robust Algorithm for Pitch Tracking), YAAPT, etc.
ADDED: I wrote up a more detailed explanation of pitched sounds with missing fundamentals in a blog post.