Clase 3

// Taller de SuperCollider Básico

BUAP

 

Sesión 3

  06/27/09

   

 

*Envolventes

*Canales

*Lenguaje MIDI

*Arrays

*Variables

*Ejercicios

 

Acá puedes bajar la clase en los formatos PDF y docx

 

//Envolventes

Una envolvente es la manera en que se comporta un sonido en términos de tiempo y amplitud. Las envolventes están determinadas por cuatro parámetros principales:

 

Ataque (Attack): se refiere a qué tan rápidamente el sonido alcanza su máxima amplitud. En instrumentos de percusión este periodo de tiempo es prácticamente instantáneo.

 

Decaimiento (Decay): es el tiempo que tarda la amplitud en reducirse al punto de sostenimiento desde el pico inicial.

 

Sostenimiento (Sustain): es el nivel de volumen que se mantiene constante hasta que se detiene la inducción vibratoria. Se refiere a la amplitud, no al tiempo.

 

Liberación (Release): es el tiempo que tarda la amplitud en regresar a 0 desde el punto de sostenimiento.

 

A las envolventes que tienen estos cuatro parámetros bien definidos se les conoce como envolventes ADSR. No todas las envolventes tienen estos mismos elementos, algunas tienen sólo dos: ataque y liberación, o sólo tres: ataque, sostenimiento y liberación. 

 

Para generar una envolvente en SuperCollider recurrimos a la clase EnvGen. Las envolventes pueden ser pensadas como una secuencia de números que se despliega en el tiempo. Esta secuencia puede ser usada para varios propósitos que pueden involucrar una forma de onda o una modulación. Por el momento nuestras envolventes no generarán sonido, sólo determinarán la manera en que su amplitud se desarrolla en el tiempo, asi que EnvGen trabajará con el rate de control .kr.

 

EnvGen.kr

Genera una envolvente que da forma a la amplitud de nuestro sonido.

 

Sus argumentos son: (envelope, gate, levelScale, levelBias, timeScale, doneAction)

 

Envelope: acá indicamos alguna de las varias envolventes diferentes que tiene SuperCollider en la clase Env:

 

Env.adsr (ataque, decaimiento, volumen, liberación ) /* Envolvente de duración indeterminada para sonidos sostenidos. El segundo argumento es de volumen, no de duración. */

 

Env.perc (ataque, liberación) /* Envolvente de ataque percusivo, argumentos en segundos. Duración determinada por la suma del attack mas el release.*/

 

Env.perc (0.01,1).plot  /* Aquí el attack dura 0.01 seg y el release 1 seg. 0.01 + 1 = 1.01 . Con el mensaje .plot podemos ver la gráfica de la envolvente*/

 

Env.asr (ataque, volumen, decaimiento) /* Envolvente de duración indeterminada para sonidos sostenidos. El segundo argumento es de volumen, no de duración. */

 

Env.asr(0.01,1,1).plot /* Se tardara una centésima de segundo en alcanzar su amplitud máxima, que es 1 como lo indica el segundo argumento. Una vez alcanzada se quedara ahí hasta que nosotros le indiquemos cuándo generar el release que se tardará 1 segundo en alcanzar el cero. */

 

gate: 1 abre la envolvente, 0 la cierra. El valor default es 1. Las envolventes de duración determinada como Env.perc no necesitan cerrarse.

 

doneAction: una acción que se realiza cuando la envolvente ha finalizado. doneAction:2 elimina el Synth del servidor.

 

Ejemplo de Env.asr 

 

(

SynthDef(“prueba”, {|gate| Out.ar(0,Pulse.ar(15)*EnvGen.kr(Env.asr(5,1,0.1),gate,doneAction:2))}).send(s)   

)                                                       

 

a=Synth(“prueba”, [“gate”, 1]) // prender

a.set(“gate”, 0)  // apagar

 

Para aplicar la envolvente a un sonido, multiplicamos la envolvente por el sonido. Ejemplos:

 

{Saw.ar(40)*EnvGen.kr(Env.perc(0.01,1),doneAction:2)!2}.scope

 

{Saw.ar(40)*EnvGen.kr(Env.asr(1,1,4),Line.kr(1,0,6),doneAction:2)}.scope 

 

Observar que en el argumento gate hemos colocado un UGen Line que genera una línea de números que va desde el 1 al 0 en 2 segundos. Esto nos abre y cierra la envolvente automáticamente (ver el Help de Line)

 

 

//Canales

 

En SuperCollider existen varias clases (UGens) que nos ayudan a trabajar con los canales de audio por donde queremos que salga nuestro sonido. Aquí veremos 2: Out.ar y Pan2.ar.

 

Out.ar  

Argumentos (canal, señal)

Saca el sonido por un canal específico. Ese canal define un punto de partida u offset a partir del cual se va a distribuir el sonido.

 

canal:  0 = izquierda, 1 = derecha.  3,4,5,… multicanal

señal:  cualquier señal que pueda estar multiplicada por una envolvente.

 

{Out.ar(0,Saw.ar(40)*EnvGen.kr(Env.perc(0.01,1),doneAction:2))}.scope  // izquierda

 

{Out.ar(1,Saw.ar(40)*EnvGen.kr(Env.perc(0.01,1),doneAction:2))}.scope  // derecha

 

Pan2.ar 

Argumentos (señal, posición)

Distribuye el sonido entre dos canales consecutivos conservando su potencia. Si el Pan2 esta dentro de un Out los canales consecutivos en los que se distribuyen se cuentan a partir del offset del Out.

 

señal: cualquier oscilador o generador de sonido.

posición: -1 izquierda, 1 derecha.

 

{Pan2.ar(Pulse.ar(100,0.01),-1)}.scope

 

{Pan2.ar(Pulse.ar(100,0.01),-0.7)}.scope

 

{Pan2.ar(Pulse.ar(100,0.01),0)}.scope // En medio.

 

{Pan2.ar(Pulse.ar(100,0.01),0.7)}.scope

 

{Pan2.ar(Pulse.ar(100,0.01),1)}.scope

 

{Out.ar(0,Pan2.ar(Dust.ar(1000),0))}.scope // distribuye la señal entre el canal 0 y 1

 

{Out.ar(2,Pan2.ar(Dust.ar(1000),0))}.scope // distribuye la señal entre el canal 1 y 2. Si no tenemos una interfase de audio que nos permita expandir los canales sólo se va a escuchar el canal 1. Sólo tenemos 2 canales en nuestras computadoras que el Collider reconoce como el 0 y el 1.

 

 

//Lenguaje MIDI

 

.midicps //convierte un  numero de código MIDI a su equivalente en frecuencia en hertz.

 

.cpsmidi //convierte una frecuencia en hertz a su equivalente en código MIDI.

 

El código MIDI para designar las notas es:

 

60=Do (índice 5 o central)

61=Do#

62=Re

63=Mib

64=Mi

65=Fa

66=Fa#

67=Sol

68=Lab

69=La

70=Sib

71=Si

72=Do (índice 6. Una octava arriba del Do índice 5)

 

Si queremos convertir el 60 código MIDI en su frecuencia en hertz, lo hacemos mandándole el mensaje .midicps (cps=ciclos por segundo)

 

60.midicps

69.midicps

 

Para el inverso aplicamos el mensaje .cpsmidi

 

261.6255653006.cpsmidi

440.cpsmidi

 

.midiratio //convierte intervalos en razones o quebrados

Los intervalos para usar con el mensaje midiratio son expresados en cantidad de semitonos. Está relacionado con el método de Allen Forte para los pitch class sets:

 

0=unísono

1=segunda menor

2=segunda mayor

3=tercera menor

4=tercera mayor

5=cuarta justa

6=tritono

7=quinta justa

8=sexta menor

9=sexta mayor

10=séptima menor

11=séptima mayor

12=octava

 

Los números negativos denotan intervalos descendentes. Entonces, para aplicar este mensaje mandamos el mensaje .midiratio al intervalo que deseamos obtener y lo multiplicamos por una frecuencia fundamental. 

 

440*3.midiratio // nos da una tercera menor a partir de La.

440*(-5).midiratio // nos da una cuarta descendente a partir de La.

 

 

//Arrays

Un Array es un conjunto de elementos ordenados. Se escriben dentro de [ corchetes ] y se separan con comas.

 

===============

[‘hola’, ‘hi’, ‘salut’, ‘ciao’]

 

[“perro”, “gato”]

 

[0,1,2,3,4]

 

[60,62,64,65,67].midicps

 

[ 261.6255653006, 293.66476791741, 329.62755691287, 349.228231433, 391.99543598175 ].cpsmidi

================

 

Diferentes escalas usando el código MIDI

 

[60,62,64,65,67,69,71,72].midicps // un array con las notas de la escala mayor

 

[60,62,63,65,67,68,70,72].midicps // un array con las notas de la escala menor natural

 

[60,62,64,66,68,70,72].midicps // la escala de tonos enteros

 

[60,62,63,65,66,68,69,72].midicps // La escala simétrica tono, 1/2 tono

 

[60, 61, 63, 64, 66, 67,72, 71].midicps // La escala simétrica 1/2 tono, tono 

 

 

Las mismas escalas expresadas en intervalos y usando midiratio

 

[ 0, 2, 4, 5, 7, 9, 11, 12 ].midiratio // un array con las notas de la escala mayor

 

[ 0, 2, 3, 5, 7, 8, 10, 12 ].midiratio // un array con las notas de la escala menor natural

 

[ 0, 2, 4, 6, 8, 10, 12 ].midiratio // la escala de tonos enteros

 

[ 0, 2, 3, 5, 6, 8, 9, 12 ].midiratio // La escala simétrica tono, 1/2tono

 

[ 0, 1, 3, 4, 6, 7, 12, 11 ].midiratio // La escala simétrica 1/2tono, tono 

 

//Notar que para convertir las escalas expresadas en MIDI en el primer conjunto de arrays a las escalas expresadas en intervalos del segundo conjunto basta con restarles 60. Veámoslo en el primer ejemplo de la escala mayor

 

[60,62,64,65,67,69,71,72]-60 == [ 0, 2, 4, 5, 7, 9, 11, 12 ]

 

Los Arrays pueden contener cualquier tipo de objeto como números, variables, strings o nada!

 

[ ]

 

También pueden ser una mezcla de diferentes tipos de objetos:

 

[5, “dados”, 37, “computers”, 32, “perro”]

 

También pueden contener otros arrays:

 

[[2,6,5,4], [6,45,8,9]]

 

También podemos poner una expresión adentro de un array. SuperCollider la evalúa y nos da el resultado:

 

[2*4, 3+4, 5**2]

=

[8, 7, 25]

 

Podemos mandarle mensajes al Array para modificarlo. Por ejemplo .scramble o .choose

 

[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17].scramble

 

[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17].choose

 

 

 

//Ejercicios 

 

{____.ar(0,SinOsc.ar)}.scope;

 

{Pan2.ar(WhiteNoise.ar,____)}.scope;

 

{Out.ar(1,Saw.ar(100)*EnvGen.kr(__Env__.perc(0.01,2),doneAction:___2))}.scope;

 

{______.ar(WhiteNoise.ar,[100,200,400,1000,1500,5000].________,0.1)*EnvGen.kr(Env.perc(0.01,0.5),doneAction:2)}.play;

 

{Pan2.ar(SinOsc.ar([60,64,67,72].choose._______),[____,____].choose)}.play;

 

{[LPF,HPF].______.ar(BrownNoise.ar,800)}.play;

 

//otros ejemplos

 

{LPF.ar(Pulse.ar(20,0.1,0.5)*SinOsc.ar(800,0,0.7),500,0.5)*EnvGen.kr(Env.asr(0.01,1,0.5),SinOsc.kr(1))!2}.play

 

{LPF.ar(Pulse.ar(20,0.1,0.5)*SinOsc.ar(800,0,0.7),500,0.5)*EnvGen.kr(Env.perc(0.01,0.1),SinOsc.kr(7))!2}.play

 

{LPF.ar(Pulse.ar(20,0.1,0.5)*SinOsc.ar(800,0,0.7),MouseY.kr(10000,70),0.5)*EnvGen.kr(Env.perc(0.01,0.1),SinOsc.kr(MouseX.kr(1,50)))!2}.play

 

 

 

//Variables 

Las variables son espacios virtuales de memoria que sirven para guardar información.

 

-El concepto de variable es inherente a los lenguajes de programación. 

-Las variables facilitan la organización del código, permitiendo una clara y legible escritura.

-Son identificadas por medio de un nombre que generalmente se relaciona con el objeto al cual queremos igualarlo. Este nombre lo definimos nosotros.

-No tenemos un número determindo de variables, podemos declarar cuantas nos sean necesarias. 

-No deben usarse palabras o letras que ya estén reservadas por el sistema.

 

Pasos para definir variables:

 

1. Escribimos var (abreviatura de variable) 

2. dejamos un espacio

3. declaramos las variables 

4. Al finalizar la declaración usamos un ;

 

//ejemplo

compila el código y observa la post.

 

//bien

(

var leon, dos;

leon=1;

dos=2;

leon+dos

)

 

//mal, observa que contesta la post

(

leon=1;

dos=2;

leon+dos

)

 

Las variables que tengan un sólo caracter no necesitan ser declaradas. La letra s ya está reservada para el servidor, así que es mejor no usarla. Recuerda que las variables deben comenzar con minúscula.

 

//Ejemplo de variables de un solo caracter

(

a=1;

x=2;

a+x

)

 

//Ejemplo en donde incluimos la operación con las variables dentro de un array.

 

(

var leon, dos;

leon=1;

dos=2;

[leon+dos,‘dos variables’]

)

 

//Tambien podemos darle valor a la variables en el mismo lugar donde la declaramos.

 

(

var leon=1,dos=2;

leon+dos

)

 

//para escribir nombres largos y estrafalarios utilizamos el guión bajo en lugar del espacio. También se pueden usar mayúsculas.

 

(

var un_numero_mayor_a_diez=15,un_numero_mayor_a_20=43;

un_numero_mayor_a_diez + un_numero_mayor_a_20

)

 

(

var unNumeroMayorADiez=15,unNumeroMayorA20=43;

unNumeroMayorADiez + unNumeroMayorA20

)

 

//Ahora con señales de audio

 

(

{var ruido,senoide;

ruido=WhiteNoise.ar(0.2);

senoide=SinOsc.ar(1000,0,0.3);

ruido+senoide

!2}.scope

)

 

 

 

(

{

var ruido, env, senoide;

 

ruido=WhiteNoise.ar(0.5);

senoide=SinOsc.ar(10,0,0.3);

env=EnvGen.kr(Env.perc(0,0.2),Impulse.kr(8));

senoide*ruido*env

}.scope

)

 

En Macintosh, usando cmd+f (f de find) podremos encontrar con mucha facilidad palabras o símbolos dentro de un código. Una vez encontrados pueden ser sustituidas de una sola vez.

 

(

{

var oscilador, envolvente, impulso;

impulso=Impulse.kr(MouseX.kr(1,10));

oscilador=LFTri.ar(200*[1,MouseY.kr(0.98,1.0124)],0,0.53);

envolvente=EnvGen.kr(Env.perc(0.01,1),impulso);

oscilador*envolvente;

}.scope

)

 

//sin variables..algo borroso.

{EnvGen.kr(Env.perc(0.01,1),Impulse.kr(MouseX.kr(1,10)))*LFTri.ar(200*[1,MouseY.kr(0.98,1.0124)],0,0.53)}.scope

 

//ejercicio de la clase

 

{BPF.ar(Dust.ar(MouseY.kr(10,300)),MouseX.kr(100,2000), 0.2)*EnvGen.kr(Env.asr(2,1,4),Line.kr(1,0,8),doneAction:2)}.scope

 

Ahora escríbelo usando variables.

 

 

 

 

Creative Commons License
Taller de SuperCollider Básico by https://basicsupercollider.wordpress.com is licensed under a Creative Commons Attribution-Noncommercial 2.5 Mexico License.1)}

6 Responses to “Clase 3”

  1. DAVID PEREZ Says:

    HOLA ALEJANDRA SOY DAVID, AQUI MOLESTANDOTE, OYE SERA POSIBLE SUBIR LA CLASE 3 EN PDF? SALUDOS Y GRACIAS

  2. Ya subí la clase, David!🙂 muchas gracias por estar al pendiente. Cualquier duda, por acá ando. Abrazos!

  3. DAVID PEREZ Says:

    Encontre esta pagina de shortcut para supercollider, lastima que no venga el correspondiente a find para PC , pero seguire buscando, saludos http://swiki.hfbk-hamburg.de:8888/MusicTechnology/846

  4. Muchas gracias, David!

  5. hola no se si me pueda resolver una duda esque el ultimo ejercicio de envolventes que “{[LPF,HPF].______.ar(BrownNoise.ar,800)}.play;” o le entendí muy bien no se si pueda ayudarme porfavor

  6. Hola, Grecia! lo que el ejercicio sugiere es que uses un “choose” en el espacio vacío. Así cada vez que inicies el synth, SC elegirá al azar uno de los dos filtros. Cuéntame si te funciona!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: