Imagine you have a long recording of a guitar player playing an arpeggio at a slow speed. To simplify, assume the tempo is 60 bpm or lower. I want to annotate this recording with the exact moments when the guitar player plucks the strings. So:
$$ \mathrm{detect}(recording.wav) = \{t_1, t_2, t_3, \ldots\}, $$ where $t_1, t_2, \ldots$ are the millisecond offsets in the recording of when the strings are plucked.
I have skimmed similar questions related to beat and note detection but they are not really what I'm looking for. Beat detection doesn't work because I'm trying to detect when notes are played not beats. Note detection isn't right either because I'm only looking for when the note is played, not the frequency of it. Probably I'm missing something because this problem seem so trivial.
You can find examples of the recordings I'm talking about here:
- https://www.dropbox.com/s/3852tnat73nld2w/beats.mp3?dl=0
- https://www.dropbox.com/s/tr986i1uoh11i9g/beats2.mp3?dl=0
- https://www.dropbox.com/s/ncosz1d56n8jjst/noisy-beats.mp3?dl=0
The file-format happens to be mp3 but could just aswell be wav.
After some research, I've found that what I'm looking for is called "onset detection." I would have hoped that there would exist robust methods for detecting when the notes are played, since it is so easy for human ears to hear it. But perhaps that is not the case.