Auteur Sujet: Beat detection, FFT et comb filter ?  (Lu 2960 fois)

0 Membres et 1 Invité sur ce sujet

Hello
une éternité que je ne suis pas venu dans ce coin paradisiaque du coder :)

Je me demandais si vous auriez des tuyaux quand à l'implémentation d'un algo de beat detection performant (comprendre qui marche bien avec un maximum de type de musiques).

J'ai trouvé cet article très intéressant (http://archive.gamedev.net/archive/reference/programming/features/beatdetection/index.html sur 2 pages) qui se termine par des références disparues.

J'essaie de faire ca en C# alors si vous connaissez déjà des bibliothèques, un gros merci d'avance !!

A+
WS

Que connais-tu de ton signal d'entrée exactement ? Parce que bon y'a des musiques sans beat.
Tu veux connaître le beat principal (boum-boum) ou le tempo suffirait ?

Fréquences ou BPM?

Ou comme ponce la dit: pumtchak ou un chiffre

Que connais-tu de ton signal d'entrée exactement ? Parce que bon y'a des musiques sans beat.
Tu veux connaître le beat principal (boum-boum) ou le tempo suffirait ?


Mon signal d'entrée est une piste audio (.wav, .mp3) mais dont je ne maîtrise pas la nature (c'est à destination de n'importe qui et donc n'importe quelle piste pourrait être fournie en entrée).

Pour les musiques sans beat, je range cela dans les exceptions ;) (mais je suis d'accord)

Ce que je voudrais connaître : les piques d'énergie ou ce que l'oreille assimile à des "beat".

En gros, pour des échantillons de 1024 samples, est-ce qu'il y a un pique ? (donc pas un nombre mais une coordonnée temporelle pour un signal : beat à 1.02s, à 1.045s etc...)

Note : l'analyse ne se fait pas en temps réel :)

Bon ben je tente une solution mais je suis sur de rien.

Tu sépare ton signal en N bandes (N <= 8 ), pourquoi pas une petite FFT en effet mais bon la FFT ca fait des bandes de même largeur, tu devrais plutôt faire des filtres IIR des familles.

Pour chaque bande :
 - il te faut l'enveloppe de volume filtrée, en gros tu peux simplement prendre le carré et faire un passe-bas vers 30hz.
 - puis tu détecte les pics positifs de cette enveloppe ( x[n-1] > x[n] && x[n] > x[n+1]).
 
Après il faudrait une pondération maligne, la bande qui a des gros pics, qui correspondent bien aux anciens tempo instantanés, et sont souvent synchrones avec les autres bandes peut te servir de "beat".

EDIT: les algos de pitch detection ont des systèmes de vote élaborés qui fonctionnent sans seuils




Renseigne toi aussi sur les "gates", qui permettent de "gater" ou de "ducker", c'est à dire ne pas prendre ce qu'il y a "en dessous" ou "au dessus" d'un certain threshold (volume limite)

Tout dépendra des effets que tu voudras faire. Si tu veux juste qu'un effet réponde à une certaine fréquence ou si tu veux carrément synchroniser le départ d'une vue/scene sur un basedrum.

Dans ton cas, tu mélanges la percussion avec le beat... tu pourras t'y perdre si tu cherches des informations sur le net car "beat" est aussi une notion de temps en théorie musicale. Par exemple, dans une mesure en 4/4, cela veut dire qu'il y a 4 beats en utilisant des quarters avec un accent sur le premier beat.

Bref, en te lisant j'ai l'impression que la piste la plus probable est du côté de l'analyse des fréquences pour déceler les éventuels présences de percussions dans une musique.

Huh, en théorie musicale 4/4 veut juste dire que la mesure est divisée en 4 temps et que l'unité de temps est la noire... Cette histoire d'accent obligatoire sur le premier temps de chaque mesure, j'ai beau fouiller dans ma mémoire (10 ans de solfège + violon), je trouve pas...
Peut être que ça s'applique pas a la musique classique ?

Je tiens à préciser que je pinaille pour le plaisir et que ma contribution est loin d'être pertinente par rapport au sujet (mais vraie quand même enfin il me semble)...
Bref je sors tout de suite... ;)

L'accent est important pour les batteurs surtout je pense. Il aide aussi a se repérer sur des temps composés en orchestre, mais là je "crois". J'ai appris la théorie musicale et des signature de temps sur tous les sites que j'ai pu trouver à l'époque ainsi que dans quelques livres... je ne sais pas si il y a une approche différente selon les pays, beaucoup des leçons que j'ai suivi étaient en anglais.

Aussi, tu noteras qu'il existe des façons d'apprendre la théorie de la signature du temps en utilisant des croches, il n'est pas rare de trouver des leçons où on te fait compter les demi temps. Encore une fois, peut-être pour les batteurs... pour le hat? Je dis peut-être des bétises.

Dans tous les cas, on peut en effet résumer par 4 temps dont l'unité est la noire, en oubliant l'accent. Le /8 veut donc dire que l'unité de temps est la croche mais j'ai surtout croisé des 3/8, 12/8 et des 7/8.
Ces mesures ne sont interessantes à apprendre que pour lire des partitions ou comprendre comment certains (poly)rythmes sont conçus mais avec un logiciel, cela peut-être appris de manière plus élégante.

Cette exemple par exemple est assez intéressant: http://en.wikipedia.org/wiki/Buler%C3%ADas (j'aime beaucoup les "horloges" utilisés sur les articles wikipedia pour compter le temps)


ps: en tout bien tout honneur, je n'ai pas fait 10 ans de violon mais 2 de guitare classique, théorie et chant. Mais j'ai tout de même 14 ans de tracking dans les yeux.

Désolé d'avoir mis en avant mes 10 ans de solfège, c'était juste pour pinailler. Et je n'ai pas pratiqué de musique sérieusement depuis... 17 ans ! Bref je sais toujours lire une partition mais ma contribution a ce post n'était pas très intéressante :)

Ca fera juste une petite leçon pour les coders qui ont pas appris la musique :)

Je sais pas si le sujet c'est de detecter le BPM ou de detecter les beats eux même. Si le but est de detecter les hits eux-même, alors il faut faire attention au fait que toute méthode a base de FFT sera forcement pas hyper précise en résolution temporelle car le spectre parle pour une certaine fenêtre