🛠 Un instrument MIDI USB en 10 minutes : Bounce, boutons et règle d'or du drain
Objectifs
Transformer la Teensy 3.2 en instrument de musique USB : son port USB device 12 Mbit/s est reconfigurable à volonté (Serial, MIDI, MIDIx4/MIDIx16, Audio, Keyboard, Mouse, Joystick, Flightsim, RawHID…) via Tools > USB Type. Ce tutoriel construit un mini-clavier de 3 boutons avec la bibliothèque Bounce, en appliquant la règle d'or des contrôleurs MIDI énoncée par PJRC : toujours vider les messages entrants, sinon les buffers USB se remplissent et tout se fige.
Matériel
- 1 Teensy 3.2
- 3 boutons poussoirs vers les broches 1, 2, 3 (autre côté de chaque bouton : GND ; pull-up internes activés par le code)
- Câble USB vers un PC avec un séquenceur (DAW), MIDI-OX (Windows) ou tout moniteur MIDI
- Aucun composant supplémentaire : les boutons mécaniques sont déparasés en logiciel par Bounce
Code complet
Exemple officiel du tutoriel USB MIDI de PJRC (commentaires d'origine) :
#include <Bounce.h> // Bounce library makes button change detection easy
const int channel = 1;
Bounce button1 = Bounce(1, 5); // 5 = 5 ms debounce time
Bounce button2 = Bounce(2, 5); // appropriate for good quality
Bounce button3 = Bounce(3, 5); // mechanical pushbuttons
void setup {
pinMode(1, INPUT_PULLUP);
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
}
void loop {
button1.update;
button2.update;
button3.update;
// Note On when each button is pressed
if (button1.fallingEdge) usbMIDI.sendNoteOn(60, 99, channel); // 60 = C4
if (button2.fallingEdge) usbMIDI.sendNoteOn(61, 99, channel); // 61 = C#4
if (button3.fallingEdge) usbMIDI.sendNoteOn(62, 99, channel); // 62 = D4
// Note Off on release
if (button1.risingEdge) usbMIDI.sendNoteOff(60, 0, channel);
if (button2.risingEdge) usbMIDI.sendNoteOff(61, 0, channel);
if (button3.risingEdge) usbMIDI.sendNoteOff(62, 0, channel);
// MIDI controllers should discard incoming MIDI messages,
// otherwise USB buffers fill up
while (usbMIDI.read) { }
}
Téléversement
Réglez Outils > USB Type : MIDI AVANT de compiler, puis téléversez normalement (Teensy Loader). La carte est alors reconnue comme périphérique USB MIDI class-compliant — aucun driver à installer sur Windows, macOS ou Linux. C'est la raison du succès de la Teensy dans les contrôleurs MIDI DIY.
Vérification attendue
Ouvrez votre DAW ou MIDI-OX : la Teensy apparaît comme entrée MIDI. Chaque appui déclenche C4/C#4/D4 (notes 60/61/62, vélocité 99) et le relâchement envoie le Note Off correspondant. Testez maintenant la règle du drain : si votre séquenceur renvoie des messages (aftertouch, horloge MIDI, synchronisation MTC…), l'absence de la boucle while (usbMIDI.read) { } remplit les buffers USB et fige le contrôleur après quelques minutes — c'est le bug le plus rapporté.
Erreurs fréquentes
- Oublier Tools > USB Type: MIDI : le sketch compile en mode Serial et usbMIDI ne fait rien à l'exécution — changez le type USB, recompilez, re-téléversez.
- Rompre la règle du drain : un contrôleur « émetteur seul » doit quand même consommer usbMIDI.read en boucle.
- Rupture de compatibilité Teensyduino 1.41 : la plage du pitch bend est passée de 0…16383 à +8191…−8192 et les valeurs renvoyées par getType ont changé — adaptez les vieux sketches (section « Teensyduino 1.40 & Earlier » de la page PJRC).
- MIDI-OX sous Windows : nécessite une configuration « input only » spécifique pour éviter les blocages — suivez la page USB MIDI.
- Confondre les câbles virtuels : MIDIx4/MIDIx16 exposent 4 ou 16 câbles MIDI avec jusqu'à 16 messages par paquet USB — puissant pour les gros contrôleurs, déroutant au début (sélectionnez le câble 1 dans la DAW).
- Boutons sans pull-up : sans INPUT_PULLUP ni résistance externe, la broche flotte et les notes partent en aléatoire.
Autres tutoriels pour cette carte
- Premiers pas sur la Teensy 3.2 : Teensyduino, HalfKay et premier Blink
- Broches, ADC 13 bits, DAC 12 bits et PWM : dompter les E/S de la Teensy 3.2
- Audio Shield SGTL5000 : boucle stéréo 44,1 kHz et outil de conception graphique
- OctoWS2811 : piloter 8 rubans WS2812 en parallèle par DMA (presque zéro CPU)
- Timers matériels, interruptions imbriquées et FASTRUN : la vitesse Cortex-M4
- Intégration produit : alimentation VIN/VUSB, régulateur 250 mA, RTC à quartz et EEPROM
Exemples de code pour cette carte
clignotante.inoArduinotouche-capacitive.inoArduinoanalogique-12-bits.inoArduinomidi-piano.inoArduinopwm-respiration.inoArduinoservo-angle.inoArduino