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
| Gamme | Intervalles | Couleur |
|---|---|---|
| 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.