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 )