(DIY) Controlador Midi con Arduino Leonardo prototipo terminado. Actualización.

El proyecto consta del desarrollo de un controlador MIDI basado en Arduino Leonardo, la elección de esta placa en particular esta basada en el uso del micro AT Mega32u4 que es capaz identificarse como un dispositivo MIDI-USB sin la necesidad de hacer una conversión por hardware.

Otra razón es que es fácilmente posible encontrar la placa o incluso clones de la placa a muy bajo costo.

Para que la placa se identifique como un dispositivo MIDI es necesario instalar en el entorno Arduino las librerías “arcore” de Rkistner disponibles en el siguiente enlace. En el mismo enlace se encuentran  en ingles las instrucciones para instalar.

Una vez instalado arcore debemos seleccionar en el menú herramientas/board la placa Arduino Leonardo (arcore)

Y el puerto:

El entorno de desarrollo recomendado es Arduino 1.5.4

Arcore de momento trabaja con las placas Arduino Leonardo, Arduino Micro y Bare Conductive Touch Board. Algunos usuarios reportan que arcore funciona con otras placas basadas en el mismo micro que son compatibles con el entorno de programación Arduino.

¿Que es Arduino?

Arduino es una plataforma de hardware libre, basada en una placa con un micro controlador y un entorno de desarrollo, diseñada para facilitar el uso de la electrónica en proyectos multidisciplinarios.

El hardware consiste en una placa con un micro controlador Atmel AVR y puertos de entrada/salida. Por otro lado el software consiste en un entorno de desarrollo que implementa el lenguaje de programación Processing/Wiring y el cargador de arranque (bootloader) que es ejecutado en la placa. (Wikipedia)

¿Que necesitamos?

Conocer cuando menos básicamente el entorno de software de Arduino y los comandos básicos, para un usuario novato se recomienda leer y estudiar el documento en el siguiente enlace

La placa, los botones, potenciometros o leds que deseemos utilizar ademas del gabinete donde se colocarán.

Consideraciones.

Leonardo tiene 20 entradas/salidas digitales que pueden ser configuradas de distintos modos.

Por ejemplo en este proyecto se implementan 8 potenciometros, 8 botones, un codificador rotativo (que usa dos entradas digitales) y dos salidas led que responden a los mensajes enviados por el host con el cual se desea trabajar.

Sin embargo con las características de esta placa es posible configurar por ejemplo 12 potenciometros y 8 botones.

O simplemente 20 botones.

Notas: Las entradas análogas necesarias para los potenciometros se limitan a 12.

Cada codificador rotativo hace uso de 2 entradas digitales para funcionar.

Código 1.0 esta disponible aqui.

Correccion 1.1 del código 24/8/2014 aquí.

*Los mensajes del encoder han sido cambiados de 0-127 a 1-127 para corregir el funcionamiento del encoder en el host, anteriormente funcionaba de manera limitada en algunos hosts.

*En la recepcion de los mensajes midi provenientes del host se ha cambiado el comando «while» por «if» para optimizar la respuesta.

*»while» se ejecuta cíclicamente mientras cierta condicion ocurre por lo que ralentizaba el encendido de los leds al recibir constantemente mensajes del host.

Con el cambio a if solamente comprueba el mensaje del host y ejecuta la función sin hacerlo en ciclo.

Correccion 1.2 del código 25/8/2014 aquí.

*Ahora los leds medidores de señal funcionan de manera semi-analoga mediante PWM con una curva logarítmica.

Correccion 1.3    31/10/2014 aquí.

*Se ha elevado la resolucion del encoder al doble.

Y este es el diagrama de conexiones.

*Actualizo el diagrama ya que con el update 1.2 es necesario usar también una resistencia de 220 Homs en el led del pin 13, aunque este pin tiene una resistencia integrada y en teoría no es necesario usar un resistor externo, en la practica el PWM mete ruido en las lecturas análogas.

Para el debounce es buena idea conectar un capacitor de .1 uf entre las entradas digitales y tierra.

101 comentarios en “(DIY) Controlador Midi con Arduino Leonardo prototipo terminado. Actualización.”

  1. Muchas gracias!! hace una semana que estoy intentando usar un arduino leonardo para controlar algunas funciones en mainstage (un foot controller) y tu post me apuntó en la dirección correcta. estoy feliz 🙂 no habría encontrado esas lib de otra manera

  2. Me has salvado el culo!!! He estado a punto de comprar un Arduino Uno jajajajaja Gracias, yo voy a montar una pedalera midi aunque me gustaria que tambien se pudiese usar como controlador midi para bateria por ejemplo. intentaré subir un enlace cuando termine todo. Un saludo!

      1. Tengo una duda, se puede hacer una pedalera que envíe mensajes CC y que al darle a un botón X automáticamente esos mismo botones se conviertan en notas (note on)? He estado buscando información pero al ser una pregunta tan concreta no encuentro respuesta.

      2. Si, es necesario programarlo pero si, un switch seria la forma mas fácil usando una condicional para modificar el tipo de mensaje, también un botón puede hacerlo, si tienes un dibujo de como pretendes hacerlo o que funciones necesitas podría darte algunos consejos el fin de semana que tengo tiempo. Manda correo a rideonbeat@gmail.com con el subjet midi control para saber que es tuyo.

        Si no te respondo mañana o el viernes es por que estaré un poco ocupado.

        Saludos

  3. Genial y muchas gracias por contestar, en realidad no creo que haga falta un esquema porque es algo sencillo, intentaré explicarte lo que trato de hacer y si no lo hago te envió un esquema aproximado de lo que quiero hacer, no obstante, mi idea es:
    Una pedalera midi de 8 pulsadores, con 8 potenciometros y 1 pedal de expresion. (El pedal ya lo tengo)
    Las funciones serian tres:
    La primera sería: cuatro pulsadores CC con toogle y otros cuatro pulsadores CC sin toogle, los potenciometros y el pedal de expresión no varian en ninguna de las tres funciones.
    La segunda función sería: La de los ocho pulsadores con mensajes CC sin toogle.
    Y la tercera y última sería: La de mensajes (Note On) para los ocho pulsadores.

    1. Con pulsadores te refieres a botones como los de las maquinas arcade ¿verdad? Entonces veamos, necesitas 8 entradas digitales para los pulsadores y 9 análogas (8 pots y el pot interno del pedal de expresión), mas dos entradas digitales para los pulsadores que controlarían el cambio entre cc o Note On y Note Off… Hasta aquí todo bien, son 10 digitales y 9 análogas, todo es cuestión de programación hasta aquí, ¿en eso que tal andas compañero? Usando solo pulsadores esos cambios entre CC Y Note ON/off los controlas con unas variables mas y condicionales if else.

      Para los pulsadores de cambio entre instrucciones también podrías usar switches en lugar de pulsadores, eso te simplificaría un poco el código.

      Para todos los pulsadores necesitas conectar un capacitor de .1 uf en paralelo al pulsador.

      A ver si hasta aquí estamos bien.

      1. Hola! mi nivel es básico, estoy leyendo tutoriales y dado que el Leonardo me llega la semana que viene estoy intentando aprender todo lo posible, creo que entiendo lo que me quieres decir. mi pregunta es, para un novato es una tarea muy dificil?

  4. Tengo una duda, Los codigo de programacion por ejemplo como los del Teensy, son compatibles con los de Leonardo? quiero decir he encontrado programaciones de Foot Midi Pedal que tienen las caracteristicas que busco en mi pedalera, por tanto mi duda es, puedo utlilzar esa misma programación y meterla dentro de Leonardo o no tiene nada que ver? Una vez más gracias por tu tiempo.

    1. No, a pesar de que es el mismo procesador el bootloader (el firmware base de las placas) no es igual, por tanto utilizan distintos métodos para implementar midi, de hecho en las teensy es una función integrada por default, la única razón por la que no usé una teensy al inicio era que me salia mas caro el envió que la tarjeta y fue mas sencillo usar la Leonardo por disponibilidad, eso lo comento en otro post de este mismo blog de hecho, podrías transportar algunas funciones de la teensy o «traducir» el code pero no creo que obtengas beneficios reales. Revisa mi código, con los comentarios te puedes guiar bastante para modificarlo, no es tan difícil, yo aprendí en los ratos libres en un par de semanas.

      Por cierto la versión 1.3 de mi código esta bastante optimizada en cuanto a funciones y depuración del codigo.

      Saludos.

  5. No he podido instalar la libreria arcore, he intentado seguir los pasos de la página pero se ve que algo hago mal ya que no me aparece lo mismo que en las imagenes que subiste, ni me aparece el Leonardo (arcore) y ni mucho menos el port. Si me pudieses dar una pequeña guia de como instalar el arcore te lo agradecería muchisimo.

    1. ¿Que version del IDE de arduino has instalado? Efectivamente puede tener algo de truco pero básicamente solo necesitas copiar el folder descargado en la ruta de «mis documentos/arduino/hardware» esto funciona bien con la version del IDE 1.5.4 ya que en versiones posteriores se modifico la manera en que se manejan las librerías aunque se puede hacer el truco para que cargue. Esto no es precisamente una librería si no una derivación de las librerías de hardware. ¿En que operativo estas? De cualquier modo en un rato que este en la pc con windows grabo un video.

      La siguiente imagen es de Os X pero en windows es básicamente lo mismo

    2. A ver compañero, ya cheque en windows y estos serían los pasos.

      1. Borra cualquier instalación que tengas de arduino.
      2. Descarga e instala la version 1.5.4.
      3. De el archivo arcore-master descargado, copias las carpetas «avr» y «sam» y las pegas dentro de la ruta: Mis documentos/arduino/hardware/arcore/

      Como no tienes esas carpetas, créalas.

      En windows 10 queda con la siguiente estructura:

    3. Una disculpa, pero al parecer han cambiado las estructuras de los folders en arduino y con los updates de arcore, de cualquier manera en la respuesta anterior te explique como lo tengo yo funcionando en windows, acabo de comprobar que esa es la estructura que funciona.

  6. Tengo una duda, sabes como limpiar la memoria del arduino leonardo? es que hice la prueba con tu controlador midi, y ahora quiero animarme a montar la mia propia, pero me gustaria dejarlo con la memoria vacia, como de fabrica, ya sabes.

    1. No es necesario, no es como una memoria usb, al cambiar la programación de la arduino se sobre escribe la información, la residual que pueda quedar en espacios no utilizados no influye en nada ya que el procesador no la toma en cuenta.

      Hay una forma de limpiar la memoria flash con un programador externo pero es un gasto innecesario y podrías echar a perder la arduino, de cualquier modo busco mas información y te aviso si encuentro algo pero de nuevo, no influye ni afecta en nada.

      1. Gracias otra vez, por cierto al instalar el tuyo, me di cuenta de que el Leonardo hace algo raro, la luz verde parpadea de vez en cuando y cuando lo pruebo con FL Studio solo puedo controlar los botones Note pero a la hora de usar potenciometros me van mal, de cuanto son los potenciometros que usaste tu? y otra cosa al final voy a hacer un midi footpedal, basicamente solo son 8 botones para que envien midi CC y uno para expresion, que imagino que para programarlo sera igual que el que has puesto tu, mi otra duda es, que comando le pongo para indicar que son mensajes CC es que he visto que los tuyos son Note ON y OFF yo quiero que sean CC y uno para expresión, perdona por abusar tanto pero es que estoy viendo que de momento se me esta quedando un poco grande lo de programar.

    2. Bueno, arduino es muy sensible a la estatica y/o ruido eléctrico, los pots son de 10k e idealmente deben estar montados en un gabinete metálico conectado a tierra o debes conectar el chasis de los pots a tierra mediante un cable soldado, el código publicado aqui en el blog esta pensado para la configuración del diagrama publicado también, así que se tiene que modificar exactamente en cada caso, ademas todo hardware especificado en el diagrama debe estar conectado para el correcto funcionamiento (esto no es cosa mía si no de la sensibilidad de la misma plataforma arduino y las correctas practicas de construcción electronica) en caso contrario ocurren falsas lecturas, ¿que es lo que te hacen mal los pots?

      Tu seleccionas que tipo de mensaje envías, las funciones para cada tipo de mensaje son las siguientes:

      void CC(byte channel, byte ccnumb, byte value) {
      MIDIEvent CC = {0x0B, 0xB0 | channel, ccnumb, value};
      MIDIUSB.write(CC);
      }

      void NOn(byte channel, byte pitch, byte velocity) {
      MIDIEvent NOn = {0x09, 0x90 | channel, pitch, velocity};
      MIDIUSB.write(NOn);
      }

      void NOff(byte channel, byte pitch, byte velocity) {
      MIDIEvent NOff = {0x08, 0x80 | channel, pitch, velocity};
      MIDIUSB.write(NOff);
      }

      Por tanto si quieres enviar mensajes CC tu comando debería ser algo como:

      CC(‘Canal midi’, ‘mensaje’, ‘valor de la lectura’);

      Te recomiendo dar una buena leída y analizada a las ultimas partes de el ‘loop’ donde dice:

      // Lectura de las entradas digitales (botones)
      y
      // Lectura de las entradas analogas (pots)

      En ambas partes se usa un a instrucción for para leer mediante un array diferentes entradas de la arduino y ver el valor que tienen, si el valor ha cambiado desde la lectura previa entonces se activa el envío del mensaje midi correspondiente.

      Obviamente debes sustituir los valores y arreglos según configures tu hardware. En este punto si me sirve muchísimo un diagrama electrónico de como vas a conectar todo el hardware para poder orientarte correctamente pues de eso depende toda la programación, de hecho para la cantidad de opciones que necesitas la programación puede ser mucho mas simple.

      Y no te preocupes por preguntar, ahorita no tengo nada que hacer y con todo gusto te ayudo.

      1. Y una pregunta, si sólo uso la entradas digitales podria evitar la estatica o sigue estando igual? es que la verdad, a la hora de programar un CC si hay un escape de estatica lo que pasaria es que nunca podria programar correctamente nada, hace un momento he probado a hacerlo pero es imposible, los analogicos me fastidian todo. y si me olvido de los potenciometros y solo lo hago digital? seguiria pasando? y lo ultimo, o con unos condensadores puestos en los botones podria evitar todo este problema? no se si es por eso que me lo dijiste hace unos dias.

  7. No, esto es así hasta que tienes bien montado todo, pero no me has dicho, ¿que es lo que pasa con los pots? ¿Que conducta te da? si tienes mucho ruido puede ser que no has ajustado los niveles de umbral (threshold) ademas del diagrama seria una buena idea que subieras un video explicándome lo que te pasa, hay tantas soluciones posibles que solo viendo a detalle lo que esta pasando podría darte un diagnostico, de entrada te puedo decir por ejemplo que si en el code tienes designados dos potenciometros y solo uno conectado y aterrizado eso te puede producir el ruido (por ejemplo) y eso puede suceder también en las entradas digitales.

    1. Ya consegui resolver el problema, era simple, sólo deje un unico potenciometro, a fin de cuentas solo buscaba un salida para pedal de Expresion, ahora tengo un pequeño problema, me gustaria saber como puedo hacer el codigo para que con un pulsador haga la funcion de salida toogle, es decir como si fuera un switch. Pulso, y da un On, pulso de nuevo y da un OFF este es el codigo que estaba usando, era uno tuyo.
      for (int i=4; i<8; i++)
      {
      DtempRead = digitalRead(Din[i]); // hace una lectura temporal y la asigna a la variable temporal
      if (DtempRead != LDin[i]) { // si cambio desde la ultima lectura
      if (DtempRead == LOW) { // y lee estado bajo (LOW):
      CC(Chan, i+offsetD, 100); // envia mensaje NoteOn al canal general con el valor i mas el ofset con valor 100
      }
      else {
      CC(Chan, i+offsetD, 0); // envia mensaje NoteOff al canal general con el valor i mas el ofset con valor 0
      }
      LDin[i] = DtempRead; // asigna el valor actual al arreglo de la ultima lectura para comparar en el ciguiente ciclo
      }

  8. En este ejemplo te explica como hacer que con un pulso de botón cambie el estado de una variable, este lo tendrías que adaptar según lo vayas a usar, https://www.arduino.cc/en/Tutorial/Switch

    Por el cambio que hiciste en el ciclo for me doy cuenta que estabas leyendo el estado de 4 potenciometros sin embargo no modificaste el array antes, ergo la arduino seguía detectando 8 aunque solo respondiera a 4, quizá por ahí estaba el problema, si eliminaste el ciclo y solo haces una lectura se corrige el problema pero no seria correcta esta configuración, digamos que no sería un codigo «elegante» Mañana me aplico a desglosar el codigo en un video y poner algunos ejemplos de como modificarlo. ¿De donde sois?

    Hablando de pinguinos voladores, cuando tengas tiempo te invito a pasar por el soundcloud de mi hijo: https://soundcloud.com/sxade

    Saludos.

    1. Solo soy uno, estoy estudiando electrónica y nos han puesto un trabajo con Arduino, mi meta era hacer una pedalera midi. Además al ser músico podría quedármela. En principio la modificación me salió, llamémoslo suerte del principiante y gracias a eso los 8 pulsadores los cambie a CC y solo deje 1 un potenciometro analógico, aún así tengo que seguir probando ya que al añadir el potenciometro para el pedal de expresión me sigue dando pequeños problemas, pero cuando solo es de pulsadores funciona perfecto. En principio con los ocho pulsadores CC ya sería un gran avance y más si cuatro de ellos son toggle.

    2. De momento no puedo hacer lo del Switch, se me queda un poco grande, sin embargo llegue a una solución mas simple y fue la de usar botones con enclavador y botones normales arcade, consegui ademas que fueran 16 entradas y salidas digitales y funcionan muy bien, solo me falta montarlo todo, sin embargo sigue sin salirme el pedal de expresion, Esto es ya mucho abuso, pero podrias escribirme un codigo para un pedal de expresion, es decir un potenciometro, porque de verdad llevo desde anoche y es la unica cosa que no me sale ni a tiros.

    1. Copia y pega el siguiente texto:

      int LAin; // ultimo valor analogo se usa como referencia para comparar si el pot ha cambiado de valor
      int AtempRead; // variable para la lectura temporal analoga
      int thresh = 4; // threshold

      // —————-setup propio de arcore para los mensajes CC——————

      void CC(byte channel, byte ccnumb, byte value) {
      MIDIEvent CC = {0x0B, 0xB0 | channel, ccnumb, value};
      MIDIUSB.write(CC);
      }

      void setup() {

      }

      void loop() {

      // Lectura de las entrada analoga

      AtempRead = analogRead(A5); // hace una lectura del valor de la entrada A5 y la asigna a la variable temporal, aqui se puede cambiar la entrada

      if (AtempRead > LAin + thresh || AtempRead < LAin – thresh) { // si es mayor o menor que su ultima lectura mas o menos el threshold
      // si y solo si la condicion anterior se presenta envia:
      CC(1, 17, AtempRead/8); // canal midi 1, numero de CC 17, valor de la lectura analoga dividida entre 8
      LAin = AtempRead; // asigna el valor de la lectura a la variable correspondiente en el ciclo en curso

      }

      }

  9. Me da error, y me subraya esto :» if (AtempRead > LAin + thresh || AtempRead < LAin – thresh) { // si es mayor o menor que su ultima lectura mas o menos el threshold '' he intentado mirar si habia error y me aparece algo como error stray \

      1. Lo que me ha costado enviar esto jeje es este:

        Arduino: 1.5.4 (Windows 7), Board: «Arduino Leonardo (arcore, iPad compatible)»

        sketch_jan06a:25: error: stray ‘\’ in program
        sketch_jan06a.ino: In function ‘void loop()’:
        sketch_jan06a:25: error: expected `)’ before ‘u2013’
        sketch_jan06a.ino: At global scope:
        sketch_jan06a:35: error: expected declaration before ‘}’ token

        This report would have more information with
        «Show verbose output during compilation»
        enabled in File > Preferences.

      1. Un millón de gracias otra vez, te juro que he aprendido más contigo que de mi profesor de electronica sobre Arduino, dado que pensé que me llevaría más tiempo realizar esto ahora voy a intentar hacer lo que me dijiste de las variables y lo del switch, para ver si puedo jajajaja Mañana montaré el prototipo y si o si subo un video con lo que he aprendido aqui.

  10. Hola muy bien explicado, estoy intentando hacerme un controlador midi para usar con Virtual Dj o Traktor, se puede usar un mux/demux para amplíar las saludas y entrada y como seria la programación para el mismo, desde ya si me pueden orientar muchas gracias

    1. Desde luego, puedes usar el 74hc4051 o el 74hc4067 para agregar entradas analogas o digitales, la programación es un tanto mas complicada pero no demasiado. Solo tienes que complementar el programa aqui explicado con la información de la siguiente pagina: http://playground.arduino.cc/Learning/4051

      El siguiente archivo es la base para un 4051 con 8 pots. https://onedrive.live.com/redir?resid=2036C87ED63CA1C0!547&authkey=!APNlGdL8WSEs_mQ&ithint=file%2cino

      Este archivo no esta probado con el hardware pero compila bien. Saludos.

  11. Hola, excelente aporte. Si no es molestia podrias echarme una mano?.Te comento he consegido hacer funcionar unos pots en traktor pero de repente empieza a enviar mensajes y el programa se vuelve loco, he observado que el pc reconoce el arduino como teclado raton controlador de sonido… todo a la vez y no se donde esta el problema si puedes ayudarme te lo agradeceria.Un saludo.

    1. Hola. ¿Podrias contarme como tienes tu setup? Que tienes conectado y como, que código subiste al arduino, con todo gusto te hecho la mano pero necesito mas datos. Puedes buscarme en Facebook como Jesús Higuera, tengo el mismo avatar. Buen día.

    2. Ah, si pudieras grabar un video de que hace específicamente sería de mucha ayuda para asesorarte, también consigue un programa llamado MIDI Monitor para ver que mensajes esta enviando tu placa, saludos.

      1. Ok te hablo por facebook, muchas gracias por la ayuda y perdona si tardo en contestar que estoy de examenes.Un saludo.

  12. Bonjour,

    j’aimerais savoir si il est nécessaire de modifier le bootloader pour la carte soit reconnu en-tant que midi-device.

    Merci

  13. Bonjour,

    j’essaie de créer un midi device aà partir du projet arcore mais j’ai un problème lors du téléversement, pouvez m’aider sur ce problème? Voici ce que j’obtiens:

    java.io.IOException: Cannot run program «{path}/bin/avrdude»: CreateProcess error=2, Le fichier spécifié est introuvable
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
    at processing.app.helpers.ProcessUtils.exec(ProcessUtils.java:26)
    at cc.arduino.packages.Uploader.executeUploadCommand(Uploader.java:123)
    at cc.arduino.packages.uploaders.SerialUploader.uploadUsingPreferences(SerialUploader.java:167)
    at cc.arduino.UploaderUtils.upload(UploaderUtils.java:78)
    at processing.app.Sketch.upload(Sketch.java:1178)
    at processing.app.Sketch.exportApplet(Sketch.java:1152)
    at processing.app.Sketch.exportApplet(Sketch.java:1124)
    at processing.app.Editor$DefaultExportHandler.run(Editor.java:2438)
    at java.lang.Thread.run(Thread.java:745)
    Caused by: java.io.IOException: CreateProcess error=2, Le fichier spécifié est introuvable
    at java.lang.ProcessImpl.create(Native Method)
    at java.lang.ProcessImpl.(ProcessImpl.java:386)
    at java.lang.ProcessImpl.start(ProcessImpl.java:137)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
    … 9 more

    thanks! 🙂

  14. Hola, te felicito y agradezco por la publicacion del proyecto, ahora quiero hacerte unas consultas, se podran conectar dos encoders opticos (seria uno para cadaplato, es una bandeja controladora) y los leds como para el Play, cue, beat y vumetros? si disponemos de 20 entradas/salidas, 4 entradas serian los encoders, 6 salidas para los leds de play, cue y beat, y quedarian 10 salidas como para un vumetro, o sino para algun multiplexor y expandirlo a mas leds,que pensas? Saludos y gracias de nuevo.
    PD: aclaro que no se una goma de programacion, pero me animo 😀

    Nelson.

      1. Gracias por responder, el tema es evitar el uso del LM3915/6, ya que necesito usar una interface usb y aprovecharia eso, como es un controlador DIY y voy a tener la linea de audio analogica pasando por dentro, le puedo conectar los lm391x directamente ahi, pero queria pasarlo por otro lado, voy a buscar el libro que indicas a ver si me meto un poco… saludos!!

    1. Te recomiendo leer el arduino programming notebook es muy simple de entender y con un poco de practica podrás estar creando y modificando códigos sin problemas, yo tarde un par de semanas.

  15. Ok, a espero que publiques y compartas tu proyecto que siempre es interesante, me llamó la atención lo de que vas a tener el audio análogo, yo comentaba lo del LM 391x por que puedes recibir señales midi de los vumetros de traktor o algún otro tipo de retroalimentación, como cue activo o posición de pista, cosa que es un poco inútil por que tienes todo eso en la pantalla pero mejora un poco el aspecto visual del controlador. en fin, suerte con tu proyecto.

  16. excelente tu proyecto felicitaciones, tengo una duda con respecto al archivo device, hice un prototipo similiar al tuyo el virtual dj detecta el controlador y me permite crear el mapeo, asigna a los botones sus funciones pero no los ejecuta. Que podria hacer ?

    1. Bueno, como comprendes, cada caso es especifico, en tu caso para empezar descartamos posibilidades usando algun software como midi monitor para tu sistema operativo y habría que checar si el pc esta recibiendo las señales correspondientes, aunque lo raro es que como dices virtual dj si detecta el controlador y al permitirte crear el mapping debería permitirte ejecutar sin problemas, me suena mas a algún tipo de restricción del software, creo recordar que ese soft en su ultima versión tiene precisamente limitaciones con controladores hasta que obtienes la versión completa de paga, pero es cosa de probar con otro software y quizá cambiar a alguno con el que no tengas esos problemas.

  17. Hola a todos, tengo una consulta ojala puedan ayudarme: hace unos 2 años atrás me compre un foot control midi diy, el asunto es que he intentado usarlo con el guitar rig, pero no puedo configurarlo, mi notebook lo reconoce y todo, pero no se como configurarlo desde la misma pedalera, entonces estaba pensando si se puede saber de alguna manera que tipo de chip tiene y re-programarlo. Si alguien me puede ayudar se los agradecería. Saludos.

    1. Pues solamente si se abre el controlador se puede saber que chip tiene, reprogramarlo no se que tan conveniente sea pero obviamente seria bastante útil saber exactamente que controlador tienes para tener una idea de como funciona.

  18. Hola,me estoy iniciando en este mundo y no tengo mucha idea,te expongo mi ideA.
    Quiero construir un controlador midi sencillo para manejar u pluguin de filtro low pass con 3 knob y un interructor de 3 posiciones,low pass,hight pass y notch filter.
    Mis preguntas son varias,no he echo nunca nada parecido y no se nada de programacion,que seria mejor hacerlo usb o por puertos midi in out?que placa me vendria mejor?tengo que programar algun chip?
    En fin nose casi nada,muchas gracias por haber gente que comparte su sabiduria de forma altruista .

    1. Todo eso lo puedes manejar con potenciometros y mensajes CC midi, no importa que controles pienses mover (knob o interruptores) siempre y cuando el plugin acepte midi, dado que vas a comprar un placa es mejor hacerlo por usb, el midi-usb ya es un standard así que no h ay necesidad de comprar un puerto midi extra para el pc, se puede con todas las placas arduino pero es recomendable por facilidad comprar alguna basada en el micro AtMega32u4 como la arduino leonardo, si, básicamente tienes que aprender a programar el controlador pero no es nada del otro mundo, de hecho te recomiendo aprender a programar en lugar de bajar códigos de ejemplo, así en poco tiempo podrás hacer todo lo que se te ocurra, de verdad no es nada difícil.

  19. hey bro, excelente post!!! una pregunta, ¿hay forma de cambiar el nombre del dispositivo en el descriptor del USB? como para hacerlo mas personalizado

  20. hola buenas noches,magnifico proyecto.
    soy nuevo en esto y no tengo mucha idea.
    tengo que hacer un controlador midi de 2 encoger rotatorios un potencio metro y un interruptor de 4 posiciones o simulación de ello.el caso es que he visto como se montan los hardware sobre la placa.cuando llego a la parte software chungo,no se ni por donde empezar, todo bien en ingles y se me pone la cabeza echando humo.
    he intentado copiar la carpeta acorde en mi Mac,pero ni eso he sido capaz de hacer ya que la ubicaron nada tiene que ver con la que tienes en windows.
    mi intención es que m expliques lo de la carpeta y como empezar a programar.muchas gracias rideonbeat

    1. Depende de la versión del IDE para saber la ubicación en OS X se puede encontrar en mis documentos o dentro del ejecutable del IDE, por otro lado te recomiendo dar una vuelta por la pagina oficial de arduino en la sección de aprendizaje por que en realidad es muy sencillo programarla y te ayudara mucho a comprender que es lo que el programa esta haciendo.

    2. Por cierto, yo lo tengo instalado en OS X, en la versión 1.6.4 del IDE de arduino debes poner la carpeta arcore-master en Documentos/Arduino/Hardware, si no existe creas el árbol de directorios.

      1. gracias por responder, ahora si me ha añadido la librería,pero no me sale la opción de añadir la placa Arduino Leonardo (acore).
        y a la hora de cargar un archivo de acore master no se que opciones elegir para cargar la programación midi usb.
        perdón por mi torpeza,

      2. Ok, dame un poco de tiempo para hacer un video explicando como funcionan los códigos que estan puestos aquí, creo que es necesario para poder personalizarlo. Saludos.

  21. Hola, soy un estudiante de secundaria y para mi proyecto de Recerca quise hacer un teclado MIDI y lo intente de muchas formas, pero acabe entrando en tu post y me ha encaminado el trabajo. Te lo agradezco mucho y me gustaria preguntarte si es posible hacerlo con 13 pulsadores (en mi caso teclas, que viene siendo lo mismo, lo he hecho con un PCB y una membrana) y 8 potenciometros? De ser posible, no tengo muchos estudios y lo que se, lo que he aprendido en mis tiempos libres, con esto quiero decir que cosas muy complejas me serian muy difíciles.

    Muchas gracias de antemano.

  22. Ya he modificado el sketch para adaptarlo a los 6 potenciometros + los 13 pulsadores, y estoy dudando en si debería modificar el threshhold, el canal general MIDI, el offsetD y el offsetA. Además en la lectura de las entradas análogas, deberia dividir el AtempRead entre 6, en vez de entre 8?

    Perdón por hacer estas preguntas, es porque no tengo conocimientos sobre estas variables y por eso os pido ayuda.

    Gracias de antemano

  23. Por partes, el decodificador análogo de leonardo es capaz de detectar 1024 niveles de votaje procedentes de una señal análoga, AtempRead es una variable a la que se le asigna el valor de cada entrada análoga de manera temporal durante el ciclo for, dependiendo de la posición del potenciometro nos entrega un valor entre 0 y 1023 (recuerda que el 0 cuenta como un valor en programación, osea los 1024 niveles).
    El standard MIDI soporta valores de 0 a 127 (128 niveles) por eso dividimos entre 8 y no entre algún otro numero (1024/8=128).
    En las lecturas análogas de los pots casi siempre hay ruido, osea pequeñas variaciones en cada lectura el threshold sirve para «filtrar» ese ruido, el if solo se ejecuta si la lectura nueva es mayor o menor por 4 unidades a la lectura anterior, este valor de 4 sirve para detectar los pasos aproximados entre cada cambio de posición del pot, si lo subimos podríamos perder valores intermedios en los mensajes midi y si lo bajamos estaríamos enviando constantemente mensajes midi aunque no cambiemos el pot de posición.
    El canal general lo puedes cambiar siempre teniendo en cuenta que tenemos 16 canales, esta variable la he puesto para poder asignar el canal y en la función se modifica restandole uno para que funcione a nivel de programacion, de nuevo son 16 canales (valores) pero en programación consideramos el indice 0 asi que de 1 a 15 hay 16 valores, aqui no hay problema en modificarlo mientras no pongas 0 o un valor mayor a 16 pues no funcionaría.
    offsetD sirve para agregar un valor inicial a las señales y el valor de 64 esta pensado para que se vaya a la octava intermedia, si leemos por ejemplo la entrada 1 digital sin el offset estaríamos enviando una señal de Do en la octava mas baja que es un sonido demasiado grave, aunque como controlador de traktor no tiene caso usar un offset durante las pruebas es mas agradable escuchar un sonido con un tono promedio, por cierto estos valores midi que se envían en el sketch original no corresponden a una escala musical cromatica a menos que tus entradas digitales las pongas en secuencia continua de menor a mayor (0,1,2,3,4,5,6,7,8,9,10,11,12) y para que 0 corresponda a DO 4 tendrías que modificar el offset poniendo un valor a este de 60.
    El OffsetA sirve para saltarse algunos mensajes CC del inicio que sirven originalmente en el stadard MIDI para algunos mensajes exclusivos y poner estos valores en valores «libres» aunque esto es solo por comodidad mía al crear el sketch.
    Espero no haber revuelto mucho el tema, aunque tengo la impresión de que eres lo bastante inteligente para entender todo, por cierto ¡Felicidades! Eres la primera persona que modifica el sketch antes de preguntar algo.
    Buen día.

  24. Sí, lo he entendido todo, muchísimas gracias, valoro mucho que me lo expliques porque lo que necesito es entenderlo para poder llegar a hacer y modificar el sketch. Además tendré que exponer el trabajo y evidentemente mencionaré tu aportación que ha sido muy importante.

    Muchas gracias

  25. De nada, para eso estamos, el conocimiento tiene que compartirse, mucha suerte, si tienes alguna otra duda y tengo tiempo con gusto te ayudo. Por curiosidad ¿de donde eres y en que grado de secundaría estas? Pregunto pues por donde vivo no veo muchos muchachos interesados en temas como MIDI o Arduino, de hecho he querido hacer en mi zona talleres de estos temas para niños y jóvenes y no he visto demasiado interés. Ah y ¿para que es el proyecto?

  26. Soy de un pueblo cercano a Barcelona, estoy estudiando 4º de la ESO y el proyecto es porque durante este curso tenemos una hora semanal para llevar a cabo un proyecto de elección libre. A final de curso lo presentamos a los profesores, lo exponemos a otros alumnos y nos cuenta como nota en la evaluación final.

  27. Hola buenas,
    Estoy intentando hacer un controlador MIDI con Arduino y ahora mismo estoy atascado.Tu blog me ha ayudad a resolver un par de cosas pero no consigo hacer el propósito que me he propuesto. Y es el de grabar algunas notas midi ya sea en la memoria Arduino o tarjeta sd.

    Tu podrías ayudarme o guiarme en este tema?

    Muchas gracias de antemano

    1. Hola, no estoy muy metido en el tema de grabar las notas pero no debe ser tan difícil, reviso el tema en estos días y te aviso, mientras tanto ¿podrías ser un poco mas especifico en como quieres que las notas queden grabadas? Sabras que un mensaje MIDI lleva 3 valores, canal, nota, velocidad, y en una secuencia midi ademas tenemos tiempo para saber en que momento especifico fue tocada la nota (note on) y en que momento fu liberada (Note off), podríamos grabar solo una secuencia de notas, dejar el canal y la velocidad como valores constantes, necesitaríamos grabar también el tiempo para que lo que quedara grabado fuera una melodía, en fin, espero que me cuentes mas de tu proyecto y mientras yo voy pensando como debería ser la programación, aunque en estos días estoy bastante ocupado así que podría tardar un poco. Buen día.

      1. Gracias por contestar Rideonbeat!!
        Basicamente seria hacer lo que has explicado tu. Grabar una melodía al presionar un pulsador (que podría ser llamado «REC» por ejemplo) y dejar de grabar la melodía cuando tengamos nuestra melodía deseada (pulsando otra vez REC). Y posteriormente reproducirla en el momento que se desee al activar otro pulsador (PLAY) y poder seguir tocando mientras ésta esta sonando. U otra cosa que también que se podría hacer es grabarla sin ritmo y ajustarlo con un potenciometro cuando es reproducido.

        En mi proyecto, actualmente tengo 29 pulsadores conectados a un shift register para simplificar las entradas de Arduino Uno. Así paso de 29 posibles entradas a 7. Cada pulsador hace referencia a una nota musical (2 octavas y media). También he añadido unos potenciometros para diferentes funciones MIDI. Actualmente solo uso uno para volumen. Los restantes me tengo que pensar que hacer con ellos. Pero sólo sera poner el comando según la tabla MIDI y que haga la función que quiera.

        Y ahora mi proximo objetivo es el comentado antes. Si quieres que te envié esquemas y programación para que veas como es, dime tu correo y te lo envío.

        Muchas gracias por todo y un saludo

      2. SI, ok, el punto es que si solo se graban las notas no sonara con el ritmo adecuado, es necesario grabar también el intervalo de tiempo que pasa entre ellas, seria necesario usar el comando millis para medir ese intervalo de tiempo, necesitariamos grabar 3 variables, nota, noteoff y el intervalo de tiempo, de todos modos como te dije necesito checar el asunto de como grabar esos 3 datos, creo que seria mejor en una memoria, dame algo de tiempo para revisar eso. Saludos.

  28. Primero de todo muchas gracias por tu tiempo Rideonbeat. Pues no conocía el copado millis del que hablas. Le voy a dar un repaso para saber como funciona exactamente. El tema memoria de Arduino se sabe que es pequeña (2kb si no me equivoco ahora de memoria) y si le quitas lo que ocupa el programa se queda en casi nada. Aunque también tengo la mega que son 8kb y si estos fueran insuficientes tengo una shield sd.

    Si consigo alguna novedad te lo comentare por aquí.
    Muchas gracias de nuevo y un saludos

    1. Lo de los millis es muy sencillo, arduino tiene un reloj interno que empieza a correr desde que se inica el programa y sigue contando hasta que se desborda (cuenta en milisegundos), entonces reinicia a cero, el punto es crear un diagrama de flujo para darse idea de como ira grabando, es necesario leer millis al llegar el note on y de nuevo cuando llega el note off para la misma nota, con los dos valores hacemos una resta y sabemos exactamente el intervalo de tiempo que ha pasado, después durante la reproducción integramos ese valor con una operación inversa, leemos los millis en el note on, sumamos el valor que hemos calculado y seguimos leyendo millis constantemente, al
      llegar ‘millis’ al valor de la suma se envía el note off, este podría ser un método, pero estoy casi seguro que se puede optimizar, con el desarrollo se van descubriendo formas de mejorar la programación inicial, otra opción es grabar directamente un archivo midi en toda regla en la memoria externa y despues leer el archivo, espero poder ir ayudando o cuando menos aconsejarte en las cosas que soy competente, honestamente, no domino arduino como quisiera y estoy desarrollando otros proyectos pero por intención de ayuda no paramos, hasta pronto y suerte.

      1. Hola de nuevo rideonbeat,
        Solamente queria diverte que muchas gracias por tu tiempo empleado por leerme y contestarme. Y obviamente por aconsejarme.
        Pasaba para decirte que finalmente acabe el proyecto de la universidad y comentarte a la solución que llegue para grabar un una melodía y posteriormente reproducirla.
        Lo que decidi fue crear una matriz de «x» valores. Y cada vez que se pulsara el botón de grabar fuera grabando en la matriz cada nota grabada. El problema de esto es que no guarda la melodía . Es decir el ritmo con que se graba. Por eso añadí un potenciometro para regular los BPM y aquí use la función miles() que me comentaste (me fue de gran ayuda muchas gracias). Y para reproducir bastó con leer la matriz donde se guardaron las notas previamente.
        Ahora una vez entregado y aprobado el proyecto me gustaría ampliar el proyecto pero ya de forma personal. Si quieres saber cualquier cosa sobre como lo hice dímelo y te envío código, esquemas, ……

        Gracias de nuevo y un saludo,
        Pablo

    2. Me da gusto que hayas logrado tu objetivo, felicidades, quisiera haber ayudado mas pero ando muy enredado con otras cosas. Si, me gustaría saber de tu proyecto pero te sugiero crear un blog e ir escribiendo el proceso, ademas de ser interesante puedes ir ayudando a otras personas y eso es lo que el mundo necesita, que nos ayudemos unos a otros aunque sea un poco. Que tengas un buen día.

  29. Greetings! Very interesting project.
    Could you help me, I’m not good at programming, but I’m slowly studying the basics and examples. In your project, if you click on the button, then there will be a noteON> noteOFF. But I need a friend. For example, the first click on the button sends a noteON and the LED lights up, the second click on the button sends a noteOFF and the LED goes out. Is it possible to realize this?
    Sincerely I hope for your help.

    1. Yes, you can, but, if you are planning to turn on the leds using the logical outputs of arduino the number of leds you gonna use will reduce the amount of digital inputs unless you use multiplexors. You need to check the switch example https://www.arduino.cc/en/Tutorial/Switch,

      BTW, this project is an old example, the basis of programming still the same, but at the time i create this sketch their was no official MIDIUSB library, now we had one here https://www.arduino.cc/en/Reference/MIDIUSB.

  30. Hola, una pregunta. Si realizo dos de estos controladores puedo usarlos para controlar el deck 1 y el otro para el deck 2?? utilizo el Virtual DJ. Gracias!!!

    1. En teoría si, pero si te soy honesto no lo sé, me parece que dos o mas arduinos conectadas se reconocen como el mismo dispositivo y crean conflictos, esto por que traen el mismo descriptor de hardware, con arcore habia forma de modificarlo pero la verdad es que no lo intente.

      Yo te recomendaría mejor usar multiplexores para tener mas entradas, y de ese modo controlar ambos decks con una sola arduino.

      Nota: Cuando hice este proyecto, aun no había una librería oficial midiusb para arduino, por eso este proyecto esta basado en una derivación del core de arduino, actualmente ya existe una librería oficial y no he tenido tiempo de revisar como esta construida para saber si se presenta el mismo conflicto, mis sketch se pueden modificar fácilmente para usar la librería oficial.

  31. Hola Rideonbeat!
    Vuelvo a retomar el proyecto debido a que empiezo lo que en Bachillerato llaman el Trabajo de Investigación o «Treball de Recerca». Como ya te comenté, mi idea es mejorar lo que fue el primer prototipo de mi Teclado MIDI, tengo diversas ideas a la hora de desarrollar lo que seria el Hardware de forma que el resultado sea original y no como cualquier teclado MIDI que podemos comprar hoy en día. No obstante, me gustaría implementar una función al teclado; dos botones que me permitan subir y bajar la octava, y es que me parece algo que supondría de gran utilidad a la hora de agilizar el uso del teclado. Y de nuevo recurro a tus conocimientos sobre el tema que ya me fueron de gran utilidad en su día, imagino que deberia trabajar con el OffsetD para lograr mi objetivo, pero ya lo he intentado y supongo que no lo he hecho bien ya que no funciona como debería. Me podrías hechar una mano por favor?

    Gracias de antemano

    1. Hola de nuevo, me da gusto que sigas con ello, a cada botón le deberías aplicar una condicional ‘if’ que sume o reste 12 al offset cada vez que se presione. ¿Que es lo que has intentado hasta ahora?

      1. Muchas gracias!
        Resulta que la configuración del Offset estaba bien, simplemente no había cargado bien el programa a la Arduino, además, ya desmonté el primer prototipo que hice y ahora se me hace menos cómodo hacer las pruebas. Ahora simplemente me queda establecer un máximo a la hora de subir el Offset y un mínimo para cuando lo bajas. Miraré el tema de la librería MIDI Oficial de Arduino, para no tener que utilizar Arcore.

  32. Hola! Estoy construyendo un pequeño Drum Pad, y en. principio ya tengo conectado todo y para unos 4 botones va perfecto. Mi duda es, partiendo del arcore, es posible seleccionar individualmente notas musicales? es decir, en lugar de seguir de {0,1,2,3,4….} Cómo podria programar individualmente cada nota? y otra duda, con el arcore se podria hacer un controlador midi multicanal, es decir, que de las entradas digitales tu puedas elegir que CC o NOn esten en un canal o en otro? He buscado info por internet y de momento no encuentro nada.

    1. De hecho ya no es necesario usar Arcore, ya arduino tiene una librería midi oficial, si, claro que es posible seleccionar notas especificas, puedes crear un ‘array’ donde incluyas las notas que deseas, tambien es posible hacerlo multicanal, todo depende de tu programación, aqui lo indispensable es que entiendas las bases de la programación en arduino, si comprendes eso y que hace cada parte del código tu puedes modificarlo para que haga lo que tu quieras.

Replica a DDM23 Cancelar la respuesta