4.1 RESTITUER UN SON

 

 

INTRODUCTION

 

Pour pouvoir traiter un signal sonore dans un ordinateur, il est nécessaire de le digitaliser au préalable. Pour ce faire, on utilise un convertisseur analogique-numérique pour l’échantillonner à intervalles de temps réguliers en convertissant la valeur mesurée à chaque instant d’échantillonnage en une valeur numérique. Le son est ainsi transformé en une suite de nombres que l’on peut stocker et traiter au sein de l’ordinateur. La fréquence d’échantillonnage (ou taux d’échantillonnage) est le nombre d’échantillons enregistrés par seconde. Pour le format audio WAV, les taux d’échantillonnages sont standardisés et figurent parmi les valeurs suivantes : 8000, 11025, 16000, 22050 et 44100 Hertz. Plus la fréquence d’échantillonnage est élevée, meilleure sera la qualité de la restauration sonore avec un convertisseur numérique-analogique. La plage de valeurs des échantillons est également d’une grande importance pour la qualité. Dans la bibliothèque sonore de TigerJython, les valeurs sont toujours stockées dans des listes de nombres entiers codés sur 16 bits, ce qui correspond à l’intervalle (-32768 and 32767).

Il faut également déterminer si l’on parle d’un son monaural (mono) ou binaural (stéréo) qui utilise un, respectivement deux canaux. Lors de l’utilisation de deux canaux (stéréo), les valeurs pour le canal de gauche et celui de droite sont stockées comme deux nombres consécutifs dans la liste d’échantillons.

Pour suivre ce chapitre, vous devrez vous équiper d’un ordinateur muni d’une carte son, d’écouteurs ou de haut-parleurs permettant de restituer les sons et d’un micro permettant d’effectuer des enregistrements.

CONCEPTS DE PROGRAMMATION: Digitalisation du son, signal audio, échantillon, taux d’échantillonnage

 

 

ÉCOUTER DES SONS

 

Pour profiter du programme suivant, il faut commencer par trouver sur Internet un petit clip sonore de quelques secondes au format WAV. Le clip sonore doit se situer dans un fichier nommé mysound.wav dans le même dossier que votre programme Python.

Dans le programme ci-dessous, on commence par importer toutes les fonctions de la sound library. On stocke ensuite dans la liste samples les échantillons sonores lus depuis le fichier et on affiche dans la console window, les informations de format du fichier audio puisqu’il est nécessaire de connaître le taux d’échantillonnage pour permettre une restitution correcte. Dans l’exemple ci-dessous, le taux d’échantillonnage est de 22050 Hz. La fonction openMonoPlayer permet d’effectuer la restitution sonore. Si le son est rejoué avec un taux d’échantillonnage incorrect, il sera joué à une vitesse différente et, de ce fait, avec d’autres fréquences.

from soundsystem import *

samples = getWavMono("mysound.wav")
print(getWavInfo("mysound.wav"))

openMonoPlayer(samples, 22050)
play()
Sélectionner le code (Ctrl+C pour copier, Ctrl+V pour coller)

 

MEMENTO

 

La fonction getWavMono() permet de charger dans une liste les échantillons présents dans un fichier WAV. Chaque valeur lue sera un nombre entier compris entre -32768 et 32767. La fonction openMonoPlayer() est un lecteur de sons permettant de jouer les sons avec la fonction play().

Du fait que la longueur des listes est limitée par la capacité de la mémoire vive de l’ordinateur, la fonction getWavMono() ne permet de lire que des clips audio relativement courts.

 

 

ONDE SONORE

 

Il est intéressant de représenter graphiquement les échantillons sonores. Pour ce faire, on utilise simplement une fenêtre GPanelet l’on parcourt la liste des échantillons à l’aide d’une for loop.

 


from soundsystem import *

samples = getWavMono("mysound.wav")
print(getWavInfo("mysound.wav"))
openMonoPlayer(samples, 44100)
play()

from gpanel import *

makeGPanel(0, len(samples), -33000, 33000)
for i in range(len(samples)):
    draw(i, samples[i])
Sélectionner le code (Ctrl+C pour copier, Ctrl+V pour coller)

 

 

MEMENTO

 

Il est nécessaire de choisir le système de coordonnées du GPanel de manière appropriée. Les valeurs affichées dans la direction de l’axe Ox sont comprises entre 0 et le nombre d’échantillons, déterminable à partir de la longueur de la liste d’échantillons. Les valeurs de l’axe Oy sont comprises entre -32768 et 32767, ce qui explique que l’on utilise une plage de plus ou moins 33000.

 

 

LA VOIE DE LA FACILITÉ

 

Dans le cas où l’on ne s’intéresse qu’à jouer un fichier son, il suffit de trois lignes de code qui permettent d’ailleurs même de jouer des sons de longue durée, comme votre chanson favorite.

from soundsystem import *

openSoundPlayer("myfavoritesong.wav")
play()
Sélectionner le code (Ctrl+C pour copier, Ctrl+V pour coller)

 

 

MEMENTO

 

La distribution TigerJython met également à disposition une bibliothèque de plusieurs clips sonores dont les noms sont listés dans la table ci-dessous :

 Fichier son  Description
 wav/bird.wav  Chant d’oiseau
 wav/boing.wav  Rebond
 wav/cat.wav  Miaulement (cri) de chat
 wav/click.wav  Clic de souris
 wav/dummy.wav  Son vide
 wav/explode.wav  Explosion
 wav/frog.wav  Coassement de grenouille
 wav/mmm.wav Meuglement de vache
 wav/notify.wav  Son de notification
 wav/ping.wav  Bing ressemblant comme deux gouttes d’eau à celui de MS Windows

Cette liste de clips sonores est constamment étoffée. S’il s’avère qu’il existe dans le dossier de votre programme un fichier portant l’un des noms listés ci-dessus, il aura la priorité par rapport aux clips de TigerJython.

Le lecteur sonore dispose de nombreuses commandes de contrôle, à la manière des lecteurs professionnels. Il est par exemple possible de mettre la lecture en pause avec la fonction pause() et de la reprendre par la suite avec la fonction play().

La longueur du son restitué n’est pas limitée avec ces fonctions car il n’est pas chargé en entier dans la mémoire de l’ordinateur. Bien au contraire, il est lu en streaming, à savoir par petits paquets.

 play() Lit un son depuis la position de lecture courante et retourne immédiatement
 blockingPlay() Idem mais en attendant que la lecture soit terminée pour retourner (fonction bloquante)
 advanceFrames(n) Saute depuis la position actuelle en avançant de n échantillons
 advanceTime(t) Depuis la position de lecture actuelle, avance de t millisecondes
 getCurrentPos() Indique la position courante de lecture au sein de la liste d’échantillons
 getCurrentTime() Indique la position temporelle actuelle de la lecture
 pause() Met la lecture en pause. La fonction play() permet de la relancer
 rewindFrames(n) Rembobine la lecture de n échantillons à partir de la position de lecture courante
 rewindTime(t) Idem, mais en reculant de t millisecondes
 stop() Arrête la lecture. La position de lecture est réinitialisée au début de l’enregistrement.
 setVolume(v) Ajuste le volume (valeur comprise entre 0 et 1000)

 

 

JOUER DES FICHIERS MP3

 

Pour jouer des fichiers audio au format MP3, il faut installer des bibliothèques supplémentaires disponibles en téléchargement depuis ce lien. Dézipper l’archive téléchargée dans le dossier Lib qu’il faut créer dans le même dossier que l’archive tigerjython2.jar s’il n’existe pas encore.

Pour jouer des fichiers MP3, il faut utiliser les fonctions openSoundPlayerMP3(), openMonoPlayerMP3() et openStereoPlayerMP3 en lieu et place de openSoundPlayer(), openMonoPlayer() et openStereoPlayer() en indiquant le chemin d’accès au fichier MP3. Pour contrôler la lecture, il faut utiliser les mêmes fonctions que pour les fichiers WAV.

from soundsystem import *

openSoundPlayerMP3("song.mp3")
play()
Sélectionner le code (Ctrl+C pour copier, Ctrl+V pour coller)

 

 

MEMENTO

 

Pour jouer des fichiers MP3, il faut se procurer des archives JAR additionnelles qu’il faut placer dans le dossier Lib du dossier racine de tigerjyton2.jar.

 

 

EXERCICES

 

1.


Expliquer pourquoi les fréquences sonores sont altérées si l’on change le taux d’échantillonnage indiqué lors de la lecture.


2.


Dans GPanel, montrer une onde sonore représentant une plage très courte (0.1 seconde) en faisant débuter la lecture à partir de 1 seconde. Expliquer l’image.


3.


Créer un lecteur sonore disposant d’un GPanel et permettant d’exécuter les commandes suivantes au clavier :

 Touche  Action
 Flèche haut  Lecture
 Flèche bas  Pause
 Flèche gauche  Rembobinage de 10 s
 Flèche droite  Avance rapide de 10 s
 Touche S  Arrêt de la lecture

Afficher la liste des commandes disponibles dans la fenêtre GPanel. Lors de chaque pression d’une touche, écrire la commande exécutée dans la barre de titre de la fenêtre.