WAV — effets sonores et câblage des banques de sons
Source : coreprime/kbot @ 0ab97bf · Modifier sur GitHub
Les effets sonores de Total Annihilation (voix des unités, impacts d'armes, clics de l'interface) sont de simples fichiers WAV PCM 8 bits / 16 bits — le conteneur n'a rien de propre à TA. La partie intéressante est le câblage : la façon dont les FBI des unités, les TDF des armes et l'interface globale acheminent des noms de fichiers vers le bus audio, à travers trois niveaux d'indirection.
Tip
Essayez vous-même.
# Play one directly
ls $(kbot ctx path)/sounds/ | head
afplay $(kbot ctx path)/sounds/cmdsel1.wav # macOS
aplay $(kbot ctx path)/sounds/cmdsel1.wav # Linux
# The web UI also previews WAV/MP3 inline
kbot mount $(kbot ctx path) --server
Sur le disque : du WAV, tout simplement
Les fichiers WAV se trouvent dans sounds/. Ils suivent le format RIFF
WAVE standard : tout ce qui lit des WAV lit ceux-ci. kbot ne les analyse pas
comme un format particulier ; l'explorateur les confie à l'élément <audio>
du navigateur.
Encodage typique des fichiers livrés par Cavedog :
| Propriété | Valeur |
|---|---|
| Fréquence d'échantillonnage | 22 050 Hz (la plupart), 11 025 Hz (certains clics de l'interface) |
| Profondeur | PCM 8 bits non signé |
| Canaux | Mono |
| Durée | 0,1–3 secondes |
| Taille du fichier | 5 Ko – 200 Ko |
Des mods livrent parfois des échantillons stéréo 16 bits ; le moteur les accepte, mais ils coûtent plus de mémoire.
Les trois niveaux de câblage
Chercher « ce qui se joue quand on sélectionne le commandant Arm » suit cette chaîne :
FBI gamedata/sound.tdf sounds/
┌─────────────┐ ┌───────────────────────┐ ┌──────────────┐
│ units/ │ │ [ARM_COM] │ │ cmdsel1.wav │
│ armcom.fbi │ │ { │ │ │
│ │ ──▶ │ select1=cmdsel1; │ ──▶│ │
│ Sound │ │ ok1=cmdok1; │ │ │
│ Category= │ │ ... │ │ │
│ ARM_COM; │ │ } │ │ │
└─────────────┘ └───────────────────────┘ └──────────────┘
1. FBI picks 2. sound.tdf maps 3. WAV file
a category event → filename on disk
Niveau 1 — SoundCategory dans le FBI
Le FBI d'une unité nomme une catégorie :
[UNITINFO]
{
UnitName=ARMCOM;
SoundCategory=ARM_COM; // ← points at [ARM_COM] in sound.tdf
...
}
Les catégories sont partagées entre unités : toutes les variantes du commandant Arm, ou tous les K-bots Arm, pointent sur la même catégorie, pour que les voix de sélection restent cohérentes au sein d'un camp.
Niveau 2 — gamedata/sound.tdf
Le TDF associe, au sein d'une catégorie, des événements du moteur à des noms de fichiers WAV :
[ARM_COM]
{
select1=cmdsel1; // Selecting the unit
ok1=cmdok1; // Movement order acknowledged
arrived1=cmdarvd1; // Reached destination
cant1=cantdo4; // Order rejected ("I can't do that")
underattack=warning1; // Took damage
count5=count1; // Commander self-destruct countdown (5)
count0=count6; // …countdown (now)
canceldestruct=cancel2;
}
Remarquez le suffixe 1 de la plupart des noms d'événements. Chaque
événement peut avoir une famille de choix : la clé simple (select) et les
clés numérotées select1, select2, select3, … ; le moteur en choisit une
au hasard pour varier. Si seul select1 est défini, c'est toujours la même
réplique qui est jouée.
Pour chaque événement, TA 3.1c lit la clé simple si elle est présente, puis
KEY1, KEY2, … jusqu'au premier numéro manquant : avec
select1=kbarmsel; select3=kbarmse2;, seul kbarmsel est joué, car
l'absence de select2 met fin à la liste. (L'absence de la clé simple
n'arrête pas les clés numérotées.) Une valeur vide est un choix silencieux.
Les clés qui ne correspondent à aucun des événements ci-dessous ne sont
jamais jouées.
Niveau 3 — sounds/<name>.wav
La valeur du TDF est la racine du nom (sans l'extension .wav). Le
moteur cherche sounds/<stem>.wav dans le système de fichiers virtuel.
Important
Le suffixe .wav est implicite. Si vous écrivez
select1=cmdsel1.wav dans le TDF, le moteur cherchera
sounds/cmdsel1.wav.wav et ne jouera rien, en silence.
Clés d'événements standard
TA 3.1c lit 23 événements dans la catégorie de sons d'une unité, chacun sous
forme de clé simple plus la famille numérotée décrite plus haut (ok,
ok1, ok2, …) :
| Événement | Quand il se déclenche |
|---|---|
select |
L'unité est sélectionnée. |
underattack |
L'unité subit des dégâts. |
activate / deactivate |
Interrupteur marche/arrêt (radar, brouilleur, fortifications). |
ok |
Ordre accepté. |
arrived |
L'unité termine un déplacement. |
cant |
Ordre refusé (terrain, file de construction, etc.). |
unitcomplete |
L'unité a fini d'être construite. |
build |
Un constructeur commence à construire. |
repair |
Un constructeur commence à réparer. |
working |
Un constructeur récupère ou ressuscite. |
load / unload |
Un transport embarque / dépose une unité. |
cloak / uncloak |
L'unité se camoufle / sort du camouflage (les commandants). |
capture |
Le commandant ou une unité capable de capturer commence une capture. |
count5 … count0 |
Étapes du compte à rebours d'autodestruction. |
canceldestruct |
Autodestruction annulée. |
Chaque clé peut avoir une entrée KEYtext correspondante (select1text)
qui contient le sous-titre de la réplique. Les autres clés de la catégorie
sont ignorées.
La visionneuse d'unités et le bac à sable de KBot Studio suivent les mêmes
règles : les métadonnées de l'unité (/api/studio/unit/{name}) portent
exactement les clés que le jeu joue pour ces événements, et chaque événement
joue l'une de ses clés au hasard.
Sons de l'interface — allsound.tdf
Les événements de l'interface (clics de boutons, transitions de menus,
jingles de fin de partie) sont associés de la même façon, mais se trouvent
dans des sections de type [GLOBAL_*] de gamedata/allsound.tdf :
[BIGBUTTON] { sound=butmain1; }
[SMLBUTTON] { sound=button1; }
[SKIRMISH] { sound=butnskir; }
[BGM] { sound=drone2; } // Background music ID
Les fichiers .gui des menus font référence à ces sections par leur nom.
Pour changer le son du clic sur le bouton « Skirmish », il suffit de
modifier ce TDF — sans toucher aux .gui.
Sons des armes
Les TDF d'armes (TDF) portent directement leurs propres clés de sons, sans niveau d'indirection :
[LIGHTLASER] {
...
soundstart=lasrmas1; // On fire
soundhit=lasrhit1; // On impact
soundwater=splshbig; // On water hit (overrides soundhit)
soundtrigger=1; // Play soundstart on each burst pulse, not just first
}
La même recherche sounds/<stem>.wav s'applique. Les sons des armes sont
réglés tir par tir : si vous changez l'arme d'une unité, il faudra aussi
régler à nouveau les niveaux sonores dans le TDF de l'arme.
Exemple commenté — ajouter une nouvelle voix de sélection
Déposez un nouveau WAV dans
sounds/(mono, 22 050 Hz, 8 bits recommandés) :mymod/sounds/cmdsel_grunt.wavAjoutez un nouvel événement dans
gamedata/sound.tdf:[ARM_COM] { select1=cmdsel1; // Existing select2=cmdsel_grunt; // Your new line, randomly selected }Aucune modification du FBI n'est nécessaire : la référence existante
SoundCategory=ARM_COMsuffit.Empaquetez et testez :
kbot hpi pack ./mymod --target mymod.ufo
Le moteur alternera désormais entre cmdsel1.wav et cmdsel_grunt.wav
quand le commandant est sélectionné.
Tailles typiques
| Ressource | Plage observée dans les ressources de Cavedog |
|---|---|
| Réplique vocale d'unité | 5–60 Ko |
| Impact d'arme | 5–30 Ko |
| Explosion | 30–120 Ko |
| Boucle musicale | 100 Ko – 1 Mo |
gamedata/sound.tdf |
~20 Ko (plus de 300 catégories) |
gamedata/allsound.tdf |
~6 Ko |
Pièges
Warning
Un WAV manquant donne du silence, pas une erreur. Écrivez par erreur
select1=cmsdel1 (lettres interverties) et le moteur ne joue tout
simplement rien à la sélection — pas de message dans le journal, pas de
son de repli. Testez toujours en jeu les sons modifiés.
- L'extension
.wavest implicite : ne l'écrivez jamais dans la valeur du TDF. - La fréquence d'échantillonnage compte. Les sons joués en dehors de 8 kHz / 11,025 kHz / 22,05 kHz / 44,1 kHz peuvent saccader sur les chemins matériels de l'époque Windows 9x que certains moteurs d'origine utilisent encore. 22 050 Hz mono est le choix par défaut sans risque.
- Les WAV stéréo sont réduits en mono par le moteur. Ne livrez pas de stéréo sans raison spatiale précise.
- Des MP3 dans
sounds/: le moteur y ignore les MP3. Le lecteur de musique a un chemin de code distinct pourmusic/*.mp3. - Cavedog livre certains WAV en PCM 16 bits avec des fréquences d'échantillonnage bizarres (par ex. 7 000 Hz) : ils fonctionnent quand même, mais si vous écrivez un outil qui suppose du 22 050/8/mono, vous trébucherez dessus.
Voir aussi
- TDF — le format qu'utilisent
sound.tdf,allsound.tdfet les champs de sons des armes. - Interface de TA: Kingdoms — les widgets
.guifont référence aux événements sonores de l'interface. - Glossaire — catégorie de sons.