Je peux t'aider un peu sur la méthode a la dure.
Mais je ne le ferais qu'a partir d'un WAV, à toi d'adapter à un MP3.
Dans un premier temps, il te faut charger le fichier et en extraire le son.
Ensuite, il faut retrouver le rythme et le quantifier.
Enfin, il faut éventuellement prendre en compte d'autres bandes de fréquence pour différents ennemis, items, etc.
1:Pour un fichier WAV PCM, l'en-tête est relativement simple, puis pour le son en lui même c'est un peu plus le bordel, mais ça reste abordable.
Exemple pour un fichier mono 8bits :
canal mono octet échantillon 1,
canal mono octet échantillon 2,
canal mono octet échantillon 3,
canal mono octet échantillon 4,
etc.Exemple pour un fichier stéréo 16bits :
canal gauche octet poids faible échantillon 1,
canal gauche octet poids fort échantillon 1,
canal droit octet poids faible échantillon 1,
canal droit octet poids fort échantillon 1,
canal gauche octet poids faible échantillon 2,
canal gauche octet poids fort échantillon 2,
canal droit octet poids faible échantillon 2,
canal droit octet poids fort échantillon 2,
etc.(Plus d'infos ici =>
http://fr.wikipedia.org/wiki/WAVEform_audio_format)Bref, problème 1 résolu sous GM pour le WAV PCM.
2:Le rythme, c'est la répétition d'un son. Généralement, ce sont les basses fréquences.
Il faudrait, en théorie, un système plus complexe, mais celui là devrait fonctionner sur quelques musiques (faut faire des tests).
Il faut virer les hautes fréquences (les aigües) pour n'avoir que les basses fréquences (le rythme) et donc savoir quand créer des ennemis ou modifier tel ou tel truc.
Pour faire un filtre passe bas, plein de solutions existent. Mais le plus simple, c'est une moyenne.
Explication vite fait, si on prends ces valeurs représentant le volume de la musique :
444444888888444444
Et qu'on fait une moyenne entre un terme et le suivant, on obtient :
44444688888644444
Premier truc qui saute aux yeux, on à perdu une valeur.
Deuxième chose, y a pas grand chose qui à changé. Prenons maintenant :
626264979798626264
On obtient :
44445788887744444
Il est déjà plus flagrant que ça change quelque chose.
Donc, en faisant un filtrage plus 'fort' (plus de termes) on verra plus les basses fréquences, et donc, le rythme que l'on essaye de trouver.
en gros, on se retrouve avec un truc du genre :
- Code:
-
for(i=0; i<taille_musique-1; i+=1)
{
Rythme[i] = (Musique[i] + Musique[i+1]) / 2;
}
3:Je dois aller manger, je reviens tout à l'heure, mais un un mot, filtre passe haut, ou mieux, FFT.
EDIt : suite.
Donc, pour d'autres évènements (bonus, obstacles, ou que sais-je), il serait préférable de pouvoir se baser aussi sur les aigües ou autres fréquences.
Pour la dynamique, le filtre est simple, c'est la valeur absolue de la valeur actuelle moins la suivante.
Explication vite fait, si on prends ces valeurs :
444444888888444444
Et qu'on applique le filtre, on obtient :
00000400000400000
On voit clairement le changement de volume.
Prenons maintenant :
626264979798626264
On obtient :
44442522221244442
On voit que le changement est fort au début puis plus faible, puis de nouveau fort.
En gros, c'est du type :
- Code:
-
for(i=0; i<taille_musique-1; i+=1)
{
Rythme[i] = abs(Musique[i] - Musique[i+1]);
}
Pour aller plus loin, il faudra analyser plus finement la musique, mais je doute que tu puisse faire ça rapidement sous GM.
Il te faudrait notamment effectuer une analyse fréquentielle (FFT) de ta musique pour déterminer de façon plus fiable les changements dans la musique, les rythmes (qui ne sont pas forcément des basses) et les passages clefs (changement radical de spectre audio, fréquences de la voix présentes/absentes, etc.).
A un niveau plus abordable, tu pourrait remplacer le filtre passe bas (du 2) par un filtre plus sélectif, ne demandant pas beaucoup plus de calcul mais était bien plus performant.
Je te laisse te renseigner, et je te souhaite bon courage pour mettre tout cela en application !