Detecting pitch with the Web Audio API and autocorrelation
alexanderell.is
alexanderell.is
Also, the plucking sound when the hammer hits the string is much closer to pink noise than to its actual pitch. I'd expect an autocorrelation to have plenty of false positives there.
FFT with remapping between bins works well. The remapping can accumulate the energy of overtones into the frequency bins of possible base pitches, thereby resolving the ambiguity.
Pitch detection algorithms are a fascinating rabbit hole, and designing a good one for a given set of requirements is a real art.
Edit: One thing autocorrelation is quite effective for is autotune. Here, you need to snap to the nearest (12-tone equal temperament) note, and it turns out the ratio you calculate to perform that correction is unaffected by the most common octave errors. Eg. If I detect your slightly flat D4 as a slightly flat D5, the correction to get to the nearby D is the same.
A better way is parabolic interpolation, which is in the source code but not mentioned in the article - and that works for finding the fractional position of peaks in the FFT or in the autocorrelation.
An even better way is by comparing the phase of the peak in two successive FFTs: If the signal phase has changed by X degrees after T seconds, what's the nearest frequency to the bin centre that can be true for? (this is the main thing a "phase vocoder" does)
Right now we rely heavily on MIDI input from the Web Audio API and it's been my dream to make it so any instrument can use the website!
You are so cool! Thank you for sharing this!
No one knows!
Assumptions:
1. Real music. I.e., should demonstrate that a punk song is more dissonant than a recording of Vivaldi.
2. Dissonance defined based on published literature.