Customizar controlador midi con arduino

Les cuento! @Surbyte, te respondo primero que midi en su origen (años 80s'), era como un módulo rs232 para su conexión a la pc. Es el mismo de las impresoras si no me equivoco. De hecho en sus comienzos, los sistemas midi para interactuar con la pc, se conectaban en la misma entrada que usaban las impresoras viejas en la pc para producir música. Al menos ese es mi recuerdo con mi papá que lo usó así durante mucho tiempo. Era un cable con dos DIN (IN y OUT) en un extremo y la entrada rs232... En el medio tenia un circuito que convertía la señal a 232 para que lo interprete la compu como MIDI. No se si es lo mismo que un rs485. Creo que no. No entiendo muy bien su funcionamiento pero si tengo el recuerdo de verlo a mi papá hacer música de ese modo en la pc. Capaz en algo me estoy equivocando por que no soy ducho en el tema. Simplemente tengo ciertas experiencias y curiosidad nada mas... aparte de que crecí en el mundo del USB y eso simplifica la conexión de lo que se nos ocurra. No es como antes cuando yo ni existía en esta tierra y todo era mas complicado.

y @gatul Primero perdón por no haberme explicado bien y por no haber entendido mucho lo que me explicaste... me quedó pendiente investigar sobre el stm32 anoche y solo te fui mostrando lo que hacia con la placa base por si servía de información nada mas. Debería haber empezado viendo en un monitor seríal que me mostraba el stm32 pero como había hecho una lista de supuestas posibilidades me quedé viendo eso antes.
Uso la librería midi en el ide para que el arduino pueda interpretar las señales midi. Quedo así la plantilla por que primero fui probando con un teclado midi virtual donde en hairless puenteaba el puerto com del arduino para enviar la señal del midi virtual al puerto y de ahi a un sintetizador que cumplia su función de fuente de sonido. Creo que me faltó explicar eso.

Anoche estuve un rato mas investigando del stm32 y con un monitor serial pero no me mostraba absolutamente nada. Dentro de las cosas que averigué, junto con el enlace que me compartiste vos @gatul y la idea que comentaste de simplemente hacer la conexión desde el usb mismo, llegué a ésta conclusión:

Si midi es ya convertida a un puerto USB en los pianos y teclados o sintetizadores para que lo interprete la computadora para disparar notas y otras funciones, Podría hacer la inversa con un host usb para volver a la señal midi y ahí si poder hacer que arduino interprete la señal enviandola desde un host. y eso lo hace mucho mas amable al aparato (como bien me recomendaste vos gotul al principio de todo) para no desarmar el pobre aparato y poder usarlo con otros aparatos que funcionen con midi.

Voy bien por ahí?

Acá les dejo el enlace que vi:

La diferencia de este tutorial, es que no usaría DIN. Por que no quiero ir a ningun sintetizador. Quiero ir de usb a señal midi en mi arduino.

Diganme si voy por buen camino o estoy soñando.

Gracias por leerme y perdón si hay cosas en las que me pierdo.

No me voy a poner a discutir la forma del agua, solo decir que MIDI es la sigla en Inglés para Interface Digital para Instrumentos Musicales, que se definió con un protocolo serie a 31250 bps y sobre un conector DIN de 5 pines. Trabaja por corriente, no por voltaje.
Los esquemas que subi antes fueron bajados de MIDI.org

Por supuesto hay variaciones y adaptaciones, algunas aprobadas y normalizadas, otras no.
Así van desde un simple cambio de conector por DB9, pasando por Firewire y Ethernet hasta cambiar en parte para adaptarse a USB y llegar a transmitirse por WiFi o Bluetooth actualmente.

Mi idea, que tal vez no expresé bien, era ver si esos terminales Tx y Rx que nombraste podían ser "capturados" porque tienen más pinta de puerto serie que de USB donde lo lógico sería encontrar pines D+ y D-.

Después veo el enlace.

Saludos

Vamoa ver @samuelmajul a mi me ha sido facil conecto un teclado midi a un puerto, el arduino a otro y configuro el Hairless como tu y me funciona ¿tu como lo haces?
hairless

El AKM320 solo tiene puerto USB, no puerto DIN MIDI.
¿Sino por qué le diría que trate de interceptar la señal en la placa?

Igual hay otra posibilidad, usar conversores serie/USB para entrada y salida, después hacer lo que quiera.
Usar el arduino en seudo modo "midi-thru" e intercalar los datos propios cuando sea necesario, por ejemplo.
De hecho, haciendo esto se podría usar con cualquier dispositivo que envie/reciba datos por USB.
Ojo que se abre un abanico de posibilidades.

Hola @gonpezzi ! si... si mando la información desde el controlador midi por usb en un puerto y que lo reciba el arduino por otro puerto funciona perfecto. Eso no es problema. Lo que quiero es que el teclado midi se comunique directamente por arduino desde alguna conexión en los pines. Eso he estado intentado hacer. Voy a tratar de armar un gráfico mas especifico y te lo voy a compartir mas tarde junto con el codigo que estoy usando en IDE.

Pensé en poner al arduinoe n modo midi thru... puede ser algo útil. Te comparto este video que muestra cosas en especifico que me dejaron totalmente enloquecido con las posibilidades que se pueden hacer.

un host usb en el arduino, una simple programación y cualquier periférico usb al host y disparaba señales midi. Realmente épico.

Estuve tratando de conseguir ayer por la tarde este host usb para pro mini

pero no tuve exito... el host usa el microcontrolador max34021 y está pensado para el pro mini. Pero pasé por todos los locales de electrónica donde compro mis componentes y no conseguí nada. Se te ocurre algo? creo que es por ahi... pasar el usb por el host para reinterpretar la señal midi. O algo asi... no se si me explico.

Esa placa vendida por correo a mi me sale por unos 8 $ con gatos de envio, en cambio comprar un nano que ya trae el puerto usb sale por la mitad, y tendrias dos arduino para trastear.

Pero no es diferente? el host usb no hace que el arduino reciba un periferico usb? y el puerto usb de arudino es para programar o no? o es lo mismo?

El puerto usb de cualquier placa arduino, sirve para las dos cosas, pero claro no al mismo tiempo. En la iimagen del Hairless que mostre antes tenia un arduino uno en modo "midi-thru" funcionando su puerto como un dispoasitivo midi. pero a la hora de programarlo tenia que desactivar el Hairless para que el IDE tuviera acceso a programar el "uno".

Claro si! eso voy haciendo a medida que voy programando o probando. Desconecto el puerto com desde el hairless para seguir en arduino. Lo tengo claro.

Otra cosa que no se si te has dado cuenta o ya lo sabes. ¿para que quires esa placa), ya tienes una, con la que progamas al pro mini . Usala como puerto USB no solo para programar.

La idea que tengo es que el controlador midi que es por USB, llevarlo a arudino y que arduino reciba la señal midi que envía el controlador midi al PC en cualquier programa de producción de música. De ser asi, el puerto usb de arduino ya estaría siendo usado para enviar la información del controlador midi. O no? en ese caso el arduino hace IN al OUT del controlador midi y OUT al IN del programa de producción. por eso quiero esa placa. Segun yo. no se...

Vamos a ver que ya me he liado. ¿quieres modificar la señal del teclado con el arduino o con un programa de produccion?. Porque sin duda el programa de produccion tetdra una seleccion de puerto al que tengas conectado el teclado, entonces ¿para que el mini?. yo he creido desde el principio que la produccion la harias con el mini.

No. El lo que quiere es expandir la capacidad del teclado por medio de un arduino.
Ese teclado tiene 32 notas y un mínimo set chucherías más, él quiere lograr que haga más cosas.

Insisto, si vas a hacer un módulo externo, ataca por el lado del USB pero ten en cuenta que Uno, Nano y Mini no pueden ser host por si mismos (excepto los originales pero solo con ATmega16U2 según he leido por aquí hace unos días atrás)

Si vuelves a la idea original de intervenir la placa del teclado, tal vez puedas incluso aprovechar el USB del mismo. Es cuestión de probar como te dije varios posts atrás

Saludos

Bien @gatul pero para eso yo no tocaria el teclado, crearia un bucle loopmidi entre el puerto usb donde tengo el teclado y el puerto usb donde enchufe el tipo de atduino que tenga. Para ello solo necesita el programa loopMidi. Creamos con el "un puerto MIDI de bucle invertido virtual ",(a saber que es eso pero funciona), abrimos dos sesiones del hairless y configuramos algo asi:


En el puerto com3 tengo el teclado, (yo he usado un UNO con 2 botones y generar dos notas). y en el puerto 4 el arduino en custion para manipular las notas. Creo que en la imagen esta claro como configurar. En el arduino que regoje tengo esta simple ejenplo, que solo recoge la nota y la transmite tal cual al sintetizador de windos, pero es obvio que antes de mandarla podremos hacer con ella lo que queramos.

#include <MIDI.h>
MIDI_CREATE_DEFAULT_INSTANCE();
int e;
byte a,b,c,d;
void setup()
{
  MIDI.begin(1);
  Serial.begin(115200); //Cambiamos la velocidad del puerto serie
}

void loop(){
  if (MIDI.read()){
        // Thru on A has already pushed the input message to out A.
        // Forward the message to out B as well.

        a = MIDI.getType();
        b = MIDI.getData1();
        c = MIDI.getData2();
        d = MIDI.getChannel();
       
        
 
  MIDI.sendNoteOn(b, c, d); //Genera la nota
  delay (500);
  MIDI.sendNoteOff(b, c, d); //ilencia la nota
  }
}

PROBLEMAS: no se por que en sintetizador duplica la nota, puede ser debido a que el loopMIDI no sea muy bueno o que en mi codigo ignoro el valor regogido en la variable a . pero eso ya se lo dejo a los "GURU" del MIDI.
Saludos.

El problema es que "a" es la que dice si el comando es noteOn o noteOff, y el código hace noteOn y noteOff independientemente de cual sea el comando entrante. Por eso está tartamudo.
Sacando ese detalle se comporta como un midi-thru.

Al margen de todo, me parece que el tema se está desvirtuando porque la idea original del PO era intervenir el controlador que tiene y ya le estamos proponiendo hacer otro controlador aparte.
En Argentina diríamos que estamos meando fuera del tarro. :wink:

Saludos

Hola chicos! @Surbyte @gonpezzi @gatul Leí todas las respuestas que me dieron y les agradezco un montón como siempre por estar ahí. Voy a tratar de resumir y englobar todo lo que ha estado sucediendo para nuclear todo en un mismo texto y quitar dudas de mis dudas y las de ustedes.

La idea principal era la siguiente:

  • Que un controlador midi (de teclas como el piano) que tiene SOLO USB, se conecte a un arduino y que el arduino interprete las señales midi y las envíe a la PC hacia un programa de producción (Ableton, Pro Tools, Reason, etc)

  • Paso siguiente agregarle periféricos al arduino (Potes, Faders, etc,) para darle mas funcionalidades al controlador midi. Digamos en criollo, que estaría "tuneando" el controlador midi de teclas que tengo. Se que podría solamente hacer un controlador midi con arduino con las funcionalidades que quiera y usarlos de modo independiente. Osea... conectar el controlador midi de teclas por un usb y el hipotetico controlador midi con perillas y faders por otro y simplemente "mapear" lo que quiera en el programa de producción. Pero por la complejidad del proyecto que tengo a futuro y que seguramente les voy a ir contando mas adelante en otro hilo por que sería otro tópico ya que como dice mi novia: "un incendio a la vez". Y son dos temas totalmente independientes técnicamente también.

Lo que sucedió fue lo siguiente:

  • Las opciones que tenía a mano y con las ayudas de ustedes fueron varias... entre el testeo, la programación en el ide, probar el microcontrolador que tiene el controlador midi para ver e ir investigando opciones para el fin: agregar un arduino al controlador midi ya existente.

  • La posibilidad de hacerlo existe. Encontré muchas experiencias por internet. La situación es que, por lo que averigué, necesito un HOST USB para que arduino pueda recibir el controlador midi por usb y simplemente programarlo. No es nada complicado hasta donde vi. El host usb lo que hace es "interpretar" las señales ya sean de un teclado, un mouse, o cualquier cosa por usb y hacerlo funcional a lo que se necesite. Cosa que es lo que yo estaba buscando. Existen host usb tanto para los arduino uno como para el pro mini que es el arduino que dispongo. El problema es que no conseguí por ningun lado el host usb para el pro mini. Todo un problema y me desanimó muchisimo. Hasta donde leí, esta descontinuado. Ni por internet ni los locales de arduino acá en córdoba capital pude conseguirlo.

Arduino uno tiene su host, funciona perfecto pero se me va de presupuesto, y aparte no es compatible con mi pro mini.

Todo desilusionado me quede pensando por que terco y testarudo, alguna forma de poder conectar mi controlador midi a arudino tiene que haber. y acá les dejo el ultimo capitulo de esta novela de televisa:

CONEXIÓN DE UN CONTROLADOR MIDI CON DINES DE CINCO PATAS A ARDUINO

Resulta que encontré tutoriales que explican como conectar a arduino los controladores midi que tienen MIDI con dines, osea los viejos e inolvidables midis vintage que ya están bastante descontinuados en los controladores midis modernos pero en marcas como KORG, ROLAND, YAMAHA, ARTURIA, siguen utilizando el mismo sistema de las viejas epocas aparte de también traer usb. Algunos sorpresivamente solamente tienen MIDI DIN. Como algunos modelos de KORG como el hermosisimo Microkorg que lamentablemente me lo robaron hace un par de años.

A raíz de todo eso, me acordé que tengo otro controlador midi aparte del que es usb que tiene un DIN OUT. Es especificamente OUT. Y me sirve perfecto para darle señal desde ese teclado al arduino para ponerlo como MIDI IN y que envíe la señal a la pc. Perfecto. Acabo de volver del centro con los componentes que necesitaba, no eran muchos, solo un par de resistencias, didos, un optoaislador... les dejo el link para que lo vean.

MIDI con las fichas DIN, al ser una señal muy baja y sin tanto entrevero como el USB, puede hacerse sin necesitar tantos componentes, pero si un dejo de programación bastante amplio. Estoy por chekear ahora todo y ponerme a soldar. Lo bueno es que al tener ese controlador midi, puedo armar este "hub midi arduinistico" sin tener que desarmar absolutamente nada.

acá les dejo el tutorial que encontré:

y este otro:

como dato de color les cuento que tanto el controlador midi AKM32 y el otro que tengo que es un ORIGIN 49, usan el mismo microcontrolador adentro de sus placas base. EL STM32. Me llamó la atención. Dos marcas diferentes con el mismo microcontrolador. Debe ser bastante popular este micro para este tipo de cosas.

Espero no haberme salteado nada y haber saldado dudas o confusiones.

Saludos y espero que todo funcione. A penas tenga mas info de como voy progresando les cuento!

Logré hacerlo funcionar! a penas pueda les comento como hice con imágenes y en detalle es muy similar a los tutoriales que deje en la respuesta anterior.

Bueno amigos, perdón la tardanza. Anduve con mucho laburo pero no queria dejar de compartirles la conexión que hice para que quede registrado. La conexión es simple... lo hice basandome un poco en este enlace:

Me llamó mucho la anteción que no existan mas que tres enlaces explicando como hacer una interfaz usb ya sea con arduino o con cualquier microcontrolador. Renegué mas en la búsqueda que en el diseño. De todos modos no podemos enojarnos contigo internet.

El sistema de la conexión no dista mucho a lo que publicaste vos @gatul con algunas diferencias que te parecerá capaz medio absurdo, pero en serio desde que publicaste la imagen hasta yo haberla visto y entenderla realmente a medida que pasaron los dias y darme cuenta que era similar a la conexión que estaba armando yo, fue todo un proceso. Me dió mucha risa darme cuenta de que la respuesta de cierto modo siempre estuvo en el hilo y en realidad era yo al que le faltaba investigar para entender lo que tenia que hacer. Todo muy epifanoico... La única diferencia es que ese gráfico muestra la funcionalidad en un sintetizador o controlador midi con el pcb midi ya instalado. Y eso hace que sea confuso. El protoboard que armé yo para que arduino sea MIDI IN seria similar al que supuestamente acá dice midi out. Calculo que son simples puntos de vista.


Los componentes eran muy pocos... de hecho hubo un par de cosas de los tutoriales y guías a las cuales no les di mucha bola por suposición y funcionó igual. Como el voltaje... lo alimento a 3.3 v desde el arudino y funciona perfecto. El optoacoplador es un 6n137. No el modelo 4n. Usé dos resistencias de 220 juntas en vez de 470ohms. En otros tutoriales salia de usar 4.7k, 5.7k. La verdad que no se si cambiará en algo.

Les agradezco mucho la ayuda a ustedes @Surbyte @gonpezzi @gatul