Accueil Cours Audio sur ESP32
🎵 Audio Intermédiaire

Audio sur ESP32

Générer des sons avec le PWM : buzzer, fréquences, notes musicales et gammes. De la physique du son à la musique programmée.

Générer un son avec le PWM

Un haut-parleur ou buzzer connecté sur une broche PWM vibre à la fréquence du signal généré. Si la fréquence est entre 20 Hz et 20 000 Hz, le son est audible.

💡 Rapport cyclique faible

Un rapport cyclique de ~4% est volontairement faible : la membrane est poussée brièvement, puis relâchée longtemps. C'est suffisant pour produire le son sans risquer de surchauffe.

Notes musicales — la gamme tempérée

En musique occidentale, le La3 (A4) = 440 Hz est la fréquence de référence (le diapason). Les 12 notes d'une octave forment une suite géométrique : chaque demi-ton multiplie la fréquence par 2^(1/12) ≈ 1,0595.

Après 12 demi-tons : fréquence × 2 = octave supérieure. La4 = 880 Hz, La5 = 1760 Hz…

Les gammes musicales

GammeIntervallesCouleur
Majeure[0,2,4,5,7,9,11,12]Joyeuse
Éolienne[0,2,3,5,7,8,10,12]Mélancolique
Lydienne[0,2,4,6,7,9,11,12]Aérienne
Dorienne[0,2,3,5,7,9,10,12]Jazzy

💡 L'effet swing

Le swing alterne des durées longues et courtes entre les notes, créant un effet rythmique. Par exemple, alterner 300 ms et 150 ms entre chaque note transforme une gamme monotone en mélodie vivante.


Exemples commentés

Chaque exemple est précédé de son contexte. Le code est affiché directement — bouton copier + lien GitHub disponibles.

🎵 Audio et son

Buzzer, fréquences, notes musicales et gammes.

1 Générer un son avec le PWM

Un haut-parleur ou buzzer connecté sur une broche PWM vibre à la fréquence du signal généré. Si la fréquence est entre 20 Hz et 20 000 Hz, le son est audible.

from machine import Pin, PWM
hp = PWM(Pin(5))
hp.duty(40)         # rapport cyclique ~4% (suffit pour un son correct)
hp.freq(1000)       # fréquence : 1000 Hz
sleep(1)
hp.deinit()         # arrêter le PWM et libérer la broche

Un rapport cyclique de ~4% est volontairement faible : la membrane est poussée brièvement, puis relâchée longtemps. C'est suffisant pour produire le son sans risquer de surchauffe.

haut-parleur-son.py — Son simple — choix de la fréquence .python
cours-exemples/audio/haut-parleur-son.py
15 lignes GitHub
from  machine import * # on importe toutes les classes du module machine
from time import sleep

hp = PWM(Pin(5))       # creation de l'instance hp de la classe PWM
hp.duty(0)             # rapport cyclique 0 sur 1023 : on arrete le son

frequence = int(input("Quelle frequence voulez-vous generer ? : ")) 

hp.duty(40)            # rapport cyclique a 40 sur 1023, soit environ 4%
hp.freq(frequence)     # la frequence est mise a la valeur choisie
sleep(1)               # on genere le signal durant une seconde
hp.deinit()            # on libere les ressources du PWM -> arret 
    

2 Notes musicales — la gamme tempérée

En musique occidentale, le La3 (A4) = 440 Hz est la fréquence de référence (le diapason). Les 12 notes d'une octave forment une suite géométrique : chaque demi-ton multiplie la fréquence par 2^(1/12) ≈ 1,0595.

Après 12 demi-tons : fréquence × 2 = octave supérieure. La4 = 880 Hz, La5 = 1760 Hz…

# Générer les 13 notes d'une octave (La4 = 880 Hz)
liste_freq = [int(2**(x/12)*880) for x in range(0, 13)]
# [880, 932, 988, 1047, 1109, 1175, 1245, 1319, 1397, 1480, 1568, 1661, 1760]

Une gamme est une sélection de 7 notes dans l'octave. Chaque gamme produit une couleur émotionnelle différente :

  • Majeure [0,2,4,5,7,9,11,12] → joyeuse
  • Éolienne [0,2,3,5,7,8,10,12] → mélancolique
  • Lydienne [0,2,4,6,7,9,11,12] → aérienne
  • Dorienne [0,2,3,5,7,9,10,12] → jazzy

Le swing (haut-parleur-13-notes.py) alterne des durées longues et courtes entre les notes, créant un effet rythmique.

haut-parleur-13-notes.py — Gamme de 13 notes avec swing .python
cours-exemples/audio/haut-parleur-13-notes.py
15 lignes GitHub
from  machine import *
from time import sleep

hp = PWM(Pin(5)) 
hp.duty(40)          # rapport cyclique a 40 sur 1023, soit environ 4%

#  creation d'une liste en comprehension de 13 notes (suite geometrique)
liste_freq = [int(2**(x/12)*880) for x in range (0,13)]  
print("Liste des frequences : ", liste_freq)   # affichage des 13 notes

for compt, x in enumerate(liste_freq) :
    print("Note {0:2d} - frequence : {1:4d} Hz".format(compt, x))
    hp.freq(x)
    sleep(.2 - .08 * (compt % 2 != 0))   # creation du swing
hp.deinit()
haut-parleur-gamme.py — Plusieurs gammes musicales .python
cours-exemples/audio/haut-parleur-gamme.py
21 lignes GitHub
from machine import Pin, PWM
from time import sleep

f_init = 880
hp = PWM(Pin(5))
hp.duty(40)      # rapport cyclique a 40 sur 1023, soit environ 4%

gamme_majeure = [0, 2, 4, 5, 7, 9, 11, 12] # do re mi fa sol la si 
gamme_dorienne = [0, 2, 3, 5, 7, 9, 10, 12] # do re mib fa sol la sib
gamme_phrygienne = [0, 1, 3, 4, 6, 8, 10, 12] # do reb mib fa sol lab sib
gamme_lydienne = [0, 2, 4, 6, 7, 9, 11, 12] # do re mi fa# sol la si
gamme_mixolydienne = [0, 2, 4, 5, 7, 9, 10, 12] # do re mi fa sol la sib
gamme_eolienne = [0, 2, 3, 5, 7, 8, 10, 12] # do re mib fa sol lab sib
gamme_locrienne = [0, 1, 3, 5, 6, 8, 10, 12] # do reb mib fa solb lab sib

for rang, x in enumerate(gamme_lydienne):
    print("Rang : {0} - Note : {1}".format(rang, x))
    f = int(f_init * 2**(x/12))
    hp.freq(f)
    sleep(.2- .08* (rang % 2 == 1))        
hp.deinit()

Programmation orientée objet

Classes, objets, constructeurs et héritage en MicroPython.

Cours suivant →