Toutes les pages de formats ↓
Graphismes et médias

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

  1. Déposez un nouveau WAV dans sounds/ (mono, 22 050 Hz, 8 bits recommandés) :

    mymod/sounds/cmdsel_grunt.wav
  2. Ajoutez un nouvel événement dans gamedata/sound.tdf :

    [ARM_COM]
    {
        select1=cmdsel1;       // Existing
        select2=cmdsel_grunt;  // Your new line, randomly selected
    }
  3. Aucune modification du FBI n'est nécessaire : la référence existante SoundCategory=ARM_COM suffit.

  4. 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 .wav est 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 pour music/*.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.tdf et les champs de sons des armes.
  • Interface de TA: Kingdoms — les widgets .gui font référence aux événements sonores de l'interface.
  • Glossaire — catégorie de sons.