next SuperCollider: Envolventes
up Ejemplos en SuperCollider
previous SuperCollider: el lenguaje
  Índice General   Índice de Materias


SuperCollider: Unidades generadoras


TUTORIAL DE SUPERCOLLIDER 3 - PARTE 3
Rodrigo F. Cadiz, basado en apuntes de Gary S. Kendall
Northwestern University

(
	Server.default = Server.internal;
	s = Server.default;
	s.boot;
)

Unidades generadoras (UGen)
- Objetos que procesan o generan sonidos
- Pueden tener muchas entradas, pero una sola salida
- Canales multiples se pueden hacer mediante arreglos de unidades generadoras
 
Creacion, tasa de audio, tasa de control
- Se crean a traves de los mensajes ar o kr

FSinOsc.ar(800, 0.0, 0.2); // crear un oscilador sinusoidal a 800 Hz, fase 0.0, amplitud 0.2

Argumentos
- Pueden ser otras UGen, escalares (numeros) o arreglos de UGen o escalares
- Por convencion, los ultimos dos argumentos de la mayoria de las UGen son mul (multiplicador) y add (suma)
- Valores por defecto de mul=1.0 y add=0.0
- Usar mul y add es mas eficiente que escribir expresiones con multiplicaciones y adiciones

Notacion funcional

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

- Objeto se espefica entre { y } y se llama al metodo play
- Como no se especifica servidor, se usa el por defecto (variable "s"). 
- Tampoco se almaceno nada en una variable, por lo que no se puede reusar.

(
	{ 				// Abrir la funcion
		SinOsc.ar(	// Crear un objeto SinOsc a tasa de audio
			440, 	// frecuencia de 440 Hz, LA
			0, 		// fase inicial 0
			0.2) 	// mul (amplitud) of 0.2
	}.play;			// cerrar la funcion y llamar 'play' sobre ella
)
	
Otro ejemplo,

(
	{ var ampOsc;		// Abrir la funcion y declarar una variable
		ampOsc = SinOsc.kr(0.5, 1.5pi, 0.5, 0.5);	// Crear un objeto SinOsc a tasa de control
					// asignar su resultado a una variable
		SinOsc.ar(440, 0, ampOsc);	// crear un objecto SinOsc a tasa de audio
					// y usar la variable para controlar amplitud
	}.play;
)


Conceptos basicos de osciladores
 
Forma mas facil de generar sonido

	{ SinOsc.ar(800, 0, 0.1) }.play;

Que pasa en caso de errores

	{ SinOsc.ar(800, 0, 0.1) },.play;

Ejemplo de ruido browniano:

	{ BrownNoise.ar(0.1) }.play;

Server, BrownNoise y SinOsc son objetos

play, y ar son mensajes 

800, 0, y 0.1 son literales


Ejemplo con aliasion (alasing o foldover)

{ SinOsc.ar(Line.kr(1,43000,6), 0, 0.1) }.play;


Frecuencia lineal versus tono (pitch)

Line crea una interpolacion lineal entre dos puntos
XLine crea una interpolacion exponenial, usualmente usada para frecuencia
	
ar es tasa de audio
kr es tasa de control

{ SinOsc.ar(Line.kr(400,4000,5), 0, 0.3) }.play;  // Suena como una curva

{ SinOsc.ar(XLine.kr(400,4000,5), 0, 0.3) }.play;  //  Suena lineal


freq, phase, mul, and add are the names of arguments

Otros ejemplos:

	{ SinOsc.ar(freq: 440, phase: 0, mul: 0.4, add: 0) }.play;

	{ SinOsc.ar(phase: 0, freq: 440, add: 0, mul: 0.4) }.play;

	{ SinOsc.ar(freq: 440, mul: 0.4) }.play;

freq:440 es un ejemplo de argumento clave


SC tiene muchos otros objetos que son osciladores:

Por ejemplo:
	SinOsc		FSinOsc		Osc			Buffer	OscN
	
Tambien son utiles:	
	Impulse		Blip			Pulse		LFPulse
	Saw			LFSaw	
	Klang		Formant	
	VOsc		VOsc3
	
Algunos un poco mas complicados:
	SyncSaw	VarSaw
	LFPar		LFCub	
	Gendy1		Gendy2		Gendy3	
	
	
	

TUTORIAL DE SUPERCOLLIDER 3 - PARTE 4
Rodrigo F. Cadiz, basado en apuntes de Gary S. Kendall
Northwestern University

(
Server.internal.boot;
Server.default = Server.internal;
s = Server.default;
)



Mas sobre generadores de senal

Sumar sinusoides es ineficiente:

({ 
	var f=200;
	a = SinOsc.ar(f,0,0.1);
	b = SinOsc.ar(2*f,0,0.1);
	c = SinOsc.ar(3*f,0,0.1);
	d = SinOsc.ar(4*f,0,0.1);
	e = SinOsc.ar(5*f,0,0.1);
	a+b+c+d+e;
}.play;
)


Look at the Help pages for the following:
	SinOsc		FSinOsc		Osc			Buffer			OscN
	
These are also useful:	
	Impulse		Blip			Pulse		LFPulse
	Saw			LFSaw	
	Klang			Formant	
	VOsc			VOsc3



Generadores de senal de banda limitada

SinOsc, FSinOsc, Blip, Saw, Pulse, Formant no produciran aliasion.


SinOsc, FSinOsc
arguments:  frequency, phase, mul, add

{ SinOsc.ar(800,0,0.5) }.play;

{ FSinOsc.ar(800,0,0.5) }.play;


Saw
argumentos:  frequency, mul, add

{ Saw.ar(800, 0.5) }.play;
{ Saw.ar(XLine.kr(200,20000,6),0.5) }.play;  // no aliasing


Blip
argumentos:  frequency, numHarmonics, mul, add

{ Blip.ar(800, 10, 0.5) }.play;
{ Blip.ar(XLine.kr(200,20000,6),10,0.5) }.play; // no aliasing
// modular el numero de armonicos
{ Blip.ar(400,Line.kr(1,30,20),0.2) }.play;
//  a traves de un fitro pasa bajos resonante
{ RLPF.ar(Blip.ar(400,30,0.5), XLine.kr(400,8000,5), 0.1) }.play;


Pulse
argumentos:  frequency, width, mul, add

{ Pulse.ar(800,0.3, 0.5) }.play;
{ Pulse.ar(XLine.kr(200,20000,6),0.3,0.5) }.play;
// modulate pulse width
{ Pulse.ar(400, Line.kr(0.01,0.99,8), 0.5) }.play;


Klang - banco sinusoidal de osciladores
argumentos:  `[ frequencies, amplitudes, phases ], mul, add

{ Klang.ar(`[ [800, 1000, 1200],[0.3, 0.3, 0.3],[pi,pi,pi] ], 1, 0) * 0.4}.play;
// 8 frecuencias aleatorias
{ Klang.ar(`[ {exprand(400, 2000)}.dup(8), nil, nil ], 1, 0) * 0.04 }.play;

Formant			oscilador de formante
argumentos: kfundfreq, kformfreq, kwidthfreq, mul, add

Generates un set de armonicos sobre una frecuencia de formante, dada una frecuencia fundamental
kfundfreq - fundamental frequency in Hertz.
kformfreq - formant frequency in Hertz.
kwidthfreq - pulse width frequency in Hertz. Controla el ancho de banda del formante.

// modula frec fund, frec.formantes constante
{ Formant.ar(XLine.kr(400,1000, 8), 2000, 800, 0.125) }.play;

// modula frec formante, frec fundamental constante
{ Formant.ar(200, XLine.kr(400, 4000, 8), 200, 0.125) }.play;

// modula mediante frecuencia, otras quedan constantes
{ Formant.ar(400, 2000, XLine.kr(800, 8000, 8), 0.125) }.play;



Generadores de senal basados en tablas


Osc, COsc, VOsc, VOsc3

Es necesario usar un buffer alocado en el servidor
(
	// allocate buffer with server, size, numChans, bufferNumber
	b = Buffer.alloc(s, 2048, 1, bufnum: 80);
	// fill buffer with array of amplitudes, 3 * true (default)
	b.sine1([1,0.5,0.33,0.25,0.2], true, true, true);
)

// se puede escribir tambien cmo
	b.sine1(1.0/[1,2,3,4,5], true, true, true);
// o:
	b.sine1(1.0/(1..12));
	b.sine1(1.0/(1..24));
	b.sine1(1.0/(1..32));
	
	
Osc
argumentos: buffer number, frequency, phase, mul, add.

{ Osc.ar(b.bufnum, 400, 0, 0.5) }.play;

COsc - dos osciladores, detuned
argumentos: buffer number, frequency, beat frequency, mul, add.

{ COsc.ar(b.bufnum, 200, 0.4, 0.3) }.play;
// change buffer as above.

{ COsc.ar(b.bufnum, 200, MouseX.kr(0.0,20.0,'linear'), 0.3) }.play;


VOsc - oscilador crossface de multiples wavetables
argumentos: buffer number, frequency, phase, mul, add.

(
	// allocar buffers 80 a 87
	b = Array.new(8);
	8.do {arg i; b = b.add(Buffer.alloc(s, 2048, 1, bufnum: 80+i))};
)

(
	// llenar buffers 80 a 87
	8.do({arg i;
		var n, a;
		// generar arreglo de amplitudes armonicas
		n = (i+1)**2; // armonicos: [1,4,9,16,25,36,49,64]
		a = {arg j; ((n-j)/n).squared }.dup(n);
		// llenar tabla
		b[i].sine1(a);
	});
)

// go!
{ VOsc.ar(MouseX.kr(80,87), 120, 0, 0.5) }.play;



VOsc3 - tres VOscs sumados.
argumentos: buffer number, freq1, freq2, freq3, beat frequency, mul, add.

// chorusing
{ VOsc3.ar(MouseX.kr(80,87), 120, 121.04, 119.37, 0.2) }.play;

// acordes
{ VOsc3.ar(MouseX.kr(80,87), 120, 151.13, 179.42, 0.2) }.play;


Generadores de baja frecuencia (LF)

LFTri, Impulse, LFSaw, LFPulse, VarSaw, SyncSaw

Formas de onda geometricas, no limitados en banda

LFTri, LFSaw, Impulse
argumentos:  frequency, phase, mul, add

{ LFTri.ar(200,0,0.5) }.play;
{ LFSaw.ar(200,0,0.5) }.play;
{ Impulse.ar(200,0,0.5) }.play;

 // aliasion?
{ LFTri.ar(XLine.kr(200,20000,6), 0, 0.5) }.play;


LFPulse, VarSaw
argumentos:  frequency, phase, width, mul, add

{ LFPulse.ar(200,0,0.3,0.5) }.play;
{ VarSaw.ar(200,0,0.3,0.5) }.play;
// pulso con modulacion
{ LFPulse.ar(200,0,MouseX.kr(0,1),0.5) }.play;
{ VarSaw.ar(200,0,MouseX.kr(0,1),0.5) }.play;


SyncSaw
argumentos:  syncFreq, sawFreq, mul, add
Onda diente de sierra vinculada con una frecuencia fundamental.
Efecto similar a formantes que se mueven o puls con modulacion.

{ SyncSaw.ar(100, MouseX.kr(100, 1000), 0.1) }.play;


























next SuperCollider: Envolventes
up Ejemplos en SuperCollider
previous SuperCollider: el lenguaje
  Índice General   Índice de Materias

Copyright © 2008-06-05
Rodrigo F. Cádiz   - Centro de Investigación en Tecnologías de Audio, Instituto de Música, Pontificia Universidad Católica de Chile