Jouer une musique
Introduction
Vous vous demandez peut-être, "mais quelle est la différence entre une musique et un son ?". Et bien, une musique est simplement un son plus long. Mais cela fait une énorme différence en programmation audio. La même différence qui fait que vous devez compresser vos musiques en MP3 ou en OGG. Comme nous l'avons vu dans le tutoriel précédent, les données sonores non compressées sont composées d'échantillons, qui sont (dans la SFML) des entiers signés de 16 bits. Prenez le taux d'échantillonnage standard pour une qualité CD (44100 échantillons par seconde), deux canaux, et vous finissez avec 50 Mo en mémoire pour pas plus de 5 minutes de musique.
En conséquence, les musiques ne peuvent pas être chargées en mémoire comme les sons. C'est pourquoi les musiques
ont leur propre classe dans la SFML : sf::Music
.
Utiliser sf::Music
Une musique n'est jamais chargée complétement en mémoire, à la place elle utilise un tampon dynamique
plus petit qui est mis à jour régulièrement avec les données sonores provenant du fichier (oui, c'est en fait
de la lecture en flux -- nous détaillerons ça dans le prochain tutoriel).
Le tampon interne est défini à une taille appropriée par défaut, mais vous pouvez la définir vous même si vous
le souhaitez (si votre musique a un taux d'échantillonnage très élevé, ou si vous avez très peu de mémoire à
votre disposition) avec le constructeur :
sf::Music Music1; // Par défaut, le tampon interne contiendra 44100 échantillons
sf::Music Music2(96000); // Le tampon interne contiendra 96000 échantillons
Pour ouvrir une musique à partir d'un fichier, vous pouvez utiliser la fonction OpenFromFile
:
if (!Music.OpenFromFile("music.ogg"))
{
// Erreur...
}
Ou, si le fichier est déjà chargé en mémoire :
if (!Music.OpenFromMemory(FilePtr, Size))
{
// Erreur...
}
N'oubliez pas de toujours vérifier la valeur retournée, qui sera false
si la musique n'a pas pu
être ouverte.
L'appel à OpenFromFile
ou OpenFromMemory
ne démarrera pas la musique, seul un appel à Play
le fera.
sf::Music
diffère de sf::Sound
dans son comportement, mais elle représente toujours un son.
Ainsi, elle définit les mêmes accesseurs que sf::Sound
et sf::SoundBuffer
rassemblés :
unsigned int SampleRate = Music.GetSampleRate();
unsigned int ChannelsCount = Music.GetChannelsCount();
sf::Music::Status Status = Music.GetStatus();
bool Loop = Music.GetLoop();
float Pitch = Music.GetPitch();
float Volume = Music.GetVolume();
float Duration = Music.GetDuration();
float Offset = Music.GetPlayingOffset();
Seul le tableau d'échantillons ne peut pas être lu, car celui-ci n'est jamais chargé complétement en mémoire (mais
vous pouvez toujours le charger avec un sf::SoundBuffer
si vous en avez vraiment besoin).
Enfin, vous pouvez toujours jouer / mettre en pause / stopper une musique :
Music.Play();
Music.Pause();
Music.Stop();
Conclusion
sf::Music
ne diffère pas beaucoup de sf::Sound
. La clé ici est de bien distinguer les sons
courts ponctuels (des bruits de pas, des tirs d'armes, ...) des sons plus longs (les musiques de fond), et d'utiliser
la classe appropriée dans chaque cas.
Dans le prochain tutoriel nous apprendrons à
utiliser les flux audio
pour jouer des sons provenant du réseau, de gros fichiers (ce que fait sf::Music
),
ou de n'importe quelle source qui ne peut pas être chargée complétement en mémoire.