Site Perso de

Thomas JANNAUD

Des actualités personnelles sous un style impersonnel, et inversement.



Fichiers Wav
Format, spécifications et code source C++ générant un .wav 13 Janvier 2009

Il y a souvent des petites barres qui oscillent très vite quand on écoute de la musique. Sauriez-vous dire ce qu'elles représentent ? Le volume ? La fréquence ?

La documentation ne foisonne pas vraiment sur ce sujet pourtant passionnant. Et oui, on écoute tous de la musique sur son ordinateur, mais on ne sait jamais trop comment est-elle codée. Et quand bien même on se pose la question, trouver la réponse n'est pas simple.
A priori, un son est une fréquence et un volume, et cela nécessite donc a priori 2 dimensions pour le codage : enregistrer pour chaque milliseconde d'une musique quelle est sa fréquence et son volume.

Je vais vous expliquer comment fonctionne le principe de base du codage de musique avec le format wav (+ échantillons à télécharger pour comprendre), avant de passer aux formats plus compliqués.

Le format wav

Ce format est le plus intuitif : il ne cherche pas à compresser des données (3 minutes = 20 Mo), par contre on peut comprendre très facilement son fonctionnement.

L'intuition

La réponse aux questions citées plus haut est qu'il suffit en fait de coder le volume à chaque "instant", et que cela crée naturellement une fréquence. Pour faire simple, un fichier wav, c'est une suite d'octets. Le lecteur lit les octets un par un, et chaque octet donne le volume pendant 0.1 millisecondes. Un octet peut représenter un nombre entier entre 0 et 255.

Pour créer une fréquence, il faut mettre du volume, puis ne rien mettre, puis remettre du volume, puis rien... et l'oreille va naturellement entendre juste une fréquence à un certain volume. L'ordre de grandeur est par exemple de 0.1 ms pour du volume, puis 0.1 ms pour rien, et ainsi de suite. Pour faire varier la fréquence on peut faire 0.2 ms du volume, 0.2 ms rien, ...

Exemples

Le meilleur moyen pour comprendre comment ça marche, c'est de coder soi-même un fichier, et de voir ce que ça donne (cf Format précis du fichier wav) :

N.B : j'ai dit 0.1 ms pour simplifier et donner des chiffres ronds. En réalité l'unité de durée de base vaut 1/44100 secondes (soit 0.02 ms environ). Mais dans les fichiers, j'ai effectivement mis 200 en volume sur n fois cette durée d, (donc sur n octets à la suite) puis 100 sur n fois d, et j'ai répété ces séries un grand nombre de fois (une centaine).

Explications

Ce sont donc les variations de volume et non pas le volume qui obligent le haut parleur à vibrer et donc à produire du son.

Format précis du fichier wav

quoisur combiens d'octetsDescription
RIFF4"RIFF" écrit en toutes lettres
taille + 324taille = nombre d'échantillons * nb octets par échantillon
WAVfmt8"WAVfmt " en toutes lettres aussi, avec un espace à la fin pour faire 8 caractères
16416, mais pas en caractères ! Donc 0x1000 en hexadécimal (inversion d'octets) et sur 4 octets. Mais l'ordinateur le fait tout seul ^^
12Idem. Indique que notre fichier est de type "PCM".
1 ou 22Suivant que l'on veut mono ou stéréo
nb d'échantillons par seconde4Nombre d'échantillons par seconde. Typiquement 44100 (ou 22050 ou 88200) suivant la qualité du fichier et sa taille
Nb d'octets par seconde4=nb échantillons/seconde * nb octets/échantillon
1 ou 22Nb d'octets par échantillon sur voie 1
1 ou 22Nb d'octets par échantillon sur voie 2
data4"data" écrit en toutes lettres
taille4 des données qui suivent = la même que celle à la 2eme ligne sans 32
échantillons?Chaque échantillon. Donc volume de chaque échantillon sur le nb d'octets prédéfini en alternant voie 1 et voie 2 s'il y a 2 voies.

Pour faire simple on aura donc RIFF, n*44100 + 32, WAVmft , 16, 1, 1, 44100, 1, 1, 1, data, puis n*44100 octets décrivant le volume sur chaque 1/44100 ème de seconde.

Lorsque le volume est sur 2 octets (pour plus de précision) il faut donner un nombre entre -32767 et 32767, et entre 0 et 255 quand c'est sur un octet.

Source C++ du programme générant les fichiers son précédents

À lire aussi :
Laissez un commentaire !

Pas besoin de vous connecter, commencez à taper votre nom et une case "invité" apparaîtra.