Le son : le haut-parleur de la carte, et l'HDMI
Deux chemins pour faire du bruit : le petit haut-parleur soudé sur la carte, qui joue des notes et des mélodies sans bloquer le programme, et les haut-parleurs de l’écran, par la prise HDMI, encore à l’essai.
Dans cette page
Le haut-parleur de la carte
D’après les fichiers KiCad de la carte (révision A), le haut-parleur est un transducteur magnétique (QMB-09B-03), commandé par la broche GPIO20 du RP2040 à travers un transistor. Il n’a pas d’oscillateur interne : il faut lui fournir un signal carré. Il sonne le plus fort vers 2,7 kHz, sa fréquence de résonance.
Le pilote d’Eliott65 produit ce signal avec un PWM du RP2040 : la fréquence est réglée à moins de 0,1 % près, de 20 Hz à 20 kHz, et le volume par le rapport cyclique (50 % au plus, le plus fort).
Le service SON
Le service n° 6 a trois fonctions :
| Fonction | Ce qu’elle fait |
|---|---|
NOTE | joue une note (fréquence, durée, volume) et rend la main aussitôt |
ETAT | dit ce qui reste à jouer, et quelle note de la mélodie est en cours |
MELODIE | joue une suite de notes en arrière-plan, une fois ou en boucle |
Rien ne bloque : le programme continue pendant que le noyau joue. Et, comme pour les lutins, la mélodie est lue note par note dans la mémoire du programme, sans copie : il peut la modifier pendant qu’elle joue (musique générée, tempo). Le son s’arrête avec le processus qui l’a lancé.
Le détail des paramètres est dans la référence de l’API.
Entendu sur la carte (v0.48)
Le programme MUSIQUE.E65 fait un bip à 2 700 Hz, puis joue « Au clair de la lune » en boucle, en
affichant la note en cours. Vérifications :
- le PWM, relu par la sonde pendant la mélodie : 523,0, 659,0 et 587,0 Hz, avec la broche bien à 0 pendant les pauses ;
- à l’oreille, par l’utilisateur : « fonctionne ».
Dans l’émulateur, la fenêtre SDL envoie le même signal carré sur la sortie son du PC.
Le son par la prise HDMI (à l’essai)
L’autre chemin passe par les îlots de données du HDMI (voir La vidéo) : des paquets glissés pendant la synchronisation de chaque ligne, qui portent les échantillons sonores vers les haut-parleurs de l’écran.
- Étape 2 (v0.47) : un son de test, un la de 441 Hz exactement, à 44,1 kHz. Le banc de l’émulateur décode les paquets : 735 échantillons justes sur 735.
- Premier essai sur la carte : raté. Fabriquer les échantillons dans l’interruption du cœur 1 faisait prendre du retard à environ 200 lignes par image. Solution : c’est le cœur 0 qui fabrique les échantillons, comme il dessine déjà le graphisme ; l’interruption ne recopie plus que ce qui change.
- Pas encore confirmé à l’oreille. À la demande de l’utilisateur, cette piste est mise de côté au profit du haut-parleur de la carte ; l’étape suivante (une API pour ce son) attend.
- Un coût caché, corrigé (v0.48.2). En remesurant le graphisme, une régression est apparue : le cœur 0 fabriquait le la de test en permanence, à chaque ligne, et deux scénarios graphiques ne tenaient plus. Le son de test est désormais éteint par défaut : sans son à jouer, le cœur 0 ne fabrique rien. Pour la suite, fabriquer les échantillons devra coûter bien moins cher.