deutsch     english    français     Imprimer

 

4.2 ÉDITION DE SON

 

 

INTRODUCTION

 

Comme vous le savez, les échantillons sonores (les valeurs d’échantillonnage du son) sont stockés dans une liste et peuvent être restitués à partir de cette liste. Si l’on veut éditer le son, il suffit donc de modifier de façon tout-à-fait habituelle la liste des échantillons.

CONCEPTS DE PROGRAMMATION: Onde rectangulaire, division entière, opérateur moduloon

 

 

RÉGLER LE VOLUME DE L’ENREGISTREMENT

 

Le programme suivant réduit le volume à 25% du volume initial. Pour ce faire, on copie la liste des échantillons vers une another list, dont toutes les valeurs sont le quart de la valeur initiale.

from soundsystem import *

samples = getWavMono("mysound.wav")
soundlist = []
for item in samples:
    soundlist.append(item // 4)

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

 

 

MEMENTO

 

Pour copier une liste, il faut tout d’abord créer une empty listet la remplir petit à petit à l’aide de append(). Afin de s’assurer que les valeurs, une fois divisées par quatre, sont encore des nombres entiers, il faut utiliser la integer division (double slash de division).

 

 

UTILISER L’INDICE DE LA LISTE

 

Dans l’exemple suivant, on parcourt la liste à l’aide de l'indice de liste et l’on hmodifier ses éléments sans créer de nouvelle liste. L’onde sonore est représentée graphiquement avant et après l’opération.

 


from soundsystem import *
from gpanel import *

samples = getWavMono("mysound.wav")

makeGPanel(0, len(samples), -33000, 33000)
for i in range(len(samples)):
    if i == 0:
        move(i, samples[i] + 10000)
    else:
        draw(i, samples[i] + 10000)

for i in range(len(samples)):
    samples[i] = samples[i] // 4

for i in range(len(samples)):
    if i == 0:
        move(i, samples[i] - 10000)
    else:
        draw(i, samples[i] - 10000)
Sélectionner le code (Ctrl+C pour copier, Ctrl+V pour coller)

 

 

MEMENTO

 

Beaucoup de programmeurs ont l’habitude de nommer i la variable qui contient l’indice de la liste. Ainsi, pour parcourir une liste, on utilise un bloc for de la manière suivante :

for i in range(10):
La variable i est aussi appelée « variable de contrôle » de la boucle ou « pas » de la boucle.

 

 

GÉNÉRER DES SONS

 

Il est assez grisant de pouvoir créer son propre son, non en le chargeant depuis un fichier préexistant, mais en créant la liste des échantillons de toute pièce. Pour créer une onde rectangulaire, il suffit de stocker une même valeur arbitraire, par exemple 5000, sur un nombre N d’échantillons et de poursuivre ensuite avec la valeur opposée, en l’occurrence -5000, sur les N échantillons suivants au sein de la liste.

from soundsystem import *

samples = []
for i in range(4 * 5000):
   value = 5000
   if i % 10 == 0:
       value = -value
   samples.append(value)

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

 

 

MEMENTO

 

Le taux d’échantillonnage de 10000 Hz correspond à la prise d’un échantillon sonore tous les 0.1 ms. Le programme change toujours de signe (-/+) toutes les 10 valeurs, à savoir tous les 1 ms. Cela correspond à une onde rectangulaire dont la période est de 2 ms, ce qui correspond à une fréquence de 500 Hz. On utilise pour ce faire l’opérateur modulo % qui retourne le reste de la division entière. La condition i % 10 == 0 est donc vraie pour i = 0, 10, 20, 30, etc.

 

 

EXERCICES

 

1.


Utiliser l’opération de liste reverse() pour jouer le son à l’envers. L’effet est particulièrement saisissant avec des enregistrements de texte parlé.


2.


L’opérateur de slicing list[start: end] permet de créer une nouvelle liste ne contenant que les éléments de la liste originale situés entre l’indice start (compris) et end (non compris). En utilisant cette astuce, supprimer une partie des échantillons d’un que vous avez sous la main.


3.


Charger un clip sonore et déterminer la valeur maximale de son amplitude. Afficher cette valeur dans la barre de titre de la fenêtre GPanel et afficher une représentation graphique de l’onde sonore. Augmenter ensuite toutes les valeurs d’échantillonnage proportionnellement de telle manière que la valeur maximale atteigne le volume maximal possible, à savoir 32767, et représenter la nouvelle onde ainsi obtenue. Il s’agit d’une fonction essentielle de tout logiciel de traitement sonore appelée « normalisation ».


4*.


Générer une onde sonore d’environ 500 Hz à un taux d’échantillonnage de 10000 Hz dont la forme est sinusoïdale. Utiliser à cet effet la fonction math.sin(x) qui est périodique de période x = 2π = 6.28. N’oubliez pas d’ajouter import math pour avoir accès à la fonction math.sin.


5*.


Superposer par addition des échantillons deux ondes sinusoïdales dont les fréquences sont très proches. Quelle observation acoustique peut-on faire en jouant le son ?