¿Cómo usar un controlador MIDI en Arduino?

Crea Tu Propio Controlador MIDI con Arduino

23/03/2024

Valoración: 4.57 (11034 votos)

El universo de la música y la tecnología ha estado entrelazado durante décadas, y uno de los pilares de esta conexión es el protocolo MIDI. Si alguna vez has soñado con crear tus propios instrumentos o controladores musicales, pero te has sentido intimidado por el costo o la complejidad, estás en el lugar correcto. Con la versatilidad de Arduino, es posible fabricar un controlador MIDI personalizado, abriendo un sinfín de posibilidades para músicos, productores y entusiastas del DIY.

¿Cómo usar un controlador MIDI en Arduino?
Ahora tu Arduino ya se comporta como si fuera un controlador MIDI comercial. Conéctalo al programa de audio que desees (Ableton, Cubase, Nuendo, Sonar, Traktor,...), asígnale los sonidos que desees y ¡A tocar!. Si no sabes usar estos programas, nunca es mal momento para iniciarse.

Este artículo te guiará paso a paso en la construcción de tu propio controlador, explicando desde los conceptos básicos de MIDI hasta la implementación práctica con Arduino. ¿Listo para dar rienda suelta a tu creatividad y hacer que tus ideas suenen?

Índice de Contenido

¿Qué es MIDI y Por Qué Sigue Siendo Relevante?

MIDI (Musical Instrument Digital Interface) es mucho más que un simple cable; es un protocolo de comunicación serial que revolucionó la industria musical en los años ochenta. Permite que instrumentos musicales electrónicos, computadoras, sintetizadores y otros dispositivos se "hablen" entre sí, intercambiando información sobre notas, velocidad, controles y sincronización. A diferencia de lo que muchos podrían pensar, MIDI no transmite audio; en su lugar, envía datos que describen cómo se debe producir el sonido (qué nota tocar, con qué intensidad, durante cuánto tiempo, etc.).

A pesar de su antigüedad, MIDI sigue siendo la espina dorsal de la producción musical moderna. Su eficiencia, ligereza y estandarización lo hacen indispensable en estudios de grabación, escenarios y configuraciones domésticas. Desde controlar software de producción musical (DAWs) hasta sincronizar luces en un concierto, la flexibilidad de MIDI es asombrosa.

Arduino como Puente hacia el Control MIDI

Arduino, con su facilidad de uso y bajo costo, es una plataforma ideal para proyectos de electrónica interactiva. Sin embargo, no fue diseñado originalmente para ser un dispositivo MIDI "plug & play" como un controlador comercial. Esto presenta un pequeño desafío: ¿cómo hacemos que nuestro Arduino sea reconocido por los programas de audio como un dispositivo MIDI estándar?

Existen principalmente dos enfoques para lograr esta comunicación entre Arduino y tu ordenador:

  1. Convertidores Serie a MIDI y Puertos Virtuales: Esta es una solución común que implica el uso de software puente (como Hairless MIDI<->Serial Bridge) y puertos MIDI virtuales (como LoopMIDI en Windows o nativo en Mac/Linux). Arduino envía datos MIDI por su puerto serial, el software puente los intercepta y los redirige a un puerto MIDI virtual que tu DAW puede leer. Es una opción flexible y no requiere modificar el firmware del Arduino.
  2. Reflashear el Firmware del Arduino (Hiduino): Este método transforma tu Arduino en un dispositivo MIDI "nativo". Al cargar un firmware especial como Hiduino, el Arduino se presenta al sistema operativo como un dispositivo MIDI estándar, eliminando la necesidad de software puente o puertos virtuales adicionales. Es una solución más "limpia" en el lado del software, pero implica un proceso de flasheo del firmware que puede parecer más técnico inicialmente.

Tabla Comparativa: Hiduino vs. Hairless/Serial Bridge

CaracterísticaHiduino (Reflash Firmware)Hairless MIDI<->Serial Bridge
Configuración InicialRequiere flashear el firmware del Arduino (más técnico)No requiere flashear el firmware de Arduino (más sencillo)
Software Adicional en PCNo, el Arduino se comporta como dispositivo MIDI nativoSí, software puente (Hairless) y puertos MIDI virtuales
Compatibilidad"Plug & Play" con la mayoría de DAWsDepende del software puente y la configuración del sistema
Complejidad de UsoUna vez flasheado, es muy sencilloRequiere ejecutar el software puente cada vez
ReversibilidadSí, se puede volver al firmware original de ArduinoNo modifica el Arduino, solo el software en PC
Ideal ParaProyectos "profesionales" o permanentes, experiencia "plug & play"Experimentación rápida, pruebas, proyectos temporales

Construyendo un Piano Controlador con Hiduino

Aquí te mostraremos cómo construir un piano controlador básico utilizando la metodología de reflasheo con Hiduino, que te dará una experiencia más cercana a un dispositivo comercial.

Materiales Necesarios:

  • 11 Switches (botones pulsadores)
  • 1 Resistencia de 10k Ohm (opcional, para pin 13 si se usa)
  • Arduino UNO y cable USB
  • Protoboard o placa de circuito
  • Software Arduino IDE
  • DFU-Programmer (para Linux o Mac)
  • Hiduino Firmware
  • Librería MIDI (para Arduino IDE)

1. Realizar las Conexiones del Hardware

La conexión de los botones es bastante sencilla. Conecta cada botón entre un pin digital de Arduino (del 2 al 12) y GND (tierra). Para que esto funcione correctamente, habilitaremos las resistencias de pull-up internas del Arduino desde el código. Esto asegura que el pin tenga un estado definido (HIGH) cuando el botón no está pulsado y LOW cuando sí lo está, sin necesidad de resistencias externas adicionales. Si planeas usar el pin 13, ten en cuenta que este requiere una resistencia de pull-up externa debido a su conexión con el LED integrado.

2. Código de Prueba (No MIDI)

Antes de sumergirnos en MIDI, es crucial verificar que tus conexiones y botones funcionen correctamente. Carga el siguiente código en tu Arduino:

/ Alvaro Lopez Revuelta para http://geekytheory.com/ http://alvarorevuelta.net/ Este ejemplo es para ver en el monitor serial los botones pulsados/despulsados En el siguiente ejemplo veremos como enviar midi Ojo con usar mas de 11 botones empleando la resistencia de pullup interna Para el pin 13 debe usarse una resistencia de pullup externa */ const int numBotones=11; // Definir aqui el numero de botones (11 max) int valorLeido[numBotones]; // Array con los valores leidos de cada boton int valorAnterior[numBotones]; // Array con el valor anterior leido void setup() { Serial.begin(9600); // Inicializamos la comunicacion serial for(int i=0; i<numBotones; i++){ pinMode(i+2, INPUT_PULLUP); // Recorremos cada pin y lo ponemos como entrada valorAnterior[i]=1; // Inicializamos el valor anterior a 1 (no pulsado) } } void loop(){ for(int i=0; i<numBotones; i++){ valorLeido[i]=digitalRead(i+2); // Leer valor // Solo enviamos cuando ha existido un cambio, para no sobrecargar el puerto serial if((valorLeido[i]==0) && (valorLeido[i]!=valorAnterior[i])){ Serial.print("Pulsado el boton: "); Serial.println(i); Serial.println("------------"); } else if ((valorLeido[i]==1) && (valorLeido[i]!=valorAnterior[i])){ Serial.print("Ya no el boton: "); Serial.println(i); Serial.println("------------"); } valorAnterior[i]=valorLeido[i]; // El valor anterior es el nuevo valor para la siguiente iteracion } }

Abre el Monitor Serial del IDE de Arduino (con una velocidad de 9600 baudios) y pulsa cada botón. Deberías ver mensajes indicando qué botón se pulsó y cuándo se liberó. Esto confirma que tu hardware funciona.

3. Implementando el Código MIDI

Ahora que el hardware está probado, es momento de integrar la funcionalidad MIDI. Asegúrate de haber descargado e instalado la librería MIDI para Arduino (puedes buscarla en el Gestor de Librerías del IDE). Este código enviará mensajes MIDI "Note On" (nota activada) y "Note Off" (nota desactivada) a tu ordenador.

#include <MIDI.h> // Incluimos la libreria MIDI / * Alvaro Lopez Revuelta para http://geekytheory.com/ * http://alvarorevuelta.net/ * * Este ejemplo sirve para enviar midi a nuestro ordenador * Sera necesario emplear el firmware hiduino para que funcione correctamente * https://github.com/ddiakopoulos/hiduino * Ojo con usar mas de 11 botones empleando la resistencia de pullup interna * Para el pin 13 debe usarse una resistencia de pullup externa */ const int numBotones=11; int valorLeido[numBotones]; // Array con los valores leidos de cada boton int valorAnterior[numBotones]; // Array con el valor anterior leido MIDI_CREATE_DEFAULT_INSTANCE(); void setup() { MIDI.begin(); // Inicializamos la comunicacion midi (realmente es serial) for(int i=0; i<numBotones; i++){ pinMode(i+2, INPUT_PULLUP);// Recorremos cada pin y lo ponemos como entrada valorAnterior[i]=1; // Inicializamos el valor anterior a 1 (no pulsado) } } void loop(){ for(int i=0; i<numBotones; i++){ valorLeido[i]=digitalRead(i+2); // Leer valor // Solo enviamos cuando ha existido un cambio, para no sobrecargar el puerto serial if((valorLeido[i]==0) && (valorLeido[i]!=valorAnterior[i])){ MIDI.sendNoteOn(48+i, 127, 1); //48 corresponde a C es decir DO. } else if ((valorLeido[i]==1) && (valorLeido[i]!=valorAnterior[i])){ MIDI.sendNoteOff(48+i, 0, 1); } valorAnterior[i]=valorLeido[i]; // El valor anterior es el nuevo valor para la siguiente iteracion } }

En este código, MIDI.sendNoteOn(nota, velocidad, canal) envía un mensaje de nota activada. El valor 48 corresponde a la nota C3 (Do central) en el protocolo MIDI. Cada botón subsiguiente aumentará la nota en uno (C#, D, D#, etc.). La velocidad (127) indica la máxima intensidad, y el canal (1) es el canal MIDI por defecto.

4. Reflasheando el Arduino con Hiduino

Este es el paso clave para que tu Arduino sea reconocido como un dispositivo MIDI. Necesitarás el programa dfu-programmer y el firmware HIDUINO_MIDI.hex.

Pasos para Linux (similar en Mac):

  1. Descarga Hiduino: Ve al repositorio de Hiduino en GitHub, navega hasta la carpeta "Compiled Firmware" y descarga HIDUINO_MIDI.hex. Guarda este archivo en un lugar de fácil acceso, como tu escritorio.
  2. Instala dfu-programmer: Abre una terminal y ejecuta: sudo apt-get install dfu-programmer
  3. Pon tu Arduino en Modo DFU: Este es un paso crítico. El modo DFU (Device Firmware Update) permite flashear el microcontrolador ATmega16U2/8U2 de tu Arduino UNO (el chip encargado de la comunicación USB).
    • Identifica la versión de tu Arduino: Algunas versiones tienen un condensador, otras dos.
    • Con el Arduino desconectado, haz un puente temporal entre los pines de reinicio del chip USB (los que se ven en las fotos del texto original, cerca del cristal oscilador).
    • Conecta el Arduino al ordenador.
    • Deberías ver una luz parpadear y apagarse, indicando que el Arduino ha entrado en modo DFU. Retira el puente.
  4. Flashea el Firmware: En tu terminal, navega al directorio donde guardaste HIDUINO_MIDI.hex (ej. cd ~/Escritorio) y ejecuta los siguientes comandos:
    sudo dfu-programmer at90usb82 erase sudo dfu-programmer at90usb82 flash HIDUINO_MIDI.hex sudo dfu-programmer at90usb82 reset

Desconecta y vuelve a conectar el cable USB de tu Arduino. ¡Felicidades! Tu Arduino ahora debería ser reconocido como un controlador MIDI comercial por tu sistema operativo. Abre tu DAW favorito (Ableton Live, Cubase, Nuendo, FL Studio, Reason, Traktor, etc.), asigna los sonidos a las notas que enviará tu controlador y comienza a tocar. No te preocupes si no eres un experto en estos programas; muchos ofrecen versiones de prueba y tutoriales para iniciarse.

What are the features of Omni MIDI interface?
OMNI input reading (read all channels). Software Thru, with message filtering. Callbacks to handle input messages more easily. Last received message is saved until a new one arrives. Configurable: overridable template-based settings. Create more than one MIDI interface for mergers/splitters applications. Use any serial port, hardware or software.

Alternativa: Construyendo un Controlador con Hairless MIDI<->Serial Bridge

Si prefieres no flashear tu Arduino o necesitas más flexibilidad, la combinación de Hairless MIDI<->Serial Bridge y Virtual MIDI Piano Keyboard (VMPK) es una excelente opción. Este método es ideal para experimentar con diferentes tipos de controladores, no solo pianos.

Materiales Adicionales (para esta alternativa):

  • Arduino Nano (o UNO) y cable USB
  • Módulo de periféricos con potenciómetros deslizables y pulsadores (o componentes individuales)

Software Necesario:

  • Hairless MIDI<->Serial Bridge: Un software libre y gratuito que actúa como puente entre el puerto serie de Arduino y un puerto MIDI virtual en tu PC.
  • Virtual MIDI Piano Keyboard (VMPK): Un teclado virtual MIDI que puedes usar para probar tu controlador sin necesidad de un DAW completo.

Instalación en Ubuntu (ejemplo):

sudo apt install libasound2:i386 libsm6:i386 libxrender1:i386 libfontconfig1:i386 libasound2-plugins:i386 libxext6:i386 sudo apt install vmpk

Para Windows, necesitarás un programa de puerto MIDI virtual como LoopMIDI además de Hairless.

Conceptos Clave del Protocolo MIDI para Controladores

Al diseñar tu controlador, es útil entender los mensajes MIDI más comunes:

  • Note On: Indica que una nota debe comenzar a sonar. Contiene la altura de la nota (0-127) y la velocidad de ataque (0-127, cuán fuerte se pulsó).
  • Note Off: Indica que una nota debe dejar de sonar. Similar a Note On, pero con velocidad 0 o un mensaje específico de liberación.
  • Control Change (CC): Engloba 128 mensajes de control diferentes que afectan la calidad del sonido. Se usan para manipular parámetros como volumen (CC7), paneo (CC10), sustain (CC64), y muchos otros. Cada mensaje CC tiene un número de control (0-127) y un valor (0-127).

Conexiones y Código de Ejemplo (Arduino Nano con Potenciómetros y Pulsadores)

Para este ejemplo, conectarás dos pulsadores y dos potenciómetros a tu Arduino Nano. Los pulsadores irán a pines digitales (ej. 2 y 3) y los potenciómetros a pines analógicos (ej. A0 y A1). Asegúrate de tener la librería MIDI instalada en tu Arduino IDE.

#include <MIDI.h> MIDI_CREATE_DEFAULT_INSTANCE(); const int POT_A = A0; const int POT_B = A1; const int PUL_A = 3; const int PUL_B = 2; boolean reboteA = false; boolean reboteB = false; int controlChange1 = 0; int controlChange2 = 0; int ultValor1 = 0; int ultValor2 = 0; void setup() { pinMode(PUL_A, INPUT); pinMode(PUL_B, INPUT); MIDI.begin(); Serial.begin(115200); // Velocidad de comunicación para Hairless } void loop() { // Lógica para el Pulsador A (Note On/Off) if (digitalRead(PUL_A) == LOW) { reboteA = true; } if (digitalRead(PUL_A) == HIGH && reboteA == true) { MIDI.sendNoteOn(60, 127, 1); // Nota 60 (C5), velocidad 127, canal 1 delay(500); // Pequeña pausa para simular duración de nota MIDI.sendNoteOff(60, 127, 1); reboteA = false; } // Lógica para el Pulsador B (Note On/Off) if (digitalRead(PUL_B) == LOW) { reboteB = true; } if (digitalRead(PUL_B) == HIGH && reboteB == true) { MIDI.sendNoteOn(80, 127, 1); // Nota 80 (G6), velocidad 127, canal 1 delay(500); MIDI.sendNoteOff(80, 127, 1); reboteB = false; } // Lógica para el Potenciómetro A (Volumen - CC7) controlChange1 = analogRead(POT_A) / 8; // Mapea 0-1023 a 0-127 if (controlChange1 != ultValor1) { MIDI.sendControlChange(7, controlChange1, 1); // Control Change 7 (Volumen) ultValor1 = controlChange1; } // Lógica para el Potenciómetro B (Sustain - CC64) controlChange2 = analogRead(POT_B) / 8; // Mapea 0-1023 a 0-127 if (controlChange2 != ultValor2) { MIDI.sendControlChange(64, controlChange2, 1); // Control Change 64 (Sustain) ultValor2 = controlChange2; } }

Carga este código en tu Arduino Nano. Luego, abre Hairless MIDI<->Serial Bridge, selecciona el puerto serial de tu Arduino y el puerto MIDI virtual de salida. Finalmente, abre VMPK y selecciona el puerto MIDI virtual de entrada. Al pulsar los botones, escucharás las notas, y al mover los potenciómetros, verás los cambios en el volumen o sustain del teclado virtual.

Preguntas Frecuentes (FAQ)

¿Puedo usar otros modelos de Arduino para un controlador MIDI?

Sí, la mayoría de los modelos de Arduino (Nano, Mega, Leonardo) pueden ser usados. El proceso de reflasheo con Hiduino está más documentado para el UNO, pero el principio de enviar datos MIDI por serial o usar otras librerías es aplicable a casi todos. Los modelos con chips ATmega32U4 (como Leonardo) son más sencillos, ya que pueden emular dispositivos USB nativamente sin necesidad de reflashear el firmware.

¿Qué pasa si quiero más botones o controles en mi controlador?

Puedes expandir el número de entradas utilizando técnicas como el multiplexado, matrices de botones o el uso de expansores de pines (como MCP23017). Esto te permite conectar una gran cantidad de botones, potenciómetros y otros sensores a un número limitado de pines de Arduino. Asegúrate de adaptar tu código para leer estas configuraciones.

¿Es reversible el flasheo del firmware Hiduino?

¡Absolutamente! Si en algún momento deseas que tu Arduino UNO vuelva a comportarse como un Arduino estándar (para cargar sketches normalmente desde el IDE), puedes reflashear el firmware original de Arduino. El proceso es idéntico al de flashear Hiduino, solo que en lugar de HIDUINO_MIDI.hex, usarías el archivo .hex del firmware original de Arduino UNO.

¿Necesito ser un experto en electrónica o programación?

No, este tutorial está diseñado para ser accesible. Con un conocimiento básico de electrónica (cómo conectar un botón, qué es una resistencia) y una comprensión elemental de la programación en Arduino, puedes seguir los pasos. La comunidad de Arduino es muy activa y ofrece muchísimos recursos si te encuentras con dudas.

¿Se pueden conectar otros tipos de sensores?

¡Por supuesto! La belleza de Arduino es su versatilidad. Puedes conectar sensores de luz (fotoceldas), de distancia (ultrasónicos), de presión, acelerómetros, joysticks, etc., y mapear sus valores a mensajes MIDI de Control Change o incluso a notas. Esto permite crear controladores muy expresivos y únicos.

Conclusiones

Construir tu propio controlador MIDI con Arduino es un proyecto gratificante que fusiona la electrónica, la programación y la creatividad musical. Ya sea que optes por la solución "plug & play" de Hiduino o la flexibilidad del puente serial con Hairless, las posibilidades son ilimitadas. Esta experiencia no solo te dota de una herramienta musical personalizada, sino que también profundiza tu comprensión de cómo funciona la tecnología detrás de la música. ¡Anímate a experimentar, crear y hacer sonar tus propias melodías con un toque DIY!

Si quieres conocer otros artículos parecidos a Crea Tu Propio Controlador MIDI con Arduino puedes visitar la categoría Librerías.

Subir