Système audio dynamique à la Tetris Effect

J’ai récemment créé mon propre système d’audio dynamique utilisant Wwise pour un clone de Tetris. Pour cet exercice, j’ai créé les SFX et la musique que j’ai intégré moi-même à un clone du jeu, inspiré par le travail audio saisissant qui accompagne Tetris Effect.

Dans Tetris Effect, les actions du joueur sont habillées par des éléments musicaux de plusieurs types : coups de percussions/cymbales, notes aléatoires, progression de la musique d’ambiant vers un électro énergique, une panoplie de systèmes d’audio dynamique se croisent pour donner un résultat très intéressant ou le joueur semble communiquer avec la musique du jeu par les actions qu’il pose (rotation de pièce, hard drop, line clear, etc.)

rotation
hard drop
line clear

Inspiré par ce jeu, j’ai créé mon propre système d’audio interactif en mélangeant plusieurs approches d’audio dynamique, avec pour but de suivre la progression du joueur et le faire monter l’énergie audio de la partie à mesure que la difficulté augmente.

Concept

Pour le système musical que j’ai en tête, je souhaite faire en sorte que les actions importantes du joueur déclenchent des éléments musicaux qui iront se superposer à une musique de fond. Je cible les actions qui sont les plus importantes pour la progression du joueur et je fais les choix suivants :

  • La musique se déclinera en 5 sections, basées sur la quantité de lignes détruites par le joueur :
    • 0 à 5 lignes détruites : ambiance
    • 5 à 10 lignes : batterie, basse et synth lents
    • 10 à 15 lignes : batterie plus agitée et basse
    • 15 à 20 lignes : couplet
    • 20+ lignes : refrain
  • Un riser et un drop précèderont la transition vers la dernière section musicale lorsque le joueur aura atteint 20 lignes détruites
  • L’action du line clear (détruire une ligne) déclenchera un coup de cymbales
  • Faire tourner une pièce déclenchera un fragment de mélodie choisi au hasard
  • Le hard drop (faire tomber une pièce instantanément) déclenchera un fill de batterie

Segments musicaux

Je crée en premier lieu 5 sections de musique qui passent d’atmosphérique à électronique, ces sections fonctionnent particulièrement bien ensemble étant donné qu’elles partagent toutes le même nombre de battements par minute (bpm).

Je les importe dans Wwise comme Music Tracks d’un même Music Segment. Je transforme ensuite le segment en switch, ce qui permet d’associer chaque section de musique à son propre switch state. Le tout permet à Wwise de faire des transitions avec cross-fade d’une section à l’autre lorsqu’on changera de switch-state alors que la musique joue.

Je choisi ensuite une longueur du fade-in et fade-out qui serait appropriée et place le Music Segment dans un Music Playlist Container qui permet de faire des fonctionnalités d’audio dynamique de base comme d’indiquer que la musique doit jouer en boucle infinie jusqu’à ce qu’elle soit arrêtée.

Riser / Drop

Afin de créer un effet plus saisissant lorsque le joueur arrive à la section chorus de la musique (liée à la quantité de lignes de blocs qu’il a accompli depuis le début de la partie), je place un court segment de musique pour rehausser l’excitation sonore.

Étant donné que je veux avoir un riser et un drop, je dois séparer ces éléments en 2 segments distincts dans le but de faire en sorte que le riser remplace la musique de base et que le drop se superpose à la section chorus qui suit lorsque la musique redémarre.

J’importe les deux éléments et j’en fais des stinger, donc des actions sonores qui serviront à ponctuer la musique et qui pourront être déclenchés sur un temps fort ou à un changement de mesure par exemple.

Pour que le riser rende la musique en arrière-plan muette, je lui assigne un audio bus qui aura comme fonctionnalité de base de ducker (réduire le volume considérablement) la boucle de musique lorsqu’il est déclenché. Je fais en sorte qu’il soit uniquement déclenché au changement de mesure afin de garder son effet le plus musical possible.

Pour que le drop puisse se superposer à la section chorus de la musique, je le laisse simplement dans son bus normal.

Afin de déclencher ces 2 évènements lorsqu’on change de section, je crée un play event (ce que Unity utilisera pour déclencher les comportements voulus de Wwise) qui fait les 3 éléments suivants :

  1. Il déclenche la switch vers le chorus
  2. Il déclenche le riser qui prendra la place de la transition en cross fade habituelle vers le chorus
  3. Il déclenche, délayé 6 secondes plus tard, le drop qui arrivera au moment même ou le chorus se fera enfin entendre à la fin du riser.

Line clear : coups de cymbales

J’enregistre tout d’abord une variété de coups de cymbales différents afin de rendre l’audio dynamique moins prévisible. Je les importe toutes dans Wwise comme music tracks d’un même music segment.

Plutôt que d’assigner le music segment à une switch comme lors du traitement des sections musicales, je l’assigne à un random container. Le random container fait en sorte qu’à chaque fois qu’on lancera l’évènement il ira piger aléatoirement un de ses segments à jouer.

Je m’assure ensuite que le système audio interprète ce music segment comme un stinger qu’il jouera uniquement sur les temps fort de la musique.

Rotation : notes aléatoires

Afin que les notes aléatoires choisies soient consonantes avec la musique, je compose 10 petits motifs de 2 à 5 notes rapides qui sont dans une gamme appropriée. J’importe ces motifs dans Wwise et leur fait l’exact même traitement que les coups de cymbales : random container et stinger afin qu’ils soient pigés aléatoirement et jouent uniquement sur un temps fort de la musique.

Hard drop : drum fill

Même concept pour les fills de drums : je compose quelques courts motifs de percussions de 2 à 4 coups, je les importe dans Wwise (random container, stinger) et m’assure qu’ils ne sont déclenchés que sur un temps fort.

Intégration

  • les éléments de base à intégrer pour que Wwise fonctionne avec le projet Unity
  • l’intégration des lignes de code
  • idées extra-musicales (dropspeed)

L’idéal pour une intégration Wwise-Unity est d’utiliser le Wwise Launcher afin de créer directement le projet Wwise à l’intérieur du projet Unity pré-existant. Ensuite il faut faire en sorte de créer play event relié à tous les éléments qu’on veut déclencher pendant une partie (donc un play event pour la boucle de musique, un autre pour l’audio qu’on déclenchera lorsqu’on fait une rotation de pièce, etc.) Ensuite il faut générer la soundbank pour toutes les plateformes, et hop, on peut sauter dans Unity pour le reste.

À l’intérieur d’Unity il faut tout d’abord s’assurer de voir le Wwise Picker apparaître au bas de l’écran, on peut l’utiliser pour rafraîchir le projet et regénérer la soundbank.

Il faut ensuite s’assurer d’ajouter le script AkAudioListener (script généré par Wwise dans notre projet) à un gameobject qui ne sera pas détruit, typiquement la main camera. Il faut également ajouter le script AkBank à un gameobject et lui assigner le nom de notre banque générée.

On peut utiliser le script AkAmbient pour déclencher un évènement sonore comme la musique et choisir son trigger. Dans mon contexte j’ai fait en sorte que le script AkAmbient déclenche la boucle musicale on Start, donc lorsque le jeu démarre.

Finalement pour chaque évènement sonore qu’on veut lancer via script dans le jeu (rotation de pièce, hard drop, line clear…) on peut simplement utiliser la ligne de code suivante qu’on intègre dans la fonction appropriée :

AkSoundEngine.PostEvent(«EVENTNAME» , this.gameObject);

Dans lequel on remplace EVENTNAME par le nom de notre évènement, sensible à la case (donc par exemple Play_SFX_Rotate). Étant donné qu’il s’agit d’un string, les guillemets sont nécessaires.

Finalement j’ai aussi fait en sorte que le drop speed du jeu (rythme auquel les pièces descendent par elles-mêmes) corresponde au BPM de la musique afin de rendre le visuel plus rythmique. Celui-ci accélère d’ailleurs lorsqu’on arrive à la dernière section pour ajouter à l’énergie et à la difficulté de la partie.

C’est tout! C’était un exercice super intéressant qui m’a permis d’explorer plusieurs idées d’audio dynamique et de tester mes connaissances en intégration avec Unity et C#, et je trouve que le système rend très bien l’idée de base. Je vous suggère d’essayer Tetris Effect si vous voulez vraiment baigner dans le potentiel de ce genre de système, on peut le comprendre en écoutant un vidéo mais c’est beaucoup plus stimulant et interactif lorsqu’on est aux contrôles.

Le build du jeu est disponible sur itch.io si vous souhaitez l’essayer vous-même.


Posted

in

by

Tags: