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

Laissez un commentaire !

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

Comment jouer un son en javascript / How to play a sound with javascript
In French and English
Editeur hexadécimal
Comment s'en servir + exemple avec images Bitmap
Accusé de réception / Email read notification
Activer l'accusé de réception dans Mail.
Activate the email read notification in Mail.
Couleurs
Fonctionnement des couleurs sur un ordinateur, et transformation HLS<->RGB
Snippets utiles pour iOS Cocoa - Useful Cocoa snippets
Courts et efficaces / Short and simple. In French and English
Tutoriel Cocoa / Objective-C
Bases pour créer une appli en Cocoa/Obj-C avec interface + astuces et code sources
Facebook, Google et Apple
Les startups de la Silicon Valley et leurs cafétérias : testées et approuvées !
Une année sans hiver ni été
Une start-up est née
La patrie du hamburger
Quête vers le Saint Graal
11 heures d'avion
Il peut s'en passer des choses en 11 heures...
Soirée au café-théâtre
Le Matana (Paris 5ème), un café à découvrir ?
Poupée Vaudou
Un vieux compte à régler...
Que gagne un petit programmeur d'iPhone apps ?
Arrêt sur image 1 an après le début de l'aventure.
Zombiisme
L'essayer c'est mortel
Accident
Scoop ! Verglaplanning sous mes fenêtres en photo !
Salon de l'auto
Une petite virée au salon de l'Auto 2008
Comment les journalistes nous feront voter pour Hollande
Journalisme politique
Tutoriel Java
Bases pour créer une appli en Java avec interface + astuces et code sources
Elections du PS
Snif, ma pauvre petite Ségo.
Le président parfait est une intelligence artificielle
Adieu, homme ?
BracoBrac PV : délinquant à vie
Mais que fait la police ?
Le futur d'internet
Microsoft vs Google : une bataille de titans
Tokyo is magic
Une soirée pas comme les autres
Les 100 livres à ne pas lire
Comment éviter les massacres