Comment déterminer le tempo/BPM d'un morceau par programme? Quels algorithmes sont couramment utilisés et quelles considérations doivent être prises?
C'est difficile à expliquer dans un seul article StackOverflow. En général, les algorithmes de détection de battements les plus simples fonctionnent en localisant les pics d'énergie sonore, ce qui est facile à détecter. Des méthodes plus sophistiquées utilisent filtres en peigne et d'autres méthodes statistiques/de forme d'onde. Pour une explication détaillée, y compris des exemples de code, consultez cet article GameDev out.
Les mots-clés à rechercher sont "Beat Detection", "Beat Tracking" et "Music Information Retrieval". Il y a beaucoup d'informations ici: http://www.music-ir.org/
Il y a (peut-être) un concours annuel appelé MIREX où différents algorithmes sont testés sur leurs performances de détection de battements.
http://nema.lis.illinois.edu/nema_out/mirex2010/results/abt/mck/
Cela devrait vous donner une liste d'algorithmes à tester.
Un algorithme classique est Beatroot (google it), ce qui est agréable et facile à comprendre. Cela fonctionne comme ceci:
Inconvénients de cet algorithme dans mon expérience:
Ici est une démo d'une version live de cet algorithme, montrant le flux spectral (ligne noire en bas) et les débuts (cercles verts). Il convient de considérer le fait que le rythme est extrait des uniquement cercles verts. J'ai joué les onsets juste comme des clics, et pour être honnête, je ne pense pas pouvoir entendre le rythme d'eux, donc à certains égards, cet algorithme est meilleur que les gens à la détection de battements. Je pense que la réduction à un tel signal de faible dimension est cependant son pas faible.
Il y a quelques années, j'ai trouvé un très bon site avec de nombreux algorithmes et du code pour la détection de battements. Je n'ai cependant pas réussi à le retrouver.
Voici quelques excellents liens qui devraient vous aider à démarrer:
L'extraction de battements implique l'identification de structures métriques cognitives dans la musique. Très souvent, ceux-ci ne correspondent pas à l'énergie sonore physique - par exemple, dans la plupart des musiques, il y a un niveau de syncope, ce qui signifie que le battement "tapant du pied" que nous percevons ne correspond pas à la présence d'un son physique. Cela signifie que c'est un champ assez différent de détection de début, qui est la détection des sons physiques, et qui est effectué d'une manière différente.
Vous pouvez essayer la bibliothèque Aubio , qui est une simple bibliothèque C offrant des outils d'extraction de début et de temps.
Il y a aussi en ligne Echonest API , bien que cela implique de télécharger un MP3 sur un site Web et de récupérer du XML, donc cela pourrait ne pas convenir.
EDIT: Je suis tombé sur cette dernière nuit - une bibliothèque C/C++ très prometteuse, même si je ne l'ai pas utilisée moi-même. Plugins Vamp
Le domaine général de recherche qui vous intéresse est appelé MUSIQUE INFORMATION RETRIEVAL
Il existe de nombreux algorithmes différents qui le font, mais ils sont tous fondamentalement centrés sur la DÉTECTION ONSET.
La détection de début mesure le début d'un événement, l'événement dans ce cas est une note jouée. Vous pouvez rechercher des changements dans la transformée de Fourier pondérée (contenu haute fréquence), vous pouvez rechercher des changements importants dans le contenu spectral. (Différence spectrale). (il y a quelques articles que je vous recommande de regarder plus loin) Une fois que vous appliquez un algorithme de détection de début, vous choisissez où se trouvent les battements via le seuillage.
Il existe différents algorithmes que vous pouvez utiliser une fois que vous avez obtenu cette localisation temporelle du rythme. Vous pouvez le transformer en un train d'impulsions (créer un signal qui est zéro pour toujours et 1 uniquement lorsque votre battement se produit), puis appliquer une FFT à cela et BAM, vous avez maintenant une fréquence d'onsets au plus grand pic.
Voici quelques articles pour vous guider dans la bonne direction:
http://www.elec.qmul.ac.uk/people/juan/Documents/Bello-TSAP-2005.pdf
http://bingweb.binghamton.edu/~ahess2/Onset_Detection_Nov302011.pdf
Voici une extension de ce que certaines personnes discutent:
Quelqu'un a mentionné qu'il envisageait d'appliquer un algorithme d'apprentissage automatique: collectez essentiellement un ensemble de fonctionnalités des fonctions de détection de début (mentionnées ci-dessus) et combinez-les avec le signal brut dans un réseau neuronal/régression logistique et découvrez ce qui fait un battement un battement.
regardez le Dr Andrew Ng, il a des conférences gratuites d'apprentissage automatique de l'Université de Stanford en ligne (pas les conférences vidéo de longue haleine, il y a en fait un cours à distance en ligne)
Si vous parvenez à vous interfacer avec le code python dans votre projet, API Echo Nest Remix = est une API assez fluide pour python:
Il y a une méthode analysis.tempo
qui vous donnera le BPM. Il peut faire bien plus qu'un simple BPM, comme vous pouvez le voir dans les documents de l'API ou this tutoriel
Effectuez une transformée de Fourier , et trouvez des pics dans le spectre de puissance. Vous recherchez des pics inférieurs à la coupure de 20 Hz pour l'audition humaine. Je suppose que généralement dans la gamme 0,1-5ish Hz pour être généreux.
Question SO qui pourrait aider: Bibliothèque de détection audio Bpm
En outre, voici l'une des nombreuses questions de "recherche de crête" sur SO: Détection de crête du signal mesuré
Edit: Pas que je fasse du traitement audio. C'est juste une supposition basée sur le fait que vous recherchez une propriété de domaine de fréquence du fichier ...
une autre modification: Il convient de noter que les formats de compression avec perte comme le mp3 stockent les données du domaine Fourier plutôt que les données du domaine temporel en premier lieu. Avec un peu d'intelligence, vous pouvez vous épargner des calculs lourds ... mais voyez le commentaire réfléchi de cobbal.
Il existe plusieurs méthodes pour obtenir le BPM, mais celle que je trouve la plus efficace est le "spectre de battement" (décrit ici ). Cet algorithme calcule une matrice de similitude en comparant chaque court échantillon de musique avec les autres. Une fois la matrice de similitude calculée, il est possible d'obtenir une similitude moyenne entre chaque paire d'échantillons {S (T); S (T + 1)} pour chaque intervalle de temps T: il s'agit du spectre de battement. Le premier pic élevé dans le spectre de battement est la plupart du temps la durée du battement. La meilleure partie est que vous pouvez également faire des choses comme la structure musicale ou les analyses de rythme.
D'autres ont déjà décrit certaines méthodes de détection des battements. Je veux ajouter qu'il existe des bibliothèques disponibles qui fournissent des techniques et des algorithmes pour ce genre de tâche.
Aubio est l'un d'entre eux, il a une bonne réputation et il est écrit en C avec un wrapper C++ afin que vous puissiez l'intégrer facilement avec une application cacao (tout le contenu audio dans les frameworks d'Apple est également écrit en C/C++).
La détection précise du BPM est très difficile. Voir cette question de stackoverflow , et ma réponse.
Pour republier ma réponse: Le moyen le plus simple est de demander à l'utilisateur d'appuyer sur un bouton en rythme avec le rythme et de compter le nombre de taps divisé par le temps.
Voici un programme gratuit analysera et écrira le BPM sur la balise ID3V2. Aucune idée de la qualité