34
upercollider (SC) - MME II -unearte * Supercollider es en esencia un lenguaje de programación, por lo que la sintáxis (los símbolos y el orden en que aparecen en el texto) es fundamental. * algunos símbolos a cuidar: . ; : .ar .kr { [ ( ) ] } / \ si es Mayúscula o minúscula, si hay o no espacio en blanco Siempre que se abre una { debe cerrarse la } Siempre que se abre un [ debe cerrarse el ] Siempre que se abre un ( debe cerrarse el ) * En Windows. Para conocer un UGen se busca con el Explorador de Windows el archivo: C:\Archivos de programa\SuperCollider\Help\UGens\UGens.htmly se abre y busca la información (recomiendo usar buscar palabra que usualmente es la combinación de teclas Ctrl+F, y para la siguiente F3). Yo uso los Browsers Mozilla Firefox o Google Chrome para abrir los archivos .html. * En Windows. Recomiendo que en tu computadora abras el Explorador de Windows, luego el menú Herramientas y el sub-menú Opciones de Carpeta, el sub-sub-menú Ver y de la lista dejar sin tilde la opción Ocultar las extensiones de archivo para tipos de archivo conocido y así podrás ver qué extensión tiene cada archivo en el Explorador, como por ejemplo UGens.html * Curioseen todo lo que quieran el Help de Supercollider y no le tengan miedo. Si no entienden podrán preguntar o seguir intentando dar con una respuesta satisfactoria y cuando entiendan mejor el programa y la teoría sabrán que leyeron algo al respecto en algún lado de la Ayuda, pueden encontrar la información más fácilmente y tal vez entonces entiendan mucho más. * 1er sonido en SC (1er UGen: SinOsc): {SinOsc.ar(440,0,0.2)}.play;

Up Er Collider

  • Upload
    ema88vm

  • View
    42

  • Download
    2

Embed Size (px)

DESCRIPTION

Sc

Citation preview

upercollider (SC) - MME II -unearte

* Supercollider es en esencia un lenguaje de programación, por lo que la sintáxis (los símbolos y el orden en que aparecen en el texto) es fundamental.

* algunos símbolos a cuidar: . ; : .ar .kr { [ ( ) ] } / \ si es Mayúscula o minúscula, si hay o no espacio en blanco

Siempre que se abre una { debe cerrarse la }Siempre que se abre un [ debe cerrarse el ]Siempre que se abre un ( debe cerrarse el )

* En Windows. Para conocer un UGen se busca con el Explorador de Windows el archivo:C:\Archivos de programa\SuperCollider\Help\UGens\UGens.htmly se abre y busca la

información (recomiendo usar buscar palabra que usualmente es la combinación de

teclas Ctrl+F, y para la siguiente F3). Yo uso los Browsers Mozilla Firefox o Google Chrome para

abrir los archivos .html.

* En Windows. Recomiendo que en tu computadora abras el Explorador de Windows, luego el

menú Herramientas y el sub-menú Opciones de Carpeta, el sub-sub-menú Ver y de la lista dejar

sin tilde la opción Ocultar las extensiones de archivo para tipos de archivo conocido y así

podrás ver qué extensión tiene cada archivo en el Explorador, como por ejemplo UGens.html

* Curioseen todo lo que quieran el Help de Supercollider y no le tengan miedo. Si no entienden

podrán preguntar o seguir intentando dar con una respuesta satisfactoria y cuando entiendan mejor

el programa y la teoría sabrán que leyeron algo al respecto en algún lado de la Ayuda, pueden

encontrar la información más fácilmente y tal vez entonces entiendan mucho más.

* 1er sonido en SC (1er UGen: SinOsc):

{SinOsc.ar(440,0,0.2)}.play;

En Windows. Colocar el cursor sobre la línea del texto y teclear Ctrl+ENTER . Para silenciar teclear ALT+.Si se quiere producir el sonido de nuevo recuerda volver a colocar el cursor en la línea del texto.

* 2do sonido en SC (2do UGen: Line):

{SinOsc.ar(Line.kr(220,880,6),0,0.2)}.play;

TAREA 1:

Explorar los UGens Blip, Formant, Klang y XLine revisando su Help y probando con distintos valores para sus argumentos.

SC: Generadores de Envolventes

En Supercollider el UGen EnvGen (Generador de Envolvente) tiene la particularidad de

estar formado por dos expresiones: EnvGen(.ar o .kr) y Env (. "el tipo de envolvente").

Abra los archivos

Archivos de programa/SuperCollider/Help/UGens/Synth control/Envelopes/EnvGen.html

y

Archivos de programa/SuperCollider/Help/Control/Env.html

para revisarlos y estudiarlos mientras lees este blog.

Abra SC y pegue el siguiente código y ejecútelo (no se olvide de encender (BOOT) el

servidor):

{Saw.ar(220,0.3)*EnvGen.kr(Env.perc(0.6,3,1),1,doneAction:2)}.play;

Estos son los parámetros que estamos colocando (confírmenlos con la Ayuda (Help)):

Saw: oscilador de forma de onda Diente de Sierra / .ar: calidad de audio / 220:

frecuencia del oscilador en Hertz / 0.3: nivel de amplitud del oscilador

EnvGen.kr: generador de envolvente, calidad de control /Env.perc: envolvente tipo

percusivo /0.6 segundos de tiempo de ataque de la envolvente percusiva, 3 segundos

de caída a 0 de la envolvente luego de haber alcanzado un nivel de 1 (este es el valor

de default y no sería necesario colocarlo, a menos que se quiera alcanzar otro valor).

Aquí terminan los parámetros de Env.perc y siguen los demás parámetros de EnvGen /

1: puerta abre cuando se le da la orden de procesar el código (Control+Enter) /

doneAction:2 instrucción para que una vez que se complete la envolvente percusiva

(caiga a 0) se libere la memoria que está ocupando el proceso, que de hecho no va a

sonar más.

Env define el tipo de envolvente a generar. Digamos por simplificar que define la forma

gráfica de la envolvente, mientras que EnvGen define cuándo producir esa forma

gráfica definida porEnv y si la vamos a escalar en su amplitud (ponerla

proporcionalmente más grande o más pequeña) o en el tiempo (que dure

proporcionalmente más o menos).

Podemos sólo graficar la salida de Env en SC sin necesidad de producir sonido:

Env.perc(0.6,3,1).plot Evalúa (ejecuta) este código en SC y observa el gráfico

resultante.

Env.perc(0.6,3,1).test se escucha una sinusoide de 440 Hz con la envolvente dinámica

determinada por Env.perc

Env.perc(0.6,3,1).test.plot

Prueba las siguientes expresiones y observa lo que está sucediendo:

Env.perc(0.6,3,1, -4).test..plot

Env.perc(0.6,3,1, -8).test.plot

Env.perc(0.6,3,1, -32).test.plot

Env.perc(0.6,3,1, 4).test.plot

Env.perc(0.6,3,1, 8).test.plot

Env.perc(0.6,3,1, 32).test.plot

Todo generador de envolvente requiere de una Puerta (GATE)para determinar su

funcionamiento. Con una puerta cerrada (GATE = 0) el generador de envolvente no

produce salida. Al abrir la puerta (GATE = 1) se produce la salida del generador de

envolvente siguiendo los parámetros definidos.

En SC hay envolventes (Env) que tienen un Nivel de Permanencia (SUSTAIN), valor

donde permanece la salida de la envolvente hasta que se cierre la puerta (GATE = 0) y

otros Env donde no existe ese SUSTAIN y simplemente se completa el programa

establecido en los parámetros de la envolvente y no hay necesidad de cerrar la puerta.

Tipos de Env en SC que se determinan dentro de un tiempo establecido y que no

utilizan SUSTAIN:

Env.linen

Env.triangle

Env.sine

Env.perc

Tipos de Env en SC que utilizan SUSTAIN:

Env.adsr

Env.dadsr

Env.asr

Env.cutoff

Evalúa los siguientes códigos que ejemplifican el uso de Env.adsrcon un GATE

implementado con MouseButton.kr:

{BrownNoise.ar(0.3)*EnvGen.kr(Env.adsr(2,5,0.4,3),MouseButton.kr(0,1),doneAction:2)

!2}.play;

{BrownNoise.ar(0.3)*EnvGen.kr(Env.adsr(2,5,0.4,3),MouseButton.kr(0,1))!2}.play;

¿Detectas y te explicas la diferencia entre ambos?

Al abrir el Gate (pulsar el botón del ratón) el EnvGen produce una salida que sube a 1

en 2 segundos (tiempo de ataque - attack), luego baja a 0.4 (nivel de permanencia

- sustain) en 5 segundos (tiempo de caída inicial - decay) y se queda en ese nivel

hasta que se cierre la puerta (se levante el botón del ratón), y a partir de esa acción la

salida va a bajar a 0 en 3 segundos (tiempo de caída final - release). Si la puerta se

cierra antes de llegar al nivel de permanencia (sustain) actúa la caída final - release.

El tipo de Env Env.new puede definirse tanto con Sustain o por tiempo determinado.

En Env.new se define un arreglo (array) para niveles y otro arreglo para duraciones en

segundos. Un array se escribe entre [ ] . Un arreglo no es más que una secuencia de

números (o de objetos).

Evalúa el siguiente código:

{PinkNoise.ar(0.3)*EnvGen.kr(Env.new([0,0.8,0.2,1,0],[2,1,3,5],0),1,doneAction:2)!

2}.play;

El ruido rosado crece en dinámica de 0 a 0.8 en 2 segundos, luego decrece a 0.2 en 1

segundo, crece a 1 en 3 segundos y finalmente decrece a 0 en 5 segundos.

Ahora evalúa el siguiente código:

{PinkNoise.ar(0.3)*EnvGen.kr(Env.new([0,0.8,0.2,1,0],

[2,1,3,5],'linear',3),MouseButton.kr(0,1),doneAction:2)!2}.play;

Pulsa el botón del ratón y déjalo pulsado. El rudio rosado crece de 0 a 0.8 en 2

segundos, luego decrece a 0.2 en 1 segundo, crece a 1 en 3 segundos y se queda aquí

mientras se tenga pretado el botón del ratón. En cuanto se suelta el ruido rosado

decrece de 1 a 0 en 5 segundos. El valor 3, después de la definición del tipo de curva

'linear' (lineal) significa que el sustain se establece en el nodo 3 del arreglo de

amplitudes. El nodo 0 = 0, nodo 1 = 0.8, nodo 2 = 0.2, nodo 3 = 1.

{PinkNoise.ar(0.3)*EnvGen.kr(Env.new([0,0.8,0.2,1,0],

[2,1,3,5],'linear',1),MouseButton.kr(0,1),doneAction:2)!2}.play;

Observa lo que sucede al cambiar el sustain en el nodo 3 por sustain en el nodo 1 .

El uso más obvio de los generadores de envolvente es crear envolventes dinámicas

para los sonidos. Éste es un parámetro fundamental de un sonido y mucho de su

carácter puede ser evocado desde éste parámetro. Una envolvente "percusiva" por

ejemplo, ya dice mucho del carácter del sonido. Pero también podríamos producir

glissandi controlados (al aplicar las envolventes a controlar las frecuencias de los

osciladores) o modificar el timbre del sonido ya sea controlando las frecuencias de

corte o frecuencias de resonancia y el ancho de banda o resonancia (Q) de los filtros o

controlando individualmente las envolventes dinámicas de los distintos componentes

sinusoidales de una onda.rnes, 26 de marzo de 2010

Filtros

Los filtros permiten modificar el timbre (color) del sonido. Con filtros resonantes se pueden crear resonadores que le dan mucha más calidez a un sonido generado electrónicamente.

La calidad y las características tímbricas individuales de un violín la determina el cuerpo resonante más que la cuerda tensa.

Teorema de Fourier:

Cualquier onda puede ser representada como una suma de ondas sinusoidales de diferentes amplitudes, frecuencias y fases.

Cualquier onda periódica puede ser representada como una suma de sinusoides cuyas frecuencias son múltiplos enteros de una frecuencia fundamental. Estos componentes sinusoidales armónicos se denominan parciales.

Si una onda presenta sólo componentes no armónicos o inarmónicos entonces la onda no es periódica.

Espectro de frecuencias - espectro de líneas:

Es una representación gráfica de los componentes armónicos y no armónicos de una onda. Se representa el peso o valor relativo o normalizado de cada componente en función de la frecuencia. Cada componente es una línea, su tamaño o altura (no confundir con altura musical) - valor en el eje vertical - representa el peso o valor relativo de ese componente y el eje horizontal representa la frecuencia del componente sinusoidal.

Espectro de líneas de ondas "clásicas" utilizadas en música electrónica:

Onda Sinusoidal:

Expresiones matemáticas para representar números enteros, pares e impares:n , serie de números enteros: 0,1,2,3,4,5,6,7,8,9,10,11......

2n , serie de números pares: 0,2,4,6,8,10,12... donde n es la serie de números enteros

(2n+1) , serie de números impares: 1,3,5,7,9,11,13,15,... donde n es la serie de números enteros

Así podemos decir que los parciales de una onda triangular son sólo los parciales impares con un valor de (2n+1)*F donde F es la frecuencia fundamental de la onda y los pesos de cada parcial van a ser inversamente proporcionales al cuadrado del número de

armónico: 

Complejidad del timbre:

La onda más sencilla es una onda sinusoidal ya que presenta un sólo componente o parcial. Mientras más parciales y componentes no armónicos presente una onda, se habla de una sonido más complejo, tímbricamente hablando. El sonido más complejo de todos es el ruido blanco que contiene todas las sinosoides posibles (en realidad contiene la misma probabilidad de que aparezca cualquier componente sinusoidal).

Ruido:

En teoría de comunicaciones el ruido es lo que no es parte del mensaje. La idea de que el ruido es un sonido desagradable o feo es un juicio de valor. Cualquier sonido puede ser deseado o no para la construcción de un discurso musical.

Respuesta de Frecuencia:

Si tomamos el siguiente diagrama de

bloques y graficamos el valor de salida (amplitud de la onda de salida) de la Caja X dividido entre el valor de entrada (amplitud de la onda de entrada) a la Caja X para cada valor de frecuencia del oscilador sinusoidal, obtenemos la Respuesta de Frecuencia de la Caja X.

Si la salida es proporcional a la entrada para todo el rango de frecuencias entonces se dice que la respuesta de frecuencia esplana, o en otras palabras la relación entre la salida y la entrada es independiente de la frecuencia. Es lo que deseamos, por ejemplo, en un amplificador: que nos amplifique de la misma manera todas las señales de audio, y no que nos amplifique más los agudos que los graves, o que destaque un registro medio. En los amplificadores se busca la respuesta de frecuencia más plana posible.

Respuesta de Frecuencia Plana donde la salida es siempre igual a la entrada:

Filtro Pasa-bajos:

Respuesta de Frecuencia de un filtro pasa-bajos (low pass filter):

0 dB (decibeles) significa que la salida es igual a la entrada.

-3 dB significa que la salida es la mitad de la entrada.

La pendiente del filtro se mide en dB/octava. Valores comunes: -6 dB/octava, -12 dB/octava, -24 dB/octava.... mientras mayor sea la pendiente más atenuación tienen los parciales superiores y por lo tanto menos contribuyen al timbre del sonido.

El filtro pasa-bajos le quita "brillo" al sonido.

Filtro Pasa-altos:

Respuesta de Frecuencia de un filtro pasa-altos (high pass filter):

Filtro Pasa-banda:

Respuesta de Frecuencia de un filtro pasa-banda (band pass filter):

Filtro Elimina-banda o muesca:

Respuesta de Frecuencia de un filtro elimina-banda o muesca (notch filter):

Si sobreponemos la Respuesta de Frecuencia de un Filtro sobre el Espectro de Líneas

de una señal (sea o no periódica) podemos llegar a algunas conclusiones sobre el

resultado sonoro.

El resultado de filtrar una señal no depende sólo del filtro sino en buena medida

también de la señal entrante. Así, ¿tiene sentido filtrar una onda sinusoidal? Hay

mejores maneras de modificar la amplitud de una sinusoide que filtrándola, a menos

que queramos destacar o eliminar una sinusoide de una señal más compleja.

Filtros en Cascada:

Si la salida de un filtro se conecta a la entrada de otro se dice que están conectados en

cascada. Si ambos filtros son iguales (misma frecuencia de corte y misma pendiente)

es equivalente a un sólo filtro con la misma frecuencia de corte y el doble de pendiente

(si cada filtro atenúa a 12 dB/octava, entonces el efecto de los filtros en cascada es

atenuar a 24 dB/octava.

Resonancia - Filtros Resonantes - Resonadores:

La resonancia es la tendencia de un cuerpo físico a vibrar en una o más frecuencias

específicas.

Los filtros resonantes simulan la resonancia de cuerpos físicos introduciendo

realimentación (feedback) que potencia una banda de frecuencias alrededor de la

frecuencia de corte del filtro. La cantidad de resonancia generalmente afecta el ancho

de la banda de frecuencias que se amplifica, valores bajos resaltarán una banda más

ancha mientras que valores altos de resonancia destacarán bandas más estrechas.

Algunos filtros resonantes comenzarán a oscilar (generar una onda sinusoidal) cuando

la resonancia (también conocida como elfactor Q o indice de calidad: Quality Factor)

alcanza un cierto nivel. A veces se logran unos efectos de aullidos, chillidos,... muy

interesantes jugando con valores extremos de resonancia.

Q = Fc / ancho de banda

Respuesta de Frecuencia de un Filtro Pasa Bandas con Qvariable:

Si uno estimula un filtro resonante con un impulso el resultado es un golpe resonante.

El impulso es una señal muy corta (con una duración prácticamente instantánea). Se

logran sonidos de percusión afinada y si colocamos una serie de filtros resonantes en

paralelo (el impulso entra a todos los filtros y sus salidas se suman todas) podemos

construir timbres percusivos variados con características acústicas mucho más

interesantes que si oímos sólo el impulso sin filtrar (que sería como un click).

En otra entrega exploremos algunos circuitos con filtros en los programas de

síntesis pd (pure data) y sc (supercollider).

Curso de SuperCollider 3

Nivel 1

Lección 1

Copyright © 2010 Sergio Luque Ancona www.sergioluque.com

¿De dónde descargar el programa?

La última versión de SuperCollider (para Mac OS X, Linux y Windows) se puede descargar de la siguiente dirección:

http://supercollider.sourceforge.net

SuperCollider

- un lenguaje de programación: con una estructura orientada a objetos basada en la del lenguaje SmallTalk y, por coincidencia, con una sintaxis muy similar a la del lenguaje Ruby (este lenguaje está actualmente muy en boga).

- un compilador: cuando evaluamos nuestro código, éste es compilado y ejecutado inmediatamente; como resultado podemos obtener: sonidos, números o algún texto con información.

- un servidor de síntesis de audio extremadamente eficiente, que puede ser controlado, a través del protocolo OSC, no sólo por el lenguaje SuperCollider, sino por muchos otros lenguajes y aplicaciones. Algunos ejemplos: Max/MSP/Jitter, PD, Processing, Reaktor, Python, Java.

- un editor de texto: escribimos líneas de código que contienen instrucciones para sintetizar audio (estos textos son guardados como archivos de texto RTF (Rich Text Format)). El editor no sólo contiene las funciones típicas de cualquier procesador de textos básico, como copiar, pegar, buscar y reemplazar; sino que también tiene otras funciones que son útiles al programar y al compilar.

Post Window457107Cuando arrancamos el programa, aparece una ventana con información, conocida como Post Window. En ésta aparecerá información útil, como los resultados de nuestros códigos o los mensajes de error.

La primera información que vemos es el resultado de la inicialización del programa y de la compilación de su librería.

Podemos utilizar esta ventana para escribir y evaluar texto, pero generalmente es preferible abrir una nueva:

// crea una nueva ventana seleccionando en el menú superior: // File > New

Evaluar código

Para evaluar código es necesario seleccionarlo en su totalidad y pulsar:

- C-c C-c en Linux- enter (no la tecla return) o shift-return en Mac OS X- control-enter en Windows

Si queremos evaluar una sola línea, sólo es necesario ubicar el cursor en cualquier parte de ésta y pulsar las teclas de ejecución.

// evalúa las siguientes líneas, una por una, y observa la Post Window

1 + 1

2 * 2

5 / 2

2 ** 3

81.sqrt

"hola"

34.6192312.round(0.01)

34.6192312.round(1)

440.cpsmidi

440.cpsmidi.round(1)%12

rrand(1, 64)

['do', 're', 'mi', 'fa', 'sol', 'la', 'si'].choose

Servidores

Para poder producir sonido necesitamos prender un servidor de audio. Disponemos de dos servidores predefinidos: el interno y el local.

El servidor interno corre en el mismo proceso que la aplicación SuperCollider, es interno al programa y por esto mismo tiene ciertas ventajas, producto de las mayores posibilidades de comunicación entre los dos.

El servidor local corre en el mismo ordenador que la aplicación SuperCollider, pero es un programa diferente, llamado 'scsynth'. La ventaja de usarlo, es que en caso de que el servidor deje de funcionar, la aplicación seguirá corriendo y viceversa.

También es posible crear más servidores, y que éstos se encuentren en distintos ordenadores, comunicados vía ethernet o wifi, en redes locales o en internet.

Sólo es necesario prender un servidor por sesión (casi nunca requeriremos tener más de un servidor prendido).

Hay dos formas prender un servidor:

- a través de las ventanas que los representan

- con código

// prende el servidor local presionando el botón Boot y observa la Post Window

// apágalo presionando el mismo botón, que ahora debe decir Quit

Ahora vamos a prender el servidor interno con código:

s = Server.internals.boot

// trata de evaluar la siguiente línea

{ Saw.ar(440, 0.3) }.play

En la Post Window vemos el siguiente mensaje:

WARNING:server 'localhost' not running.

Al iniciar el programa, el servidor local es nombrado el servidor 'default' (por defecto). Si queremos utilizar el servidor interno, es conveniente que lo declaremos 'default', ya sea presionando el botón con el mismo nombre en la ventana que lo representa o con código:

s = Server.internalServer.default = s

// que es equivalente a haber escrito:

Server.default = Server.internal

// evalúa la siguiente línea

{ Saw.ar(440, 0.3) }.play

Para detener el sonido pulsa las teclas:

- C-c C-s en Linux - command-punto en Mac OS X - alt-punto en Windows

NOTA. Si estás utilizando Linux:

1.- Para una más detallada explicación sobre el Emacs IDE, lee el tutorial de Stefan Kersten sobre scel (SuperCollider-EmacsLisp):

http://sergioluque.com/sc/scel-tut.txt

2.- En la siguiente dirección podrás encontrar más información acerca de cómo utilizar SuperCollider en Linux:

http://swiki.hfbk-hamburg.de:8888/MusicTechnology/478

Paréntesis

Mediante el uso de paréntesis es posible agrupar varias líneas de código, para poder seleccionarlas rápidamente y evaluarlas.

(// haz doble click a un costado de cualquiera de los dos

// paréntesis y presiona enter {

{ Saw.ar(LFNoise2.kr(

10, 261, 261),

0.3)} ! 2

}.play)

// el código anterior también se puede escribir en // una sola línea, pero esto a veces hace que su // lectura sea un poco más difícil

{{ Saw.ar(LFNoise2.kr(10, 261, 261),0.3) } ! 2 }.play

// haz doble click a un costado de CADA UNO de los// siguientes paréntesis (

(

(

(

)

)

)

)

Comentarios

Para añadir comentarios a nuestros programas, sólo es necesario poner dos diagonales al inicio de cada línea ( // ) o rodearlas todas con /* */

//evalúa esta línea

(

/* y este grupodelíneastambién*/)

En la Post Window, el compilador nos responde nil, que equivale a no existente o a nada. Que es lo mismo que si diéramos enter a una línea vacía.

Function.play

{ }.play es la forma más simple para generar sonido, muy útil para probar código rápidamente, pero no demasiado conveniente para la construcción de piezas

({ RHPF.ar(

LFPulse.ar(SinOsc.kr([ 1.0, 1.1 ], 0, 10, 21), 0.1),

10000, 0.1

).clip2(0.4)}.play)

UGens

Los UGens ('Unit Generators') son objetos que producen algún tipo de señal. Al conectar varios de ellos creamos lo que se conoce como 'patch'.

Sus nombres siempre empiezan con mayúscula y pueden ser de dos tipos:

- Audio Rate

Los UGens que reciben el mensaje .ar corren a velocidad de audio, 44100 muestras ('samples') por segundo.

Hay que mandar el mensaje .ar a los UGens cuando sean parte de la cadena de audio que será escuchada.

/*

Nota: para evaluar la siguiente línea tienes quetener el servidor interno prendido, ya que el mensaje scope solo funciona en este servidor(ésta es una de las principales ventajas de utilizar el servidor interno)*/

{ SinOsc.ar(440, 0, 0.3) }.scope

- Control Rate

Los UGens que reciben el mensaje .kr corren a velocidad de control. Producen una muestra (un 'sample') en el tiempo en que un UGen a velocidad de audio produciría 64 muestras. Es por esto que los UGens de control son más baratos, computacionalmente hablando, que sus contrapartes a velocidad de audio.

Usamos a los UGens de control como moduladores, esto es, como señales que controlan los parámetros de una señal de audio.

// evalúa las siguientes líneas

{ SinOsc.kr(440, 0, 0.3) }.scope

{ SinOsc.ar(SinOsc.kr(1, 0, 500, 1000), 0, 0.3) }.scope

// abre el archivo SC2-examples_1.scd que se encuentra en el directorio // /SuperCollider/examples/demonstrations/ y corre varios // de los ejemplos

Argumentos y SinOsc

{ SinOsc.ar(440, 0, 0.3, 0) }.play

SinOsc es un oscilador sinusoidal, tiene 4 argumentos o 'inputs', el primero es la frecuencia. Vamos a accesar su archivo de ayuda para averiguar cuáles son los otros tres.

-F1

Primer argumento: freq

La frecuencia del oscilador en Hertz.

{ SinOsc.ar(440, 0, 0.3) }.scope

{ SinOsc.ar(880, 0, 0.3) }.scope

{ SinOsc.ar(220, 0, 0.3) }.scope

Segundo argumento: phase

En muchos de los osciladores la fase se indica en radianes, con un rango de 0 * pi a 2 * pi

/*Nota sobre radianes:

0pi = 0 * 3.1415926535898 = 0 = 0 grados 0.5pi = 0.5 * 3.1415926535898 = 1.5707963267949 = 90 gradospi = 3.1415926535898 = 3.1415926535898 = 180 grados1.5pi = 1.5 * 3.1415926535898 = 4.7123889803847 = 270 grados2pi = 2 * 3.1415926535898 = 6.2831853071796 = 360 grados = 0 grados

*/

La fase difícilmente cambia el carácter de un sonido, pero es muy útil en un sinfín de situaciones: como cuando usamos una onda como controlador de algún parámetro o cuando queremos que dos señales entren y salgan de fase.

Ondas sinusoidales con las siguientes fases: 0pi, 0.5pi, 1pi, 1.5pi, 2pi

Tercer argumento: mul

mul es donde indicamos la amplitud de la onda: su altura o tamaño en el eje de la Y.

Si estuviéramos escuchando una determinada onda, mientras más grande fuese su amplitud, los altavoces se moverían más hacia adelante y hacia atrás, comprimiendo más aire, lo que dará como resultado un volumen más alto.

El valor 'default' de mul es 1.0, lo que significa que la onda estará en 1.0 en su punto más alto y en -1.0 en el más bajo.

// Nota: 1.0 es la amplitud máxima que el audio digital puede tener sin // distorsionar

{SinOsc.ar(440, 0, 0.1) }.scope

{ SinOsc.ar(440, 0, 0.8) }.scope

Es útil pensar en el parámetro mul como una multiplicación que nos genera el rango de la onda:

- una sinusoidal multiplicada por 1.0 tendrá un rango de -1.0 a 1.0

- si la multiplicáramos por 100, iría de -100.0 a 100.0

// Ir de -100.0 a 100.0 nos puede ser útil para modular los parámetros de// otro UGen.

Cuarto argumento: add

Si mul es una multiplicación, add es una suma. El valor 'default' de add es 0, esto es, nada le es sumado a la señal.

Si mul = 1.0 y add = 0.0, la señal irá de -1.0 a 1.0

Si mul = 1.0 y add = 100.0, la señal irá de 99.0 a 101.0

Si mul = 1000.0 y add = 5000.0, la señal irá de 4000.0 a 6000.0

// de -0.2 a 0.2

{ SinOsc.ar(440, 0, 0.2, 0) }.scope

// de 0.6 a 1.0

{ SinOsc.ar(440, 0, 0.2, 0.8) }.scope

// de -1.0 a -0.6

{ SinOsc.ar(440, 0, 0.2, -0.8) }.scope

/*Cosas que recordar:

- mul * 2 es el rango total de la señal- add es el valor central del rango- el valor más bajo será add - mul- el valor más alto será add + mul

*/

Modulación de Parámetros

Para ejemplificar el uso de mul y add, vamos a modular la frecuencia de una sinusoidal.

Primero, una sinusoidal sin modulación de ningún tipo:

{ SinOsc.ar(440, 0, 0.3) }.play

En el siguiente ejemplo, la frecuencia es modulada por otra onda sinusoidal, y va de 100 Hz (7100 - 7000) a 14100 Hz (7100 + 7000).

El rango de la modulación es de 14000 Hz (7000 * 2) y su frecuencia es de 0.5 Hz (un ciclo cada dos segundos).

Como la fase es de 0, la modulación empieza en el valor central del rango: 7100 Hz.

{ SinOsc.ar(SinOsc.kr(0.5, 0, 7000, 7100), 0, 0.3) }.play

Al cambiar la fase a 0.5pi, la modulación empieza en 14100 Hz.:

{ SinOsc.ar(SinOsc.kr(0.5, 0.5pi, 7000, 7100).scope, 0, 0.3) }.play

¿Cómo buscar más ayuda?

// accesa los archivos de ayuda de Saw (onda de serrucho), // Pulse (onda cuadrada) y LFTri (onda triangular).

Supongamos que la clase LFTri no tiene archivo de ayuda o que su archivo de ayuda no contiene la información que requerimos: lo que tendríamos que hacer es ver su código para saber cuáles son sus argumentos y conocer más sobre su implementación.

//selecciona LFTri y accesa la opción de menú: Lang > Open Class Def

En muchos casos, con hacer esto ya podríamos saber cuáles son los argumentos de esta clase, pero al hacerlo con LFTri sólo vemos:

LFTri : LFSaw{}

El código anterior significa que LFTri hereda todos sus argumentos de LFSaw. Veamos los argumentos de este último:

LFSaw : UGen {*ar {

arg freq = 440.0, iphase = 0.0, mul = 1.0, add = 0.0;...

Entonces los argumentos de LFTri son:

LFTri.ar(freq, iphase, mul, add)

NOTA. Para conocer todos los 'shortcuts' que hay disponibles, tanto para Mac OS X como para Linux y Windows, selecciona la palabra Shortcuts y ve a su archivo de ayuda.

Generadores de Ruido a Baja Frecuencia

Hay tres tipos de generadores de ruido a baja frecuencia:

LFNoise0, LFNoise1 y LFNoise2.

Argumentos: freq, mul y add

freq - frecuencia con la que se generarán valores aleatorios.

LFNoise0 - valores aleatorios no interpolados:

{ LFNoise0.ar(440, 0.3) }.scope(zoom: 4)

LFNoise1 - valores aleatorios interpolados linealmente:

{ LFNoise1.ar(440, 0.3) }.scope(zoom: 4)

LFNoise2 - valores aleatorios interpolados cuadráticamente:

{ LFNoise2.ar(440, 0.3) }.scope(zoom: 4)

/*

evalúa el siguiente código y pulsa la letra M para aumentar el tamaño del stethoscope que aparecerá.

los primeros dos canales son los que escuchamos a través de los altavoces.

mueve el 'mouse' en el eje de la X para ir seleccionando los distintos tipos de onda que aparecen en los canales.*/

({ Out.ar(2, [ SinOsc.ar(440, 0, 0.3), LFTri.ar(440, 0, 0.3), Pulse.ar(440, 0.5, 0.3), Saw.ar(440, 0.3), LFNoise0.ar(440, 1), LFNoise1.ar(440, 1) ] );

In.ar(MouseX.kr(2,7).round(1)) ! 2}.scope(8))

Ejercicios:457{ SinOsc.ar(SinOsc.kr(1, 0, 500, 5000), 0, 0.3) }.play

1.- ¿Cuál es el rango del oscilador que está modulando la frecuencia?

2.- ¿Cuál es su límite inferior?

3.- ¿Cuál es su límite superior?

4.- ¿Cuál es el valor central?

{ SinOsc.ar(SinOsc.kr(10, 0, ?, ?), 0, 0.3) }.play 5.- ¿Qué valores debemos poner a los argumentos mul y a add si quisiéramos que la frecuencia fuera de 30 Hz a 14000 Hz?

6.- ¿De 1000 Hz a 1007 Hz?

7.- ¿De 0.01 Hz a 0.015 Hz?

8.- ¿De 260 Hz a 460 Hz?

// Apaga el servidor

9.- Con código prende el servidor interno y haz que sea el servidor 'default' de la sesión.

10.- Crea una onda de serrucho que tenga una frecuencia de 880 Hertz.

11.- Haz que la frecuencia del oscilador anterior sea modulada por una onda sinusoidal que vaya de 1000 a 10000 Hz. La frecuencia de la modulación debe ser de 1 ciclo por cada 10 segundos. Pon la fase adecuada para que la modulación empiece en 1000 Hz.

12.- Modula la amplitud del oscilador anterior con una onda de serrucho a baja frecuencia (LFSaw), la amplitud debe ir de 1.0 a 0.0 y la frecuencia de esta modulación debe ser de 3 Hertz.

13.- Modula la frecuencia de: - una onda triangular (LFTri) con ruido a baja frecuencia no

interpolado - una onda cuadrada (Pulse) con LFNoise1 - una onda de serrucho (Saw) con LFNoise2 Escoge tú la velocidad y el rango de la modulación. Tendrás que

utilizar el mul y el add de los generadores de ruido para especificar el rango de la modulación, como lo hicimos antes con los otros osciladores.

Utiliza { }.scope en vez de { }.play

14.- Para que te familiarices con los UGens disponibles, selecciona la palabra UGens y ve a su archivo de ayuda.