Full text
Un instrumento virtual basado en síntesis granular para composición musical A virtual instrument based on granular synthesis for music composition Por: Nicolás Pastore Burgos Trabajo de Fin de Grado Grado en Desarrollo de Videojuegos Facultad de Informática Dirigido por Jaime Sánchez Hernández Madrid, 2021-2022
Agradecimientos Quiero agradecer a Jaime por la paciencia infinita que ha tenido conmigo, a Ricky, Stiven, Carlos y Ana por echarme una mano con la memoria y haber estado ahí cuando lo necesitaba, a Nacho por enseñarme que es una bibliografía, a Diego y a mis productores por echarle un ojo y darle feedback, a la carrera por haberme dado los conocimientos necesarios para hacer el proyecto una realidad, a mi familia por haberme dado los recursos, haber leído mil veces la memoria y el impulso de haber podido trabajar y seguir adelante. 2
Autorización y difusión de uso Se autoriza a la UCM (Universidad Complutense de Madrid) a difundir y usar el trabajo realizado con fines académicos y mencionado a los autores, tanto la memoria como el código. Nicolás Pastore Burgos Madrid, 2021-2022 Este documento esta realizado bajo licencia Creative Commons: “ReconocimientoCompartirIgual 4.0 Internacional”. 4
Índice general Resumen 9 Abstract 11 1. Introducción 13 1.1. Motivaciones ............................................. 13 1.2. Objetivos ............................................... 14 1.3. Estructuradelamemoria ...................................... 14 1. Introduction 16 1.1. Motivation .............................................. 16 1.2. Objectives............................................... 17 1.3. Documentstructure ......................................... 17 2. Estado del arte 19 3. Metodología y tecnología 23 3.1. MetodologíadeTrabajo ....................................... 23 3.2. Planificacióndelproyecto ...................................... 25 3.2.1. Investigación ......................................... 25 3.2.2. Primer contacto con las tecnologías . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 3.2.3. DesarrolloyPruebas..................................... 25 3.2.4. Documentación de la aplicación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 3.3. Tecnologíasutilizadas ........................................ 26 3.3.1. C++, JUCE, Projucer y Audio Plugin Host . . . . . . . . . . . . . . . . . . . . . . . . 26 3.3.2. VisualStudio2019...................................... 28 3.3.3. Git............................................... 28 3.3.4. Trello ............................................. 28 3.3.5. Overleaf............................................ 28 3.3.6. AdobePhotoshop....................................... 28 4. Diseño de la aplicación 30 4.1. Principiosyrequisitos ........................................ 30 4.1.1. Sampler............................................ 30 4.1.2. Síntesisgranular ....................................... 30 4.1.3. Ecualizador.......................................... 30 4.2. Inspiración .............................................. 31 4.3. Resultado ............................................... 32 4.3.1. Sampler............................................ 33 4.3.2. Síntesisgranular ....................................... 33 4.3.3. Ecualizador.......................................... 34 4.4. Ejemplodeuso............................................ 35 6
Desarrollo de Videojuegos UCM 5. Arquitectura e implementación del código 37 5.1. Arquitectura ............................................. 37 5.2. PluginProcessor ........................................... 37 5.2.1. FileBufferPlayer....................................... 39 5.2.2. GranularSampler ...................................... 40 5.2.3. EQProcessor......................................... 40 5.3. PluginEditor............................................. 40 6. Conclusiones y trabajo futuro 43 6.1. Conclusiones y valoración del proyecto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 6.2. TrabajoFuturo............................................ 44 6. Conclusions and future work 46 6.1. Conclusions and work evaluation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 6.2. Futurework.............................................. 47 Anexos 49 A. Manual de usuario GranularSampler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 Índice de figuras 54 Bibliografía 55 7
Capítulo 1 Introduction Granular synthesis is a sound production model based on the composition of new sounds by dividing an existing sound into sections called acoustic grains and reproducing them in a different order than the original. The original sound can be from many sources, but in this work a sampler will be used to import audio files as the origin, and for this reason the term granular sampler will often be used to refer to the instrument. This can also be by synthesis FM,RM, by wavetable or additive, among many others. This model has other uses such as extending the length of a sound without altering its frequency, or altering its frequency without altering its duration, useful for programs like Autotune, which allow you to modify the pitch of one sound to help tune some interpretations. This project also has an equalizer, used to control the frequencies of the resulting sound. This allows to cut low and high frequencies with a high-pass and low-pass filter, respectively, as well as a band filter, which allows you to control the gain or volume of a zone of frequencies. The instrument will also work in a DAW. A DAW, or Digital Audio Workstation [3], is a computer program used for digitally creating, composing, mixing, and mastering music. These programs usually work as a work environment where VST, or Virtual Studio Technology programs are launched, which act as instruments or sound effects. This project is designed to be used both individually (standalone) or as a VST. 1.1. Motivation Granular synthesis is one of the most powerful models for music creation. This is capable of being used as a tool to modify existing sounds or create new ones as I have explained before. Still it is one of the most neglected music composition algorithms. That’s why I wanted to create a tool comfortable enough for people who aren’t knowledgeable with the technology to be able to discover this model, and powerful enough to create sounds that can be used in real music projects. I also wanted to implement a control of the envelope, that is, the way in which the grains start and stop playing, as I observed that the rest of the software with this model implemented does not usually experiment with its control. Furthermore, as a person who has been involved with music for over eight years, and as a current composer for the video game company Mad Cream Games [5] and drummer for the band El Corral de los Quietos, I’ve worked on this project with the intention and hope of being able to use this software for our next video game Painting Werther [6] and for future songs by the band. 16
Desarrollo de Videojuegos UCM 1.2. Objectives The objective of this work is to create a functional Granular Sampler, with a graphical interface that responds in real time and allows the modification of the model parameters. These parameters must be the density of grains playing at the same time, their gain, the range from which the grains can be extracted from the file, the range of their duration and the envelope that they use. In addition, it must contain an equalizer with a low and high pass filter and a band filter to control the different frequencies of the resulting sound. It must be able to be compiled both as standalone, that is, as an individual program and in VST format with the aim of being able to integrate it into a DAW, specifically, FL Studio , since it is one of the most used Digital Audio Workstation. 1.3. Document structure This report is divided into seven chapters, an annex and the bibliography. This contains links and references to all sources of research, work and technologies used in the project. The following sections will discuss in greater detail the concepts summarized below: Chapter 1 - Introduction. A first explanation of the basic concepts of the project is made and the motivations that led to the elaboration of this work are developed as well as its objective. Chapter 2 - State of the art. Here it is explained the uses of this technique, it’s present and it’s future projection. Chapter 3 - Methodology and technology. The methodology used to carry out the project is explained and the technologies used are deepened. Chapter 4 - Application Design. Analysis of the graphic design of the interface, from the needs it satisfies, inspiration and an example of use. Chapter 5 - Code architecture and implementation. This chapter delves into the computer code of the project. In it you will see what architecture has been followed and its different parts and functionalities. Chapter 6 - Conclusions and future work. In this, a retrospective of the work that was done and the possible changes and improvements that could be made in future versions are analyzed. Annex. Here you can find a user manual that explains how to use the instrument. Bibliography. A collection of references and hyperlinks to the sources of the research and technologies used to create the project. This document will be written entirely in Spanish, with the exception of Chapters 1, 7 and the Abstract which will be translated to English, following the regulations of the Final Degree Projects of the Complutense University of Madrid. 17
Capítulo 2 Estado del arte La síntesis granular es un modelo de producción de sonidos desarrollado por Iannis Xenakis [7] y Curtis Roads [8, 9], y se basa en la creación de sonidos nuevos a partir de la división de otros sonidos en secciones denominadas granos acústicos o sonic grains. Estos granos suelen durar entre 10 y 50 ms (aunque pueden llegar a ser más largos en función del resultado que se busque) y son comúnmente colocados siguiendo un orden aleatorio. En la figura 2.1 se puede observar una representación gráfica de este proceso. Además, muchos granos suelen reproducirse al mismo tiempo, generando una mayor profundidad en el sonido. Los resultados de esta técnica suelen producir sonidos, manteniendo la textura y carácter del sonido original. Muchos de los usos modernos de este tipo de técnicas de composición se destinan a música ambiental, para composiciones de bandas sonoras de videojuegos o películas y música electrónica moderna, donde ha encontrado muy buena recepción. También destacan su uso en las distintas herramientas para la composición musical, como en la modificación del timbre de un sonido o su duración. Estas técnicas se pueden encontrar por ejemplo en aplicaciones que ajustan la afinación de sonidos sin alterar su duración como es el famoso programa Auto-Tune de Antares. El sonido puede originar por un sintetizador, como uno FM, wavetable o sustractivo, o puede provenir de un sampler, que permitiría cargar uno o varios archivos al mismo tiempo. Un sampler es un programa informático que es capaz de cargar y reproducir archivos de sonido en momentos de tiempo concretos. Estos se suelen utilizar desde la reproducción de un sonido, a mesas de DJ, a un control mucho más preciso como se ve reflejado en los géneros como Hip-Hop,RnB y otros estilos musicales modernos que utilizan técnicas digitales de composición. Figura 2.1: Representación visual de la división de un archivo en granos [15] En la figura 2.2, podemos ver las distintas etapas de la síntesis granular. Primero se selecciona del origen los granos que se quieren reproducir. A continuación se le aplica una envolvente, que gestiona la entrada y salida 19
Desarrollo de Videojuegos UCM del sonido añadiendo un fadein y un fadeout, que significan una entrada gradual de volumen al comienzo y al final de un sonido respectivamente. Por último se suman los granos con su envolvente a la salida en un orden aleatorio. La parametrización en mi proyecto, ha decidido centrarse en la densidad de granos que suenan al mismo tiempo, en controlar la variación de la longitud de estos, la envolvente que se les aplica y poder limitar una sección determinada de donde se pueden extraer los granos del archivo. Al igual que un control general de frecuencias con un ecualizador, para aportar más control del resultado final del sonido. Figura 2.2: Resumen del proceso de la síntesis granular [16] En internet, se pueden encontrar muchos programas de alto nivel que utilizan este algoritmo para la composición de nuevos sonidos, similar al uso que se da en este proyecto. A continuación se encuentran los programas que se han utilizado como referencia: Cecilia [10], Ableton Granulator II [11], GranuRise [12] y AD055 Quanta 2 [13]. Cecilia es del que más ha servido de inspiración y punto de referencia, por ser Open Source, por su facilidad de uso y por ser capaz de crear muy buenos resultados. En la figura 2.3 podemos 20
Desarrollo de Videojuegos UCM observar un ejemplo de Cecilia en funcionamiento, en el que se puede observar su excelente control de la automatización en la parte superior, y de los controladores en la parte inferior que muchos de ellos decidí implementar en mi instrumento también, como es la densidad de granos sonando en cada momento. Figura 2.3: Una captura de Cecilia [10] Muchos músicos ven la síntesis granular como el futuro de la música electrónica y de la música ambiental. Esta tecnología cada vez está siendo más utilizada por todo tipo de artistas y cada vez empieza a ganarse más su espacio entre las grandes formas de síntesis de sonido, no solo por sus usos técnicos explicados anteriormente, sino por su capacidad tan potente y rápida de crear sonidos muy ricos en texturas y profundidad. 21
Capítulo 3 Metodología y tecnología 3.1. Metodología de Trabajo Scrum es una metodología ágil iterativa de trabajo diseñada para poder trabajar en un equipo de manera óptima y eficiente. Esta ha sido la metodología que he utilizado a lo largo de toda la carrera desde el primer curso y es la que he utilizado como base. Scrum se basa en respetar un ciclo de trabajo, llamado sprint de una cantidad de tiempo determinado por el equipo (siendo una, dos o más semanas) en las que se fija unas tareas concretas que se planifican terminar en ese tiempo. Para ello suele haber reuniones frecuentes (diarias o cada unos pocos días) donde se pone en común el trabajo realizado por el equipo y qué problemas han habido para poder actualizar al resto. Aún así, al ser una metodología centrada en el trabajo en equipo, la he seguido como guía para dirigir, organizar y priorizar el trabajo. He hecho esto por ser un proceso orientado a la eficiencia y por su enfoque iterativo sobre el proyecto, que le da mucha mayor flexibilidad a haber seguido uno secuencial como sería un modelo en cascada. Además, estoy muy familiarizado con este sistema de trabajo por haberlo utilizado extensamente durante mis cuatro años cursando el grado, por lo que me resultó natural seguirlo. De esta metodología he utilizado los siguientes elementos, ajustándose a mis necesidades: Product Backlog: También conocido como Icebox, es donde se agrupan todas las tareas que quedan por hacer. El proceso suele partir de un documento de diseño en el que se explica y desarrolla el proyecto, y se convierten en una serie de tareas enfocadas desde la perspectiva del usuario, conocidas como historias de usuario. Estas tareas quedarán planificadas en función de su dificultad y estarán diseñadas para ser lo más concisas y precisas posibles. Por ejemplo, en este proyecto habían historias como: implementar el power-cross fade para sumar los granos entre sí, añadir un botón para cargar un archivo en el sampler, añadir un botón para activar o desactivar el ecualizador de tres bandas. Cabe destacar, que al ser un proceso iterativo, es flexible a errores de planificación y/o de estimación, permitiendo dividir la tarea en varias en caso de ser más complicada de lo previsto. Sprint Planning: Seguí el patrón de sprints para obligarme a tener fechas de entrega y no dejar a un lado el trabajo. En esta planificación elegía que tareas eran las más prioritarias para cumplir en el tiempo que me pusiera. Sprint Backlog: Este es una lista de historias de usuario que se están realizando durante el Sprint, tanto las que ya están terminadas, las que se están trabajando en ese momento, o las que aún quedan por empezar. El objetivo que me propuse en el Sprint Planning es terminar este backlog por completo al terminar. Sprint Review: Convencionalmente, en esta fase se evalúa si se necesita añadir o retirar historias del backlog por problemas que hayan surgido de planificación, para mejorar la estimación de próximos sprints y de optimizar en el que están. En mi caso, al estar solo, solía hacer una revisión diaria del sprint para evaluar la cantidad adecuada de trabajo que sería capaz de realizar. 23
Desarrollo de Videojuegos UCM Sprint Retrospective: En esta fase se suele evaluar cómo ha sido el sprint actual y si se ha planificado y estimado correctamente. Al haber evaluado diariamente el sprint, aprovechaba esta sesión para analizar posibles errores de estimación que hubiera podido realizar, al igual que problemas que hubiera podido encontrar en mi proceso de trabajo. En la figura 3.1 podemos observar un diagrama en el que se representan las distintas fases de Scrum explicados anteriormente, al igual que se refleja la naturaleza iterativa del proceso, tanto en los Daily Scrum como en los sprints. Figura 3.1: Esquema de la metodología Scrum [17] 24
Desarrollo de Videojuegos UCM de frecuencias, y el efecto al completo. Este fue añadido, además de para aportar más control del sonido final, para poder mitigar la saturación de frecuencias que se podían producir, es decir, que por la naturaleza aditiva de la síntesis, muchos granos se sumen en la misma frecuencia generando sonidos no deseados en esa región, empastando el sonido. 4.2. Inspiración Como fuente de inspiración, quise centrarme en sintetizadores modulares analógicos. De estos quise centrarme en el aspecto de colocar los parámetros de distintas funcionalidades juntas, en secciones divididas entre sí y en el control de estos parámetros con controladores circulares, simulando un potenciómetro analógico. En la figura 4.2, se puede ver un ejemplo de un sintetizador de este tipo, y la clara división en secciones de sus funcionalidades. Otro motivo para seguir este tipo de diseño, es que muchos otros programas ya siguen este tipo de diseño, ayudando a familiarizarse más rápidamente con el programa a la gente que ya tiene experiencia con este tipo de software. Para la paleta de color, he decidido llevarlo a un estilo más futurista, utilizando colores vibrantes emulando el efecto neón. Esto lo he hecho así ya que la síntesis granular suele estar concebida con un estilo más futurista. En la figura 4.1 se ven dos sintetizadores en el que se ven los colores vibrantes neón y el uso de diales circulares para controlar los parámetros de la composición. Ambos son plugins predeterminados del DAW FL Studio. (a) Una captura de Harmor por ImageLine (b) Una captura de SimSynth por ImageLine Figura 4.1: Sintetizadores digitales de los que me inspire 31
Desarrollo de Videojuegos UCM Figura 4.2: Un ejemplo de un sintetizador modular analógico [18] 4.3. Resultado En el resultado final, visible en la figura 4.3, se pueden ver gran parte de las influencias de las que se habla en el punto anterior. Se ve la importancia de los diales circulares y los colores vibrantes y de neón al igual que distintas formas de representar el audio, tanto con un analizador de frecuencias como con una gráfica que representa el archivo que tiene cargado el programa y los distintos picos de volumen a lo largo del tiempo. También se ve la división por regiones de las distintas funcionalidades, siguiendo las leyes de la Gestalt [30] y el diseño de un sintetizador modular analógico, al igual que los programas de ejemplo que hice referencia en el anterior punto. Figura 4.3: La interfaz gráfica completa del instrumento 32
Desarrollo de Videojuegos UCM 4.3.1. Sampler En esta sección del programa es donde se encuentra la capacidad de cargar un archivo de audio, reproducirlo sin ser modificado por la síntesis granular, que es el botón verde superior, y reproducirlo con el tratamiento del algoritmo, que es el inferior. Al pulsar uno de estos botones verdes, el botón rojo de su derecha se iluminará, permitiendo detener su ejecución. Si se pulsa el otro botón verde, también se detendrá. El botón gris de la izquierda es el que se utiliza para cargar los archivos de audio, y lanzará una ventana del sistema operativo para elegir el archivo. En la figura 4.4, se puede observar como cambia la interfaz, de la imagen (a) a la (b), al cargar exitosamente un archivo, tanto representado en la parte inferior como activando los dos botones verdes para los distintos tipos de reproducciones. (a) El sampler sin un archivo de audio al iniciar (b) El sampler con un archivo de audio Figura 4.4: El sampler 4.3.2. Síntesis granular Los controladores de la síntesis granular se dividen en dos regiones. La superior representada en la imagen (a) de la figura 4.5, donde se controla la densidad de los granos que se reproducen al mismo tiempo en porcentaje, es decir, que al 100 % hay un grano sonando y la ganancia o volumen de estos. En la parte inferior, representada en la imagen (b) de la misma figura, se encuentran los controladores de los rangos, tanto de la duración de los granos, al igual que del rango donde se pueden extraer del archivo. También se encuentran los controladores de la envolvente de los granos, es decir, el algoritmo y los parámetros que utilizan las distintas maneras en las que los granos comienzan y terminan de reproducirse. (a) Sección superior del módulo (b) Sección inferior del módulo Figura 4.5: Secciones de los controladores de la síntesis modular En la figura 4.6 se pueden ver las distintas configuraciones que se pueden asignar a la envolvente de los granos. Al modificar el dial de mayor tamaño, los diales más pequeños de la derecha se modifican, ajustándose a los parámetros de cada envolvente. En el caso del ADSR, el primer dial desde arriba marca la distancia desde el comienzo hasta el valor del ataque, desde ese valor hasta el siguiente será el decay, de la misma manera con el siguiente dial es el sustain y el resto es reservado para el release. Tanto en el envolvente lineal y sinusoidal el dial superior marca la duración del fade in, y el inferior el del fade out. 33
Desarrollo de Videojuegos UCM (a) Envolvente ADSR (b) Envolvente lineal (c) Envolvente sinusoidal Figura 4.6: Distintos tipos de envolventes de los granos 4.3.3. Ecualizador El ecualizador se divide en dos secciones. En la parte superior en la que se representan las distintas frecuencias de los dos canales, izquierdo en azul y derecho en naranja. También se encuentra una línea blanca que representa el efecto del ecualizador sobre las frecuencias y dos botones verdes en la parte superior: el de la izquierda para apagar todo el ecualizador, y el derecho para desactivar el analizador. En la parte inferior se encuentran los controladores del ecualizador. En orden de izquierda a derecha se encuentra el filtro low-cut, el filtro de banda y el filtro hi-cut. Los dos filtros de corte tienen dos diales, uno que controla la frecuencia, y un segundo que controla la intensidad de la pendiente del filtro. En el caso del de banda, hay tres controladores, uno para la frecuencia del filtro, otro para la ganancia en estas frecuencias y un tercero que marca cuan ancho es el filtro, es decir, cuanto afecta a las frecuencias vecinas. En la figura 4.7 se puede ver el ecualizador funcionando, con el low-cut apagado. También se distinguen la representación de ambos canales de sonido, de la línea blanca que muestra el efecto de los filtros en funcionamiento y de los distintos efectos que puede tener modificar los filtros en distintas maneras. 34
Desarrollo de Videojuegos UCM Figura 4.7: El ecualizador de tres bandas 4.4. Ejemplo de uso A continuación se encuentra el enlace a un vídeo en el que se muestra un ejemplo de uso con anotaciones de cada sección del instrumento: https://www.youtube.com/watch?v=W7c8ZrscYrM 35
Capítulo 5 Arquitectura e implementación del código 5.1. Arquitectura La arquitectura base que ha seguido mi proyecto ha sido la del modelo que viene por defecto al crear un proyecto de aplicación de sonido con Projucer. Este modelo tiene dos hebras en funcionamiento, la primera para el procesado de audio, que es la hebra más importante y la que lanza la segunda, que es el editor visual del programa. Esta primera es capaz de funcionar sin la segunda, pero el editor es incapaz de funcionar sin la de procesado. Estas funcionan desde los archivos PluginProcessor yPluginEditor respectivamente. Ambos archivos tienen el ciclo principal de cada hebra, al igual que los componentes que utiliza cada una. La comunicación entre las dos hebras sólo se genera por los parámetros de entrada y salida del instrumento. Al ser estos modificados desde la hebra del editor, se necesita enviar los nuevos valores modificados mediante un sistema de listeners de vuelta a la hebra de procesado. Como observación, algunos de los controles del proyecto están limitados por otros del instrumento, ya que suelen ser el límite superior que no puede superar. Esto se comunica desde la hebra del procesado al editor, y requiere de una serie de Mutex solo al modificar uno de los dos parámetros para evitar errores durante la ejecución. 5.2. Plugin Processor En este archivo, encontramos toda la funcionalidad y elementos necesarios para poder procesar el audio, desde su lectura de un archivo y reproducción, a la división en granos, la reproducción de estos y su posible ecualización. Los métodos más importantes y que más he modificado de esta clase son: prepareToPlay() En este se inicializan y cargan todos los recursos o configuraciones necesarias antes de comenzar la reproducción. En la figura 5.1, se puede observar este método y cómo se preparan los distintos elementos como el ecualizador y las cadenas que utiliza, un oscilador que se utilizó para pruebas, el sistema de carga de archivos y el tamaño del bloque máximo que deben devolver los granos. 37
Desarrollo de Videojuegos UCM Figura 5.1: Captura del método prepareToPlay() processBlock() Este es el método crítico del programa ya que pide el audio procesado por bloques que se planean reproducir en cada frame del programa. Aquí es donde se deben realizar el procesado del audio para conseguir el resultado objetivo. En la figura 5.2, podemos observar una sección de este método en la que en función de cuál de los dos reproductores está funcionando, copia el bloque correspondiente, al igual que la preparación y procesado del ecualizador en ambos canales y la actualización de la estructura FIFO para el analizador de frecuencias. Figura 5.2: Captura del método processBlock() 38
Desarrollo de Videojuegos UCM createParameterLayout() Es el método donde se declaran y se definen los rangos y tipos de los parámetros con los que se comunicará con el editor bidireccionalmente. En la figura 5.3 se puede observar como se crean estos parámetros. Figura 5.3: Captura del método createParameterLayout() Entre el resto de elementos, encontramos muchos de los métodos necesarios para hacer funcionar la clase padre juce::AudioProcessor, además de los parámetros del programa que serán los que modifique los controles de la interfaz gráfica. Después de estos la clase está dividida en secciones los distintos elementos del procesado por su funcionalidad, y a su vez, la funcionalidad de estas se encuentran en una clase propia. Como observación, dentro de CommonProcessor, se encuentran los elementos básicos del procesador, como definiciones de structs,enums y otro código que usan todas las clases que procesan el audio. 5.2.1. File Buffer Player Esta clase realiza la función de poder leer un archivo de audio, cargarlo y poder reproducirlo en bloques de audio después. Esta no modifica la entrada de ninguna manera. Este tiene un juce::AudioBuffer<float> donde guarda toda la información, y tiene un sistema de estados del tipo TransportState en el que puede tener un estado de parado, empezando, reproduciéndose y parándose. 39
Desarrollo de Videojuegos UCM Los métodos más importantes de esta clase son setState(), que cambia el estado del reproductor, copyNextBlockFromBufferFileTo(), que realmente copia el siguiente bloque de audio en el buffer de entrada, ysetBuffer(), que cambia el buffer de origen, cambiando el archivo que reproduce. 5.2.2. Granular Sampler Esta clase realiza la función de un sampler granular, utilizando el File_Buffer_Player para cargar el archivo y leerlo, y usa el mismo sistema de estados que la clase. Además este se encarga de crear, gestionar y sumar distintos granos para poder reproducirlos a tiempo real. Los métodos más significativos son getNextAudioBlock(), en el que se crean, reproducen y liberan los granos que se van a reproducir, y changeState(), donde se puede cambiar el estado del sampler. Los granos se implementan a través de la clase Garin, donde se guardan los valores de la reproducción de cada grano individual, como los rangos de duración, la sección de sonido del archivo y métodos para aplicar la envolvente correspondiente. Además, la gestión de los granos se hace a través de un diseño de pool, es decir, que los granos solo se construyen al comienzo del sampler, y después se van reciclando a medida que se vean utilizando. 5.2.3. EQ Processor En este archivo encontramos gran parte de la implementación necesaria para realizar los cálculos del ecualizador del instrumento. Estas se componen principalmente de definiciones de nombres, structs y enums y de algunos métodos template que se utilizan durante el procesado de audio para componer el filtro. Para hacer funcionar el ecualizador, se añade el módulo juce_dsp (Digital Signal Processing) al proyecto, que aporta gran parte del cálculo de los filtros que se aplican, como las FFT (Fast Fourier Transforms), utilizadas en el analizador de frecuencias, o IIR (Infinite Impulse Response filters), aplicado en este archivo [29]. El ecualizador funciona utilizando una serie de filtros importados del módulo juce_dsp, explicado arriba. Al llegar al método del procesado de audio processBlock(), primero se actualizan los filtros según los parametros actuales del instrumento. Después se procesan ambos canales al aplicarse por la cadena de filtros (llamada en el código MonoChain). Al ser ecualizador lo último que se procesa, se acaba enviando el resultado a una estructura FIFO (First In, First Out), donde se prepara para que el analizador de frecuencias pueda convertir mediante transformaciones de Fourier (FFT), en una línea para su renderizado. 5.3. Plugin Editor En este archivo encontramos todos los componentes gráficos de la interfaz, al igual que referencias al procesador de audio y los métodos necesarios para crear y renderizar una interfaz gráfica con JUCE. Todas las implementaciones de los métodos se encuentran en el archivo PluginEditor.cpp. En el constructor de esta clase, podemos ver cómo se configuran los componentes al igual de cómo se asocian a los parámetros de la otra hebra. También se ve cómo se configuran funciones para los botones y se añade un LookAndFeel, que se utilizará para ajustar el diseño de la aplicación. También se ve cómo se crea la ventana con un tamaño determinado de píxeles. En el destructor, se destruye la referencia al LookAndFeel de los componentes. La función de renderizado que se utilizará para crear la aplicación será la de resized(), dejando paint() como una función de borrado de pantalla. Esto mejora el rendimiento del programa ya que solo volverá a renderizar ciertos elementos que necesiten ser renderizados, en vez de continuamente. En resized(), es donde se asignará a cada elemento su correspondiente área de renderizado, permitiendo que se puedan pintar en pantalla. En la figura 5.4 se puede observar una sección del método resized(), donde se puede observar como se asignan las secciones de interfaz gráfica a cada elemento. 40
Desarrollo de Videojuegos UCM 6.2. Future work Although the work has been completed according to my original vision, I followed a modular design considering the possibility that it could be expanded in the future. Due to the nature of the project, there are many ways in which it can be further developed. These are some of the possible expansions or improvements that could be implemented: Improving the graphical interface: Having focused on the development of the application at a technical level, I would have liked to have spent more time designing the graphical interface, and to have gotten people with knowledge of the subject helping with the design. Optimize the performance of the code: To be more specific, on slower computers the performance of the program suffers quite a bit when playing a large number of grains, especially if they are short. For this, the management of grains playing could be improved. Increase the number of grain parameters: The greater the number of parameters, the more freedom the user would have in modifying the resulting sound. An example could be the modification of the pitch or frequencies of the grains that are reproduced, the modification of the panning, that is the control to reproduce the amount of grains playing on the left or right channel or increase the control of the origin of each grain. Improve the implementation of the Power-Cross-Fade algorithm: This is used to get a volume close to the sound of the file when performing grain addition. In this project, it was only possible to carry out an initial investigation of the problem, reaching a satisfactory, but not optimal, result, and it should be possible to investigate the possibility of applying this algorithm to a number Nof sounds in a mathematically precise manner, and not the approximation used. Add the possibility to import more than one file as a source: This would allow mixing the different textures of several files, making the resulting sound more complex and interesting. Add a compressor: This module would help mitigate audio files with very strong attacks, allowing the sound of the grains to match each other and achieve an even more monotonous volume effect in the resulting sound. Improve the frequency analyzer: This works with a FFT algorithm that even if working, has very low resolution, especially in the lower frequencies. As a solution, more sophisticated algorithms could be sought for its implementation, or combining multiple FFT passes into one. Add MIDI input for pitch modification: This tool would change the behavior of the instrument from a sampler to something more like a synthesizer, allowing you to control the frequencies of the grains, but respecting their textures. It would also need to add a overall envelope to control how a key note fades in and out. 47
Anexos A - Manual de usuario - GranularSampler Controles generales El uso de este programa se controla principalmente mediante un ratón informático. Este se utiliza para pulsar con el botón izquierdo de este los distintos botones y controladores del programa. Los controladores pueden ser modificados mediante la rueda del ratón, o arrastrando hacia arriba y hacia abajo al pulsar sobre el controlador. Como observación importante, se puede ajustar con mayor precisión el valor del dial, si al modificarlo se mantiene pulsado el botón control del teclado. Secciones del instrumento Las secciones del instrumento son: en la parte superior de la izquierda se encuentra el sampler; donde se carga el archivo de audio que utilizará la síntesis granular y donde se controla la reproducción del instrumento, la parte inferior de la izquierda; donde se encuentran los controladores de la síntesis granular, y a la derecha el ecualizador, donde se divide arriba en el analizador de frecuencias; y en la parte inferior los controles de los tres filtros; el de pasa baja, alta y el filtro de banda. Figura A.1: El instrument funcionando 49
Desarrollo de Videojuegos UCM Carga de un archivo y reproducción Para cargar un archivo en el instrumento, se debe pulsar el botón superior de la izquierda gris. Este lanzará una ventana del sistema operativo que te permitirá navegar por el dispositivo hasta encontrar el archivo deseado. Una vez seleccionado y añadido, si el instrumento ha cargado correctamente el archivo deberán iluminarse los botones verde de reproducción del archivo y del modelo granular, al igual que se debe representar el archivo de audio debajo de los botones. Como última comprobación, se puede reproducir el archivo de audio pulsando el botón verde superior. Si se quiere parar en cualquier momento se debe pulsar el botón rojo iluminado de la derecha. Este solo se iluminará si se está reproduciendo. Si se quiere comenzar a granular el archivo, se deberá pulsar el botón verde inferior. Este funcionará igual que el que se utiliza para reproducir el archivo. Figura A.2: El selector de archivos de Windows 50
Desarrollo de Videojuegos UCM Control de la granulación Para controlar los granos que se reproducen, se ha de modificar los diales inferiores al sampler. En orden de izquierda a derecha y arriba a abajo, los controladores son: el de la densidad de granos al segundo, en porcentaje (es decir que el 100 % es equivalente a un grano sonando en el momento), el de la ganancia de los granos, los controladores del rango de duración de los granos y rango del archivo de donde se pueden extraer los granos, y un controlador de la envolvente, que permite cambiar y el tipo y controlar los parámetros de cada uno al modificarlo. De las distintas envolventes que hay, el ADSR tiene tres controles. Estos se aplican uno detrás del otro, así que empezando desde el cero hasta el valor del primer controlador es el ataque, del primero al segundo el decay, del segundo al tercero el sustain y del tercero al final el release. Las otras dos envolventes tienen dos controladores que definen el fade in yfade out de la envolvente. (a) Sección superior del módulo (b) Sección inferior del módulo Figura A.3: Secciones de los controladores de la síntesis modular (a) Envolvente ADSR (b) Envolvente lineal (c) Envolvente sinusoidal Figura A.4: Distintos tipos de envolventes de los granos 51
Desarrollo de Videojuegos UCM Control del ecualizador El ecualizador cuenta con tres filtros diferentes, uno de paso bajo y alto, y un tercero de banda. Estos tres se controlan con los diales de la parte inferior, siendo la primera columna del filtro de paso alto, la segunda el filtro de banda y la tercera de paso bajo. Los dos filtros de corte cuentan con un controlador de la frecuencia y uno para ajustar la fuerza con la que se aplica. El de banda tiene tres filtros, que controlan la frecuencia, la ganancia y un tercer controlador que ajusta cuanto afecta a las frecuencias vecinas. Cada filtro cuenta con un botón para desactivar este filtro, y uno general en la esquina superior izquierda para desactivarlo por completo. Además tiene un analizador de frecuencias en la parte superior, que representa en azul el canal izquierdo y en naranja el canal derecho, una linea blanca que representa el efecto del filtro sobre las frecuencias y un botón en la esquina superior derecha para desactivarlo. Figura A.5: El ecualizador de tres bandas 52
Índice de figuras 2.1. Representación visual de la división de un archivo en granos [15] . . . . . . . . . . . . . . . . 19 2.2. Resumen del proceso de la síntesis granular [16] . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.3. UnacapturadeCecilia[10] ..................................... 21 3.1. Esquema de la metodología Scrum [17] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 3.2. La ventana de Projucer delproyecto ................................ 27 3.3. La ventana de AudioPluginHost utilizada durante el desarrollo. . . . . . . . . . . . . . . . . . 27 3.4. Una captura del Trello demiproyecto............................... 28 4.1. Sintetizadores digitales de los que me inspire . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 4.2. Un ejemplo de un sintetizador modular analógico [18] . . . . . . . . . . . . . . . . . . . . . . 32 4.3. La interfaz gráfica completa del instrumento . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 4.4. El sampler .............................................. 33 4.5. Secciones de los controladores de la síntesis modular . . . . . . . . . . . . . . . . . . . . . . . 33 4.6. Distintos tipos de envolventes de los granos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 4.7. Elecualizadordetresbandas .................................... 35 5.1. Captura del método prepareToPlay() .............................. 38 5.2. Captura del método processBlock() ............................... 38 5.3. Captura del método createParameterLayout() ......................... 39 5.4. Captura del método resized() ................................... 41 A.1.Elinstrumentfuncionando...................................... 49 A.2. El selector de archivos de Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 A.3. Secciones de los controladores de la síntesis modular . . . . . . . . . . . . . . . . . . . . . . . 51 A.4. Distintos tipos de envolventes de los granos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 A.5.Elecualizadordetresbandas .................................... 52 54
Bibliografía [1] Referencia de la librería JUCE: https://juce.com/ [Último acceso: 14/07/2022] [2] Enlace de Spotify de El Corral de los Quietos: https://open.spotify.com/artist/6VjfONjz3MbMnFh6dBclVo [Último acceso: 14/07/2022] [3] Entrada sobre los DAW de Wikipedia: https://en.wikipedia.org/wiki/Digital_audio_workstation [Último acceso: 14/07/2022] [4] Entrada sobre los VST de Wikipedia: https://en.wikipedia.org/wiki/Virtual_Studio_Technology [Último acceso: 14/07/2022] [5] Entrada de Steam de la empresa Mad Cream Games: https://store.steampowered.com/developer/MadCreamGames/?utm_source=tfg [Último acceso: 14/07/2022] [6] Enlace de Steam del videojuego Painting Werther: https://store.steampowered.com/app/1434260/Painting_Werther [Último acceso: 14/07/2022] [7] Entrada sobre Iannis Xenakis de Wikipedia: https://es.wikipedia.org/wiki/Iannis_Xenakis [Último acceso: 14/07/2022] [8] Página web de Curtis Roads: https://www.curtisroads.net/ [Último acceso: 14/07/2022] [9] Roads, Curtis (2001). Microsound. Cambridge: MIT Press. ISBN 0-262-18215-7. [10] Enlace de Cecilia, el instrumento virtual: http://ajaxsoundstudio.com/software/cecilia/ [Último acceso: 14/07/2022] [11] Enlace del plugin de ableton de granulación: https://www.ableton.com/en/packs/granulatorii/ [Último acceso: 14/07/2022] [12] Enlace del instrumento virtual GranuRise: https://granurise.com/ [Último acceso: 14/07/2022] [13] Enlace del instrumento virtual Quanta 2: https://www.audiodamage.com/products/ad055quanta-2 [Último acceso: 14/07/2022] [14] Enlace a los distintos proyectos profesionales creados por JUCE: https://juce.com/discover/made-with-juce [Último acceso: 14/07/2022] 55
Desarrollo de Videojuegos UCM [15] Fuente de una de las imágenes explicativas de la granulación: https://ears2.dmu.ac.uk/es/courses/sonidos-generados/lessons/sintesis-granular [Último acceso: 14/07/2022] [16] Crossan, A. & Williamson, J. & Murray-Smith, Roderick. (2004). Haptic granular synthesis: Targeting, visualisation and texturing. Proceedings of the International Conference on Information Visualization. 8. 527532. 10.1109/IV.2004.1320195. [17] Fuente de la imágen utilizada para explicar el SCRUM: https://www.plainconcepts.com/es/scrum-que-es/ [Último acceso: 14/07/2022] [18] Fuente de la imágen de ejemplo de un sintetizador granular: https://www.hispasonic.com/anuncios/sintetizador-modular-eurorack-completotambien-cambio/1039582 [Último acceso: 14/07/2022] [19] Enlace al módulo de Python, PYO, para el procesado de señales: http://ajaxsoundstudio.com/software/pyo/ [Último acceso: 14/07/2022] [20] Enlace al módulo de Python, PyAudio, para la gestión E/S de audio: https://pypi.org/project/PyAudio/ [Último acceso: 14/07/2022] [21] Enlace a los tutoriales de JUCE: https://juce.com/learn/tutorials [Último acceso: 14/07/2022] [22] Enlace a la compañía que creo algunos de los tutoriales que seguí para familiarizarme con JUCE: https://www.freecodecamp.org/ [Último acceso: 14/07/2022] [23] Enlace a YouTube de uno de los videos de Free Code Camp: https://www.youtube.com/watch?v=i_Iq4_Kd7Rc [Último acceso: 14/07/2022] [24] Enlace a YouTube de uno de los videos de Free Code Camp: https://www.youtube.com/watch?v=Mo0Oco3Vimo [Último acceso: 14/07/2022] [25] Enlace a la API de JUCE: https://docs.juce.com/master/index.html [Último acceso: 14/07/2022] [26] Enlace a la documentación del lenguaje de programación de C++: https://cplusplus.com/reference/ [Último acceso: 14/07/2022] [27] Enlace a la página web del IDE Visual Studio: https://visualstudio.microsoft.com/es/[Último acceso: 14/07/2022] [28] Enlace al repositorio de GitHub del proyecto: https://github.com/NicoPast/GranularSampler-TFG [Último acceso: 14/07/2022] [29] Enlace al tutorial de uso del módulo de DSP de JUCE: https://docs.juce.com/master/tutorial_dsp_introduction.html [Último acceso: 14/07/2022] [30] Entrada de las leyes de la Gestalt de Wikipedia: https://es.wikipedia.org/wiki/Psicología_de_la_Gestalt [Último acceso: 14/07/2022] [31] Enlace al trello del proyecto: https://trello.com/b/Qz8n9nCY/granularsampler [Último acceso: 14/07/2022] 56