Formats de musique dans les jeux. Analyse des formats : le son dans certains jeux sur Unreal Engine

Nous parlerons d'une bibliothèque de logiciels pour travailler avec le son, connue sous le nom de FMOD. Le développeur de ce produit logiciel est Firelight Technologies Pty, Ltd. Au moment de la rédaction de cet article, la dernière version de FMOD était la version 3.74. L'état actuel des choses et les nouvelles versions, si elles sont apparues, peuvent être consultées sur le site www.FMOD.org. Sur le même site, vous pouvez obtenir des versions FMOD pour différents systèmes d'exploitation. Des liens directs vers la distribution FMOD se trouvent

La bibliothèque de fonctions FMOD est une implémentation de haut niveau de l'API, qui comprend un large éventail de fonctions permettant de travailler avec des fichiers audio de différents formats, de traiter des données audio et de lire de l'audio via le système audio d'un ordinateur ou d'une console de jeux. Pour parler de toutes les capacités de cette API, il faudra plus d'une douzaine de pages Web. De plus, notre sujet principal est le développement de jeux sonores, pour lesquels le principal intérêt réside dans les fonctions permettant de travailler avec le son surround (3D). Nous nous limiterons à introduire ces fonctions. Il convient de garder à l'esprit que cette publication n'est pas un guide complet de FMOD. Par conséquent, lors de l'analyse des exemples ci-dessous, vous ne devez pas négliger la documentation officielle. Tous les exemples de l'article sont écrits dans le langage de programmation C.

Pour créer des sources sonores 3D et calculer une image sonore tridimensionnelle, FMOD (version pour Windows) utilise l'un des systèmes audio suivants comme base : WMM (Windows Multimedia), DirectSound3D (sous-système sonore Microsoft DirectX) et A3D. FMOD s'interface avec ces systèmes audio de telle manière que le passage de l'un à l'autre nécessite des modifications minimes du code du programme (et souvent aucune modification du tout). Lorsque vous travaillez avec le système audio de base DirectSound3D, les fonctions FMOD facilitent grandement le contrôle des sources sonores surround, en simplifiant leur initialisation, leur lecture et leur positionnement. La facilité de programmation de FMOD (par rapport à la programmation de systèmes audio de base) est un avantage important de cette API (vous pouvez en savoir plus sur la programmation de DirectSound3D directement dans l'article Programmation du son surround dans DirectSound3D).

Un autre avantage de FMOD est la facilité d'installation : il suffit de placer la bibliothèque dll dans le dossier système ou dans le dossier à partir duquel l'application est lancée pour que les fonctions FMOD soient disponibles. Dans la version 3.74, en plus de la dll 32 bits habituelle pour Windows, une bibliothèque FMOD 64 bits est fournie.

FMOD contient une documentation détaillée et des exemples (ainsi que des fichiers d'en-tête et d'autres fichiers utilitaires) pour VisualC, BorlandC, Watcom C, Borland Delphi et VisualBasic. Pour les applications non commerciales, la bibliothèque FMOD est fournie gratuitement.

Les inconvénients de FMOD incluent le manque de fonctionnalités (qui sont implémentées dans DirectSound3D) telles que la création de sources sonores directionnelles et la création de sources sonores dépendantes (au moins, l'ensemble de fonctions FMOD n'inclut pas de fonctions qui définissent ces paramètres pour l'audio spatial. traitement).

Modèle spatial dans FMOD

Le modèle spatial (système de coordonnées) utilisé pour placer les sources sonores 3D est similaire au modèle spatial de DirectSound3D. Un système de coordonnées cartésiennes gaucher est utilisé ici, composé de trois axes de coordonnées orthogonaux. L'axe X (x) est dirigé vers la droite ; L'axe Y (Y) est dirigé vers le haut ; L'axe Z (zet) est dirigé vers l'avant (c'est-à-dire vers le moniteur si vous êtes assis face à lui). La distance est mesurée en mètres, mais vous pouvez définir une unité de longueur différente en définissant le rapport entre le mètre et la nouvelle unité de mesure. Tout point dans l'espace est spécifié par ses coordonnées, qui sont écrites dans la séquence X, Y, Z. Les coordonnées peuvent prendre des valeurs positives et négatives. La triade de coordonnées XYZ, qui caractérise la position d'un point dans l'espace, peut être considérée comme un vecteur dont l'origine est à l'origine, c'est-à-dire en un point de coordonnées (0, 0, 0), et un point final de coordonnées (X, Y, Z). En plus des vecteurs de position, FMOD utilise des vecteurs de vitesse pour calculer le décalage Doppler dans le spectre sonore des sources en mouvement. Le vecteur vitesse est spécifié par trois coordonnées de son point final (le point de départ du vecteur vitesse est considéré comme le point (0, 0, 0)). A noter que FMOD (comme DirectSound3D) ne calcule pas les coordonnées d'un objet en mouvement. Cette tâche doit être résolue par le programmeur, en transmettant aux fonctions FMOD les données nécessaires pour simuler exclusivement l'image sonore en un point précis de l'espace et à un moment précis. Autrement dit, FMOD (comme DirectSound3D) calcule une image sonore statique, que le programmeur peut rendre dynamique pour l'auditeur (joueur), en modifiant souvent la position des sources sonores.

Dans les fonctions FMOD pour lesquelles un vecteur doit être passé en paramètre, un pointeur vers une structure composée de trois nombres réels (flottants) ou vers un tableau composé de trois nombres réels (flottants) est utilisé. Autrement dit, les deux constructions suivantes seront interprétées de manière égale par les fonctions FMOD :

/* tableau */ float pos = (10.0f, 2.0f, 4.2f); /* structure */ struct VECTOR ( float X; float Y; float Z; ); VECTEUR pos = (10,0f, 2,0f, 4,2f) ;

Le modèle spatial de FMOD inclut d'autres paramètres environnementaux qui affectent la propagation des ondes sonores. À l'aide des fonctions FMOD, vous pouvez définir le degré d'atténuation sonore et la gravité de l'effet Doppler.

Objets de paysage sonore dans FMOD

Dans FMOD, il existe deux types d'objets dans l'espace sonore tridimensionnel : les sources sonores et les auditeurs. Contrairement à DirectSound3D, FMOD prend en charge un modèle à plusieurs auditeurs. À tous autres égards, les deux systèmes sont similaires.

Les sources sonores dans FMOD ne peuvent être que ponctuelles et non directionnelles, ce qui signifie que la source n'a pas ses propres dimensions et que la propagation du son provenant de cette source est omnidirectionnelle. La position d'écoute, au contraire, est orientée. Pour ce faire, la direction de deux vecteurs orthogonaux de taille unitaire est précisée. Le premier vecteur oriente la direction du visage, c’est-à-dire indique où regarde l’auditeur. Le deuxième vecteur est toujours dirigé vers le haut à partir du haut de la tête, c’est-à-dire qu’il indique la direction de l’axe vertical de l’auditeur. Le module de chacun de ces vecteurs est égal à une unité de longueur, ils sont donc appelés unités (le module d'un vecteur est calculé comme la racine carrée de la somme des carrés des longueurs de ses projections sur les axes de coordonnées) .

Fonctions pour travailler avec le son 3D

Pour simplifier la présentation, vous trouverez ci-dessous non seulement les fonctions FMOD qui sont directement responsables de la création du son surround, mais également toutes les fonctions qu'un programmeur doit utiliser pour travailler avec la bibliothèque FMOD. De plus, dans la liste, les fonctions sont situées dans l'ordre approximatif dans lequel elles doivent être appelées dans le programme interagissant avec FMOD. Dans la documentation fournie avec FMOD, toutes les fonctions répertoriées ci-dessous sont placées dans la section "FSOUND API Reference".

  • FSOUND_GetVersion() - renvoie la version de la bibliothèque FMOD installée sur l'ordinateur. La valeur de retour doit être comparée à la constante FMOD_VERSION, qui stocke le numéro de version de FMOD pour lequel le programme a été compilé.
  • FSOUND_SetOutput () / FSOUND_GetOutput () - sélectionnez/obtenez le système audio de base (Windows Multimedia, DirectSound, A3D, etc.). La sélection du système de base doit être effectuée avant d'appeler la fonction FSOUND_Init().
  • FSOUND_SetDriver () / FSOUND_GetDriver () - sélectionnez/obtenez le numéro du périphérique de sortie (carte son). La sélection du périphérique doit être effectuée avant d'appeler la fonction FSOUND_Init().
  • FSOUND_SetMixer() /FSOUND_GetMixer() - sélectionne/obtient le type de mixeur numérique. La sélection du mixeur doit être effectuée avant d'appeler la fonction FSOUND_Init(). Il n'est pas nécessaire de déterminer le type de mélangeur, car FMOD déterminera automatiquement la meilleure option disponible.
  • FSOUND_Init() - initialise le système audio FMOD.
  • FSOUND_Sample_Load() - charge en mémoire et décode un fichier audio (.wav, .mp2, .mp3, .ogg, .raw, etc. sont pris en charge).
  • FSOUND_3D_SetDistanceFactor() - vous permet de définir des unités de longueur autres que les mètres.
  • FSOUND_3D_SetDopplerFactor() - vous permet de définir le décalage Doppler. La valeur de base (1,0) correspond à la vitesse du son 340 m/s.
  • FSOUND_3D_SetRolloffFactor () - vous permet de définir le niveau de perte d'énergie des ondes sonores (atténuation). La valeur de base (1,0) correspond aux conditions normales.
  • FSOUND_PlaySoundEx() - lit le fichier son chargé en mémoire via le canal audio.
  • FSOUND_3D_SetAttributes() / FSOUND_3D_GetAttributes() - définit/obtient le vecteur de position et le vecteur de vitesse de la source sonore.
  • FSOUND_3D_SetMinMaxDistance() / FSOUND_3D_GetMinMaxDistance() définit/obtient la distance auditive minimale et maximale de la source sonore. La distance minimale est la distance entre la source sonore et l'auditeur, lorsque le volume sonore n'augmente plus, mais reste à la valeur qu'il a atteinte à la distance minimale. En définissant des distances minimales différentes, par exemple pour un avion et un bourdon, vous pouvez les rendre également perceptibles à l'oreille, malgré le fait que le bourdonnement du moteur sera perçu comme un son plus puissant. La distance maximale est la distance de la source sonore à l'auditeur, à partir de laquelle le volume sonore ne diminue plus, mais reste au niveau qu'il atteignait à la distance maximale. Cela signifie que peu importe à quelle distance se trouve la source sonore, elle sera entendue.
  • FSOUND_SetPaused() - Met en pause/reprend la lecture audio dans un canal.
  • FSOUND_3D_Listener_SetAttributes () / FSOUND_3D_Listener_GetAttributes () - définit/obtient le vecteur de position, le vecteur de vitesse et les vecteurs d'orientation de l'auditeur.
  • FSOUND_Update () - mettre à jour l'état du mixeur sonore, c'est-à-dire mettre à jour l'état du panorama sonore, après quoi tous les changements de position de l'auditeur ou des sources sonores prennent effet.
  • FSOUND_Sample_Free() - Libère la mémoire des données audio chargées par la fonction FSOUND_Sample_Load().
  • FSOUND_Close() - Décharge le système audio FMOD.

Cette liste est le minimum nécessaire et n'inclut pas un certain nombre de fonctions qui vous permettent d'obtenir des informations supplémentaires sur la carte son, les algorithmes de traitement du son pris en charge, etc., ainsi que de contrôler certains paramètres de lecture du son.

Algorithme d'utilisation de FMOD dans les programmes de jeux

Nous nous concentrerons sur les jeux utilisant le son surround (3D). En règle générale, dans les jeux, il existe une boucle de jeu principale dans laquelle les objets du jeu se déplacent dans l'espace. Un tel mouvement peut être provoqué par les actions du joueur (par exemple, dans un simulateur de voiture, il peut s'agir de tourner le volant vers la droite ou la gauche) ou par un changement dans la situation du jeu (par exemple, dans un jeu d'action, un monstre peut s'approcher) . Après avoir calculé les nouvelles coordonnées des objets, la position des sources sonores doit également être modifiée pour qu'elles correspondent à la nouvelle position des objets dans l'espace de jeu.

En règle générale, le cycle de jeu est précédé de la partie du programme dans laquelle les variables sont initialisées et les bibliothèques et ressources nécessaires sont chargées. Lors de l'utilisation de FMOD, cette partie doit contenir les fonctions suivantes : FSOUND_SetOutput, FSOUND_SetDriver et FSOUND_SetMixer. Vous pouvez transmettre -1 (0FFFFFFFFh) comme paramètre pour déterminer automatiquement le système audio de base à la fonction FSOUND_SetOutput.

Après une initialisation réussie de FMOD, il est nécessaire de placer les données sonores en mémoire conformément au script du jeu. La fonction FSOUND_Sample_Load, responsable de ce processus, prend en charge plusieurs formats sonores et le chargement, par exemple, d'un fichier .mp3, du point de vue d'un programmeur, n'est pas différent du chargement d'un fichier au format wav. C'est là que les avantages de la bibliothèque FMOD entrent pleinement en jeu, vous permettant de simplifier la procédure fastidieuse de création de tampons sonores et de chargement de données dans ceux-ci, caractéristique de DirectSound. Le résultat de FSOUND_Sample_Load sera un pointeur vers un échantillon sonore situé en mémoire. Si nous nous tournons vers la terminologie DirectSound, ce sera un analogue d'un tampon sonore secondaire. L'échantillon audio spécifié peut être utilisé pour créer plusieurs sources audio 3D sans qu'il soit nécessaire de créer des copies supplémentaires de cet échantillon.

Maintenant que les données nécessaires ont été chargées, vous pouvez commencer à créer une image sonore en trois dimensions. Il faut se rappeler que la modification du vecteur position et du vecteur vitesse, ainsi que de nombreuses autres caractéristiques de la source sonore, n'est possible que directement pendant la lecture du son par les fonctions FSOUND_PlaySound et FSOUND_PlaySoundEx, donc avant de placer la source sonore en tout point de l'espace. , vous devez commencer à jouer ce son . Cependant, lors de l'appel de ces fonctions, le son sera joué à l'endroit où se trouve l'auditeur, ce qui peut perturber la scène de jeu (par exemple, un monstre qui devrait s'approcher du coin le plus éloigné grogne soudainement sous l'oreille du joueur). Pour éviter un tel incident, la fonction FSOUND_PlaySoundEx() fournit un paramètre spécial qui met immédiatement en pause la lecture du son. Une source silencieuse peut être placée à l'endroit souhaité sans risque de perturber la scène de jeu et reprendre la lecture du son. Pour que les modifications de l'image sonore prennent effet, vous devez appeler la fonction FSOUND_Update.

Il faut dire qu'en termes FMOD, la lecture audio s'effectue via un canal, donc tout ce qu'un programmeur souhaite faire avec une source audio 3D doit être fait à l'aide de fonctions qui fonctionnent avec le canal. Le premier paramètre de ces fonctions est le numéro de canal.

La syntaxe d'appel de la fonction FSOUND_PlaySoundEx est la suivante :

Int F_API FSOUND_PlaySoundEx(int ​​​​channel, FSOUND_SAMPLE *sptr, FSOUND_DSPUNIT *dspunit, signé char startpaused);

En paramètre, cette fonction reçoit le numéro du canal à travers lequel le son sera joué ; un pointeur (descripteur sptr) vers un échantillon sonore situé en mémoire ; un pointeur (handle dspunit) vers le bloc de canal auquel le canal nouvellement créé doit rejoindre (ce paramètre peut avoir la valeur NULL) ; indicateur de pause, qui doit être VRAI pour suspendre immédiatement la lecture audio.

S'il est nécessaire de créer un nouveau canal, alors la constante FSOUND_FREE est passée en paramètre canal. S'il est nécessaire que le son soit joué dans tous les canaux existants, alors la constante FSOUND_ALL est transmise au canal.

La fonction renvoie le numéro (descripteur) du canal via lequel le son est joué. Si une erreur se produit, la fonction renvoie -1 (0FFFFFFFFH). Le numéro de canal (descripteur) est requis pour fonctionner avec les fonctions de couche de liaison, par exemple FSOUND_3D_SetAttributes.

Ainsi, la création et le positionnement d'une source sonore peuvent être implémentés par programme comme ceci :

FSOUND_SAMPLE *samp1 = NULL ; int canal1 = -1 ; /* vérifie la version FMOD */ if (FSOUND_GetVersion()

Il ne faut pas oublier que les fonctions FSOUND_PlaySound et FSOUND_PlaySoundEx placent la source sonore à la position actuelle de l'auditeur, donc, si le paramètre canal de ces fonctions précise le numéro (descripteur) d'un canal existant, alors, malgré le fait que pour ce canal un position autre que la position d'écoute, la source sonore se déplacera toujours vers la position d'écoute. Pour éviter toute distorsion de l'image sonore, avant d'appeler FSOUND_PlaySoundEx, il est nécessaire de sauvegarder la position et la vitesse de la source sonore dans des variables spéciales, en obtenant ces valeurs à l'aide de la fonction FSOUND_3D_GetAttributes. Appelez ensuite FSOUND_PlaySoundEx pour mettre la lecture en pause ; déplacez ensuite la source jusqu'au point souhaité en utilisant les valeurs enregistrées, puis continuez la lecture. La séquence d'actions spécifiée, entre autres choses, concerne directement les sons une fois joués (c'est-à-dire les sources qui n'émettent pas de son en continu, mais qui sonnent uniquement lorsqu'un certain événement se produit dans le jeu).

Pour modifier la position, la vitesse et l'orientation de l'auditeur dans l'espace, utilisez la fonction FSOUND_3D_Listener_SetAttributes. Voici sa syntaxe :

Void F_API FSOUND_3D_Listener_SetAttributes(const F_FLOAT_API *pos, const F_FLOAT_API *vel, F_FLOAT_API fx, F_FLOAT_API fy, F_FLOAT_API fz, F_FLOAT_API tx, F_FLOAT_API ty, F_FLOAT_API tz);

En paramètres, cette fonction reçoit un pointeur vers une triade de coordonnées de position (pos), un pointeur vers le vecteur vitesse (vel), les composantes X, Y et Z d'un vecteur unitaire définissant l'orientation frontale de la tête de l'auditeur (fx, fy , fz); Composantes X, Y et Z du vecteur unitaire qui détermine l'orientation verticale de la tête de l'auditeur (tx, ty, tz). Malgré le type void, la fonction, selon la documentation officielle, renvoie TRUE si son exécution a réussi, et FALSE en cas d'erreur.

Contrairement à DirectSound3D, FMOD peut avoir plusieurs auditeurs. Ceci est conçu pour les consoles de jeux, où un appareil de jeu peut être utilisé par plusieurs joueurs en même temps. L'écouteur actuel est sélectionné à l'aide de la fonction FSOUND_3D_Listener_SetCurrent.

Lorsque le jeu est terminé et que dans le segment final du code du programme les ressources occupées par le programme sont libérées, il est nécessaire d'utiliser les fonctions FSOUND_Sample_Free, auxquelles est transmis un pointeur (descripteur) d'un fragment de données sonores en mémoire comme un paramètre, et FSOUND_Close, qui est appelé sans paramètres et décharge le système audio FMOD.

FSOUND_Sample_Free(samp1); FSOUND_Close();

Gestion des erreurs

La plupart des fonctions FMOD, sauf indication contraire dans la documentation, renvoient TRUE en cas de succès. Si une erreur se produit dans la fonction, FALSE est renvoyé. Pour obtenir des informations supplémentaires sur l'erreur, utilisez les fonctions FSOUND_GetError et FMOD_ErrorString. La dernière fonction est une macro, le fichier d'en-tête FMOD_errors.h doit donc être inclus.

La fonction FSOUND_GetError ne nécessite aucun paramètre et renvoie le code d'erreur survenu lors de l'exécution de la fonction FMOD. La macro FMOD_ErrorString prend ce code comme paramètre et renvoie une description textuelle de l'erreur. Voici un exemple d'appel de ces fonctions :

/* affiche un message d'erreur en mode console */ printf("Error: %s\n", FMOD_ErrorString(FSOUND_GetError()));

Gestion des ressources et cartes son bas de gamme

Aujourd'hui, il existe des cartes son de performances et de capacités variables. Certains d'entre eux sont capables de prendre en charge jusqu'à 100 canaux matériels pour la lecture du son 3D, d'autres pas plus de quatre. Il serait peu avisé de se concentrer sur les cartes son « faibles » lors du développement de jeux. Cependant, une erreur pouvant survenir en cas de manque de canaux matériels dans un jeu avec un grand nombre de sources sonores peut rendre le jeu complètement inutilisable sur le groupe de cartes son spécifié. Pour sortir de cette situation, FMOD suggère d'utiliser la fonction FSOUND_SetMinHardwareChannels.

Cette fonction est appelée une fois avant d'appeler FSOUND_Init et définit le nombre minimum de canaux matériels qui doivent être pris en charge par la carte son. Après cela, soit la totalité du nombre de canaux spécifié lors de l'appel de FSOUND_SetMinHardwareChannels sera jouée à l'aide des canaux matériels, soit la prise en charge matérielle ne sera pas utilisée et le mélange des canaux se produira dans le logiciel. En d’autres termes, par exemple, si vous disposez de 16 sons et que la carte possède le même ou plusieurs canaux matériels, alors la lecture passera par ces canaux. S'il s'avère que la carte ne dispose que de 4 canaux, alors le mixage de tous les sons se fera par logiciel.

Assistance prioritaire

FMOD met en œuvre un système de priorité. Si de nombreuses sources audio doivent être lues sur un nombre limité de canaux, certaines peuvent être plus importantes que d'autres. Si, par exemple, le personnage principal du jeu est un tireur, alors reproduire le bruit d'un coup de feu serait probablement la chose la plus importante. Cette source sonore (le coup de feu) doit donc être définie sur la priorité la plus élevée à l'aide de FSOUND_SetPriority. Les sons moins importants ne seront pas diffusés si tous les canaux disponibles sont déjà occupés.

Conclusion

Le matériel présenté ci-dessus est nécessaire pour se familiariser avec les capacités de FMOD dans le domaine du travail avec le son surround et commencer à utiliser cette bibliothèque dans vos programmes. Mais cet article à lui seul ne suffit pas pour découvrir toutes les capacités de la bibliothèque FMOD. La prochaine étape pourrait consister à étudier les exemples inclus dans le package de distribution FMOD.

La culture de la modification des jeux remonte à l’Antiquité. Le premier dont je me souviens est Wolfenstein 3D (1992). Si je ne me trompe pas, vous pourriez dessiner vos propres cartes, puis de nouveaux ennemis, remplacer les textures et les sons. Le principal obstacle du modding est l'analyse de formats de données inconnus. Laissons les aspects moraux de ce phénomène pour d'autres ressources, et concentrons-nous sur les difficultés techniques qui peuvent surgir dans cette affaire difficile.

J'ai accumulé pas mal d'histoires de ce genre, des plus simples, comme l'analyse d'une simple archive où plusieurs milliers de fichiers de jeu sont stockés dans un seul fichier, jusqu'au remplacement de modèles 3D, à la recherche et à l'écriture de codecs sonores non standard. Je vais vous en raconter un, de complexité moyenne.

Disons que vous souhaitez remplacer certaines phrases dans le jeu, ou même tenter de jouer un doublage complet dans une langue pour laquelle les développeurs n'ont ni la force ni les ressources. Il semblerait qu'il vous suffit d'enregistrer le son, de trouver où il se trouve dans le jeu et de remplacer les fichiers nécessaires. Mais ce n'est pas toujours facile, par exemple, les derniers jeux de la série Batman : Arkham utilisent le moteur sonore wwise, intégré depuis un certain temps à l'Unreal Engine.

J'ai rencontré l'UE plus d'une fois, mais comme vous le savez, les développeurs commerciaux ont la possibilité de modifier complètement n'importe quelle partie du code moteur, donc presque tous les jeux s'avèrent uniques en termes de structures de données, et c'est toujours intéressant. à explorer.

Tout d'abord, regardons les fichiers audio. Comme d'habitude, ils se trouvent dans le dossier audio et sont rassemblés dans un seul gros package, avec une extension inattendue.WAD (bonjour DOOM). Si vous le souhaitez, vous pouvez même en extraire tous les sons, mais il s'agira de plusieurs milliers de fichiers sans nom, et trouver quelque chose parmi eux sera très problématique, à moins que vous ne les écoutiez tous « manuellement ». Je dois dire que le plus souvent c'est plus simple. Les développeurs, pour leur propre commodité, laissent un fichier quelque part avec une liste de phrases. Mais ce n’est pas le cas.

Il est logique de supposer que puisque le jeu lui-même trouve d'une manière ou d'une autre les sons et les sous-titres nécessaires, cela signifie que ces informations sont contenues dans les fichiers quelque part, il vous suffit de les trouver. Les textes ne se trouvent nulle part dans les dossiers de localisation, ce qui signifie qu'ils sont dispersés dans les différents niveaux du jeu, comme cela arrive souvent. Prenons comme exemple l'un des fichiers .upk avec un nom similaire au niveau et décompressons-le. Heureusement, il existe des outils pour cela, même avec les textes sources.

A l'intérieur, on découvre rapidement des fichiers de type .RDialogueEvent, dans lesquels les textes de phrases en 11 langues sont visibles à l'œil nu.

Les noms de fichiers sont similaires aux noms des sons originaux. Génial, il ne reste plus qu'à trouver une correspondance entre eux et les fichiers son. C'est là que les problèmes commencent. Bien entendu, il existe des identifiants dans le package audio. Il s'agit d'un hachage de 30 bits qui est toujours utilisé dans wwise pour les sons, mais malheureusement on ne les trouve nulle part parmi les fichiers de dialogue. Il n'y a que des numéros incompréhensibles partout, il n'y a rien de comparable à une identification sonore, ils seraient immédiatement perceptibles. D'un autre côté, cela est compréhensible, car le moteur n'est pas si simple et vous ne pouvez pas simplement prendre et lire un fichier son dans le jeu. Il est contenu dans la banque audio, il possède de nombreuses propriétés qui imposent divers effets, etc.

Et puis il s'avère que dans chaque dossier contenant la boîte de dialogue, il y a un fichier.akbank - apparemment, c'est la banque audio wwise.

Il contient de nombreux identifiants, et après les avoir essayés au hasard, nous constatons que l'un d'eux (surligné en vert) se trouve dans le package audio. Si nous en extrayons des données à l'aide de cet identifiant, nous obtiendrons un certain segment de plusieurs sons collés ensemble. Convertissons ces sons du format wwise interne en ogg normal. Oui, en effet, dans l'un d'eux, Batman dit : « Je n'ai pas le temps pour ça », et dans un autre fichier, ils lui répondent. Et les phrases correspondent exactement aux textes de ce dialogue particulier.

Pas mal déjà ! En principe, on pourrait s'arrêter là : tous les dialogues sont rangés dans des dossiers, pour chacun d'eux il y a une banque avec un lien vers le segment audio. Bien sûr, nous ne savons pas où se trouve chaque fichier, mais vous pouvez couper un segment en parties, écouter et placer plusieurs phrases à leur place (et il n'y en a généralement que 3 à 4 dans les dialogues) manuellement.

Mais nous ne cherchons pas de solutions faciles. Comprenez-le jusqu'à la fin. Vérifions, juste au cas où, que se passerait-il si les sons arrivaient correctement ? Bien sûr que non, ils sont confus. Quoi qu'on en dise, il doit y avoir quelque part des informations sur le lien entre les sons du segment et le texte du dialogue. J'ai passé beaucoup de temps à fouiller dans divers fichiers, dans l'espoir de découvrir quelque chose, mais tout cela était inutile. Bien. Puisque c’est le cas, déballons tous les packages du jeu. Cela fait plusieurs gigaoctets, enfin rien, la première fois ou quoi ? Mais une recherche complète de toutes les données du jeu n’a rien donné non plus. Le seul endroit où l’on trouve des identifiants sonores est la banque audio. Il s'avère que la connexion ne passe que par lui. Vous ne pouvez rien faire, vous devrez monter à l’intérieur et comprendre comment cela fonctionne.

Maintenant, pour être sûr, trouvons quelques dialogues dans le jeu que vous pourrez vérifier rapidement. Après une introduction spectaculaire avec une charmante journaliste et un spectacle de masques, Batman est capturé par Hugo Strange. Il dit quelques phrases commençant par « Je pense que je devrais vous remercier », puis s'en va et le jeu commence. C'est ici que se produit la première sauvegarde. Ce moment est bon pour nous.

Retrouvons la phrase du méchant dans les dossiers. Il se retrouve dans le package OW_E8_Ch1z_Anim. Vous ne devinerez donc pas tout de suite. Il n'y a qu'un seul dialogue à l'intérieur, qui contient tout le début du jeu. Cela fait 24 phrases, mais c'est peut-être une bonne chose : dans un fouillis de codes, il est plus facile de trouver le chiffre 24 que 1 ou 2. Nous allions donc étudier le contenu de .akBank.

Le format des banques wwise a déjà été partiellement exploré. Espérons que ces informations soient suffisantes pour notre objectif. A en juger par le début du fichier .akbank, il contient 5 banques audio pour 5 langues, la première est la banque INT (anglais) - nous l'examinerons.

Tout d'abord, il y a un tableau incompréhensible après l'en-tête VKRK, puis pas mal de zéros (cela peut être vu sur l'image précédente), puis le segment BKHD, puis le segment HIRC, qui, apparemment, contient une description de tous les fichiers audio. objets. Dans ce cas, nous en avons 79 (0x4F est surligné en vert). Comme l'indique la description, les objets du segment se succèdent, pour chacun le type est indiqué (1 octet), puis la longueur de 32 bits et l'ID. La longueur et le contenu d'un objet diffèrent selon le type.

Les objets de type 2 sont les sons réels. Le type est surligné en rouge, la longueur en jaune. Chacun d'eux indique l'ID de l'objet lui-même (vert) et l'ID du fichier son (violet) où il est contenu. Ci-dessous, vous pouvez voir le début du prochain objet du même type.

Objets 3 - actions sonores, il semble que chacun d'eux «joue un son», avec certains paramètres qui nous sont inconnus, mais chacun d'eux a son propre ID (gris) et l'ID du son qui doit réellement être joué (vert ).

Objets 4 - événements sonores. Entrées très courtes qui contiennent uniquement l'ID de l'événement (bleu) et indiquent également qu'il ne contient qu'une seule action, ainsi que l'ID de cette même action (gris).

Eh bien, il semble que nous ayons 24 chaînes d'événements comme celle-ci :

Événement -> action -> son

Ils sont liés par des identifiants, et aboutissent à des liens vers des fichiers sonores. Comment trouver les fichiers nécessaires ? Après avoir recherché ces codes, on les retrouve exactement dans le même tableau au début de la banque. Apparemment, il s'agit d'un tableau qui enregistre l'emplacement des sons individuels dans un segment sonore. Et en effet, il contient exactement 24 éléments, et pour chaque fichier le même ID que nous avions dans l'objet sonore, le décalage par rapport au début, et la longueur sont indiqués. Félicitations! Nous disposons désormais d'une connexion entièrement traçable depuis les événements audio des banques jusqu'aux fichiers sonores individuels :

Autrement dit, en entrée, nous avons les identifiants de plusieurs événements, un pour chaque phrase de dialogue, et pour chacun d'eux, nous pouvons trouver un fichier son. Mais comment pouvons-nous désormais les relier au dialogue lui-même ?

Essayons de chercher ces identifiants quelque part. Encore une fois, ils ne figurent pas dans les fichiers de dialogue. Il y a aussi des fichiers .akevent très courts dans le dossier - il y en a également 24. Il s'agit évidemment de fichiers d'événements audio. Il y a quelques petits chiffres à l'intérieur, les mêmes pour tout le monde, ils ne servent à rien. La seule chose qui diffère ici est l'identifiant des événements audio que nous avons trouvés dans la banque.

Autre impasse : il existe des identifiants pour tous les événements, mais il n'y a aucun lien entre eux et le texte du dialogue ! Au cas où, faisons un test : changez l'ID dans le fichier requis et lancez le jeu. Oui, en effet, Hugo ouvre la bouche, mais ne dit rien. Cela signifie que ce sont exactement les données grâce auxquelles le jeu trouve le son souhaité. Dans le même temps, on constate que le sous-titre est toujours affiché. Cela signifie que les textes des dialogues dans notre cas sont primaires et que le son en provient déjà.

Et puis je me souviens que le moteur UE3 a l'habitude de faire référence aux objets du package via leur numéro de séquence dans le package, c'est-à-dire la manière dont ils sont emballés à l'intérieur de celui-ci. Regardons le fichier d'exportation généré lorsque nous décompressons les packages :

Les nombres ici sont décimaux et commencent à zéro, mais dans le jeu, ils commencent à 1, il s'avère donc que les fichiers d'événements lors de l'exportation sont numérotés 0x35-0x4C. Voyons s'ils se trouvent quelque part parmi les dialogues. On commence à chercher - et wow, juste au début du fichier il y a ce numéro !

Voici le dernier lien manquant. Dans le même temps, nous trouvons 0x2C à proximité - c'est le numéro de dossier bancaire. Si plusieurs boîtes de dialogue apparaissent soudainement dans un dossier, elles peuvent également être distinguées. Nous savons désormais parfaitement comment trouver le son correspondant à partir du texte du dialogue.

Cela s’est avéré être un schéma d’interaction plutôt complexe. Il semble que les développeurs aient décidé de ne pas se soucier de la commodité et se sont simplement appuyés sur les mécanismes internes du moteur, ce qui a conduit à ce résultat dans ce cas. Et les cas, comme je l’ai déjà dit, sont très différents. La structure des fichiers et les connexions entre eux peuvent être complètement différentes. Ici, nous avions un lien vers le son du texte du dialogue. Mais cela se produit dans l'autre sens, le son principal est le son, et le texte se situe à côté de lui par identifiant. Ou bien l'événement de script de jeu est principal, et à partir de celui-ci, il existe des liens vers le son et le texte. Il arrive que les fichiers ne soient pas localisés par leur nom, mais par hachage. Mais de toute façon, d’une manière ou d’une autre, ils sont tous connectés, il ne reste plus qu’à trouver cette connexion.

Pour finir, essayons de vérifier nos résultats. Trouvons le fichier de dialogue exactement à partir de la phrase « Je pense que je devrais vous remercier » dont nous avons besoin et remplaçons 4B par 4C. Nous commençons le jeu et notre ami Hugo, au lieu de cette phrase, dit de manière significative : « Ce sera mon héritage, un monument à votre échec et si vous essayez de m'arrêter, je vous garantis que tout le monde connaîtra votre secret. »

Laissons Batman là, l'étude peut être considérée comme terminée. Sous forme écrite, le processus semble rapide, mais en réalité, chaque étape peut être accompagnée d'une longue contemplation de chiffres hexadécimaux, sans aucun espoir qu'à un moment donné, ils formeront des chaînes significatives et que vous comprendrez ce qu'ils signifient. Mais parfois, cela arrive encore.

Formats de musique dans les jeux
Shiru (A. Semenov) mailto:shiru à mail dot ru

Dans le processus de développement d'un jeu, tôt ou tard, la question se pose : quels formats utiliser pour stocker les données du jeu. Le but de cette revue est d'examiner les caractéristiques, les avantages et les inconvénients des formats populaires de musique dans les jeux, afin que, sur la base des informations reçues, vous puissiez faire un choix intelligent au sein de votre projet. Les nuances techniques de reproduction (comment, avec quoi) des formats mentionnés ici dépassent le cadre de l'article et ne sont donc pas abordées ici.

Classiquement, on peut diviser les formats utilisés pour stocker de la musique en deux groupes : le streaming audio, qui contient la piste audio finale (c'est-à-dire uniquement le son), éventuellement compressée pour réduire sa taille ; et les formats musicaux eux-mêmes, qui stockent un ensemble d'instructions sur le moment et la note à jouer, ainsi que des sons (échantillons) avec lesquels ces notes doivent être jouées. Examinons d’abord les caractéristiques de ces deux groupes.

Diffusion audio

Ce n'est pas vraiment un format de musique - c'est le son tel qu'il est, enregistré dans un fichier. Mais ce son pourrait très bien être de la musique, donc pour les besoins de cet article, le streaming audio est également un format musical. C'est ce qu'on appelle le streaming car le fichier n'a pas besoin d'être présent dans son intégralité en mémoire - il suffit de lire de petits morceaux du média, de le décoder (si nécessaire) et de l'envoyer pour lecture. Le streaming audio est livré avec ou sans compression.

Les formats audio de streaming non compressés pour stocker de la musique dans les jeux ne sont généralement pas utilisés en raison de leur taille énorme : une seconde d'audio stéréo de qualité CD (44 100 Hz, 16 bits) occupe 172 kilo-octets. L'exception précédente était le CD-DA, le format CD audio. Mais les jeux avec de la musique dans ce format n'ont pas été vus ces dernières années - il y a toujours quelque chose pour remplir les quelques mégaoctets, selon les normes modernes, de disques CD/DVD.

Les formats audio compressés sont plus adaptés aux applications de jeux. Il existe des algorithmes de compression audio sans perte de qualité (algorithmes dits sans perte), mais leur gain en volume est extrêmement insignifiant, d'où les formats de compression les plus courants avec perte de qualité (algorithmes avec perte). Les algorithmes de compression populaires, qui permettent un gain important dans le volume du fichier final, utilisent l'idée du « codage psychoacoustique » - exclusion dynamique du signal des fréquences mal perçues par l'audition humaine. Généralement, on choisit un niveau de perte qui est à peine perceptible à l'oreille. Les algorithmes de compression audio fonctionnent généralement avec un taux de compression fixe, pour les jeux, il se situe généralement autour de 11:1...7:1 (flux de données 128...192 Ko/s). Il existe un grand nombre de formats de compression audio, mais les plus connus et les plus utilisés sont MP3, WMA, OGG.

Le MP3 est le format le plus ancien et le plus courant. Initialement, il est apparu comme un format de compression des pistes audio des films vidéo au format VideoCD (le nom complet est MP3 - MPEG Audio Layer III), mais assez rapidement, il a commencé à être utilisé seul. Le MP3 est désormais la norme de l'industrie. L'utilisation de fichiers audio compressés MP3 dans des projets de jeux commerciaux tirés à plus de 5 000 exemplaires coûte de l'argent - 2 500 $ par produit (licence de jeu, pour plus d'informations sur les licences, voir les liens à la fin de l'article). Aujourd’hui, le MP3 n’offre pas les meilleures performances en termes de rapport taille/qualité. Les versions améliorées du format MP3 - MP3pro, par exemple - avec des indicateurs similaires à ceux de WMA/OGG, n'ont pas gagné en popularité.

WMA - Windows Media Audio, un format promu par Microsoft lui-même comme une alternative plus avancée au MP3, a des capacités à peu près similaires à celles du format OGG. Son utilisation dans des produits logiciels destinés au stockage de contenu audio ne nécessite pas de licence.

OGG est un format de compression audio relativement nouveau qui intéresse particulièrement les développeurs de jeux. Il ne nécessite aucune licence et son utilisation gratuite est tout à fait légale ; en même temps, il offre une qualité sonore supérieure avec la même taille que le MP3, ou une taille plus petite avec la même qualité sonore. Certes, le décodage OGG nécessite légèrement plus de ressources informatiques que le MP3/WMA. Les encodeurs et décodeurs logiciels du créateur du format (Vorbis) sont distribués en open source.

Avantages de l'utilisation du streaming audio pour stocker de la musique :

  • Vous pouvez stocker de la musique de n'importe quel niveau technique. À cet égard, ce format est universel et peut potentiellement (surtout avec une compression à faible perte) offrir la meilleure qualité sonore.
  • Vos musiciens ne sont pas limités par les capacités du format et peuvent utiliser les outils de création musicale qui leur conviennent (c'est-à-dire qu'il sera facile de trouver un musicien approprié)
  • Ne nécessite pas une grande quantité de RAM lors de la lecture (le flux de données est lu à partir du support par petites portions)
Inconvénients :
  • Pour certaines applications, la taille de l'audio, même compressé, peut être trop grande - une composition de longueur moyenne et de qualité décente prend 3 à 5 mégaoctets (lors de l'utilisation de formats compressés)
  • Réduire la taille ne peut se faire qu'en réduisant significativement la qualité (augmentation des pertes par compression) et en réduisant la longueur des compositions
  • La durée d'une piste dépend directement de la taille de son fichier.
  • Le décodage de l'audio compressé nécessite des ressources CPU relativement importantes et peut ne pas être possible sur des plates-formes basse consommation sans décodeur matériel (en temps réel)

Formats de musique

Les formats musicaux eux-mêmes sont des formats qui ne contiennent pas le son final, mais uniquement des informations sur la manière de l'obtenir. C'est-à-dire des informations sur quand et quelles notes jouer avec quels sons (et - éventuellement - ces sons eux-mêmes). De ce fait, il est possible d'obtenir un gain significatif dans la quantité d'informations stockées (taille du fichier). Le son final (que le joueur entendra) est obtenu directement lors du processus de lecture de la musique. Cela consomme certaines ressources informatiques, mais en général, la charge n'est pas plus grande que lors du décodage de l'audio en streaming compressé, et généralement encore moins (la lecture de formats de musique peut être accélérée matériellement ; sur un PC, par exemple, la prise en charge matérielle requise est beaucoup plus courante que la prise en charge matérielle requise pour le décodage audio compressé).

Les formats musicaux imposent certaines restrictions à la liberté de créativité d'un musicien - une longue partie vocale ou instrumentale enregistrée en direct, par exemple, ne peut pas être insérée - plus précisément, elle ne sera pas rentable, car entraînera une augmentation de la taille du fichier et il sera plus pratique d’utiliser le streaming audio. Pour la musique « live » (orchestre symphonique, groupe de rock, etc.), vous devez impérativement utiliser le streaming audio. Les formats de musique ne conviennent qu'à imitation la musique live (pour les cas où le son de l'imitation devient acceptable en raison d'un gain important en taille de fichier), ou pour la musique électronique. Il est presque impossible d'obtenir une similitude absolue dans le son d'une composition sous un format musical avec de la musique live ; seuls différents degrés d'approximation sont possibles ; Comme le montre la pratique, cette limitation ne constitue pas un inconvénient sérieux.

Les formats de musique utilisés dans les jeux peuvent être divisés en deux sous-groupes : le MIDI et la famille des formats de suivi (appelés modules de suivi, parfois aussi appelés simplement modules). La principale différence entre ces deux sous-groupes est que les fichiers MIDI standard ne contiennent que des notes, tandis que les modules de suivi, en plus des notes, stockent des échantillons utilisés pour faire retentir ces notes. Les différences restantes concernent principalement certaines restrictions qui imposent leurs propres spécificités lors de l'écriture musicale.

Un point important : les formats MIDI et tracker ne nécessitent pas de licence pour être utilisés dans un produit commercial.

Formats de musique : MIDI

MIDI (Musical Instruments Digital Interface) est une interface matérielle, ainsi qu'une norme qui décrit le processus d'échange de données musicales entre instruments de musique électroniques. Les données musicales ne sont pas du son, ce sont, pour le dire très simplement, uniquement des informations sur les touches du synthétiseur enfoncées/relâchées. Le MIDI est également un standard pour stocker ces informations dans des fichiers (les options les plus connues sont .mid, .midi). Le MIDI peut, à une certaine approximation, être appelé un « format de musique en streaming », car... pour le lire, il n'est pas nécessaire d'avoir le fichier entier en mémoire - vous pouvez le lire morceau par morceau, comme c'est le cas pour le streaming audio. Mais c'est la seule similitude entre ces formats.

De nombreux utilisateurs de PC, entendant le mot « midi », disent avec mépris quelque chose comme « oh, ce sont de si petits fichiers avec une musique au son épouvantable » (surtout ceux qui ont encore des cartes son rares sans synthétiseurs WaveTable de haute qualité). Il est important de comprendre que le son d'une composition enregistrée dans un fichier MIDI est le son du synthétiseur de votre ordinateur à travers lequel le contenu du fichier est joué ; la qualité du son dépend directement de la qualité du synthétiseur ; Peu de gens savent que le MIDI est largement utilisé dans la création de musique électronique professionnelle (y compris pour créer de la musique pour des jeux, pour un enregistrement ultérieur au format audio).

À l'heure actuelle, le seul principe de fonctionnement utilisé pour les synthétiseurs MIDI sur PC est ce qu'on appelle. Synthèse WaveTable. C'est-à-dire qu'il existe un ensemble (banque) de sons de divers instruments (décrits par la norme, au moins 128 instruments et 64 sons de batterie), le synthétiseur reproduit les notes avec ces sons. Les sons des instruments ne sont pas stockés dans le fichier MIDI et les banques d'instruments de différents fabricants de cartes son peuvent différer (non pas dans la composition des instruments, mais dans les caractéristiques de leur son). Par conséquent, avec différentes banques d'instruments, le son d'un même fichier MIDI change quelque peu, ce qui crée parfois un certain problème. Une composition écrite pour une banque peut sonner mal avec une autre (en raison d'un équilibre différent des volumes des instruments, par exemple). Cela impose également une limitation à la liberté créatrice du musicien - il n'est limité que par les timbres (instruments) décrits par la norme. D'un autre côté, l'absence d'échantillons d'instruments dans un fichier MIDI réduit considérablement sa taille - une composition énorme ne peut peser que 50 à 100 kilo-octets, et en même temps être parfaitement compressée plusieurs fois avec un ZIP ordinaire.

Il existe plusieurs normes MIDI rétrocompatibles : la principale, General Midi (GM) ; extension de Roland (GS); extension plus avancée de Yamaha (XG). Les formats avancés ont un grand nombre d'instruments dans la norme (minimum 226 pour GS, minimum 480 pour XG - sans compter la batterie) et des capacités supplémentaires de contrôle de la synthèse sonore, grâce auxquelles vous pouvez diversifier et améliorer la qualité sonore.

Pour jouer du MIDI, vous avez besoin d'un synthétiseur MIDI dans le système - sur un PC, il peut s'agir d'une carte son avec un synthétiseur matériel WaveTable (GM/GS/XG, avec sa propre banque de sons), ou d'une simple carte son (telle que AC"97) avec un synthétiseur logiciel (qui consomme une partie des performances du système ; un synthétiseur logiciel GS avec une banque de sons standard est inclus dans DirectX). Sur des appareils tels que les téléphones mobiles, il peut s'agir d'un simple synthétiseur matériel (il n'existe pas options de puissance pour la synthèse logicielle), et non pas WaveTable, mais une des méthodes de synthèse alternatives (il s'agit généralement de la synthèse FM), simulant très grossièrement le son des instruments.

S'il n'y a pas de synthétiseur matériel dans le système et que les ressources processeur/mémoire sont insuffisantes pour la synthèse logicielle, il est impossible de jouer du MIDI sur un tel appareil.

Avantages :

  • Très petite taille de fichier
  • Lorsque vous utilisez un bon synthétiseur avec une bonne banque d'échantillons, une qualité sonore élevée
  • Si vous disposez d'un synthétiseur matériel, la charge sur le CPU est très faible (le lecteur envoie uniquement des commandes au synthétiseur)
  • Il ne sera pas difficile de trouver un musicien qui sait travailler avec le MIDI
Inconvénients :
  • Dépendance de la qualité sonore du synthétiseur utilisé
  • Différents sons d'instruments sur différents synthétiseurs (une musique qui sonne bien sur un synthétiseur peut sonner terriblement sur un autre, même si ces synthétiseurs sont de la même qualité)
  • Une certaine monotonie dans le son de n'importe quelle musique sur le même synthétiseur (en raison du fait que la banque d'échantillons pour différentes compositions ne change généralement pas)

Formats de musique : musique de suivi

La musique dans ce format est également appelée « modules ». Comme en MIDI, le fichier stocke des données sur les notes, mais en plus d'elles, il stocke également des échantillons qui seront utilisés pour faire sonner les notes lorsqu'elles sont jouées. C'est là que s'arrêtent les similitudes : techniquement, il y a plus de différences que de similitudes entre le MIDI et la musique tracker. Malgré l'idée générale (stocker des notes plutôt que le son final), les implémentations de cette idée varient considérablement.

Un tracker est un éditeur de musique doté d'un certain type d'interface (colonnes verticales de chiffres et de lettres au lieu de la portée musicale familière aux musiciens). Les trackers sont apparus il y a longtemps, sur les premiers ordinateurs domestiques dotés des dispositifs de synthèse sonore les plus simples. Les notes étaient émises par le matériel du système (par exemple, via la puce SID du C64, via la puce AY du ZX128). Les trackers utilisant des échantillons pour faire sonner des notes sont apparus à la fin des années 80 sur la plateforme AMIGA, puis se sont répandus sur toutes les autres plateformes disposant des moyens de reproduire le son numérique.

Le principe même de fonctionnement des trackers impose certaines restrictions aux capacités du musicien, offrant en revanche des capacités inhabituelles de contrôle du son. Contrairement à la norme MIDI professionnelle, il s’agit d’une norme amateur développée par des passionnés de MAO et non par des fabricants d’équipements musicaux. Écrire de la musique dans des trackers est différent de travailler avec des séquenceurs MIDI logiciels professionnels. Principales caractéristiques des trackers :

Quantification temporelle stricte - les notes ne peuvent pas commencer et s'arrêter à tout moment, mais seulement à certaines positions (cela rend difficile l'exécution de certains effets, par exemple le jeu fluide d'un accord de guitare) ;
- Manque de polyphonie sur un seul canal (piste), exactement autant de notes peuvent sonner simultanément qu'il y a de canaux dans la piste ;
- La présence d'"effets" - des commandes qui affectent le processus de lecture de chaque note individuelle. Les effets peuvent être assez ordinaires (d'un point de vue musical) - vibrato, contrôle du volume, portamento ; et pas tout à fait ordinaires - décaler le début de l'échantillon, contrôler les filtres, etc.

Malgré certaines limitations (par rapport au MIDI), le stockage d'échantillons dans un fichier avec une composition offre des avantages évidents - la possibilité d'utiliser tous les timbres nécessaires, fragments de parties live (riffs de guitare, boucles de batterie) - cela vous permet d'améliorer la qualité sonore et rapprochez-le du « son live ».

Il existe un grand nombre de formats de tracker - en règle générale, chaque nouvel éditeur, en plus de prendre en charge plusieurs des formats les plus populaires, avait également son propre format. Les formats diffèrent par leurs capacités et l'organisation des données au sein du fichier, mais l'idée générale reste la même. Les plus populaires sont quatre formats devenus standards (supportés par presque tous les éditeurs) : MOD simple (Sound Tracker/Pro Tracker) et S3M (Scream Tracker), et plus avancé XM (Fast Tracker) et IT (Impulse Tracker).

Le tout premier format de tracker - MOD (du mot module, c'est pourquoi la musique de tracker est appelée modules) - avait des capacités modestes : 4 canaux, un maximum de 15 instruments (seulement des échantillons de 8 bits, plus la possibilité d'une simple boucle dans un échantillon), un maigre ensemble d'effets. Plus tard, une modification MOD est apparue avec la possibilité d'utiliser 31 instruments et 8 canaux.

S3M étend quelque peu les capacités du MOD - en particulier, vous pouvez utiliser jusqu'à 32 canaux et un nombre accru d'effets. Mais le format d'échantillon est toujours limité à 8 bits.

XM et IT offrent des possibilités de créativité bien plus grandes et une qualité sonore nettement supérieure. Un grand nombre de canaux (selon l'éditeur et le support du lecteur), un grand nombre d'effets, des échantillons 16 bits (ils peuvent être bouclés soit directement, soit en boucle bidirectionnelle), 64 instruments. Les instruments dans XM/IT ne sont pas synonymes d'échantillons - c'est une description des échantillons à utiliser pour certaines plages de notes de l'instrument (les soi-disant couches, cela est nécessaire pour améliorer la qualité de la simulation des instruments live) , le volume et l'enveloppe panoramique, ainsi que quelques autres paramètres.

La lecture MOD/S3M nécessite légèrement moins de ressources CPU que la lecture XM/IT plus complexe. La charge sur le CPU dépend également du nombre de canaux dans le module et de l'algorithme d'interpolation utilisé lors du mixage (la qualité du son dépend fortement de la qualité de l'interpolation).

Les fichiers musicaux du tracker peuvent aller de centaines d’octets à plusieurs mégaoctets. La taille du fichier dépend directement du nombre et de la qualité des échantillons utilisés. En moyenne, un module au son plus ou moins décent (de n'importe quelle durée) prend 200 à 500 kilo-octets.

Pour réduire le volume occupé par la musique dans le jeu, vous pouvez stocker plusieurs chansons dans un seul fichier, en utilisant les mêmes échantillons d'instruments. Les capacités des trackers vous permettent d'organiser plusieurs fragments en boucle au sein d'une composition ; dans le jeu, vous pouvez lire une telle piste, à partir de différentes positions à l'intérieur de celle-ci.

Il existe des modifications des formats de suivi standard utilisant la compression d'échantillons à l'aide de OGG/MP3. Il s'agit des formats MO3 (combine les formats IT/XM/S3M/MTM/MOD) et OXM (XM standard, mais utilisant OGG pour le packaging des échantillons). Les deux formats utilisent la compression uniquement pour les échantillons pour lesquels elle offre un avantage en termes de taille. La compression des échantillons entraîne une réduction significative de l'espace occupé sur le disque avec une diminution de la qualité presque imperceptible. Les échantillons sont stockés compressés uniquement dans un fichier ; lorsque le module est chargé, ils sont étendus en mémoire, donc la lecture de ces modules elle-même n'augmente pas la charge sur le processeur, mais le module pendant la lecture occupera la même quantité de RAM qu'un j’en ai déballé un. L'utilisation de la compression d'échantillons peut soit simplement réduire la taille du fichier, soit améliorer la qualité du son sans modifier la taille (en raison de l'utilisation d'échantillons de meilleure qualité). Cette technologie peut ne pas être adaptée à une utilisation sur des plates-formes à faible consommation : les échantillons peuvent prendre trop de temps à décoder (charger).

Avantages :

  • Peut potentiellement fournir un meilleur rapport taille/qualité lorsque la taille du fichier musical est très limitée (100-500 Ko)
  • Augmenter la durée d'une composition augmente très peu la taille du fichier
Inconvénients :
  • Les formats de suivi ne sont pas aussi flexibles que le streaming audio
  • Le module en cours de lecture consomme de la RAM (pertinent pour les systèmes avec une quantité limitée de RAM, par exemple certains PDA)
  • Une approche plutôt atypique de l'écriture musicale, différente de la notation musicale conventionnelle, qui rend difficile la maîtrise des trackers par les musiciens « ordinaires ».

Que choisir ?

Après avoir pris connaissance des spécificités des différents formats musicaux, nous pouvons enfin aborder le problème réel du choix du plus adapté dans le cadre d'un projet précis. Tout d'abord, vous devez déterminer les critères de sélection : quelles sont les capacités de la plate-forme sur laquelle votre jeu s'exécute, quelles sont les limitations techniques. En particulier, le volume de musique occupé sur le support et, lors de la lecture, sur la RAM, est-il critique ? La charge du processeur est-elle critique ? Existe-t-il des capacités matérielles pour jouer de la musique (décodeur MP3, synthétiseur MIDI).

Il est raisonnable d'utiliser le streaming audio lorsqu'il n'y a pas de restrictions strictes sur l'espace occupé sur le support et qu'il y a suffisamment de puissance CPU pour le décodage (ou s'il existe un décodeur matériel). De plus, si vous avez besoin de créer de la musique de très haute qualité (exemples : stations de radio de la série de jeux GTA ; musique enregistrée en direct), il n'y a tout simplement plus d'autres options que le streaming audio. Le gros avantage de ce format est qu'il n'y a aucun problème avec les compétences (ou le manque de compétences) liées à l'utilisation de divers équipements et programmes de vos musiciens - ils peuvent utiliser librement les outils qui leur conviennent le mieux, car le résultat peut toujours être enregistré dans un fichier audio.

S'il existe des restrictions strictes sur la quantité de mémoire occupée, il est préférable de penser aux formats de musique - MIDI ou tracker music. Vous devez choisir entre ces deux directions en fonction de la capacité à lire les formats sur la plate-forme cible (MIDI sur Palm ou GBA, par exemple, vous ne pouvez pas lire grand-chose) et des limitations de taille de fichier. Les capacités de vos musiciens jouent également un rôle important (puisque créer de la musique de haute qualité dans ces formats nécessite certaines compétences).

De nos jours, il est courant d'utiliser, dans des conditions de limitation sévère de la quantité de mémoire sur le support (généralement des jeux shareware sur PC) allouée à la musique, des extraits d'une à deux minutes de streaming audio (généralement OGG) en très faible qualité (de 56 kbps et moins, à 22 050 Hz mono - cela représente environ 500 à 600 kilo-octets). Dans de tels cas, il convient de réfléchir à la possibilité d'utiliser des formats de suivi - dans ce cas, la puissance du processeur est suffisante pour la lecture, mais avec une taille de fichier identique ou inférieure, vous pouvez obtenir une qualité nettement supérieure et un son plus clair (peut-être moins vivant - mais ici tout dépend des qualifications du musicien ).

Si le projet est sur un PC et que l'espace pour la musique est très limité (disons, 500 kilo-octets pour l'ensemble de la composition musicale), vous pouvez penser à utiliser des fichiers MIDI au lieu de diffuser des modules audio et de suivi. Le problème des différents sons lors de l'utilisation de différentes banques de sons peut être résolu en utilisant le synthétiseur MIDI du logiciel DirectX - Microsoft Software GS MIDI Synthezer. Il utilise la banque GS de trois mégaoctets fournie avec DirectX, et si vous écrivez une piste MIDI spécifiquement pour ce synthétiseur, vous pouvez obtenir un son très correct avec une consommation de mémoire minimale pour la conception musicale (500 kilo-octets peuvent facilement contenir une douzaine de 5 décompressés). -Fichiers MIDI de 10 minutes). Vous pouvez également utiliser votre propre synthétiseur logiciel MIDI ou votre propre banque DLS. Dans ce cas, vous bénéficierez de tous les avantages du travail avec la musique via MIDI et de la possibilité d'utiliser vos propres timbres, caractéristiques des formats de tracker.

Sur les PDA et les consoles de jeux portables, le format le plus approprié est désormais la musique tracker (le format spécifique est sélectionné en fonction de la puissance du processeur) - le volume des médias, contrairement à la puissance des processeurs, n'a pas encore atteint la possibilité de librement utiliser le streaming audio dans les jeux.

En conclusion, je tiens à dire que le choix du format musical ne doit pas être limité par les capacités de mise en œuvre logicielle du lecteur. Il existe un grand nombre de bibliothèques prêtes à l'emploi (à la fois payantes et gratuites) pour lire tous les formats répertoriés pour toutes les plates-formes sur lesquelles cela peut être implémenté matériellement.

La culture de la modification des jeux remonte à l’Antiquité. Le premier dont je me souviens est Wolfenstein 3D (1992). Si je ne me trompe pas, vous pourriez dessiner vos propres cartes, puis de nouveaux ennemis, remplacer les textures et les sons. Le principal obstacle du modding est l'analyse de formats de données inconnus. Laissons les aspects moraux de ce phénomène pour d'autres ressources, et concentrons-nous sur les difficultés techniques qui peuvent surgir dans cette affaire difficile.

J'ai accumulé pas mal d'histoires de ce genre, des plus simples, comme l'analyse d'une simple archive où plusieurs milliers de fichiers de jeu sont stockés dans un seul fichier, jusqu'au remplacement de modèles 3D, à la recherche et à l'écriture de codecs sonores non standard. Je vais vous en raconter un, de complexité moyenne.

Disons que vous souhaitez remplacer certaines phrases dans le jeu, ou même tenter de jouer un doublage complet dans une langue pour laquelle les développeurs n'ont ni la force ni les ressources. Il semblerait qu'il vous suffit d'enregistrer le son, de trouver où il se trouve dans le jeu et de remplacer les fichiers nécessaires. Mais ce n'est pas toujours facile, par exemple, les derniers jeux de la série Batman : Arkham utilisent le moteur sonore wwise, intégré depuis un certain temps à l'Unreal Engine.

J'ai rencontré l'UE plus d'une fois, mais comme vous le savez, les développeurs commerciaux ont la possibilité de modifier complètement n'importe quelle partie du code moteur, donc presque tous les jeux s'avèrent uniques en termes de structures de données, et c'est toujours intéressant. à explorer.

Tout d'abord, regardons les fichiers audio. Comme d'habitude, ils se trouvent dans le dossier audio et sont rassemblés dans un seul gros package, avec une extension inattendue.WAD (bonjour DOOM). Si vous le souhaitez, vous pouvez même en extraire tous les sons, mais il s'agira de plusieurs milliers de fichiers sans nom, et trouver quelque chose parmi eux sera très problématique, à moins que vous ne les écoutiez tous « manuellement ». Je dois dire que le plus souvent c'est plus simple. Les développeurs, pour leur propre commodité, laissent un fichier quelque part avec une liste de phrases. Mais ce n’est pas le cas.

Il est logique de supposer que puisque le jeu lui-même trouve d'une manière ou d'une autre les sons et les sous-titres nécessaires, cela signifie que ces informations sont contenues dans les fichiers quelque part, il vous suffit de les trouver. Les textes ne se trouvent nulle part dans les dossiers de localisation, ce qui signifie qu'ils sont dispersés dans les différents niveaux du jeu, comme cela arrive souvent. Prenons comme exemple l'un des fichiers .upk avec un nom similaire au niveau et décompressons-le. Heureusement, il existe des outils pour cela, même avec les textes sources.

A l'intérieur, on découvre rapidement des fichiers de type .RDialogueEvent, dans lesquels les textes de phrases en 11 langues sont visibles à l'œil nu.

Les noms de fichiers sont similaires aux noms des sons originaux. Génial, il ne reste plus qu'à trouver une correspondance entre eux et les fichiers son. C'est là que les problèmes commencent. Bien entendu, il existe des identifiants dans le package audio. Il s'agit d'un hachage de 30 bits qui est toujours utilisé dans wwise pour les sons, mais malheureusement on ne les trouve nulle part parmi les fichiers de dialogue. Il n'y a que des numéros incompréhensibles partout, il n'y a rien de comparable à une identification sonore, ils seraient immédiatement perceptibles. D'un autre côté, cela est compréhensible, car le moteur n'est pas si simple et vous ne pouvez pas simplement prendre et lire un fichier son dans le jeu. Il est contenu dans la banque audio, il possède de nombreuses propriétés qui imposent divers effets, etc.

Et puis il s'avère que dans chaque dossier contenant la boîte de dialogue, il y a un fichier.akbank - apparemment, c'est la banque audio wwise.

Il contient de nombreux identifiants, et après les avoir essayés au hasard, nous constatons que l'un d'eux (surligné en vert) se trouve dans le package audio. Si nous en extrayons des données à l'aide de cet identifiant, nous obtiendrons un certain segment de plusieurs sons collés ensemble. Convertissons ces sons du format wwise interne en ogg normal. Oui, en effet, dans l'un d'eux, Batman dit : « Je n'ai pas le temps pour ça », et dans un autre fichier, ils lui répondent. Et les phrases correspondent exactement aux textes de ce dialogue particulier.

Pas mal déjà ! En principe, on pourrait s'arrêter là : tous les dialogues sont rangés dans des dossiers, pour chacun d'eux il y a une banque avec un lien vers le segment audio. Bien sûr, nous ne savons pas où se trouve chaque fichier, mais vous pouvez couper un segment en parties, écouter et placer plusieurs phrases à leur place (et il n'y en a généralement que 3 à 4 dans les dialogues) manuellement.

Mais nous ne cherchons pas de solutions faciles. Comprenez-le jusqu'à la fin. Vérifions, juste au cas où, que se passerait-il si les sons arrivaient correctement ? Bien sûr que non, ils sont confus. Quoi qu'on en dise, il doit y avoir quelque part des informations sur le lien entre les sons du segment et le texte du dialogue. J'ai passé beaucoup de temps à fouiller dans divers fichiers, dans l'espoir de découvrir quelque chose, mais tout cela était inutile. Bien. Puisque c’est le cas, déballons tous les packages du jeu. Cela fait plusieurs gigaoctets, enfin rien, la première fois ou quoi ? Mais une recherche complète de toutes les données du jeu n’a rien donné non plus. Le seul endroit où l’on trouve des identifiants sonores est la banque audio. Il s'avère que la connexion ne passe que par lui. Vous ne pouvez rien faire, vous devrez monter à l’intérieur et comprendre comment cela fonctionne.

Maintenant, pour être sûr, trouvons quelques dialogues dans le jeu que vous pourrez vérifier rapidement. Après une introduction spectaculaire avec une charmante journaliste et un spectacle de masques, Batman est capturé par Hugo Strange. Il dit quelques phrases commençant par « Je pense que je devrais vous remercier », puis s'en va et le jeu commence. C'est ici que se produit la première sauvegarde. Ce moment est bon pour nous.

Retrouvons la phrase du méchant dans les dossiers. Il se retrouve dans le package OW_E8_Ch1z_Anim. Vous ne devinerez donc pas tout de suite. Il n'y a qu'un seul dialogue à l'intérieur, qui contient tout le début du jeu. Cela fait 24 phrases, mais c'est peut-être une bonne chose : dans un fouillis de codes, il est plus facile de trouver le chiffre 24 que 1 ou 2. Nous allions donc étudier le contenu de .akBank.

Le format des banques wwise a déjà été partiellement exploré. Espérons que ces informations soient suffisantes pour notre objectif. A en juger par le début du fichier .akbank, il contient 5 banques audio pour 5 langues, la première est la banque INT (anglais) - nous l'examinerons.

Tout d'abord, il y a un tableau incompréhensible après l'en-tête VKRK, puis pas mal de zéros (cela peut être vu sur l'image précédente), puis le segment BKHD, puis le segment HIRC, qui, apparemment, contient une description de tous les fichiers audio. objets. Dans ce cas, nous en avons 79 (0x4F est surligné en vert). Comme l'indique la description, les objets du segment se succèdent, pour chacun le type est indiqué (1 octet), puis la longueur de 32 bits et l'ID. La longueur et le contenu d'un objet diffèrent selon le type.

Les objets de type 2 sont les sons réels. Le type est surligné en rouge, la longueur en jaune. Chacun d'eux indique l'ID de l'objet lui-même (vert) et l'ID du fichier son (violet) où il est contenu. Ci-dessous, vous pouvez voir le début du prochain objet du même type.

Objets 3 - actions sonores, il semble que chacun d'eux «joue un son», avec certains paramètres qui nous sont inconnus, mais chacun d'eux a son propre ID (gris) et l'ID du son qui doit réellement être joué (vert ).

Objets 4 - événements sonores. Entrées très courtes qui contiennent uniquement l'ID de l'événement (bleu) et indiquent également qu'il ne contient qu'une seule action, ainsi que l'ID de cette même action (gris).

Eh bien, il semble que nous ayons 24 chaînes d'événements comme celle-ci :

Événement -> action -> son

Ils sont liés par des identifiants, et aboutissent à des liens vers des fichiers sonores. Comment trouver les fichiers nécessaires ? Après avoir recherché ces codes, on les retrouve exactement dans le même tableau au début de la banque. Apparemment, il s'agit d'un tableau qui enregistre l'emplacement des sons individuels dans un segment sonore. Et en effet, il contient exactement 24 éléments, et pour chaque fichier le même ID que nous avions dans l'objet sonore, le décalage par rapport au début, et la longueur sont indiqués. Félicitations! Nous disposons désormais d'une connexion entièrement traçable depuis les événements audio des banques jusqu'aux fichiers sonores individuels :

Autrement dit, en entrée, nous avons les identifiants de plusieurs événements, un pour chaque phrase de dialogue, et pour chacun d'eux, nous pouvons trouver un fichier son. Mais comment pouvons-nous désormais les relier au dialogue lui-même ?

Essayons de chercher ces identifiants quelque part. Encore une fois, ils ne figurent pas dans les fichiers de dialogue. Il y a aussi des fichiers .akevent très courts dans le dossier - il y en a également 24. Il s'agit évidemment de fichiers d'événements audio. Il y a quelques petits chiffres à l'intérieur, les mêmes pour tout le monde, ils ne servent à rien. La seule chose qui diffère ici est l'identifiant des événements audio que nous avons trouvés dans la banque.

Autre impasse : il existe des identifiants pour tous les événements, mais il n'y a aucun lien entre eux et le texte du dialogue ! Au cas où, faisons un test : changez l'ID dans le fichier requis et lancez le jeu. Oui, en effet, Hugo ouvre la bouche, mais ne dit rien. Cela signifie que ce sont exactement les données grâce auxquelles le jeu trouve le son souhaité. Dans le même temps, on constate que le sous-titre est toujours affiché. Cela signifie que les textes des dialogues dans notre cas sont primaires et que le son en provient déjà.

Et puis je me souviens que le moteur UE3 a l'habitude de faire référence aux objets du package via leur numéro de séquence dans le package, c'est-à-dire la manière dont ils sont emballés à l'intérieur de celui-ci. Regardons le fichier d'exportation généré lorsque nous décompressons les packages :

Les nombres ici sont décimaux et commencent à zéro, mais dans le jeu, ils commencent à 1, il s'avère donc que les fichiers d'événements lors de l'exportation sont numérotés 0x35-0x4C. Voyons s'ils se trouvent quelque part parmi les dialogues. On commence à chercher - et wow, juste au début du fichier il y a ce numéro !

Voici le dernier lien manquant. Dans le même temps, nous trouvons 0x2C à proximité - c'est le numéro de dossier bancaire. Si plusieurs boîtes de dialogue apparaissent soudainement dans un dossier, elles peuvent également être distinguées. Nous savons désormais parfaitement comment trouver le son correspondant à partir du texte du dialogue.

Cela s’est avéré être un schéma d’interaction plutôt complexe. Il semble que les développeurs aient décidé de ne pas se soucier de la commodité et se sont simplement appuyés sur les mécanismes internes du moteur, ce qui a conduit à ce résultat dans ce cas. Et les cas, comme je l’ai déjà dit, sont très différents. La structure des fichiers et les connexions entre eux peuvent être complètement différentes. Ici, nous avions un lien vers le son du texte du dialogue. Mais cela se produit dans l'autre sens, le son principal est le son, et le texte se situe à côté de lui par identifiant. Ou bien l'événement de script de jeu est principal, et à partir de celui-ci, il existe des liens vers le son et le texte. Il arrive que les fichiers ne soient pas localisés par leur nom, mais par hachage. Mais de toute façon, d’une manière ou d’une autre, ils sont tous connectés, il ne reste plus qu’à trouver cette connexion.

Pour finir, essayons de vérifier nos résultats. Trouvons le fichier de dialogue exactement à partir de la phrase « Je pense que je devrais vous remercier » dont nous avons besoin et remplaçons 4B par 4C. Nous commençons le jeu et notre ami Hugo, au lieu de cette phrase, dit de manière significative : « Ce sera mon héritage, un monument à votre échec et si vous essayez de m'arrêter, je vous garantis que tout le monde connaîtra votre secret. »

Laissons Batman là, l'étude peut être considérée comme terminée. Sous forme écrite, le processus semble rapide, mais en réalité, chaque étape peut être accompagnée d'une longue contemplation de chiffres hexadécimaux, sans aucun espoir qu'à un moment donné, ils formeront des chaînes significatives et que vous comprendrez ce qu'ils signifient. Mais parfois, cela arrive encore.

Pourquoi extraire le son d'un jeu ? Quels sont les rares sites de musique disponibles ?

Oui, le fait est que vous en aurez assez de chercher des morceaux de jeux. Et puis il y avait des jeux qui traînaient sur l'ordinateur avec de la bonne musique électronique. Juste à ce moment-là, j’avais un besoin urgent de le réaliser et de l’exprimer avec des effets sonores. J'ai donc commencé à réfléchir à l'opportunité de supprimer le son du jeu. Le jeu était au format Java pour téléphone mobile et ne pouvait pas être ouvert facilement dans son répertoire, ni via aucun programme.

Désormais, extraire le son des jeux ne me pose plus de problème. Un programme puissant m'a aidé avec ça UniExtracteur(télécharger) Il est conçu pour extraire les archives endommagées telles que -7zip, WinRAR et autres fichiers compressés. Eh bien, les installateurs du programme eux-mêmes décompactent sans problème. Et le jeu Java est précisément l'installateur. Après avoir déballé un jeu simple, j'ai essayé d'extraire le son d'un jeu plus complexe. Le programme UniExtractor gère également les jeux pour le système d'exploitation Android. Le déballage prend très peu de temps. Environ une minute. Pendant ce temps, il est peu probable que vous ayez trouvé un son approprié sur Internet. Passons aux choses sérieuses.

Extraire le son du jeu

Pour décompresser, comme je l'ai mentionné ci-dessus, nous utiliserons un décompresseur d'archives spécial - Uniextracteur. Le programme n'a pas besoin d'être lancé séparément, il suffit de cliquer avec le bouton droit sur le programme d'installation du jeu. Dans le menu contextuel, sélectionnez l'élément- Extraire avec Uniextracteur.

Processus de déballage.

Maintenant, nous pouvons voir deux fichiers portant le même nom. Le premier est le programme d'installation du jeu lui-même et le second est le programme d'installation décompressé, sous la forme d'un dossier contenant des fichiers. Ouvrez le dossier et cherchez-en un autre, avec le nom application .

Dans ce dossier, il y en a deux autres, avec des fichiers audio. Ils peuvent être appelés différemment. Mais généralement c'est Musique Et Son.En général, s'ils ne sont pas là, vous devrez alors revoir tous les dossiers.

Je veux te rendre heureux. Tous les jeux n'ont pas ce problème. Certains jeux décompressés contiennent le format audio, qui peut être immédiatement écouté sur le lecteur.

Il est utile de savoir :




Des questions ?

Signaler une faute de frappe

Texte qui sera envoyé à nos rédacteurs :