Hola, bienvenidos. En este vídeo vamos a ver la noción de objetos y unidades generadoras. Ambos conceptos indispensables para comprender la lógica de programación de SuperCollider. Así que sin más preámbulos, vamos a empezar. Si bien el concepto de objeto, es indispensable para comprender la estructura del lenguaje de SuperCollider, no lo vamos a presentar en detalle. Con que construyamos una idea general de qué es un objeto será suficiente para poder continuar. Un objeto es una abstracción, una representación computacional que conjuga en un solo elemento datos y funciones. Los datos o variables representan los atributos del objeto y las funciones, sus comportamientos. Si ponemos como ejemplo a una pelota, sus atributos podrían ser: color, tamaño y el material con el que está hecha. Por otro lado, sus comportamientos podrían ser: caer, rebotar y rodar, por ejemplo. Definidos bajo una metáfora de clasificación taxonómica, los objetos se definen en una estructura de programación llamada Clase. Para que un objeto llegue a existir, la clase cuenta con un constructor que se manda a llamar para producir una instancia de este tipo de objeto. Una instancia de una clase es la construcción física del objeto, es decir, el objeto cobra materialidad y ocupa un espacio en la memoria de la computadora. Esto puede ser confuso, sin embargo no es necesario que lo domines completamente para poder continuar, pero sí es importante mencionarlo, ya que debido a su estructura, en SuperCollider todo es un objeto. Incluso los números son objetos. Esto se debe a la propiedad que tienen los objetos de heredar sus atributos y funciones para la construcción de nuevas clases. En SuperCollider todos los objetos se heredan de una Clase, la madre de todas las Clases y se llama, objeto. En el navegador de ayuda de SuperCollider, podemos ver de donde se hereda cada uno de los objetos que tenemos disponibles en el lenguaje. Por ejemplo, podemos ver que el objeto "SinOsc" se hereda de: "PureUGen", "UGen", "AbstractFunction", "Object". Una vez que un objeto es instanciado podemos enviarle mensajes para pedirle que ejecute una función o método. En SuperCollider vamos a dar preferencia al término método por encima del de función, principalmente porque es este el nombre que se utiliza para una función que le pertenece a un objeto. En SuperCollider para pedirle a una instancia de un objeto que ejecute un método, utilizamos la sintaxis de punto, vamos a ver ahora algunos ejemplos de cómo se aplica todo esto en la práctica. Mencionamos hace unos momentos, que en SuperCollider los números podían ser considerados como objetos. Una práctica muy común es llamar métodos en los números para hacer conversiones. Por ejemplo, sabemos que la frecuencia de un "La 4" es 440 Hertz. Sin embargo, aprenderse las frecuencias de todas las notas puede ser complicado. Podríamos, sin embargo, utilizar el método ".midicps" para convertir una nota MIDI a ciclos por segundo, es decir, frecuencia. Así, por ejemplo, podemos convertir el número 69 de una representación de nota MIDI a frecuencia con la siguiente sintaxis; "69.midicps". Aquí, el objeto es el número 69. A este objeto le estamos mandando el mensaje de que ejecute el método "midicps", lo que nos regresa como resultado el valor de la nota 69 en frecuencia. La misma conversión es válida en la dirección contraria. Así podemos convertir una frecuencia en su equivalente en notas MIDI. Por ejemplo: "440.cpsmidi". Así también podemos aplicar estos métodos a una regla. Por ejemplo, en el siguiente código estamos llenando un "Array" con números aleatorios entre el 20 y el 80. Después, estamos convirtiendo todos esos números, de notas MIDI a frecuencias. Iremos viendo a través del curso, como este tipo de sintaxis aparece frecuentemente. Derivado de los lenguajes de programación, "Music-n", SuperCollider implementa la noción de unidades generadoras o UGens. Los UGens, son generadores de señal, señales que pueden ser de audio o de control. Las unidades generadoras, son objetos especiales que producen señales. Las señales son, flujos de datos que van ocurriendo a través del tiempo. Como ya te estarás imaginando, estas señales pueden ser audio. Sin embargo, también pueden ser señales de control. SuperCollider está diseñado para procesar señales en bloques de 64 samples, cuando es de audio, y cuando la señales es de control, produce un sample de control por cada 64 samples de audio. A continuación presentamos algunos UGens y con ejemplos, demostraremos cuándo utilizar ".ar" y ".kr". También vamos a experimentar con el Tour de UGens y veremos cómo utilizar las hojas de ayuda en el navegador de SuperCollider. Comencemos con "SinOsc.ar". Para compilar, colocamos el cursor sobre la línea y apretamos comando enter, en Mac o control enter si estás en Windows. "SinOsc" es el objeto que produce la señal, ".ar" indica que va a producir una señal de audio, es decir, 64 samples por bloque. Dentro de los paréntesis, se encuentran los argumentos. En el caso de este objeto tenemos frecuencia, fase y amplitud. La amplitud aparece como un multiplicador. Recuerda que multiplicar una señal equivale a escalar su amplitud. Es importante mencionar, que se olvidan agregar ".ar" o ".kr", el código va a interpretarse sin arrojar mensajes de error, pero no va a emitir ningún sonido. A esto le llamamos un error silencioso. Para que un UGen pueda sonar, tiene que estar envuelto en un "SinthDef", ya veremos más adelante qué es eso. Por ahora, vamos a decir que el colocar un UGen dentro de una función y mandarle el mensaje ".play", crea un "SynthDef" y lo suena en el servidor. Es importante tener claro que es el servidor el que produce el audio, por esta misma, razón suelo referirme al servidor, como el motor de audio. Si quieres acceder a la hoja de ayuda de cualquier objeto de SuperCollider, debes seleccionar el objeto y presionar comando "D", En Mac o control "D" si estás en una PC. Veamos la hoja de ayuda de un "SinOsc". Las hojas de ayuda tienen casi todas una misma estructura, por cuestión de tiempo vamos a enfocarnos en las partes más útiles, pero poco a poco te irás familiarizando con ellas, son un gran recurso. En la parte superior, se encuentra la clasificación con la cual puedes encontrar el objeto dentro del árbol de hojas de ayuda. A continuación, vemos una lista de dónde se hereda el objeto. Una breve descripción, un enlace al código fuente que implementa el objeto y una lista de objetos relacionados. Después, viene una descripción más detallada y una lista de los métodos que implementan. Podemos ver que "SinOsc" implementa ".ar" y ".kr", es decir, puede ser utilizado como un UGen de audio y un UGen de control. En la sección de cada método se enlistan los argumentos que acepta y una descripción breve de cada argumento. Por ejemplo, "SinOsc" nos muestra que tiene una frecuencia, una fase, un multiplicador y una suma. Los valores que siguen a los dos puntos, indican el valor que tomarán los argumentos si no se les asigna uno explícitamente. Decimos que éstos, son sus valores por omisión. Finalmente, en la parte de abajo de la hoja de ayuda, suelen incluirse ejemplos, que puedes echar a andar desde ahí mismo. Veamos unos cuantos UGens más, utilizando "scope" para conocer sus formas de onda. Generemos un diente de sierra. Sus argumentos son sencillos. Solo recibe frecuencia, un multiplicador y una suma. Vamos a aprovechar para demostrar los efectos que tienen los argumentos de "mul" y "add". Con el siguiente código, asignamos a la posición de X del ratón el valor de "mul", con un rango de cero a uno y la posición de Y, el valor de "add" con un rango de menos uno a uno. Al ejecutar el código, vemos como el valor de "mul" cambia provocando un escalamiento en la señal, lo que se traduce en un cambio de amplitud. Por otro lado, el cambio del valor "add" produce una traslación de la señal en dirección de Y. Esto implica un movimiento del centro de oscilación de la señal, lo cual puede ser útil cuando queremos usar la señal para modular otro UGen, como en el caso de la modulación de frecuencia. Veamos ahora el pulso. El UGen para generar un pulso recibe como argumentos: "frecuencia, ancho de señal, mul y add". Vamos a ver que "mul" y "add", son un par de argumentos que se van a encontrar en todos los UGens. Para entender el efecto del ancho de la señal, le asignaremos a "MouseX" de la siguiente manera. Podemos ver cómo la relación del tiempo que la señal está en un valor negativo, con respecto al tiempo que está en un valor positivo, cambia con respecto al valor de "wid". Cuando el valor es 0.5 tenemos una forma de onda cuadrada. Veamos ahora, el UGen "impulse". Esta unidad generadora, es muy útil como señal de control para disparar eventos periódicos. Simplemente produce un sample con valor positivo cada cierto tiempo. Se relaciona con "impulse" un UGen llamado "Dust", que también genera impulsos, pero bajo un esquema de tiempo aleatorio, con un promedio de impulsos por segundo igual al valor de "density" asignado a su primer argumento. Programemos otro ejemplo. Cuidado con la retroalimentación, conecta tus audífonos o en caso de que no tengas, baja el volumen de tu computadora considerablemente. En este ejemplo, ocurren varias cosas interesantes. "SoundIn" acepta una señal de entrada del micrófono de tu computadora, esta es inmediatamente multiplicada por una "senoidal", lo que hace que sólo suene cuando hay entrada. La frecuencia de este senoidal, está siendo controlada por "MouseX", con un rango entre 80 y 640. "MouseX" es un UGen de control, si ves su hoja de ayuda notarás que sólo implementa ".kr". También encontrarás que los argumentos que acepta son: "minval", "maxval", "warp" y "lag". De los cuales, sólo estamos definiendo "minval", que es el valor que entrega el UGen cuando el ratón se encuentra en su posición a la extrema izquierda. Y "maxval" cuando está a la extrema derecha. Tour de UGens. En esta sección vamos a presentar el "Tour Of UGens", que viene en los archivos de ayuda de SuperCollider. Es una buena manera de conocer más UGens y explorar cómo pueden ser implementados. Vamos al navegador de ayuda y selecciona la opción de buscar, "Search" en inglés. En "search", escribe "Tour Of UGens". En la parte inferior aparecerá un enlace con el nombre, da clic en él. Esta hoja presenta una amplia gama de UGens disponibles en SuperCollider, vienen categorizados y puedes probarlos utilizando los ejemplos. Algo bonito de las hojas de ayuda, es que puedes ejecutar el código sin tener que copiarlo al editor de texto, sólo selecciona un ejemplo y ejecuta, para detenerlo presiona [cmd + .] , si estás en Mac o [ctrl + .] si estás en Windows o Linux. Explora los ejemplos y ve reconociendo las sonoridades que produce cada uno de los generadores. Ésto te dará una buena idea de lo que es posible con SuperCollider. En este vídeo vimos la noción de objetos, unidades generadoras y "AudioRate" y "ControlRate". Hicimos algunos ejemplos y vimos como pueden ser anidadas las unidades generadoras unas dentro de otras. Algunas utilizadas con "ControlRate" para controlar valores o argumentos de otra unidad generadora. También vimos el Tour de UGens, una bonita posibilidad para explorar los diferentes UGens que nos ofrece SuperCollider e ir aprendiendo sus diferentes sonoridades. Espero que les haya gustado.