Sites


Blender pour le jeu video

Ajouter du son

représentation de divers périphérique audio en icones symbolique pour illustrer l'en-tête du chapitre

À côté de l'aspect visuel, un jeu vidéo (ou une application interactive) a souvent besoin d'un univers sonore pour être complet. Nous allons voir dans ce chapitre comment ajouter du son et de la musique dans notre univers visuel.

Les formats audios

Considérons deux cas de figures concernant les sons dans un jeu, les sons d'ambiance et les sons générés par des actions. Pour les sons courts, les petits bruitages, nous choisirons des fichiers au format .wav ou .aif, non compressés, qui seront plus rapides à lancer pour le Game Engine et assureront une bonne synchronisation avec les interactions. Par contre, si les fichiers sont plus gros (par exemple des musiques d'ambiance), nous pourrons prendre un autre format compressé (.ogg ou .mp3) pour éviter d'alourdir le .blend. Concernant le fichier, les formats supportées par le BGE sont wav, mp3, ogg, aif et flac.

Logic brick

Il est très simple de jouer un son via les briques logiques, pour réagir à un événement du jeu. Pour lancer des sons via les Logic brick, nous devons utiliser l'actuator Sound. Dans cet actuator, nous avons donc le fichier à lire, le mode de lecture, le volume du son, qui varie de 0 à 2 et le Pitch qui sert à modifier la fréquence du son.

Les modes de lecture

Selon les cas, il peut être intéressant de jouer un son de différentes manières : une seule fois si le personnage se cogne contre un mur, plusieurs fois en boucle tant qu'il marche sur un sol bruyant, une seule fois sauf si on l'arrête, etc.

Jouer le son en entier

En utilisant Play End à la première impulsion, le son se lance et se joue complètement. En cas de seconde impulsion pendant que le son est encore en train de se jouer, il recommencera à 0. Cela correspond bien pour des sons d’événements comme les chocs ou les actions du personnage.

Jouer le son en entier, sauf si on l'arrête

En mode Play Stop, tant que l'entrée de la brique est active, le son est joué. Mais dès que l'entrée n'est plus active, le son s'arrête. En cas d'arrêt (fin du son ou entrée inactive), le prochain lancement se fera au début du son. Attention toutefois, même si l'entrée reste active, le son ne se relancera pas de lui-même à la fin de sa lecture.

Jouer le son en boucle, pour toujours

Avec Loop End, le son joue complètement et va se relancer en boucle après une impulsion. En cas de seconde impulsion, le son recommence à 0. Cette approche est parfaite pour une musique d'ambiance.

Jouer le son en boucle, sauf si on l'arrête

En mode Loop Stop, c'est le même principe que le Play Stop sauf que le son se jouera en boucle tant que l'entrée n'est pas relâchée. Idéal pour des sons fonctionnels ou de processus, comme des bruits de machine et moteur, de l'eau qui coule, etc.

Jouer le son dans les deux sens

Le Loop Bidirectional joue le son du début jusqu'à la fin et si l'entrée est encore active à la fin du son, celui ci est alors joué à l'envers.

Jouer le son dans les deux sens, sauf si on l'arrête

Le Loop Bidirectional Stop joue le son tant que l'entrée est active mais s’arrête dès lors que l'entrée est inactive. Et comme le Loop Bidirectional, si l'entrée est active jusqu'à la fin du son, alors celui-ci se joue à l'envers, jusqu’à ce que l'entrée logique soit mise à Faux.

Effet 3D

Représentation abstraite du son 3D : un cube entouré d'icones plates d'enceintes audios

Ajouter un peu de profondeur et d'espace aux sons permet de créer une meilleure immersion dans le jeu. Par exemple si un ennemi se trouve loin du personnage, on l'entendra à peine ; mais s'il surgit juste derrière le personnage, le son sera très fort !

Nous devons en premier changer le type du Listenerde la scène (dans l'ongletScene > Audio > Listener), choisir la valeur Linear Clamped (le modèle de distance pour le calcul des atténuations). Occupons nous de la brique logique Sound : cochons la case 3D Sound. Les valeurs de Reference Distance (distance de référence), Maximum Dist (distance maximale) et Rolloff sont les paramètres définissant la diffusion du son.

À partir de la distance de référence, le son commence à diminuer. La distance maximale est la distance à laquelle on pourra entendre le son. Le Rolloff est le paramètre de la courbe d’atténuation du son. Avec la valeur 1 la diminution du son est linéaire suivant la distance entre la distance de référence et la distance maximum. Pour ceux que ça intéresse, l'audio est gérée par OpenAL et selon la documentation de la bibliothèque, on a :

distance = max(distance, AL_REFERENCE_DISTANCE)
distance = min(distance, AL_MAX_DISTANCE)
gain = (1 – AL_ROLLOFF_FACTOR * (distance –
            AL_REFERENCE_DISTANCE) /
             (AL_MAX_DISTANCE – AL_REFERENCE_DISTANCE))

Ce graphique présente la diffusion du son pour des valeurs données.

Avec une valeur de 200 pour le Rolloff nous avons à peu près une valeur de 2000 pour le Maximum Distance, ce qui correspond +-10 Unités Blender (donc si nous passons le Maximum Distance à 4000, le son sera entendu jusqu'à 20 Unités Blender, etc.). Par contre, cela ne marche plus très bien avec des valeurs trop petites (< 1).

On peut aussi jouer avec le Reference Distance pour définir quand effectuer l'effet d'atténuation du son.

Pour conclure, dans une scène on change Scene > Audio > Listener en mode Linear Clamped

On place un cube avec l'actuator sound :

  • Maximum Distance= 2000 (donc une décroissance sur 10 Blender Units !)
  • Rolloff = 200
  • Reference Distance = 20

Voilà ce qui se passera :

  • à 1Blender Unit: on entendra normalement le son (100%)
  • à 10 Blender Units : on entendra normalement le son (100%)
  • à 15 Blender Units : on entendra normalement le son (100%)
  • à 20 Blender Units : on entendra normalement le son (100%)
  • à 23 Blender Units : on entendra le son un peu moins fort...
  • à 28 Blender Units : on entendra le son très bas...
  • à 30 Blender Unites : on n'entendra pratiquement plus le son.

Scrypthon !

Concernant la gestion du son, le Python amène vraiment une nouvelle palette de fonctionnalités pour traiter les sons. Cette fois, nous utilisons un autre module Python : aud. Pour ajouter du son lors d'une collision entre deux objets, nous utilisons la configuration suivante.

Rappelons que nous avons choisi la méthode Module et non pas la méthode Script du contrôleur pour appler le script son.py suivant.

import aud
from os import chdir
from bge import logic

# on n'oublie pas de se placer dans le bon repertoire
chdir(logic.expandPath("//"))
device = aud.device()

def play1():
     factory = aud.Factory('music1.mp3')
     factory = factory.limit(0.0, 5.0)
     handle = device.play(factory)

def play2():
     factory = aud.Factory('music1.mp3')
     factory = factory.fadein(0.0, 5.0)
     factory = factory.fadeout(7.0, 9.0)
     handle = device.play(factory)

def splitch():
     factory = aud.Factory('splitch.mp3')
     factory = factory.limit(0.0, 5.0)
     handle = device.play(factory)
     handle.loop_count = 2

Les trois premières lignes nous permettent d'importer nos modules et les trois suivantes servent à bien définir le répertoire courant (voir le chapitre Bien préparer son projet).

Nous commençons par créer une variable device qui nous permettra d'agir sur la carte son. Ensuite nous déclarons trois fonctions, play1, play2 et splitch. Dans la capture d'écran nous demandons à Blender d'utiliser la fonction play1, mais nous pourrions très bien utiliser les autres fonctions à d'autre moment dans notre projet. Les trois fonctions commencent par la création d'une aud.Factory, un lien vers un fichier son que l'on va pouvoir configurer, avant de le jouer grâce à la méthode play() de notre device.

Regardons donc cette fonction play1. Une fois la Factory créée, nous allons utiliser sa méthode limit() pour sélectionner uniquement une plage de temps du fichier son. La fonction limit() prend deux paramètres float : start et end, qui définissent en secondes le début et la fin de notre sélection. Une fois que l'on a configuré ce que l'on veut, on demande à notre device (qui, rappelez-vous est un lien vers la carte son) : ici la carte son va jouer les 5 premières secondes de notre fichier audio.

Dans la fonction play2(), nous souhaiterions aller plus loin en ajoutant des fondus, pour rendre plus fluides le début et la fin de la lecture. Une fois la Factory créée, nous allons la configurer en appelant successivement deux fonctions (lignes 2 et 3 de play2()) : fadein() pour un fondu en ouverture, puis fadeout() pour un fondu en fermeture. On peut en effet mettre en place plusieurs effets en enchaînant les appels à des fonctions de configuration. Il ne nous reste qu'à jouer le son avec device.play().

Terminons maintenant avec la fonction splitch(). Vous aurez remarqué que lorsque nous utilisions la méthode play(), nous récupérions un handle. Voyons comment en tirer profit. On peut par exemple modifier son attribut loop_count, qui permet de jouer plusieurs fois le son. Ici nous avons donné 1 comme valeur, il sera donc joué 1 fois à la 4e ligne de la fonction.

Petite précision intéressante, si vous donnez une valeur négative à loop_count, votre son se répétera continuellement. Le handle que vous renvoie la fonction play() permet d'agir sur la lecture du son une fois celle-ci en cours. Vous pouvez par exemple la mettre en pause (avec la fonction pause() ), la reprendre (avec la fonction resume() ) ou arrêter définitivement la lecture (avec la fonction stop() ). Concernant la fonction stop(), elle arrête bien totalement la lecture. On ne peut la reprendre qu'en relançant la fonction play() de notre périphérique.

Il y a une erreur de communication avec le serveur Booktype. Nous ne savons pas actuellement où est le problème.

Vous devriez rafraîchir la page.