PEC4 Sistema de generación de efectos visuales en función de datos de instrumentos musicales, basado en Arduino y Processing

INTERACCIÓN TANGIBLE – PEC 4
Desarrollo de un entorno creativo basado en Arduino, audio, vídeo, y lenguaje MIDI.

DVSS (Duplex Visual (and) Sound System)

Mariano Mayayo Burillo

mmayayob@uoc.edu

Grado de Técnicas de Interacción Digital y Multimedia

Universitat Oberta de Catalunya – Junio de 2023

ESQUEMA DE CONEXIONES EN ARDUINO Y DEMOSTRACIÓN

DEMOSTRACIÓN EN YOUTUBE: https://youtu.be/qaYWdrFBpX4

INTRODUCCIÓN 

En esta última práctica (PEC4) de Interacción tangible, se desarrolla finalmente el dispositivo en el que se ha trabajado en las prácticas anteriores (2 y 3). Consiste en un sistema que recibe datos musicales de dos tipos, analógicos (voltaje recibido desde sintetizadores) y digitales (mediante lenguaje MIDI), los procesa y envía mediante comunicación en serie a un sistema de visualización gráfica basado en Processing. 

PASOS PREVIOS. (PROYECTOS ANTERIORES)

En el primer prototipo (PEC2, comunicación entre sintetizador y arduino) se establecieron las bases para la comunicación mediante señal analógica de entrada a arduino y comunicación en serie con Processing para visualización de señales.

En la PEC3 continuó el proyecto iniciado en la PEC2 anterior sobre comunicación entre dispositivos y sistemas de monitorización de distintas señales, se creó una opción de salida de voltaje analógico para enviar datos a dispositivos musicales (sintetizadores) y modificar sus sonidos, y se crearon nuevas opciones de visualización gráfica basadas en elementos 3D.

PROCEDIMIENTO PEC4 (FINAL)

Se sigue el procedimiento del design thinking mediante el cual se tiene en cuenta las diversas necesidades del usuario final (músicos electrónicos, discjockeys, artistas visuales, etc) así como la realización de diversos test de funcionamiento que nos permita obtener el resultado deseado. 

El desarrollo final del proyecto actual en esta PEC4 comienza tras realizar diversos tests sobre el prototipo desarrollado en la PEC3 en los que se ha observado una serie de necesidades para el proyecto final y se ha decidido realizar determinadas modificaciones importantes, tanto en hardware como en programación tanto de Arduino como de processing, para poder llevarlo a cabo.

Estas modificaciones condicionadas principalmente por la necesidad de comunicación MIDI y el propio diseño de interacción del sistema son:

PRINCIPALES CAMBIOS EN HARDWARE:

  • Cambio de placa Arduino UNO por una placa ARDUINO MEGA. Arduino UNO sólo dispone de un bus serie y en este proyecto son necesarios varios buses de comunicación. Arduino MEGA ofrece hasta 4 buses de comunicación serie. Con Arduino UNO era imposible en las primeras pruebas el utilizar los dispositivos I2C junto con el protocolo MIDI.
  • Necesidad de conectores MIDI y optoacoplador 6n139 para la recepción de mensajes MIDI. (NotesAndVolts)
  • Se añade un KEYPAD 4×4 para controlar las diversas opciones directamente desde el propio dispositivo, en vez de controlarlas desde el teclado del PC como se hacía en la PEC 3.
  • Se elimina la pantalla LCD y se sustituye por 8 LEDS que indican los diferentes estados del sistema. Tras las pruebas no se considera necesario mostrar valores en esta pantalla, pero sí es necesario mostrar el estado del sistema. Esto simplifica el desarrollo del código de Arduino,  el diseño de interacción, y la programación básica del sistema, permitiendo así invertir más tiempo en el desarrollo de la comunicación MIDI , en serie y las diferentes opciones de visualización.
  • Se incluyen 2 componentes I2C con PCF8574 que ofrecen hasta 8 puertos de entrada y salida. Uno de estos módulos se usa para la recepción de los mensajes del Keypad y el otro para las 8 salidas hacia los LEDS. (Cambatronics)

PRINCIPALES CAMBIOS EN SOFTWARE ARDUINO

  • Se incluyen las librerías necesarias para la comunicación en serie con los dispositivos I2C tanto para entrada como para salida. Librería PCF8574.h y librería I2CKeypad.h.
  • Se incluye la librería necesaria para establecer la comunicación MIDI. midi.h. (fortyseveneffects)
  • Se envían mediante serie desde arduino processing simultáneamente los valores de la entrada analógica seleccionada y los mensajes midi consistentes principalmente en NOTE ON, NOTE OFF, VOLUME, y CHANNEL.
  • Uno de los datos midi de CC (Control Change) será utilizado para enviar parámetros de modificación de sonido al sintetizador, es decir, Arduino actuará como conversor de datos MIDI (digitales de entrada) a datos analógicos (voltaje de salida). En este caso utilizaremos el control de Pitch (PitchBend) de una caja de ritmos para ejecutar estas acciones sobre el sintetizador.

PRINCIPALES CAMBIOS EN SOFTWARE PROCESSING

  • Se eliminan las opciones de control de procesing desde el teclado del PC. Ahora se controlará todo el funcionamiento desde el Keypad del dispositivo, usando así processing únicamente para visualización.
  • Se reciben en serie en processing los valores enviados desde arduino. Se separan los mensajes serie recibidos y se generan distintos efectos visuales con cada uno de ellos.

OTRAS CARACTERÍSTICAS MODIFICADAS

  • Sincronización por TimeCode (Deshabilitada) En caso de implementar la sincronización por código de tiempos con dispositivos externos, ésta debe ser realizada en Arduino y debe ser processing, que simplemente responde a las órdenes de Arduino, quien se sincronice de esta manera con Arduino. Por el momento se descarta esta opción de sincronización por timecode, ya que no es el objetivo principal de este proyecto, pero queda la idea pendiente para posibles mejoras en el futuro.
  • Dispositivos apuntadores o de entrada de datos previstos en prácticas anteriores (Pec3): Se pretende reducir al máximo el uso del ordenador para seleccionar o modificar efectos de vídeo en processing, de manera que este proyecto funcione casi automáticamente. Todos los controles deben poder ser realizados desde el propio dispositivo, o desde los instrumentos musicales conectados a él. De esta manera el artista se puede centrar más en sus propios instrumentos y en su propia composición.
  • Posibilidad de ejecución y modificación de vídeo en tiempo real en Processing, mediante una webcam, o capturadora SDI o HDMI. Pendiente de implementar.Estas opciones de uso de Webcam o vídeos se quedan pendientes para futuras versiones del sistema. En este proyecto actual únicamente se desarrollarán diversos efectos visuales en processing que actuarán de manera automática en función de diversos valores de entradas seleccionados por el usuario.
  • Se opta por una visualización de elementos en 3D, de manera que se pueda realizar un sencillo movimiento automático de cámara en processing que muestre los elementos de una manera más atractiva y con una visualización en perspectiva.

EMPATIZAR CON LOS USUARIOS

Una de las principales limitaciones que encuentran los distintos artistas multimedia (músicos, artistas visuales y otros en el campo de la experimentación electrónica) suele ser la sincronización e interconexión entre dispositivos de distinto tipo. 

La intención es que se pueda poner en funcionamiento rápidamente simplemente realizando las conexiones necesarias (USB, Voltaje In / Out y MIDI) y abriendo el proyecto de processing. Todo el control de los efectos visuales y de sonido se realiza directamente desde el propio dispositivo a través del Keypad.

El código de processing puede ser modificado en cualquier momento para crear nuevas opciones visuales, sin tener que modificar nada de Arduino o del propio hardware. Con lo cual existe la posibilidad de que artistas visuales o programadores generen su propio código de Processing para ellos mismos o para otros músicos, permitiendo así la colaboración entre artistas de diversas disciplinas.

Igualmente los distintos dispositivos externos, teclados midi o sintetizadores, pueden ser sustituidos por otros que dispongan de las mismas características (Salida MIDI y entrada / salida de voltaje). De esta manera se convierte el proyecto actual en un proyecto adaptable a muy diversos escenarios.

DEFINICIÓN DEL PROYECTO

El objetivo de este proyecto final es desarrollar el sistema de comunicación entre distintos dispositivos que se ha definido a lo largo de las prácticas anteriores, de manera que la interacción del usuario sobre alguno de ellos, genere una respuesta visual o sonora en algún otro. Todo esto teniendo como parte central del sistema la combinación de Arduino (ARDUINO) y Processing. 

Concretamente se va a utilizar un generador de señales analógicas (sintetizador Behringer Td-3) y un secuenciador midi / caja de ritmos (Yamaha Rm1X). Ambos estarán sincronizados por MIDI, siendo el sintetizador el encargado del origen de la señal de sincronismo. Es decir, pulsando play en el sintetizador, la caja de ritmos comenzará su reproducción de manera sincronizada a éste, enviando además los  datos midi de sus 16 canales al sistema Arduino.

De esta manera se recibirán datos analógicos del sintetizador, y datos midi de la caja de ritmos, simultáneamente y de manera sincronizada a la reproducción musical de ambos dispositivos. (Ver esquema de conexiones BASIC SETUP al inicio de este documento)

EJEMPLOS DE USO

  • La ejecución de una secuencia musical a través de MIDI, y/o a través de salidas analógicas (desde un teclado, sintetizador, DAW, etc) reproduce (o genera) una señal de vídeo sobre una pantalla o proyector.
  • Las acciones sobre un teclado o interruptores activan o desactivan diversas opciones de visualización o ejecución del programa, o alguna opción sobre la reproducción de audio.
  • Un dispositivo de salida como un sintetizador, puede enviar datos a la entrada de un dispositivo actuador por ejemplo para mostrar un gráfico o una señal de vídeo, pero también puede recibirlos y comportarse como actuador, ejecutando una secuencia de notas midi o modificando un sonido en función de las órdenes que recibe de otros dispositivos. Es decir, la comunicación entre los dispositivos, es bidireccional. 
  • Las señales que se envían y reciben deben poder ser monitorizadas y visualizadas de alguna manera para poder tener control de lo que está sucediendo en cada momento, en este ejemplo final se realizará mediante LEDS que muestra el estado en el que está actuando el sistema.

NECESIDADES DE COMUNICACIÓN ENTRE DISPOSITIVOS

  • En este caso, es necesario varios buses de comunicación en serie, ya que ahora se dispone de lenguaje MIDI, dos dispositivos I2C, y la conexión por USB entre Arduino y Processing. Estos requisitos son los que principalmente han hecho necesario el cambio de una placa Arduino UNO a una Arduino MEGA. Además esta nueva placa permitirá en un futuro añadir muchas más conexiones para posibles instrumentos musicales o cualquier otro controlador que disponga de más opciones. De esta manera es posible el objetivo principal de enviar a processing de manera simultánea, via serial distintos tipos de datos (analógicos y midi).
  • Como ya se ha comentado, se decide finalmente el uso del lenguaje MIDI ya que es un estándar en la industria musical y se dispone en la actualidad de diversos instrumentos musicales que permiten testear y realizar pruebas con este proyecto. No se cierra la puerta a adaptar en el futuro el sistema completo a otros protocolos de comunicación.
  • Queda pendiente la posibilidad de uso de otros protocolos de comunicación además de Midi. Por ejemplo, OSC o IP. Se realizarán las pruebas necesarias en futuras versiones del proyecto según necesidades o peticiones de artistas.
  • Se utiliza un Keypad conectado a Arduino para ejecutar toda la interacción del usuario con este sistema. También la interacción del usuario con los propios instrumentos musicales modificará los gráficos que genera processing, ya que son los propios datos musicales los que generan los efectos visuales en processing.

IDEA Y OBJETIVOS CONCRETOS

Tomando como punto de partida los anteriores proyectos desarrollados en las PEC 2 y 3 se pretende crear el prototipo final completamente funcional con las modificaciones mencionadas anteriormente, que han sido decididas tras diversos testeos y pruebas de funcionamiento. Además debe quedar incluido en una caja acondicionada de tal manera que tenga los conectores necesarios para la conexión adecuada de los diferentes dispositivos externos.

DESARROLLO DEL SISTEMA FINAL

En el caso de este proyecto final (PEC4) gran parte de las modificaciones han sido en materia de hardware y componentes, lo que ha obligado a reprogramar casi por completo el código de Arduino. Por otra parte el código de Processing se limita casi exclusivamente a la recepción de mensajes serie y a la generación de efectos visuales en función de estos mensajes recibidos.

Los mensajes de las entradas analógicas y midi deben ser enviados a la vez desde arduino hasta processing si se quieren visualizar de manera simultánea, es decir, deben ser enviados y recibidos en la misma línea en serie.

PRINCIPALES CARACTERÍSTICAS DEL CÓDIGO DE ARDUINO

  • Mediante la función Midi.read() se reciben los mensajes midi, que posteriormente serán filtrados con GetType.
  • Midi.GetType() recibe el tipo de mensaje midi concreto y guarda el valor recibido en la variable correspondiente.
  • Mediante el caso Switch (keys[index]) se reciben los datos del keypad y se ejecutan las distintas acciones permitidas como leer una u otra entrada, enviar datos a los dispositivos externos o generar efectos visuales.
  • La función SendSerialMessages() envía finalmente los datos recibidos y procesados al sistema de visualización final en processing mediante comunicación en serie.

DISEÑO DE INTERACCIÓN

La interacción con el dispositivo se realiza mediante el keypad incluido. Las opciones son:

  • 1 – Selecciona entrada analógica A0 (+5v).
  • 2 – Selecciona entrada analógica A1 (+10V).
  • 3 – Selecciona entrada de datos MIDI (Puede convivir con A0 ó con A1).
  • A – Permite envío de señal hacia la salida analógica (Envío al filtro del sintetizador).
  • B – Permite envío de señal hacia Processing. 
  • C – Envía datos serie a processing para ejecutar un efecto de vídeo.
  • D – Envía otro dato a processing para la ejecución de un segundo efecto de vídeo.

OPCIONES ELIMINADAS DESDE PROYECTOS ANTERIORES

  • Funciones de teclado en Pc para processing (eliminadas) En el prototipo anterior se utilizaba la función keyPressed() de processing para controlar distintas opciones de Processing, así como para la generación de diferentes efectos visuales. En este diseño final se ha eliminado toda la programación relativa a esta parte, ya que se ha decidido no usar el teclado del PC. En el caso de tener algún tipo de comando de teclado de PC en el código de processing, estará implementado únicamente con funciones de testeo o debug. No se pretende implementar estas funcionalidades para el usuario final en PC. Algunas de estas funciones han sido trasladadas al keypad del sistema Arduino y otras eliminadas definitivamente. El motivo de estas modificaciones es principalmente centrar todo el control del sistema en el propio dispositivo Arduino y usar processing solo como visualización, y no como sistema de control. Es decir, es Arduino quien envía los datos necesarios a processing de lo que debe mostrar en cada momento, y de qué manera debe hacerlo.
  • Bidireccionalidad entre Processing y Arduino (Eliminada) De la misma manera se ha eliminado esta opción de control del dispositivo desde processing. Es decir, únicamente se quiere controlar todo el sistema desde el propio dispositivo Arduino, dejando processing únicamente para la programación de los efectos visuales en función de los datos recibidos.
  • Código de tiempos (eliminado) Se ha eliminado la opción de visualización de código de tiempos. (La implementación del timecode en Arduino se realizará en futuras versiones si pudiese ser necesaria).

SEÑAL FILTER INPUT AL SINTETIZADOR (controlada desde MIDI)

La señal de salida analógica desde Arduino para enviar distintos valores de voltaje a las entradas de los sintetizadores se controlan ahora desde un dispositivo midi externo mediante los mensajes de cambio de control. Como ejemplo se ha configurado que la recepción de un parámetro concreto de CC envíe mayor o menor voltaje al puerto de salida analógico que actúa sobre el filtro del sintetizador. Es decir, estamos usando el dispositivo como “conversor” de datos midi a voltaje, pudiendo así modificar el sonido de un instrumento concreto desde un controlador de otro distinto.

FASE DE TESTEO

La principal complejidad se encuentra en la programación de la comunicación en serie de los valores midi enviados desde arduino y recibidos en processing. En función de los distintos efectos visuales que se quieran proyectar, es necesario realizar esta comunicación de manera muy concreta. Por ejemplo, un problema que no se ha conseguido resolver, por el momento, es el envío del mensaje NOTE OFF desde Arduino, que actualmente ejecuta la orden de desactivar nota en todas las notas que están activas. Esto combinado con que el redibujado de processing se realiza en cada frame, resulta complejo de resolver. La verdad es que apenas se aprecia, ya que en el siguiente mensaje se vuelven a redibujar las notas activas, dando la sensación de que los gráficos resultantes representan realmente las notas tocadas por los dispositivos. Pero evidentemente, con tiempo, esta programación se puede mejorar.

CONCLUSIONES Y PRÓXIMOS PASOS

Aunque es cierto que queda mucho trabajo en cuanto a la programación de todo el código relativo al lenguaje MIDI, el resultado final es bastante satisfactorio, ya que se ha desarrollado un sistema que permite hacer efectos visuales (programando de manera más creativa en processing) y que responde con gran fidelidad a la actuación musical que pueda realizar un artista.

Es importante destacar que las pruebas se han realizado con los dos dispositivos midi y analógico que estaban disponibles en el momento, pero realmente estos equipos se pueden sustituir por otros con características similares. Es decir, podemos incluir un sintetizador que tenga muchos más tipos de entradas o salidas analógicas, y simplemente habría que adaptar el código para poder recibirlas o enviarlas de la misma manera que se ha hecho con sólo dos entradas, o incluir un nuevo teclado midi o un sistema DAW, simplemente haciendo las modificaciones oportunas en el código.

Quizá sería interesante probar el funcionamiento de este sistema con algún otro software de renderizado en tiempo real como Unity o Unreal Engine, que igualmente permiten comunicación con Arduino a través de las librerías apropiadas.

REFERENCIAS BIBLIOGRÁFICAS / WEBGRAFÍA

Arduino [En línea]. Consultado en abril de 2023. Disponible en: arduino.cc

Behringer TD-3 Manual de usuario [En línea]. Consultado en abril de 2023. Disponible en: https://mediadl.musictribe.com/media/PLM/data/docs/P0DTD/TD-3-SR_QSG-WW.pdf

MANAU GALTÉS, Oriol, Processing (2014). [en línea]. Barcelona: UOC, 2014 [consultado en abril de 2023]. Disponible en: https://materials.campus.uoc.edu/daisy/Materials/PID_00216128/html5/PID_00216128.html

LLAMAS, Luis. Protocolo I2C [En línea] Consultado en abril de 2022. Disponible en: https://www.luisllamas.es/arduino-i2c/

NOTESANDVOLTS. Midi para Arduino  [ En línea]. Consultado en Abril de 2023. Disponible en: https://www.notesandvolts.com/2014/11/midi-and-arduino-circuit-analysis.html

CAMBATRONICS. Ampliar entradas y salidas de Arduino con PCF8574 [En línea]. Disponible en: https://www.youtube.com/watch?v=yJ8Yj5Iw-k0

FORTYSEVENEFFECTS. Referencia de la librería Midi para Arduino [En línea]. Disponible en: https://fortyseveneffects.github.io/arduino_midi_library/

 

HERRAMIENTAS UTILIZADAS

Fritzing Herramienta para el diseño de circuitos [En línea] Utilizado en junio de 2023. Disponible en: https://fritzing.org/

 

Deja una respuesta