Composer une mélodie
| Projet | Durée | Difficulté | Âge | Logiciel STeaMi testé |
|---|---|---|---|---|
| I-Novmicro #2 | 30 min | Avancé | 11-99 ans | 0.23.1 |
Matériel et Montage
- 1 carte STeaMi
- 1 câble USB de données (micro-USB pour la STeaMi V1, USB-C pour la STeaMi V2).
- 1 ordinateur sous Windows, macOS ou Linux
- Un IDE compatible MicroPython : Thonny (voir la fiche Thonny : Prise en main de MicroPython) ou tout autre éditeur compatible (Mu, VS Code, Vittascience,
mpremote...).
De quoi parle-t-on ?
Le son est une vibration de l'air qui se propage jusqu'à nos oreilles. La hauteur de la note dépend de la fréquence de cette vibration : 440 vibrations par seconde (440 Hz) donnent un La, le double (880 Hz) donne le La de l'octave au-dessus. Plus la fréquence est élevée, plus la note est aiguë.
La STeaMi intègre un petit composant capable de produire ces vibrations : un buzzer piézoélectrique soudé au dos de la carte. En faisant osciller très rapidement la tension qu'il reçoit, le programme peut le faire vibrer à n'importe quelle fréquence audible et donc jouer n'importe quelle note. En enchaînant ces notes selon un rythme, on obtient une mélodie.
Dans cette fiche, on apprend à piloter le buzzer en MicroPython, à choisir une fréquence pour jouer une note précise, et à enchaîner ces notes pour composer une petite mélodie qui tournera en boucle.
Objectifs d'apprentissage
- Comprendre la relation entre fréquence d'un signal électrique et hauteur d'une note
- Découvrir comment un microcontrôleur génère un son en faisant osciller un buzzer (technique du bit-banging)
- Représenter une mélodie en MicroPython sous forme de liste de couples (fréquence, durée)
- Utiliser une fonction pour abstraire la génération du son et écrire une partition lisible
- Utiliser une boucle
forpour parcourir une séquence de notes et les jouer dans l'ordre
Étape 1 : Construire
Ici, « construire » est rapide : le buzzer est déjà soudé à la carte, aucun câblage à faire.
1. Localiser le buzzer
Le buzzer (officiellement un transducteur piézoélectrique) est soudé sur la face arrière de la STeaMi. Il est accessible dans le code sous le nom de broche SPEAKER.

Le buzzer piézo intégré au dos de la STeaMi.
Un buzzer piézoélectrique contient une fine plaque de céramique qui se déforme quand on lui applique une tension. Si la tension varie très vite (par exemple 440 fois par seconde), la plaque vibre à la même vitesse et pousse l'air autour d'elle : on entend une note.
Sur la STeaMi, ce n'est pas un circuit dédié qui génère le signal : c'est le programme lui-même qui allume et éteint la broche SPEAKER à la bonne cadence. On parle de bit-banging : on génère le signal « à la main » bit par bit. Beaucoup moins efficace qu'un module dédié, mais beaucoup plus pédagogique et flexible.
2. Notes et fréquences
Chaque note de musique correspond à une fréquence précise, en hertz (Hz) :
| Note | Octave grave (Hz) | Octave aiguë (Hz) |
|---|---|---|
| Do (C) | 262 | 523 |
| Ré (D) | 294 | 587 |
| Mi (E) | 330 | 659 |
| Fa (F) | 349 | 698 |
| Sol (G) | 392 | 784 |
| La (A) | 440 | 880 |
| Si (B) | 494 | 988 |
Bon à savoir : doubler la fréquence d'une note donne la même note à l'octave au-dessus. C'est la base de toute la musique tonale.
3. Lire une portée
Sur une partition, la hauteur d'une note (son nom) se lit à sa position verticale sur les cinq lignes de la portée : plus la note est haute sur la portée, plus sa fréquence est élevée et plus le son est aigu. Le symbole en tête de portée, la clef de sol, fixe le repère : sur la deuxième ligne en partant du bas, on lit toujours un Sol.
| Note | Octave grave | Octave aiguë |
|---|---|---|
| Do (C) | ... | ... |
| Ré (D) | ... | ... |
| Mi (E) | ... | ... |
| Fa (F) | ... | ... |
| Sol (G) | ... | ... |
| La (A) | ... | ... |
| Si (B) | ... | ... |
Les deux Do (ou les deux Ré, etc.) sont la même note à une octave d'écart : visuellement, ils se ressemblent mais sont écrits plus haut sur la portée à droite, exactement comme leur fréquence qui double d'une colonne à l'autre.
4. Connecter la carte à l'ordinateur
Brancher la STeaMi à l'ordinateur via le câble USB. Si l'IDE est déjà configuré (voir la fiche Thonny : Prise en main de MicroPython si vous démarrez), la console MicroPython doit afficher >>>. C'est l'invite (parfois appelée « prompt » en anglais) : un signe qui apparaît en début de ligne pour vous dire que la console est prête à recevoir une commande.
5. Lancer le programme
Notre premier programme va jouer une mélodie en boucle. Le code complet est donné à l'Étape 2 : Programmer ci-dessous. Copiez-le dans votre IDE.
Une fois le code en place, deux manières de le lancer :
- Test rapide : lancer le programme depuis l'IDE (typiquement bouton Run ▶ ou
F5). La mélodie démarre tout de suite. - Programme persistant : enregistrer le fichier sous le nom
main.pysur la carte. La STeaMi jouera la mélodie à chaque démarrage, même débranchée d'un ordinateur (tant qu'elle est alimentée par sa batterie).
Étape 2 : Programmer
Le code
# Testée avec firmware STeaMi 0.23.1
from machine import Pin
import time
speaker = Pin('SPEAKER', Pin.OUT_PP)
# Fréquences des notes en hertz (Hz). On garde le nom français des notes ;
# le chiffre indique l'octave (3 = très grave, 4 = grave, 5 = aigu).
LA_3 = 220
SI_3 = 247
DO_4 = 262
RE_4 = 294
MI_4 = 330
FA_4 = 349
SOL_4 = 392
LA_4 = 440
# Durées en millisecondes (ms). Notre partition n'utilise que CROCHE et NOIRE,
# mais on pourrait ajouter DOUBLE_CROCHE = 125, BLANCHE = 1000, RONDE = 2000
# pour enrichir le vocabulaire rythmique (voir tableau ci-dessous).
CROCHE = 250
NOIRE = 500
# Le thème principal de Tetris ("Korobeïniki", chanson traditionnelle
# russe de 1861, popularisée par le jeu Nintendo en 1989), transposé
# une octave en dessous pour mieux sonner sur le buzzer.
# Chaque tuple est une note (fréquence, durée).
partition = [
(MI_4, NOIRE),
(SI_3, CROCHE),
(DO_4, CROCHE),
(RE_4, NOIRE),
(DO_4, CROCHE),
(SI_3, CROCHE),
(LA_3, NOIRE),
(LA_3, CROCHE),
(DO_4, CROCHE),
(MI_4, NOIRE),
(RE_4, CROCHE),
(DO_4, CROCHE),
(SI_3, NOIRE),
(SI_3, CROCHE),
(DO_4, CROCHE),
(RE_4, NOIRE),
(MI_4, NOIRE),
(DO_4, NOIRE),
(LA_3, NOIRE),
(LA_3, NOIRE),
(RE_4, NOIRE),
(FA_4, CROCHE),
(LA_4, CROCHE),
(LA_4, CROCHE),
(SOL_4, CROCHE),
(FA_4, CROCHE),
(MI_4, NOIRE),
(DO_4, NOIRE),
(MI_4, NOIRE),
(RE_4, CROCHE),
(DO_4, CROCHE),
(SI_3, NOIRE),
(SI_3, CROCHE),
]
def jouer_note(pin, frequence, duree_ms):
"""Fait vibrer le buzzer à la fréquence demandée pendant duree_ms."""
if frequence == 0:
time.sleep_ms(duree_ms)
return
periode_us = int(1_000_000 / frequence)
demi_periode = periode_us // 2
fin = time.ticks_add(time.ticks_us(), duree_ms * 1000)
while time.ticks_diff(fin, time.ticks_us()) > 0:
pin.on()
time.sleep_us(demi_periode)
pin.off()
time.sleep_us(demi_periode)
while True:
for frequence, duree in partition:
jouer_note(speaker, frequence, duree)
time.sleep_ms(30) # petit silence entre deux notes
Lire la partition dans le code
La liste partition est exactement la transposition Python de la première moitié de Korobeïniki, mesure par mesure :
Chaque mesure de la portée correspond à une ligne (ou un fragment) de la liste Python. Le suffixe _3 ou _4 dans les noms de notes indique l'octave : MI_4 est le mi grave qu'on entend ici, MI_5 serait l'octave au-dessus.
Du symbole musical aux millisecondes
Sur une partition, la durée d'une note se lit à la forme du symbole. Chaque symbole vaut deux fois la durée du précédent : une ronde dure deux blanches, une blanche dure deux noires, une noire dure deux croches, et une croche dure deux doubles croches.
Notre code reproduit exactement ce rapport, mais en millisecondes :
| Notation musicale | Durée dans le code | Valeur (ms) |
|---|---|---|
| Ronde | RONDE | 2000 |
| Blanche | BLANCHE | 1000 |
| Noire | NOIRE | 500 |
| Croche | CROCHE | 250 |
| Double croche | DOUBLE_CROCHE | 125 |
À 120 battements par minute (Q:1/4=120 sur la partition ci-dessus), une noire fait précisément 500 ms, d'où la valeur choisie. Notre mélodie de Tetris n'utilise que NOIRE et CROCHE, mais le même principe permet d'ajouter les trois autres durées dès qu'on veut tenir une note plus longtemps (BLANCHE, RONDE) ou jouer des passages plus rapides (DOUBLE_CROCHE). Pour accélérer ou ralentir l'ensemble de la mélodie, il suffit de multiplier ou diviser toutes les durées par un même facteur.
Comment cela fonctionne ?
Le programme s'organise en quatre parties :
- Initialisation :
Pin('SPEAKER', Pin.OUT_PP)configure la broche du buzzer en sortie push-pull (la broche peut activement imposer 0 V ou 3,3 V, c'est ce qu'il faut pour piloter le buzzer). - Constantes nommées : avant tout calcul, on donne un nom parlant aux fréquences (
DO_4,RE_4,MI_4...) et aux durées (NOIRE,CROCHE). Le code ne manipule plus des nombres mystérieux comme330ou500, mais des notes et des durées qu'un musicien reconnaît au premier coup d'œil. - Fonction
jouer_note(pin, frequence, duree_ms): c'est elle qui fait vibrer le buzzer. Elle calcule la demi-période correspondant à la fréquence demandée (à 440 Hz, une période complète dure 1/440 seconde ≈ 2272 µs, donc la demi-période est 1136 µs), puis elle alternepin.on()/pin.off()pendant la durée totale. C'est le bit-banging évoqué plus haut. - Boucle principale : on parcourt la liste
partitionavec une bouclefor, on joue chaque note viajouer_note(), et on ajoute un petit silence de 30 ms entre les notes pour qu'elles soient bien distinctes. Lewhile Trueextérieur fait répéter la mélodie indéfiniment.
Sans la fonction jouer_note, il faudrait recopier les six lignes de bit-banging pour chaque note de la partition, soit environ 200 lignes pour notre mélodie de 33 notes. Avec la fonction :
- on écrit l'algorithme du buzzer une seule fois, on le teste, et on n'y touche plus ;
- la partition devient une liste de couples
(note, durée)qui se lit comme une vraie partition musicale ; - pour changer de mélodie, on modifie la liste sans toucher au code technique du son.
C'est le principe d'abstraction : cacher un détail technique derrière un nom expressif (jouer_note) pour que le reste du programme parle le langage du problème (« joue un MI long ») plutôt que celui de la machine (« allume la broche, attends 1515 µs, éteins-la... »).
(fréquence, durée)Représenter une mélodie comme une liste de tuples est un choix courant en programmation musicale. Chaque tuple est une note (fréquence en Hz + durée en ms), et la liste donne l'ordre. Cette représentation est facile à modifier (changer une note, en ajouter, faire varier le tempo en multipliant toutes les durées) et c'est aussi le format utilisé par beaucoup de librairies plus avancées (MIDI, MusicXML, Sonic Pi).
Étape 3 : Améliorer
1. Changer de mélodie
Le plus simple : remplacer le contenu de la liste partition par d'autres notes. Voici quatre gimmicks emblématiques de l'âge d'or du jeu vidéo 8 bits, à copier-coller à la place de notre Korobeïniki. Pensez à ajouter en haut du fichier les constantes de notes qui manquent (notre code n'en définit que jusqu'à LA_4 pour l'instant).
Super Mario Bros, Ground Theme (Koji Kondo, 1985)
L'ouverture la plus reconnaissable de l'histoire du jeu vidéo, « doo-doo doodoodoo-doo ». N'utilise que des notes naturelles.
# Nouvelles constantes à ajouter en haut du fichier :
SILENCE = 0 # 0 Hz est traité comme un silence par jouer_note
DO_5 = 523
MI_5 = 659
SOL_5 = 784
partition = [
(MI_5, CROCHE), (MI_5, CROCHE), (SILENCE, CROCHE), (MI_5, CROCHE),
(SILENCE, CROCHE), (DO_5, CROCHE), (MI_5, CROCHE), (SILENCE, CROCHE),
(SOL_5, NOIRE), (SILENCE, NOIRE),
(SOL_4, NOIRE), (SILENCE, NOIRE),
]
Pac-Man, jingle de démarrage (Toshio Kai, 1980)
Le petit motif joué au lancement de chaque partie sur la borne arcade. Il introduit les dièses (♯) : un dièse hausse la note d'un demi-ton. En français on les nomme FA_DIESE, RE_DIESE, etc.
# Nouvelles constantes :
SI_4 = 494
DO_5 = 523
RE_DIESE_5 = 622
MI_5 = 659
FA_DIESE_5 = 740
SOL_5 = 784
SI_5 = 988
DO_6 = 1047
partition = [
(SI_4, CROCHE), (SI_5, CROCHE), (FA_DIESE_5, CROCHE), (RE_DIESE_5, CROCHE),
(SI_5, CROCHE), (FA_DIESE_5, CROCHE), (RE_DIESE_5, NOIRE),
(DO_5, CROCHE), (DO_6, CROCHE), (SOL_5, CROCHE), (MI_5, CROCHE),
(DO_6, CROCHE), (SOL_5, CROCHE), (MI_5, NOIRE),
]
Kirby's Dream Land, Green Greens (Jun Ishikawa, 1992)
Le thème principal du tout premier Kirby sur Game Boy : sautillant, joyeux, immédiatement reconnaissable. Sons rapides en croches.
# Nouvelles constantes :
DO_5 = 523
RE_5 = 587
MI_5 = 659
FA_5 = 698
SOL_5 = 784
LA_5 = 880
SI_5 = 988
partition = [
(DO_5, CROCHE), (MI_5, CROCHE), (SOL_5, CROCHE), (MI_5, CROCHE),
(DO_5, CROCHE), (MI_5, CROCHE), (SOL_5, NOIRE),
(DO_5, CROCHE), (FA_5, CROCHE), (LA_5, CROCHE), (FA_5, CROCHE),
(DO_5, CROCHE), (FA_5, CROCHE), (LA_5, NOIRE),
(RE_5, CROCHE), (SOL_5, CROCHE), (SI_5, CROCHE), (SOL_5, CROCHE),
(RE_5, CROCHE), (SOL_5, CROCHE), (SI_5, NOIRE),
]
The Legend of Zelda, thème principal (Koji Kondo, 1986)
L'écran-titre du tout premier Zelda sur NES, transcrit dans sa quasi-intégralité (30 mesures) en Sib majeur. La structure se découpe en quatre temps : une intro tenue (Sib-Fa-Sib avec ornements descendants en Lab-Solb), le motif iconique répété deux fois avec des silences qui aèrent la phrase (Sib-Fa-Sib + montée chromatique culminant sur Fa5, contrebalancé par une descente grave Do-Ré-Mib-Fa en réponse), une culmination sur Sib5 avec développement descendant Fa-Mib-Réb-Do, puis une reprise et coda qui pousse encore plus haut (Do6 + Réb6) avant la résolution finale sur Fa4 grave.
C'est aussi l'occasion d'introduire les bémols (♭) : un bémol baisse la note d'un demi-ton. La signature en Sib majeur n'a que deux bémols à la clé (Sib, Mib), mais le morceau utilise plusieurs accidents (_A = Lab, _G = Solb, _d = Réb…) qui apparaissent en LA_BEMOL_4, SOL_BEMOL_5, RE_BEMOL_5, etc. côté Python (chaque constante est suffixée par son octave).
# Nouvelles constantes — bémols et 5e/6e octaves
# (les notes naturelles octave 4 + LA_3/SI_3 sont déjà en Étape 2).
SILENCE = 0 # déjà défini avec Mario, rappel ici pour autonomie
MI_BEMOL_4 = 311
SOL_BEMOL_4 = 370
LA_BEMOL_4 = 415
SI_BEMOL_4 = 466
DO_5 = 523
RE_BEMOL_5 = 554
RE_5 = 587
MI_BEMOL_5 = 622
MI_5 = 659
FA_5 = 698
SOL_BEMOL_5 = 740
SOL_5 = 784
LA_BEMOL_5 = 831
LA_5 = 880
SI_BEMOL_5 = 932
DO_6 = 1047
RE_BEMOL_6 = 1109
# Durées dérivées de CROCHE et NOIRE déjà définis en Étape 2 :
# on les exprime relativement, pour rester cohérents si on change le tempo.
DOUBLE_CROCHE = CROCHE // 2 # 125 ms
TRIOLET_CROCHE = NOIRE // 3 # 166 ms — une croche dans un triolet
CROCHE_POINTEE = CROCHE + DOUBLE_CROCHE # 375 ms
NOIRE_POINTEE = NOIRE + CROCHE # 750 ms
BLANCHE = 2 * NOIRE # 1000 ms
BLANCHE_POINTEE = BLANCHE + NOIRE # 1500 ms
# Partition de 30 mesures, suit fidèlement le MIDI source. Les durées
# 2,5 et 3,5 temps sont représentées par BLANCHE + CROCHE et
# BLANCHE + NOIRE_POINTEE ; les triolets de croches sont approximés
# par des doubles-croches sur le buzzer mono-voix.
partition = [
# Mesures 1-4 — intro tenue, dialogue Sib-Fa et Lab-Solb-La
(SI_BEMOL_4, BLANCHE + CROCHE), (FA_4, NOIRE), (SI_BEMOL_4, CROCHE),
(LA_BEMOL_4, DOUBLE_CROCHE), (SOL_BEMOL_4, DOUBLE_CROCHE), (LA_4, BLANCHE + NOIRE_POINTEE),
(SI_BEMOL_4, BLANCHE + CROCHE), (SOL_BEMOL_4, NOIRE), (SI_BEMOL_4, CROCHE),
(LA_4, DOUBLE_CROCHE), (SOL_4, DOUBLE_CROCHE), (LA_4, BLANCHE + NOIRE_POINTEE),
# Mesures 5-6 — silences (basse seule sur le morceau original)
(SILENCE, 2 * BLANCHE),
(SILENCE, 2 * BLANCHE),
# Mesures 7-8 — motif iconique aéré + descente grave en réponse
(SI_BEMOL_4, CROCHE_POINTEE), (SILENCE, DOUBLE_CROCHE),
(FA_4, NOIRE), (SILENCE, CROCHE),
(SI_BEMOL_4, CROCHE_POINTEE),
(DO_5, DOUBLE_CROCHE), (RE_5, DOUBLE_CROCHE), (MI_BEMOL_5, DOUBLE_CROCHE),
(FA_5, CROCHE_POINTEE), (SILENCE, CROCHE),
(DO_4, DOUBLE_CROCHE), (RE_4, DOUBLE_CROCHE), (MI_BEMOL_4, DOUBLE_CROCHE), (FA_4, CROCHE),
(SILENCE, NOIRE_POINTEE),
# Mesures 9-10 — répétition du motif (avec sa réponse grave)
(SI_BEMOL_4, CROCHE_POINTEE), (SILENCE, DOUBLE_CROCHE),
(FA_4, NOIRE), (SILENCE, CROCHE),
(SI_BEMOL_4, CROCHE_POINTEE),
(DO_5, DOUBLE_CROCHE), (RE_5, DOUBLE_CROCHE), (MI_BEMOL_5, DOUBLE_CROCHE),
(FA_5, CROCHE_POINTEE), (SILENCE, CROCHE),
(DO_4, DOUBLE_CROCHE), (RE_4, DOUBLE_CROCHE), (MI_BEMOL_4, DOUBLE_CROCHE), (FA_4, CROCHE),
(SILENCE, NOIRE_POINTEE),
# Mesures 11-12 — relance vers la culmination
(SI_BEMOL_4, NOIRE), (FA_4, NOIRE_POINTEE), (SI_BEMOL_4, CROCHE_POINTEE),
(DO_5, DOUBLE_CROCHE), (RE_5, DOUBLE_CROCHE), (MI_BEMOL_5, DOUBLE_CROCHE),
(FA_5, BLANCHE_POINTEE + TRIOLET_CROCHE), (SOL_BEMOL_5, TRIOLET_CROCHE), (LA_BEMOL_5, TRIOLET_CROCHE),
# Mesures 13-14 — culmination Sib5 + redescente
(SI_BEMOL_5, BLANCHE_POINTEE + TRIOLET_CROCHE), (LA_BEMOL_5, TRIOLET_CROCHE), (SOL_BEMOL_5, TRIOLET_CROCHE),
(LA_BEMOL_5, 2 * TRIOLET_CROCHE), (SOL_BEMOL_5, TRIOLET_CROCHE), (FA_5, BLANCHE_POINTEE),
# Mesures 15-17 — développement descendant Mib-Réb-Do
(MI_BEMOL_5, CROCHE_POINTEE), (FA_5, DOUBLE_CROCHE), (SOL_BEMOL_5, BLANCHE),
(FA_5, CROCHE), (MI_BEMOL_5, CROCHE),
(RE_BEMOL_5, CROCHE_POINTEE), (MI_BEMOL_5, DOUBLE_CROCHE), (FA_5, BLANCHE),
(MI_BEMOL_5, CROCHE), (RE_5, CROCHE),
(DO_5, CROCHE_POINTEE), (RE_5, DOUBLE_CROCHE), (MI_5, BLANCHE), (SOL_5, NOIRE),
# Mesure 18 — résolution sur Fa grave
(FA_5, CROCHE), (FA_4, BLANCHE + NOIRE_POINTEE),
# Mesures 19-22 — reprise + ascension vers le sommet absolu (Do6, Réb6)
(SI_BEMOL_4, NOIRE), (FA_4, NOIRE_POINTEE), (SI_BEMOL_4, CROCHE_POINTEE),
(DO_5, DOUBLE_CROCHE), (RE_5, DOUBLE_CROCHE), (MI_BEMOL_5, DOUBLE_CROCHE),
(FA_5, BLANCHE_POINTEE + TRIOLET_CROCHE), (SOL_BEMOL_5, TRIOLET_CROCHE), (LA_BEMOL_5, TRIOLET_CROCHE),
(SI_BEMOL_5, BLANCHE_POINTEE), (RE_BEMOL_6, NOIRE),
(DO_6, NOIRE), (LA_5, BLANCHE), (FA_5, NOIRE),
# Mesures 23-26 — oscillations descendantes Solb-Sib-La-Fa
(SOL_BEMOL_5, BLANCHE_POINTEE), (SI_BEMOL_5, NOIRE),
(LA_5, NOIRE), (FA_5, BLANCHE_POINTEE),
(SOL_BEMOL_5, BLANCHE_POINTEE), (SI_BEMOL_5, NOIRE),
(LA_5, NOIRE), (FA_5, BLANCHE), (RE_5, NOIRE),
# Mesures 27-28 — descente diatonique Mib-Solb / Fa-Réb
(MI_BEMOL_5, BLANCHE_POINTEE), (SOL_BEMOL_5, NOIRE),
(FA_5, NOIRE), (RE_BEMOL_5, BLANCHE), (SI_BEMOL_4, NOIRE),
# Mesures 29-30 — coda identique aux mesures 17-18, conclusion sur Fa4 grave
(DO_5, CROCHE_POINTEE), (RE_5, DOUBLE_CROCHE), (MI_5, BLANCHE), (SOL_5, NOIRE),
(FA_5, CROCHE), (FA_4, BLANCHE + NOIRE_POINTEE),
]
Astuce : pour transcrire une mélodie qu'on a en tête, commencer petit (4-8 notes), tester sur la STeaMi, ajuster les notes qui sonnent faux, puis allonger. Les chiptunes annotées sont nombreuses sur YouTube ou sur des archives spécialisées comme VGMusic et The Mod Archive.
2. Choisir sa mélodie au bouton
Au lieu d'une seule mélodie en boucle, en stocker plusieurs dans des listes différentes (partition_a, partition_b...) et déclencher l'une ou l'autre selon le bouton appuyé. La technique de lecture des boutons est dans la fiche Utiliser des boutons-poussoirs.
3. Coder un message en Morse
Avec le même buzzer, on peut produire des points et des tirets pour transmettre un message en code Morse. La fiche Envoyer des messages en code Morse avec la STeaMi explore cette piste en détail.
4. Mélodie au rythme d'un capteur (bonus)
En lisant un capteur intégré (lumière, accélération, température) à chaque tour de boucle, on peut faire varier la fréquence ou la durée des notes en temps réel. Résultat : la mélodie suit le geste, l'éclairage ou la température. C'est le principe d'un instrument de musique numérique, l'ancêtre des thérémines et synthétiseurs.
Aller plus loin
Pour comprendre
- Onde sonore (Wikipedia) : ce qu'est physiquement un son, comment il se propage et pourquoi notre oreille le perçoit comme une note. Le pont entre physique, biologie et musique.
- Effet piézoélectrique (Wikipedia) : pourquoi un cristal de céramique vibre quand on lui applique une tension. Le même principe pilote les buzzers, les briquets électriques, les microphones de guitare et les capteurs de pression.
- Gamme tempérée (Wikipedia) : pourquoi les notes ne sont pas espacées au hasard. Le système qu'on utilise depuis Bach répartit les 12 demi-tons de manière géométrique sur l'octave, ce qui permet de jouer dans n'importe quelle tonalité avec le même instrument.
Pour s'inspirer
- Chiptune (Wikipedia) : style musical né dans les années 80 qui exploite les puces audio limitées des consoles 8 bits. La STeaMi fait ici exactement ce que faisait une Game Boy ou une NES pour produire ses musiques cultes.
- Daft Punk et leur table de synthés modulaires : derrière le casque, des heures de bidouille sur des oscillateurs et des fréquences. Le duo a popularisé l'idée que la musique électronique se programme autant qu'elle s'interprète.
- Le Theremin, premier instrument électronique (Wikipedia) : inventé en 1920 par Léon Theremin, c'est le premier instrument qu'on joue sans le toucher : les mouvements des mains modulent fréquence et volume. Une fiche du wiki en construira un avec la STeaMi.
- Sonic Pi : environnement de live coding musical conçu pour l'éducation par Sam Aaron à Cambridge. On écrit du code Ruby qui produit de la musique en temps réel, on l'édite, on entend le résultat. Utilisé dans des milliers d'écoles, et même en concert.
Cette fiche fait partie du projet I-Novmicro #2 : Action EXAO. Adaptée du projet Let's STEAM (fiche r1as07-musique) sous licence CC BY-SA 4.0.