Des actualités personnelles sous un style impersonnel, et inversement.
Follow @Thomas_Jannaud
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.
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.
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, ...
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).
Ce sont donc les variations de volume et non pas le volume qui obligent le haut parleur à vibrer et donc à produire du son.
quoi | sur combiens d'octets | Description |
---|---|---|
RIFF | 4 | "RIFF" écrit en toutes lettres |
taille + 32 | 4 | taille = nombre d'échantillons * nb octets par échantillon |
WAVfmt | 8 | "WAVfmt " en toutes lettres aussi, avec un espace à la fin pour faire 8 caractères |
16 | 4 | 16, mais pas en caractères ! Donc 0x1000 en hexadécimal (inversion d'octets) et sur 4 octets. Mais l'ordinateur le fait tout seul ^^ |
1 | 2 | Idem. Indique que notre fichier est de type "PCM". |
1 ou 2 | 2 | Suivant que l'on veut mono ou stéréo |
nb d'échantillons par seconde | 4 | Nombre d'échantillons par seconde. Typiquement 44100 (ou 22050 ou 88200) suivant la qualité du fichier et sa taille |
Nb d'octets par seconde | 4 | =nb échantillons/seconde * nb octets/échantillon |
1 ou 2 | 2 | Nb d'octets par échantillon sur voie 1 |
1 ou 2 | 2 | Nb d'octets par échantillon sur voie 2 |
data | 4 | "data" écrit en toutes lettres |
taille | 4 | 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.