ARDUINO+MIDI: TU PROPIO PIANO
Como fabricar un piano controlador usando Arduino y MIDI.
Hola! Me llamo Álvaro López (@alvarolrevuelta) y hoy os enseñaré como fabricar vuestro propio piano controlador usando Arduino y MIDI. Muchos diréis ¿Qué es eso del MIDI? ¿Para qué sirve? Pues muy sencillo, MIDI (Musical Instrument Digital Interface) es un protocolo de comunicación serial que permite conectar ordenadores, sintetizadores, controladores y demás elementos destinados a la creación de sonidos. Dicho protocolo data de los años ochenta pero aún se sigue usando hoy en día y de manera muy extendida, nos podemos encontrar gente que lo usa hasta para controlar luces y servos.
Este es un ejemplo de controlador MIDI comercial. Posee una salida USB para conectar al ordenador.
Lo que haremos será usar varios botones conectados al Arduino que leerá cuando se pulsan. En el caso de que se pulse uno haremos que Arduino envié a nuestro ordenador por medio del cable USB unos datos indicando que botón ha sido pulsado y qué nota debe enviar (un Do, un Re,...). Una vez en el ordenador deberemos usar algún programa como Traktor, Ableton, Cubase, Nuendo, Reason,... que interpretará los datos MIDI recibidos y generará un sonido que podremos escuchar por los altavoces de nuestro ordenador. Este último paso es importante ya que MIDI es solamente un protocolo, es decir, no suena por si solo.
Como Arduino no es un dispositivo pensado para estos fines, no puede ser reconocido por los programas de audio mencionados anteriormente como si fuera un dispositivo midi comercial. Una de las formas es emplear unos convertidores Serial a MIDI y unos puertos virtuales (cosa muy extendida por Internet, como HairLess y MidiYoke). Sin embargo, lo que vamos a hacer es reflashear nuestro Arduino UNO con un nuevo firmware llamado Hiduino, lo que nos permitirá crear un dispositivo "Plug & Play" como si fuera un controlador MIDI comercial.
Manos a la obra, necesitaremos:
- x11 Switches (también se pueden usar menos)
- x01 Resistencia 10k Ohm
- Arduino UNO y cable USB
- ProtoBoard
- Programa Arduino
- DFU-Programmer (sobre Linux o Mac)
- Hiduino Firmware
- Librería MIDI
1. Realizar conexiones
Pero vayamos paso a paso, lo primero conectar los 11 botones. Como podéis ver la conexión es muy sencilla, conectamos cada botón entre GND y el pin correspondiente (del 2 al 12). Para que se pueda funcionar así, será necesario habilitar las resistencias de pullup internas (se hace desde el código). Ojo si usáis el pin 13, que requiere una resistencia de pullup externa.
2. Introducir código prueba (no es MIDI)
Hasta aquí fácil ¿no?. Vamos a cargar un código que verifique el correcto funcionamiento de todos los botones. Aún no hemos empezado con MIDI.
/** 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 } }
Ahora abrir el puerto serial con un baud rate de 9600 e ir pulsando y liberando los botones. Podréis ver como al pulsarlo se nos indica por el monitor serial que botón ha sido pulsado, y cuando se libera cual ha sido liberado. Repito que hasta aquí no hemos hecho nada de MIDI, simplemente estamos testando el hardware e introduciendo el código que usaremos.
3. Vamos con MIDI
A continuación debemos cargar el siguiente código. Este código hace uso de la librería MIDI de Arduino. (Descargar la librería e instalarla). Simplemente se emplea un baud rate de 31250 y se envía mensajes serial con la sintaxis de MIDI. Nos centraremos en el mensaje de NoteOn es decir, nota activada. Este mensaje lleva información de la nota pulsada (Do, Re,...), con que intensidad se pulsó esta nota (127 es el máximo, nosotros usaremos el máximo ya que nuestros botones no tienen sensibilidad) y en que canal MIDI se quiere enviar el mensaje (hay 16 disponibles). Cargamos el código, nada más.
#include // 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 } }
Se puede apreciar que el código es muy parecido al anterior, solo que cuando se detecta botón pulsado/liberado se envía un mensaje de nota activada o desactivada. El valor de nota enviado por el primer botón es 48 que según el protocolo MIDI corresponde a DO. Por lo tanto el siguiente botón enviará DO Sostenido, el siguiente RE,...
Ahora ya no tiene sentido visualizar el puerto serial, ya que veremos caracteres sin aparente sentido. Lo que tenemos que hacer ahora es hacer que nuestro Arduino sea reconocido como un dispositivo MIDI, para lo que deberemos reflashear el Arduino con un nuevo firmware.
4. Reflasheando el Arduino con Hiduino. (Desde Linux, en Mac es parecido).
Lo primero que deberemos hacer es descargarnos el firmware de Hiduino. Vayamos a la carpeta de "Compiled Firmware" y localicemos el archivo que nos interesa "HIDUINO_MIDI.hex". Pon ese archivo en el escritorio por ejemplo, es simplemente por tener una ruta mas fácil para después.
Ahora nos tenemos que bajar el "dfu-programmer". Si estamos en Linux:
sudo apt-get install dfu-programmer
A continuación necesitaremos que nuestro Arduino entre en modo DFU para que se nos permita introducirle el código. Antes de nada es muy importante que hayáis cargado el código anterior (el del MIDI). Una vez que introducimos este nuevo firmware, no podemos volver a meter código en el Arduino, pero ¡tranquilos! que si volvemos a meter el firmware original de Arduino todo volverá a la normalidad (Se hace de manera idéntica a introducir cualquier firmware). Como he dicho hay que entrar en modo DFU con nuestro Arduino, para ello:
- Mira tu versión: La de un condensador o la de dos (ver fotos)
- Conecta un jumper entre los terminales que se ven en la figura
- Toca con la resistencia entre GND y el pad izquierdo del condensador
- Deberás ver como una luz parpadea y se apaga, retira las conexiones anteriores.
- Estás en modo DFU.
Si todo ha salido correctamente y dejasteis el HIDUINO_MIDI.hex en el Escritorio, deberías de poder hacer lo siguiente. Repito, desde consola Linux:
cd \Desktop
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 del 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. Son bien sencillos y muy divertidos.
Para cualquier duda o sugerencia, deja un comentario :)