Full text
Hardware Looper Borja Morcillo Salgado Trabajo de fin de grado Grado en Ingeniería de Computadores Facultad de Informática Universidad Complutense de Madrid Madrid, junio de 2020 Directores: José Manuel Mendías Cuadros Carlos González Calvo
Autorización de difusión El abajo firmante, matriculado en el Grado de Ingeniería de Computadores de la Facultad de Informática, autoriza a la Universidad Complutense de Madrid (UCM) a difundir y utilizar con fines académicos, no comerciales y mencionando expresamente a su autor el presente Trabajo Fin de Grado: “Hardware Looper”, realizado durante el curso académico 2019-2020 bajo la dirección de Carlos González Calvo y José Manuel Mendías Cuadros del Departamento de Arquitectura de Computadores y Automática, y a la Biblioteca de la UCM a depositarlo en el Archivo Institucional E-Prints Complutense con el objeto de incrementar la difusión, uso e impacto del trabajo en Internet y garantizar su preservación y acceso a largo plazo. Borja Morcillo Salgado Madrid, a 30 de mayo de 2020 Esta obra está bajo una Licencia Creative Commons Atribución-NoComercial-CompartirIgual 4.0 Internacional.
Agradecimientos Esta es la típica página de agradecimientos, así que en un ramalazo de ego voy a hablar de lo personal. Gracias a Mendi, por incitarme a la locura en el fabuloso mundo del hardware; y a Carlos, por apuntarse a capitanear el barco en esta trepidante aventura. Gracias a la gente de computadores (y alguno que otro de software, informática y filosofía), que son majetes y amenizan mis días en la enorme caja de ladrillo visto. Gracias a Chiqui y Ana, por traerme a sufrir al pedrusco (y regalarme la guitarra para mitigarlo). Y también a Vera, aunque no pinta mucho. Gracias al bar El Tropezón y las criaturas que allí habitan, por motivos incompatibles con la formalidad que rige esta memoria. Gracias a quien inventase la música, a los grupos, a Radio 3, a la gente que hace las cosas por auténtico amor al arte. Gracias a Ana (no la misma de antes). No sé por qué, pero no deja de echarme cables. ¿Acaso he hecho algo bien?
Índice general Índice general i Índice de figuras vii Índice de tablas xi Resumen xii Abstract xiii 1. Introducción 2 1.1. Motivación..................................... 2 1.2. Objetivos ..................................... 3 1.3. Antecedentes ................................... 4 1.4. Plandetrabajo.................................. 5 1.5. Organización de esta memoria . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2. Visión general del sistema LoopMan 13 2.1. Funcionalidad................................... 13 2.1.1. Entradadeaudio............................. 13 2.1.2. Pistas: grabación y reproducción . . . . . . . . . . . . . . . . . . . . 14 2.1.3. Pistas: sincronización . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 2.1.4. Efectos................................... 18 2.1.5. Salidadeaudio .............................. 24 2.1.6. Controldelsistema............................ 25 2.1.7. Visualización del estado . . . . . . . . . . . . . . . . . . . . . . . . . 26 i
2.2. PorquéenunaFPGA .............................. 26 2.3. Arquitectura (visión general) . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 3. Contexto tecnológico 34 3.1. Algoritmos y fundamento teórico . . . . . . . . . . . . . . . . . . . . . . . . 34 3.1.1. Cuantificación del audio . . . . . . . . . . . . . . . . . . . . . . . . . 34 3.1.2. Puntofijo ................................. 35 3.1.3. Audio digital: Desbordamiento . . . . . . . . . . . . . . . . . . . . . . 37 3.1.4. Audio digital: Limitación . . . . . . . . . . . . . . . . . . . . . . . . . 38 3.1.5. Efectos de sonido basados en limitación . . . . . . . . . . . . . . . . . 41 3.1.6. Efectos de sonido basados en amplitud de onda . . . . . . . . . . . . 42 3.1.7. Efectos de sonido basados en retardos . . . . . . . . . . . . . . . . . . 42 3.1.8. Efectos de sonido basados en frecuencia . . . . . . . . . . . . . . . . . 45 3.2. Placa de prototipado (Nexys 4 DDR)...................... 49 3.2.1. FPGA................................... 50 3.2.2. Memoria DDR2 DRAM . . . . . . . . . . . . . . . . . . . . . . . . . 51 3.2.3. VGA.................................... 52 3.2.4. PS/2atravésdeUSB .......................... 54 3.2.5. Memoriaflash............................... 54 3.2.6. Otroscomponentes............................ 55 3.2.7. PMODs .................................. 55 3.2.8. Bluetooth ................................. 56 3.2.9. I2S..................................... 57 3.3. IP soft cores .................................... 59 3.3.1. Memory Interface Generator ....................... 59 3.3.2. Clock Generator ............................. 59 3.3.3. Integrated Logic Analizer ......................... 59 3.4. Herramientas software .............................. 60 ii
3.4.1. EDA y descripción hardware ....................... 60 3.4.2. Simulación de efectos de audio . . . . . . . . . . . . . . . . . . . . . . 61 3.4.3. Programación software (iOS) ...................... 61 3.4.4. Dibujo asistido por ordenador . . . . . . . . . . . . . . . . . . . . . . 61 3.4.5. Gráficosvectoriales............................ 62 3.4.6. Generación de documentación . . . . . . . . . . . . . . . . . . . . . . 62 3.4.7. Controldeversiones ........................... 62 3.5. Herramientas hardware .............................. 63 3.5.1. Mediosdedesarrollo ........................... 63 3.5.2. Plataforma objetivo para la aplicación software ............ 63 3.5.3. Impresora3D ............................... 64 4. Arquitectura hardware e implementación de LoopMAN 66 4.1. Características y parámetros del diseño . . . . . . . . . . . . . . . . . . . . . 67 4.2. Comunicación entre módulos . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 4.3. Entrada y salida de audio (audioIO) . . . . . . . . . . . . . . . . . . . . . . 70 4.3.1. RelojesI2S ................................ 70 4.3.2. Paralelización de las muestras de entrada . . . . . . . . . . . . . . . . 72 4.3.3. Serialización de las muestras de salida . . . . . . . . . . . . . . . . . 72 4.4. Mezcladoresdeaudio............................... 73 4.4.1. El problema del desbordamiento . . . . . . . . . . . . . . . . . . . . . 73 4.4.2. Módulosdemezcla ............................ 74 4.4.3. Mezcladores de entrada (trackInputMixer) ............... 79 4.4.4. Mezcladores de salida (outputMixer) .................. 80 4.5. Pistas ....................................... 83 4.5.1. Controlador de las pistas (trackController)............... 83 4.5.2. Pista (track)................................ 84 4.5.3. Acceso a memoria (multiTrackRecorder) ................ 89 iii
5.2. Esquema de la arquitectura software. ......................136 5.3. Vista general del chasis. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 5.4. Clavija jack mono de 6,35 milímetros. . . . . . . . . . . . . . . . . . . . . . . 139 5.5. Frontal del chasis y barra protectora. . . . . . . . . . . . . . . . . . . . . . . 139 5.6. Parte posterior de la estructura. . . . . . . . . . . . . . . . . . . . . . . . . . 139 5.7. Frontal del chasis y barra protectora. . . . . . . . . . . . . . . . . . . . . . . 140 5.8. Conector Micro ribbon de36pines. .......................140 5.9. Plataformas inferior y superior de la estructura. . . . . . . . . . . . . . . . . 141 5.10. Extensiones para botones e interruptores. . . . . . . . . . . . . . . . . . . . . 141 5.11. Looper ensamblado.................................142 5.12. Vistas del Looper..................................143 6.1. El LoopMAN entodosuesplendor........................153 6.2. Utilización de recursos de la FPGA. . . . . . . . . . . . . . . . . . . . . . . . 155 6.3. Boss RC-300 Loop Station.............................157 6.4. Loopers degamamedia. .............................158 6.5. Controlador MIDI Livid DS1. ..........................163 x
Índice de tablas 6.1. Componentes hardware empleados en la construcción del sistema. . . . . . . 152 6.2. Especificaciones del LoopMAN. .........................154 6.3. Coste económico de los componentes del LoopMAN...............156 xi
Resumen Este proyecto consiste en el diseño e implementación íntegramente en hardware de un dispositivo digital destinado a la creación de música en directo, capaz de grabar fragmentos de sonido y reproducirlos en bucle. El sistema construido dispone de múltiples pistas para grabación, que son sincronizadas entre sí de forma automática. Además presenta varias entradas y salidas de audio de alta fidelidad (24 bits de resolución a 48 KHz), las cuales pueden ser conectadas según se desee. También es capaz de aplicar simultáneamente diversos efectos al sonido, encadenándolos en el orden que especifique el usuario; entre ellos delay, overdrive,fuzz, compresor, flanger, filtros o trémolo. Incluye salida de vídeo y puede ser controlado mediante un teclado o bien remotamente desde un tablet a través de un enlace Bluetooth. Su arquitectura es altamente paralela con vistas a proporcionar el máximo rendimiento posible, así como una buena escalabilidad. Palabras clave Diseño hardware, FPGA, VHDL, Procesado digital de audio, Sonido, Tiempo real, Looper, Música, Música electrónica, Lo-fi
Abstract This project involves design and implementation in hardware of a digital device aimed to create live music, able to record sound fragments and playing them in loop. The built system has multiple tracks for recording, automatically synchronized between them. It also has various high-fidelity audio inputs and outputs (24 bits resolution at 48 KHz), which can be connected as desired. Moreover, it is able to apply effects to the audio, with user configurable chain order; among others, includes delay, overdrive, fuzz, compressor, flanger, filters or tremolo. A video output is present too, and can be controlled with a keyboard or a remote tablet app using a Bluetooth connection. Its architecture is highly parallel, focused on providing the highest performance as well as a good scalability. Keywords Hardware design, FPGA, VHDL, Digital audio processing, Sound, Real-time, Looper, Music, Electronic music, Lo-fi
Capítulo 1 Introducción 1.1. Motivación Durante los últimos ciento cincuenta años, la música ha sufrido una serie de constantes cambios e innovaciones en todos sus aspectos. Empezando por las composiciones han surgido innumerables nuevos géneros, los cuales a su vez se han ido fusionando entre ellos. No cabe duda de que el abanico estilístico es infinito. Por otro lado, la constante aparición de nuevos instrumentos y técnicas ha permitido ampliar inmensamente los horizontes de las obras musicales. La incursión del mundo digital en nuestras vidas ha repercutido en todo lo que nos rodea, y la música no es una excepción. Los instrumentos convencionales, que podríamos considerar analógicos, quedan a la merced del intérprete; están sujetos a nuestras imperfecciones. Dichos defectos se consideran hermosos, hacen del sonido algo natural con la aleatoriedad que ello conlleva. No obstante, poder hacer música con ordenadores y generar ondas sonoras sintéticas ha facilitado que cualquier persona pueda desarrollar su creatividad, delegando en una máquina la destreza y conocimientos que exigen los instrumentos. Para sonar en la radio ya no es necesario siquiera un grupo de tres, cuatro o las personas que se requieran; armados con guitarras y bajos. Basta un ordenador, y quizá un micrófono. Aquí es donde entra en juego este proyecto. Una sola persona haciendo música en tiempo real, sin necesitar una formación previa, mientras combina los mundos analógico y digital. 2
En resumidas cuentas, la idea es poder explotar la técnica del live looping1, haciendo uso de un solo dispositivo que integre toda la funcionalidad necesaria para que una única persona suene como un grupo entero. No obstante, el título de este trabajo de fin de grado es Hardware Looper, no solo hay motivos para crear un looper, sino también para hacerlo en hardware. Implementar el sistema en una FPGA permite obtener un rendimiento mucho mayor del que se alcanzaría con software sobre microprocesadores o microcontroladores, a un coste económico menor. Por otro lado, dado que su hardware es dinámicamente reconfigurable, es posible actualizar el diseño en el futuro. Además el hardware es inherentemente paralelo, lo cual facilita mantener sistemas de grandes prestaciones sin que ello afecte negativamente a su rendimiento. Por tanto, crear un diseño hardware dedicado es una garantía de futuro, aunque en términos de trabajo y esfuerzo, requiere una mayor inversión inicial. 1.2. Objetivos El principal objetivo del proyecto es diseñar e implementar sobre una FPGA, un dispositivo al cual conectar la salida de audio de instrumentos analógicos o digitales, siendo este capaz de grabar fragmentos para reproducirlos en bucle posteriormente. Además, para mayor versatilidad, el sistema debe poder mezclar estas entradas (así como las salidas) permitiendo todo tipo de combinaciones. Por otro lado, el sonido ha de procesarse para aplicar diversos efectos a la salida. La fusión de los mundos analógico y digital no es trivial, y aun menos cuando se trata de fragmentos grabados, ya que un humano no puede determinar con precisión absoluta la duración de los mismos. Esto conduce a problemas de alineamiento y sincronización de las grabaciones, que deben solventarse implementando mecanismos específicos. Dado a la multitud de funciones y todas las opciones configurables, ha de elaborarse 1En el ámbito de la interpretación musical, la técnica conocida como live looping consiste en la grabación y posterior reproducción en bucle de fragmentos en tiempo real. Surge a mediados de los 90. 3
también un medio para controlar y visualizar el estado de la máquina. Este debe ser fácil de usar. Respecto al diseño, la arquitectura del sistema debe ser modular y paralela, además de presentar una buena escalabilidad. Los hechos que motivan una implementación en hardware puro se encuentran en la sección 2.2. 1.3. Antecedentes Ciertamente no es demasiado amplio el abanico de trabajos académicos similares a este looper, no obstante sí existen algunos dedicados a la implementación en hardware de procesadores de efectos en tiempo real. También existen artículos de investigación en la misma línea. [2–4] Dichos trabajos e investigaciones coinciden en sus conclusiones respecto a la alta velocidad de procesamiento que se logra gracias a emplear FPGAs, así como en la buena escalabilidad que ofrece este tipo de plataforma. Más allá del mundo académico existe una gran variedad de dispositivos comerciales con fines comunes a los de este proyecto (figura 1.1). Sin embargo, desde el punto de vista funcional no es nada habitual encontrar en ellos múltiples entradas y salidas de audio. Algunos sí son capaces de incorporar efectos al audio. Desde la perspectiva técnica, todos estos productos utilizan microcontroladores para ejecutar un software que define su comportamiento. De hecho, en términos de procesamiento de audio digital, solo existe una empresa que comercialice dispositivos con implementaciones en hardware dinámicamente reconfigurable: Antelope Audio, Inc. Se trata de procesadores de efectos, como el de la figura 1.2. Esta clase de producto está enfocado únicamente a entornos profesionales donde se requieren las prestaciones más altas posibles y los presupuestos son notablemente amplios. 4
(a) Ditto X4. (b) Boss RC-505. (c) Boss RC-300. Figura 1.1: Loopers multipista. Figura 1.2: Procesador de efectos digital con FPGA (modelo Discrete 8 Synergy Core). 1.4. Plan de trabajo El desarrollo de este proyecto ha abarcado desde septiembre de 2019 a junio de 2020. Para su organización se ha estimado conveniente establecer una serie de fases secuenciales, priorizando aquellas que más dependencias generaban. Por orden, pueden enumerarse las siguientes: 1. Planteamiento del proyecto. 5
En esta fase previa al desarrollo, se concretó la índole del sistema: un looper implementado en hardware sobre FPGA. A pesar de que el proyecto no comenzaría hasta meses más tarde, fue necesario para realizar la inscripción. 2. Análisis de la plataforma escogida y valoración de opciones de implementación. (Dos semanas). Una vez escogida la placa de prototipado a utilizar, se determinaron ciertas restricciones de diseño impuestas por sus componentes; tales como la anchura de las muestras de audio o profundidad de color del vídeo. Del mismo modo se comenzaron a concretar los detalles funcionales del sistema: grabación en múltiples pistas, efectos regulables, varias entradas y salidas de audio, etcétera. 3. Desarrollo de un controlador de memoria DDR2 adaptado a la placa de prototipado. (Seis semanas). En base a las conclusiones de la fase anterior, se consideró comenzar con una implementación puramente hardware del controlador de memoria. De este componente depende la grabación del sonido, algo imprescindible en un looper. Durante esta fase, partiendo de un controlador previo se elaboró uno nuevo ajustado a los requisitos del sistema, utilizando la frecuencia de reloj apropiada y la mayor anchura de palabra posible. Esto requirió además configurar debidamente un IP soft core que actúa como interfaz de memoria. Una vez fue posible escribir y leer todas las direcciones de la memoria, se plantearon varias arquitecturas para dar solución a los problemas de acceso concurrente, alineamiento de datos y tiempos de acceso. Cuando finalmente quedó diseñado el controlador, se procedió a su implementación en hardware. Tras el éxito en su verificación y corrección de errores, se descarta la opción de un co-diseño hardware-software (que facilitaría el acceso a memoria, implementando el controlador en software). 6
Capítulo 2 Visión general del sistema LoopMan 2.1. Funcionalidad El principal cometido de este sistema, al que me referiré a lo largo del texto como LoopMAN (figura 2.1), es la grabación de fragmentos de audio para reproducirlos en bucle, de ahí que su nombre derive de looper. Sin embargo, sus capacidades van mucho más allá de las disponibles en looper convencional como el mostrado en la figura 2.2a. Seguidamente las detallaré. 2.1.1. Entrada de audio Siguiendo el flujo del sonido por el interior de este sistema, la primera función disponible es la mezcla de las distintas entradas de audio. Al igual que sucede con las mesas de mezclas (figura 2.2b), el objetivo es combinar los múltiples canales de entrada en uno solo, tal que distintas fuentes de entrada tengan la misma salida. La diferencia es que en este sistema existen ocho mezcladores, para generar ocho salidas distintas, que resultan de combinar los canales de entrada tal y como se desee. Cada una de dichas salidas queda directamente conectada a una pista de grabación. De esta manera puede unificarse el audio procedente de múltiples instrumentos en una única señal. 13
Figura 2.1: LoopMAN. 2.1.2. Pistas: grabación y reproducción La grabación de sonido se realiza en las pistas. Las pistas son las entidades básicas del sistema, hay ocho. Estas indican al mezclador de entrada qué canales de entrada quieren recibir. Las pistas realizan la función de looper, es decir, realizan la grabación y reproducción de la mezcla que reciben. Al comenzar la grabación, el sonido se almacenará en la memoria. Por defecto, la primera grabación en una pista determina cuanto duran los fragmentos. También se puede extender o acortar la duración de un fragmento ya grabado, permitiendo añadir nuevas grabaciones a continuación o limitar la longitud de las existentes. En caso de grabar un nuevo fragmento sobre otro existente, ambos se mezclarán. Esta función es conocida como overdub y es ajustable, siendo posible indicar cuánta presencia de la grabación anterior se desea mantener en la nueva. Cuando una grabación es detenida, puede comenzar a reproducirse desde el principio 14
(a) Looper convencional. Una pulsación para grabar, otra para reproducir. (b) Mesa de mezclas. En la parte superior, se observan las múltiples entradas. Figura 2.2: Looper y mesa de mezclas accionando la opción “play”. Si dicha opción estaba activa al finalizar la grabación, la reproducción comienza automáticamente. Cabe mencionar que es posible comenzar a grabar automáticamente, mediante la función “autorec”. Al activarla, la pista monitorizará la amplitud del audio de entrada e iniciará la grabación cuando detecte que está sonando. Esto ayuda al músico a mantener la atención en el instrumento, evitando que se distraiga pensando en el momento de pulsar el botón, o aún peor, ocupando una de sus manos para realizar la pulsación. Las pistas, envían continuamente a su salida la entrada que reciben. Mientras se esté reproduciendo una grabación, se mezclará con la entrada, tal que el sonido grabado y la entrada actual puedan sonar simultáneamente. Además, cada pista tiene un control de volumen para regular su salida. La opción “mute” silencia por completo la salida de la pista. Existe además una opción “solo” para silenciar todas las demás pistas, de modo que cuando una o más pistas la activen, sean la únicas que puedan escucharse. La opción “clear” elimina todo el audio grabado en la pista. 15
Figura 2.3: Pistas no sincronizadas arriba, pistas sincronizadas abajo. Se observa como cada vez es más perceptible la falta de sincronía. 2.1.3. Pistas: sincronización La existencia de varias pistas en el sistema hace imprescindible un mecanismo de sincronización para garantizar que todas siguen el mismo tempo1. Cuando el intérprete graba varios fragmentos para su reproducción en bucle, es imposible que todos ellos duren lo mismo, o bien que exista una relación exacta entre los mismos (e.g. un cuarto, un octavo...). Este problema ocasiona que tras múltiples reproducciones de ambos bucles, las diferencias de duración comiencen a acumularse, dando lugar a que una suene antes que la otra. Este efecto está representado gráficamente en la figura 2.3. Este fenómeno queda solucionado en el sistema gracias al control centralizado del tempo. La velocidad es ajustada por el usuario, determinando este la cadencia que desee. Después, un reloj central genera pulsos con la periodicidad indicada y todas las pistas deben ajustarse 1En terminología musical, tempo hace referencia a la velocidad con la que debe ejecutarse una pieza. 16
a ellos. De este modo se facilita enormemente sincronizar el looper con otros instrumentos electrónicos, por ejemplo, secuenciadores o cajas de ritmos (ver figura 2.4). También permite establecer rigurosamente el tempo en las piezas interpretadas por humanos. Por ende, sin dicha medida se hace prácticamente imposible la fusión de los mundos analógico y digital. (a) Secuenciador. Reproduce una secuencia programable de sonidos. (b) Caja de ritmos. Es una batería electrónica capaz de funcionar automáticamente. Figura 2.4: Secuenciador y caja de ritmos Otro problema asociado a la sincronización es el instante en que comienzan las grabaciones y reproducciones. Si no hay ninguna pista sonando o grabando, en el preciso momento en que comience el proceso, el metrónomo central empezará a contar desde cero. Si por el contrario existieran otras pistas activas al iniciar la grabación o reproducción, el sistema detecta el error producido por el músico y ajusta automáticamente el nuevo fragmento al tempo del sistema. En caso contrario, cuando el loop grabado comenzara a reproducirse, estaría desfasado respecto al resto de pistas. Las funciones de sincronización pueden ser desactivadas si así lo decide el usuario. 17
Ajuste de tempo Relacionado con la sincronización, cabe mencionar el funcionamiento del metrónomo del sistema. Existen dos vías para establecer el tempo. Por un lado, mediante un ajuste manual tal que el usuario establezca un valor medido en bpm (pulsos por minuto). Por otro, a través de un pulsador se puede marcar la cadencia que se desee ver replicada automáticamente por el metrónomo. Es decir, que el usuario debe dar sucesivos toques en un botón, al ritmo del tempo que quiera. Con este método, las pulsaciones son monitorizadas para así calcular la frecuencia de las mismas. 2.1.4. Efectos Las pistas envían su salida a un procesador de efectos. Estos módulos son capaces de aplicar múltiples efectos al audio en tiempo real, en el orden que especifique el usuario. Es decir, que el sistema posibilita indicar qué efectos han de ser aplicados primero y cuales después. Para mayor versatilidad, la ordenación es independiente en cada una de las pistas. No es trivial el orden en que son aplicados los efectos al sonido, y cada músico tiene sus preferencias personales (figura 2.5). Los efectos son regulables, pueden ajustarse los parámetros que rigen su comportamiento. Cabe mencionar que cada efecto puede activarse o desactivarse incluso para el sonido ya grabado, ampliando las posibilidades del sistema. Al ser alterado en tiempo real, un mismo fragmento puede sonar de distintas formas. A continuación se describe brevemente el comportamiento de los efectos disponibles. Delay (eco) Este efecto imita el eco, repitiendo el sonido cada cierto tiempo, pero cada vez con mayor atenuación. La aplicación del delay produce las sensaciones de tener múltiples instrumentos tocando a la vez, de que las notas suenan varias veces, o de que el sonido se produce en un espacio con 18
Figura 2.5: El orden de los pedales sí altera el resultado. eco. Depende del tiempo que tarda en repetirse el sonido, que es configurable en el efecto. Este efecto es muy habitual en la música contemporánea (véase figura 2.6). Trémolo Este efecto simplemente aumenta y reduce cíclicamente la amplitud de onda del sonido. Dada su sencillez, es uno de los efectos más antiguos, ya existía en la década de 1950 (ver figura 2.7). No obstante, el trémolo, también conocido como vibrato, es una técnica que se ha aplicado desde tiempos remotos en instrumentos de cuerda frotada: violines, violonchelos, contrabajos... En el sistema es configurable la frecuencia a la que cambia la intensidad, es decir, a qué velocidad varía el volumen. Jamón El nombre de este efecto, “Jamón”, se debe a que el sonido que produce es parecido a los órganos Hammond con altavoces rotatorios (también conocidos como Leslie). Se puede 19
Figura 2.6: Pedal de delay. El pulsador lo activa o desactiva, con el potenciómetro se ajusta la duración. Figura 2.7: Pedal trémolo de 1950. 20
Figura 2.8: Altavoz rotatorio Leslie. En la parte superior hay dos bocinas (tweeters), en la inferior un subwoofer para los graves. Ambos giran. observar en la figura 2.8, la presencia de dos altavoces uno arriba y otro abajo. Ambos giran mientras suenan, tal que se produce el efecto Doppler2, alterándose cíclicamente el tono. También varía el volumen, de un modo similar al trémolo. En el efecto, la velocidad de rotación es ajustable en tiempo real, tal que cambia la duración del ciclo. Compresor El compresor permite reducir el rango dinámico, disminuyendo el volumen de los sonidos de mayor intensidad, para equipararlos a los que suenan más bajo. Una de las aplicaciones de este efecto es para prevenir la saturación de las muestras, tal que no se produzca distorsión cuando hay picos de intensidad. Sin embargo, es muy habitual aplicar compresión para hacer más constante el sonido y que el oyente mantenga en él su atención, así se logra mayor claridad, especialmente en las vocales (ya sea en locuciones radiofónicas o en canciones). Otro uso de la compresión es para aumentar la resonancia en instrumentos de percusión. 2El efecto Doppler consiste en el cambio de frecuencia aparente de una onda producido por el movimiento relativo de la fuente respecto a un punto de referencia. 21
Es posible configurar el umbral, el valor a partir del cual se aplica la compresión en la onda de salida. Overdrive Ampliamente utilizado en el Rock and Roll y todos sus sucedáneos más modernos, este efecto consiste en distorsionar intencionadamente el sonido (véase figura 2.9). Para ello se limita la forma de onda, reemplazando por un valor constante los fragmentos de la misma que superan un cierto umbral. Típicamente, el valor de reemplazo y el umbral, coinciden. El fenómeno que pretende imitar el efecto, es la saturación que se produce en los amplificadores cuando la ganancia es demasiado alta y las válvulas de vacío (o transistores), incapaces de generar la salida deseada, empiezan a distorsionar. La intensidad del efecto es configurable en tiempo real. Fuzz El fuzz puede recordar al overdrive en ciertos casos, pero su efecto es mucho más intenso. Por ello se suele utilizar en conjunto con “puertas de ruido”, para eliminar el zumbido constante que en ocasiones se produce. Aplica una limitación asimétrica a la forma de onda, distorsionando en gran medida el sonido y alargando considerablemente la duración de las notas. Además provoca la aparición de armónicos, especialmente de los pares. Al igual que en todos los efectos del sistema, se puede ajustar la intensidad del fuzz. Flanger Este efecto, se basa en mezclar la señal original con otra de retardo variable. Produce un sonido oscilante, similar al de la turbina de un avión. Es bastante utilizado en el rock clásico y especialmente en la música pop. 22
resultados óptimos. Además, la relación entre rendimiento y coste económico es mucho mejor de lo que se podría obtener con una implementación en software. La figura 2.13 muestra la placa de prototipado (Nexys 4 DDR) con FPGA integrada en el interior del LoopMAN. (a) Vista superior. (b) Vista inferior. Figura 2.13: Interior del LoopMAN. 2.3. Arquitectura (visión general) Este proyecto consiste, principalmente, en un diseño hardware de propósito específico. La arquitectura está estructurada por componentes que funcionan en paralelo y se comunican entre ellos. El diseño de la misma se ha elaborado con vistas a proporcionar una salida en el menor tiempo posible, sin renunciar a una buena escalabilidad. Dando una perspectiva general, el flujo del sonido a través del sistema recorre, por orden: los mezcladores de entrada, las pistas, los procesadores de efectos y por último los mezcladores de salida. Cada componente realiza las operaciones pertinentes sobre la muestra de audio que recibe, una vez ha finalizado notifica al siguiente la transferencia del resultado 29
y así sucesivamente hasta la salida. Por otro lado los mecanismos de sincronización, control y visualización del estado intercambian información con los otros componentes para regular su comportamiento y conocer su estado actual. En la figura 2.14 se proporciona un esquema general de la arquitectura. De los componentes mostrados en el esquema, el primero es audioIO. Este se encarga de recibir en paralelo las muestras a serializar, para enviarlas al códec de audio. Por otro lado, también recibe en serie el sonido entrante, para transmitírselo al siguiente módulo en el flujo del audio. En concreto al trackInputMixer, componente al que cada pista indica qué canales de entrada desea recibir, para que este realice la mezcla pertinente y se la envíe. El sonido mezclado pasa a trackController, el núcleo central del sistema. Alberga las ocho pistas y el controlador de memoria. Por ello, este módulo recibe la información del tempo (procedente de tempoGenerator) para las labores de sincronización; además comunica el estado actual de las pistas y recibe las señales de control pertinentes. El siguiente componente en la cadena es el controlador de efectos (fxController), que contiene los ocho procesadores de efectos, uno por pista. Finalmente, outputMixer recibe desde cada pista a qué canales de salida debe ser enviado su audio, y realiza la mezcla correspondiente para conducirla a audioIO. Los últimos tres módulos explicados: trackController,fxController youtputMixer; mantienen una información de estado y reciben señales de control. Esto permite la interacción con el usuario, la cuál se realiza mediante otros dos componentes: userDisplay yuserControl, descritos a continuación. UserDisplay recibe toda la información de estado del sistema, y la retransmite por dos protocolos: Bluetooth (para uso con una aplicación software específica) y VGA (para uso con un monitor externo). Por otro lado, userControl es capaz de recibir, mediante Bluetooth (desde la aplicación software) o bien, un teclado USB, los datos de control del sistema. La información es identi30
Figura 2.14: Módulo principal 31
ficada y dirigida a los módulos correspondientes, para que apliquen las acciones pertinentes. 32
Capítulo 3 Contexto tecnológico Este capítulo describe los algoritmos y técnicas empleadas para proporcionar soluciones a los diversos problemas que se han presentado durante el desarrollo del proyecto. También son abordados los detalles de los componentes utilizados en la construcción del sistema final; así como qué herramientas hardware ysoftware que han sido necesarias a lo largo del proyecto. 3.1. Algoritmos y fundamento teórico 3.1.1. Cuantificación del audio Es imprescindible obtener una representación digital de las ondas de sonido para poder operar con ellas, proceso que no es trivial si se consideran las dos dimensiones presentes: la amplitud y el tiempo. Por un lado, mediante un conversor analógico-digital es posible obtener un valor digital aproximado de la amplitud de onda para un cierto instante. El rigor con que dicho valor refleja la realidad es directamente proporcional al número de bits que emplea para representar la amplitud. En formato CD (Compact Disc) se utilizan 16 bits, sin embargo en los estándares de alta fidelidad el número asciende a 24. Para digitalizar la segunda dimensión, el tiempo, se recurre a un proceso conocido como muestreo. Consiste en la obtención periódica de muestras de sonido, tal que cada una queda 34
asociada a una porción de tiempo. Como cabría esperar, cuanto menor sea el periodo entre muestras tomadas, más precisos serán los datos. En el estándar CD se utiliza una frecuencia de muestreo de 44100 Hz. Aunque en alta fidelidad se llega a los 192000 Hz, esto excede con creces las bases teóricas del teorema de Nyquist-Shannon. Este último enuncia que para lograr la reconstrucción perfecta de una onda muestreada, la frecuencia más alta presente en la onda no debe ser superior a la mitad de la frecuencia de muestreo. Considerando que el oído humano es incapaz de percibir sonidos cuya frecuencia exceda los 20000 Hz, muestreando a más de 40000 Hz no se obtendría ninguna mejora apreciable en lo que respecta a la fidelidad del sonido. En este sistema la entrada/salida de audio funciona con resolución de 24 bits, muestreados a 48828,125 Hz. Sin embargo, internamente trabaja a 32 bits por las razones que explicaré más adelante. 3.1.2. Punto fijo Cuando se trata de operaciones aritméticas con valores no enteros, el procesamiento se complica en términos computacionales. En microprocesadores de propósito general (que disponen de unidades aritméticas avanzadas o coprocesadores numéricos), es frecuente recurrir al punto flotante para representar y operar con los valores. Sin embargo la complejidad técnica y el número de ciclos relativamente elevado que exigen estas operaciones, hacen de ello algo inviable para un sistema diseñado enteramente en hardware como este. Por ello la aproximación más conveniente, aunque menos precisa, son las representaciones en punto fijo. La principal diferencia respecto al punto flotante es la posición de la coma decimal, que en este caso tiene una posición fija (como el propio nombre indica). Por tanto, en este tipo de aritmética se destina un número prefijado de los bits menos significativos a representar el valor decimal, cuantos más bits sean, mayor será la precisión. En otras palabras, al utilizar más bits pueden representarse más valores entre 0 y 1 (es decir, decimales), y por tanto menor será la distancia entre ellos. Como consecuencia 35
también será menor la diferencia entre el valor real y el representado, es decir, el error. A pesar de la pérdida de precisión, el rendimiento que se obtiene al operar en puto fijo es mucho mayor, siendo posible realizar los cálculos en el mismo tiempo que si se tratase de valores enteros. Además la implementación es mucho menos costosa y consume menos recursos que el punto flotante. Otra ventaja es que es fácil operar con valores que tengan el punto decimal en distinta posición, aunque requiere realizar desplazamientos para alinear los operandos (en caso de la suma) o el resultado (en la multiplicación). En un sistema que opera con muestras de audio es imprescindible trabajar con valores decimales y este looper no es una excepción y por los motivos recién expuestos, se ha decidido utilizar punto fijo en la aritmética. En primer lugar, las muestras de audio están escaladas en el rango [-1, 1], por lo que se representan necesariamente con valores decimales. Además en el sonido son muy frecuentes las operaciones que implican decimales, por ejemplo, ajustar la amplitud para bajar el volumen de salida; la forma de implementar esto con precisión es multiplicando por un factor entre 0 y 1. Lo mismo ocurre para incrementar el volumen, salvo que el factor debería ser superior a 1. También en operaciones más complejas como algoritmos de filtrado, para calcular umbrales, desfases, etcétera es imposible obviar la parte decimal de los valores. Puesto que a lo largo de la memoria se harán referencias al punto fijo, cabe mencionar que habitualmente se utiliza la nomenclatura “QN.M” para indicar el número de bits que representan la parte entera (N) y decimal (M); por ejemplo, Q10.5 significa que 10 bits son para la parte entera y 5 para la decimal. Suma y resta en punto fijo Con valores en punto fijo, las operaciones de suma y resta se implementan igual que en la aritmética entera en C2. Sin embargo existe una restricción: los operandos deben utilizar el mismo número de bits para representar la parte decimal. Si dicha restricción no se satisface, es necesario reescalar los valores para alinear las comas. Esto se realiza mediante desplazamientos, aunque puede provocar que los operandos 36
resulten desbordados. Otro inconveniente que surge al desplazar es la pérdida de resolución por la reducción del número de bits empleados para representar la parte decimal; existen dos formas de tratarlo: truncar (descartar bits menos significativos) o redondear (aproximar al valor más cercano). Multiplicación y división en punto fijo Para este tipo de operación no es necesario que estén alineadas las comas decimales, es posible utilizar directamente aritmética entera. No obstante, hace falta ajustar la escala del resultado, puesto que el número de bits que emplea este para representar la parte decimal, equivale a la suma del número de bits decimales de ambos operandos. Por ejemplo, al multiplicar dos valores uno en Q6.2 y otro en Q7.3, el resultado vendrá expresado en Q13.5. Al reescalar puede producirse desbordamiento o pérdida de resolución, que se administran con las mismas técnicas que las descritas para la suma. 3.1.3. Audio digital: Desbordamiento Mezclar dos señales en formato digital se reduce a una simple operación de suma de sus muestras. Esto puede suponer un problema si el resultado de la operación es tan grande que no es posible representarlo con el número de bits utilizado. Este fenómeno se conoce como desbordamiento y hay distintas formas de mitigarlo, por ejemplo devolver el máximo valor representable (como se detalla en la sección contigua). El inconveniente es que el sonido resulta distorsionado; sin embargo puede ser también una ventaja, puesto que muchos efectos se basan en saturar intencionadamente las muestras. La solución tomada en el sistema para impedir el desbordamiento descontrolado se ha basado en extender el número de bits de los operadores. En la salida del sistema se reajusta a la anchura exigida por el conversor digital-analógico. Cabe mencionar que la mayor parte de mezcladores no suman las entradas de audio sin multiplicarlas primero por un factor de reducción. El objetivo que persiguen es que el volumen sonoro del resultado no exceda el de las muestras originales, lo cual difiere 37
Figura 3.1: En azul la señal original, en rojo sometida a hard clipping. completamente con el propósito de este looper, pues cuando dos instrumentos musicales suenan simultáneamente su volumen no se ve reducido. 3.1.4. Audio digital: Limitación La limitación, también conocida como clipping consiste en impedir que una onda exceda un umbral. Se utiliza para impedir que el desbordamiento derive en artefactos en el sonido, así como para provocar intencionadamente efectos de sonido. [1,5] Hard clipping Existen distintas variantes, la más simple (hard clipping) se basa en mantener el valor original cuando este no supere el umbral, y en caso contrario reemplazarlo por dicho límite. Expresado matemáticamente: hardClipping(x) = t, x ≤ −t x, −t≤x≤t t, x ≥t Donde tes el valor umbral y xla muestra. La figura 3.1 ilustra el efecto que el hard clipping produce en una onda. Además de en los mezcladores, se utiliza en el efecto fuzz. 38
Figura 3.9: Diagrama de bloques del efecto Doppler. Donde ces la velocidad de propagación en el medio, vola velocidad del observador y vf la velocidad de la fuente. Este fenómeno se conoce como efecto Doppler, y puede recrearse digitalmente alterando la velocidad de reproducción de las muestras grabadas. Un diagrama de bloques del mismo se encuentra en la figura 3.9. [5] Flanger El flanger es un efecto de sonido basado en aplicar un delay y mezclarlo con la señal original, mientras varía el tiempo de retardo. Como se observa en la figura 3.10, se rige bajo un diagrama de bloques similar al presentado anteriormente para el eco, con la particularidad de que el tamaño del buffer está regulado por un oscilador de baja frecuencia (entre 0,1 y 1 Hz). Además no debe inducir más de 2 milisegundos de retardo. [1] 3.1.8. Efectos de sonido basados en frecuencia Filtros FIR Los filtros FIR (Finite Impulse Response) se caracterizan porque no tienen realimentación, al contrario que los filtros IIR (Infinite Impulse Response). Esto significa que la salida no retorna a la entrada del filtro. Su propia naturaleza hace que sean estables, por ello son 45
Figura 3.10: Diagrama de bloques del flanger. Figura 3.11: Fuente: DAFX: Digital Audio Effects. [1] comúnmente empleados en el ámbito del audio digital. [6,7] Su estructura atiende al diagrama de bloques de la figura 3.11 (xes la entrada, yla salida). Se observa que las muestras atraviesan secuencialmente cada etapa, tal que cada una de ellas es multiplicada por un coeficiente (o peso). La suma de todos es el valor final. El valor de una muestra filtrada puede representarse con la siguiente función: salida = N X i=0 bi∗x[n−i] Siendo N el número de etapas del filtro, x[n] la señal de entrada y b los coeficientes. 46
Emplear un número de etapas elevado en en filtro permite reducir el error del mismo, haciendo más preciso el corte de las frecuencias. Sin embargo, este tipo de filtro induce un retardo, que también depende directamente del número de etapas. Está definido por la siguiente fórmula. d=N−1 2 Un detalle importante es también la paridad del número de etapas; en caso contrario debe tenerse en cuenta que la respuesta en frecuencia es cero para ciertos puntos, algo inapropiado para filtros paso alta o paso baja. Tampoco es trivial la selección de los coeficientes, a grandes rasgos se distingue entre simétricos y asimétricos. Estos últimos añaden un desfase de noventa grados a la señal, lo cual implica ciertas restricciones. Por los motivos expuestos en los párrafos anteriores en este proyecto se ha optado por utilizar un número impar de etapas y coeficientes simétricos. Además se han utilizado constantes precalculadas, ya que las frecuencias de muestreo y corte son fijas; de este modo, el coste computacional es únicamente el de la convolución. Ventana de Hamming Las ventanas son funciones matemáticas simétricas entorno al punto medio de un cierto intervalo, fuera del cual su valor corta con cero. En este caso particular se ha utilizado la ventana de Hamming como función para obtener los coeficientes del filtro. La decisión de emplear esta se debe a la respuesta suave que proporciona en el filtro, en comparación con otras funciones que generan “rebotes” en la señal al aproximarse a la frecuencia de corte. Otra ventaja es su carácter simétrico, que permite ahorrar memoria a la hora de almacenar las constantes. La ventana de Hamming se define: 47
w(n) = w(−n) = 0,54 −0,46 ∗cos π∗(M−n) M Siendo M: M=N−1 2 Para obtener los coeficientes del filtro FIR se deben multiplicar los valores de obtenidos mediante la ventana de Hamming por unas constantes calculadas para las características del filtro. Para el paso baja se utiliza la siguiente fórmula: hb(n) = −sin((2pi ∗wL/Fs)∗(M+ 1 −n)) (M+ 1 −n)∗π Para el paso alta: ha(n) = sin((2pi ∗wH/Fs)∗(M+ 1 −n)) (M+ 1 −n)∗π Siendo Fs la frecuencia de muestreo, y wLywHlas frecuencias de corte del paso baja y paso alta respectivamente. Finalmente los coeficientes a utilizar en el filtro FIR se obtienen: coefbaja(n) = w(n)∗hb(n) coefalta(n) = w(n)∗ha(n) 48
Figura 3.12: Espectro de frecuencias de un fragmento de audio que barre desde 0 hasta 5000 Hz. A la izquierda la original, a la derecha la sometida a un filtro paso baja con aritmética en punto fijo (frecuencia de corte: 440 Hz). Un detalle sobre estos coeficientes es que son números reales, y será necesario trabajar con ellos en punto fijo. Esto conlleva una pérdida de fidelidad en el sonido, puesto que la precisión es limitada y se produce un cierto error de cuantificación; sin embargo, con 15 bits para la parte decimal y 17 para la entera (Q17.15) se han obtenido resultados más que aceptables. Se observa en la figura 3.12 el espectro de frecuencias de una señal de audio que crece desde 0 a 5000 Hz, pasada por un filtro paso baja cuya frecuencia de corte se ha fijado en 440 Hz. Dicho filtro ha sido implementado en Matlab. El error se debe por un lado al algoritmo, aunque también a la cuantización que implica utilizar aritmética en punto fijo. Para el segundo caso puede observarse en la figura 3.13 como el error de cuantización desaparece al utilizar aritmética en punto flotante. En cualquier caso, es imperceptible para el oído humano. 3.2. Placa de prototipado (Nexys 4 DDR) La herramienta principal y fundamental para la realización de este proyecto ha sido una placa de prototipado con FPGA integrada; el modelo en cuestión es la Nexys 4 DDR (véase 49
Figura 3.13: Espectro de frecuencias de un fragmento de audio que barre desde 0 hasta 5000 Hz. A la izquierda la original, a la derecha la sometida a un filtro paso baja con aritmética en punto flotante (frecuencia de corte: 440 Hz). figura 3.14). 3.2.1. FPGA Las FPGAs son dispositivos programables, capaces de reconfigurar su interconexionado interno para recrear circuitos de electrónica digital. Permiten implementar arquitecturas hardware fácilmente; así como probar infinidad de prototipos, puesto que el proceso de configuración es reversible. El modelo utilizado ha sido una Xilinx Artix-7 (XC7A100T-1CSG324C), que cuenta con 15850 slices: celdas con ocho flip-flops (que son memorias estáticas de acceso aleatorio, con un bit de anchura) y cuatro LUTs. Estos últimos constituyen tablas de verdad y permiten implementar cualquier función lógica de seis entradas. Además proporciona 240 DSP, módulos para procesamiento digital de señal que contienen dos sumadores, un multiplicador de 25 por 18 bits y un acumulador de 48 bits. Estos resultan imprescindibles para acelerar los cálculos aritméticos. Otra característica remarcable de la FPGA son los 4860 KiB de block RAM, un tipo de memoria integrada cuyo tiempo de acceso es de un ciclo de reloj. En este caso se divide en 50
Figura 3.14: Fuente: reference.digilentinc.com. bloques de 36 KiB. También es posible utilizar hasta un 25 % de los LUTS como memoria. [8] 3.2.2. Memoria DDR2 DRAM En la Nexys 4 DDR hay también una SDRAM off-chip. Este tipo de memoria es “dinámica de acceso aleatorio” por la necesidad de refrescar periódicamente la información de sus celdas; ya que almacenan la información con condensadores, los cuales se descargan relativamente rápido e incorpora un interfaz síncrono. A pesar de ser más lenta que la block RAM, es más barata. Por ello también es posible disponer de mayor capacidad en estas memorias, la que hay instalada en la placa presenta 128 MiB de capacidad. Se trata de un módulo ISSI IS43/46DR16640C. La interfaz que utiliza es DDR2, que es un estándar surgido a principios de la década de los 2000. Implementa la tecnología dual rate, por lo que es capaz de proporcionar datos en ambos flancos (subida y bajada) del reloj; asimismo puede operar internamente al doble 51
de la frecuencia que el bus de datos, para reducir la latencia o incrementar el ancho de banda. Aunque admite diversas configuraciones, funciona con tiempos de ciclo de hasta 2,5 nanosegundos. Respecto a su estructura, tiene ocho bancos con 16 millones de palabras cada uno. [9] Sensor de temperatura y conversor analógico digital El sensor de temperatura integrado en la FPGA es necesario para el correcto funcionamiento de la memoria DDR, en concreto para alinear determinadas señales (DQ y DQS). Dicho sensor está conectado a un conversor analógico digital (XADC) que hace posible tomar muestras periódicamente del valor de la temperatura actual. También se encuentra incorporado en la FPGA. Ambos forman deben formar parte del controlador de memoria a desarrollar, tal que sea este el que administra las correcciones necesarias para alinear satisfactoriamente las señales DQ y DQS. 3.2.3. VGA VGA es un estándar utilizado en controladores gráficos para transmitir los datos de vídeo a un monitor (figura 3.15). El VGA utilizado en el proyecto dispone de 12 bits de profundidad de color, cuatro por cada componente (rojo, verde y azul). La resolución es de 640 píxeles de ancho por 480 de alto, la frecuencia de refresco son 60 Hz. Los monitores son esencialmente matrices de puntos, por ello para la transmisión de cada frame se emplea un protocolo serie, tal que se envía secuencialmente para cada píxel el color asociado. Es decir, se realiza un “barrido” de todas las filas y columnas. Sin embargo VGA es asíncrono, no se transmite el reloj, ambos extremos deben comunicarse a 25 MHz. Para sincronizar las tramas de bits entre emisor y receptor utiliza dos señales: hsync yvsync. La primera indica que todos los píxeles de una fila han sido enviados y la segunda que todas las filas de la matriz han sido enviadas. 52
Figura 3.15: Conector VGA. Al iniciarse la transmisión de un frame,hsync yvsync realizan una transición de baja a alta, y transcurridos ocho ciclos se transmiten secuencialmente los 640 píxeles a la velocidad pautada por el reloj de 25 MHz. Otros ocho ciclos después de completarse la transmisión, hsync vuelve a baja durante 96 ciclos. Este proceso se repite para las 480 líneas de la pantalla. Finalmente, cuando todos los píxeles hayan sido enviados el emisor vsync pasa de alta a baja, manteniéndose en este estado otro cierto tiempo. El proceso se repite continuamente. Como se observa, hay una serie de ciclos de espera (en los que no se envía información) después de enviar cada línea. De este modo para los 640 píxeles de cada línea se emplean 800 ciclos (resultando una frecuencia de 31,250 KHz para el envío de las líneas). Y para las 480 líneas visibles, se añaden otras 45 sin transmitir píxeles (que finalmente hace que los fotogramas se redibujen a 59,52 Hz). Estos tiempos de espera se deben a los monitores de rayos catódicos, que mediante un haz de electrones plasmaban el color en una superficie de fósforo situada tras el cristal. La cuestión es que la emisión de electrones debía detenerse mientras el haz volvía a la posición de origen (para pintar la nueva línea), de lo contrario se plasmaría en la pantalla un “hilo” dibujado por el paso de los electrones [10]. Para visualizar las imágenes se ha utilizado un monitor externo de 19,5 pulgadas (Acer 53
V206HQL). 3.2.4. PS/2 a través de USB La placa también incluye un controlador compatible con USB HID (parte del estándar USB que engloba los dispositivos de interfaz humana). De este modo, a través del puerto USB que hay en la Nexyx 4 DDR es posible conectar teclados y ratones [11]. La comunicación se realiza mediante el protocolo PS/2. Este es serie y síncrono, por tanto utiliza una línea para datos y otra para el reloj. Las tramas contienen ocho bits de datos y tres de control: start,stop y paridad. Cuando en el teclado tienen lugar eventos relacionados con alguna tecla, se envían una o varias tramas al receptor, con un código para identificar a la misma (3.16). Para las pulsaciones se distingue entre teclas corrientes y especiales, en caso de estas últimas se envían dos tramas (primero una con el código “E0” en hexadecimal, y después otra asociada a la tecla en cuestión). Esto es necesario porque ocho bits no son suficientes para codificar todas las teclas, teniendo en cuenta las extensiones que se han realizado posteriormente en el estándar (funciones multimedia, controles adicionales...). Para comunicar cuando una tecla ha sido despulsada, se envía una trama con el código “F0” y a continuación el mensaje enviado en la pulsación. En el caso de las teclas especiales son tres tramas “E0”, “F0” y la correspondiente a dicha tecla. [12] 3.2.5. Memoria flash Para almacenar el fichero de configuración con el diseño a cargar en la FPGA, es posible utilizar la memoria flash no volátil que hay en la placa. De este modo es posible operar con la placa sin necesidad de un ordenador para programar la FPGA. Para habilitar esta función en la placa es necesario almacenar el diseño en la memoria (se realiza mediante el mismo software utilizado para programar la FPGA) y configurar un jumper para cargar la configuración en el arranque. El modelo en cuestión es una Spansion S25FL128S. Es de tipo NOR, cuenta con 16 54
y grabar el diseño en la memoria flash de la placa. Como cabría esperar, esta herramienta también ha sido empleada en la obtención de estadísticas de utilización de recursos, análisis de tiempos o consumos del diseño hardware. 3.4.2. Simulación de efectos de audio Para las pruebas y simulaciones previas a la implementación de los efectos de sonido en el sistema, se ha utilizado Matlab R2019b, así como su componente interno Simulink. También han sido de utilidad para la generación de gráficos que representan el comportamiento de la forma de onda resultante de aplicar efectos al sonido. Puntualmente para realizar ciertas pruebas con efectos basados en retardos, se han elaborado scripts en lenguaje Python. 3.4.3. Programación software (iOS) La aplicación software destinada al control remoto del looper se ha desarrollado enteramente en lenguaje Swift (versión 5.1), un lenguaje compilado de propósito general. La generación de binarios se ha realizado con el compilador LLMV. Para ello, además de las tareas de depuración se ha utilizado el entorno Xcode 11.4. 3.4.4. Dibujo asistido por ordenador El diseño de una caja para el producto final ha implicado utilizar herramientas de dibujo asistido por ordenador (o CAD, por sus siglas en inglés) 3D. Fundamentalmente se ha utilizado Autodesk Inventor 2018, este software basa su funcionamiento en operaciones paramétricas, de modo que resulta sencillo modificar las piezas incluso en estados avanzados del diseño, a costa de complicar sensiblemente el proceso de modelado. Para las partes en con formas complejas (es decir, los logotipos e inscripciones) ha sido necesario realizar operaciones con sólidos tridimensionales en la aplicación Autodesk Autocad 61
2018. Esta es más flexible que la anterior para dicha labor, no obstante alterar ciertos aspectos de las piezas una vez diseñadas es mucho más tedioso. Para la fabricación automática de las piezas se precisa generar ficheros G-code de control numérico. En ellos se detallan las instrucciones a ejecutar por cada componente de la impresora 3D (como los motores, los dispositivos de fusión del material o el calentador de la plataforma). Este proceso se ha realizado mediante el software Cura 14. Finalmente, Repetier Host ha sido el programa empleado para la interpretación de las instrucciones y control de la impresora. 3.4.5. Gráficos vectoriales El diseño de los gráficos presentes en esta memoria para los diagramas arquitectónicos, además de logotipos u otras figuras utilizadas en el proyecto se ha llevado a cabo con la aplicación de dibujo vectorial Corel Draw 2019. Para el retoque fotográfico de algunas de las imágenes de dispositivos de audio mostradas también se ha recurrido al software GIMP. 3.4.6. Generación de documentación Para la redacción de esta memoria se han utilizado los editores de texto Vim yAtom. La generación de los documentos finales debidamente formateados se ha realizado con el sistema LaTeX (en conjunto con BibTeX para las referencias), a través de la aplicación TeXShop. 3.4.7. Control de versiones El tanto el código VHDL del proyecto, como la aplicación software (en Swift), los diseños gráficos y los planos de piezas en 3D se han sometido por motivos de seguridad a control de versiones con la herramienta Git. Los repositorios han sido alojados en el servicio en línea GitLab. 62
La coordinación entre los tutores y el alumno para la corrección de la memoria se ha llevado a cabo mediante la plataforma en línea Overleaf, que permite la edición colaborativa de documentos de texto en formato LaTeX. 3.5. Herramientas hardware 3.5.1. Medios de desarrollo Para la ejecución del software listado en la sección previa, se han utilizado dos computadores domésticos, uno de sobremesa y otro portátil. De este modo ha sido posible realizar en paralelo ciertas tareas; especialmente aquellas cuyo tiempo necesario para completarse es grande, mientras que su elevado uso de recursos en la máquina imposibilitaba trabajar con otro programa. Esta situación se ha dado principalmente al sintetizar con Vivado, sobre todo en las etapas más avanzadas del proyecto. Ambos equipos están equipados con microprocesador Intel Core i7 (el sobremesa tiene arquitectura Sandy Bridge, mientras que el portátil es Skylake) y 16 GiB de memoria principal. 3.5.2. Plataforma objetivo para la aplicación software El dispositivo dónde se ejecuta la aplicación software es un tablet, modelo Apple iPad Pro de 12,9 pulgadas. Dispone de una pantalla táctil razonablemente grande que permite incorporar mayor número de elementos en la interfaz gráfica, lo cual contribuye a facilitar el control del looper, que es su cometido. Como es evidente, dada la importancia del requisito, es compatible con el estándar Bluetooth 4.1. Aunque el módulo de comunicación conectado a la FPGA (anteriormente descrito) está diseñado para cumplir con la versión 4.2 de la especificación, no supone ningún problema, pues es compatible con versiones anteriores. 63
3.5.3. Impresora 3D La fabricación del chasis diseñado para integrar todos los componentes del looper se ha realizado mediante una impresora 3D de modelado por deposición fundida. El material empleado ha sido plástico ABS, posible gracias al sistema de cama caliente que implementa la máquina. La elección del material está motivada por su compromiso entre calidad del acabado y buena resistencia a los esfuerzos de corte y tracción (los más sensibles al fabricar con esta tecnología). Sin embargo, el ABS requiere mayor delicadeza en la impresión, y por tanto más tiempo puesto que el cabezal debe moverse más despacio. Además, la necesidad de mayor temperatura puede acarrear problemas de deformación debido a las contracciones que tiende a sufrir este tipo de plástico. 64
Capítulo 4 Arquitectura hardware e implementación de LoopMAN En la sección 2.3 se ha proporcionado una visión general de la arquitectura de este sistema, acorde a la figura 2.14, la cual describe brevemente los principales módulos del sistema y la forma en que se comunican. Cabe remarcar que todo el diseño se ha elaborado teniendo muy presente la escalabilidad y la paralelización de los componentes, por ello en el resultado se aprecia cómo la arquitectura presenta ambas virtudes. Más allá del sistema final, esta creación constituye una plataforma adaptable y escalable, capaz de crecer considerablemente, integrando nuevas funcionalidades o perfeccionando las existentes; todo sobre el esqueleto original y puramente en hardware, con la innumerable lista de ventajas que ello conlleva. Por ejemplo, suponiendo que se amplía la memoria, extender el número de pistas a 16, 32 o 64 sería trivial. Lo mismo sucede con los efectos o el número de entradas y salidas. Incluso podrían implementarse nuevos componentes en el flujo del sonido, tales como un ecualizador multibanda después del controlador de efectos o una interfaz MIDI en el módulo de control. La única complejidad de extender el sistema reside en implementar los nuevos componentes, la integración en lo ya existente es inmediata. Yendo más allá incluso podría construirse un sistema de audio distinto al looper, utilizando la misma base. En el repositorio https://gitlab.com/loopman-ndc/loopman-hw puede encontrarse la 66
descripción VHDL completa del LoopMAN. 4.1. Características y parámetros del diseño Hay ciertos aspectos del diseño que son paramétricos, es decir, que alterando algunos valores de la descripción en VHDL es posible ampliar (o reducir) horizontalmente el sistema. Todos ellos se listan en la siguiente tabla. Aspectos cuantitativos del diseño Característica Paramétrico Valor utilizado Número de pistas No 8 Memoria asignada por pista No 16 MiB Número de entradas Sí 4 Número de salidas Sí 2 Número de efectos Sí 9 Tamaño del buffer de Delay (efecto) Sí 32 KiB Tamaño del buffer de Jamón (efecto) Sí 16 KiB Tamaño del buffer de Flanger (efecto) Sí 512 bytes Instanciación individual de filtros (efectos) Sí Activado Por otro lado también hay características relativas al funcionamiento del sistema que pueden ajustarse en tiempo real. A continuación se muestra otra tabla que incluye las mismas. De estas se indica si son ajustables por el usuario o es el sistema el que regula su valor automáticamente. Parámetros de funcionamiento Módulo Párametro Ajuste tiempo real Rango de valores Pistas Volumen Sí 0-15 (resolución: 1) Margen de sincronía No 0,167 s Umbral autorec No 6,7 % Overdub Sí 0-15 (resolución: 1) Compases del loop Sí 1-32 (resolución: 1) Master Volumen Sí 0-15 (resolución: 1) Umbral compresión Sí 0-1,0 (resolución: 2-4) Ganancia compresión Automático 0-1,0 (resolución: 2-4) Muestras sobre umbral No 20 % Tamaño de ventana No 5,24 ms Delay Retardo Sí 0-0,168 s (resolución: 0,011 s) Ganancia realimentación No 0,5 67
Overdrive Umbral Sí 0-1,0 (resolución: 2-4) Ganancia Automático 0-7 (resolución: 1) Jamón Periodo oscilación Sí 0-0,168 s (resolución: 0,011 s) Ganancia efecto No 0,5 Ganancia original No 0,5 Fuzz Umbral No Máx. 25 bits Ganancia previo Sí 0-3 (resolución: 1) Ganancia atenuador Automático 0,6-1 (resolución: 2-4) Compresor Umbral Sí 0-1,0 (resolución: 2-4) Ganancia de compresión Automático 0-1,0 (resolución: 2-4) Muestras sobre umbral No 10 % Tamaño de ventana No 2,62 ms Trémolo Periodo oscilación Sí 0,08-1,34 s (resolución: 0,08 s) Ganancia Automático 0,2-1 (resolución: 2-4) Flanger Periodo oscilación Sí 0-2,62 ms (resolución: 0,17 ms) Ganancia Automático 0,2-1 (resolución: 2-4) Filtro PB Frecuencia de corte Sí 15K, 3,5K, 1K, 400, 220 Hz Filtro PA Frecuencia de corte Sí 25, 40, 80, 140, 190 Hz 4.2. Comunicación entre módulos En lo que respecta al intercambio de información entre módulos, puede realizarse una distinción en tres tipos de datos: audio, señales de control y señales de estado. El audio pasa de un módulo a otro, tal y como se menciona en el apartado 2.3:Arquitectura (visión general). Para ello, una vez procesadas las muestras, los módulos la almacenan en un registro a su salida y notifican el fin de procesamiento mediante un pulso. En el diseño las señales destinadas a tal fin, están nombradas con el sufijo “_rdy”, no obstante han sido omitidas de los diagramas para facilitar su legibilidad. Como se detallará más adelante, en total se dispone de 1536 ciclos de reloj para procesar cada muestra, desde que entra hasta que sale del sistema. No obstante, no es necesario tanto tiempo para realizar todas las operaciones, incluso en el peor caso. La mayor parte de los componentes emplea un número fijo de ciclos para procesar: 68
48 para audioIO (24 en la entrada y 24 en la salida). 6 para trackInputMixer. 9 para trackController. 2 (siempre) más 2 por cada efecto aplicado en la gestión de fxController. 3 si fxUnitDelay está activo. 4 si fxUnitOverdrive está activo. 3 si fxUnitJamon está activo. 4 si fxUnitFuzz está activo. 3 si fxUnitCompresor está activo. 3 si fxUnitFlanger está activo. 514 si fxUnitLPF está activo. 514 si fxUnitHPF está activo. 6 para outputMixer. Las señales de control transmiten pulsos, su función es informar de eventos que tienen lugar en el sistema. En su mayoría las genera el módulo userControl (detallado más adelante en la sección 4.8.1), aunque también aparecen en el contexto de la sincronización; es el caso de tempo otempo_sync. Por último las señales de estado sirven para manifestar la situación de los componentes, se asemejan a etiquetas o flags. En muchos casos (especialmente en los que contienen información que debe transmitirse al usuario) requieren de una señal adicional para indicar cambios de estado mediante pulsos, de ello depende el funcionamiento del módulo userDisplay (más concretamente su componente btTransmitter). 69
Para explicar mediante un ejemplo el funcionamiento de estos dos últimos tipos, supóngase el volumen de una pista. Este debe ser ajustado mediante señales de control, pulsos que indican cuándo incrementa, decrementa o debe cargar una cuantía determinada. El valor de este parámetro, es decir, la salida del registro que lo almacena, constituye una señal de estado. La arquitectura del módulo Bluetooth (detallada en la sección 4.9.2) obliga a indicar cuándo un estado ha cambiado, por ello al hacerse efectiva la alteración en el valor del volumen, se genera un pulso alertando de ello. Sin embargo no siempre es necesario, puesto que muchas señales de estado solo funcionan a nivel interno y no se retransmiten al usuario. 4.3. Entrada y salida de audio (audioIO) Este módulo al ser el primero del flujo de audio, es el que realiza la comunicación con el códec I2S. Los datos se intercambian con él en serie, utilizando una línea por cada dos canales (ya que el protocolo es estéreo). Como se observa en la figura 4.1,audioIO se estructura en tres componentes: inSampleShifter,outSampleShifter ymclkGenCounter. 4.3.1. Relojes I2S De acuerdo al protocolo I2S, son necesarios tres relojes para sincronizar la entrada/salida en serie: MCLK, SCLK y LRCLK, ordenados de mayor a menor frecuencia. Entre ellos debe haber una relación entera, en este caso se ha utilizado (siendo fm la frecuencia de muestreo): MCLK = 256 ∗fm SCLK = 64 ∗fm LRCK =fm Dicha relación se ha establecido considerando que la frecuencia base del reloj es 75 MHz, y a partir de la misma resulta simple generar otro derivado de 25 MHz empleando un contador. Una vez cada tres ciclos este incrementa su valor, por tanto, al tomar los bits 70
complejas en términos de hardware. Su funcionamiento lo coordina una FSM, que al recibir las entradas dedica un estado a multiplicarlas por los factores de reducción. Al ciclo siguiente pasa a otro estado destinado a la mezcla. Finalmente registra el resultado y activa una etiqueta para indicar que el proceso ha finalizado. Este módulo sirve especialmente para controlar ciertos efectos, que requieren mezclar gradualmente una muestra alterada con otra sin modificar. CompressorMixer Este mezclador es una variante de audioMixer que incluye un amplificador de volumen y un compresor. Su finalidad es servir en el outputMixer, tal que las muestras con un volumen demasiado bajo para la salida puedan realzarse, pero sin llegar a saturar, gracias a la acción del compresor. La figura 4.3 muestra una vista simplificada de su ruta de datos. De cara a la mezcla, el funcionamiento es idéntico al de audioMixer, con diseño multiciclo. No obstante, también realiza la operación de amplificado a las muestras mezcladas, cuyo resultado es posteriormente analizado por el algoritmo de compresión. Así se logra determinar el grado de actuación del compresor. El compresor comprueba en cada muestra resultante si su valor supera un umbral (establecido por un parámetro de entrada ajustable en tiempo real). Si por cada 256 muestras, más de 50 superan el umbral, aumentará una unidad el factor de compresión (se suma uno a su valor). Si ninguna muestra de las 256 supera el umbral, el factor de compresión se reduce también una unidad (se resta uno a su valor). Cada ventana de 256 muestras representa 5,24 milisegundos de tiempo (puesto que la frecuencia de muestreo son 48828,125 Hz). Esto garantiza que los incrementos o decrementos en el factor de compresión se realizarán como máximo cada dicho periodo. Por tanto, en el caso más brusco el factor de compresión tardará 83,38 milisegundos en alcanzar su valor máximo. 77
Figura 4.3: Ruta de datos de compressorMixer. 78
Por otro lado 50 muestras de 256 son un 20 % del total. Considerando que las ondas de sonido oscilan y no son regulares, es apropiado establecer este tipo de relación. El efecto de esto es que se ralentizan los incrementos en el factor de compresión, al ser necesario que dicho porcentaje de muestras exceda el umbral. Teniendo en cuenta los dos párrafos anteriores, el objetivo es obtener una respuesta suave con un ataque moderado, aunque algo más pronunciado cuando el nivel de la señal es elevado. El amplificado consiste en multiplicar la mezcla por un valor (ganancia), calculado a partir del volumen indicado por el usuario a la entrada del módulo y el factor de compresión determinado por el sistema. De esta manera se unifican las operaciones, tal que solo sea necesaria una multiplicación. ganancia =volumenUsuario −factorCompresion + 1 Finalmente, se aplica un limitador combinacional, al igual que en audioMixer. Es necesario, a pesar de que el compresor pueda prevenir el desbordamiento, ya que ante picos bruscos en la señal, la acción del compresor no tendría ningún efecto (ni debe tenerlo). Respecto al audioMixer,compressorMixer requiere 2 ciclos más para el procesamiento; dado que la máquina de estados principal tiene dos estados más, de un ciclo cada uno, para el amplificado y la compresión. Ambos suceden al estado de mezcla descrito anteriormente para el audioMixer, tal que antes de enviarse el resultado a la salida se realiza la multiplicación por la ganancia calculada, y el compresor analiza la muestra final. 4.4.3. Mezcladores de entrada (trackInputMixer) Para utilizar las muestras de entrada en el sistema, es preciso en primer lugar convertirlas a la anchura apropiada. Como se observa en la figura 4.4, antes de ser mezcladas, las muestras de entrada son reajustadas de 24 a 32 bits. Para ello se realiza una operación combinacional que tiene en cuenta el signo de la muestra, que añade ceros si es positiva o unos si es negativa. 79
Figura 4.4: Mezclador de entrada Una vez adaptadas las muestras de entrada, se procede a su mezcla, para enviar a cada pista las correspondientes. Por ello existe un mezclador (audioMixer) para cada pista, a cada uno de los cuales se le indica qué entradas deben formar parte de la mezcla. Puesto que es matemáticamente imposible que la mezcla sature en este punto del sistema, la detección de desboardamiento de los audioMixer no se utiliza. 4.4.4. Mezcladores de salida (outputMixer) De forma análoga a trackInputMixer, en este módulo se mezclan las muestras procedentes de las pistas (concretamente, de su procesador de efectos asociado), para generar el sonido que ha de enviarse a cada una de las salidas del sistema. En primer lugar, como se observa en la figura 4.5, un componente compressorMixer recibe desde el módulo de control los niveles de compresión y volumen a aplicar en cada canal de salida. Por otro lado, desde las pistas, recibe a qué salidas debe enviar su audio. 80
Por ejemplo, la pista 1 indica al outputMixer que debe sonar por los canales 1 y 2, la pista 2 solo por el canal 2... etcétera. Las mezclas resultantes (una por cada salida) deben reducirse en anchura de 32 a 24 bits, tal que sean aptas para el códec de audio del sistema. Este proceso se realiza de forma combinacional en intToExtOutput. Para garantizar la máxima fidelidad, las muestras se someten a redondeo y saturación. El redondeo se implementa truncando los últimos ocho bits de la señal original, si la muestra es positiva y el más significativo de ellos es uno, se suma a los 24 restantes; si la muestra es negativa y el mismo bit es cero, se resta uno. En caso de que dicha suma desborde, se aplica limitación reemplazando su valor por el máximo o mínimo representable (según corresponda). Por otro lado, con vistas a proporcionar al usuario información sobre el estado del proceso, el componente outputLevel mide la amplitud de las muestras. En conjunto con el medidor, que es combinacional, la implementación consta de una máquina de estados. Esta se encarga de registrar periódicamente el valor más alto manifiestado por outputLevel en el intervalo de tiempo correspondiente a 4096 muestras de audio. Cuando no hay ninguna salida activa, la máquina de estados queda “en espera”. Este mecanismo es imprescindible porque los cambios registrados en el volumen de salida se notifican a los módulos que retransmiten al usuario el estado del sistema; enviar el nivel de salida de todas las muestras procesadas no solo es innecesario, sino que también sobrecargaría la comunicación (especialmente en lo que respecta al módulo Bluetooth). La longitud de los intervalos (4096 muestras) equivale a 83,9 milisegundos porque permite alcanzar un equilibrio entre fluidez (pues con periodos más largos aparecen “saltos” al visualizar el estado del nivel de salida) y número de mensajes enviados al controlador remoto. Además el compressorMixer también indica al exterior del módulo si está comprimiendo la salida, muy útil e incluso necesario para tener control sobre el sonido resultante. De este modo, se puede saber cuando el volumen es demasiado alto. 81
Figura 4.5: Mezclador de salida 82
Figura 4.6: Controlador de las pistas 4.5. Pistas En las pistas se realiza el control de la reproducción y grabación, y por tanto del acceso a memoria. También gestionan la sincronización de los loops. Por ello las operaciones lógicas más complejas tienen lugar en estos módulos. 4.5.1. Controlador de las pistas (trackController) El componente que alberga las pistas y el controlador de memoria es trackController. Las pistas reciben el audio de entrada, ya mezclado en trackInputMixer, así como el audio previamente grabado en memoria. Para obtener este último, las pistas mantienen comunicación con multiTrackRecorder (el controlador de memoria). Cada pista recibe además sus correspondientes señales de control y el tempo, para la sincronización. Por otro lado, las pistas retransmiten su estado entre ellas (también para sincronización) y al resto del sistema. 83
4.5.2. Pista (track) Las ocho pistas son los ocho corazones del LoopMAN. Su arquitectura se compone de múltiples módulos y máquinas de estados sincronizadas, la figura 4.7 muestra un esquema. Teniendo en consideración la labor principal de las pistas, estas gestionan la grabación y reproducción de audio, así como su sincronización. Por motivos de complejidad en el diseño e integración de dichas funciones, se han delegado las tareas en diversos componentes. TrackFlow Acorde a otras secciones de esta memoria, la descripción del sistema atiende al orden en que el audio lo atraviesa, no obstante, en las pistas es más complejo definir este flujo. En cualquier caso, el módulo principal es trackFlow y consta fundamentalmente de una máquina de estados, la cual coordina la acción de los otros componentes. Cuando llega una muestra nueva, comienza a funcionar: sale del estado de espera y pasa a intercambiar los datos pertinentes con la memoria, es decir realiza la lectura y si corresponde, la escritura. Gracias al diseño altamente optimizado del controlador de memoria, la operación anterior se resuelve en un solo ciclo. A continuación establece las entradas del mezclador interno, para fusionar el sonido entrante con el leído de memoria. Por último, el resultado anterior se somete (combinacionalmente) a las operaciones de ajuste de volumen y la muestra final es almacenada en el registro de salida. El mezclador (audioMixer), es el mismo que el expuesto en la sección 4.4.2. Su salida se somete a un atenuador de audio (audioDimmer), módulo que realiza una multiplicación en punto fijo (Q2.4) para reducir el volumen final. Se ha seguido una idea habitual en mezcla de audio digital, tal que solo sea posible atenuar y nunca amplificar el volumen de las pistas; de este modo se obliga a trabajar con muestras de amplitud adecuada y se evita el desbordamiento, así como la pérdida de fidelidad. En la última étapa, la salida de audio se silencia, si el mute ha sido activado, o bien si la señal not_alone se encuentra a alta, pues eso supone que alguna otra pista está en modo 84
Figura 4.7: Pista 85
Figura 4.8: Se observa el efecto de la sincronización en las señales de control. solo. RecPlaySync TrackFlow actúa acorde a condiciones marcadas por otros módulos, como es el caso de recPlaySync, encargado de sincronizar las señales de control (rec yplay) respecto al tempo. La sincronización está condicionada a que la opción sync esté activada y al estado de las otras pistas, recibido por la señal others_working. Al presionar el botón de grabar o reproducir, es inevitable que los humanos tardemos o nos adelantemos respecto al tempo: siempre se producirá un desfase. Por ello, se ha establecido una medida para las órdenes adelantadas, que consiste en no activar la señal correspondiente (grabar o reproducir) hasta que llega el siguiente pulso de tempo. En el escenario contrario, cuando la pulsación se realiza ligeramente después respecto a al tempo, se mide el desfase; si este no excede un umbral (0,167 segundos, que equivalen a 1,25 millones de ciclos), la señal de control se activa de inmediato. Este comportamiento está ilustrado en la figura 4.8. Para que otros módulos del sistema puedan respetar la sincronización en este segundo caso, recPlaySync escribe en la señal tempo_window. 86
Figura 4.10: Mapa de memoria. bits, los tres más significativos están asociados a la región correspondiente a cada pista; mientras que el resto se utilizan para seleccionar las palabras de 128 bits. Cada palabra contiene por tanto, cuatro muestras de 32 bits cada una. Overdub Por último, la función overdub (que permite mezclar una grabación antigua con una nueva en la misma dirección de memoria) se realiza dentro de bufferManager, en un componente llamado overdubber. La operación consiste en atenuar las muestras del buffer de lectura (rd_buffer) y mezclarlas con los datos de entrada, antes de almacenarlos en el buffer de escritura (wr_buffer). La atenuación se realiza mediante una multiplicación en punto fijo (Q2.4), utilizando un 93
componente audioDimmer. Para la mezcla se utiliza un audioMixerCombi. 4.6. Control de tempo 4.6.1. Tempo Recordando el concepto de tempo, este hace referencia a la velocidad de interpretación. Se mide en pulsos por minuto (bpm, beats per minute). Es necesario mantener esta noción en el sistema por múltiples motivos. Los detalles se encuentran en la sección 2.1.3, donde se habla de las funcionalidades ofrecidas. De cara a la arquitectura, el objetivo principal es mantener la sincronía internamente entre las pistas, y externamente con el intérprete u otros instrumentos digitales. En términos de hardware, el tempo funciona de forma similar a un reloj derivado del principal, generando pulsos a una frecuencia menor, sin embargo no es tal cosa. El tempo es en realidad una señal de control, implementada como las señales de carga de los registros: se mantiene a alta durante un ciclo cuando corresponde. Por ejemplo, el beatCounter (módulo que mantiene el estado sobre la reproducción) avanza un pulso (o beat en inglés) cada vez que la señal de tempo conmuta a alta. En el siguiente apartado, se describe la arquitectura interna del componente que gestiona el tempo del sistema. 4.6.2. TempoGenerator TempoGenerator es el componente que genera la señal principal de tempo, en base al control del usuario y mecanismos de sincronización. Como se observa en la figura 4.11, consta de tres módulos. El módulo homónimo (tempoGenerator), mantiene un contador de ciclos que vence al alcanzar el valor indicado por la señal tempo_ticks. Entonces generará un pulso. En caso de recibir una petición de sincronía (señal tempo_sync), reiniciará el contador y generará también un pulso. 94
TempoValueSetter establece el valor máximo de la cuenta realizada en tempoGenerator. Dicho valor puede ser ajustado directamente mediante señales de control, o bien a través de un mecanismo que detecta la cadencia con que el usuario presiona un botón. Este último se encuentra en el módulo tempoMeasurer, implementado con una máquina de estados. Para detectar la frecuencia de las pulsaciones en el ajuste automático de tempo, se mide con un contador el número de ciclos transcurrido entre cada accionamiento del botón. En ello se emplean dos estados: uno de espera y otro de cuenta, tal que el primero transiciona al segundo después de la primera pulsación. Si el contador alcanza su valor máximo, el estado de cuenta retorna al de espera; si por el contrario se acciona nuevamente el botón, se almacena y procesa el valor actual de la cuenta. En un nuevo estado, se calcula la media total con cada valor obtenido, que determinará el valor final a emplear para generar el tempo. De este modo se mitigan los efectos del error humano, puesto que es prácticamente imposible marcar el tempo con absoluta precisión. Se ha pretendido dar más “peso” al último valor calculado que a los anteriores, puesto que es frecuente que el usuario sea más preciso después de sucesivos toques al botón. Por ello la fórmula empleada en este cálculo es la que sigue: m(n) = c(n) + m(n−1) 2 Donde mes el valor medio calculado y cel valor de cuenta medido entre las dos pulsaciones del usuario. Este proceso de cálculo de la media se reinicia (es decir, se elimina la última media calculada y comienza de nuevo) en varios escenarios. El primer caso es que se ajuste el tempo manualmente mientras se está midiendo la frecuencia de las pulsaciones. Otra situación se da cuando el usuario cambia sustancialmente el ritmo, acelerándolo o ralentizándolo más de un 5 %. Este desfase se calcula multiplicando la media por 0,95 y 1,05 para obtener un límite inferior y otro superior respectivamente: 95
límite inferior =m∗0,95 límite superior =m∗1,05 En caso de que el valor de cuenta obtenido exceda alguno de dichos límites se considerará un cambio sustancial en el tempo y por tanto el cálculo de la media será reiniciado. La implementación de este mecanismo se ha realizado con multiplicaciones en punto fijo (Q2.4) por las constantes "001110"(0,9375) y "010001"(1,0625). Establecer el desfase máximo al 5 % se debe a un criterio meramente musical. Por ejemplo, suponiendo que el tempo sea 120 bpm ralentizarlo un 5 % resulta en 114 bpm y empieza a ser claramente apreciable. 4.7. Efectos Los efectos están implementados como un componente separado de las pistas, siguiendo las líneas de la arquitectura modular. Para optimizar el rendimiento y permitir que el sistema pueda escalar (al introducir más efectos u otros componentes en el flujo principal del sonido) respetando los límites de temporización entre muestra y muestra, este módulo se ha diseñado de forma paralela tal que los efectos se aplican simultáneamente en las ocho pistas. 4.7.1. Controlador de efectos (fxController) Para respetar la jerarquía del diseño, el controlador de efectos es un envoltorio de los ocho procesadores de efectos (uno por pista). Se observa su sencillez en la figura 4.12. Del mismo modo que otros componentes que forman parte del flujo del sonido (conjunto de módulos que atraviesan las muestras de audio en el sistema), presenta una serie de 96
Figura 4.11: Controlador central de tempo. 97
Figura 4.12: Controlador de efectos. entradas para controlar su comportamiento y salidas para manifestar su estado actual. Por cada pista del sistema, hay tantas señales de control y estado como efectos disponibles. Evidentemente, el módulo presenta también entradas y salidas de audio (una por pista). 4.7.2. Procesador de efectos (fxProcessor) Para lograr que el sistema pueda aplicar múltiples efectos de sonido a la misma muestra y en cualquier orden, es necesaria una arquitectura como la presente en la figura 4.13. El control de los efectos (gestionar si están activos o no, así como el valor de sus parámetros) lo realiza enableControl. FxUnit son los módulos que aplican efectos al sonido, por ello reciben una señal desde enableControl para regular su comportamiento. Presentan una entrada y una salida para el audio. Para controlar el orden en que se aplican los efectos, el módulo queueControl registra las solicitudes de encolado de los efectos (procedentes de userControl). Para ello mantiene una estructura similar a una fifo, que almacena etiquetas asociadas a cada fxUnit. Asimismo, cuando llega una nueva muestra para procesar, empieza a funcionar la máquina de estados finitos presente en mainControl. En el registro fx_buffer se almacena el audio recibido. Si hay algún efecto activado y encolado, pasa al siguiente estado, donde se lee en orden la fifo de queueControl. Si la etiqueta leída corresponde a un efecto activo, se le envía a este el contenido de fx_buffer y avanza al siguiente estado (de espera). Cuando dicho 98
Figura 4.13: Procesador multiefectos. 99
Figura 4.14: Aplanado del módulo mainControl en fxProcessor. efecto finaliza su operación, almacena el resultado de nuevo en fx_buffer, y vuelve al estado anterior para obtener de la fifo el siguiente efecto encolado y activo. Este proceso se repite hasta que no quede nada por leer en la fifo, entonces la muestra final con todos los efectos ya aplicados se transmitiría al exterior (es decir, al siguiente módulo, que es outputMixer). Como apoyo a la descripción anterior, en la figura 4.14 se puede observar el hardware correspondiente a la implementación de mainControl. El banco de registros queue pertenece al módulo queueControl. Los fxUnit son los distintos efectos de sonido. 4.7.3. Efectos de sonido (fxUnit) En esta sección se describe la arquitectura interna de los efectos de sonido. Para implementar muchos de ellos se han realizado previamente implementaciones en software (empleando Matlab), para verificar los diseños de un modo más ágil [1,23–25]. 100
Figura 4.15: Arquitectura de fxUnitDelay. Delay El delay repite el sonido periódicamente en intervalos fijos de tiempo, cada vez con mayor atenuación; por tanto en su implementación digital es imprescindible al menos una memoria, un controlador para gestionar el acceso a la misma y operadores para disminuir el volumen y mezclar el sonido retardado con el actual. La figura 4.15 muestra un esquema arquitectónico de este componente. El controlador que coordina la operación del efecto es fxMainControl, que consta de una máquina de estados. En primer lugar, espera a que se complete la lectura de la memoria. Después, el volumen de la muestra leída se reduce combinacionalmente a la mitad. Lo obtenido se mezcla con la entrada actual y tras un ciclo de reloj cambia al siguiente estado. Finalmente, mientras el resultado se transmite al exterior también se almacena en memoria, todo a la vez; de esta manera se consigue ahorrar un ciclo. En el último estado también se actualiza el puntero de escritura. Para implementar el almacenamiento se ha empleado una block ram, puesto que la DDR2 disponible en la placa se ha destinado en su totalidad a las pistas. Dicha memoria es tratada 101
como un buffer circular, recorrido por un puntero. El tamaño del buffer marca cuánto retardo manifestará el sonido resultante, por ello es ajustable externamente. Para lograrlo, fxMainControl limita el máximo valor alcanzable por los punteros de lectura y escritura. Todas las operaciones realizadas sobre las muestras, es decir, la atenuación y la mezcla, son simples. Por este motivo se efectúan combinacionalmente en el mismo ciclo de reloj. Para la mezcla se emplea un audioMixerCombi, el descrito en la sección 4.4.2. La atenuación consiste en dividir entre dos el dato, por medio de desplazar la muestra un bit a la derecha y después ajustar el signo, colocando un uno o un cero (según sea negativa o positiva respectivamente) en el bit más significativo. El tamaño total de la block ram utilizada es de 32 KiB, lo cual permite hasta 0,168 segundos de delay. Se ha utilizado dicho tamaño debido a las restricciones que impone la FPGA. Jamón Este módulo requiere de una memoria, igual que el delay, porque pretende imitar un efecto Doppler (detallado en el capítulo anterior, apartado 3.1.7). Para ello es necesario recorrer al doble de velocidad el audio almacenado, provocando una alteración de tono que coincide con el segundo armónico, es decir una octava más agudo. Por tanto sonará “bien”, en armonía con el tono original. Como se observa en la figura 4.16 la arquitectura es muy similar al delay, no obstante los punteros para el acceso a memoria (buffer circular) tienen un relación distinta, ya que las escrituras y lecturas se realizan en direcciones distintas. Sin embargo, no se requiere que los accesos sean simultáneos, así que tampoco hace falta utilizar una block ram de doble puerto. El componente principal fxMainControl gobierna el comportamiento del efecto mediante una máquina de estados. Al recibir una muestra de audio a procesar, pasa al estado de acceso a memoria, donde obtiene el dato retardado y almacena el recibido. También actualiza los punteros de acceso a memoria. A continuación procede a mezclar la muestra leída de memoria 102
Figura 4.20: Arquitectura de fxUnitFuzz. hardClipping(muestra) = muestra, si muestra < 0 muestra, si muestra ≥0ymuestra < límite límite,si no En el proceso se va a ver aumentado el volumen de salida, y es necesario corregirlo mediante el módulo atenuador. Para ello, en el estado que sigue se aplica la operación, almacenando el resultado en el registro de salida. Cuando el usuario ajusta el parámetro de intensidad en este efecto, actúa directamente sobre la ganancia del audioBooster. El umbral (es decir, el limite) es fijo, y se ha establecido en el máximo valor representable con 25 bits (en C2). Las muestras se codifican con 32 bits, aunque el audio códec las proporciona de 24 bits; por tanto si la ganancia se mantiene en su valor mínimo (es decir, uno), las muestras no se verán saturadas porque tendrán un valor inferior al umbral. Al 109
Figura 4.21: Arquitectura de fxUnitFlanger. incrementar la ganancia empezará progresivamente a apreciarse el efecto en el sonido. El valor de atenuación en el componente audioDimmer también depende del ajuste del usuario, tal que la amplificación quede compensada y que el volumen de salida no se vea incrementado en desmedida. Flanger El flanger es un efecto de sonido oscilante, basado en mezclar la señal original con otra de retardo variable. Arquitectónicamente es idéntico al jamón, como refleja la figura 4.21. Sin embargo internamente implementa un contador para lograr la oscilación de baja frecuencia, necesaria para variar periódicamente el tiempo de retardo de las muestras. Además el tamaño del buffer es también mucho menor, porque el retardo en este efecto no debe exceder los 2 milisegundos. El máximo tiempo de delay del efecto es ajustable en tiempo real, tal que el usuario pueda configurar a qué velocidad oscila el efecto (y su profundidad). La máquina de estados principal dispone de un estado inicial que establece el tiempo de retardo de acuerdo al contador. Cuando es recibida una nueva muestra, pasa al siguiente 110
estado, que destina un ciclo a actualizar los punteros de lectura y escritura, así como a almacenar dicha muestra en memoria (no necesita más, pues se trata de block ram). A continuación se destina otro estado de un ciclo de duración a completar la mezcla de la señal original y la retardada. Finalmente se notifica al exterior que la operación ha concluido. La mezcla se realiza con un audioMixerCombi, cuyas entradas son combinacionalmente divididas entre dos, por medio de un desplazamiento a la derecha con control de signo. El tamaño total de la block ram utilizada es de 512 bytes; de este modo se obtienen como máximo 2,62 milisegundos de retardo. Recordando los detalles del flanger este debe funcionar con delays de entre 0 y 2 milisegundos. HiPass yLoPass Estos efectos son esencialmente un filtro paso alta y paso baja, sirven para eliminar de la señal el exceso de graves o agudos respectivamente. El filtro que emplean internamente es de tipo FIR (Finite Impulse Response). La decisión de utilizar este frente a uno IIR se debe a la ausencia de realimentación, que lo hace más estable y los posibles errores que puedan producirse desaparecen totalmente después de tantas muestras como etapas tenga el filtro. Disponen de múltiples frecuencias de corte, seleccionables en tiempo real. Para el filtro paso baja se han escogido (en Hz) 15000, 3500, 1000, 400 y 220; mientras que para el paso alta han sido 25, 40, 80, 140 y 190. Los valores anteriores se han obtenido de implementaciones comerciales de estos filtros (en concreto los mostrados en el capítulo previo dedicado a la funcionalidad, figura 2.11). Tras una serie de simulaciones y pruebas se estimó lo más conveniente fijar el número de etapas (es decir, de muestras almacenadas en RAM y coeficientes) en 511. Con menos, la precisión de los filtros se ve comprometida. La arquitectura de los mismos utiliza ROMs con constantes almacenadas, una RAM que guarda un número predefinido de muestras y un MAC (Multiply-Accumulate: multiplica dos valores y acumula el resultado, sumándolo al anterior). Se observa un esquema general en la figura 4.22. 111
Figura 4.22: Arquitectura de fxUnitHPF yfxUnitLPF. El componente ramAccess gestiona el acceso a la memoria block ram, que actúa como buffer, ya que almacena las últimas 511 muestras recibidas. Por otro lado, romAccess administra el acceso a las ROMs que contienen las constantes necesarias para filtrar las señales. Como hay varias frecuencias de corte son necesarias varias ROMs, por lo que romAccess también se encarga de seleccionar la apropiada. Para el cálculo de las constantes se ha utilizado el algoritmo de la ventana de Hamming. Entre otras ventajas de este, las constantes que genera son simétricas; en otras palabras, las primera mitad de la tabla de constantes coincide con la segunda. Por ello es suficiente con una ROM de la mitad de profundidad (en este caso, 255 posiciones), aunque esto también complica levemente la administración del puntero de acceso a la misma. El algoritmo de filtrado lo gestiona la FSM de fxMainControl. Se trata de diseño multiciclo que sucesivamente realiza las multiplicaciones y sumas necesarias para hallar el valor acumulado, empleando un ciclo por etapa, en este caso 511. En primer lugar cuando llega un nuevo dato, el sistema sale del estado de espera para 112
almacenar dicha muestra en la RAM y avanzar el puntero de escritura. Al ciclo siguiente empieza a filtrar, para ello multiplica una a una las muestras de audio del buffer por los coeficientes almacenados en ROM y suma todos los resultados. Cada una de estas operaciones (multiplicación con acumulación) se realiza en un ciclo. Simultáneamente se actualizan los punteros de acceso a memoria: en el caso de las muestras consiste en sumar uno cada vez (salvando el momento en que “da la vuelta” al buffer circular). Para los coeficientes hay que considerar la propiedad simétrica de estos y recorrer la ROM desde la dirección más baja a la más alta durante los primeros 255 ciclos y luego al contrario (desde la más alta a la más baja). Este efecto es probablemente el más costoso (en términos de tiempo de cómputo) de todos las presentes en el flujo del audio, puesto que cada multiplicación necesita un ciclo de reloj. 4.8. Control En esta sección se cubren los componentes destinados al control del sistema por parte del usuario, de ellos proceden las señales de control (ya introducidas en la sección 4.2 para describir la comunicación entre módulos). Como breve recordatorio, el control consiste principalmente en señales que transmiten pulsos para indicar qué acciones debe tomar el sistema. El principal objetivo que persiguen estos módulos es traducir la información recibida desde el teclado y el Bluetooth (controlados por el usuario), para que el resto de componentes (pistas, efectos...) puedan interpretarla. Se ha diseñado de esta manera para evitar tener que almacenar toda la información del sistema en el componente de control. Dicha alternativa eliminaría la necesidad de tener que enviar los pulsos a los componentes, pero complica considerablemente la detección de cambios de estado y dificulta mantener la coherencia, pues las actualizaciones no serían inmediatas. Por ello, cada módulo gestiona su propio estado de forma individual e independiente. 113
Figura 4.23: Componentes de control unificados. 4.8.1. UserControl UserControl es el módulo principal de control. Unifica las distintas fuentes presentes para el manejo del sistema, tal que sea posible utilizar todas al mismo tiempo. Contiene los componentes PS2Controller ybtReceiver, que reciben tramas desde el teclado y el receptor Bluetooth respectivamente. Ambos generan pulsos de control en base a los datos recibidos. 4.8.2. Control Bluetooth (btReceiver) Este componente recibe y parsea los datos recibidos por Bluetooth, para generar las señales de control correspondientes. Las tramas que provienen de la comunicación se reciben en serie (mediante RS-232 con ocho bits de datos y uno de stop, a 115200 baudios por segundo [14]). Esto se debe la implementación del dispositivo empleado. El módulo rs232Receiver construye palabras de tamaño byte a partir de los datos recibidos [26]. 114
Figura 4.24: Receptor de tramas Bluetooth. Para minimizar el impacto de la comunicación en el ancho de banda, así como en el consumo, el controlador Bluetooth solo envía información cuando se produce una interacción en el mismo. Es importante remarcar que el controlador en ningún caso almacena o mantiene el estado de ningún dato, solo transmite la acción a realizar sobre el sistema. Gracias a ello se evitan problemas de consistencia. Las tramas se montan en collector, que está implementado mediante una FSM. En el estado inicial, espera la recepción de bytes desde rs232Receiver. Cuando recibe tres (que hacen los 24 bits necesarios), envía el resultado a parser. Si el contenido del primer byte recibido coincide con “00100101” (llamado metadata_byte), pasarán a descartarse todos los datos entrantes, es decir, se deshabilitará la construcción de tramas. Para salir de este estado es preciso volver a recibir otro metadata_byte. Esto sirve para la recepción de información ajena al control del sistema, así como para descartar metadatos generados por el controlador de Bluetooth utilizado. Este sistema se implementa utilizando una máquina de estados. Finalmente, las tramas montadas se parsean combinacionalmente en el módulo parser. También genera el pulso en la línea de control correspondiente. Para los casos que procede 115
(por ejemplo, volumen, compresión overdub...), también escribe el valor recibido en la señal asignada. Trama de control El formato de trama es el mostrado en la figura 4.25. La longitud es fija: 24 bits. En primer lugar, los cinco bits más significativos (23-19) indican el modo. Este permite clasificar el mensaje en función de a qué módulo del sistema está destinado. Hay valores especiales del campo “modo”: reset (para efectuar un reset hardware en el looper) y forbidden (para prevenir que las tramas de comunicación coincidan con el antes citado metadata_byte). Los valores de los campos que ocupan los bits más significativos condicionan la forma en que se interpretan los demás. Por tanto, en función del modo, la información codificada en los campos pista, opción y valor cobrarán un significado distinto. Los bits del 18 al 16 codifican a qué pista afecta el mensaje. Dado que hay ocho pistas se ha fijado su longitud en tres bits. Cuando el mensaje es de modo “master” este campo se utiliza para indicar a qué canal de salida se debe aplicar la acción contenida en el mensaje. A continuación, el campo “opción” (de un byte de anchura) sirve para manifestar a qué parámetro afecta el mensaje, dentro del modo en cuestión. En caso de que el modo sea “master”, este campo puede tomar los valores “compresión” o “volumen”. Cuando el modo es “track”, opción puede ser “reproducir”, “grabar”, “mute”, “volumen”... entre otros. Si el modo es “fx”, las opciones son “encolar”, “limpiar cola”, “activar”, etcétera. Por último, el campo “valor” (también de un byte de anchura) completa la información sobre la acción de control, especificando la cuantía de la misma. No se aplica en todos los casos, por ejemplo cuando el campo modo es “track” y el campo opción es “grabar” o “reproducir”. Sin embargo, cuando se pretende enviar un mensaje para establecer el volumen de una pista o la intensidad de un efecto, sí es necesario indicar el valor asociado utilizando este campo. Cuando se envía un mensaje de control relativo a los efectos, el campo valor se utiliza para especificar el identificador del efecto al que va dirigido. Esto se ha especificado así con 116
Figura 4.25: Trama de control. 117
vistas a poder controlar hasta 256 efectos distintos por pista sin necesidad de modificar el formato de trama (puesto que el campo valor se codifica con ocho bits). Hay una situación especial en el uso de estos campos, sucede cuando el modo del mensaje es “tempo”. En este caso los campos pista, opción y valor se utilizan solapados, para enviar el tempo con mayor precisión. Así se dispone de 19 bits para codificarlo (frente a los ocho que tienen los campos valor y opción). 4.8.3. Control por teclado (PS2Controller) Para implementar el control por teclado este módulo incluye el componente ps2KeyboardInterface, que devuelve los códigos asociados a las teclas. En él está implementado el protocolo PS/2: recibe los datos en serie y realiza una comprobación de paridad. El diseño de este módulo es una adaptación de material docente de la asignatura optativa Diseño Automático de Sistemas (impartida en el grado al que corresponde este trabajo) [12,27]. El componente keyScanner consiste en una máquina de estados que gestiona los eventos de pulsación y liberación de las teclas, generando de forma combinacional los pulsos de control que corresponden. Dicha máquina permanece en un estado inicial hasta recibir un evento desde ps2KeyboardInterface. Si el evento recibido es de pulsación genera el pulso de control asociado a la tecla; si por el contrario el evento corresponde a una despulsación, pasa a otro estado para esperar a recibir el código de la tecla despulsada (aunque no tiene ningún efecto de cara al control del sistema). Puesto que el número de teclas del que dispone un teclado es limitado, no es posible ni por asomo controlar todos los parámetros de las pistas. Por ello se ha solventado la situación implementando un seleccionador de pistas (selecCounter); tal que la pista que se encuentre seleccionada, será aquella sujeta al control de ciertas teclas “compartidas”. Por ejemplo, para regular el volumen con el teclado, es preciso primero seleccionar la pista en cuestión y después realizar el ajuste. 118
Figura 4.30: Trama de visualización. 125
a la recepción de mensajes. Es el caso del volumen, la longitud de la grabación o la amplitud actual de la señal (evidentemente este último no existe para las tramas de control, ya que el sonido se genera en el looper y no en el tablet). Cuando el modo es “fx”, el campo “opción” alberga el código de ocho bits que identifica al efecto cuyo estado está siendo transmitido. En el campo “valor” se incluye toda la información relativa a dicho efecto: si está encolado, si está activo y el valor de su parámetro ajustable. 4.9.3. Visualización del estado en monitor VGA (vgaController) VgaController toma las señales de estado para generar los gráficos combinacionalmente. El componente vgaInterface envía la señal de vídeo al exterior del sistema, de acuerdo al protocolo VGA, tal y como fue descrito en la sección 3.2.3. Para ello barre todos los píxeles de la pantalla: mediante las señales pixel yline notifica el píxel actual, y por cada uno de ellos recibe a través de la señal RGB el color asociado al mismo. El diseño de este módulo es una adaptación de material docente de la asignatura optativa Diseño Automático de Sistemas (impartida en el grado al que corresponde este trabajo). De este modo, vgaTrack,vgaMaster,romGraphics ytempoVisualizer manifiestan el color del píxel que vgaInterface solicita. Las señales de color de todos ellos se unifican mediante puertas OR. Los ocho vgaTrack representan las pistas y su estado (volumen, beat, si está grabando, reproduciendo, en mute...). Hay dos vgaMaster para dibujar las salidas de audio. Por otro lado el módulo romGraphics gestiona el acceso a unas memorias ROM que almacenan los números de las pistas y el logo de LoopMAN. En último lugar, tempoVisualizer contiene una máquina de estados temporizada que se encarga de mostrar el tempo; implementa un mecanismo para mantener visible durante un tiempo un indicador, que se activa al recibir un pulso en la señal tempo. Dicho comportamiento se logra con una FSM temporizada de dos estados, uno de espera y otro de cuenta regresiva. La figura 4.32 muestra el sistema en funcionamiento, conectado a un monitor VGA. En 126
Figura 4.31: Controlador VGA. 127
Figura 4.32: LoopMAN conectado a un teclado y monitor VGA. la interfaz gráfica dibujada por el looper se observan las ocho pistas (numeradas), dispuestas horizontalmente. Cada una de las cuales incluye, de arriba a abajo, el estado de la reproducción, mute, solo y grabación. A continuación, en forma de barras muestra la longitud del loop grabado y el pulso actual (a la izquierda); y el volumen e intensidad del sonido (a la derecha). Debajo del logo de LoopMAN, se encuentra el metrónomo. Puesto que parpadea para indicar los pulsos, en la imagen no se aprecia su utilidad. Por último se encuentra el estado de los dos canales de salida. Es decir, su volumen, la amplitud del sonido y el indicador para alertar cuando hay riesgo de que las muestras saturen. 128
4.10. Otros módulos de audio A continuación, se detalla el funcionamiento de algunos módulos que realizan operaciones habituales en el procesamiento de sonido, y por ello están incluidos en varios componentes descritos anteriormente. 4.10.1. AudioDimmer AudioDimmer es un atenuador, reduce el volumen de las muestras. Se utiliza para ajustar el volumen del audio, en efectos como el trémolo o también en el overdub de los loops grabados. Es puramente combinacional para que su integración sea más flexible, tal que si es preciso segmentar, pueda hacerse acorde a la arquitectura del módulo que lo contenga. Internamente realiza la atenuación mediante una multiplicación en punto fijo (Q2.4), por un factor entre cero y uno. Una alternativa más simple y que requiere menos recursos sería desplazar las muestras hacia la derecha, para dividir entre dos la amplitud de onda. Sin embargo la falta de precisión de este método, unido a la amplia capacidad de las FPGAs actuales, hace que la primera opción sea mucho más conveniente. 4.10.2. AudioBooster Este módulo funciona bajo el mismo principio que audioDimmer. La diferencia reside en el factor de multiplicación, que al ser mayor que uno amplifica el volumen de las muestras. Por este motivo, incluye además un control de desbordamiento, el cual devuelve el máximo valor representable (positivo o negativo) cuando las muestras resultantes exceden el límite impuesto por los 32 bits de anchura. Se emplea, por ejemplo, en el efecto overdrive para incrementar el volumen de las muestras que han sido limitadas. 129
4.10.3. OutlevelIndicator Cuando es necesario medir en qué rango de amplitud se encuentra una muestra, se utiliza outlevelIndicator. Es el caso de los indicadores que muestran la intensidad a la que suenan las pistas o los canales de salida en el máster. Se emplea también en la función “autorec” de las pistas, para detectar cuándo está sonando una entrada. Es combinacional, por ello habitualmente se emplea en conjunto con máquinas de estados que registran su salida; cada una está adaptada al contexto en que se implementa. Dispone de un parámetro threshold_step (no es ajustable en tiempo real) para regular su sensibilidad. Con él se puede establecer una serie de 16 valores equiespaciados, que definen los rangos de amplitud para evaluar las muestras. corte(i) = i∗threshold_step De este modo, cuanto menor sea threshold_step, más sensible será el medidor. Esto resulta útil porque en algunos casos se trabaja con amplitudes de onda relativamente pequeñas y no pueden apreciarse bien las variaciones en el volumen. 130
Capítulo 5 Desarrollos complementarios: carcasa y App para el control remoto de LoopMAN Este breve capítulo está dedicado a la aplicación software para el control remoto de LoopMAN y al diseño de una carcasa que facilite conectar periféricos e instrumentos musicales al prototipo hardware. No obstante, el nivel de detalle no es tan profundo como en anteriores secciones ya que estos dos elementos son complementarios al objeto principal de este proyecto que recordemos es el desarrollo e implementación de la arquitectura hardware. 5.1. App para el control remoto de LoopMAN Esta aplicación ha sido diseñada para su ejecución sobre el sistema operativo iOS y programada enteramente en el lenguaje de alto nivel Swift. Tiene como propósito poner a disposición una vía cómoda y flexible para controlar el looper. Por un lado proporciona una interfaz gráfica interactiva, por otro se encarga de enviar al sistema hardware los mensajes de control pertinentes y también recibir la información de su estado. 5.1.1. Funcionalidad de la aplicación Tal y como muestra la figura 5.1, la interfaz gráfica principal presenta un panel de control. Cada uno de sus elementos está asociado a un parámetro ajustable del looper. 132
Figura 5.1: Aplicación software diseñada para el control. 133
En la mitad izquierda del panel (TRACK CONTROL) se observan los controles de las ocho pistas. En primer lugar en la parte superior, se sitúan los botones numerados de play; estos inician o detienen la reproducción del audio grabado en su pista. A continuación se encuentran mute y solo, para silenciar las pistas. El siguiente es el botón para iniciar o detener la grabación (rec), seguido del control de autograbación (comienza a grabar automáticamente, al empezar a sonar). Después está sync, para activar o desactivar la sincronización de la pista en cuestión. Le sigue un slider (barra deslizable) para ajustar el overdub. Finalmente se sitúa el botón que efectúa el borrado del audio de la pista, clear. Inmediatamente debajo están los reguladores de volumen y de longitud del audio grabado. Ambos muestran mediante una animación la amplitud actual del sonido y avance de la reproducción, respectivamente. Además del slider pueden utilizarse los botones +/- para ajustar la longitud de la pista. La mitad superior derecha del panel contiene el control de efectos (FX CONTROL PANEL). Este consta de una lista de selección a la derecha, para elegir los efectos a aplicar en el orden deseado; y a la izquierda otra lista que muestra los efectos seleccionados en la pista actual. Mediante la barra superior (que tiene un elemento desplazable y unos números) es posible ajustar para qué pista están siendo configurados los efectos. Al seleccionar un efecto de dicha lista desplazable (la situada a la derecha), este será encolado en el LoopMAN y aparecerá en la lista de efectos (situada a la izquierda). Para limpiar la cola de efectos creada, está disponible el botón fx clear. Cada efecto encolado dispone de un interruptor para activarlo o desactivarlo, así como un slider para regular su intensidad. Debajo de los efectos, hay un slider horizontal, el cual permite ajustar el tempo del sistema. La sección etiquetada como I/O ROUTES permite configurar a qué pistas está conectada cada entrada; así como por qué salidas suena cada pista. Por último, en MASTER se sitúan cuatro deslizadores, que sirven para ajustar el volumen 134