Arduino y MIDI

Hola, estoy intentando (sin éxito) controlar equipos MIDI desde Arduino. En principio la cosa parecía fácil ya que el estándar MIDI implementa el mismo formato de byte que el RS232, es decir bit de start, byte de información y bit de stop a un baud rate de 31250.
El código que he probado debería hacer sonar una nota a intervalos de medio segundo y es el siguiente:

int ledPin = 13;
int midiPin = 2;                 

void setup() 
{
  pinMode(ledPin, OUTPUT);              // initializes digital pin 13 as output
  pinMode(midiPin, OUTPUT);                // initializes digital pin 7 as input
  beginSerial(31250);
}

void loop() 
{
  // Send Note On Message
  printHex ( 0x91 ); // Note on message (9) over channel 1
  printHex ( 0x40);  // Note number 0..127 (0x40 == 64)
  printHex ( 0x70);  // Note volume 0..127 (0x70 == 112)
  digitalWrite (ledPin, HIGH);
  delay (500);
     


  // Send Note Off Message
  printHex ( 0x81); // Note off message (8) over channel 1
  printHex ( 0x40); // Note number 0..12 (0x40 == 64)
  digitalWrite (ledPin, LOW);
  delay (500);



}

Y el cableado está inspirado en el siguiente link
http://www.audiomulch.com/midipic/
(yo he puesto un par de inversores detrás del pin 2 de Arduino)

Sin embargo, aunque un diodo de prueba parpadea indicando la actividad de la UART, los equipos midi que he puesto detrás no recogen nada (aunque no sonasen, si estuviesen recogiendo mensajes MIDI parpadearía el led indicador de actividad midi). Supongo que puede ser por dos razones:

  • Arduino no soporta ese baud rate
  • No estoy usando bien la función printHex()

En todo caso este es un problema que no puedo solucionar sin un analizador lógico (que por ahora no tengo) ya que los terminales RS232 que he encontrado para PC sólo soportan una lista de baud rate concreta entre la que no está la usada por MIDI.

  • ¿Alquien ha probado esto y lo ha conseguido? ¿A alguien se le ocurre alguna razón más para que esto no funcione? Si no es así quizás tenga que añadir un analizador lógico a la carta …:wink:

Hola,

has probado a utilizar serialWrite() en lugar de printHex()?

/David

Hola, esta es la nueva versión:

int ledPin = 13; int midiPin = 2;

void setup() { pinMode(ledPin, OUTPUT); // initializes digital pin 13 as output pinMode(midiPin, OUTPUT); // initializes digital pin 2 as input beginSerial(31250); }

void loop() { // Send Note On Message serialWrite (145); // Note on message (9) over channel 1 serialWrite (60); // Note number 0..127 (0x40 == 64) serialWrite (100); // Note volume 0..127 (0x70 == 112) digitalWrite (ledPin, HIGH); delay (500);

// Send Note Off Message serialWrite (129); // Note off message (8) over channel 1 serialWrite (60); // Note number 0..12 (0x40 == 64) digitalWrite (ledPin, LOW); delay (500); }

He bajado el baud rate a 9600 y he monitorizado desde el terminal RS232. Los mensajes que me llegan son los correctos pero al subir a 31250 bps y conectarlo al dispositivo MIDI éste sigue sin responder :'(. Voy a ir a visitar a un amiguete que curra en la universidad a ver si me puede dejar usar el analizador un rato. Supongo que estoy cerca, ya os contare...

Hola a todos Bueno a parte de que debería utilizar el pin 1 y no el 2 :-[ como salida serie de la placa, una vez solucionado esta y otras cuestiones todavía no he conseguido disparar sonidos MIDI. He leído por ahí en otro post que con el modelo de placa RS232 la máxima tasa es de 19200 bps así que de momento lo dejo ya que necesito 31250. ¿El modelo USB soportaría esta tasa? Mi último intento será utilizar PD para generar mensajes MIDI y sacarlos por la salida de mi tarjeta de sonido hacia los dispositivos que vaya a usar.

Parece que esto último tiene más posibilidades de funcionar, de momento el midi out de la tarjeta saca los mensajes generados por PD. Me falta conectar Arduino con PD, pero estoy bastante verde en el asunto. He descargado arduino_multisensor_hans.pd junto con two_potentiometers, este último funcionando OK. Aún no he conseguido detectar nada en PD supongo que los recuadritos amarillos se actualizarán con los valores de los potenciómetros ¿es así ???? He retocado alguna de las etiquetas para adaptarlo a mi puerto y a mi baud rate, ¿necesito configurar algo más? ¿debo cargar alguna extensión extra para PD para que funcione el interface serie?

Hola,

el PD que tenemos en www.arduino.ws ya incluye todo lo necesario. En el caso de que te lo hayas bajado de otro sitio, lo que te hara falta es el paquete commport2000 para PD. Solo tienes que copiar el patch arduino_multisensor_hans.pd en la misma carpeta que el commport2000 y el solito encontrara todas las conexiones.

Un saludo,

David

Hola, gracias por tu respuesta. De momento sigo sin conseguir nada. Unas etiquetillas que hay hacia s comctl me funcionan en el script de test con una salida que dice más o menos

set bits of COM1 to 8.000000
set rts-cts of COM1 to 0.000000
set baudrate of COM1 to 300.000000

Sin embargo en arduino multisensor tengo

error: gatom: no method for 'baud'

aparte de esto también obtengo al arrancar el siguiente error

Opened serial line device  COM1

RXERRORS on serial line

Si la cosa no tiene una respuesta sencilla, me valdría con un script para un solo sensor como los que usó Quique en el Medialab. Sabes si se puede descargar de algún sitio? Gracias de nuevo, saludos.

Hola, ya comunico arduino con PD, he tenido que retocar un poco el script (no sé si con buen o con mal criterio), pero el caso es que he quitado el conector que unía r comctl con una etiquetita en la que hay un cero y conectando. Y por otra parte he conectado r comctl con comport 0 9600 y éste último con trigger float float, al estilo del ejemplo proporcionado con la librería la cosa chuta. No sé si me habré cargado algo, pero así funciona. Mañana intentaré integrarlo todo... ya os contaré.

Hola,

eso es lo que pasaba, que al no existir el puerto de partida, PD no dibuja las conexiones entre las cajas.

En cualquier caso Quique, para implementar el tema del midi, porque no echas un vistazo al tutorial que acabo de publicar (esta sin fotos ni nada, pero el programa es autoexplicativo). Es sobre DMX y muestra un programa que puede hacer de master DMX y mandar paquetes de byes con 4 microsegundos por bit.

Por otra parte, si tienes un diagrama de tiempos del midi y puedes escanearlo y mandarmelo, estare encantado de echarte una mano. Tengo un osciloscopio aqui que es mano de santo ;-)

Un abrazo,

/David

Hola, está interesante este código, veo bastantes funciones que desconozco (aunque más o menos se intuye para qué valen), son nuevas o es que hay funciones que no están documentadas?

La norma MIDI es una especificación para interconexión de instrumentos musicales a varios niveles, físico, transporte, ... Básicamente es una comunicación en serie de 10 bits (1 start - byte de datos - 1 stop), a 31250 bps. Los mensajes MIDI normalmente están compuestos por varios bytes, por ejemplo

0x91 // activa una nota en el canal 1
0x60 // la nota será la 96
0x64 // y el volumen será 100

Ya he podido comprobar, analizando la forma de onda, que estoy generando estos mensajes y con este formato, por eso creo que lo siguiente a hacer sería compararlos con los mensajes generados por otro equipo MIDI. Esto me permitiría ver si existe algún problema de electrónica.

En todo caso lo que necesitaba urgentemente era una solución "funcional" del asunto y creo que haciendo este bucle con PD por lo menos estoy tranquilo ya que la movida la entregamos en Abril. La meta final será utilizar Arduino únicamente para generar los mensajes MIDI a partir de sensores etc, pero eso ya sin presiones. Un saludo y muchas gracias por tu ayuda