domingo, 20 de mayo de 2012

PCB

Tras acabar realizamos una placa PCB con el hardware empleado, el resultado es el siguiente:
Placa montada y funcionando.

Interfaz gráfica completa: Arduino Synth

Ya tenemos todos los elementos necesarios en nuestro programa y sólo queda aglutinarlos en una única interfaz integrada por todos los módulos mostrados hasta ahora. Para ello hemos diseñado una GUI escalable, fácil de usar y lo más intuitiva posible para poder utilizarla sin dificultades.
Arduino Synth - GUI 
En ella se pueden observar los distintos módulos del programa:
  • Módulo de comunicación con Arduino (arriba izquierda) Controla la comunicación con el microcontrolador, permite abrir y cerrar conexión con él, activar el Active Sensing y el parseado de instrucciones MIDI, y además activa y desactiva la computación de audio en el Pure Data. 
  • Módulo de visualización/comunicación con la Matriz LED (arriba centro) Se trata del módulo de comunicación explicado en el apartado anterior. 
  • Display de mensajes MIDI (arriba derecha) En este display se visualizan las instrucciones MIDI que llegan del Arduino, cuyos bytes han sido parseados para hacerlos inteligibles (gracias al módulo printMidi) 
  • Visualización de energías y audio final (debajo de los tres anteriores) Aquí se recoge todo el audio generado en el programa y se envía por el puerto de salida para ser reproducido por la salida de audio del sistema. Se presenta la señal por pantalla y se calcula la energía en 8 bandas de frecuencia, preparando los valores para ser enviados al módulo de comunicación con la matriz LED. 
  • Arpeggiator (debajo del anterior) Explicado en el apartado siguiente. 
  • Módulo de síntesis FM (abajo izquierda) Nuestro primer sintetizador polifónico. Con presets añadidos y reverberación. 
  • Reproductor de audio (abajo centro) Reproduce archivos de audio. Contiene controles estándar de reproducción, volumen, posición de la canción, control de velocidad de reproducción y reverb. 
  • Módulo de redirección MIDI para programas externos (abajo derecha) Redirige la información MIDI a un bus virtual del sistema para ser utilizada por otros programas.
Y para finalizar, el esquema de funcionamiento global del programa:

Arpeggiator: una mejora del software


Además de construir un sistema básico completamente funcional, hemos querido añadir una mejora a nuestro diseño para hacer de él un programa más sólido y añadir una herramienta muy útil a la hora de componer música y efectos especiales.


Un arpegiador es un dispositivo que captura las notas tocadas por un controlador MIDI y lanza secuencias de notas en función de las teclas pulsadas. Por ejemplo, si tocáramos un acorde el arpegiador podría separar las notas de ese acorde y tocarlas secuencialmente, una detrás de otra (arpegio). O lanzar rápidamente escalas a partir de esas notas para crear efectos de sonido. O crear sonidos “colchón” que se mantengan a lo largo de la canción sobre los que poder tocar otros instrumentos.



'as_arpeggiator'
En lugar de alimentar directamente a los sintetizadores desde el ArduinoModule, hacemos pasar el flujo de instrucciones MIDI por el Arpeggiator. Este módulo coge uno sólo de los canales MIDI y deja pasar al resto sin actuar sobre ellos. Utilizando las notas de ese canal, este módulo puede crear efectos como los que hemos mencionado antes, creando nuevas instrucciones MIDI que se envían al sintetizador asociado a dicho canal.


Posee una línea temporal, que se encarga de generar los nuevos mensajes MIDI a la velocidad deseada. En los paneles inferiores se puede modular la frecuencia y la intensidad de estas nuevas instrucciones, así como cambiar la velocidad a la que se generan y otras opciones mediante el resto de la interfaz.

Subsistema de visualización. Comunicación con la Matriz LED

Finalmente, ahora que tenemos toda la información MIDI y de audio (de energía de la señal) disponible, necesitamos transmitirle al Arduino las instrucciones necesarias para generar los patrones luminosos que deseemos en la matriz de LEDs. Utilizando el patch ‘as_ledMatrix’ tenemos una interfaz mediante la cual activamos diversas funciones que hemos incorporado en el microcontrolador:
  • ON/OFF Apagamos o encendemos la matriz de LEDs activando y desactivando este botón.
  • Selección de modo Con estos 4 pulsadores podemos elegir cualquiera de los distintos modos de visualización. Los cuatro están explicados en el apartado de hardware, y son: EQ (SpectrumVisualization, muestra la energía por bandas de la señal), AudioRhythm (AudioRhythmicVisualization, crea patrones de iluminación en función de la información MIDI entrante), Random (PopVisualization, enciende luces posicionadas aleatoriamente en la matriz en función del número de notas tocadas en un intervalo de tiempo), y Demo (ShowcaseVisualization, muestra una serie de imágenes de demostración).
  • Asignación de canales MIDI a canales de visualización En el lateral izquierdo del módulo se asignan los canales MIDI deseados a los 4 canales de iluminación que controlan la visualización audiorítmica. A su vez, pueden activarse y desactivarse independientemente.
Una vez encendida la matriz de LEDs mediante el correspondiente botón, se envían distintos tipos de datos a la matriz en función del modo de visualización activado. Los pulsadores de selección de modo mandan bytes de comando que activan en la matriz las respectivas visualizaciones, y una vez elegidas, se envían datos diferentes en función de la visualización activada.
  • Para la EQ, lo que se envían son los paquetes de 8 bytes que contienen la energía de cada una de las bandas + 1 byte con la energía total de la señal.
  • Para la AudioRhythm se envía la información de nota e intensidad de las instrucciones NoteON de los canales MIDI asignados a cada uno de los canales de iluminación.
  • Para la Random se envían números aleatorios entre 1 y 17 cuando llega un mensaje MIDI de NoteON
  • Para la Demo, no se envía nada.
Todos estos datos se mandan al microcontrolador formateados según el protocolo que hemos creado para poder establecer comunicación entre el Pure Data y el Arduino, y está explicado completamente aquí.

Recolección de audio y cálculo de energía de la señal


Ahora que ya hemos construido todos los módulos de generación de sonido, pasamos a operar con toda la información que tenemos disponible de las instrucciones MIDI y del audio generado para crear una serie de visualizaciones, las cuales serán posteriormente representadas en la matriz de LEDs.


En primer lugar, queremos coger todo el audio generado en el programa o en los sintetizadores externos y mezclarlo, sumar todos los canales. De esta forma ya tenemos en un sólo flujo de audio estéreo todos los sonidos producidos y podemos operar con él.
Para mostrar la energía por bandas de la señal introducimos la señal ya mezclada en el módulo de visualización de energías que se encuentra en el patch ‘as_energyDisplayPanel.pd’.


En este módulo se realizan 3 tareas diferentes:

  • Envío del audio final al DAC del ordenador Es en este módulo donde enviamos la suma de todos los canales de audio existentes en el programa a la salida de audio del Pure Data, que conectamos por defecto a la salida de audio del sistema.
  • Representación de la señal de audio Además, se dibuja en pantalla la señal de audio en el tiempo.
  • Visualización de la energía por bandas Por último, y empalmando con el envío de datos a la matriz LED, se calcula la energía de la señal en 16 bandas de frecuencia diferentes utilizando un banco de filtros paso banda.

En cuanto a la visualización de energía, se pasa la señal a través de 16 filtros paso banda de 2º orden centrados en 25, 40, 63, 100, 160, 250, 380, 550, 790, 1k, 1.6k, 2.5k, 4k, 6.3k, 10k, y 16kHz. Su ancho de banda se expresa en octavas respecto de la frecuencia central, siendo el valor 100 equivalente a una octava. Nuestros filtros están configurados con un valor de 20, es decir, 1/5 de octava.
8 primeros filtros
Para calcular la energía de la señal utilizamos el objeto ‘env~’, que devuelve la amplitud RMS de la misma en dB (tomando el valor 1 como 100 dB). Esta configurado para utilizar una ventana de 512 muestras y realizar el cálculo cada 256 muestras. A continuación, se realiza la media aritmética de cada pareja de filtros (se suman por parejas y se normaliza: (filtro 1 + filtro 2)/2, (filtro 3 + filtro 4)/2, etc.) y se obtienen 8 valores de energía a lo largo de casi todo el rango de frecuencias audible.


A estos valores se les aplica una función de transferencia con el objetivo de ajustar los diferentes valores a la cantidad de LEDs que deben encenderse en cada caso y se restringe su valor entre 0 y 199 (por especificación del protocolo que hemos diseñado para comunicarnos con el micro).


Los datos generados por los filtros se muestran por pantalla utilizando una serie de vúmetros individuales. Y, por último, una vez obtenidos, los 8 bytes que contienen esos valores se empaquetan en un mensaje y se envían cada 50 milisegundos al último módulo del programa, el subsistema de visualización. Este es el encargado de hacer llegar al Arduino toda la información que queremos ver en la matriz LED.