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();
Outils personels