Arduino MIDI por USB (Hiduino)

#1 por nikoula el 29/08/2014
Para gente que quiera crearse un controlador MIDI y no tenga interfaz con entrada MIDI o no quiera gastarse dinero en un adaptador, una muy buena opción es utilizar el USB para enviar los datos.
Uno de los problemas que muchos sabréis es que si enviamos los datos del Arduino al ordenador via USB, necesitaremos software adicional para convertir serial a midi (como el hairless), además de otro programa que nos genere puertos midi virtuales (midiyoke). La verdad que es bastante engorro y no queda demasiado profesional. Encontré por hispasonic mucha gente hablando de HIDUINO.

¿Que es HIDUINO?
Es un firmware que permite que nuestro arduino sea reconocido por el ordenador como un dispositivo midi comercial. Por lo cual deberemos cargar el código que queramos al arduino y luego meterle este nuevo firmware. Ya no necesitaremos hairless ni midiyoke.

¿Como se mete HIDUINO en el Arduino (flashear)?
No es nada dificil. Ver aquí: http://geekytheory.com/arduinomidi-tu-propio-piano/

Espero que sea de vuestro interés.
Subir
#2 por Endre el 29/08/2014
Es un artículo genial, Alvaro.

A mi lo que más me para de Arduino y todos estos proyectos para hacerlo uno mismo es el paso final para integrarlo en el estudio o directo. Me refiero a que las opciones que he encontrado para proteger los circuitos en cajas o bastidores son más caros que las propias placas.

Por ejemplo, llevo tiempo queriendo comprar o hacer un joystick de dos direcciones para controlar un módulo vía midi. En principio no me importaría si fuera vía USB porque así también podría usarlo con algunos vst.

Algo así como:

joystick1.jpg

Pero luego, implementar el midi y ponerlo en una caja para poder usarlo en directo hace que el precio sea tan caro (o más) que comprar un equipo terminado.

¿Qué piensas tú?
Subir
#3 por nikoula el 29/08/2014
Gracias por tu comentario :)
Endre escribió:
Pero luego, implementar el midi y ponerlo en una caja para poder usarlo en directo hace que el precio sea tan caro (o más) que comprar un equipo terminado.

La verdad que los proyectos DIY (Do it yourself) tienen muchos fines y a veces ahorrase dinero no es uno de ellos. Desde mi punto de vista una de las principales ventajas de este tipo de proyectos es adaptarlos a las necesidades de cada uno. Por otro lado es un mundo donde existe gran cantidad de ayuda entre usuarios además de que todo suele ser código libre, por lo que puedes modificar lo que otro usuario ha creado y adaptarlo aún mas a tus necesidades. Además, realizando este tipo de proyectos se aprende un montón de cosas. Si hablamos de controladores midi, se puede llegar a entender el protocolo midi perfectamente y como funciona a nivel de bit. Lo mismo para todo el mundo de pedales de guitarra diy, mesas, convertidores, eqs,... realizando estos proyectos podemos aprender un montón de electrónica.

Endre escribió:
Me refiero a que las opciones que he encontrado para proteger los circuitos en cajas o bastidores son más caros que las propias placas.

A mi muchas veces me pasa lo mismo. La verdad que es una pena que pueda llegar a salir mas caro una simple caja (que además hay que taladrar) que lo que de verdad importa como la electrónica o placas. Depende mucho del proyecto pero rebuscando por internet y siendo un poco hábil con el diseño, pueden salir modelos bastante simples y económicos.

Endre escribió:
paso final para integrarlo en el estudio o directo

Para estudio yo tiraría de proyectos diy (hablando ahora de midi) sin problema. Sin embargo para directo sería muy necesario testar completamente el dispositivo y estar seguro de que el código esta bien hecho y no hay lugar a fallo (también se pueden usar códigos de gente que ya lo haya comprobado). La estabilidad de Arduino es muy buena si se programa bien, pero para un directo como sabrás no se puede dejar nada al azar.

En resumen y bajo mi punto de vista. Hablando de proyectos diy midi (por ejemplo con Arduino), no siempre el bajo coste es la motivación. Eso si, podemos crear el dispositivo que mas se adecue a nuestras necesidades (no hace falta ser un genio, y además hay mucha ayuda por internet). Y por último además de ser una forma muy buena de entretenimiento, nos permite aprender un montón de cosas que permiten ver todo desde otro punto de vista.

Un ejemplo de proyecto con arduino, aproximadamente unos 40€: http://alvarorevuelta.net/midispositivomidi/

Un saludo :)
Subir
#4 por Endre el 29/08/2014
Hum; por tus palabras detecto cierta brecha entre la cultura HTM (hazlo tú mismo ;)) y los músicos. He visto el controlador que enlazas y está muy bien, pero ya veo que no está protegido por debajo. En estudio puede hacer su papel pero en directo puedes perderlo fácilmente por algún golpe e incluso por humedad o cosas peores.

También me ha sorprendido que señales la posibilidad de errores de estabilidad. Eso sí que no me lo esperaba.

En mi caso personal, no soy activista del HTM, pero sí que me gusta saber y utilizar posibilidades que no ofrece la industria y que están completamente enfocadas a la música o a mi modo de trabajar con la música.

¿Piensas que todavía falta tiempo para que ésta cultura se integre a un nivel, digamos, menos marginal? Y con marginal no hablo de cuatro frikis cacharreando, sino de dispositivos aptos para músicos que no necesitamos tanto conocer los entresijos de la tecnología sino encontrar caminos interesantes de inspiración.
Subir
#5 por nikoula el 29/08/2014
Endre escribió:
También me ha sorprendido que señales la posibilidad de errores de estabilidad

Todo depende de la escala del proyecto. Si conectas 5 botones y 4 potenciómetros me atrevería a decir que jamás habrá un problema. Pero si contamos proyectos grandes con muchísimas entradas salidas, enviando y recibiendo midi y con un arduino réplica de las chinas (unos 6€), con un firmware que ha hecho un tío, otro código de otro, una librería de no se quién, otra librería de otro tío,... la compatibilidad no sabría decirte si este asegurada. Tampoco es un NO directo, pero arduino no esta destinado a este tipo de proyectos (es más, arduino no está destinado a nada, es simplemente un microcontrolador de carácter general).Y no siempre esta destinado a aplicaciones totalmente profesionales. Teensy quizás este algo más destinado a este tipo de proyectos y sea mas profesional, es más caro (15€ creo) pero la estabilidad no creo que sea un problema: Basado en teensy: http://www.musicradar.com/news/tech/digital-warrior-midi-controller-lands-587132/

Endre escribió:
¿Piensas que todavía falta tiempo para que ésta cultura se integre a un nivel, digamos, menos marginal?

Hace falta tiempo pero no creo que demasiado. Y diría que ya se ha conseguido bastante en ese aspecto, sobre todo con microcontroladores como Arduino, que cualquiera con ganas y un par de tardes puede comenzar a realizar cosillas interesantes. Antes de Arduino era realmente difícil crear cualquier dispositivo midi con pocos conocimientos. Se requería bastante programación y muy poco intuitiva. Ahora hay librerias creadas para Arduino y solo tienes que decir: enviarnotaactivada tal nota, tal velocity, tal canal.
Otro ejemplo, igual algo distinto, es MAX/MSP. Hace varias años era casi impensable crear tu propio sinte sin apenas conocimientos. Si estas familiarizado con MAXP/MSP (yo no lo estoy mucho), puedes hacer cosas muy interesantes trabajando con cajitas y cables, nada de andar horas y horas picando código.
Subir
1
#6 por Endre el 29/08/2014
Muchas gracias por las aclaraciones, Alvaro. :birras:
Subir
#7 por C.R.D el 29/08/2014
Hola compañero alvaro revueltas exelente aportacion, tengo una duda, yo construi un controlador midi con pads usando un codigo que encontre en el foro, mi pregunta es como le integraria la utlidad que tu mencionas al codigo, soy muy novato en esto del arduino y me gustaria mejorar mi controlador y dejar de depender de la interfase midi usb que tengo y aparte darle alimentacion por el puerto usd del arduino, te dejo el codigo espero puedas ayudarme.



//linea 1
const int buttonDoPin = 2;//numeracion de pin
const int button2Pin = 3;
const int button3Pin = 4;
const int button4Pin = 5;
//linea 2
const int button5Pin = 8;
const int button6Pin = 9;
const int button7Pin = 10;
const int button8Pin = 11;
//linea 3
const int button9Pin = 22;
const int button10Pin = 24;
const int button11Pin = 26;
const int button12Pin = 28;
//linea 4
const int button13Pin = 23;
const int button14Pin = 25;
const int button15Pin = 27;
const int button16Pin = 29;
//linea 1
int noteDo = 36; //MIDI note 69=A (440hz)
int note2= 37;
int note3= 38;
int note4= 39;
//linea 2
int note5= 40;
int note6= 41;
int note7= 42;
int note8= 43;
//linea3
int note9= 44;
int note10= 45;
int note11= 46;
int note12= 47;
// linea4
int note13= 48;
int note14= 49;
int note15= 50;
int note16= 51;

int buttonDoState = 0;// current state of the button
int button2State = 0;
int button3State = 0;
int button4State = 0;
int button5State = 0;
int button6State = 0;
int button7State = 0;
int button8State = 0;
int button9State = 0;
int button10State = 0;
int button11State = 0;
int button12State = 0;
int button13State = 0;
int button14State = 0;
int button15State = 0;
int button16State = 0;

int lastButtonDoState = 0;
int lastButton2State = 0;
int lastButton3State = 0;
int lastButton4State = 0;
int lastButton5State = 0;
int lastButton6State = 0;
int lastButton7State = 0;
int lastButton8State = 0;
int lastButton9State = 0;
int lastButton10State = 0;
int lastButton11State = 0;
int lastButton12State = 0;
int lastButton13State = 0;
int lastButton14State = 0;
int lastButton15State = 0;
int lastButton16State = 0;
int val;
void setup() {
// initialize the button pin as a input:
pinMode(buttonDoPin, INPUT);
pinMode(button2Pin, INPUT);
pinMode(button3Pin, INPUT);
pinMode(button4Pin, INPUT);
pinMode(button5Pin, INPUT);
pinMode(button6Pin, INPUT);
pinMode(button7Pin, INPUT);
pinMode(button8Pin, INPUT);
pinMode(button9Pin, INPUT);
pinMode(button10Pin, INPUT);
pinMode(button11Pin, INPUT);
pinMode(button12Pin, INPUT);
pinMode(button13Pin, INPUT);
pinMode(button14Pin, INPUT);
pinMode(button15Pin, INPUT);
pinMode(button16Pin, INPUT);

// initialize serial communication:
// Set MIDI baud rate:
Serial.begin(31250);
}
void loop() {

buttonDoState = digitalRead(buttonDoPin);
if (buttonDoState == 0)
{ noteOn(0x90, noteDo, 0x00);}
else if (buttonDoState == lastButtonDoState)
{}
else { noteOn(0x90, noteDo, 0x45);}

button2State = digitalRead(button2Pin);
if (button2State == 0)
{ noteOn(0x90, note2, 0x00);}
else if (button2State == lastButton2State)
{}
else { noteOn(0x90, note2, 0x45);}

button3State = digitalRead(button3Pin);
if (button3State == 0)
{ noteOn(0x90, note3, 0x00);}
else if (button3State == lastButton3State)
{}
else { noteOn(0x90, note3, 0x45);}

button4State = digitalRead(button4Pin);
if (button4State == 0)
{ noteOn(0x90, note4, 0x00);}
else if (button4State == lastButton4State)
{}
else { noteOn(0x90, note4, 0x45);}

button5State = digitalRead(button5Pin);
if (button5State == 0)
{ noteOn(0x90, note5, 0x00);}
else if (button5State == lastButton5State)
{}
else { noteOn(0x90, note5, 0x45);}

button6State = digitalRead(button6Pin);
if (button6State == 0)
{ noteOn(0x90, note6, 0x00);}
else if (button6State == lastButton6State)
{}
else { noteOn(0x90, note6, 0x45);}

button7State = digitalRead(button7Pin);
if (button7State == 0)
{ noteOn(0x90, note7, 0x00);}
else if (button7State == lastButton7State)
{}
else { noteOn(0x90, note7, 0x45);}

button8State = digitalRead(button8Pin);
if (button8State == 0)
{ noteOn(0x90, note8, 0x00);}
else if (button8State == lastButton8State)
{}
else { noteOn(0x90, note8, 0x45);}

button9State = digitalRead(button9Pin);
if (button9State == 0)
{ noteOn(0x90, note9, 0x00);}
else if (button9State == lastButton9State)
{}
else { noteOn(0x90, note9, 0x45);}

button10State = digitalRead(button10Pin);
if (button10State == 0)
{ noteOn(0x90, note10, 0x00);}
else if (button10State == lastButton10State)
{}
else { noteOn(0x90, note10, 0x45);}

button11State = digitalRead(button11Pin);
if (button11State == 0)
{ noteOn(0x90, note11, 0x00);}
else if (button11State == lastButton11State)
{}
else { noteOn(0x90, note11, 0x45);}

button12State = digitalRead(button12Pin);
if (button12State == 0)
{ noteOn(0x90, note12, 0x00);}
else if (button12State == lastButton12State)
{}
else { noteOn(0x90, note12, 0x45);}

button13State = digitalRead(button13Pin);
if (button13State == 0)
{ noteOn(0x90, note13, 0x00);}
else if (button13State == lastButton13State)
{}
else { noteOn(0x90, note13, 0x45);}

button14State = digitalRead(button14Pin);
if (button14State == 0)
{ noteOn(0x90, note14, 0x00);}
else if (button14State == lastButton14State)
{}
else { noteOn(0x90, note14, 0x45);}

button15State = digitalRead(button15Pin);
if (button15State == 0)
{ noteOn(0x90, note15, 0x00);}
else if (button15State == lastButton15State)
{}
else { noteOn(0x90, note15, 0x45);}

button16State = digitalRead(button16Pin);
if (button16State == 0)
{ noteOn(0x90, note16, 0x00);}
else if (button16State == lastButton16State)
{}
else { noteOn(0x90, note16, 0x45);}

lastButtonDoState = buttonDoState;
lastButton2State = button2State;
lastButton3State = button3State;
lastButton4State = button4State;
lastButton5State = button5State;
lastButton6State = button6State;
lastButton7State = button7State;
lastButton8State = button8State;
lastButton9State = button9State;
lastButton10State = button10State;
lastButton11State = button11State;
lastButton12State = button12State;
lastButton13State = button13State;
lastButton14State = button14State;
lastButton15State = button15State;
lastButton16State = button16State;
}

void noteOn(int cmd, int pitch, int velocity) {
Serial.write(byte (cmd));
Serial.write(byte (pitch));
Serial.write(byte (velocity));
}
Subir
#8 por nikoula el 29/08/2014
#7 Si tienes el código funcionando, enlaza al post que escribí y busca en el apartado "Flashear Arduino con un nuevo firmware". El código no es necesario modificarlo es exactamente el mismo. Solo es necesario meterle un nuevo firmware al Arduino, y se hace como esta escrito en el post.

Míralo y si tienes cualquier problema no dudes en preguntar.
Por cierto, el código podría hacerse en menos lineas. Si miras en el post que puse, también te dará pistas sobre como optimizarlo (o eso pienso yo).
Subir
#9 por mustang64 el 30/08/2014
El tema de la fiabilidad se garantiza con pruebas, cuanto más complejo, muchas más pruebas.
Para no estar una semana programando y tres meses probando, se pueden hacer pruebas de módulos e ir dejándolos listos y probados, de manera que se sepa que tal módulo no falla. Nunca, o casi nunca se puede decir que está bien. Se dice que no se detectan fallos.
No hay más que ver los fabricantes de dispositivos digitales (o software), que lanzan nuevas versiones del corrigiendo los infinitos bugs existentes. Y vivimos con ellos.
El tema es que se programa el cacharro y se le putea hasta la saciedad. Es un rollo, pero las pruebas es lo que garantizan la estabilidad.
Y el límite lo pone cada uno. Total, es un aparato DIY para uso personal.
Y para el escenario, hay que montar un sistema de reset que funcione lo más rápido posible.

Saludos.

M64.
Subir
#10 por C.R.D el 29/10/2014
Hola compañeros muchas gracias por el tutorial despues de muuuucho trabajo lo logre hacer :), solo quiero hacer una pequeña contribucion: si usamos arduino mega 2560 en windows 7 es mas facil usar el flip installer, instalamos el programa, conectamos el arduino mega y lo ponemos en modo dfu (usamos un jumper en los dos "palitos" superiores que estan pegados al conector usb ,hay 6 solo vamos a usar los dos que estan mas proximos al conector usb) con el jumper conectamos primero el de la derecha (tomando la derecha del lado donde esta el conector de voltaje) y luego conectamos el otro jumpler, esperamos unos momentos y quitamos el primer jumper que conectamos y luego el segundo, arduino mega entrara en modo dfu, vamos al administrador de dispositivos e instalamos el driver para modo dfu (se encuentra en la carpeta de instalacion del flip en la carpeta usb), una vez que se instalo cerramos el administrador y abrimos el programa filp , ahi nos vamos a devices y selecionamos atmega 16u2, ledamos en ok , luego vamos a settings-comunicacion-usb y le damos ok, si todo lo hicimos bien ya podemos cargar el archivo de hiduino, debemos copiar el contenido del archivo que esta en la pagina (el codigo que son ceros y unos) en un archivo de texto, lo cargamos y le damos donde dice run, con esto ya queda listo el arduimo mega 2560, espero se entienda como lo hice y que les sirva.
Subir
#11 por C.R.D el 29/10/2014
Hola compañero alvaro revuelta , primero gracias por tu tutorial para hiduino, después de mucho trabajo logre hacer que mi placa arduino mega funcionara como un controlador midi convencional, hice los pasos que usas en tu tutorial y me funciono ala perfección, solo quiero pedirte si puedes ayudarme a ese mismo código del tutorial agregarle 16 potencionmetros, quiero construir un midi figter pero que tenga 16 potenciometros, espero puedas ayudarme con ese código o decirme como puedo yo programarlo y hacerlo, podrías darme solo el ejemplo con el primer potenciometro y yo podría hacer los otros 15, como vez?? espero puedas ayudarme, llevo tratando de construir mi controlador casi dos años y ahora gracias a tu ayuda estoy muy cerca de terminarlo, saludos y suerte!!!!
Subir
#12 por nikoula el 29/10/2014
#11

Buenas!
Si estas usando Arduino MEGA tienes suerte, ya que tiene exactamente 16 entradas analógicas y no vas a necesitar realizar multiplexación, así que te será mucho más sencillo. No obstante te recomiendo que más adelante investigues sobre mutiplexación ya que con esas 16 entradas analógicas, y unos pines digitales para direccionar, podrás manejar muchas decenas de potenciometros, incluso llegar a 100 sin problema.

Vamos a lo sencillo, 16 entradas analógicas 16 potenciómetros, sin complicaciones.
Lo que deberás hacer será crear unas variables, leer el valor de cada pin, y enviar un mensaje de CC con un valor comprendido entre 0 y 127. Hay muchos post por hispasonic que lo explican muy bien:
http://www.hispasonic.com/foros/mi-1er-controlador-midi-arduino/382085

También te invito a que leas este articulo de mi web: http://alvarorevuelta.net/midi-and-how-does-it-work/

Un saludo!
Subir
#13 por C.R.D el 30/10/2014
Gracias Alvaro, ya le di una revisada a los post que me recomiendas e intente meter los potenciometros al código que tu tienes en tu Blog, después de mas de 6 horas de intentar no pude hacer que funcionara , el problema es que yo de programación y electrónica se muy poco ya que yo estudie Sociología y esto de los controladores es por gusto, si no es mucha molestia ¿podrías ayudarme un poco mas?, si puedes ayúdame a en el código de tu blog (el de flashear arduino) integrarle los potenciometros, solo te pido que me ayudes con uno y me digas de forma rápida como hacer los demás y yo lo hago, por lo que e visto teniendo el primer botón o potenciometro ya puesto en el código seria cuestión de ir componiéndolo y modificandolo según cada entrada analógica, espero puedas ayudarme o ilustrarme un poco mas a como hacer el código. Otra opción es que usando el poste que me recomiendas ( http://www.hispasonic.com/foros/mi-1er-controlador-midi-arduino/382085 ) me dijeras como integrar ese código al código que tienes en tu blog, de esa forma yo podría clonar los códigos para cada uno de os 16 potenciometros, el problema que tuve al yo intentar hacerlo es que no supe como integrar ese código y siempre me salia error al compilar, espero puedas ayudarme, saludos y suerte!!!
Subir
#14 por nikoula el 13/08/2016
Reabro el post para indicar que el proyecto ya está a la venta.
http://bananutelectronics.com/producto/midispositivomidi/

Espero que sea de vuestro interés.

Un saludo.
Subir
#15 por jBetances el 22/08/2016
Muchisimas gracias por este dato! Justo ando metido en un proyecto para clonar un Monome Arc con arduino, y me viene de perlas esto. :D

Sin firma, por ahora...

Subir
Respuesta rápida

Regístrate o para poder postear en este hilo