Lycée Jean Vilar - Villeneuve lez Avignon
Page d'accueil Le site académique
Le site du lycée Espace Numérique de Travail
Le lycée
  Le lycée Jean Vilar
  Archives
  Art et culture
  Association Sportive
  Blogs
  CDI
  Développement durable
  Enseignements
  Espace enseignants
  Espace lycéens
  Espace parents
  Grand oral
  Journal du lycée
  Marchés publics
  Orientation
  Projet d'établissement
  Spécialités
  TICE
  Un lycée européen
  Voyages
  Webradio













Nouvelle page 1
Jean Vilar
Son pur et son complexe
Python  

Des exemples pour apprendre


Modules à importer :
          pylab  pour utiliser les fonctions mathématiques et créer des graphiques
          pygame  pour gérer les sons et le clavier
          wave  pour enregistrer le fichier son

Avec ce programme :
- on définit des fonctions avec  def 
- on déclare une variable globale avec  global 
- on remplit un tableau de « 0 » avec  zeros() 
- on parcourt une liste avec  for...in range(...) 
- on gère les évènements avec  event 
- on conrôle l'exécution avec  _running 
- on crée un son avec  sndarray.make_sound 
- on joue un son avec  play() 

Attention : le fichier générer se trouvera à la racine du disque C. Si vous n'avez pas l'autorisation d'écriture ou si vous préférez un autre emplacement, modifier l'adresse à la ligne 34 du code.

Le code

from pylab import *
import pygame
from pygame.locals import *
import wave

frequence = 440
nbBits = 16
ampli = 2**(nbBits - 1) - 1
sample_rate = 44100

pygame.mixer.pre_init(44100, nbBits, 2)
pygame.init()

# Cette fonction gère l'interface pygame
size = (400, 100)
fenetre = pygame.display.set_mode(size, pygame.HWSURFACE | pygame.DOUBLEBUF)
fenetre.fill((40,80,120))
font=pygame.font.Font(None, 36)
monTexte = font.render("Fréquence : " + str(frequence) + " Hz",1,(255,255,255))
fenetre.blit(monTexte,(10, 10))
font=pygame.font.Font(None, 24)
monTexte = font.render("Son pur à gauche et complexe à droite.",1,(250, 180, 0))
fenetre.blit(monTexte,(10, 40))
pygame.display.set_caption("Créer un fichier son")
pygame.display.flip()

# Cette fonction génère le son

duration = 200 / frequence
n_samples = int(round(duration*sample_rate))
# On crée un tableau 2D et on le remplit de zéros
buf = zeros((n_samples, 2), dtype = int16)

# On enregistre le son dans un fichier
AdrFichier = "C:\pur_complexe.wav" # Adresse modifiable
Fson = wave.open(AdrFichier,"w")
# Création de l'entête
parametres = (2, 2, sample_rate, n_samples, "NONE", "not compressed")
Fson.setparams(parametres)

for s in range(n_samples):
    t = float(s)/sample_rate
    # On complète le tableau pour l'oreille gauche : son pur ƒ
    buf[s][0] = int(round(ampli*sin(2*math.pi*frequence*t)))
    # Oreille droite = son complexe ( ƒ + 2ƒ)
    buf[s][1] = int(round(0.6*ampli*sin(2*math.pi*frequence*t)))
    buf[s][1] += int(round(0.4*ampli*sin(2*math.pi*2*frequence*t+0.3)))
# Le tableau devient un son
sound = pygame.sndarray.make_sound(buf)
sound.play()

# on le place dans le fichier que l'on ferme
Fson.writeframes(buf)
Fson.close()

# on le dit !
monTexte = font.render("Le fichier est enregistré : " + AdrFichier,1,(0, 180, 0))
fenetre.blit(monTexte,(10, 60))
pygame.display.flip()

_running = True

# La fin du code gère la sortie du programme
while _running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            _running = False
            break
pygame.quit()

Le résultat :

Capture d'écran Audacity du son généré