🛠 Un instrument MIDI USB en 10 minutes : Bounce, boutons et règle d'or du drain
Objetivos
Transformar la Teensy 3.2 en un instrumento de música USB: su puerto USB de dispositivo de 12 Mbit/s es reconfigurable a voluntad (Serial, MIDI, MIDIx4/MIDIx16, Audio, Keyboard, Mouse, Joystick, Flightsim, RawHID…) mediante Tools > USB Type. Este tutorial construye un mini-teclado de 3 botones con la biblioteca Bounce, aplicando la regla de oro de los controladores MIDI enunciada por PJRC: siempre vaciar los mensajes entrantes, de lo contrario los búferes USB se llenan y todo se congela.
Material
- 1 Teensy 3.2
- 3 botones pulsadores hacia los pines 1, 2, 3 (el otro lado de cada botón: GND; pull-ups internos activados por el código)
- Cable USB hacia un PC con un secuenciador (DAW), MIDI-OX (Windows) o cualquier monitor MIDI
- Ningún componente adicional: los botones mecánicos se filtran por software mediante Bounce
Código completo
Ejemplo oficial del tutorial USB MIDI de PJRC (comentarios originales):
#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) { }
}
Carga del programa
Configure Tools > USB Type: MIDI ANTES de compilar, y luego cargue el programa normalmente (Teensy Loader). La placa es entonces reconocida como un dispositivo USB MIDI class-compliant — no hay que instalar ningún driver en Windows, macOS o Linux. Esta es la razón del éxito de la Teensy en los controladores MIDI DIY.
Verificación esperada
Abra su DAW o MIDI-OX: la Teensy aparece como entrada MIDI. Cada pulsación dispara C4/C#4/D4 (notas 60/61/62, velocidad 99) y la liberación envía el Note Off correspondiente. Pruebe ahora la regla del drenaje: si su secuenciador devuelve mensajes (aftertouch, reloj MIDI, sincronización MTC…), la ausencia del bucle while (usbMIDI.read) { } llena los búferes USB y congela el controlador después de unos minutos — este es el error más reportado.
Errores frecuentes
- Olvidar Tools > USB Type: MIDI: el sketch se compila en modo Serial y usbMIDI no hace nada durante la ejecución — cambie el tipo USB, recompiles y vuelva a cargar el programa.
- Romper la regla del drenaje: un controlador «emisor solo» debe igualmente consumir usbMIDI.read en bucle.
- Ruptura de compatibilidad en Teensyduino 1.41: el rango del pitch bend pasó de 0…16383 a +8191…−8192 y los valores devueltos por getType han cambiado — adapte los sketches antiguos (sección «Teensyduino 1.40 & Earlier» de la página de PJRC).
- MIDI-OX bajo Windows: requiere una configuración específica «input only» para evitar bloqueos — siga la página de USB MIDI.
- Confundir los cables virtuales: MIDIx4/MIDIx16 exponen 4 o 16 cables MIDI con hasta 16 mensajes por paquete USB — potente para grandes controladores, desconcertante al principio (seleccione el cable 1 en la DAW).
- Botones sin pull-up: sin INPUT_PULLUP ni resistencia externa, el pin queda flotante y las notas se disparan aleatoriamente.
Otros tutoriales para esta placa
- 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
Ejemplos de código para esta placa
clignotante.inoArduinotouche-capacitive.inoArduinoanalogique-12-bits.inoArduinomidi-piano.inoArduinopwm-respiration.inoArduinoservo-angle.inoArduino