Objetivos

 

  • Recibir mensajes MIDI del teclado en nuestro Arduino y hacer un MIDI THRU al sintetizador.
  • Obtener el tipo de mensaje que nos llega.
  • Obtener los bytes de datos que nos están llegando.
  • Encender un LED cuando toquemos una nota determinada.
  •  

    Material requerido

     

     ArduinoUNO

    Arduino Uno o similar

    Esta sesión acepta cualquier otro modelo de Arduino.

     CableUSB Un cable USB adecuado al conector de tu Arduino.
     PC Un PC con el entorno de trabajo MIDI correctamente instalado y configurado.

    RECIBIR MENSAJES Y HACER UN MIDI THRU

     

    Hasta ahora hemos generado los mensajes MIDI utilizando nuestro Arduino, pero lo más interesante de trabajar con MIDI y Arduino es utilizar y manipular los mensajes que nos lleguen desde otro dispositivo, en este caso un teclado. En realidad, ahora ya estamos recibiendo mensajes MIDI en el Arduino cada vez que, por ejemplo, tocamos una nota, la soltamos o cambiamos de instrumento, pero como no le hemos dicho nada, nuestro Arduino no les hace ningún caso.

    Ya hablamos en la primera sesión de lo que era un MIDI THRU, y como es lo más sencillito, es lo primero que vamos hacer. En realidad el MIDI THRU lo activamos por defecto con la instrucción void MIDI.begin() que conocemos de la sesión anterior. Ahora sólo nos queda leer los mensajes y automáticamente Arduino se encargará de mandarlos al sintetizador. Para ello usaremos la función void MIDI.read() de la librería.

    #include 
    
    MIDI_CREATE_DEFAULT_INSTANCE();
    
    void setup()
    {  MIDI.begin();          // Configura MIDI y escucha todos los canales
      Serial.begin(115200);
    }
    void loop()
    {  MIDI.read();                // Lee los mensajes recibidos
    }
    
    

    Si tocáis algunas teclas, y tenéis correctamente seleccionados los MIDI IN y MIDI OUT en el Hairless, veréis como las notas que toquéis empiezan sonar, y podréis ver como se iluminan los círculos verdes cada vez que el Arduino recibe o envía un mensaje. Podéis probar a cambiar el instrumento y veréis como también cambia (y se ve reflejado en el Hairless) aunque esto iremos también viéndolo más adelante. Os dejamos el programa completo aquí: recibir_mensajes_MIDI.

    hairless thru

  • Si algún despistado, vamos a recordar que un MIDI THRU sirve para copiar en la salida exactamente lo mismo que llega por la entrada.
  • Recordad seleccionar correctamente las conexiones virtuales MIDI en el Hairless o los dispositivos físicos que estéis empleando, el teclado como MIDI IN y el sintetizador como MIDI OUT.
  • Si usáis el teclado virtual y al tocar no suena nada,  mantened el ratón pulsado y tocad unas cuantas teclas hasta que empiece a funcionar.
  •  

    OBTENER EL TIPO DE MENSAJE Y MANIPULAR LOS MENSAJES

     

    Lo que vamos a hacer ahora es desactivar el MIDI THRU y hacer que toquemos la nota que toquemos siempre suene el Do central. Para ello lo primero que debemos hacer es añadir una función void MIDI.turnThruOff() en el setup que precisamente lo que hace es eso, desactivar el MIDI THRU, que por defecto viene activado.

    void setup()
    { MIDI.begin(); // Configura MIDI y escucha todos los canales
     Serial.begin(115200);
     MIDI.turnThruOff();
    }

    Para obtener el tipo de mensaje utilizaremos la función void MIDI.getType() que nos devuelve el tipo de mensaje en formato numérico. Si recordáis sesiones anteriores, el mensaje NoteOn, que es el que queremos buscar ahora, correspondía al valor 9 en los 4 bits que nos indicaban el tipo de mensaje dentro del byte de mensaje, y el valor que nos devolverá esta función para un mensaje NoteOn será en hexadecimal 0x90. Para el NoteOff sería 0x80, y de los demás ya iremos hablando cuando los vayamos presentando.

    Por lo tanto, sólo tenemos que preguntarle a Arduino si ha recibido algún mensaje, y en caso de que así sea pedirle el tipo. Y si el tipo es el que buscamos, en este caso, NoteOn (0x90), enviaremos el mensaje para tocar la nota del Do central. En caso contrario haremos que deje de sonar con un Note Off. La programación quedaría así:

    void loop()
    { if (MIDI.read()) // Comprueba si hay mensaje
     {
     int tipo=MIDI.getType();
     if (tipo == 0x90)
     {
     MIDI.sendNoteOn(60,127,1);
     }
     else
     MIDI.sendNoteOff(60,127,1);
     }
    }

    manipular mensjaes

    La verdad es que el programa no sirve para mucho, pero ilustra bien lo que queremos explicar. Si tuvieseis mucha paciencia podrías hacer un array con la notas de una canción, y hacer que Arduino toque esas notas independientemente de lo que toquéis. Así con seguir el ritmo parecería que sabemos tocar algo. A mí me vendría bien, porque no tengo ni idea de tocar el piano. Aquí podéis descargar el programa: recibir_mensajes_tipo.
     

    OBTENER LOS DATOS DEL MENSAJE

     

    Y por último en esta sesión, vamos a obtener los datos del mensaje. Si recordáis las sesiones anteriores, vimos como un mensaje estaba compuesto de un byte de mensaje que nos indicaba el tipo de mensaje y el canal  que va dirigido, y otra serie de bytes con los datos del mensaje. En el caso de los mensajes Note On y Note Off teníamos dos bytes de datos, uno con la nota y otro con la velocidad.

    note on velocidad 0

    Así como obteníamos el tipo de mensaje con la función void MIDI.getType(); podemos también acceder a los bytes de datos con las funciones void MIDI.getData1() y void MIDI.getData2(), cada una para obtener uno de los bytes. En este caso usaremos la primera para obtener el byte correspondiente a la nota que nos ha llegado, habiendo comprobado antes que efectivamente el mensaje es de Note On. Y haremos que, si la nota es un Do central (60), se ilumine el LED de nuestro Arduino conectado al pin digital 13.

    #include <MIDI.h>
    
    MIDI_CREATE_DEFAULT_INSTANCE();
    
    #define LED 13
    
    void setup()
    {
     pinMode(LED, OUTPUT);
     MIDI.begin(); // Configura MIDI y escucha todos los canales
     Serial.begin(115200);
    }
    void loop()
    {
     if (MIDI.read()) // Comprueba si hay mensajes
     {
     int tipo=MIDI.getType();
     int nota=MIDI.getData1();
     if (tipo == 0x90 && nota == 60)
     {
     digitalWrite(LED,HIGH);
     }
     else
     digitalWrite(LED,LOW);
     }
    }

    Aquí tenéis el programa completo: recibir_mensajes_LED
     

    Resumen de la sesión

     

    En esta sesión hemos aprendido varias cosas importantes:

  • Hemos aprendido a recibir los mensajes del teclado en Arduino.
  • Sabemos como configurar nuestro Arduino como MIDI THRU.
  • A reconocer los tipos de mensaje y obtener los bytes de datos.
  • filtrar los mensajes que nos llegan y encender un LED al recibir una nota determinada.
  •   

    Deja una respuesta