Battements par minute de l’entrée audio en temps réel

Je voudrais écrire une application C # simple pour surveiller l’audio de ligne et me donner les battements actuels (et la moyenne mobile) par minute.

J’ai vu cet article sur gamedev , et ce n’était absolument pas utile. Je suis passé par là et j’ai essayé de mettre en œuvre ce qu’il faisait mais ça ne fonctionnait tout simplement pas.

Je sais qu’il doit y avoir des tonnes de solutions pour cela, car beaucoup de logiciels DJ le font, mais je n’ai aucune chance de trouver une bibliothèque open source ou des instructions pour le faire moi-même.

Calculez un spectre de puissance avec une fenêtre coulissante FFT: prenez 1024 échantillons:

double[] signal = stream.Take(1024); 

Envoyez-le à un algorithme FFT:

 double[] real = new double[signal.Length]; double[] imag = new double[signal.Length); FFT(signal, out real, out imag); 

Vous obtiendrez une partie réelle et une partie imaginaire. Ne jetez PAS la partie imaginaire. Faites la même chose avec la partie réelle que l’imaginaire. S’il est vrai que la partie imaginaire est déphasée par rapport au réel, elle contient toujours 50% des informations sur le spectre.

MODIFIER:

Calculez la puissance par opposition à l’amplitude afin d’avoir un nombre élevé quand il est fort et proche de zéro quand il est silencieux:

 for (i=0; i < real.Length; i++) real[i] = real[i] * real[i]; 

De même pour la partie imaginaire.

 for (i=0; i < imag.Length; i++) imag[i] = imag[i] * imag[i]; 

Maintenant, vous avez un spectre de puissance pour les 1024 derniers échantillons. La première partie du spectre correspond aux basses fréquences et la dernière partie des fréquences hautes.

Si vous voulez trouver le BPM dans la musique populaire, vous devriez probablement vous concentrer sur la basse. Vous pouvez capter l'intensité des graves en additionnant la partie inférieure du spectre de puissance. Les nombres à utiliser dépendent de la fréquence d'échantillonnage:

 double bassIntensity = 0; for (i=8; i < 96; i++) bassIntensity += real[i]; 

Maintenant, faites de même, mais déplacez la fenêtre 256 échantillons avant de calculer un nouveau spectre. Maintenant, vous vous retrouvez avec le calcul de la densité pour chaque 256 échantillons.

Ceci est une bonne entrée pour votre parsing BPM. Lorsque les basses sont silencieuses, vous n'avez pas de battement et quand il est fort vous avez un battement.

Bonne chance!

Il y a un excellent projet appelé Dancing Monkeys, qui génère des pas de danse DDR à partir de la musique. Une grande partie de son travail repose sur une parsing des battements (nécessairement très précise), et leur projet décrit en détail les différents algorithmes de détection de battement et leur adéquation à la tâche. Ils incluent des références aux documents originaux pour chacun des algorithmes. Ils ont également publié le code matlab pour leur solution. Je suis sûr qu’entre ceux-ci vous pouvez trouver ce dont vous avez besoin.

Tout est disponible ici: http://monket.net/dancing-monkeys-v2/Main_Page

Non pas que je sache comment mettre en œuvre cela, mais du sharepoint vue de l’ingénierie audio, vous devez d’abord filtrer. Les hits de grosse caisse seraient les premiers à vérifier. Un filtre passe-bas qui vous donne moins de 200Hz devrait vous donner une image assez claire de la grosse caisse. Une porte pourrait également être nécessaire pour nettoyer tout encombrement des autres instruments avec des harmoniques aussi faibles.

Le prochain à vérifier serait des hits de caisse claire. Vous devriez égaliser celui-ci. Le “crack” de la caisse claire est à environ 1.5kHz de la mémoire, mais vous devez absolument passer à celui-ci.

Le prochain défi serait de trouver un algorithme pour les rythmes funky. Comment trouveriez-vous le beat 1 par programme? Je suppose que vous garderez une trace des battements précédents et utiliserez un motif correspondant à quelque chose d’autre. Donc, vous auriez probablement besoin de quelques mesures pour trouver le rythme avec précision. Ensuite, il y a des problèmes de timing comme 4/4, 3/4, 6/8, wow, je ne peux pas imaginer ce qui serait nécessaire pour le faire avec précision! Je suis sûr que cela vaudrait beaucoup d’argent pour les entresockets de matériel et de logiciels audio.

Ce n’est en aucun cas un problème facile. Je vais essayer de vous donner un aperçu seulement.

Ce que vous pourriez faire, c’est quelque chose comme ceci:

  1. Calculez le volume moyen (racine-carré) du signal sur des blocs de, disons, 5 millisecondes. (N’ayant jamais fait cela auparavant, je ne sais pas ce que serait une bonne taille de bloc.)
  2. Prenez la transformée de Fourier du signal “bloqué”, en utilisant l’algorithme FFT.
  3. Trouvez le composant dans le signal transformé qui a la plus grande amplitude.

Une transformée de Fourier est essentiellement un moyen de calculer la force de toutes les fréquences présentes dans le signal. Si vous faites cela sur le signal “bloqué”, la fréquence du battement devrait être la plus forte.

Vous devez peut-être d’abord appliquer un filtre pour vous concentrer sur des fréquences spécifiques (comme les graves) qui contiennent généralement le plus d’informations sur le BPM.

J’ai trouvé cette bibliothèque qui semble avoir une implémentation assez solide pour détecter les battements par minute . http://soundtouchdotnet.codeplex.com/

Il est basé sur http://www.surina.net/soundtouch/index.html qui est utilisé dans de nombreux projets de DJ http://www.surina.net/soundtouch/applications.html

Tout d’abord, ce que Hallgrim produit n’est pas la fonction de densité spectrale de puissance. Les périodicités statistiques de tout signal peuvent être mises en évidence par une fonction d’autocorrélation. La transformée de Fourier du signal d’autocorrélation est la densité spectrale de puissance. Les pics dominants dans la PSD autres qu’à 0 Hz correspondront à la périodicité effective du signal (en Hz) …

Le moyen le plus simple de le faire est de taper sur un bouton au rythme du rythme et de compter le nombre de sockets divisé par le temps.

Je recommande de vérifier la bibliothèque audio BASS et l’encapsuleur BASS.NET. Il a une classe intégrée BPMCounter.

Les détails de cette fonction spécifique sont disponibles à l’ adresse http://bass.radio42.com/help/html/0833aa5a-3be9-037c-66f2-9adfd42a8512.htm .