next SuperCollider: SynthDefs
up Ejemplos en SuperCollider
previous SuperCollider: Unidades generadoras
  Índice General   Índice de Materias


SuperCollider: Envolventes


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

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

Envolventes (envelopes)

Envelope: Env
Puede tener cualquier numero de segmentos y puede parar en algun lugar en particular o loopear varios segmentos al hacer sustain.


Creacion

*new(levels, times, curves, releaseNode, loopNode)

	levels - arreglo de niveles
	times - arreglo de duraciones
	curve - tipo de curva para los segmentos
	Valores posibles son:
		'step' - segmento plano
		'linear' - segmento lineal
		'exponential' - exponencial natural de caida y crecimiento
		'sine' - segmento sinusoidal con forma de S
		'welch' - segmento sinusoidal basado en una ventana Welch 
		un Float - valor de curvatura para todos los segmentos
		arreglo de Floats - valores de curvaturas para cada segmento
	releaseNode - un entero o nulo
	loopNode - un entero o nulo

		
		Env.new([0.001,1,0.3,0.8,0.001],[2,3,1,4],'linear').plot.test;
		Env.new([0.001,1,0.3,0.8,0.001],[2,3,1,4],'exponential').plot.test;
		Env.new([0.001,1,0.3,0.8,0.001],[2,3,1,4],'sine').plot.test;
		Env.new([0.001,1,0.3,0.8,0.001],[2,3,1,4],'step').plot.test;
		Env.new([0.001,1,0.3,0.8,0.001],[2,3,1,4], -2).plot.test;
		Env.new([0.001,1,0.3,0.8,0.001],[2,3,1,4], 2).plot.test;
		Env.new([0.001,1,0.3,0.8,0.001],[2,3,1,4],[0,3,-3,-1]).plot.test;
		

Metodos de envolventes de duracion fija

	
	*linen(attackTime, sustainTime, releaseTime, level, curve)
	*triangle(duration, level)
	*sine(duration, level)
	*perc(attackTime, releaseTime, peakLevel, curve)

Metodos de envolvente con un segmento sostenido
			
	*adsr(attackTime, decayTime, sustainLevel,  releaseTime, peakLevel, curve)
	*asr(attackTime, sustainLevel,  releaseTime, peakLevel, curve)
	 

		
		
EnvGen: generador de envolvente

    "Ejecuta" envolventes (Env)
	*ar(envelope, gate, levelScale, levelBias, timeScale, doneAction)
	
	envelope 		an instance of Env (or an array of Controls)
	gate			a control signal that holds the EnvGen open (except Env.linen)
	levelScale 		scales the levels of the breakpoints.
	levelBias		offsets the levels of the breakpoints.
	timeScale		scales the breakpoint durations.
	doneAction	the doneAction arg causes the EnvGen to stop or end the 
		 		synth without having to use a PauseSelfWhenDone or FreeSelfWhenDone ugen. 
				It is more efficient to use a doneAction (see below)

Usando Env y EnvGen juntos

Enfoque simple:

{	
	var env, amp;
	env = Env.perc(attackTime:0.2);
	amp = EnvGen.kr(envelope: env, levelScale: 0.5, doneAction: 2);
	SinOsc.ar(freq: 440,phase: 0,mul: amp)
}.play;

Se pueden incluir envolventes multiples y generadores

{	
	var env1, env2, amp1, amp2;
	env1 = Env.perc(attackTime:0.2, releaseTime: 2);
	env2 = Env.linen(attackTime:0.2, sustainTime: 0.2, releaseTime: 14, level:0.6);
	amp1 = EnvGen.kr(envelope: env1, levelScale: 0.1);
	amp2 = EnvGen.kr(envelope: env2, levelScale: 0.5, doneAction: 2);
	
	Blip.ar(freq: 440, numharm: 20, mul: amp1) + 
				SinOsc.ar(freq: 2*440, phase: 0,mul: amp2)
}.play;


Triggers (gatilladores) y Gates (compuertas)

Ejemplo: implementacion directa de una Gate

	(
	SynthDef("env-help", { arg out, gate; 
		var z;
		z =  EnvGen.kr(Env.adsr,gate) * SinOsc.ar(440,0,0.1);
		Out.ar(out, z)
	}).send(s);
	)
	
	s.sendMsg("/s_new", "env-help", 1980); // empezar un synth en forma silenciosa
	
	// prender
	s.sendMsg("/n_set", 1980, \gate, 1);
	
	// apagar
	s.sendMsg("/n_set", 1980, \gate, 0);
	
	// da lo mismo el valor mientras sea > 0
	s.sendMsg("/n_set", 1980, \gate, 2);
	
	s.sendMsg("/n_free", 1980);


Gates como Triggers

( {  // Impulso va desde 0 a valores positivos a una tasa regular
	e = Env.perc(0.001, 1.0);
	t = Impulse.kr(2); // frequencia de los impulsos
	a = EnvGen.kr(e,t);
	 SinOsc.ar( 440, mul:a ) 
}.play ) 
 
 ( {  // Impulsos a valores aleatorios
	e = Env.perc(0.001, 1.0);
	t = Dust.kr(2); // numero promedio de impulsos
	a = EnvGen.kr(e,t);
	 SinOsc.ar( 440, mul:a ) 
}.play ) 

 
 ( {  // MouseX crea el trigger
	e = Env.perc(0.001, 1.0);
	t = MouseX.kr(-0.1, 0.1); 
	a = EnvGen.kr(e,t);
	 SinOsc.ar( 440, mul:a ) 
}.play ) 

( {
	var triggerSpeed; 
  	
	triggerSpeed = 2;
 	e = Env.perc(0.001, 1/triggerSpeed);

	// Trigger es usado para TRand y EnvGen
	t = Impulse.kr(triggerSpeed); 
 	f = TRand.kr(100, 2000, t);
 	a = EnvGen.kr( e,  t );
 	
	SinOsc.ar( f, mul:a);
}.play 
) 


Gates 


 ( {  // MouseX create la gate
	e = Env.adsr(0.001, 0.3, 0.2, 0.1);
	t = MouseX.kr(-0.1, 0.1); 
	a = EnvGen.kr(e,t);
	 SinOsc.ar( 440, mul:a ) 
}.play ) 

 ( {  // LF Pulse create la gate
	e = Env.adsr(0.001, 0.3, 0.2, 0.1);
	t = LFPulse.kr(0.8, 0, MouseX.kr(0.0, 1.0)); // Mouse controla el ancho
	a = EnvGen.kr(e,t);
	 SinOsc.ar( 440, mul:a ) 
}.play ) 


 ( {  // LFNoise create la gate
	e = Env.adsr(0.001, 0.3, 0.2, 0.1);
	t = LFNoise0.kr(3); 
	a = EnvGen.kr(e,t);
	 SinOsc.ar( 440, mul:a ) 
}.play ) 







next SuperCollider: SynthDefs
up Ejemplos en SuperCollider
previous SuperCollider: Unidades generadoras
  Í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