Customizar controlador midi con arduino

Tengo un controlador midi AKM320 de 32 notas al que quiero darle mas funcionalidades. Ya sea para agregarle potes, faders, etc. Dentro de lo que estoy experimentando, lo abrí para ver que tenia adentro, cuales eran las conexiones y ver que posibilidad existía de agregarle mi arduino. Entre las opciones, pensé que podría añadirle el arduino a la conexion que ya tiene para añadirle mas funcionalidades pero se me quemaron los libros.

Intenté las siguientes cosas con resultados poco positivos:

  1. Crear un cable usb tipo b que conecta el arduino al controlador midi usando los pines TX y RX del arduino mini al D+ y D- del usb.

  2. Abrí el controlador midi y vi que tenia entradas y salids TX y RX a la cual le conecte los pines. Tampoco resultó.

  3. Me di cuenta que los controladores midi usan teclado matriz para resumir cables. Vi que el teclado va por un flex de 17 pines hacia la placa base que a su vez esa misma placa tiene el mod, el pitch y un fader de volumen y todo se resume a cinco cables dupont que van directamente al USB hembra para conectar a la pc y usarse como controlador midi:
    VCC - GND - y los otros tres pines calculo que hacen los envíos de datos. Tanto del teclado recibido por el flex, el fader de volumen, el modulador y el pitch bend. Pero no sabría ni que ni como resulta esa conexión. Intenté conectar esos pines al arduino asignandole (EJ:) pinMode (9, OUTPUT) para ver si reaccionaban de alguna forma y no tuve resultado.

Usé las librerias midi para programar el IDE, hice el bridge del puerto com con Hairless y todo lo que mi intuición creía que podía hacer y definitivamente ya no se me ocurre que hacer. Calculo que estoy o conectando mal algo o programando mal el IDE. Soy muy novato en arduino. Estoy tratando simplemente de jugar un poco con todo esto pero ya estoy muy subido al caballo como para dejar todo en la nada.

Las pregunts en resumen por lo que estoy tratando de idear en este mini proyecto sería:

  1. Como puedo añadir un arduino a mi controlador midi, y que envíe las señales midi a mi pc.

o como opción

  1. Como puedo usar el teclado del controlador midi, agregarle arduino como base para hacer un controlador midi basado en arduino?

Bueno... por si alguien llega a leer el tema, comento:

Acabo de descubrir que la placa base del controlador midi usa un microcontrolador STM32f103.

Estoy deduciendo que tiene su programación para interpretar todo el sistema midi para usarse como usb. Creo que debería ver mas en detalle cual es la funcionalidad del STM32 para entender como conectarlo al arduino pro mini.

Hola de MIDI no entiendo nada, y no se si esto ya lo sabes. echale un vistazo MIDI
Saludos.

Hola @gonpezzi ! gracias por responder... si... de hecho tengo esa pestaña abierta. Estoy investigando y necesito ver (creo) como hacer que el tx y rx de la placa se conecte con arduino para (supongo) enviar y recibir los datos midi. No lo se... acá estoy... inventando una pólvora que ya existe supongo y no puedo verla...

Vamos a ver tu teclado ¿que salida tiene ?, ¿a donde lo enchufas para que suene?, ¿tiene ese conector DIN-5 ?.

Es un controlador midi de marca AKM que tiene 32 teclas y pitch mode, modulador y control de volumen. Todo son señales midi y es todo por usb. no usa DIN.

y acá les comparto una postal de la lucha... perdón el poco profesionalismo de mis conexiones

Yo intentaría leer la salida Tx de la placa del SMT por medio de un puerto serie del arduino (según cual uses será via Serial o SoftwareSerial) y mandarla a la consola a ver que resulta.
Recuerda que midi trabaja a 31250 bps.

Si tienes suerte y puedes capturar los datos, ya la tendrías más fácil.
Retransmites los datos que manda el AKM (como un Midi Thru) o mandas los mensajes que generas tu con el arduino.

Primero trata de capturar los datos del SMT, si sale vemos como seguir

Ah y no te respondí lo otro... como es controlador no tiene mas que el usb para enviar y recibir los datos midi cuando lo conecto a mi programa de producción. Es solo USB. Mi idea es añadirle mi arduino pro mini para agregarle mas funcionalidades al controlador. Por eso la rotura de cabeza en que reciba las señales midi y las interprete. Ya hice un testeo con un teclado midi virtual y la señal se recibe y se envía perfectamente. Lo que me falta ahora es ponerle las teclas fisicas. Este es el código hasta ahora.

#include <MIDI.h>

MIDI_CREATE_INSTANCE(HardwareSerial, Serial, MIDI);

void setup() { 
    MIDI.begin();
    pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
    if (MIDI.read()) {
      byte Recibo = MIDI.getType();
      switch (Recibo) {
      case midi::NoteOn:
        for (int i = 0; i < 5; i++) {
          digitalWrite(LED_BUILTIN, HIGH);
          digitalWrite(5, 
          delay(10);
          digitalWrite(LED_BUILTIN, LOW);
          delay(10); 
        }
        break;
      case midi::NoteOff:
        for (int i = 0; i < 2; i++) {
          digitalWrite(LED_BUILTIN, HIGH);   
          delay(1);
          digitalWrite(LED_BUILTIN, LOW);
          delay(1); 
        }
        break;
      }
    }
}

Estuve probando de añadirle a void setup los pines asi:

pinMode(5, OUTPUT);
pinMode(6, INPUT);

suponiendo que algo podría generar y no pasa nada...

al led se lo puse en el código solamente para testear la señal con el teclado midi virtual y anda todo bien...

Gracias por tu respuesta @gatul Si! estuve averiguando para conectar el SMT por medio de un puerto serie y entre los mates y otras cosillas lo dejé ahi y seguí investigando solamente el codigo que podría utilizar. Pero si... debería hacer eso. Todavía no tengo muy bien entendido que sería Serial y SoftwareSerial. Tengo un vago entendimiento que es como podrían entenderse los pines de entrada y salida en arduino pero estoy limitado en eso.

Y como decís de los baudios. Ya tengo configurado el ttl en 31500.

Si probaste algún código que mostrara datos en la consola usaste el único puerto serie hardware que tiene el Mini. Para tener otro puerto se usa la libreria SoftwareSerial y puedes definir que pines quieres usar para Rx y Tx (obviamente no 0 y 1).

Entonces, lo único que tienes que hacer es un código que lea el Tx del SMT y lo envie a la consola.
Supongamos que creas un puerto que llamas Xerial, harias algo así

while(Xerial.available() > 0) Serial.print(Xerial.read());

Poné la consola en modo hexadecimal para ver los datos que imprime y ver si coinciden con datos midi.

Buscá ejemplos de uso de SoftwareSerial para mas datos (en los ejemplos del IDE tienes un par), es tan facil de usar como Serial.

PD: edita el post donde subiste el código, selecciona todo el código y pulsa </> en la barra del editor para que se muestre como corresponde, por favor

Bien! estuve en eso en este ratito... digamos que "logré" que la placa base que tiene el SMT, al hacer contacto con arduino, el monitor serial me muestra en teoría valores midi.

el tx y rx de la placa que tiene el smt a los rx y tx que definí en el ide (10 y 11). El TX al hacer contacto con los dos pines de arduino (10 y 11) el monitor serial me muestra cierta actividad.

Todavía no me puse a desglosar el SMT. Simplemente estoy tratando de ver si la placa bae del smt genera algun tipo de señal por el monitor serial

creo que en algo me he acercado, a no ser que simplemente sean impulsos de corriente y yo este todo ilusionado sin sentido.

este es el codigo que estoy usando:

#include <MIDI.h>
#include <SoftwareSerial.h>

MIDI_CREATE_INSTANCE(HardwareSerial, Serial, MIDI);

const byte rxPin = 11;
const byte txPin = 10;

SoftwareSerial mySerial(rxPin, txPin);

void setup() { 
    pinMode( rxPin, INPUT );
    pinMode( txPin, OUTPUT);
    MIDI.begin();
    mySerial.begin(31250);
    Serial.begin(9600);
    pinMode(LED_BUILTIN, OUTPUT);
}

void loop() 
{
  while( mySerial.available() > 0 )
  {
    unsigned char c = mySerial.read();
    Serial.println( c, DEC );
  }
    if (MIDI.read()) {
      byte Recibo = MIDI.getType();
      switch (Recibo) {
      case midi::NoteOn:
        for (int i = 0; i < 5; i++) {
          digitalWrite(LED_BUILTIN, HIGH);
          delay(10);
          digitalWrite(LED_BUILTIN, LOW);
          delay(10); 
        }
        break;
      case midi::NoteOff:
        for (int i = 0; i < 2; i++) {
          digitalWrite(LED_BUILTIN, HIGH);   
          delay(1);
          digitalWrite(LED_BUILTIN, LOW);
          delay(1); 
        }
        break;
      }
    }
}

y al ejecutar, el monitor serial me muestra lo siguente:

de todos modos, pienso que es por que solamente está ejecutando el software serial... toco con las teclas del controlador midi y es lo mismo... no estaría recibiendo impulsos midi.

Sin título
Este es el programa para convertir el puerto com a midi y tiene su monitor serial y creo que llegué a la conclusión de que no envía señales midi por lo que aparece. Si fuese midi mostraría la velocidad y la nota :frowning:

En todo momento hablas de tx y rx cuando la comunicacion midi e asincrona es por un solo cable, haz la misma prueba conectando solo un cable, tx del teclado a rx del arduino y el GND claro.
Y mira este otro proyecto, No se, pero me da que podrias sustituir el conector din por el usb de tu cable sin tocar nada del teclado.

1 Like

Pues con esta ultima imagen yo por lo menos lo tengo claro, en el conector del pc tienes la señal midi in ,midi out, VCC y gnd, lo unico que tienes que hacer es identificarlalas y usar los dos circuitos del primer enlace que te di en la primera respuesta, o el circuito de la ultima.

1 Like

Hola! @gonpezzi Si... es cierto. Pensaba que a lo mejor, por el hecho de que el controlador está basado en STM32, tiene un tx y rx por algún motivo, entonces suponía que por algo es asi o por que de por si cualquier microcontrolador tiene rx y tx. Mañana cuando siga con la investigación voy a ver el enlace que me dejaste! muchas gracias!

Claro creo que sería así... de todos modos el hairless lo que hace es puentear entre una señal midi IN hacia el puerto com que lo convierte a midi con el arduino, hacia un midi OUT que sería otra salida. Seria como tener un controlador midi normal a la pc y de la pc a un programa de producción. Lo que hace el programa es dejarme enviar las señales midi al arduino y de ahí enviar la señal a una fuente de sonido.

Creo que no nos entendimos.
Te dije que vieras si podías capturar los datos que pasan por el Tx del SMT con el arduino y los mandes a consola, si eso funcionaba seguíamos, no entiendo por qué incluiste Midi.h y todo lo demás.

Midi.h usa el puerto serie del arduino, lo setea a 31250 bps (que es la velocidad a la que trabaja Midi) y luego tu lo pisas y lo seteas a 9600 bps.
¿Qué datos midi va a detectar Hairless si la velocidad no coincide y la información tampoco?

Todo lo que tienes que hacer es

#include <SoftwareSerial.h>

const byte rxPin = 11;
const byte txPin = 10;

SoftwareSerial mySerial(rxPin, txPin);

void setup(){
  Serial.begin(57600);
  mySerial.begin(31250);
}

void loop(){
  while(mySerial.available){
    byte dato = mySerial.read();
    Serial.print(dato);  // imprime datos en decimal
// Serial.print(dato, HEX);  // impr en hexadecimal
// Serial.write(dato); // envia el dato "en bruto"
  }
}

Eso es todo.
Con eso monitoreas (con la consola del IDE, con Hiperterminal o con la consola que sea) el Tx del SMT (en el supuesto de que esten a la velocidad de 31250 bps que indica la norma).

Además, si te fijas en la linea de código que puse de ej. en el post anterior puse print no println, y si miras la captura del Hairless te dice que recibe 30, 0D, 0A que no son datos midi.
Y claro, es el digito '0', el caracter CR y el LF, de un println con dato 0.

Por otro lado, MIDI.h espera que el puerto serie se conecte a un cable midi (con suerte puede que trabaje con un conversor serie a usb, habría que probarlo).

Y un dato más

MIDI.read()

lee los datos del puerto midi-in, lo de los led no va a funcionar.

Yo tenia entendido que la interfaz midi usaba un modulo rs485 y es half duplex hasta donde recuerdo. Es lo mismo que si quisieramos comunicarnos con un dispositivo por MODBUS pero en este caso es MIDI.
He visto muchos esquemas en el pasado de esta configuración.
Busca un MAX485 o similar en torno al STM32.

Nop

En parte tienes razon @gatul y en parte no. Pero tampoco YO la tengo.
MIDI es un protocolo y no una interfaz electrica.
485 o lo que tu @gatul has mostrado son interfaces electricas.
Si quiero comunicarme con algo cercano uso tu interfaz, si quiero algo mas lejano uso 485.
La web esta llena de tus ejemplos y los mios.