Hola:

se que hay muchos como yo que no conocen muy bien Supercollider:

ahora me adentro de lleno en este lenguaje por ser optimo para componer
musica estocastica.

les comento que tengo un profesor europeo, y trabajo via skype:

a los principiantes:

ire mandando cada semana una seccion del tutoril escrito por mi profesor.


mirar el attachment, instalar SC y abrir una ventana nueva y abrir en ella
el atachment.

Saludos!
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 Window
457107
Cuando 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.internal
s.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.internal
Server.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 
grupo
de
líneas
tambié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 que
tener 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 grados
pi              = 3.1415926535898                       = 3.1415926535898       
= 180 grados
1.5pi           = 1.5 * 3.1415926535898 = 4.7123889803847       = 270 grados
2pi             = 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.
  
_______________________________________________

Expyezp mailing list
[email protected]
http://lists.slow.tk/listinfo.cgi/expyezp-slow.tk

Archivo de mensajes:
http://lists.slow.tk/pipermail/expyezp-slow.tk/

Responder a