Dans cet article, nous allons recevoir, au moyen d'un Raspberry Pi Pico programmé en Micropython, les messages MIDI générés par un clavier musical.
Il s'agit de la suite logique de mon précédent article (publié il y a presque deux ans...mieux vaut tard que jamais!) qui traitait de l'émission d'un signal MIDI.
Le circuit
J'ai utilisé l'interface MIDI dont j'avais parlée dans cet article. Le circuit permettant la réception de messages MIDI par un microcontrôleur nécessite l'utilisation d'un optocoupleur, afin d'éviter les boucles de masse. Plusieurs options sont possibles; j'ai choisi le H11L1 après avoir vu dans un forum de discussion qu'il s'agissait d'un bon choix pour un microcontrôleur utilisant un niveau logique de 3,3 V. Le schéma du circuit recommandé par la MIDI association peut être consulté ici.
- La broche 1 du H11L1 est branchée à une résistance de 220 Ω, qui est elle-même connectée à la broche 4 du connecteur MIDI (DIN-5).
- La broche 2 du H11L1 est branchée à la broche 5 du connecteur MIDI (DIN-5).
- De plus, une diode pour petits signaux 1N914 est branchée entre les broches 1 et 2 du H11L1.
- La broche 3 du H11L1 n'est pas connectée.
- La broche 4 du H11L1 est reliée à l'entrée RX (UART) du Raspeberry Pi Pico, ainsi qu'à une résistance pull-up de 470 Ω qui est elle-même reliée à l'alimentation 3,3 V.
- La broche 5 du H11L1 est reliée à la masse GND.
- La broche 6 du H11L1 est reliée à l'alimentation 3,3 V.
Un câble MIDI relie le connecteur femelle DIN-5 à la sortie MIDI OUT du clavier musical alors que, du côté Raspberry Pi Pico, l'information arrivera par la broche GP5 du Raspberry Pi Pico.
![]() |
Numéro des broches du connecteur DIN-5 |
Script #1: affichage brut des données reçues
Ce premier exemple est volontairement minimaliste: il se contente d'afficher dans la console de Thonny tous les messages MIDI reçus en provenance du clavier musical.
La communication UART est d'abord initialisée (ligne #12). Nous utilisons le bus UART 1, qui est associé aux broches GP4 (TX) et GP5 (RX). Dans ce cas, seule la broche de réception (GP5) sera utile. La vitesse de la communication est réglée à 31 250 bauds, tel que requis par le protocole MIDI.
Ensuite, si nous recevons un message UART, nous l'affichons en format hexadécimal.
Lors de la mise à l'essai d'une première version de ce script, j'ai eu la surprise de voir s'afficher à l'écran une quantité effarante de données alors que je n'avais encore appuyé sur aucune des touches du clavier musical. Les valeurs affichées étaient 0xF8 et 0xFE qui correspondent respectivement à "Timing Clock" et "Active Sensing". Les messages de type "Timing Clock" servent à synchroniser deux instruments MIDI pour qu'ils soient au même tempo, alors que les messages "Active Sensing" permettent de vérifier constamment qu'un appareil MIDI est toujours branché et actif. La ligne #17 du script désactive donc l'affichage de tous ces messages de type "System Real Time" pour éviter que les données générées par les actions du musicien soient noyées dans un océan de données répétitives inutiles. (Certains claviers MIDI n'émettent pas ces messages)
![]() |
Affichage de messages "System Real Time" |
Voici donc le script en micropython:
-
-
Voyons ce qui est affiché à l'écran lorsque j'appuie sur la note "Do2" de mon clavier:
![]() |
Appui sur la touche Do2 du clavier musical |
Trois octets sont envoyées par le clavier:
Le nombre hexadécimal 0x90 représente un message "Note On" sur le canal 1. Il indique que nous avons appuyé sur une touche du clavier. Il existe 16 canaux, qui sont officiellement numérotés de 1 à 16, mais nous les numérotons de 0 à 15 dans un programme. Le nombre hexadécimal 0x91 aurait signifié un message "Note On" sur le canal 2, le nombre hexadécimal 0x92 aurait signifié un message "Note On" sur le canal 3, et ainsi de suite jusqu'à 0x9F, qui représente un "Note On" sur le canal 16.
Un message "Note On" est toujours suivi de deux octets supplémentaires: un nombre qui représente le numéro de la note jouée, et un nombre qui représente la vélocité avec laquelle la touche a été enfoncée.
Ici, nous pouvons constater que j'ai joué la note numéro 0x24 en hexadécimal (ou 36 en décimal), qui correspond à un Do du 2e octave (cette page, qui énumère la signification des différents numéros de notes, peut s'avérer bien utile). Finalement,la vélocité de cette note était de 0x4d (ce qui correspond à 77 en décimal). Ce nombre serait plus grand si j'avais appuyé plus fort sur la touche du clavier.
Voyons maintenant ce qui s'affiche lorsque je relâche la touche de clavier que j'avais enfoncée.
![]() |
Relâchement de la touche Do2 du clavier musical |
Lorsque nous relâchons une touche, un instrument MIDI doit générer un message "Note Off". Certains instruments émettent un véritable message Note Off qui correspond à 0x80. D'autres émettent plutôt un "Note On" avec une vélocité de 0. C'est ce que vous pouvez constater sur la saisie d'écran ci-dessus: en relâchant la touche Do2 que j'avais enfoncée, le clavier musical a émis le message 0x90 (Note On), suivi du numéro de la note correspondant à la touche relâchée (0x24), et d'une vélocité nulle (0x0).
La saisie d'écran ci-dessous, réalisée avec un clavier différent, montre les données reçues lorsque la touche "Do2" est d'abord appuyée, puis ensuite relâchée (ce clavier émet un véritable message "Note Off" de 0x80).
![]() |
Do2 enfoncée, puis relâchée, sur un autre clavier |
Script #2: Interprétation des messages reçus
Dans ce deuxième exemple, je fais un effort pour présenter les données d'une façon plus compréhensible pour un être humain. Pour simplifier les choses, je me limite aux messages de type Note On ou Note Off reçues sur le canal 1 (0x80 ou 0x90). Je n'afficherai donc pas de message de type "program change", "pitch bend", etc.): le script ne réagit qu'aux touches enfoncées ou relâchées.
Cette fois, le numéro de la note s'affiche en valeur décimale, et le script détermine s'il s'agit d'un do, ou d'un sol, etc.
La vélocité s'affiche également en valeur décimale, et le script indique si la touche a été enfoncée (note On) ou relâchée.
-
-Et ensuite?
Maintenant que vous maîtrisez les bases de la réception d'un message MIDI, vous pourriez transformer votre Raspberry Pi Pico en un mini synthétiseur; pour ce faire, vous pourriez vous référer à cet article sur la production d'un son au moyen du Raspberry Pi Pico.
À lire également:
- MIDI Out avec le Raspberry Pi Pico (mircopython)
- Fabrication d'un module MIDI (IN et OUT) pour microcontrôleur 3,3 V
- Flûte à bec MIDI à base d'Arduino
- Pédalier d'orgue MIDI à base d'Arduino
- Tous mes projets "son et musique"
Yves Pelletier