Format WAV.
Sommaire des publications Page d'accueil du site VB-AUDIO Audio Mechanic & Sound Breeder
Langage : Anglais Langage : Francais

Les fichiers WAV sont devenus un standard dans le monde du PC. Il est donc primordiale de savoir travailler avec ce type de fichier si l’on veut pouvoir transformer le son. Le format WAV est un fichier suivant la norme R.I.F.F. (Resource Interchange File Format). Un fichier de format R.I.F.F. est un fichier formé de différentes parties appelées CHUNK. Un CHUNK est en fait un descripteur de fiches ayant la structure suivante :

Structure d’un CHUNK

char FOURCC[4] Identificateur du CHUNK
DWORD size Taille du buffet suivant en octets
BYTE data[size] Les données de la fiche.

REM : la taille d’un CHUNK est donc de « size »+8. « size » ne donne que la taille du tableau « data ».

Un fichier RIFF commence toujours par le premier CHUNK appelé CHUNK RIFF. Il commence à l’adresse 0 du fichier et a une structure de taille fixe. Le CHUNK RIFF est l’exception qui confirme la règle car le champ « size » donne la taille du fichier entier en octets et non pas la taille de la fiche comme c’est le cas d’habitude.

Structure du CHUNK RIFF
Adresse 0 ‘RIFF’ Les 4 premiers caractères d’un fichier RIFF sont ceux là.
Adresse 4 Filesize Taille du fichier en octets
Adresse 8 ‘WAVE’ Identificateur du type de RIFF (ici Wave)

Par conséquent, ce premier CHUNK nous permettra de vérifier que nous sommes en présence d’un fichier RIFF d’une part, et que ce fichier contient bien un son au format WAV, d’autre part. Tout de suite après le CHUNK RIFF (c’est à dire à l’adresse 12) se trouve le premier vrai CHUNK.

Dans un fichier RIFF en général, de type WAVE en particulier, il peut y avoir différents CHUNK placés dans un ordre quelconque. Microsoft fournit dans son API Windows des fonctions (MMIO) qui permettent de se déplacer de CHUNK en CHUNK afin que l’on puisse trouver les informations qui nous intéressent. En effet, dans un fichier WAVE, de nombreux types de CHUNK peuvent être présents : Informations Copyright, informations Cue Point etc... Les deux CHUNK qui nous intéressent sont les CHUNK « fmt » et « data ». Pour plus d’informations sur les formats de fichiers en général et le format WAV en particulier, le site http://www.wotsit.org fait autorité en la matière.

Le CHUNK « fmt »
char FOURCC[4] ‘f’,’m’,’t’,’ ‘ (ne pas oublier l’espace)
DWORD size variable
BYTE data[size] descripteur de format du son.

Les formats WAV sont eux même divers. De plus, la taille de ce descripteur de format de son WAV est variable. Nous parlerons donc du format le plus courant (PCMWAVEFORMAT définis par Microsoft). Ceci dit, il faudra prévoir une structure dynamique pour de la lecture du CHUNK « fmt ».

PCMWAVEFORMAT.

La structure PCMWAVEFORMAT (qui pourrait être simplifiée...) est décrite ci-dessous (vous pourrez la trouver dans le header MMREG.H).

typedef struct {
    WORD  wFormatTag;
    WORD  nChannels;
    DWORD nSamplesPerSec;
    DWORD nAvgBytesPerSec;
    WORD  nBlockAlign;
} WAVEFORMAT;

typedef struct {
    WAVEFORMAT wf;
    WORD       wBitsPerSample;
} PCMWAVEFORMAT;

signification des champs
offset Type Nom Signification
0000 WORD wFormatTag type de format (ici la valeur 1 matérialisée par la macro pré définie suivante #define WAVE_FORMAT_PCM 1).
0002 WORD nChannels nombre de canaux :
- 1 pour un son MONO
- 2 pour un son stéréo.
0004 DWORD nSamplesPerSec Nombre d’échantillons par seconde. Les valeurs normalisées sont les suivantes 11025, 22050, 44100, éventuellement 48000 et 96000.
0008 DWORD nAvgBytesPerSec Correspond au nombre d’octets par seconde et se calcule selon la formule (nSamplesPerSec x nBlockAlign).
000C WORD nBlockAlign Taille d’un échantillon (canaux cumulés) en octets.(par exemple pour un son stéréo 16bits, ce champ est égal à 4).
000E WORD wBitsPerSample Taille en bits d’un échantillon sur un seul canal. 8, 16, 24.

REM : Le nombre de bits pour un échantillon peut se déduire facilement par la formule (nBlockAlign / nChannels) par exemple. Cette déduction est d’autant plus conseillée que le dernier champ « wBitsPerSample » n’est pas très cohérent et dans certains cas est absent de la structure « fmt ».

Le CHUNK « data »
char FOURCC[4] ‘d’,’a’,’t’,’a‘
DWORD size nombre de BYTE du son (taille en octets)
BYTE data[size] données du son.

Une fois que vous connaissez les informations du CHUNK « fmt », vous savez comment sont organisées les données concernant le son. Les données du son, les échantillons, sont alignés les uns après les autres dans l’axe des temps (dans l’ordre où ils arrivent dans le temps). En stéréo, les canaux sont multiplexés (entrelacés). Ce multiplexage offre deux avantages : lecture/écriture des deux canaux en une seule opération disque (évite surtout les déplacements de têtes du disque) et l’augmentation aisée du nombre de canaux tout en restant dans la norme du format (par exemple un format quadriphonique)

fig 1

fig 1 : exemple de stockage des samples pour un son stéréo 8bits ou 16 bits stéréo.



CODAGE DES ECHANTILLONS :

Le codage est différent en 8 bits et en 16 bits. En 16bits, le mot est conforme à un entier signé 16bits (-32768, +32767) centré sur zéro. En 8 bits, l’octet est en fait un BYTE (0 - 255) centré sur 128. Pour transformer ce BYTE en entier signé par exemple, il faudra lui retrancher la valeur 128. Nous aurons alors un entier (-128 à +127) centré sur zéro correspondant ainsi au signal réel (devant être traité).

REM : ces formats de données sont en fait conformes au format de données que la plupart des cartes sons attendent. Dans tous les cas, le CHUNK « data » est prêt à être envoyé vers le drivers multimédia (Windows compatible) de la carte son, sans traitement préalable.


Sommaire des publications Page d'accueil du site VB-AUDIO

Copyright V.Burel ©1998-2004. Tous droits réservés. Toute spécification technique et toute information produits, spécifiées dans ce site web peuvent subir des modifications sans préavis.