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
Soirées pas folles au Japon
les pires choses ont une fin
Maï nitchi no seikatsu (毎日の生活)
Ma vie de tous les jours
Premiers pas au Japon
Début de mon voyage linguistique
Le Japon et les Japonais
Quelques préjugés tombent
Pharmacie japonaise
mode d'emploi
Le chômage pour tous
La solution finale
2012
'Non, non, rien n'a changé...'
San Francisco
balade en vélo
Mes journées
ce n'est pas du gâteau
10 jours au Costa Rica
"Pura vida" et bénévolat
Quitter l'appart de Judy…
et aussi : suite et fin du Super Cluedo
Débuts sur un Mac
Tout ce qu'il faut savoir, logiciels gratuits indispensables, ...
La Californie, l'incendie et les zombies
En Californie, on ne joue pas avec le feu
Tokyo !!
arrivée à Tokyo
Acheter un vtt
Pour rouler sans se faire rouler
Guatemala - Côte Caribéenne et culture Afro
Little Miami et rythme reggae