Construyendo un controlador MIDI con arduino

elias
#1 por elias el 08/06/2022
Hola.

Voy a empezar este hilo ya que me parece que la pedalera que hizo el compañero ignotus no está siendo bien aprovechada por mucha gente en este foro.
Trataré de explicar todo lo que hace falta para poder hacernos una nosotros mismos, sin ningún disgusto por medio, esto trata de ser un tutorial para el que no tenga ni idea de nada con este mundo...aunque si que adelanto que nos hará falta algo de conocimientos de soldadura y algo mínimo de electricidad/electrónica que tambien se pueden ir adquiriendo...

Mi primer capitulo con esta pedalera (llamesmolo intento de realizar un controlador midi con un arduino que sirva para controlar el amplitube,etc..) lleva varios dias y semanas y un par de meses tambien..pensad que al principio no conocía la manera adecuada de convertir el arduino en un dispositivo usb MIDI y tenía que andar flasheando para poder cambiar de un modo a otro...
En arduino puedo subirle y cambiar el codigo...pero cuando es un dispositivo midi no puedo cambiar el codigo...

Al final me tope con el video de este señor que me ayudo a solventar rapido este problema...ya podía cambiar el modo ARDUINO/USBMIDI con tan solo pulsar un interruptor...

A este señor le debo mucho..

Una vez tuve esto solventado...tenía claro que tenía que buscar la manera de implementar leds y esto ya me llevo más tiempo de lo que yo pensaba al principio..
Con arduino MEGA no hay problema con el número de entradas y salidas digitales y analógicas (aunque en el modelo de ignotus utilizaremos multiplexores, pero eso ya lo vereis despues..) y podía conectar todos los leds que quisiera...iba a utilizar los típicos leds encapsulados de toda la vida con una resistencia de 220 ohmios (tened muchisimo cuidado con estos leds, si no poneis resistencias...que no os exploten y os salte una esquirla a los ojos).
Me costo un huevo pero al final conseguí que se quedarán iluminados cuando yo quería..añadí una pantalla sencillita y bueno os presento el primer capitulo o fasciculo por si alguno quiere hacersela...

Os pongo el link con los planos y esquemas y los materiales que haecen falta. Tambien esta el codigo necesario para arduino, hecho con la libreria (nueva para midi en arduino) control surface.
https://srmorrris.github.io/ArduinoUSBMidiPedal-board/

El siguiente capitulo mola más... por que será con la pedalera de ignotus..saludos.
Subir
4
OFERTASVer todas
  • -7%
    BOSS RE-202 Space Echo
    319 €
    Ver oferta
  • -29%
    Boss T-Shirt CCB-MT2TMC (Talla M)
    15 €
    Ver oferta
  • Millenium Rookie E-Drum Set
    179 €
    Ver oferta
elias
#2 por elias el 08/06/2022
MODELO CORRECTO DE ARDUINO (para usb-midi)

Tenemos muchos modelos de arduino (UNO,MEGA,LEONARDO,etc..) y en todos los modelos podremos hacer un dispositivo midi funcional...pero debeis saber un par de cosas antes de empezar..

Como mi recomendación es que os compreis el MEGA (ya para empezar..), voy a hacer el siguiente ejemplo con un MEGA, pero no os sintais mermados, todavía los poseedores de otros modelos...ya que podeis seguir y extrapolar la siguiente info..

Imitaciones de arduino hay un porrón , pero debeis saber que hay un modelo concreto de MEGA que no nos va a servir para convertirlo en dispositivo MIDI-usb.

Es decir, el arduino si que os servirá perfectamente para subir código como arduino y demás pero al no haber posibilidad de ser reconocido como dispositivo midi-usb, ya partimos desde el principio con problemas y tendriamos que subirle el codigo a arduino y luego probar a utilizar programas como loopbe o hairless y hasta aqui puedo leer.. desconozco los resultados, amigos...

Para subir el codigo a arduino se utilizan, en la actualidad (fundamentalmente), dos tipos de librerias MIDI para arduino : la "control surface" y la anterior a "control surface".
Todos los poseedores de arduino podreis beneficiaros de estas librerias y probar igualmente los codigos que subais.

Seguimos..
El modelo que si sirve trae 2 chips y dos puertos ICSP respectivamente (un puerto ICSP de 6 pines machos para cada chip).

Trae un chip grande que es el atmega 2560 y al lado tiene un puerto ICSP (6 pines machos)
Y tambien un chip pequeño, atmega16u2 y al lado tiene otro puerto ICSP (6 pines machos).

Pues bien, el chip pequeño atmega 16u2 es el encargado de la comunicación usb.
Cuando nosotros flasheemos este chip para convertirlo en dispositivo midi-usb..significa que la proxima vez que conectemos nuestro arduino a la computadora, este será reconocido como un dispositivo MIDI-usb y habra dejado de ser un arduino (pero no para siempre jeje)

Muchos modelos no traen este chip y solo llevan un chip gordo (imitación del atmega2560) y un solo puerto ICSP (6 pines machos) .

Conclusión..el modelo bueno trae dos puertos ICSP y el malo solo un puerto ICSP.

FOTOS

-Puertos ICSP: podeis ver los dos puertos ICSP y los dos chips que os hablo (modelo correcto).
-Modelo INCORRECTO: aquí vemos que solo hay un puerto ICSP y un solo chip .

Sabiendo esto ya podemos seguir adelante..
Archivos adjuntos ( para descargar)
Puertos ICSP.png
Modelo INCORRECTO NOUSBMIDI.png
Subir
2
a.blazquez
#3 por a.blazquez el 08/06/2022
Muchísimas gracias por este aporte :palmas2::palmas2::palmas2:
Subir
1
lutop
#4 por lutop el 08/06/2022
Pillo sitio en el hilo para seguir como evoluciona.
Subir
1
elias
#5 por elias el 08/06/2022
Encantado de compartir algo bueno con todos vosotros.

He estado pensando (un poco) y debo atender a los usuarios de modelos incorrectos de arduino antes de continuar...

Todos aquellos que teneis un modelo de arduino , no apto para ser convertido en dispositivo midi-usb... ya sabeis que vuestro arduino nunca será detectado como dispositivo MIDI cuando lo conecteis (usb o bluetooth,etc..)..pero teneis otras opciones para poder hacer vuestra pedalera, siguiendo este hilo y tambien podeis utilizar el codigo que os pongo...

El codigo que pongo para descargar en mi "web" :D (en el primer post) es para un arduino MEGA y se necesitan dos chips multiplexores CD74HC4067.
Sin los chips multiplexores o con otro modelo de arduino distinto al MEGA...deberiais modificar muchos parametros en este código antes de poder subirlo a vuestro modelo concreto(sobre todo la parte del numero de entradas y salidas..).
Todo aquel que tenga preguntas en este aspecto, bien porque lo quiera hacer un leonardo o en un uno, por ejemplo, que lanze sus dudas, no os corteis...
El codigo lo escribí con la libreria actual de MIDI para arduino (ya os dije que se llama "control surface") y es fácil de modificar..no tiene mucha complicación..cualquiera puede leerlo y entender el cacharro.

Bien...una vez que hemos conseguido subir el codigo a nuestro arduino, solo nos hara falta algún potenciometro o algun boton para poder probarla (leds, etc).

Pero, deberemos utilizar un programa que nos haga de cable virtual MIDI, para que cada vez que conectemos el arduino, este pueda ser reconocido como algun tipo de dispositivo midi.
Sin esto, jamas conseguiremos lanzar o recibir datos MIDI.

Opciones..
Loopbe1 https://www.nerds.de/en/loopbe1.html
Hairless https://projectgus.github.io/hairless-midiserial/

Cualquiera de estos dos programas os servirá para convertir el arduino en algun tipo de dispositivo MIDI.

To be continued..
Subir
1
elias
#6 por elias el 08/06/2022
Seguimos con el tema..

Entonces..todos los que tengais un modelo incorrecto o uno distinto del MEGA, o incluso las dos cosas, podeis probar igual, no hay problema.
El que no tenga los chips multiplexores CD74HC4067, tampoco hay problema.

Pero debereis cambiar el codigo que pongo para descargar en mi web y adaptarlo a vuestros arduino..todos los problemas o dudas podeis postearlos por aqui.
Aunque esto trate de ser un tutorial desde cero..no voy a entrar, de momento, en como subir codigo al arduino, etc..

Una vez adaptado el codigo, le puede servir a otro que tenga el mismo modelo..así que adelante..
Luego subis el codigo a vuestro arduino, y utilizando el loopbe1 o el hairless ya tendreis el cacharrito operativo para poder probar, conectando potenciometros, leds, botones, etc..

y hasta aqui puedo leer amiguitos..

Sigo con mi ejemplo del MEGA...

Tenemos el modelo correcto...solo debemos seguir el video del primer post para convertir el arduino en un dispositivo midi (podeis poner el nombre que querais a vuestro dispositivo Midi-usb ) y ya tendremos resuelta la primera parte.

Descargamos el codigo de mi web y si no tenemos los chips multiplexores cd74hc4067, habrá que eliminarlos del codigo antes de poder subirselo a arduino.
(si alguno necesita eliminar del codigo los chips multiplexores, que lo diga..).
Si tenemos los dos chips multiplexores..solo nos queda subir el codigo y probar conectando leds, potenciometro, boton,etc..

Deciros que los chips multiplexores sirven para multiplicar las entradas y salidas analogicas y digitales de nuestro arduino..para poder tener muchas más disponibles para programar (multiplicamos los pines fisicos de nuestro arduino), son baratos..si os interesa esto de la pedalera os recomiendo que los compreis (más adelante debereis comprar los 4051 tambien).
Yo compre para este proyecto unos que van soldados en una placa , como los de la foto, pero podeis comprar los chips sueltos.. valen muy poco, pero mirad si debeis añadir alguna resistencia por si acaso..

Nada más, utilizo un encoder (un potenciometro especial llamado encoder) que se puede eliminar facilmente del codigo sino disponeis de encoder (los encoder para arduino valen 30 centimos).
Los potenciometros son los normales (creo que son llamados lineales,y son más baratos que los logaritmicos) con un valor de 10 kiloohmios, con otros valores no va tan ajustado.. en cuanto a leds podeis conectar cualquiera encapsulado o el led que sea, pero conectando la resistencia con el valor adecuado, que no os reviente el led en la cara.

Para los botones utilizo micro-switches temporales,normally open (da igual que sean closed, cambiandolo en el codigo), es el botón de toda la vida que solo se activa cuando pulsas, los teneis de todos los colores..
Otro tipo de botón es el que pulsas con el pie...yo me compre unos pequeños pero baratos en aliexpress y funcionan bastante bien...son botones, exactamente iguales que los anteriores, con dos pines, o con tres pines (temporales ,normally open o closed).

En cuanto a la pantalla I2C lcd, se puede eliminar del codigo facilmente, si es vuestro caso..o cambiarla por otra distinta tambien seria mas o menos viable :D

Otro caso distinto sería por ejemplo alguien que le interesara tener midi in y midi out en su dispositivo MIDI..tambien se puede hacer...

Hasta aqui el primer ejemplo de pedalera prehistorica pero hecho con la libreria nueva de MIDI para arduino ( control surface ), decir que esta pedalera no lleva pedal de expresion, así que esperaremos al siguiente capitulo con la pedalera de ignotus para hacer algo mejor que esto (pantalla a color, looper mode, banco de presets, bluetooth, pedal de volumen-wah, etc,etc..).

Pero bueno tiene potenciometros y botones de activar desactivar pedal, y lucecicas bien majas, oiga (no son las de Vigo, dios me perdone, pero bueno..)y puedes configurar hasta 20 pedales con sus potenciometros y varios potenciometros de amplificadores o lo que sea (otros 20 más o menos).
Ah y una pantalla verde "rollo gameboy del primo" para ver como sube y baja el potenciometro en una barra digital LCD , que oye...se podía hacer...y dije pues metelo...paque dejarlo ahi ...
Archivos adjuntos ( para descargar)
4067.jpg
Subir
1
elias
#7 por elias el 09/06/2022
Os explico como funciona...

En la parte de los pedales (en la foto..observad la parte inferior izquierda) tenemos ocho pedales con led que podemos activar/desactivar (con luz encendida están activados y cuando está apagado el led, el pedal esta desactivado).
Podemos activar/desactivar 8 pedales rapidamente desde esta parte de la pedalera...y podemos ver si están activados/desactivados gracias a los led.

Encima de estos ocho pedales (son botones temporales, normalmente abiertos), podeis ver un grupo de potenciometros (ocho en total) que sirven para ajustar cosas distintas a los potenciometros de los pedales (por ejemplo previos de ampli) y tambien estan las 4 luces que indican el previo de amplificador que estamos ajustando..creo que puse unas 16 posiciones distintas para las luces con lo que podemos ajustar hasta 16 previos de amplificador distintos con ocho potenciometros cada uno.

Para cambiar la posicion de la luz y por consiguiente, el previo de ampli que estamos ajustando ,utilize un boton para subir y otro para bajar.
Y tambien puse un encoder, se puede cambiar con las dos cosas (podeis pasar del encoder y utilizar solo los botones, sin ningún tipo de problema).

Resumiendo..pulsamos una vez el boton de ir hacia arriba y podremos ajustar un previo de ampli con ocho potenciometros y pulsando luego otra vez el botón de ir hacia arriba pasamos al siguiente previo de ampli y podremos ajustar otros ocho potenciometros distintos y asi sucesivamente...sabremos el previo de ampli en el que estamos gracias a los led que nos indican en que posición estamos.. (creo recordar que eran unas 16 más o menos)

En la parte de la derecha sucede exactamente lo mismo para el grupo de ocho potenciometros que están destinados para controlar los pedales.
Tenemos otro grupo distinto de cuatro leds que nos indican el pedal en el que estamos. Podemos ajustar hasta 16 pedales (más o menos) con ocho potenciometros cada uno.

Pero aquí, tenemos dos botones negros que sirven para cambiar de pedal (subir y bajar la posicion del pedal) y el boton rojo que sirve para activar/desactivar el pedal. Podemos ver en que pedal estamos, gracias a los cuatro led de este lado derecho de la pedalera..

Añadí más botones, que no se ven en la foto, para activar desactivar ciertas cosas..

Decir que tuve algunos problemas de ruido electromagnetico, ajustar los CC para aprovechar los 127 disponibles, etc.. pero al final lo pude arreglar todo y la verdad es que funciona muy bien.


Por mi parte cierro el hilo y espero a vuestras preguntas, dudas respecto a esta pedalera.
Abriré un nuevo hilo explicando ell nuevo modelo 2.0 que conseguí gracias a ignotus, de este foro. Sera la segunda parte (os aviso que es más compleja).

Lo bueno de esta pedalera que ahora acabo, es que al ser algo que hize yo, está al alcance de cualquiera y la libreria utilizada y lo sencilla que es, pone las cosas muy fáciles para un principio en el que alguien se aventure a hacer su propio prototipo. No teneis que hacer algo igual a lo mio, ni mucho menos...vuestras necesidades pueden ser otras..
Por ejemplo puedes cambiar los potenciometros por faders y hacer tu propia mesa-controladora, o quizás tienes en mente algo mas rhythm-box con mas botones y de otro tipo (más sensitivos) o un panel para tu mini-moog o b-3 virtual y llevartelo con tu portatil a la iglesia del pueblo (ahora ya puedo ajustar bien :D).

Un abrazo a todos.
Archivos adjuntos ( para descargar)
pedalera.png
Subir
1
elias
#8 por elias el 09/06/2022
Otra cosa que me olvidaba es la configuración de nuestro dispositivo MIDI ..
Al haber programado nuestro arduino (subirle codigo) para que pueda enviar y recibir mensajes MIDI (gracias a la libreria MIDI para arduino "control surface")
Decir, que vamos a utilizar el tipo de mensaje MIDI llamado CC y tenemos hasta 127 posibles. Tanto para botones como para potenciometros en nuestra pedalera.
(127 maximos).

Funciona de la siguiente forma, conectamos nuestro dispositivo MIDI (antiguo arduino) al ordenador y vamos a nuestro daw o a nuestro vst y seleccionamos "midi learn",y despues movemos nuestro potenciometro o boton de la pedalera y ya queda configurado y asignado a un numero determinado de CC.
NOTA: Algunos vst como amplitube 4 pueden necesitar que añadas una pista midi en tu DAW, rutear esta pista midi poniendo la entrada como nuestro dispositivo MIDI (o poner "all midi inputs")y de salida poner el vst (en este caso, amplitube 4)y luego tener esta pista MIDI en monitor y activada para que el amplitube pueda escuchar el MIDI del dispositivo.

Saludos.

Os pongo varias fotos del engendro acabado :D y una foto probando varios chips para la parte de los leds, cuando no había luz..
Creedme cuando os digo que se puede hacer mejor chicos.

He estado revisando un poco el codigo y se me ha ido la pinza...tenemos 8 pedales y 8 previos de ampli para poder configurar (donde dije 16...son 8)..perdón.
Archivos adjuntos ( para descargar)
pedalera back.png
pedalera back 2.png
pedalerahy.png
pruebas de chips.png
Subir
1
elias
#9 por elias el 09/06/2022
Sigo con más aclaraciones..perdonadme que desempolve telarañas en todo esto...

Esta vez respecto a los chips multiplexores, ya que me he colado diciendo que los podiamos utilizar como salida digital o analógica y esto no es cierto..se utilizan solo para multiplicar las entradas de arduino, podemos utilizar un chip multiplexor para entradas analógicas (los potenciometros que conectemos, en este caso) y otro chip multiplexor para entradas digitales (botones, pedales).

Bien..me queda de explicar lo necesario para un buen montaje..

Respecto al cable utilizaremos el más barato y con mínima sección, en aliexpress o amazon venden estas bobinas pequeñas a tres euros como mucho..
Os pongo fotos de la bobina que yo utilizo concretamente, nos valdrá para conectarlo todo en nuestra pedalera (leds,botones,potenciometros,todo).
que sea de varios colores, ayuda mucho...

Os aconsejaría, encarecidamente, que comprarais tambien conectores dupont de 2,54 mms. machos y hembras o tambien llamados terminales de conexión, os pongo una foto de terminales-conectores machos y hembras dupont de 2,54mm.(no voy a entrar instintivamente a indicar en la foto, cual es macho y cual es hembra, podeis verlo vosotros en la foto)..

Es mucho mejor que hagais vuestros propios cables para entrar o salir de arduino...no hay mejor engaste del terminal de conexión al cable que el que tú puedas hacer con tu estaño y tu soldador (os quitará muchos disgustos...porque estos conectores dupont, son puñeteros, aviso.. si le añadimos a la ecuacion, cables de mala calidad, o mal engastados, mal vamos..).

Tambien nos vendrá muy bien tener los otros terminales de conexión a placa de estos terminales dupont de 2,54 mm.. necesitaremos sobre todo los hembras...aunque los machos tambien van bien. (los hembras son los que tenemos ahora soldados en nuestra placa de arduino para entradas y salidas)(los machos son los del puerto ICSP),
Los conectores hembra los venden en filas de un determinado numero de pines, con unas tijeras podemos amoldar cada fila a nuestras necesidades, así que aconsejo comprar las filas con el mayor numero posible de pines..
Os pongo fotos de estos conectores a placa(podeis ver, en la foto, los hembras arriba y los machos abajo) ( :D ) los machos son muy fáciles de amoldar y recortar los pines con una tijera y con los hembra tambien se puede hacer (pero perdiendo un pin en cada corte).


Os enseño en otra foto como utilizo estos conectores para soldarlos en las placas de los chips multiplexores... (en la foto podeis ver uno de los lados del chip multiplexor con los cables soldados permanentemente y el otro lado (derecho) con cables y terminales dupont (cuando hize la foto no tenía suficientes terminales para soldar a la placa...)

Lo bueno que tienen estos dupont es que posibilitan que tus placas sean removibles facilmente, tienen varios contras y es que siempre es mejor tener soldadas al completo las conexiones de tu proyecto final...pero yo prefiero que los elementos, sobre todo las placas, sean removibles y los dupont ayudan a ello..(buena gente)

Necesitaremos un soldador (en el chino los hay por 6 euros)y con el estaño ya debereis tener mucho más cuidado, ya que no todos funden a determinadas temperaturas, yo utilizo uno que compro en tiendas de electronica que funde sin problemas y no hay riesgo de soldaduras frias ni malos momentos soldando..
El estaño del chino no lo quiero ni regalado..

Hay unos terminales de conexion a placa que llevan clemas con tornillos para fijar el cable y a mi particularmente me gustan mucho más que los dupont...son mucho mejores para nuestra paciencia...os pongo fotos tambien (los terminales verdes)..

Os aconsejaría que al principio utilizarais protoboards..pero eso ya va en cad cual..

Respecto a los potenciometros..decir que son resistencias variables y cuando giramos el potenciometro va creciendo o decreciendo el valor de la resistencia en una función linear...para cada posición del potenciometro hay un valor de la resistencia y ese resultado dibuja una linea..
Nuestro arduino (con la ayuda de la librería MIDI) recibe esos valores de la resistencia del potenciometro , a traves de una de sus entradas analógicas (en este caso una entrada analógica del chip multiplexor) y los traduce a un valor que va de 0 a 127 (hace una conversión analógica-digital :D ) y eso se traduce a que podemos mover el potenciometro de nuestra pedalera y , al mismo tiempo, ver como cambia suavemente y sin latencia perceptible, el potenciometro de nuestro VST en la pantalla.
Ya he recomendado los potenciometros lineares de 10K.

Respecto a los leds, yo utilizo unos leds rgb de cuatro patillas, cada patilla lleva uno de los colores (rojo, verde y azul) y tambien los hay de catodo o anodo (eso da igual, solo cambia la manera de alimentarlos)...para alimentarlos utilizo la alimentación a 3.3 voltios de arduino y si es necesario pongo resistencias..
Vosotros podeis utilizar cualquier led, os servirá perfectamente igual, solo que puede que tengais más número de bombillas que yo, pero la conexión es igual en todos..
Si utilizais algun led de más voltaje de 5 voltios ya tendreis que alimentar externamente y buscar los componentes adecuados (mosfets, fuentes de alimentacion, etc..).

Sobre el encoder.. podeis pasar de el perfectamente, no os va a fastidiar el poder subir el codigo aunque no este conexionado, pero os explico..es un potenciometro que al ser girado hace un pequeño click y se puede girar 360 grados...solo tiene unas cuantas posiciones en cada click... y en la practica actua como un boton cuando giras hacia el lado derecho y otro botón distinto cuando giras hacia la izquierda..(es lo mismo que dos botones con la salvedad de que los activas girando el potenciometro)

Sobre la pantalla I2C LCD.. tambien podeis pasar... pero debeis eliminarla del codigo antes de poder subirlo, la pantalla solo sirve para ver en que posición estan los potenciometros (dibuja una barra en la pantalla , que se rellena al máximo cuando el potenciometro está al máximo)..es un elemento visual sin más.. :D
Es muy facil eliminar o añadir cosas al codigo (la pantalla mucho más)..

seguramente vuelva al hilo con alguna cosa que me he dejado y ya me dedicare a explicar, por fin, la pedalera de ignotus..

Solo quiero que os quede claro que se pueden hacer muchas cosas en midi con este cacharrito (arduino) como controlador MIDI, el limite esta en la librería MIDI.
Y yo recomiendo que merece la pena probarlo..yo actualmente, sueño con faders motorizados y mesas de mezcla (controladoras midi, más bien..) con pantallas del copón, pero eso será, si dios quiere, para unos años venideros...

Saludos, hasta pronto :D
Archivos adjuntos ( para descargar)
cable bue.png
conexionados.png
conectores a placa.png
mullti.jpg
multi.png
clema.jpg
Subir
1
elias
#10 por elias el 09/06/2022
Sé que habrá alguien al que todo esto le interese...para el va.. :D

Si pensais montar todos los componentes en una placa (potenciometros, leds, botones ,etc..), me parece una buena idea (mucho mejor que lo mio).
Podeis optar en plan profesional por encargarla o con un chip atmega 1284 podeis hacer vuestra propia placa de arduino y hacer un aparato slim... o tambien podriais hacer una especie de shield en vuestra placa de arduino y conectarlo todo de esa forma. (construirlo en dos placas)

Os recomendaría que comprarais placas de calidad y no esas marrones de pseudo-baquelita que salta la pista de cobre del pin , enseguida cuando te pasas dando calor con el soldador..

Hoy os he traido el codigo del primer post pero en plan minimal..
Solo necesitais un par de chips multiplexores 4067 y el arduino mega 2560 (tambien un potenciometro, algún botón y led para poder probarla).
He quitado del codigo todo lo innecesario...encoder,pantalla,etc..

Si alguien quiere que haga el codigo para un "arduino uno" o sin chips multiplexores solo tiene que pedirmelo..
Opciones hay muchas y lo que te sirva a ti le puede servir a otro..
Alguien escribió:

#include <AnalogMultiButton.h> //Will be used for connect two or more buttons,using resistors, to one analog input on arduino.
#include <Control_Surface.h> //Include Control Surface library (
#include <Arduino_Helpers.h> //Include the Arduino Helpers library.
#include <AH/Containers/ArrayHelpers.hpp> //Include the ArrayHelpers library.
#include <AH/Hardware/Button.hpp> //Include the Button library.
#include <AH/Hardware/ExtendedInputOutput/AnalogMultiplex.hpp> //Include the AnalogMultiplex library.


USBMIDI_Interface usbmidi;



Bank<8> bankpedal(4); //Declare a bank named bankpedal.<8>bank positions.and(4)incrementDecrement value
Bank<8> bankamp(4); //Declare a bank named bankpedal.<8>bank positions.and(4)IncrementDecrement value

/**Declare a CD74HC4067 multiplexer named "mux2".*/
CD74HC4067 mux2 = {
8, //Pin SIG on multiplexer, connected to pin(8) on arduino.
{9, 10, 11, 12}, //Pins S0, S1, S2, S3 on multiplexer, connected to pins( 9, 10, 11 and 12 )on arduino.
};

/**Declare 8 buttons as ccbuttonlatched and
*connected to pins 0-7 in multiplexer 2 (mux2) 99,
*declared as digital inputs and named "pedalswitches" .
*Will be the 8 on/off buttons for 8 different pedals
*/
CCButtonLatched pedalswitches[] = {
{ mux2.pin(0), { 77, CHANNEL_1 } }, //Button connected to C0 in multiplexer(mux2)and Ground. CC 77 MIDI signal on channel 1. First pedal effect on/off button (with led state)
{ mux2.pin(1), { 81, CHANNEL_1 } }, //Button connected to C1 in multiplexer(mux2)and Ground. CC 81 MIDI signal on channel 1. Second pedal effect on/off button (with led state)
{ mux2.pin(2), { 85, CHANNEL_1 } }, //Button connected to C2 in multiplexer(mux2)and Ground. CC 85 MIDI signal on channel 1. Third pedal effect on/off button (with led state)
{ mux2.pin(3), { 89, CHANNEL_1 } }, //Button connected to C3 in multiplexer(mux2)and Ground. CC 89 MIDI signal on channel 1. Fourth pedal effect on/off button (with led state)
{ mux2.pin(4), { 93, CHANNEL_1 } }, //Button connected to C4 in multiplexer(mux2)and Ground. CC 93 MIDI signal on channel 1. Fifth pedal effect on/off button (with led state)
{ mux2.pin(5), { 97, CHANNEL_1 } }, //Button connected to C5 in multiplexer(mux2)and Ground. CC 97 MIDI signal on channel 1. Sixth pedal effect on/off button (with led state)
{ mux2.pin(6), { 101, CHANNEL_1 } }, //Button connected to C6 in multiplexer(mux2)and Ground. CC 101 MIDI signal on channel 1. Seventh pedal effect on/off button (with led state)
{ mux2.pin(7), { 105, CHANNEL_1 } }, //Button connected to C7 in multiplexer(mux2)and Ground. CC 105 MIDI signal on channel 1. eighth pedal effect on/off button (with led state)
};


/**Declare 8 buttons as ccbuttonlatched type and
* connected to pins 8-15 in multiplexer 2 (mux2),
* as digital inputs, "named single8buttons" */
CCButtonLatched single8buttons[] = {
{ mux2.pin(8), { 84, CHANNEL_1 } }, //Button connected to C8 in multiplexer(mux2)and Ground. CC 84 MIDI signal on channel 1.
{ mux2.pin(9), { 86, CHANNEL_2 } }, //Button connected to C9 in multiplexer(mux2)and Ground. CC 86 MIDI signal on channel 2.
{ mux2.pin(10), { 87, CHANNEL_3 } }, //Button connected to C10 in multiplexer(mux2)and Ground. CC 87 MIDI signal on channel 3.
{ mux2.pin(11), { 88, CHANNEL_4 } }, //Button connected to C11 in multiplexer(mux2)and Ground. CC 88 MIDI signal on channel 4.
{ mux2.pin(12), { 90, CHANNEL_5 } }, //Button connected to C12 in multiplexer(mux2)and Ground. CC 90 MIDI signal on channel 5.
{ mux2.pin(13), { 91, CHANNEL_6 } }, //Button connected to C13 in multiplexer(mux2)and Ground. CC 91 MIDI signal on channel 6.
{ mux2.pin(14), { 92, CHANNEL_7 } }, //Button connected to C14 in multiplexer(mux2)and Ground. CC 92 MIDI signal on channel 7.
{ mux2.pin(15), { 94, CHANNEL_8 } }, //Button connected to C15 in multiplexer(mux2)and Ground. CC 77 MIDI signal on channel 1.
};

/**Declare a CD74HC4067 multiplexer named "mux3".*/
CD74HC4067 mux3 = {
A15, //Pin SIG on multiplexer, connected to pin(A15) on arduino.
{A14, A13, A12, A11}, //Pins S0, S1, S2, S3 on multiplexer, connected to pins( A14, A13, A12 and A11 )in arduino.
};




/**Declare 8 potentiometers as ccpotentiometer type and
* connected to pins 4-7 (POTSpedal) and 12-15 (POTSamps).
* Declared as analog inputs in multiplexer 3 (mux3), ,and named "POTSpedalPOTSamp" */
CCPotentiometer POTSpedalPOTSamp[] = {

{mux3.pin(4), 74}, //Potentiometer connected to C4 in multiplexer(mux3)and Ground. CC 74 MIDI signal on channel 1. Pots pedal (not bankable)
{mux3.pin(5), 75}, //Potentiometer connected to C5 in multiplexer(mux3)and Ground. CC 75 MIDI signal on channel 1. Pots pedal (not bankable)
{mux3.pin(6), 76}, //Potentiometer connected to C6 in multiplexer(mux3)and Ground. CC 76 MIDI signal on channel 1. Pots pedal (not bankable)
{mux3.pin(7), 78}, //Potentiometer connected to C7 in multiplexer(mux3)and Ground. CC 78 MIDI signal on channel 1. Pots pedal (not bankable)
{mux3.pin(12), 79}, //Potentiometer connected to C12 in multiplexer(mux3)and Ground. CC 79 MIDI signal on channel 1.Pots amp (not bankable)
{mux3.pin(13), 80}, //Potentiometer connected to C13 in multiplexer(mux3)and Ground. CC 80 MIDI signal on channel 1.Pots amp (not bankable)
{mux3.pin(14), 82}, //Potentiometer connected to C14 in multiplexer(mux3)and Ground. CC 82 MIDI signal on channel 1.Pots amp (not bankable)
{mux3.pin(15), 83}, //Potentiometer connected to C15 in multiplexer(mux3)and Ground. CC 83 MIDI signal on channel 1.Pots amp (not bankable)
};


/** Declare a button as bankable::ccbuttonlatched type
* (this button will increment or decrement (4) values (CC)
* in <8> each bank position (bankpedal).(Starts on position one
* 77 CC and finish position eight 105 CC).
* it´s connected to pin 6 in arduino,
* declared as digital input,and named "pedaleffectprincipalbutton"
* This button will turn ON/OFF the pedal effect.
* pressing increment/decrement button will turn on/off the next pedal effect.
*/
Bankable::CCButtonLatched<8> pedaleffectprincipalbutton[] = {
{ bankpedal, 6, 77, },
};


/**Declare 4 potentiometers as bankable::ccpotentiometer type and
* connected to pins 8-11 in multiplexer 3 (mux3),
* declared as analog inputs,and named POTSbankamp.
* (this potentiometers will increment or decrement (4) values (CC)
* in <8> each bank position (bankamp).(First potentiometer starts on position one
* 1 CC and finish position eight 29 CC).
*/
Bankable::CCPotentiometer POTSbankamp[] = {

{bankamp, mux3.pin(8), 1},
{bankamp, mux3.pin(9), 3},
{bankamp, mux3.pin(10), 4},
{bankamp, mux3.pin(11), 6},
};


/**Declare 4 potentiometers as bankable::ccpotentiometer type and
* connected to pins 0-3 in multiplexer 3 (mux3),
* declared as analog inputs,and named POTSbankpedal.
* (this potentiometers will increment or decrement (4) values (CC)
* in <8> each bank position (bankamp).(First potentiometer starts on position one
* 37 CC and finish position eight 65 CC).
*/
Bankable::CCPotentiometer POTSbankpedal[] = {

{bankpedal, mux3.pin(0), 37},
{bankpedal, mux3.pin(1), 38},
{bankpedal, mux3.pin(2), 39},
{bankpedal, mux3.pin(3), 40},
};


/** Declare two buttons as Incrementdecrementselectorleds type
* (this buttons will increment or decrement bank position
* in bankpedal.(Starts on position one and finish in position eight)
* declared as digital inputs,and named "bankSelectorbankpedal"
* This buttons will show bank position from one to eight with eight
* different leds
*/
IncrementDecrementSelectorLEDs<8> bankSelectorbankpedal = {
bankpedal,
{5, 7}, // button pins connected to digital inputs 5 and 7 in arduino and ground
{30, 31, 32, 33, 34, 35, 36, 37}, // LED pins connected to digital inputs 30-37 in arduino and ground
};


/** Declare two buttons as Incrementdecrementselectorleds type
* (this buttons will increment or decrement bank position
* in bankamp.(Starts on position one and finish in position eight)
* declared as digital inputs,and named "bankSelectorbankamp"
* This buttons will show bank position 1-8 with eight
* different leds
*/
IncrementDecrementSelectorLEDs<8> bankSelectorbankamp = {
bankamp,
{14, 15}, // buttons connected to digital inputs 14 and 15 in arduino and ground
{38, 43, 44, 41, 42, 39, 40, 45}, // LED pins connected to digital inputs 38-45 in arduino.and ground
};

/**Next lines are for declare pedal on/off state LEDS..the leds reflects the pedal effect position
pedal buttons */
const pin_t ledPins[] = { 22, 23, 24, 25, 26, 27, 28, 29 }; //led pins connected to digital outputs 22-29 in arduino

template <class T, size_t N> constexpr size_t length(T (&)[N]) { return N; }

static_assert(length(pedalswitches) == length(ledPins),
"Error: requires same number of buttons as LEDs");


void setup() {

Control_Surface.begin(); // Control surface library init

for (auto pin : ledPins) //Set the pinMode to output for all LEDs

pinMode(pin, OUTPUT);
pinMode(5,INPUT_PULLUP);
pinMode(6,INPUT_PULLUP);
pinMode(7,INPUT_PULLUP);
pinMode(14,INPUT_PULLUP);
pinMode(15,INPUT_PULLUP);
pinMode(mux2.pin(0),INPUT_PULLUP);
pinMode(mux2.pin(1),INPUT_PULLUP);
pinMode(mux2.pin(2),INPUT_PULLUP);
pinMode(mux2.pin(3),INPUT_PULLUP);
pinMode(mux2.pin(4),INPUT_PULLUP);
pinMode(mux2.pin(5),INPUT_PULLUP);
pinMode(mux2.pin(6),INPUT_PULLUP);
pinMode(mux2.pin(7),INPUT_PULLUP);
pinMode(mux2.pin(8),INPUT_PULLUP);
pinMode(mux2.pin(9),INPUT_PULLUP);
pinMode(mux2.pin(10),INPUT_PULLUP);
pinMode(mux2.pin(11),INPUT_PULLUP);
pinMode(mux2.pin(12),INPUT_PULLUP);
pinMode(mux2.pin(13),INPUT_PULLUP);
pinMode(mux2.pin(14),INPUT_PULLUP);
pinMode(mux2.pin(15),INPUT_PULLUP);
}

void loop() {

Control_Surface.loop();

for (size_t i = 0; i < length(pedalswitches); ++i)
// Update the LED states to reflect the toggled switch states
digitalWrite(ledPins, pedalswitches.getState() ? LOW : HIGH);
}


Si lo cortais y pegais en arduino IDE , vereis lo increiblemente sencillo que es el codigo (hay mucha más explicación y aclaraciones que codigo en si)
Perdonad el tocho de los primeros posts para explicar esto, no lo sé hacer de otra manera, supongo.. solo espero que el que este interesado de verdad..pueda empezar a hacerlo.
Bueno un saludo a todos. :D
Subir
2
elias
#11 por elias el 10/06/2022
Ok..continuemos..

Respecto a la programación del arduino y del codigo necesario, ya sabeis que utilizamos las librerias MIDI para arduino que se llaman "control surface".

https://tttapa.github.io/Control-Surface-doc/Doxygen/index.html

Debeis saber que la pedalera de ignotus (la mejor que he visto, de lejos..) esta programada utilizando una libreria distinta (el creador de las dos librerias es el mismo, pero es una librería más antigua y muy distinta a la nueva (antes he puesto el link de la librería nueva).

En este hilo me voy a centrar en la librería nueva (control surface), por la sencilla razón de que tengo más posibilidades de aprender algo y además para la vieja librería ya tenemos a ignotus que es capaz de hacer todo lo que se hace en la nueva..

Hay muchas cosas que me he dejado de explicar (por ejemplo...como declarar nuestro dispositivo en el encabezamiento del código para que actue como dispositivo-usb o hardware-serial etc etc..)pero es que teneis que pensar que hay muchisimos modelos que pueden funcionar y las posibilidades son muchas..prefiero esperar que alguien pregunte algo concreto para entrar en alguna de las posibilidades.....además todo lo que me he dejado de explicar está en el link que he puesto antes...

Tambien, por ejemplo, me he dado cuenta estos dias de que ya hay algo mejor para flashear arduino y convertirlo en dispositivo MIDI.

Esto ya es un paso adelante al mocolufa y a hiduino y sobre todo a eso de flashear de un modo a otro para poder subir codigo a arduino , eso ya queda para el pleistoceno con esto..

https://github.com/TheKikGen/USBMidiKliK

Luego..
Hay muchos usuarios de modelos que no necesitaran flashear (teensy, leonardo, etc..) y otros simplemente no podrán flashear porque es imposible en su modelo (imitaciones sin usb nativo, CH340G etc...) y otros como yo que debemos flashear(mega 2560, uno etc..).Es mejor tener un dispositivo midi-usb nativo por muchas razones...

Pero..
En realidad lo bueno de todo esto, es que todos en teoria pueden probar y tendrán un dispositivo midi de uno u otro modo, pero tened en cuenta que habrá usuarios de micro, arduino uno o leonardo que enseguida se darán cuenta de que el cacharro se les queda corto para subir codigo midi con la nueva librería (podrán hacer un dispositivo MIDI igualmente, pero será algo pequeño, unos cuantos pots y botones con leds y poco más..).
Y otros usuarios de teensy 4.1 (40 euracos) con faders motorizados (10 euracos) estarán pensando , más bien, en añadir pan de oro a los bordes de su dispositivo MIDI.

A ver..
Mega 2560 es una buena opción para lo que yo hago de momento.. yo os recomiendo un mega 2560.
El autor de la librería no os recomienda un mega 2560..(creo que solo lo recomienda para MIDI IN) pero a mi me funciona bastante bien (no meto muchos datos midi a la vez, no necesito velocidad absurda en la computación, ni cubits de cuantización tridimensional.. casi todo lo que hago es recibir datos midi...
Si vosotros os os poneis a hacer un cacharro que mande y envie datos a la vez y etc etc...si pensais hacer algo más complejo... ya deberiais ir a por algo más serio, como una teensy (la raspberry pico vale tambien..pero la teensy es más potente y la recomienda el autor de la librería).
Pero que sepais que se puede hacer lo mismo con las dos (en mi caso, repito..)..la teensy curiosamente puede manejar audio..(yo me comprare una teensy,muy pronto..jeje y el fader motorizado seguro que tambien :D )

Y ya está, de momento no voy a entrar, más en codigos ni nada de lo que ya está todo explicadito y muy bien, además... por el autor (que va mejorando y se agradece mucho..)en el link que he puesto antes.

Anunciaros que voy a continuar este hilo (mejor concentrarme aquí, sobre este tema, que no desperdigar más hilos), pero no voy a explicar la pedalera de ignotus (ya está muy bien explicada).
Lo que voy a hacer es una mesa de mezclas (un controlador midi para nuestro DAW) con un arduino mega (un arduino uno al principio) y con la librería nueva, lo que si es intentar detallar lo más importante en todo el proceso.
El proposito es sobre todo compartir mucho codigo, experiencias de montaje, materiales y aclarar todo lo que se pueda..

Saludos!
Subir
elias
#12 por elias el 11/06/2022
Una vez que ya he dejado todo aclarado y justificado...podemos seguir..:D
Empiezo el proyecto con todas mis placas en pelotas, señores..
Os muestro en la primera foto, las que tengo disponibles..empezamos de cero, inocencia y analfabetismos a flor de piel. XD

La primera de la izquierda es una de esas que yo hablo tan mal de ellas: un ARDUINO UNO ,tiene un chip atmel 328p con puerto ISCP (recordad que ya os dije, el puerto con 6 pines machos) pero esta no se puede flashear para tener un dispositivo-midi , de ninguna forma posible.. así que me olvidaría de este capitulo con esta placa, y utilizaría los programas como el hairless o el loopbe, despues , claro está...de subirle el codigo adecuado, con arduino IDE.

El otro arduino uno a su lado, tiene tambien, un chip atmel 328, pero este es removible del zocalo y el otro además era como un cuadradico :D y con este arduino uno si que podremos flashear para tener el dispositivo midi-usb.(fijaros que tiene dos puertos ICSP).

Podemos ver, al lado de la pareja de arduinos uno :D, un pedazo de arduino MEGA 2560, de color :D (es el de keystudio tiene la particularidad de poder entregar unos pocos más de miliamperios, pero nada más..):D y podemos ver un SHIELD de arduino MEGA (os podeis hacer uno vosotros mismos, con una placa) y el proposito que tiene, no es otro.., que el de hacer la placa arduino mega, removible..

Por ultimo podemos ver un chip atmel 1284 abandonado, en una amarilleada protoboard (es un chip, campeón entre arduinos) que ya veremos si consigo echarlo a rodar..

Bueno, empezamos..descargad el siguiente archivo (darle a download zip)
https://github.com/TheKikGen/USBMidiKliK
Vamos a utilizar el midiklik que parece un poco mejor y con más soporte que mocolufa o hiduino (vamos a darle una oportunidad).

Lo primero es conectar nuestra placa al ordenador y cuando sea reconocida como un arduino, puentearemos , por un instante, los dos pines del puerto ICSP (pin reset y pin ground), para ponerlo en DFU mode y poder establecer comunicación a traves del programa atmel flip.
Se puentean el pin reset y el pin ground, por un instante y al cabo de un par de segundos lo soltamos y los dejamos como estaban.(ver foto del puerto icsp para localizar los pines)

Ahora descargad atmel flip.
https://www.microchip.com/en-us/development-tool/flip
En atmel flip seleccionaremos nuestro tipo de chip-usb, abrimos el atmel flip y pulsaremos DEVICE y luego SELECT y luego seleccionar nuestro tipo de chip atmega (en el caso de uno o mega son el atmega8U2 o el atmega16U2).

Luego pulsaremos en SETTINGS, clickamos en COMMUNICATION y luego seleccionamos USB.
Si consigues establecer comunicación, perfecto..
Sino funciona y te sale un error.. entonces trata de puentear otra vez los dos pines para resetear otra vez..al final debe establecer comunicacion..

Ahora solo tenemos que pulsar en FILE y luego seleccionar LOAD HEX FILE.
Ahora buscamos en la carpeta de midiklik el archivo "USBMidiKliK_dual_uno.hex.build", lo seleccionamos y luego pulsamos RUN.


Ya está... ya tenemos nuestro dispositivo midi-usb.
Desconecta arduino y vuelve a conectarlo para poder ver como es reconocido ahora como un dispositivo MIDI-USB (midiklik usb midi no seque..pero podeis cambiar el nombre facilmente).
Para volver a que sea un arduino y así poder subirle codigo con arduino ide solo tenemos que puentear otros dos pines, esta vez son los pines MOSI y GROUND, pero en el mismo puerto ISCP que antes os explicaba para poner en DFU mode. (ver la foto del puerto icsp).

He repetido el mismo proceso en arduino mega y en arduino uno (en los dos funciona igual)
Saludos.

Ya veremos mañana que me centro en explicaros..de momento voy a seguir mejorando mi mesa de mezclas ;)
Archivos adjuntos ( para descargar)
20220611_000546[1].jpg
20220611_000659[1].jpg
20220611_000741[1].jpg
Puertos ICSPS.png
Subir
1
Hilos similares
Nuevo post

Regístrate o para poder postear en este hilo