Comment déterminer le tempo/BPM d'une chanson de manière programmatique ? Quels algorithmes sont couramment utilisés, et quelles considérations doivent être prises en compte ?
Réponses
Trop de publicités?Il est difficile d'expliquer cela dans un seul post 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. Les 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 comprenant des exemples de code, consultez cet article de GameDev dehors.
L'extraction des rythmes consiste à identifier les structures métriques cognitives dans la musique. Très souvent, celles-ci ne correspondent pas à l'énergie sonore physique - par exemple, dans la plupart des musiques, il y a un certain niveau de syncope, ce qui signifie que le battement de "pied" que nous percevons ne correspond pas à la présence d'un son physique. Il s'agit donc d'un domaine très différent de celui de l'énergie sonore. détection de l'apparition qui est la détection des sons physiques, et s'effectue d'une manière différente.
Vous pouvez essayer le Aubio qui est une bibliothèque en C offrant des outils d'extraction des onset et des battements.
Il y a aussi le site en ligne API Echonest Bien que cela implique le téléchargement d'un MP3 sur un site web et la récupération du XML, ce n'est peut-être pas si approprié
EDITAR: Je suis tombé sur cette bibliothèque C/C++ hier soir, qui semble très prometteuse, même si je ne l'ai pas utilisée moi-même. Plugins Vamp
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 existe (peut-être) un concours annuel appelé MIREX où différents algorithmes sont testés sur leurs performances en matière de détection des 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 (googlez-le), qui est agréable et facile à comprendre. Cela fonctionne comme suit :
- Une FFT courte durée de la musique pour obtenir un sonogramme.
- Additionnez les augmente en magnitude sur toutes les fréquences pour chaque pas de temps (ignorez les diminutions). Vous obtenez ainsi une fonction 1D variable dans le temps appelée "flux spectral".
- Trouvez les pics en utilisant n'importe quel ancien algorithme de détection des pics. Ceux-ci sont appelés "onsets" et correspondent au début des sons dans la musique (début des notes, coups de batterie, etc.).
- Construire un histogramme des intervalles inter-entrées (IOIs). Cet histogramme peut être utilisé pour trouver des tempos probables.
- Initialiser un ensemble d'"agents" ou "hypothèses" pour le résultat du beat-tracking. Donnez à ces agents les onsets un par un dans l'ordre. Chaque agent suit la liste des onsets qui sont aussi des battements, et l'estimation du tempo actuel. Les agents peuvent soit accepter les onsets, s'ils correspondent étroitement au dernier temps et au tempo qu'ils ont suivis, soit les ignorer s'ils sont très différents, soit créer un nouvel agent s'ils se situent entre les deux. Chaque battement ne nécessite pas un onset - les agents peuvent interpoler.
- Chaque agent reçoit un score en fonction de la qualité de son hypothèse - si tous ses battements sont forts, il obtient un score plus élevé. S'ils sont tous réguliers, il obtient un score plus élevé.
- L'agent ayant obtenu le meilleur score est la réponse.
Les inconvénients de cet algorithme, selon mon expérience :
- La détection des pics est plutôt ad-hoc et sensible aux paramètres de seuil et autres.
- Certaines musiques n'ont pas d'onsets évidents sur les rythmes. Il est évident que cela ne fonctionnera pas avec ces musiques.
- Difficile de savoir comment résoudre le problème des 60bpm-vs-120bpm, surtout avec le tracking en direct !
- Jette un lot d'informations en utilisant uniquement un flux spectral 1D. Je pense que vous pouvez faire beaucoup mieux en ayant quelques flux spectraux à bande limitée (et peut-être un flux à large bande pour les tambours).
Ici est une démonstration d'une version live de cet algorithme, montrant le flux spectral (ligne noire en bas) et les onsets (cercles verts). Il est intéressant de considérer le fait que le battement est extrait de sólo les cercles verts. J'ai rejoué les onsets comme des clics et, pour être honnête, je ne pense pas pouvoir entendre le rythme à partir d'eux, donc d'une certaine manière, cet algorithme est meilleur que les gens pour la détection du rythme. Je pense que la réduction à un signal de si faible dimension est son point faible.
Malheureusement, j'ai trouvé un très bon site contenant de nombreux algorithmes et codes pour la détection des battements il y a quelques années. Mais je n'ai pas réussi à le retrouver.
Edit : Trouvé !
Voici quelques liens intéressants qui devraient vous aider à démarrer :
Si vous parvenez à utiliser PyObjC pour s'interfacer avec le code python dans votre projet, API Echo Nest Remix est une API très astucieuse pour python :
Il y a une méthode analysis.tempo
qui vous donnera le BPM. Il peut faire beaucoup plus que du simple BPM, comme vous pouvez le voir dans la documentation de l'API ou sur le site Web de la Commission européenne. ce tutoriel
Le domaine général de recherche qui vous intéresse s'appelle RECHERCHE D'INFORMATIONS MUSICALES.
Il existe de nombreux algorithmes différents pour ce faire, mais ils sont tous fondamentalement centrés sur la DÉTECTION DE L'ONSET.
La détection de l'apparition mesure le début d'un événement, l'événement dans ce cas étant une note jouée. Vous pouvez rechercher des changements dans la transformée de Fourier pondérée (High Frequency Content) ; vous pouvez rechercher des changements importants dans le contenu spectral. (Différence spectrale). (Une fois que vous avez appliqué un algorithme de détection de début, vous choisissez l'endroit où se trouvent les battements par seuillage.
Il existe plusieurs 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 pendant tout le temps et 1 uniquement lorsque le battement se produit), puis appliquer une FFT à ce signal et BAM, vous avez maintenant une fréquence d'apparition au pic le plus important.
Voici quelques documents 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 dont certaines personnes discutent :
Quelqu'un a mentionné la possibilité d'appliquer un algorithme d'apprentissage automatique : Il s'agit de collecter un ensemble de caractéristiques à partir des fonctions de détection du début de la musique (mentionnées ci-dessus) et de les combiner avec le signal brut dans un réseau neuronal/une régression logistique afin d'apprendre ce qui fait qu'un rythme est un rythme.
Renseignez-vous sur le Dr Andrew Ng, qui propose des cours gratuits d'apprentissage automatique en ligne de l'université de Stanford (pas les longs cours vidéo, il s'agit en fait d'un cours à distance en ligne).
- Réponses précédentes
- Plus de réponses