SuperCollider: SynthDefs
Ejemplos en SuperCollider
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 )
SuperCollider: SynthDefs
Ejemplos en SuperCollider
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