viernes, 5 de febrero de 2010

SC y el ratón (Mouse)

En Supercollider el uso del ratón de la computadora puede resultar muy útil, sobre todo para realizar pruebas que después pueden ser implementadas de otra manera.

A partir de SC 3 ya funcionan en Windows los UGens MouseButton.kr, MouseX.kr y MouseY.kr

Revisa los documentos de Ayuda (Help) de SC:
Archivos de programa/SuperCollider/Help/UGens/Synth control/MouseButton.html
Archivos de programa/SuperCollider/Help/UGens/Synth control/MouseX.html
Archivos de programa/SuperCollider/Help/UGens/Synth control/MouseY.html
Archivos de programa/SuperCollider/Help/UGens/Noise/WhiteNoise.html
Archivos de programa/SuperCollider/Help/UGens/Noise/BrownNoise.html
Archivos de programa/SuperCollider/Help/UGens/Noise/PinkNoise.html

y evalúa los siguientes códigos uno por uno:

{WhiteNoise.ar(0.3)*MouseButton.kr(0,1)!2}.play;
Control+Enter / Pulsa el botón del ratón. Suelta el botón del ratón. Repita cuantas veces quiera.

{WhiteNoise.ar(0.3)*MouseX.kr(0,1)!2}.play;
Control+Enter / Desplaza horizontalmente el ratón del extremo izquierdo al extremo derecho de la pantalla de la computadora. Muévelo todo lo que quieras, con o sin pulsar el botón del ratón.

{WhiteNoise.ar(0.3)*MouseY.kr(0,1)!2}.play;
Control+Enter / Desplaza verticalmente el ratón del extremo inferior al extremo superior de la pantalla de la computadora. Muévelo todo lo que quieras, con o sin pulsar el botón del ratón.

Otra posibilidad interesante que ofrece SC es con JMouseButton.kr, JMouseX.kr y JMouseY.kr

Primero se evalúa (ejecuta) el siguiente código en SC:

JMouseBase.makeGUI;
Verás cómo aparece una ventana Java que va a actuar como base sobre la que se desplaza el ratón. Sólo se activa el ratón si está sobre esta base y no sobre toda la pantalla.

A continuación evalúa:

{WhiteNoise.ar(0.3)*JMouseButton.kr(0,1)!2}.play;
{WhiteNoise.ar(0.3)*JMouseX.kr(0,1)!2}.play;
{WhiteNoise.ar(0.3)*JMouseY.kr(0,1)!2}.play; observa que el volumen es máximo en el extremo inferior de la base y mínimo en el extremo superior, que es lo contrario de lo que sucede con MouseY.





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 por Env 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.adsr con 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.