begin process at 2012 05 27 13:50:42
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > BEAT DETECTION

BEAT DETECTION


 Information sur la source

Note :
Aucune note
Catégorie :Maths & Algorithmes Classé sous :Beat detection, Algo, FMOD, SFML, BPM Niveau :Initié Date de création :31/08/2011 Date de mise à jour :02/09/2011 09:05:42 Vu / téléchargé :2 913 / 123

Auteur : barsichou

Ecrire un message privé
Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Bonjour,
Ce programme pour Windows qui utilise FMOD permet de détecter le tempo d'une musique en MP3, et aussi de construire une "beat line" (un tableau de la taille de la musique qui contient quelque chose quand il y a un beat et 0 ailleurs). Il y a une interface graphique SFML dont je me suis servi pour débugger.

Pour calculer le tempo, je me suis inspiré en partie de ça:
http://www.flipcode.com/misc/BeatDetectionAlgo rithms.pdf

En gros l'algo c'est:
On calcul à tout moment (tous les 1024 samples) l'énergie du signal. L'énergie étant la somme des échantillons au carré. (Pour une fréquence d'échantillonnage de 44100 Hertz ou Samples/seconde, 1024 samples c'est 1/43 eme de seconde et c'est quasi instantané pour l'oreille.
(La courbe verte dans l'interface)
On calcul ensuite l'énergie moyenne sur une seconde entourant chaque instant.
(La courbe bleu dans l'interface)
A chaque fois que l'énergie instantanée dépasse d'une constante * l'énergie moyenne, on a un beat probable. La constante est environ 1,3. Si la musique est bruyante ça sera un peu moins, Elle peut être variable et calculée à tout moment automatiquement  avec un calcul de variance mais je ne l'ai pas fais ici.
(Les rectangles blancs dans l'interface)
Après on comptabilise les espaces de temps entre tous ces beats probables et celui qui revient le plus souvent nous donne le tempo.
Ensuite on peut faire une convolution avec un train d'impulsion de quelques secondes et de la même fréquence que le tempo trouvé, Ça permet de rester « sur les rails » quand il y a des pauses par exemple.
(La courbe jaune dans l'interface)
Les pics de la convolution qui surviennent à peu près au bon tempo nous donne la Beat line
(Les traits verts foncé dans l'interface)

librairies: FMOD EX, SFML 1,6

Pour le lancer, faire un glisser-déposer d'un fichier .mp3 directement sur le .exe
Pour man½uvrer dans l'interface, les instructions sont affichées à l'exécution.


 Conclusion

voici une vidéo de ce que ca donne:
http://www.youtube.com/watch?v=jZoQ1S73Bac
La baballe qui saute c'est juste pour le fun.
Évidement je n'ai mis que des exemples qui marchent mais c'est loin d'être toujours le cas. Mais pour tout ce qui est musique énergique avec des beats réguliers, ça passe.
Si le tempo trouvé est trop rapide, il suffit des fois d'augmenter un peu la constante K_ENERGIE_RATIO, et de la baisser si c'est trop lent.
Pour que ça marche plus souvent, on peut faire plein de truc, notamment découper en plages de fréquences mais ça complexifie pas mal. A voir pour la suite.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

02 septembre 2011 08:55:15 :
ajout d'un fichier exécutable au zip. Nécéssite fmodex.dll pour fonctionner.
02 septembre 2011 09:05:42 :
ajout d'un fichier exécutable au zip. Renommer le .ex_ en .exe. Nécéssite fmodex.dll pour fonctionner.

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

 Sources en rapport avec celle ci

Source avec une capture [C++] & SFML CRYPTOGRAPHIE par pop70
Source avec Zip Source avec une capture JEUX DU MORPION EN CONSOLE par thebroyeur
Source avec Zip Source avec une capture SPEAD RACER par jngl
ALGO RÉSOLUTION DE SUDOKU. par mamsk00
Source avec Zip Source avec une capture LECTEUR DE MUSIQUE AVEC SDL ET FMOD par Lemng

Commentaires et avis

Commentaire de CptPingu le 02/09/2011 11:52:30 administrateur CS

Très bonne source. Enfin quelque chose d'originale !

J'ai quelque remarques à faire sur le code. Je vais lancer pas mal de critiques, mais il ne faut pas en déduire que ton application est mauvaise, bien au contraire, elle est très bien.

- C'est une application C++ quasiment codé comme une application C. C'est dommage.
- Évite les "using namespace", voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
- Pour faire des listes ou des tableaux, évite de faire du "double*" un std::vector<double>, std::list<double> voir un std::array<double, int> aurait été préférable.
- cast non nécessaire. Si tu as un float, et que tu veux le faire rentrer dans un int, pas besoin de cast. C'est déjà valable.
- C cast à éviter. En C++ tu as: reinterpret_cast, static_cast et dynamic_cast qui sont à préférer. Ils ont tous les trois des comportements précis qui te permettent de bien choisir le cast à effectuer (différents type de sécurité).
- Une fonction qui ne prend pas d'argument, s'écrit "void function()" et non "void function(void)". Mettre void en argument est un ancien reliquat du C (ne pas mettre d'argument en C veut dire: infinité d'arguments, d'où le void pour empêcher cela), qui n'est plus nécessaire en C++.
- Plutôt que des "#define", préfère un static const qui revient strictement au même, sauf que tu as une protection de type que tu n'as pas avec une macro.
#define K_ENERGIE_RATIO 1.3 => static const float K_ENERGIE_RATIO = 1.3;
- En C++, on évite NULL, au profit de 0, voir: http://0217021.free.fr/portfolio/axel.berardino/articles/null-en-cpp
- Quand tu travailles avec des booléens, utilise les comme tels. Ex: if (ctrl_pressed==true) => if (ctrl_pressed) et if (ctrl_pressed==false) => if (!ctrl_pressed)
- BeatDetector* beatdec = new BeatDetector(snd_mng); => Qui le delete à la fin ? Fuite de mémoire ?
D'ailleurs pourquoi faire un new ? Tu pourrais très bien écrire: BeatDetector beatdec(snd_mng); et passer l'adresse de beatdec.
Quand tu as le choix, préfère toujours utiliser un objet directement plutôt que de faire un new.
- Même remarque pour SoundManager. Je ne vois pas delete. Tu devrais avoir:
SoundManager snd_mng;
snd_mng.load_song(argv[1]); // load song in arguments
snd_mng.play();
snd_mng.pause();
// Create BeatDetector
BeatDetector beatdec(&snd_mng);
beatdec.audio_process(); // launch beats detection

- Plutôt que de passer par pointeur, passe par référence dès que tu le peux !
Tu devrais avoir: BeatDetector::BeatDetector(SoundManager& snd_mgr), voir "const SoundManager& snd_mgr", si le SoundManager n'a pas vocation à être modifié.

- new SoundManager() => Attention ! On fait "new SoundManager;" et non "new SoundManager();"
"new SoundManager;" veut dire: Allouer.
"new SoundManager();" veut dire: Créer une fonction SoundManager() qui retourne un objet de type SoundManager puis l'allouer.

En revanche, faire un "new Objet(argument)", veut bien dire: Allouer. Il y a une exception uniquement avec "()". C'est une subtilité du C++ pas terrible :(.

- Un header C++ prend l'extension .hh ou .hpp, et non .h qui est reservé au C.
- Les commentaires sont un peu moyens. Voir: http://0217021.free.fr/portfolio/axel.berardino/articles/ecrire-de-bons-commentaires

Commentaire de barsichou le 02/09/2011 16:28:37

Salut,
Merci pour toutes ces critiques. Rassure toi, c'est ce que j'attendais. Je fais un peu de C pour le boulot depuis 4 ans.
Là j'expérimente le C++ chez moi avec des mauvais réflexes en plus des lacunes.
Je prendrais en compte tes remarques la semaine prochaine.
Bon week end.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

algo des [ par fredson ] je recherche le programme pour trouver divers clés de décryptage avec l'algo des(cryptage) une aide pour écrire un algo et un prog sur le nbr premiers [ par Julius Caesar ] Bonjour, je n'arrive pas écrire l'algo et le prog de ce sujet:"Ecrivez un algo et un prog, qui affiche les nbrs premiers inferieurs à un entier n (ave je suis desespere, algo d'incrementation de tableau [ par scorpiwolf ] Je deviens fou, je suis en train de faire la division euclidienne avec des nombres immenses, ils sont stockés dans des tableaux. Bon bref le probleme Algo minimax, negamax [ par Galett ] Salut, je m'fai un ti prog en ce moment, mais G des probs avec mon algo minimax, G tester le negamax aussi et ca change po.Je recherche en fait un alg Aidez moi !!!! [ par sebastienbro ] Voilà, g une fonction créé en C++ avec VC++. Elle marche très bien si elle est mis dans un EXE, mais dès k'elle est ds une DLL, ca marche plus !!Avec Algo de Cryptage [ par LordBob ] Salut a tous, je voudrai simplement avoir kelke info pour créé un algorithme de cryptage, savoir comment ca ce passe, ce kil fo faire un peu tout ko j'aimerais connaitre le principe de l'algo de rar [ par Odinlemage ] Bonjour à tous...Voila mon probleme est que j'aimerais connatire le principe algorithmique de la compression rarJ'ai eut beau cherché j'ai rien trouvé probleme de getch() et d'algo de curseur [ par kobee12 ] J'utilise comme compilateur dev-c++.Lorsque je fais un getch(), je suis oblige de taper enter apres alors que j'aimerais juste taper une touche et qu' inverser une matrice non carrée [ par civata ] est ce que quelqu'un peut me dire comment on inverse une matrice non carrée ?ou plutot où je pourrais trouver un algo qui le fait, pour les matrices c algo JPG->BMP [ par MoDDiB ] Il n'y aurais pas un site qu'y explikerait l'algo pour transformer un jpg en bmp?? ca sré sympataoche de me dire ou ^^merci !(les sources du concours


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,499 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales