scieee AI-readable full text Open interactive document viewer

Repositorio Institucional de Documentos

Abstract

El audio procedural es una técnica que puede ser empleada, entre otras cosas, para la programación de videojuegos y, aunque ha sido utilizada en diferentes trabajos, no ha sido desarrollada del mismo modo que las técnicas de síntesis y generación de imágenes. En este proyecto, se ha realizado una inmersión en la disciplina del audio procedural y sintético, intentando comprender las técnicas y las características propias de la materia, y utilizarlas para implementar una serie de efectos de sonido que se puedan aplicar a diferentes escenas interactivas mediante el software de programación gráfica Pure Data. Para dar soporte a estos efectos implementados, se ha recreado gráficamente un entorno montañoso en un entorno de programación de videojuegos denominado Unity, en el cual un personaje principal interactúa con el ambiente, provocando eventualmente con sus acciones la reproducción de estos efectos de sonido. Posteriormente, se ha utilizado el protocolo OSC para comunicar ambas plataformas. El “feedback” creado por la interacción del usuario por medio del personaje principal en la escena es traducido a mensajes OSC e interpretado con Pure Data para reproducir de manera adecuada los efectos de sonido. Finalmente, con la experiencia obtenida en el desarrollo del trabajo, se han extraído ciertas conclusiones sobre el papel del audio procedural en un futuro en el mundo de los efectos de sonido. Pina Lagunas, Sergio; Beltrán Blázquez, José Ramón

Full text

Proyecto Fin de Carrera Ingeniería de Telecomunicaciones Síntesis de sonido interactiva para videojuegos mediante Unity y PureData Autor Sergio Pina Lagunas Director José Ramón Beltrán Blázquez Escuela de Ingeniería y Arquitectura Septiembre de 2014 2 Síntesis de sonido interactiva para videojuegos mediante Unity y Pure Data 3 Sergio Pina Lagunas 4 Síntesis de sonido interactiva para videojuegos mediante Unity y Pure Data 5 Sergio Pina Lagunas Agradecimientos El viaje llega a su fin y no puedo decir que no haya disfrutado del camino. Este documento cierra una etapa de mi vida y abre otra y me gustaría recordar aquí a los que, de alguna manera, han puesto su granito de arena para no olvidarla nunca. En primer lugar, me complace mostrar mi agradecimiento y respeto a mi tutor en el desarrollo de este Proyecto Fin de Carrera, José Ramón Beltrán Blázquez, por darme la oportunidad de realizar un trabajo estimulante, compartir conmigo sus valiosos conocimientos y experiencia y prestarme su inestimable ayuda y valioso tiempo cuando los he necesitado. Me gustaría también en estas líneas acordarme del resto de profesorado en general, y del relacionado con la Ingeniería de Telecomunicaciones en particular. Con algunos he tenido desavenencias, con otros la relación ha sido fluida y enriquecedora, y con otros, simplemente, indiferente. Pese a ello, con los años uno se da cuenta del talento que hay en la Escuela de Ingeniería y Arquitectura y lo mucho y duro que han tenido que pelear para alcanzar sus puestos. Mi respeto y admiración también va para ellos. Mención especial merecen los soldados que me han acompañado en esta guerra. Los que ya están colocados, incluso fuera de casa, los que están intentando colocarse, y los que todavía les falta finiquitar el asunto. Compañeros de buenos y malos momentos, de juergas, de viajes y de horas de biblioteca. ¡Gracias a todos, huevazos! Tampoco puedo dejar de recordar a las amistades que me acompañan desde que apenas sabía poner una palabra detrás de otra con sentido. Sin los buenos momentos que me sacaban de la rutina y sin el apoyo y desconexión que me proporcionaban, el camino habría sido mucho más largo y duro o, quién sabe, tal vez no habría llegado a buen puerto. Gracias a mis amigos de más allá de los Pirineos, aunque no puedan entender estas palabras. Nunca podré olvidar las experiencias vividas durante el curso 2012/2013 en Göteborg, a toda la gente y los buenos momentos. Nos vemos en la próxima. Gracias a Elena, por, de una forma u otra, estar siempre ahí, especialmente en las duras. Gracias por tener siempre la palabra amable que necesito y el abrazo reconfortante. Eres la mejor. A mi abuelo, cuya única preocupación que prácticamente le quedaba en la vida era llegar sano a este día y que lleva meses con el traje preparado. Y por último, solo me queda acordarme de las dos personas con las que empezó todo. Nunca podré compensar a mis padres lo que han hecho por mí, nunca podré agradecerles lo suficiente los esfuerzos y sacrificios que han hecho para sacarme adelante. Infinitas gracias por el apoyo, por la educación, por poner los cimientos de la persona que soy, por inculcarme los valores de la honestidad y el esfuerzo, por aguantarme en mis momentos malos, por apoyarme en los momentos más bajos. Sois los principales responsables de que esté hoy aquí. ¡Muchas gracias a todos! 6 Síntesis de sonido interactiva para videojuegos mediante Unity y Pure Data 7 Sergio Pina Lagunas Resumen El audio procedural es una técnica que puede ser empleada, entre otras cosas, para la programación de videojuegos y, aunque ha sido utilizada en diferentes trabajos, no ha sido desarrollada del mismo modo que las técnicas de síntesis y generación de imágenes. En este proyecto, se ha realizado una inmersión en la disciplina del audio procedural y sintético, intentando comprender las técnicas y las características propias de la materia, y utilizarlas para implementar una serie de efectos de sonido que se puedan aplicar a diferentes escenas interactivas mediante el software de programación gráfica Pure Data. Para dar soporte a estos efectos implementados, se ha recreado gráficamente un entorno montañoso en un entorno de programación de videojuegos denominado Unity, en el cual un personaje principal interactúa con el ambiente, provocando eventualmente con sus acciones la reproducción de estos efectos de sonido. Posteriormente, se ha utilizado el protocolo OSC para comunicar ambas plataformas. El “feedback” creado por la interacción del usuario por medio del personaje principal en la escena es traducido a mensajes OSC e interpretado con Pure Data para reproducir de manera adecuada los efectos de sonido. Finalmente, con la experiencia obtenida en el desarrollo del trabajo, se han extraído ciertas conclusiones sobre el papel del audio procedural en un futuro en el mundo de los efectos de sonido. 8 Síntesis de sonido interactiva para videojuegos mediante Unity y Pure Data 9 Sergio Pina Lagunas Índice general Capítulo 1: Introducción……………………………………………………………………………………………13 1.1. ¿Qué es el Audio Procedural?…………………………………………………………………………….13 1.2. Herramientas utilizadas……………………………………………………………………………………..18 1.2.1 Pure Data……………………………………………………………………………………………..18 1.2.2 Unity 3D……………………………………………………………………………………………….19 1.2.3 Herramientas secundarias……………………………………………………………………19 1.3. Motivación………………………………………………………………………………………………………….20 1.4. Objetivos…………………………………………………………………………………………………………….20 Capítulo 2: Estado del arte…………………………………………………………………………………………23 2.1. Historia y nombres relacionados con el Audio Procedural………………………………….23 2.2. Pisadas………………………………………………………………………………………………………………..23 2.3. Efectos relacionados con el agua y fluidos………………………………………………………….24 2.4. Fuego………………………………………………………………………………………………………………….25 2.5. Animales…………………………………………………………………………………………………………….25 2.6. Objetos sólidos…………………………………………………………………………………………………..26 Capítulo 3: Efectos de sonido en Pure Data……………………………………………………………….27 3.1. Programación gráfica en Pure Data…………………………………………………………………….27 3.1.1. Objetos y conexiones………………………………………………………………………….27 3.1.2. Mensajes, símbolos y comentarios……………………………………………………..28 3.1.3. Objetos GUI…………………………………………………………………………………………28 3.1.4. Principales objetos utilizados………………………………………………………………29 3.1.5. Grabaciones…………………………………………………………………………………………30 3.2. Cascada…………………………………………………………………………………………………………..…..30 3.3. Riachuelo…………………………………………………………………………………………………………….32 3.4. Viento………………………………………………………………………………………………………………….36 3.5. Lluvia……………………………………………………………………………………………………..……………38 3.6. Fuego………………………………………………………………………………………………………………….40 3.7. Truenos………………………………………………………………………………………………………………44 16 Síntesis de sonido interactiva para videojuegos mediante Unity y Pure Data -Sonido inteligente Una clase de métodos algorítmicos, más complejos que las secuencias matemáticas, son los conocidos como algoritmos de inteligencia artificial (IA). Todos los algoritmos utilizan algún tipo de memoria para almacenar variables intermedias como los últimos dos o tres valores computados, pero éstos son normalmente descartados inmediatamente para ahorrar espacio. Un algoritmo de IA es mucho más persistente, mantiene la información de estado y de entradas a lo largo de la ejecución mientras evalúa nuevas entradas. Cuando a un secuenciador generativo se le da información adicional que equivale a conocimiento y capacidad de realizar elecciones basadas en nuevas entradas, decimos que es de IA. La información de entrada es procesada por filtros y reconocedores de patrones que llaman a acciones que producen una salida en forma de audio acorde con la entrada. Típicos ejemplos son los llamados sistemas expertos, redes neuronales, algoritmos genéticos o los autómatas celulares [1]. -Audio Procedural El concepto de “audio procedural” está compuesto por dos términos. Una definición para el adjetivo procedural es aquello que está relacionado con la manipulación de símbolos, conceptos y reglas para completar una tarea o solucionar un problema. Dicho problema se refiere a producir sonido adecuado a una o más restricciones. En definitiva, audio procedural es aquél que depende de ciertos parámetros variables, como una magnitud física, u otro parámetro producido durante una partida en un videojuego para producir una salida que, bien es directamente audio, o son parámetros para controlar una posible salida de audio [1]. Conforme la tecnología ha avanzado ha surgido un problema, el de cómo proveer a las colosales cantidades de contenido requeridas para poblar los mundos virtuales de los videojuegos modernos con efectos de sonido. Mientras la rama dedicada a la apariencia gráfica ha recibido una gran inversión monetaria y atención, la rama del audio no ha sido tan bien cuidada [28]. -Ventajas Las ventajas del audio procedural son que requiere un manejo sobre el código para recrear las condiciones bajo las que se tiene que reproducir cierto sonido, en lugar de tener grabaciones relacionadas con eventos, lo que produce una alta ocupación de memoria. Esto hace que haya posibilidades de incluir jerarquías en las cuales haya códigos que deriven de otros más generales, lo que hace los sistemas, aunque más complejos, más compactos. En el caso de audio grabado previamente, cada muestra debe ser traída desde un almacenamiento secundario a la memoria RAM o, directamente por una tubería al núcleo durante la reproducción, lo que significa que sobrecarga los buses de transmisión. Sin embargo, con el audio procedural solo se ve involucrada la CPU que lo genera. Las 17 Sergio Pina Lagunas instrucciones necesarias para ello son muy pequeñas, lo que apenas tiene repercusión en los buses. La CPU trabaja para computar la información en tiempo real. Este cambio radical tiene importantes efectos en la arquitectura del sistema y el diseño, como el gran aumento de rendimiento en la transmisión de información para otros usos. El anterior modelo requiere que la mayor parte del trabajo se haga por adelantado, previa a la ejecución en la plataforma. Decisiones como los niveles de sonido, el mapeado de eventos referentes al sonido, y elección de efectos son tomadas de antemano. Por otra parte, el audio procedural es altamente dinámico y flexible y aplaza las decisiones hasta el momento de la ejecución mientras se satisfaga el problema del coste de predicción. Esto significa que las elecciones críticas estéticas pueden realizarse durante el proceso final de producción, de forma similar a la postproducción de una película. El equipo así puede concentrarse en las escenas importantes y mezclar música y efectos más eficientemente. Con el audio procedural, los productores o programadores se concentran en el comportamiento y físicas de clases enteras de sonidos, en lugar de trabajar con información recogida previamente y motores de reproducción. El diseñador pasa a trabajar más como un programador. Un objeto de sonido es realmente un método de un objeto del mundo virtual, lo que elimina la división entre los medios visuales y de audio. La ventaja es que, modificando las propiedades del objeto, se modifican también las propiedades del sonido que produce. El audio procedural incorpora versatilidad, unicidad y un nivel de detalle dinámico. Puede ser altamente interactivo con parámetros continuos en tiempo real. La reproducción en segundo plano de información tiene un coste fijo, no importa de qué sonido se trata, siempre requiere del mismo coste computacional. El audio procedural tiene un coste computacional variable, cuanto más complejo es el sonido, mayor cantidad de recursos necesita. Pese a ello, esto supone una gran ventaja. Aunque estéticamente, los sonidos grabados son más reales, una pequeña cantidad de éstos normalmente supera ampliamente una gran cantidad producida con las técnicas del audio procedural en cuanto a recursos consumidos. Si bien es cierto que algunos tipos de sonido son muy difíciles de recrear proceduralmente, otros, como ciertos fenómenos naturales, son más fácilmente recreables y no suponen un gran consumo computacional. Además, añadiendo técnicas de psicoacústica o métodos perceptuales para construir las partes del sonido que nos interesan en una cierta escena o eliminar las frecuencias que no tienen un aporte esencial todavía se puede optimizar más el rendimiento. El coste debido a sonidos periféricos, de esta manera, es altamente reducido [1]. -Desventajas Las desventajas del audio procedural son también palpables. El audio sintético generado dinámicamente no es una panacea. De hecho, hay áreas donde nunca reemplazará al sonido pregrabado. Todavía tiene que hacer frente a algunos problemas de software, tales como cómo manejar el ajuste de fase en los métodos procedurales. Para los efectos de sonido, el realismo es un problema a resolver que parece tener más una categoría política que técnica. Hay voces que reclaman que el audio sintético no es demasiado realista. Un alto grado realismo es posible, pero es algo que no es alcanzable en 18 Síntesis de sonido interactiva para videojuegos mediante Unity y Pure Data todos los campos, como se ve a lo largo del desarrollo del proyecto, y que es inherente a la opinión de cada individuo que escuche un efecto de sonido sintético. El coste variable puede ser también considerado como una desventaja. El coste de producir un efecto sintético es difícil de predecir antes de la ejecución y no se sabe cómo localizar los recursos. Este problema es común a otros métodos de producción de contenidos dinámicos y requiere que, o bien se haga una estimación de estos costes, o producir métodos que bajen su calidad conforme se vayan acabando los recursos en lugar de dejar de reproducirse abruptamente. Otra solución sería reestructurar programas para incluir una etapa de precomputación, pequeños tiempos de carga. Incluso los diseñadores de sonido expertos habituados a la tecnología progresiva, se sienten incómodos con la necesidad de adaptar sus habilidades y aprender a utilizar las nuevas herramientas para generar audio procedural. Hay una enorme industria construida alrededor del modelo que utiliza información recogida previamente en forma de librerías de muestras y el audio procedural es altamente disruptivo con ello. Un simple software basado en un modelo físico para estructuras metálicas podría reemplazar sonidos grabados de campanas, puentes de hierro, puertas, cañones de armas, llaves y otros miles de sonidos con 1KB de código. Aunque parece que el audio procedural está amenazando el rol tradicional de los diseñadores de sonido, no es así. El lugar que esta tecnología tiene que ocupar es la generación automática de sonidos para nuevos proyectos de gran tamaño. Ambos pueden y deben coexistir [1]. 1.2 Herramientas utilizadas 1.2.1 Pure Data Pure Data (en adelante, PD) es una plataforma abierta con un lenguaje de programación gráfico para Windows, Mac OS X y Linux. PD es un poderoso y rápido entorno de desarrollo para audio en comparación a C++, siendo la curva de aprendizaje para artistas como los diseñadores de sonidos de videojuegos mucho más suave. Usar PD le puede dar al diseñador control creativo adicional, además de desarrollar valiosas habilidades y vocabulario para trabajar mejor con codificadores de sonido durante la implementación de prototipos [29]. El motor de PD puede ser fácilmente integrado con otros proyectos, como el plug-in de navegador [30]. PD evita el tiempo gastado compilando cuando se hacen cambios, es posible modificar parámetros y comportamientos de objetos mientras el parche está ejecutándose. Sin embargo, tiene otros inconvenientes como conocer a ciencia cierta el orden de las operaciones, especialmente en parches de gran tamaño. También, cuando el tamaño crece, es difícil llevar una organización clara y entendible. No obstante, la posibilidad de integrar parches más pequeños en otros parches para realizar ciertas operaciones (similarmente al caso de funciones o procedimientos en lenguajes de alto nivel) ayuda a mantener una estructura organizada [31]. 19 Sergio Pina Lagunas 1.2.2 Unity 3D Unity es un poderoso entorno de desarrollo con una gran variedad de herramientas que pueden satisfacer las necesidades de un creador de videojuegos u animaciones. El editor es intuitivo y altamente configurable, permitiendo al usuario una gran libertad a la hora de diseñar su espacio de trabajo [32]. Para el interés del proyecto, que es recrear una escena virtual en tres dimensiones y poblarla con efectos de sonido, Unity es una herramienta muy adecuada. Tiene una curva suave de aprendizaje, que permite crear en un periodo de tiempo razonable la mayor parte de los elementos requeridos para la realización. Dispone de múltiples opciones muy útiles para el desarrollo de audio procedural, así como un entorno amigable. 1.2.3 Herramientas secundarias Si bien el grueso del proyecto se basa en la implementación de la escena en Unity 3D y la de los efectos de sonido en PD, otras herramientas secundarias complementarias a estas dos han sido utilizadas a lo largo de la elaboración del proyecto: -Matlab: es un lenguaje de alto nivel y un entorno interactivo para el cálculo numérico, la visualización y la programación. Mediante Matlab, es posible analizar datos, desarrollar algoritmos y crear modelos o aplicaciones. El lenguaje, las herramientas y las funciones matemáticas incorporadas permiten explorar diversos enfoques y llegar a una solución antes que con hojas de cálculo o lenguajes de programación tradicionales, como pueden ser C/C++ o Java. Se puede utilizar en una gran variedad de aplicaciones, tales como procesamiento de señales y comunicaciones, procesamiento de imagen y vídeo, sistemas de control, pruebas y medidas, finanzas computacionales y biología computacional. Más de un millón de ingenieros y científicos de la industria y la educación utilizan Matlab, el lenguaje del cálculo técnico [37]. En este proyecto se ha utilizado la punta del iceberg de las posibilidades de Matlab para obtener las representaciones gráficas de las señales temporales y espectrales de los diferentes efectos de sonido. -Adobe Audition: es un completo conjunto de herramientas que incluye funciones de forma de onda, visualización espectral y multipista. Este potente programa de edición de sonido se ha diseñado para acelerar los flujos de trabajo de la producción de audio y vídeo y ofrecer los más elevados estándares de calidad de sonido [38]. Esta herramienta ha sido utilizada por la simplicidad del método de obtención de los espectrogramas en una grabación, útiles a la hora de la implementación de los efectos, para lo que bastaba la opción de prueba. -Xamarin Studio: entorno de desarrollo para diversas plataformas en diferentes lenguajes. En este caso, se ha utilizado para el desarrollo de los “scripts” en C# que dan vida a la escena en Unity 3D. 20 Síntesis de sonido interactiva para videojuegos mediante Unity y Pure Data 1.3 Motivación Ya se han comentado las diferentes características de la disciplina del audio procedural, se han expuesto sus puntos débiles y sus puntos fuertes, así como se ha realizado una contextualización sobre en qué situación se encuentra, qué problemas intenta resolver y que direcciones tomará en el futuro. En un mundo en el que la tecnología informática en general, y las herramientas de desarrollo de videojuegos en particular, avanzan a un ritmo considerable, es necesario proveer de un adecuado sistema de generación de sonido a los productos de entretenimiento electrónico de última generación. Las técnicas de audio procedural y los resultados que son capaces de generar poseen lo necesario para ocupar un lugar de importancia en estos sistemas, rellenan ciertos vacíos que dejan algunas de las opciones existentes, a la vez que dejan una puerta abierta a la experimentación y la creatividad. No sólo se trata de mejorar estética y cualitativamente el resultado final, con las técnicas de audio procedural también se puede mejorar el rendimiento del hardware encargado de la reproducción, ya estemos hablando de un ordenador o una videoconsola. Generar audio en tiempo real tiene un coste computacional en ocasiones considerablemente menor (coste variable tratado anteriormente), a la vez que supone un ahorro considerablemente mayor de memoria de almacenamiento. En tiempos en los que el hardware tiene que mover motores gráficos capaces de representar entornos y personajes muy detallados, a la vez que maneja un número cada vez mayor de elementos diferenciados, cualquier ahorro en este sentido será muy bienvenido para los desarrolladores. Más allá de lo ya mencionado, estamos ante un campo de estudio relativamente joven y poco explotado, con un potencial muy grande, en el que con matemáticas y conocimientos de desarrollo y procesado de señal se pueden realizar avances y aportes que marquen la diferencia. 1.4 Objetivos Habiendo dejado ya claros los motivos que han llevado a la realización de este proyecto, se exponen a continuación los objetivos a satisfacer y que serán posteriormente discutidos. 1. El estudio y la inmersión en el campo del audio procedural, así como de las principales herramientas de desarrollo y posibilidades. 2. Recreación de una cantidad de efectos de sonido utilizando las técnicas de audio procedural mediante dichas herramientas de desarrollo. 21 Sergio Pina Lagunas 3. Integración de dichos efectos de sonido en una representación en tres dimensiones de un entorno natural. Está escena estará protagonizada por un personaje que interactuará con elementos ajenos a él y que, en consecuencia, generará los efectos de sonido ya comentados para intentar provocar una sensación de inmersión e identificación con el usuario. 22 Síntesis de sonido interactiva para videojuegos mediante Unity y Pure Data 23 Sergio Pina Lagunas Capítulo 2: Estado del arte 2.1 Historia y nombres relacionados con el audio procedural El audio procedural entendido como alternativa para proporcionar efectos de sonido a videojuegos frente a la tradicional grabación en estudios o el audio sintético generado mediante chips y tarjetas de sonido tradicional de las décadas de los 80 y 90 es relativamente joven. No existe demasiado conocimiento de la disciplina y el número de desarrolladores que le dedican tiempo y esfuerzo es bajo a día de hoy. El investigador y programador británico Andy Farnell con su libro “Designing Sound” es la figura más representativa del campo, la que ha profundizado más en la teoría y las técnicas que se emplean para en la materia. Perry Cook, investigador de la Universidad de Princeton, autor del “Sysnthesis Toolkit” y de relevantes libros de síntesis de audio en tiempo real, Kees van den Doel, investigador y experto en parametrización y modelado o Eduardo Reck Miranda, autor del libro “Computer Sound Design” y experto en implementaciones para música procedural y síntesis de audio son otras figuras importantes de la disciplina[1]. 2.2 Pisadas Uno de los efectos de sonido más populares a la hora de trabajar y que engloba más formas diferentes de atacar el problema es el de las pisadas. Perry Cook propone una solución basada en el análisis de grabaciones sobre diferentes superficies, extrayendo el tempo y las asimetrías entre las pisadas entre el pie izquierdo y el derecho, y un postprocesado en base a estos resultados [2]. Dicho procesado consiste en extraer la envolvente de control de la grabación original, un modelado de partículas denominado “PhISEM” (Physically Inspired Stochastic Event Modelling) en el que se aprovecha que el origen del sonido está, precisamente, en la interacción entre partículas provocada por la fricción y la presión ejercida por el pie al suelo, y la síntesis final. El objetivo de Cook era establecer una comparativa entre las grabaciones reales y los sonidos sintéticos, remarcando al final que es un buen punto de partida, aunque quedaría trabajo por hacer en lo que se refiere a la extracción de la envolvente, la resonancia y extracción de los parámetros de partículas. Bresin, Friberg y Dahl proponen en su trabajo un modelo para controlar efectos de sonido basados en modelos físicos [3]. Para ello utilizan grabaciones de sonidos de pisadas caminando y corriendo, sobre los que realizan unos estudios frecuenciales y temporales, además de analizar otras características como el tempo. Bresin, esta vez junto a Fontana, y apoyándose en su trabajo anterior, implementó en Pure Data un sintetizador de sonidos de pisadas y crujidos de latas aplastándose [4]. La implementación consiste en generar un controlador del sonido en base al tempo de paso y a si el sujeto está caminando o corriendo, y aplicar las características frecuenciales previamente estudiadas. 24 Síntesis de sonido interactiva para videojuegos mediante Unity y Pure Data Pathon, en su tesis para completar el Máster en la Universidad de Limerick, utilizando Pure Data y Python implementó un modelado de pisadas utilizando “síntesis substractiva” que responde dinámicamente a las interacciones entre el usuario y el videojuego y explorar la aplicabilidad del audio procedural en dicho campo[5]. Para ello se basó en el trabajo de Farnell (del que obtuvo personalmente consejo directo), Cook, Fontana y Morreale. 2.3 Efectos relacionados con el agua y fluidos Siendo el agua el fluido por excelencia, se puede aplicar el conocimiento físico existente para generar efectos sonoros producidos por la interacción del líquido con otros elementos bajo diferentes circunstancias. Zheng y James propusieron un método de síntesis automática de sonidos basados en la creación de burbujas, vibración, radiación y advección [6]. El sistema simula un flujo con burbujas, para cada burbuja aproxima la superficie de vibración entre el fluido y el aire y la presión sonora resultante y realiza una superposición lineal para el oyente. Milavcic, Zita y Arvidsson aplicaron el modelado físico para la síntesis de un sonido de lluvia. Implementaron un simulador en tiempo real de grandes celdas de gotas de lluvia impactando sobre superficies sólidas y líquidas [7]. Aprovecharon la similitud entre el sonido del impacto de una gota y el de la explosión de una burbuja para su sistema, además de modelos matemáticos partiendo de ecuaciones de ondas. Añadieron a la representación un equipo de múltiples altavoces, situando al oyente dentro de un área delimitada por ellos, variando el volumen de cada altavoz a la hora de representar el sonido de una gota, añadiendo percepción espacial. Van den Doel también basó su trabajo en el sonido producido por la emisión acústica de burbujas. Desarrolló una aplicación que producía sonidos de burbujas únicas como base, para luego implementar un modelo estocástico de síntesis interactivo en tiempo real que simulaba sonidos más complejos como riachuelos, lluvia, ríos u olas rompiendo [8]. En base al sonido básico de una burbuja, van den Doel estudió como combinarlos hasta llegar a los sonidos más complejos descritos anteriormente, mediante la modificación de diversos parámetros en tiempo real. La aplicación ofrece una interfaz en la que se pueden combinar al gusto y comprobar los diferentes resultados. En un estudio conjunto, Moss, Yeh, Hong, Lin y Manocha realizaron otra aproximación hacia la síntesis de sonidos de fluidos. También partiendo de la base de las burbujas, acoplaron ecuaciones basadas en modelos físicos referidos a la resonancia de las burbujas con múltiples simuladores de fluidos [9]. Como novedad, introdujeron generalizaciones para casos de burbujas de forma no esférica. 25 Sergio Pina Lagunas 2.4 Fuego El fuego es otro fenómeno físico susceptible de ser sintetizado mediante modelado físico. Los japoneses Dobashi, Yamamoto y Nishita propusieron un método para generar el sonido mediante un campo de turbulencias donde el movimiento complejo de vórtices llevaba a la generación de sonido [10]. Previo al proceso, se creaban unas texturas de sonido para los vórtices, que luego eran utilizadas para la representación de los sonidos. Chadwick y James implementaron un método para sintetizar sonidos de fuego sincronizados con animaciones basadas en modelos físicos [11]. Dividieron su sistema en dos partes: un sonido de llamas a baja frecuencia que recibía datos de una animación reproducida a una relativamente baja frecuencia de muestreo, y dos bandas adicionales de alta frecuencia que encajaban con los datos teóricos obtenidos previamente de grabaciones. Drettakis y Verron realizaron un sintetizador que representaba sonidos ambientales basados en partículas. Partiendo de lo que llamaban “sonidos atómicos” que pueden ser parametrizados y distribuidos estocásticamente en el espacio y tiempo, representaron modelos para diversos fenómenos ambientales, el fuego entre ellos [12]. Sintetizaron el sonido del fuego como una combinación de impactos ruidosos simulando crujidos, y ruido ecualizado para simular la combustión. 2.5 Animales Los sonidos producidos por animales han sido objeto de investigación por los desarrolladores de audio procedural. Desde el zumbido de las alas de un insecto hasta el gruñido de un mamífero han sido reproducidos mediante estas técnicas. El canto de los pájaros, debido al amplio rango de timbres y frecuencias, es un interesante campo en el que diversos investigadores han hecho aproximaciones. Fagerlund investigó la manera de producir canto de pájaros a través de las técnicas tradicionales de reproducir voz humana [13]. Estudió anatomía de dichos animales, realizó un estudio espectral de diferentes cantos y desarrolló dos modelos físicos para dos tipos de siringe. Kahrs y Avanzini examinaron los mecanismos acústicos de la producción de sonidos en pájaros, los contrastaron con su anatomía y simularon el sonido de un pájaro psitácido [14]. Smyth y Smith III presentaron un modelo del trayecto vocal de las aves utilizando síntesis por guías de onda para la tráquea, métodos numéricos y un modelo con la ecuación de Bernoulli para el desplazamiento de la membrana de la siringe [15]. Estos mismos autores, junto a Abel, participaron en el desarrollo de un modelo para extraer los parámetros de un modelo de síntesis basado en la simulación de la siringe aviar a partir de grabaciones de cantos de pájaros [16]. En este modelo, en cada lapso de tiempo, un ratio normalizado de similitud se introduce en una matriz que representa la relación presión-tensión indicando dicha similitud entre el canto pregrabado y el espectro tabulado. Sucesivas matrices de presión-tensión son almacenadas y los cambios producidos entre ellas son utilizados para controlar el modelo. El modelo acaba simulando la válvula de presión que forman en la tráquea la membrana y el cartílago. 32 Síntesis de sonido interactiva para videojuegos mediante Unity y Pure Data Figura 3.6: Cascada La representación consiste en un filtrado paso-banda, centrado en 200HZ y con un valor del factor de calidad del filtro bajo (0.283) que permite un corte suave, y un posterior filtrado paso-alto con frecuencia de corte de 50Hz que evita la aparición de las frecuencias más bajas de un ruido blanco que ejerce como fuente del sonido. Se han incluido los “sliders” que se utilizaron en la fase de desarrollo para calibrar correctamente el filtrado en relación al sonido final aprovechando la ventaja de PD de poder modificar parámetros dinámicamente durante la ejecución. Durante la misma se observó que, centrado el filtrado en 100Hz, se obtenía un sonido más sordo, muy similar al que se escucha cuando el individuo está en una cueva bajo la cascada, aunque por razones técnicas en la implementación de la escena no se realizó. Esto último es una máxima en la programación con PD. Es moderadamente habitual, cuando se está intentado calibrar los parámetros en un parche, descubrir durante las pruebas sonidos relacionados con el deseado con alguna particularidad. En la aclaración sobre PD se afirmaba que una de las ventajas del entorno era poder modificar los parámetros en la ejecución, y esto es consecuencia de ello. 3.3 Riachuelo El sonido que se pretendía conseguir quería imitar al de los pequeños ríos que suelen correr en los paisajes montañosos, donde en su recorrido se encuentran una gran cantidad de rocas y de pequeños saltos de agua, que produce un efecto de fluidez. Al igual que en el resto, el primer paso fue analizar una grabación que fue considerada lo suficientemente adecuada a lo que se quería conseguir. 33 Sergio Pina Lagunas Figura 3.7: Sonido del riachuelo en el tiempo Figura 3.8: Sonido del riachuelo en frecuencia En la grabación se observó, en primera instancia, un ruido de fondo producido por los millones de burbujas que se generan al colisionar el agua con las rocas, orilla y demás elementos de interacción. Mientras que observamos grandes variaciones a alta y baja frecuencia en la señal temporal, en la señal frecuencial se percibe un pico muy marcado alrededor de 1KHz. Puesto que se lleva la mayor parte de la energía, consideramos que las muestras alrededor de 1KHz son las responsables del sonido de fondo. Ésta es la base de la implementación del parche, expuesto en la Figura 3.9. 34 Síntesis de sonido interactiva para videojuegos mediante Unity y Pure Data Figura 3.9: Río En el parche se observan dos partes bien diferenciadas. Por un lado, la inferior, utilizada para producir el ruido de fondo. Por otro lado, tenemos seis columnas de similar aspecto que producen el efecto de fluidez. En la de generación del ruido, se incluyó un generador de números aleatorios entre 950 y 1050 que determina la frecuencia central del filtro. De esta manera, se aporta riqueza y aleatoriedad al sonido. El filtro es un paso-banda, centrado en 1KHz como se ha especificado en el estudio frecuencial, que toma como entrada un ruido blanco. Posteriormente, se le aplicó un filtrado paso bajo para atenuar más altas frecuencias que quitaban algo de realismo al resultado final. En la Figura 3.10 observamos una de las columnas del resto de la implementación. 35 Sergio Pina Lagunas Figura 3.10: Columna del parche del río El objeto [metro 8] es utilizado para lanzar aleatorios en un intervalo de ocho segundos, no obstante, estos números no son completamente aleatorios. El objeto [pd bilexp], cuya composición puede observarse en la Figura 3.11, contribuye a la implementación dotando a los números de una distribución bilineal exponencial, dada la continuidad del sonido y suponiendo que una frecuencia que aparezca inmediatamente después de otra tendrá un valor cercano al anterior y no excesivamente lejano. De esta manera, a la salida tendremos números positivos y negativos con una alta tendencia a estar cerca de cero [33]. Mediante el objeto [pack] y sus argumentos, limitamos el tiempo que debe tomarse un número para cambiar entre dos valores, lo que favorece la sensación de fluidez, y mediante el objeto [line~] se crea la señal que controla la frecuencia del oscilador. Figura 3.11: pd bilexp Posteriormente, el oscilador es modulado por una señal diferencial, que toma las muestras actual y anterior de la propia señal que controla la frecuencia del oscilador y es 36 Síntesis de sonido interactiva para videojuegos mediante Unity y Pure Data filtrada dejando pasar las bajas frecuencias, ralentizando de esta manera las variaciones en la señal resultante. La razón por la que tenemos cinco columnas similares a ésta, en las cuales se cambian ligeramente los valores, es para aportar riqueza al sonido final. Mientras una de estas columnas suena como un único y pequeño flujo, el sonido generado por las seis se asemeja a un flujo mayor en el cual existen pequeños flujos originados por los elementos que se interponen entre el agua y su camino. 3.4 Viento El sonido que produce el viento es muy particular, puesto que se produce por la interacción entre el gas moviéndose entre dos puntos con diferente presión y los objetos que se va encontrando por el camino. Puesto que la escena que estamos generando tiene una carácter marcadamente tormentoso, se ha dispuesto que el viento que tenga una presencia notable. El efecto cuenta con dos modos de funcionamiento, en uno se genera una brisa suave y en el otro se simula un fuerte vendaval propio de una tormenta. En la Figura 3.12 se puede observar la implementación final. Figura 3.12: Viento Para sintetizar propiamente un sonido de viento, se debería implementar un filtro por cada objeto con el que interactuara el gas en su desplazamiento. No obstante, esto sería muy costoso y complicado en el caso de contar con ambientes con gran cantidad de elementos. Cuando el aire se está moviendo, lo hace en una única dirección, en ambos sentidos a un ritmo 37 Sergio Pina Lagunas bajo en comparación con las ondas de sonido. El sonido producido entonces por el desplazamiento es de una frecuencia muy baja, del orden de mHz, fuera de nuestro rango de audición. Sin embargo, cuando interacciona con objetos, se producen turbulencias, que es lo que provoca su sonido característico [33]. Estas turbulencias producen un aullido característico que, cuando sopla moderadamente, está concentrado en frecuencias más bajas y con variaciones más lentas que cuando lo hace con más violencia. Como se explica más adelante, durante la ejecución de la escena se puede escoger entre las dos posibles velocidades del viento, el parche de la Figura 3.12 se encarga de activar la opción escogida. En la Figura 3.13 se muestra el subparche [pd brisa]. Figura 3.13: Brisa El parche consiste en una señal ruidosa filtrada paso-banda en un rango frecuencial comprendido aproximadamente entre 500 y 800Hz. Con una señal moduladora filtrada a un nivel tan bajo, las variaciones son lentas y suaves con pequeños aumentos esporádicos que simulan pequeñas rachas de viento. En la Figura 3.14 se puede observar [pd vendaval]. Figura 3.14: Vendaval 38 Síntesis de sonido interactiva para videojuegos mediante Unity y Pure Data Cuenta con una columna muy similar a la de [pd brisa], aunque en este caso el rango está en unos niveles más altos. En la columna de la derecha el funcionamiento es similar, cubriendo las frecuencias de 700 a 1300Hz aproximadamente. Este sonido es más rico y completo, puesto que cubre tanto rachas violentas esporádicas, dando forma a las características turbulencias antes comentadas, como una velocidad más constante y contundente. Vemos que en el parche de la Figura 3.12 se genera una señal con baja variación (columna de la izquierda) que, multiplicada por la señal resultante de la elección entre la brisa y el vendaval, produce un efecto ondulatorio que añade riqueza al sonido. Evita que, por las variaciones introducidas por las altas frecuencias, la amplitud resultante sea demasiado plana. 3.5 Lluvia El sonido de la lluvia es producido por la colisión de las gotas de agua con los diferentes objetos presentes y el suelo. Estas gotas tienen un diámetro que varía entre 1 y 3 milímetros (mm). Caen con velocidad constante a un ratio de 200 impactos por segundo en un metro cuadrado. En diferentes condiciones, el tamaño, velocidad y ratio pueden variar. Bajo una gravedad y densidad del aire normales, las gotas de 1mm alcanzan alrededor de los 2 metros por segundo (m/s), mientras que las de 5mm pueden alcanzar 10m/s. Sus formas van desde una esfera casi perfecta para las más pequeñas, hasta estar aplastadas verticalmente las más grandes, de forma similar a una hamburguesa [33]. 39 Sergio Pina Lagunas Figura 3.15: Lluvia El parche está dividido en tres partes, así como son tres tipos de sonido los que se han querido recrear. Por un lado, están las tres columnas centrales, que simulan el goteo principal. Luego está la columna a la derecha de las tres anteriores, que se encarga de reproducir un sonido de baja frecuencia que complementa al resto del parche, típico de cuando el agua impacta con un objeto sólido rocoso macizo. Finalmente, a la izquierda tenemos la parte del parche que proporciona un sonido de fondo. Ésta es, precisamente, la parte más sencilla del mismo, puesto que consiste únicamente en tomar una de las fuentes de ruido blanco y reducir su amplitud hasta que tenga una apariencia testimonial en el resultado final. De esta manera, se consigue un efecto de lluvia lejana, complementando el goteo próximo generado por el resto del parche. Esto es así porque, en un ambiente lluvioso, más allá de las gotas que caen cerca del individuo que está escuchando, hay millones cayendo a una distancia más lejana, que generan sonidos puntuales al chocar con todo tipo de objetos de un amplio espectro de frecuencias. En cuanto a las tres columnas centrales que simulan el goteo principal, tomando como referencia la de más a la izquierda, se observa que, en el primer paso, si aplica a la señal ruidosa un filtrado paso-banda muy cercano a cero, con un valor del factor de calidad extremadamente bajo. Esto desemboca en una señal en frecuencia con una pendiente descendiente muy suave, escalada posteriormente para que la señal temporal tenga unos 40 Síntesis de sonido interactiva para videojuegos mediante Unity y Pure Data valores cercanos a 1. Posteriormente, es elevada a la octava potencia, lo que provoca un rango dinámico muy alto, con valores muy cercanos a 0 de órdenes muy bajos y valores del orden de la unidad. Esta señal se utiliza para modular la que proporciona un oscilador, cuyos valores de frecuencia central oscilan entre 3 y 10KHz [33]. Utilizando dos veces el mismo filtro paso-alto, se consigue un filtrado con una pendiente muy profunda, con el que se elimina la aparición de componentes indeseadas de altas frecuencias. El resultado es una señal con “clics” de muy corta duración, de diferentes amplitudes y diferentes frecuencias centrales dentro del rango de interés. Las otras dos columnas semejantes a ésta que hemos analizado aportan una señal similar con otros rangos de frecuencias diferenciados, aunque próximos, que sirven para aportar riqueza al sonido al ejecutarse simultáneamente. En la zona más a la derecha del parche se simulan los goteos de frecuencia más baja y más profundos, que aparecen a un ritmo más bajo que los anteriores. Existen dos columnas diferenciadas. La de la izquierda consiste en una modulación de una señal ruidosa con otra paso-bajo, y filtrada paso-banda posteriormente. Tras la modulación, se obtiene una resonancia ondulante que, tras filtrarla paso-banda con una frecuencia central alrededor de 300Hz, resulta un ruido retumbante [33], similar al que provocan las gotas más gruesas al precipitarse sobre una superficie de objetos voluminosos. Puesto que la escena se representa en un paisaje forestal, donde predomina la vegetación, este sonido está muy atenuado debido a la ausencia de grandes objetos con los que interactuar. Un ejemplo de donde podría tener más relevancia es en un paisaje urbano, donde es habitual escucharlo cuando las gotas caen sobre los coches. En la última subsección, la columna de más a la derecha del parche, cubre el espectro dejado entre las dos anteriores. Primero, se toman dos señales paso-bajo de dos de las fuentes ruidosas, una con frecuencia de corte en 16Hz y otra en 1900Hz y se dividen muestra a muestra. Esto provoca una presencia en la señal resultante de valores altos de pico, puesto que cuando la señal filtrada en 1900Hz tiende a cero, el resultado de la división tiende a infinito [33]. Esta señal se atenúa, se eleva al cuadrado para evitar valores negativos y se recorta entre 0 y 9, teniendo de esta manera una señal de alta variación entre este rango de valores. Posteriormente, esta señal va a parar a un filtro paso banda, cuya frecuencia central es modulada por otra señal de variación más lenta (ruido filtrado paso-bajo en 16Hz con valores de salida entre 1000 y 10000) que va de 1KHz a 10KHz. El resultado son gotas que resuenan a mayor frecuencia y que caen a un ritmo menor que las anteriores, sin llegar a los niveles de las tres columnas del principio. Dependiendo del ambiente, se puede jugar con los parámetros de cada subsección, especialmente con los de amplitud, para enfatizar un sonido u otro. 3.6 Fuego El fuego es un fenómeno complejo. Es un ejemplo de sonido componible mediante la adición de diferentes partes contribuyentes. El fuego es el resultado de una reacción oxidante fuera de control. Empieza cuando algo que lo alimenta (combustible, madera) se calienta y comienza a oxidarse. Siendo una reacción exotérmica, genera calor. Cuanto más caliente está 41 Sergio Pina Lagunas el objeto en combustión, mejor se oxida y, cuanto mejor se oxida, más caliente llega a estar. Esta relación se alarga mientras el objeto no se haya oxidado completamente o se corte el suministro de oxígeno necesario para la combustión. Los diferentes procesos en los que se ve envuelto algo que está ardiendo, producen una serie de sonidos: - “lapping”: combustión de los gases en el aire (llamas). - “crackling”: pequeñas explosiones producidas por el objeto en combustión. - “hissing”: producido por los gases liberados - “bubbling”: producido cuando un líquido hierve - “creaking”: expansión interna de un gas en un objeto en combustión - “fizzing”: conflagración aérea de pequeñas partículas - “whining”: relajaciones periódicas durante la liberación de los gases - “roaring”: ciclos turbulentos de llamas a baja frecuencia - “popping”: explosión gaseosa - “clattering”: asentamiento del gas bajo la gravedad En términos acústicos, los sonidos predominantes son “lapping”, “crackling” y “hissing”, que han sido recreados por separado [33]. En la Figura 3.16 tenemos la implementación final de “hissing”. El parche es muy básico, puesto que el sonido es puntual y volátil. Se dan violentas variaciones únicamente en pequeños fogonazos, no muy frecuentemente. Figura 3.16: Hissing El primer paso es generar un ruido de fondo en el que las frecuencias bajas estén atenuadas, que es introducido al parche mediante una fuente común a los tres sonidos implementados en el nivel superior, por ello está presente el filtro paso-alto. Posteriormente, 48 Síntesis de sonido interactiva para videojuegos mediante Unity y Pure Data 3.8 Pisadas ¿Qué sucede cuando un individuo camina? El cuerpo humano en reposo distribuye equitativamente el peso en ambos pies, que tienen una superficie relativamente pequeña. Existe una fuerza, una presión ejercida sobre el suelo, que es equilibrada con la fuerza recíproca del suelo hacia el cuerpo. Esto es conocido como la fuerza de respuesta del suelo, o GRF (Ground Response Force). Una superficie más pequeña significa una GRF más grande, estando de puntillas se produce más presión que en posición normal. Mientras el individuo avanza, el peso cambia de un pie a otro y la energía se expande por los músculos para llevarlo hacia adelante [33]. Existen tres fases en el proceso de un paso, ya que el pie no se apoya en el suelo plano. En la primera fase, el talón impacta con el suelo. En la segunda, el pie rueda apoyando el resto de la planta hasta llegar a los dedos. En la última fase, el individuo se impulsa hacia adelante utilizando los dedos y una serie de músculos. En la Figura 3.25 se puede ver una representación gráfica del proceso [33]. Figura 3.25: Paso La velocidad de movimiento determina el tiempo en el que el pie está en contacto con el suelo. Cualquier patrón de GRF es comprimido o expandido cuando la velocidad del individuo cambia. La longitud de cada paso debe cambiar con la velocidad mientras el sonido de la interacción con la textura del suelo debe permanecer constante [33]. En la Figura 3.26, podemos ver la representación gráfica de varias funciones GRF según la velocidad del individuo. Figura 3.26: Representación de señales GRF 49 Sergio Pina Lagunas El modelo para generar sonidos de pisadas consiste en realizar una representación de estas funciones GRF, que servirán como señales de control, y aplicarles las propiedades frecuenciales de cuatro superficies: gravilla, madera, nieve y césped (follaje). El parche superior sirve para calcular los parámetros de las funciones en base al movimiento del personaje. Estos parámetros serán introducidos a otro parche que será el encargado de activar la textura que debe sonar en base a la posición del personaje en el mapa. Finalmente, para cada textura, hay otro parche de nivel inferior, en el cual se moldeará la señal GRF en base a las características de cada una y se aplicarán las propiedades frecuenciales, teniendo como salida el sonido final. En la Figura 3.27, vemos el parche superior. Figura 3.27: Pisadas El parche toma como entrada el ritmo al que se está moviendo el personaje. Hay tres valores para cada uno de los tres movimientos: caminar, trotar y esprintar. Las operaciones siguientes tienen como función calcular los parámetros que son introducidos a [pd texturesource]. Hay que tener en cuenta que, estos parámetros luego son introducidos en un objeto [vline~] y posteriormente se les aplica un coseno para darle la forma de la función. Representan una medida de longitud de la señal GRF para cada una de las tres fases. En la parte izquierda podemos ver otra entrada que determinará el mensaje a transmitir al objeto para seleccionar la textura que sonará en cada momento. En la Figura 3.28 se muestra [pd texturesource]. 50 Síntesis de sonido interactiva para videojuegos mediante Unity y Pure Data Figura 3.28: Texturesource La entrada que recibe es el mensaje enviado, que corresponde con las palabras en inglés de las cuatro texturas presentes en la escena. Cuando recibe una de ellas, por ejemplo “snow”, el parche envía un “1” al subparche [pd snow] y un “0” al resto, permitiendo así solo una textura activa cada vez. También ejerce como puente para los parámetros de la señal GRF, trasladándolos a todos los subparches. A continuación se explican las particularidades de cada textura. 3.8.1 Gravilla Se entiende como gravilla una superficie en la que hay presente tanto tierra como pequeñas piedras, que puede estar presente en paisajes naturales montañosos, caminos, etc. Esta superficie produce un sonido muy rugoso al caminar sobre ella, producto de la fricción de la suela con la gran cantidad de pequeñas piedras bajo ella. Tomando como punto de partida una grabación digital, se extraen la forma de la señal temporal de una pisada así como su transformada al dominio de Fourier y su espectrograma para saber en qué momento qué frecuencias tienen más relevancia. 51 Sergio Pina Lagunas Figura 3.29: Pisada sobre gravilla en frecuencia Figura 3.30: Espectrograma de una pisada en gravilla De la representación frecuencial se puede observar como la mayor parte de la información se encuentra en una banda estrecha alrededor de 500Hz, aunque también hay un pico menor alrededor de 1500Hz. Del espectrograma se saca la conclusión de que en el momento que se posa el talón y que se impulsa con los dedos es en el que con mayor intensidad la energía se concentra en estas bandas, así que en la implementación se busca la manera de hacer coincidir estos hechos. También vemos una ligera aunque considerable frecuencia de presencias altas, lo que invita a pensar que en la implementación los filtros no deben ser demasiado estrechos. En la Figura 3.31 se puede contemplar la implementación de la textura. 52 Síntesis de sonido interactiva para videojuegos mediante Unity y Pure Data Figura 3.31: Gravilla Lo primero a destacar en el parche es la representación de la señal GRF. En esta textura se ha dejado como en el concepto inicial, siendo dos picos pronunciados a la hora de apoyar el pie y los dedos al impulsarse, y una curva más suave para la transición entre el talón y los dedos. En la parte superior del parche, tenemos las tres columnas que reciben los parámetros del parche superior y, en base a éstos, dan forma a la señal GRF utilizando objetos [cos~]. Esta señal es modulada al final del parche con la señal ruidosa. Se toma como fuente un ruido blanco que tomará dos caminos: por una parte conformará la señal a la que se dará forma en frecuencia para satisfacer lo visto en el estudio previo, que se realizará con un filtro paso-banda controlado por tensión, y por otro lado se generará la señal que controla este filtro. La señal a filtrar será una señal de muy altas variaciones, con muchos picos, simulando la fricción entre las miles de pequeñas piedras que conforman la textura. Esto se consigue dividiendo dos señales, una con mayor presencia de altas frecuencias que otra, provocando valores muy altos cuando la que ocupa el lugar del divisor pase por cero. Esta señal se filtra paso-alto, eliminando las bajas frecuencias, y se eleva al cuadrado para hacer los valores de pico más finos. Finalmente, buscando la coherencia en el volumen de la salida, se limitan estos valores posibles entre 0 y 0.9. Por el otro lado, se filtra paso-bajo la señal del ruido en 50Hz, esto genera una señal de muy pocas variaciones. Tras el posterior escalado, se le resta la señal de entrada multiplicada por 2000 y se acotan sus valores entre 500 y 15000. Con esto se consigue que, cuando los picos de presión son mayores (la señal de entrada toma valores entre 0 y 1), la frecuencia central del filtro tomará como valor 500Hz o valores cercanos, enfatizando así la presencia de estas frecuencias en esos momentos. Finalmente, se multiplica la señal de entrada por la señal generada y se obtiene el resultado final. 53 Sergio Pina Lagunas 3.8.2 Madera Hay muchos tipos de superficies de madera para implementar un sonido general. En el caso de esta escena, se optó por intentar recrear un sonido característico de un puente. Para ello, como en el caso de la gravilla, se partió de estudiar las características frecuenciales de una grabación. El sonido, por otra parte, resulta muy seco, no tan rugoso como el de la gravilla. En las Figuras 3.32, 3.33 y 3.34 tenemos las representaciones de una pisada en frecuencia, el espectrograma y la envolvente temporal de una secuencia de pisadas. Figura 3.32: Pisada sobre madera en frecuencia Figura 3.33: Espectrograma de una cadena de pisadas sobre madera 54 Síntesis de sonido interactiva para videojuegos mediante Unity y Pure Data Figura 3.34: Envolvente temporal de una cadena de pisadas sobre madera En la representación frecuencial, observamos unos picos muy marcados entre 0 y 200Hz, generalmente con las componentes más definidas, más agrupadas alrededor de un nivel concreto. Se observan valores máximos alrededor de 40, 60, 80 o 120 Hz aproximadamente. Por otra parte, en el espectrograma se observa que en los momentos de presión, la banda por debajo de 1KHz es la que cobra más importancia, además de ver muy marcado el salto entre los dos picos de presión con el pequeño espacio en negro que separa en dos cada paso. Esto se refrenda en la observación de la envolvente temporal de la cadena de pisadas, donde observamos picos muy marcados que se manifiestan en un sonido seco. También se aprecia la aparición de otras frecuencias, resultantes de la fricción entre la suela y la superficie. En la Figura 3.35 se puede observar el parche. 55 Sergio Pina Lagunas Figura 3.35: Madera Lo primero que llama la atención en este parche es la modificación de la señal GRF. Tras lo visto previamente en la envolvente temporal y el espectrograma, había que modificar esta señal para conseguir el efecto de sequedad en el contacto. Se podía observar en la envolvente temporal de la cadena de pasos que la señal sube abruptamente, y no gradualmente como en la gravilla, así pues, se ha moldeado la señal GRF para que así fuera, prescindiendo también de la presión ejercida por la planta al pasar del talón a los dedos, considerando que el sonido producido entonces era despreciable frente al de los picos. Esto se genera en el parche con las dos columnas de la izquierda, donde en el parche de la gravilla había tres. En las columnas de la derecha, se generan la señal que multiplicará después a la GRF y que hay que moldear frecuencialmente. Se escogen dos rangos a representar: de 0 a 400Hz (la de más a la derecha), que será el que tenga más relevancia., y de 400 a 800Hz (la más centrada) para rellenar el espectro y que tendrá menor energía que las bajas componentes. El diseño para el rango de 0 a 400Hz consiste en un filtro paso-banda controlado por tensión, con un valor del factor de calidad alto, que hace que los picos queden muy destacados en el espectro al ser el filtro muy estrecho. Por otra parte, en el rango de 400 a 800Hz, el valor del factor de calidad es más bajo, luego el filtro es más ancho y permite la aparición de más componentes. Posteriormente, se suman ambas señales y se multiplican a la señal GRF para generar el sonido final. 3.8.3 Nieve Esta superficie es, probablemente, la que tiene características más singulares de las cuatro. En cuanto un individuo apoya su talón para iniciar un paso sobre una capa de nieve, se resquebraja y se comprime, produciendo un ruido parecido al del hielo rompiéndose, pero 56 Síntesis de sonido interactiva para videojuegos mediante Unity y Pure Data suavizado al tratarse de una textura más esponjosa. En las Figuras 3.36, 3.37 y 3.38 se representan una pisada sobre nieve en frecuencia, el espectrograma, y la envolvente temporal de una cadena de pasos. Figura 3.36: Pisada sobre nieve en frecuencia Figura 3.37: Espectrograma de una cadena de pasos sobre nieve 57 Sergio Pina Lagunas Figura 3.38: Envolvente en el tiempo de una cadena de pasos sobre nieve Tanto en la representación en frecuencia, como, especialmente, en el espectrograma, se puede apreciar que la mayor parte de la información se encuentra en la banda por debajo de 1KHz. Es palpable que, en el momento del primer contacto, la presencia de las bajas frecuencias, del orden de las decenas de Hz, es la más relevante. Además, esta distribución es prácticamente invariable a lo largo de la pisada. Otra observación a destacar de estas figuras es que la envolvente pierde su forma característica de dos picos pronunciados y una curva central. Se percibe una forma más redondeada, la energía total de la pisada distribuida más equilibradamente. La señal GRF original como señal de control, al igual que en el caso de la madera, no sirve en este modelo. A continuación se muestra en la Figura 3.39 el parche resultante y se explica cómo las conclusiones del estudio previo son plasmadas en él. 64 Síntesis de sonido interactiva para videojuegos mediante Unity y Pure Data El editor también cuenta con herramientas para introducir vegetación capaz de interactuar con el viento, y texturas, lo que resulta útil para dar soporte a los efectos de pisadas. Figura 4.2: Escena y personaje principal En la Figura 4.2 podemos apreciar algunos de los elementos principales de la escena. Se ha construido un paisaje montañoso, que se puede identificar con un valle, en el que se encuentra una cascada que da lugar a un río. Hay varios puentes de madera para cruzarlo. Existen zonas con árboles y arbustos, así como terreno en el que predomina el follaje y un camino de gravilla. Existe otra zona con nieve, pero se encuentra en lo alto de las montañas y no es accesible si no se sitúa al personaje allí desde un principio. Se ha situado una hoguera en un lugar resguardado y es posible generar lluvia y truenos. Se ha pretendido simular un día tormentoso, de manera que puedan estar presentes los efectos climatológicos implementados. 4.2 Personaje Se ha escogido un modelo humanoide para actuar como personaje principal. En la Figura 4.3 podemos ver su aspecto y, junto él, el dibujo que indica donde está situada la cámara principal inicialmente. 65 Sergio Pina Lagunas Figura 4.3: Personaje Se trata de un diseño muy simple, pues, siguiendo el ejemplo de las grabaciones de efectos, se ha optado por no invertir dinero alguno en complementos para el desarrollo del proyecto, por tener un carácter didáctico y ningún ánimo de exhibición o lucro. A la hora de animar el modelo, se ha diseñado una máquina de estados que se puede observar en la Figura 4.4 a través de los cuales el personaje se irá desplazando dependiendo de las entradas que le lleguen por el teclado. Figura 4.4: Máquina de estados para las animaciones Esta máquina de estados, junto a los códigos incluidos en el Anexo A, son los encargados de dar vida al personaje. Cuenta con un estado inicial, el único en naranja, “Idle” (en inglés, reposo). Desde este estado es posible avanzar con la tecla “W” a “Walk ahead” (caminar hacia adelante), con la tecla “D” hacia “Walk right” (girar a la derecha), con la “A” a “Walk left”(girar a la izquierda) o con la tecla “R” o “T” para provocar lluvia y truenos respectivamente a “Magic” (estado que lleva asociado una animación que simula la pulsación de un botón). Si se mantiene pulsada la tecla “W” se accede automáticamente al estado “Run”, que lleva asociada una animación de trote. Desde este estado, es posible volver a “Walk ahead” si, a la vez que se pulsa la letra “W”, se pulsa también la letra “C”. También es posible esprintar, a la vez que “W”, si se pulsa la letra “F” saltará al estado “Run faster”. En las tres velocidades es posible girar pulsando “D” o “A” para derecha e izquierda respectivamente. 66 Síntesis de sonido interactiva para videojuegos mediante Unity y Pure Data 4.3 Comunicación por mensajes OSC 4.3.1. Conceptos El protocolo OSC (OpenSound Control) es un protocolo desarrollado para la comunicación entre ordenadores, sintetizadores y dispositivos multimedia en general abierto, basado en mensajes y transparente al medio en el que se propaga. La unidad de transmisión para el protocolo es denominada “paquete OSC”. Cualquier aplicación que manda un paquete OSC es un “cliente OSC” y cualquier aplicación que recibe un paquete OSC es un “servidor OSC”. Un paquete OSC consiste en una cadena de números binarios y su tamaño es siempre múltiplo de 4 bytes. La capa inferior que entrega un paquete OSC es responsable de entregar tanto el contenido como el tamaño a la aplicación. Un paquete puede ser naturalmente representado por un datagrama en un protocolo de red como UDP [34]. De esta manera, en este proyecto Unity 3D actuará como cliente y PD como servidor como se muestra en la Figura 4.5. Figura 4.5: Esquema del proyecto En la escena creada en Unity 3D, el personaje principal interactúa con el entorno, provocando o simplemente escuchando efectos de sonido a su alrededor debidos a los diversos fenómenos. Estos fenómenos generan vía código unos mensajes OSC, que son escuchados por PD y reproduce el sonido correspondiente con las características que en ese momento sean requeridas. 4.3.1 Implementación en Pure Data Para dar soporte a la comunicación vía mensajes OSC, en PD se ha utilizado la implementación “mrpeach”, una librería que debe ser importada para utilizar sus objetos característicos. En la Figura 4.6 tenemos un ejemplo de uno de los parches utilizados para recibir mensajes OSC desde Unity. 67 Sergio Pina Lagunas Figura 4.6: Parche para la recepción de mensajes OSC El parche de la Figura 4.6 es utilizado para la recepción de mensajes OSC para el efecto de las pisadas. Se encuentra en el nivel inmediatamente inferior al Mezclador. Este parche recibe como entrada un mensaje en forma de “1” si tanto el sistema como el efecto está activo y un “0” si alguno de los dos no lo está. La implementación es ésta porque hacía posible retocar los efectos de sonido con la ejecución de la escena en Unity parada en la fase de desarrollo, puesto que es posible activar manualmente el parche. Unity 3D envía mensajes a los puertos del equipo, mientras que PD escucha esos puertos a la espera de recibirlos. En el caso del efecto de las pisadas, el puerto que se utiliza para mandar y recibir los mensajes es el 7007. Una vez recibido, el mensaje es descomprimido por el objeto [unpackOSC]. Tras esto, el valor o los valores obtenidos son trasladados al parche que recrea el efecto de sonido como entrada. La señal de salida será la señal de sonido. Cada efecto de sonido tiene sus parámetros particulares de control, su puerto de escucha, y las teclas que lo hacen funcionar, los cuales son explicados a continuación: Río  Puerto: 7006  Parámetros: o /river valor de amplitud de la señal de sonido calculado en base a la distancia euclídea entre el personaje y la posición del río.  Teclas: NA Cascada  Puerto: 7003  Parámetros: o /waterfall valor de amplitud de la señal de sonido calculado en base a la distancia euclídea entre el personaje y la posición de la cascada.  Teclas: NA 68 Síntesis de sonido interactiva para videojuegos mediante Unity y Pure Data Viento  Puerto: 7004  Parámetros: o /windon parámetro binario que pone en funcionamiento el efecto o /velocity determina la velocidad del viento entre brisa y vendaval  Teclas: o “V” para alternar entre las dos velocidades Trueno  Parámetros: o /thunder parámetro que actúa como “bang” y que únicamente puede valer “1” para activar el sonido del trueno  Puerto: 7002  Teclas: o “T” para activar Lluvia  Parámetros: o /rainon “bang” que enciende el efecto de lluvia o /rainoff “bang” que apaga el efecto de lluvia. Son necesarios dos porque se tratan de un efecto continuo  Puerto: 7001  Teclas: o “R” para activar y desactivar Fuego  Parámetros: o /fire valor de amplitud de la señal de sonido calculado en base a la distancia euclídea entre el personaje y la posición de la hoguera.  Puerto: 7005  Teclas: NA Pisadas  Parámetros: o /rate sirve como parámetro que marca el ritmo de pisada, es decir, si el personaje camina, trota o esprinta. o /surface indica en qué superficie se encuentra.  Puerto: 7007  Teclas: o “W” para avanzar. o “A” para girar a la izquierda. o “D” para girar a la derecha. 69 Sergio Pina Lagunas o “C”, mientras se avanza, para caminar. o “F”, mientras se avanza, para esprintar. Por último, se ha utilizado el puerto 7008 para recibir un parámetro llamado /state que indica si la escena en Unity está en ejecución o no, lo que sirve para activar y desactivar el Mezclador. En el Anexo A, junto al resto de códigos implementados en Unity, se encuentran las funciones realizadas en C# para enviar los mensajes OSC a PD. Para ello se ha utilizado la librería “UnityOSC-master” de Jorge García [35]. 70 Síntesis de sonido interactiva para videojuegos mediante Unity y Pure Data 71 Sergio Pina Lagunas Capítulo 5: Conclusiones finales y líneas futuras A lo largo del desarrollo del proyecto, se ha producido una inmersión en el mundo del audio para videojuegos en general, y en el del audio procedural en particular, intentando comprender las ventajas y limitaciones de cada disciplina, así como alcanzar un cierto punto de comprensión y habilidad en la que nos atañe, que es el audio sintético y procedural. Aunque no se ha profundizado demasiado en el uso de las matemáticas y la física para la implementación de los efectos de sonido, se pueden considerar algunos de los resultados objetivamente como satisfactorios. Se partió como base, principalmente, del trabajo de Andy Farnell en la materia, evolucionándolo y optimizándolo en ciertos casos, siguiendo un camino propio en otros, llegando a tener suficientes efectos como para suministrar sonido a una escena montañosa o boscosa casual en un videojuego. Si bien es cierto que algunos efectos como el de fuego ya estaban bastante desarrollados y solamente han sido necesarios algunos retoques para su adecuación a la escena, se puede decir objetivamente que ha habido considerables avances en otros como las pisadas o el río, efectos que se encontraban en un estado muy prematuro para ser considerados satisfactorios. El profundo estudio frecuencial llevado a cabo, así como la inclusión de señales GFR variables según la superficie en el caso de las pisadas, y la utilización de las posibilidades de PD para poder plasmar las conclusiones teóricas en el sonido final han dirigido hacia los resultados mostrados en la demostración. En cuanto a la escena, como se ha mencionado previamente en el documento, se han utilizado las herramientas que incluye la versión gratuita de Unity 3D. Aun siendo la versión gratuita, Unity 3D es una herramienta muy potente para crear videojuegos o animaciones, con multitud de complementos que han sido muy útiles a la hora de integrar la escena con los efectos de sonido, así como una amplia comunidad de desarrolladores que han dado respuesta a todas las preguntas que le iban surgiendo al autor, puesto que se trataba de su primer contacto con una herramienta de este tipo. De hecho, Unity 3D constituye el “software development kit” (SDK) por defecto para una plataforma de primera línea como es Wii U. El hecho de utilizar la versión gratuita hace que visualmente sea algo limitada, luciendo peor que la mayoría de videojuegos modernos. No obstante, el objetivo del proyecto era utilizar Unity para dar un soporte visual a los efectos de sonido implementados, que constituyen el grueso del trabajo, aunque fuera de forma más básica. Como conclusiones finales a la inmersión en el mundo del audio procedural, puede decirse que esta disciplina, al menos a medio plazo y con el nivel de tecnología actual, no va a sustituir completamente al audio pregrabado. Hay efectos, como la voz humana en una conversación a la que hay que dotarla de dramatismo, que no se van a poder simular artificialmente, y otros muchos en los que será muy complicado obtener resultados verdaderamente buenos. Se han podido comprobar sus ventajas y desventajas, desde el ahorro de memoria y recursos, la sensación de estar ante algo vivo al tener unos efectos dinámicos, y el ahorro de tiempo y esfuerzo que supone recrear esos efectos frente a la grabación al resultado estético final, que (casi) nunca será equiparable al de uno real. 72 Síntesis de sonido interactiva para videojuegos mediante Unity y Pure Data Sin embargo, el audio procedural sí que puede cumplir un papel complementario al audio pregrabado. Durante la ejecución de la escena se ha observado como el resultado estético final de los efectos ya mezclados, y recibiendo también información visual, mejora perceptualmente. En la fase de desarrollo ha sido complicado conseguir una satisfacción plena con un efecto de sonido, escuchándolo repetidamente sin ningún tipo de estímulo visual y sin ningún otro efecto con los que en la implementación final va a poder escucharse. Sin embargo, al poner todo junto, el resultado final mejora, la percepción humana también entra en juego. El audio procedural es interesante para recrear sonidos continuos como la lluvia, el sonido de una hoguera, o de un río, que ocuparían una gran cantidad de memoria en caso de ser pregrabados. Además, gracias al dinamismo de la implementación, no suenan repetitivos, puesto que la grabación termina y debe volver a reproducirse en algún momento, mientras que los elementos de aleatoriedad evitan los bucles. Los efectos de pisadas sobre superficies sobre las que se puede conseguir un resultado suficientemente bueno también son útiles. Ninguna pisada, dentro de unos ciertos límites, suena igual, lo que aumenta la sensación de inmersión en el jugador. Las posibilidades futuras del audio procedural son muy grandes, puesto que, como se ha mencionado anteriormente, se trata de una disciplina joven y sin demasiado trabajo y estudios previos. La mayor parte de la información al respecto y de la que se ha obtenido la mayoría de la documentación para este proyecto se concentra en la página web “proceduralaudio.com”. El futuro y su definitiva inclusión en el mundo de los videojuegos pasan por la formación de los ingenieros de sonido en la materia. En cuanto al trabajo aquí realizado, siempre se puede profundizar más en el desarrollo de los efectos. Una utilización más profunda de métodos matemáticos añadidos a una investigación más específica de cómo cada efecto es producido verdaderamente, más allá de estudios espectrales, podría llevar a otro nivel el resultado final. Modelados físicos y métodos granulares podrían ser utilizados para mejorar los resultados aquí obtenidos. Finalmente, la completa integración de alguna manera del motor de sonido implementado con la escena desarrollada en Unity, de forma que conformen un elemento indivisible, sería recomendable mirando hacia futuras exhibiciones o comercializaciones. 73 Sergio Pina Lagunas Anexo A: Scripts en C# para Unity 3D Sound Script: using UnityEngine; using UnityEditor; using System.Collections; public class SoundScript : MonoBehaviour { float xP,yP,zP,xW,yW,zW,xF,yF,zF,euclW,valueW,euclF,valueF,euclR,valueR,rate; int surfaceIndex = 1; int velocityW=1; bool OnOff=false; private Terrain terrain; private TerrainData terrainData; private Vector3 terrainPos; private Collision colision; void Start () { terrain = Terrain.activeTerrain; terrainData = terrain.terrainData; terrainPos = terrain.transform.position; } // Update is called once per frame void Update () { float xP = transform.position.x; //Posició n del personaje float yP = transform.position.y; float zP = transform.position.z; float xW = GameObject.Find("Waterfall").transform.position.x; //Posici ón de la cascada y distancia euclídea con el personaje float yW = GameObject.Find("Waterfall").transform.position.y; //Usamos la componente "x" de la cascada para la distancia al río float zW = GameObject.Find("Waterfall").transform.position.z; float xF = GameObject.Find("Fire1").transform.position.x; //Posici ón de la hoguera y distancia euclídea con el personaje float yF = GameObject.Find("Fire1").transform.position.y; float zF = GameObject.Find("Fire1").transform.position.z; euclW = Mathf.Sqrt((xP - xW)*(xP - xW) + (yP - yW)*(yP - yW) + (zP - zW) *(zP - zW)); euclF = Mathf.Sqrt((xP - xF)*(xP - xF) + (yP - yF)*(yP - yF) + (zP - zF) *(zP - zF)); euclR = Mathf.Sqrt((xP - xW)*(xP - xW)); if (euclW <= 70) { //A una distancia de 70, máxima amplitud valueW = 1; //A un a distancia de 410, mínima amplitud (0.03), entra ambas interpolación } else { if (euclW >= 300) { valueW = (float)0.03; } else { valueW = 1 + (euclW - 70)*((float)0.03-1) / (300 - 70); } } if (euclF <= 2) { //A una distancia de 2, máxima amplitud valueF = (float)0.2; //A una distancia de 410, mínima amplitud (0.03), entra ambas interpolación } else { if (euclF >= 30) { valueF = 0; 80 Síntesis de sonido interactiva para videojuegos mediante Unity y Pure Data 81 Sergio Pina Lagunas Anexo B: Scripts en Matlab para la obtención de las Figuras Pisadas sobre nieve: envelopeSnow.m %%%%%Lee y representa el valor absoluto de las pisadas en el tiempo%%%% [pisadas,Fs] = wavread('FootstepsSnow.wav'); N = length(pisadas); t = linspace(0, N/Fs, N); figure(1), plot(t,pisadas(:,1)); title('Pisadas'); xlabel('Tiempo'); ylabel('Señal'); %%%%%Calcula y representa la FFT de una pisada%%%%% pisa = pisadas(5.8*Fs:(65*Fs/10),1); Np = length(pisa); tp=linspace(0,Np/Fs,Np); figure(2),plot(tp,pisa); title('Pisada en tiempo'); PISA=fft(pisa); f = Fs/2*linspace(0,1,Np/2+1); figure(3),plot(f,abs(PISA(1:length(f)))); title('Pisada en frecuencia'); xlabel('Frecuencia'); ylabel('Señal'); %%%%%Calcula y representa la envolvente temporal%%%%% pisadas2 = 2*pisadas.*pisadas; downsample(pisadas2,15); Fc=1; [B,A] = butter(1,Fc/(Fs/15)); pisadas2 = sqrt(filter(B,A,pisadas2)); figure(4), plot(t,pisadas2(:,1)); title('Envolventes'); xlabel('Tiempo') Pisadas sobre gravilla: envelopeGravel.m %%%%%Lee y representa las pisadas en el tiempo%%%% [pisadas,Fs] = wavread('FootstepsGravel'); N = length(pisadas); t = linspace(0, N/Fs, N); figure(1), plot(t,pisadas); title('Pisadas'); %%%%%Calcula y representa la FFT de una pisada%%%%% pisa = pisadas(7.7*Fs:(82*Fs/10-1),:); Np = length(pisa); tp=linspace(0,Np/Fs,Np); figure(2),plot(tp,pisa); title('Pisada en tiempo'); xlabel('Tiempo'); ylabel('Señal'); PISA=fft(pisa); f = Fs/2*linspace(0,1,Np/2+1); figure(3),plot(f,abs(PISA(1:length(f)))); title('Pisada en frecuencia'); xlabel('Frecuencia'); ylabel('Señal'); 82 Síntesis de sonido interactiva para videojuegos mediante Unity y Pure Data Pisadas sobre madera: envelopeWood.m %%%%%Lee y representa las pisadas en el tiempo%%%% [pisadas,Fs] = wavread('FootstepsWood.wav'); N = length(pisadas); t = linspace(0, N/Fs, N); figure(1), plot(t,pisadas); title('Pisadas'); %%%%%Calcula y representa la FFT de varias pisadas%%%%% pisa1 = pisadas(3.4*Fs:(39*Fs/10-1),:); Np1 = length(pisa1); tp1=linspace(0,Np1/Fs,Np1); figure(2), plot(tp1,pisa1); PISA1=fft(pisa1); f1 = Fs/2*linspace(0,1,Np1/2+1); figure(3),plot(f1,abs(PISA1(1:length(f1)))); title('Pisada en frecuencia 1'); xlabel('Frecuencia'); ylabel('Señal'); pisa2 = pisadas(4.2*Fs:(47*Fs/10-1),:); Np2 = length(pisa2); tp2=linspace(0,Np2/Fs,Np2); PISA2=fft(pisa2); f2 = Fs/2*linspace(0,1,Np2/2+1); figure(4),plot(f2,abs(PISA2(1:length(f2)))); title('Pisada en frecuencia 2'); %%%%%Calcula y representa la envolvente temporal%%%%% pisadas2 = 2*pisadas.*pisadas; downsample(pisadas2,15); Fc=1; [B,A] = butter(1,Fc/(Fs/15)); pisadas2 = sqrt(filter(B,A,pisadas2)); figure(6), plot(t,pisadas2(:,1)); xlabel('Tiempo'); ylabel('Señal'); Pisadas sobre follaje: envelopeGrass.m %%%%%Lee y representa las pisadas en el tiempo%%%% [pisadas,Fs] = wavread('FootstepsGrass.wav'); N = length(pisadas); t = linspace(0, N/Fs, N); figure(1), plot(t,pisadas); title('Pisadas'); %%%%%Calcula y representa la FFT de varias pisadas%%%%% pisa2 = pisadas(0.7*Fs:(11*Fs/10),1); Np2 = length(pisa2); tp=linspace(0,Np2/Fs,Np2); figure(2),plot(tp,pisa2); title('Pisada2 en tiempo'); PISA2=fft(pisa2); f2 = Fs/2*linspace(0,1,Np2/2+1); figure(3),plot(f2,abs(PISA2(1:length(f2)))); title('Pisada en frecuencia');xlabel('Frecuencia');ylabel('Señal'); pisa = pisadas(0.1*Fs:(6*Fs/10),1); Np = length(pisa); PISA=fft(pisa); 83 Sergio Pina Lagunas f = Fs/2*linspace(0,1,Np/2+1); figure(2),plot(f,abs(PISA(1:length(f)))); title('Pisada1 en frecuencia'); pisa3 = pisadas(1.2*Fs:(17*Fs/10),1); Np3 = length(pisa3); PISA3=fft(pisa3); f3 = Fs/2*linspace(0,1,Np3/2+1); figure(4),plot(f3,abs(PISA3(1:length(f3)))); title('Pisada3 en frecuencia'); pisa4 = pisadas(1.75*Fs:(22*Fs/10),1); Np4 = length(pisa4); PISA4=fft(pisa4); f4 = Fs/2*linspace(0,1,Np4/2+1); figure(5),plot(f4,abs(PISA4(1:length(f4)))); title('Pisada4 en frecuencia'); %%%%%Calcula y representa la envolvente temporal%%%%% pisadas2 = 2*pisadas.*pisadas; downsample(pisadas2,15); Fc=1; [B,A] = butter(1,Fc/(Fs/15)); pisadas2 = sqrt(filter(B,A,pisadas2)); figure(6), plot(t,pisadas2(:,1)); title('Envolventes');xlabel('Tiempo');ylabel('Señal'); Río: river.m %%%%%Representa la señal en el tiempo%%%%% [rio,Fs]=wavread('rio.wav'); N = length(rio); t = linspace(0, N/Fs, N); figure(1), plot(t,rio(:,1)); title('Río (tiempo)'); xlabel('Tiempo'); ylabel('Señal'); %%%%%Calcula y representa la Transformada de Fourier de la señal%%%%% RIO = fft(rio); f = Fs/2*linspace(0,1,N/2+1); figure(2),plot(f,abs(RIO(1:length(f)))); title('Río (frecuencia)'); xlabel('Frecuencia'); ylabel('Señal'); 84 Síntesis de sonido interactiva para videojuegos mediante Unity y Pure Data Cascada: waterfall.m %%%%%Representa la señal en el tiempo%%%%% [waterfall,Fs]=wavread('waterfall.wav'); N = length(waterfall); t = linspace(0, N/Fs, N); figure(1), plot(t,waterfall(:,1)); title('Cascada (tiempo)'); xlabel('Tiempo'); ylabel('Señal'); %%%%%Calcula y representa la Transformada de Fourier de la señal%%%%% WATERFALL = fft(waterfall); f = Fs/2*linspace(0,1,N/2+1); figure(2),plot(f,abs(WATERFALL(1:length(f)))); title('Cascada (frecuencia)'); xlabel('Frecuencia'); ylabel('Señal'); 85 Sergio Pina Lagunas Anexo C: Referencias [1] Farnell, A.J. (2007) An introduction to procedural audio and its application in computer games [2] Cook, P.R. (2001) Modelling Bill’s Gait: Analysis and parametric synthesis of walking sounds [3] Bresin, R., Friberg, A. y Dahl, S. (2001) Toward a new model of sound control [4] Bresin, R. y Fontana, F. (2003) Physic-Based sound synthesis and control: crushing, walking and running by crumpling sounds [5] Pathon, C. (2011) Modelling footsteps: Procedural Audio in games [6] Zheng, C. y James D.L. (2006) Harmonic fluids [7] Milavcic, J.M., Zita, A. y Arvidsson, P. (2004) Computational real-time sound synthesis of rain [8] van den Doel, K. (2004) Physically-based models for liquid sounds [9] Moss, W., Yeh, H., Hong, J., Ming, C.L. y Manocha, D. (2010) Sounding liquids: Automatic sound synthesis from fluid simulation [10] Dobashi, Y., Yamamoto, T. y Tomoyuki, N., (2004) Synthesizing sound from turbulent field using sound textures for interactive fluid simulation [11] Chadwick, J.N. y James, D.L. (2011) Animating fire with sound [12] Verron, C. y Drettakis, G. (2012) Procedural audio modelling for particle-based environmental effects [13] Fagerlund, S. (2004) Acoustics and physical models of bird sounds [14] Kahrs, M. y Avanzini, F. (2001) Computer synthesis of bird songs and calls [15] Smyth, T. y Smith III, J.O. (2002) The sounds of the avian syrinx – are they really flutelike? [16] Smyth, T., Abel, J.S. y Smith III, J.O. (2003) The estimation of birdsong control parameters using maximum likelihood and minimum action [17] Brothers, D.J. y Tschuch, G. (1999) Modelling vibration and sound production in insects with nonresonant stridulatory organs [18] Smyth, T. y Smith III, J.O. (2001) Applications of bioachoustics in physical modelling and the creation of new musical instruments [19] Cook, P. (1991) Identification of control parameters in an articulary vocal tract model, with applications to the synthesis of singing 86 Síntesis de sonido interactiva para videojuegos mediante Unity y Pure Data [20] Martino, R. (2000) Synthasaurus: an animal vocalization synthesizer [21] van den Doel, K., Kry, P.G. y Pai, D.K. (2002) Physically-based sound ejects for interactive simulation and animation [22] van den Doel, K. y Pai, D.K. (2002) Modelling synthesis for vibrating objects [23] O’Brien, J.F., Shen, C. y Gatchalian, C.M. (2002) Synthesizing sounds from rigid body simulations [24] James, D.L., Barbic, J. y Pai, D.K. (2007) Precomputed acoustic transfer: outputsensitive, accurate sound generation for geometrically complex vibration sources [25] Rath, M. Avanzini, F., Bernardini, N., Borin, G., Fontana, F., Ottaviani, L., Rochesso, D. (2003) An introductory catalog of computer-synthesized contact sounds, in real-time [26] Bonneel, N., Drettakis, G., Tsingos, N., Viaud-Delmon, I. y James, D.(2007) Fast modal sounds with scalable frequency-domain synthesis [27] Zheng, C. y James, D.L. (2011) Toward high-quality modal contact sound [28] Farnell, A. (2007) Synthetic game audio with Puredata [29] Paul, L.J. (2007) Video game audio prototyping with Pure Data [30] Alonso, M., Geiger, G., y Jorda, S. (2004) An internet browser plug-in for realtime audio synthesis. WEDELMUSIC '04 [31] Paul, L.J. (2003) Audio prototyping with Pure Data [32] http://docs.unity3d.com/Manual/UnityOverview.html [33] Farnell, A. (2010) Designing sound [34] Wright, M (2002) OpenSound Control specification [35] Librería UnityOSC-master de Jorge García, 2012: https://github.com/jorgegarcia/UnityOSC/tree/master/src/OSC [36] Funciones de “alucardj”: http://answers.unity3d.com/questions/456973/getting-the-texture-of-a-certain-pointon-terrain.html [37] www.mathworks.es [38] https://creative.adobe.com