En este video, veremos nuevos generadores unitarios para generar y controlar sonido. Comenzaremos por ver el código con el cual cargamos un archivo de audio para ser reproducido por Supercollider. Después pasaremos a un repaso de diferentes técnicas de síntesis, entre ellas frecuencia modulada, amplitud modulada y modulación de anillo. Recordemos inicializar el servidor en server boot para que funcione correctamente el audio. En Supercollider podemos cargar archivos de audio descomprimidos como WAV y AID. Para leerlos, necesitamos el objeto ugen llamado buffer. Como parámetros, necesitamos indicar el servidor que usamos. Este es el default asignado por la variable S. Después, utilizamos la ruta del archivo de audio. Si el script de Supercollider está grabado en la misma carpeta que el archivo de sonido, podemos utilizar este comando para que automáticamente obtengamos la ruta correcta. Sólo debemos cambiarlo por el nombre de nuestro archivo. En nuestro caso, Sonido 1. Ésto lo grabamos en la variable path y lo pasamos como argumento al buffer. Podemos ver el contenido del buffer de manera gráfica llamando la función plot. También podemos ver el número de muestras con numFrames. Para llamar a estos buffers, normalmente se les identifica con un número que Supercollider les asigna automáticamente. Para ver el número asignado a un buffer en particular, llamamos a la propiedad bufNum. Ahora, para reproducir el archivo de audio que queremos en el buffer, llamamos al objeto playBuff. Los parámetros que debemos indicar son los siguientes: número de canales, el número de buffer, es decir, debemos enlazarlo con el buffer correcto. El trigger que es una señal que indica que el buffer debe reproducirse, de momento no lo usaremos. La posición de inicio en número de muestras, loop, si es uno, el sonido se reinicia cuando termina y si es cero el sonido termina. Por último, doneAction es un parámetro del sistema que indica si debemos liberar o no la memoria cuando el buffer termina de reproducirse. Intentemos correr la siguiente línea. Intenten cambiar el rate para probar distintas velocidades en que un sonido puede reproducirse. Como ejercicio, intentemos comenzar la reproducción a la mitad del archivo. Cuando trabajamos con buffers normalmente utilizamos número de muestras. Podemos revisar cuántas muestras tiene un buffer llamando al comando numFrames. Así podemos comenzar la reproducción a la mitad del archivo si dividimos el número de muestras entre dos. Es importante que el archivo será leído con la velocidad de muestreo que Supercollider tenga. Generalmente será de 44.100 Hertz. Si el archivo fue grabado a otra velocidad, necesitamos indicar a Supercollider que lo debe reinterpretar con la función "BufRateScale.kr". A continuación, vamos a mostrar un poco de síntesis. Como se vive en cursos pasados, podemos utilizar una señal para controlar otra. A este proceso se le llama modulación. Es útil ver el espectro de una señal. Podemos llamar a nuestro visualizador de frecuencias con el objeto FreqScope. Como repaso de modulación de señales, podemos utilizar la posición de mouse X y Y para controlar otra señal. En este ejemplo, utilizamos el uGen MouseX que se encarga de mapear la posición del mouse al rango que nosotros indiquemos. En este caso, si el mouse se encuentra al lado izquierdo de la pantalla se le asignará el valor 40 mientras que el lado derecho 4000. En este otro ejemplo, usamos la posición X para controlar la frecuencia en un rango entre 40 y 4.000 mientras que la posición de Y para controlar el volumen en un rango de cero a uno. A continuación, mostraremos cómo es posible realizar las técnicas de frecuencia modulada, amplitud modulada y modulación de anillo en Supercollider. La frecuencia modulada utiliza una señal para controlar la frecuencia de otra. En este caso, podemos ver que la señal seno externa está cambiando de frecuencia con la señal moduladora. El valor de la frecuencia está cambiando desde 500 a 1.000 Hertz. Podemos ver en la consola el valor de la frecuencia moduladora llamando al atributo poll. Intentemos cambiar la frecuencia del modulador a dos. Ahora, cambiémosla a 10. Intentemos cambiar la frecuencia del modulador a 300. En el visualizador de frecuencias aparecen nuevas componentes mientras variamos la frecuencia y amplitud del modulador. Intentemos controlar la amplitud y frecuencia del modulador con los uGens MouseX para la frecuencia con un rango de cero a 200 y MouseY para la amplitud entre cero y 1.000. De manera similar a la anterior, ahora realicemos un ejemplo de amplitud modulada donde utilizaremos una señal para controlar la amplitud de otra. Podemos ver la forma de onda llamando a s.scope. Probemos con los siguientes sonidos. Intentemos cambiar la frecuencia del modulador de amplitud a 2. Ahora a 20. Ahora a 200. Intentemos cambiar la frecuencia del modulador con la posición horizontal del mouse. Podemos ver que la amplitud modulada genera dos componentes de audio, una arriba y otra abajo, pero se pierde la frecuencia original. Por otro lado, la modulación de anillo es similar a la amplitud modulada pero la señal moduladora debe ser siempre mayor o igual a cero. Probemos los siguientes sonidos. De nuevo, intentemos cambiar la frecuencia del modulador a dos. Ahora a 20. Ahora 200. Por último a 400. Ahora, podemos intentar modular la amplitud de un buffer con una señal seno. Para esto, multiplicamos la señal del buffer por el modulador y veamos lo que pasa. La amplitud empieza a oscilar de acuerdo a los valores del seno. Ahora intentemos modular el rate o bien la velocidad de lectura de un buffer. Hasta el momento, hemos utilizado solamente señales monofónicas, es decir, con un solo canal asignado. Supercollider nos permite utilizar audio multicanal de una forma sencilla por medio de arreglos. Comencemos por ver cómo enviar una señal estéreo. Si la señal es el mismo uGen pero con diferentes parámetros podemos simplemente enviar un arreglo como parte de los argumentos. En este caso, estamos creando dos funciones seno, una con frecuencia 400 en el canal izquierdo y una con frecuencia 800 en el canal derecho. Si tenemos diferentes generadores, podemos enviar cada uno de ellos como elementos de un arreglo más grande, como en este ejemplo. Del lado izquierdo tenemos una función seno de 300 Hertz y del lado derecho tenemos una función diente de sierra con frecuencia 400. Como se aprecia, si corremos un arreglo con más de dos canales podemos ver en el scope que efectivamente aparece. Sin embargo, como de momento sólo tenemos configurados dos canales de audio sólo escucharemos las primeras dos. Como última parte de este vídeo, les mostraremos cómo pueden grabar el audio que producen en Supercollider directamente a un archivo de audio. Se utiliza el comando Server.default.record para iniciar y Server.default.stopRecording para parar. Al terminar la grabación, podemos ver en la consola la ruta donde el archivo que grabamos fue grabado. Con lo anterior, pueden empezar a experimentar mezclando uGens y buffers. En el vídeo siguiente veremos cómo generar nuestros propios sintetizadores con el objeto simdef el cual permite encapsular todas estas líneas de código, de modo que puedan llamarse de forma sencilla.