Audio2Midi

FFT > spot certaines fréquences.

Il existe l’agorithme de Goertzel qui permet d’extraire les notes d’une analyse FFT, mais cela ne semble pas implémenté dans Processing

Fondamentalement, le fichier fait ça :

  • préparation : un bus midi ouvert (avec themidibus.*), un signal audio (processing.AudioIn), une analyse fft (processing.FFT)
  • Passage du signal (AudioIn)
  • Analyse FFT (FFT)
  • conversion de l’analyse FFT en fréquence
  • if (amplitude > n) ET if (fréquence == a-priori-la-note- qui-m’intéresse), alors tu envoies un signal midi avec channel, pitch(la note quoi) et velocity

Deux problèmes :

  • Il faudrait pouvoir n’envoyer qu’une note midi dans un espace de n millisecondes, car actuellement on en envoie plein à la seconde, et ça fait une bouillie de messages midi.
  • Certaines fréquences sont partagées entre plusieurs notes, et il faudrait un ciblage très précis pour isoler une note et envoyer le message midi idoine.

Pour la détection fréquence > note, voir algorithme de Goertzel

  • http://fr.mathworks.com/help/signal/ref/goertzel.html?requestedDomain=www.mathworks.com
  • https://en.wikipedia.org/wiki/Goertzel_algorithm

Conversion analyse FFT en hertz

http://stackoverflow.com/questions/4364823/how-do-i-obtain-the-frequencies-of-each-value-in-an-fft

The first bin in the FFT is DC (0 Hz), the second bin is Fs / N, where Fs is the sample rate and N is the size of the FFT. The next bin is 2 * Fs / N. To express this in general terms, the nth bin is n * Fs / N.

So if your sample rate, Fs is say 44.1 kHz and your FFT size, N is 1024, then the FFT output bins are at:

0: 0 * 44100 / 1024 = 0.0 Hz
1: 1 * 44100 / 1024 = 43.1 Hz
2: 2 * 44100 / 1024 = 86.1 Hz
3: 3 * 44100 / 1024 = 129.2 Hz
4: ...
5: ...
...

511: 511 * 44100 / 1024 = 22006.9 Hz

Note that for a real input signal (imaginary parts all zero) the second half of the FFT (bins from N / 2 + 1 to N - 1) contain no useful additional information (they have complex conjugate symmetry with the first N / 2 - 1 bins). The last useful bin (for practical aplications) is atN / 2 - 1, which corresponds to 22006.9 Hz in the above example. The bin at N / 2 represents energy at the Nyquist frequency, i.e. Fs / 2 ( = 22050 Hz in this example), but this is in general not of any practical use, since anti-aliasing filters will typically attenuate any signals at and above Fs / 2.