La gestion de la musique et des sons avec Allegro
Un article de Mangue.org, l'encyclopéde libre.
Quelqu'un a-t-il déjà imaginé Half-Life sans tous les petits bruits qui parcourent les méandres de Black Mesa ? Doom sans le bruit caractéristique du fusil de chasse ? Non ? C'est normal. Dans un jeu, la partie sonore bâti bien souvent 50% de l'ambiance générale. C'est pourquoi il serait inconcevable de programmer nos petits jeux sans utiliser de musique.
| Sommaire |
Initialisation
L'initialisation se fait pratiquement toute seule, il suffit d'appeller la fonction suivante :
install_sound(DIGI_AUTODETECT, MIDI_AUTODETECT, "pong");
Sachez que le troisiéme (et donc derniers) paramètre de la fonction n'est uniquement présent pour la compatibilité avec les anciennes versions d'Allegro, et donc qu'il ne sert plus à rien.
Utiliser le format MIDI
En premier lieu, et comme pour toutes les interfaces de la librairie, il nous faut déclarer un pointeur vers le fichier MIDI que l'on souhaite utiliser. Pour cela nous ferons :
MIDI* pointeurmidi; pointeurmidi=load_midi("monmidi.mid"); //Libére la mémoire utilisée par le midi destroy_midi(pointeurmidi);
Ensuite, Allegro propose quelques fonctions pour gérer ce MIDI :
//Joue un MIDI //Le premier paramètre est un pointeur vers un MIDI //Le second paramètre est à 1 si on joue le fichier en boucle, à 0 sinon play_midi(MIDI *midi, int loop); //Arrête le fichier MIDI actuellement joué stop_midi(); //Met le fichier MIDI joué en pause midi_pause(); //Reprend la lecture du MIDI après une pause midi_resume();
Les fichiers son
Allegro propose bon nombre de fonctions pour gérer les fichiers sons (WAVE et VOC), dont un certain nombre de fonctions avancées. Nous n'allons détailler ici que les fonctions usuelles de la librairie, les autres fonctions étant de toutes maniéres explicitées dans la doc.
Tout comme pour les fichiers MIDI, il nous faut déclarer un pointeur vers le fichier à jouer, ainsi :
SAMPLE* monson; monson=load_sample("monwav.wav"); //Libére la mémoire utilisée par le son destroy_sample(monson);
Voilà maintenant les fonctions à employer pour utiliser les sons :
//Joue un son passé en premier paramètre //Le second paramètre est le volume compris entre 0 et 255 //Le troisiéme paramètre est la balance comprise entre 0 et 255 (0=gauche, 255=droite) //Le quatriéme paramètre est la fréquence (la fréquence de l'enregistrement du son est 1000) //Le dernier paramétre est à 1 si on joue le fichier en boucle, à 0 sinon play_sample(const SAMPLE *spl, int vol, int pan, int freq, int loop); //Arrête la lecture du son passé en paramètre stop_sample(const SAMPLE *spl);
Un exemple complet
#include <allegro.h> BITMAP* buffer; MIDI* monmidi; SAMPLE* monwav; bool quitmidi=false; bool quitwav=false; bool pause=false; void vider_clavier() { for(int i=0;i<128;i++) key[i]=false; } int main() { //Initialisations install_allegro(SYSTEM_AUTODETECT,&errno,atexit); install_keyboard(); text_mode(-1); set_color_depth(16); if(set_gfx_mode(GFX_AUTODETECT, 640, 480, 0, 0)<0) { set_gfx_mode(GFX_TEXT, 0, 0, 0, 0); allegro_message("This program can not be initialized\n"); exit(1); } //Initialise le son install_sound(DIGI_AUTODETECT,MIDI_AUTODETECT,"pong"); //Crée le bitmap buffer=create_bitmap(640,480); //Charge le MIDI monmidi=load_midi("starwars.mid"); //Charge le WAV monwav=load_sample("applause.wav"); //Joue le fichier MIDI en boucle play_midi(monmidi,1); //Exécute la boucle tant que la variable est à FALSE while(!quitmidi) { //Efface le bitmap 'buffer' clear_bitmap(buffer); //Affiche le titre et les explications textout(buffer,font,"Musique - starwars est joue en boucle",10,10,makecol(255,255,255)); textout(buffer,font,"Appuyez sur P pour mettre en PAUSE, sur S pour arreter",10,40,makecol(255,255,255)); //Détecte l'appuie sur la touche S if(key[KEY_S]) { //Met à TRUE la variable permettant de quitter la boucle while quitmidi=true; //Arrête la lecture du MIDI stop_midi(); } //Détecte l'appuie sur la touche P if(key[KEY_P]) { //Si la lecture est en pause... if(pause) { //Reprend la lecture du MIDI midi_resume(); pause=false; } else { //Pause la lecture du MIDI midi_pause(); pause=true; } } //Vide le tableau key[] vider_clavier(); //Affiche le bitmap 'buffer' sur l'écran blit(buffer,screen,0,0,0,0,640,480); } //Vide le tableau key[] vider_clavier(); //Joue le WAV en boucle play_sample(monwav,255,128,1000,1); //Exécute la boucle tant que la variable est à FALSE while(!quitwav) { //Efface le bitmap 'buffer' clear_bitmap(buffer); //Affiche le titre et les explications textout(buffer,font,"Son - les applaudissements sont joues en boucle",10,10,makecol(255,255,255)); textout(buffer,font,"Appuyez sur S pour arreter",10,40,makecol(255,255,255)); //Détecte l'appuie sur la touche S if(key[KEY_S]) { //Met à TRUE la variable permettant de quitter la boucle while quitwav=true; //Arrête la lecture du WAV stop_sample(monwav); } //Vide le tableau key[] vider_clavier(); //Affiche le bitmap 'buffer' sur l'écran blit(buffer,screen,0,0,0,0,640,480); } //Libére les ressources destroy_midi(monmidi); destroy_sample(monwav); return 0; } END_OF_MAIN();

