Proyecto Hernán

Primera parte:

Para lograr este proyecto utilice una interface M-AUDIO 410 vía firewire, pues esta cuenta con 8 canales de salida de los cuales use 4.

 

 

Server.local.options.divice=“M-Audio”

Server.local.options.numOutputBusChannels=10;

s.boot

Usando este código SuperCollider detecta cualquier interface, aunque en el caso de la M-AUDIO el programa la detecta siempre si necesidad de ningún código.

 

El primer intento:

 

(

SynthDef(\uno,{|out=0,pos=0,n=0|

var sen, w,x,y,a,b,c,d;

sen=FSinOsc.ar(ExpRand(100.0,8000.0,n),0,Line.kr(0.2,0,1,doneAction:2));

#w,x,y=PanB2.ar(sen,pos,0.5);//señal codificada al frente

#a,b,c,d=DecodeB2.ar(4,w,x,y);

Out.ar(0,[a,b,c,d])

}).send(s);

)

 

(

~going=Pseq([0,1,0.5,-0.5,-1],inf).asStream;

Tdef(\tocauno,{

inf.do{

Synth(\uno,[\pos,~going.next]);

0.15.wait;

}})

)

 

Tdef(\tocauno).play

Tdef(\tocauno).stop

 

Este código funciona con PanB2 donde el valor de la posición del sonido va de -1 a 1 como en Pan2, solo que aquí tenemos frente, derecha, izquierda y detrás.

 

El maestro Hernani Villaseñor me hizo notar un problema en este ejemplo y que es importante tener en cuenta cuando se trabaja con esacialización, las SinOsc no son útiles, tienden a confundir al oído y no ayudan a apreciar la posición del sonido.

 

PanAZ:

 

(

SynthDef(\azmut,{|pos=2,amp=0.3,gate=1,start=2,end=1|

var sen, env, pan;

sen=WhiteNoise.ar(amp);

pan=PanAz.ar(4,sen,Line.kr(start,end,2),amp,3); //uso un line para definir un movimiento circular

env=EnvGen.kr(Env.perc(1,2),gate,doneAction:2);

Out.ar(0,pan*env)

}).send(s)

)

//creo diferentes trayectorias circulares del sonido

Synth(\azmut,[\start,0.01,\end,2]) //vuelta en sentido del reloj

Synth(\azmut,[\start, 2,\end, 0.01]) //vuelta en sentido contrario al reloj

 

Aquí tenemos un ejemplo usando el PanAz, el cual es un paneador multicanal, aquí las trayectorias se definen de diferente manera, van de 0 (aunque por alguna razón el 0 no es valido, debemos empezar de 0.01) a 2, esto nos daría una vuelta entera en sentido de las manecillas del reloj.

 

Otra cosa que podemos definir en PanAz es como se distribuye el sonido mientras recorre la trayectoria, para eso tenemos el valor de “width”, es los maestros Hernani Villaseñor y Ernesto Romero me hicieron notar que siempre es bueno tener un valor de por lo menos 2 (que equivaldría a repartir el sonido entre 2 bocinas) pues el valor 1 da un comportamiento extraño, como si se cortara el sonido.

 

Envolventes:

 

A lo largo del curso se nos explico el uso de las envolventes y su comportamiento, en este caso encontré que puedes mezclar dos tipos de envolventes para lograr un contorno sonoro distinto.

 

(

SynthDef(\azmut,{|pos=2,amp=0.3,gate=1,start=2,end=1|

var sen, env, pan;

sen=WhiteNoise.ar(amp);

pan=PanAz.ar(4,sen,Line.kr(start,end,2),amp,3);

env=EnvGen.kr(Env.perc.blend(Env.sine,0),gate,doneAction:2);

Out.ar(0,pan*env)

}).send(s)

)

Synth(\azmut,[\start,0.01,\end,2])

Synth(\azmut,[\start, 2,\end, 0.01])

 

En este caso estamos mezclando una envolvente percusiva con una tipo sine, el valor que esta en “0” se denomina fact cuyos valores van de 0 a 1, esto nos ayuda a decidir que tanta proporción de una u otra envolvente deseamos, en este momento tendríamos un sonido únicamente percusivo, si el valor fuera 0.5 tendríamos una mezcla (blend) de ambas.

 

Ejemplo de SynthDef:

 

Este Synth es un ejemplo del uso tanto del PanAz, como del la envolvente antes mencionada. Para desarrollar este proyecto hice muchos synths y todos fueron probados dentro del sistema de 4 bocinas, el código final estará incluido en este blog.

 

Una cosa que hay que mencionar es que aunque sea difícil contar con un sistema de bocinas “perfecto” uno tiene que realizar las cosas con el equipo que cuenta, solo hay que estar pendiente de las limitaciones y de los cambios que pueden existir entre uno y otro lugar de ejecución (en mi caso, el equipo que tengo en casa contra el que esta en Multimedia).

 

(

SynthDef(\wii1,{|freq=100,fcc=102,amp=0.7,start=0.01,end=2,withd=1,fact=1,gate=1|

var sin,pan,pos, env;

sin=Blip.ar(freq,Line.kr(1,5,2),amp)*Saw.ar(fcc,amp);

pos=Line.kr(start,end,0.5);

pan=PanAz.ar(4,sin,pos,amp,withd);

env=EnvGen.kr(Env.perc.blend(Env.sine,fact),gate,doneAction:2);

Out.ar(0,pan*env);

}).send(s)

)

 

Synth(\wii1)

 

(

~ini=Pseq([0.01,0.01,2,2,0.01,2],inf).asStream;

~fin=Pseq([2,2,0.01,0.01,2,0.01],inf).asStream;

~bos=Pseq([1,2,1],inf).asStream;

~mez=Pseq([0,0.5,0.9,1,0.9,0.5,1],inf).asStream;

 

Tdef(\tocawii1,{

inf.do{

Synth(\wii1,[\start,~ini.next,\end,~fin.next,\withd,~bos.next,\fact,~mez.next]);

~esperame.wait;

}})

)

~esperame=3

~esperame=1

~esperame=0.5

~esperame=0.3

 

Tdef(\tocawii1).quant_(0).play

Tdef(\tocawii1).stop

 

Buffers:

 

Para este proyecto grabe un par de buffers con una sonoridad determinada, estos buffers son una guitarra y un clarinete, los dos tienen el mismo tipo de sonoridad, pero esta transportada, esto le dio lugar a la introducción y final de la pieza, la cual esta situada dentro de este material armónico.

 

Grabe estos buffer usando Audacity, un micrófono dinámico y la misma interface M-AUDIO.

 

TGrains:

 

Este es el granulador de buffers que tiene SuperCollider, el buffer tiene que ser MONOAURAL!y se puede ajustar la duración y lugar de la granulación con un controlador como el mouse. El paneo funciona de la misma manera que el PanAz.

 

Use el Tgrains en los buffers de la guitarra y el clarinete, las frases son un tanto distintas, pero el material armónico es el mismo y use el mouse como controlador.

 

 

Reverb:

 

Cuando presente una de las primera versiones de esta pieza al maestro Ernesto Romero, me dijo que mucho del material parecia estar en distintos planos, por lu cual sugirio usar un reverb para poner todo dentro del mismo contexto. Esta pieza con 2 tipos de reverb uno para los buffers, el cual es muy grande y otro para el resto de la sintecis, ambos son modificados ligeramente dentro de la pieza.

 

 

(

SynthDef(\rev,{|mix=0.7,room=0.5,gate=1,out=0|

var sen,env;

sen=FreeVerb.ar(In.ar(20,4),mix,room);

env=EnvGen.kr(Env.asr(0.01,2,7),gate,doneAction:2);

Out.ar(out,sen*env);

}).send(s)

);

 

Automatizar código:

 

“/Users/hms/Desktop/hola.rtf”.load

 

Este código se usa para llamar a los synths sin tener que abrir el archivo ya que los carga directo al servidor, esto me ayudo mucho tanto para ordenar la pieza como para interpretarla, pues así tienes menos cosas de que preocuparte.

 

Esto es algo en lo que los maestros Ernesto Romero y Hernani Villaseñor insistieron mucho y es verdad que uno se da cuenta de lo útil que es, este código y esta forma de organizar las cosas dispara el potencial del material.

 

Solo se tiene que poner el nombre del usuario, la ubicación del archivo, el nombre de este y .load.

 

 

Set:

 

 

(

SynthDef(\seteo,{|out=0,gate=1,amp=0.45|

var sen,env;

sen=WhiteNoise.ar(amp);

env=EnvGen.kr(Env.perc(0.01,1),gate,doneAction:2);

Out.ar(out,sen*env);

}).send(s);

)

 

(

~salida=Pseq([0,1,2,3],inf).asStream;

Tdef(\tocaseteo,{

inf.do{

Synth(\seteo,[\out,~salida.next]);

1.5.wait;

}}).quant_(0)

)

 

Tdef(\tocaseteo).play

Tdef(\tocaseteo).stop

 

 

 

 

Con este código dejamos listos nuestros niveles para que estos no estén disparado a la hora de interpretar, el nivel del ruido blanco debe ser igual al nivel mas alto de los synths.

 

 

Resultado:

 

Finalmente estos son los códigos para esta pieza.

 

 

(

u=Buffer.read(s,“sounds/guitgran.wav”);

l=Buffer.read(s,“sounds/clngran.wav”);

k=Buffer.read(s,“sounds/mixclngtr.wav”);

 

s.sendMsg(\b_allocRead, 0, “sounds/guitgran.wav”);

s.sendMsg(\b_allocRead, 1, “sounds/clngran.wav”);

s.sendMsg(\b_allocRead, 2, “sounds/mixclngtr.wav”);

 

 

(

SynthDef(\gyc,{|out=0,start=0.01,end=1.99,amp=0.6,gate=1,bufnum=2|

var pos,pan,sen;

sen=PlayBuf.ar(1,bufnum,BufRateScale.kr(bufnum))*EnvGen.kr(Env.linen(0.01,16,16,0.8),gate,doneAction:2);

pos=Line.kr(start,end,34);

pan=PanAz.ar(4,sen,pos,amp,3);

Out.ar(out,pan);

}).send(s);

);

 

(

Tdef(\tocagyc,{

2.do{

Synth(\gyc,[\out,31]);

0.01.wait;

}}).quant_(0);

);

 

(

SynthDef(\impulso,{|freq=100,start=0.01,end=2,withd=2,amp=0.3,fact=0.5,gate=1,out=0|

var sen,pos,pan;

sen=RLPF.ar(Blip.ar(freq,XLine.kr(1,5,5),0.5), XLine.kr(8000,400,5), 0.05)

*

EnvGen.kr(Env.perc.blend(Env.sine,fact),gate,doneAction:2);

pos=Line.kr(start,end,1);

pan=PanAz.ar(4,sen,pos,amp,withd);

Out.ar(out,pan);

}).send(s)

);

 

(

~melw=Pseq([ 207.6, 208.23, 246.9, 233, 195.99, 493, 207, 391.99, 207.97, 493.88330125612, 206, 587.9 ],inf).asStream;

~prin=Pseq([0.01,0.01,0.01,2,2,0.01,0.01,2,2,2],inf).asStream;

~term=Pseq([2,2,2,0.01,0.01,2,2,0.01,0.01,0.01],inf).asStream;

 

Tdef(\tocaimpulso,{

inf.do{

Synth(\impulso,[\freq,~melw,\start,~prin.next,\end,~term.next,\withd,[3,2].choose,\fact,[0,0.5,1,0.7,0.3].choose,\out,20]);

[0.5,0.3,0.2,0.8,1].choose.wait;

}}).quant_(0);

);

 

 

(

SynthDef(\nautilus,{|fre=70,pulse=3,ampli=0.4,start=0.01,end=2,gate=1|

var sen,pan;

sen=RLPF.ar(Blip.ar(fre,8,ampli,Pulse.ar(pulse,0.3,ampli)),555,10/555)

*

EnvGen.kr(Env.perc(1,4,0.6),gate,doneAction:2);

pan=PanAz.ar(4,sen,Line.kr(start,end,4),ampli,2);

Out.ar(0,pan)}).send(s);

);

 

 

 

(

~prin=Pseq([0.01,0.01,2,2],inf).asStream;

~ult=Pseq([2,2,0.01,0.01],inf).asStream;

~notasTocaNaut=[58,66,70,75,78,87,104,116].pyramid;

Tdef(\tocanautilus,{

inf.do{

Synth(\nautilus,[\fre,~notasTocaNaut.choose,\pulse,Array.series(10,3,0.25).choose,\start,~prin.next,\end,~ult.next,\out,20]);

[4,2,6,1].rotate.choose.wait;

}}).quant_(0);

);

 

(

SynthDef(\wii1,{|freq=100,fcc=102,amp=0.7,start=0.01,end=2,withd=2,fact=1,gate=1,dur=1,out=0|

var sin,pan,pos;

sin=Mix(Blip.ar(freq,Line.kr(1,5,2),amp)*Saw.ar(fcc*[LFNoise1.kr(1,0.02,1),1],amp))

*

EnvGen.kr(Env.perc.blend(Env.sine(dur),fact),gate,doneAction:2);

pos=Line.kr(start,end,0.5);

pan=PanAz.ar(4,sin,pos,amp,withd);

Out.ar(out,pan);

}).send(s)

);

 

(

~ini=Pseq([0.01,0.01,2,2,0.01,2],inf).asStream;

~fin=Pseq([2,2,0.01,0.01,2,0.01],inf).asStream;

~bos=Pseq([3,2,3,2],inf).asStream;

~mez=Pseq([0,0.5,0.9,1,0.9,0.5,1],inf).asStream;

~esperame={3};

 

Tdef(\tocawii1,{var esperame;

inf.do{esperame=~esperame.value;

Synth(\wii1,[\start,~ini.next,\end,~fin.next,\withd,~bos.next,\fact,~mez.next,\dur,esperame,\out,20]);

esperame.wait;

}}).quant_(0);

);

 

 

(

SynthDef(\campanaperc,{|start=0.01,end=1.99,amp=0.9,with=3,gate=1,out=0|

var sen,pan,pos,env;

sen=Mix.fill(10,{BPF.ar(BrownNoise.ar(1),exprand(200,12000),0.001)})

*

EnvGen.kr(Env.perc(1,8,0.8,4),gate,doneAction:2);

 

pos=Line.kr(start,end,9);

pan=PanAz.ar(4,sen,pos,amp,with);

Out.ar(out,pan);

}).send(s)

);

 

(

~ta=Pseq([0.01,0.01,2,2,2,2,0.01],inf).asStream;

~ne=Pseq([2,2,0.01,0.01,0.01,0.01,2],inf).asStream;

 

Tdef(\tocacamp,{

inf.do{

Synth(\campanaperc,[\start,~ta.next,\end,~ne.next,\out,20]);

9.wait;

}}).quant_(0);

);

 

 

(

SynthDef(\lugar,{|amp=0.7,start=0.01,end=1.99,gate=1,out=0,mat=500|

var sin, pos, pan;

sin=Blip.ar(Formant.ar(mat, XLine.kr(400, 4000, 0.5), 200, 0.125),Line.kr(4,1,0.5),amp)

*

EnvGen.kr(Env.perc(0.01,rrand(0.05,1),0.7),gate,doneAction:2);

pos=Line.kr(start,end,0.5);

pan=PanAz.ar(4,sin,pos,amp,2);

Out.ar(out,pan);

}).send(s)

);

 

(

~co=Pseq([0.01,0.5,2,1.5,0.01,1],inf).asStream;

~te=Pseq([1,0.01,1,1,1.5,2],inf).asStream;

~vas={2.5};

 

Tdef(\enlugar,{var vas;

inf.do{vas=~vas.value;

Synth(\lugar,[\start,~co.next,\end,~te.next,\out,20,\mat,Array.series(20,500,130).choose]);

vas.wait;

}}).quant_(0);

);

 

 

(

SynthDef(\coda,{|freq=260,start=0.01,end=1.99,gain=0.7,withd=2,gate=1,out=0|

var sin, pos, pan;

sin=MoogFF.ar(Blip.ar(freq,Line.kr(1,14,4),0.5),XLine.kr(200,600,1),gain)

*

EnvGen.kr(Env.perc(0.01,4,0.7,-2),doneAction:2);

pos=Line.kr(start,end,4);

pan=PanAz.ar(4,sin,pos,0.7,withd);

Out.ar(out,pan);

}).send(s)

);

 

(

~sono=Pseq([310,260,294,494,466,329,311,262,292,490,460,332],inf).asStream;

~prim=Pseq([0.01,1,1.5,1.99,0.01,1.99,1,0.5,0.01],inf).asStream;

~seg=Pseq([0.5,0.01,1,1.5,1.99,0.01,1.5,1,1.99],inf).asStream;

~tespero={4};

 

Tdef(\tocacoda,{var tespero;

inf.do{tespero=~tespero.value;

Synth(\coda,[\freq,~sono.next,\star,~prim.next,\end,~seg.next,\gain,(0,0.5..2).choose,\out,20]);

tespero.wait;}}).quant_(0);

);

 

 

(

SynthDef(\clnr,{|start=0.01,end=2,gate=1,out=0|

var b=1,trate,lo,dur,clk,pos,pan,gra;

trate=MouseY.kr(8,120,1);

lo=BufDur.kr(b);

dur=lo/trate;

clk=Impulse.kr(trate);

pos=MouseX.kr(0,BufDur.kr(b))+TRand.kr(0,0.01,clk);

pan=Line.kr(start,end,6);

gra=TGrains.ar(4,clk,b,1,pos,dur,pan,0.1)*EnvGen.kr(Env.linen(0.01,6,6,0.8),gate,doneAction:2);

Out.ar(out,gra);

}).send(s)

);

 

(

~en=Pseq([0.01,0.5,2,2,1,1.5],inf).asStream;

~sib=Pseq([2,1,1.5,0.01,0.5,0.01],inf).asStream;

~pasta=4;

 

Tdef(\tocaclnr,{

inf.do{

Synth(\clnr,[\start,~en.next,\end,~sib.next,\out,20]);

~pasta.wait;

}}).quant_(0);

);

 

 

(

SynthDef(\ggr,{|start=0.01,end=2,gate=1,out=0|

var b=0,trate, dur,clk,pos,pan,gra,cua;

trate=MouseY.kr(8,120,1);

cua=BufDur.kr(b);

dur=cua/trate;

clk=Impulse.kr(trate);

pos=MouseX.kr(0,BufDur.kr(b))+TRand.kr(0,0.01,clk);

pan=Line.kr(start,end,2);

gra=TGrains.ar(4,clk,b,1,pos,dur,pan,0.1)*EnvGen.kr(Env.linen(0.01,6,6,0.8),gate,doneAction:2);

Out.ar(out,gra);

}).send(s)

);

 

(

~tra=Pseq([0.01,0.5,2,1.5,1],inf).asStream;

~lleg=Pseq([2,1.5,1,0.01,0.01,0.5],inf).asStream;

~dale=2;

 

Tdef(\tocaggr,{

inf.do{

Synth(\ggr,[\start,~tra.next,\end,~lleg.next,\out,20]);

~dale.wait;

}}).quant_(0);

);

 

 

(

SynthDef(\rev,{|mix=0.7,room=0.5,gate=1,out=0|

var sen,env;

sen=FreeVerb.ar(In.ar(20,4),mix,room);

env=EnvGen.kr(Env.asr(0.01,2,7),gate,doneAction:2);

Out.ar(out,sen*env);

}).send(s)

);

 

(

SynthDef(\introrev,{|mix=0.5,room=0.5,gate=1,out=0|

var sen,env;

sen=FreeVerb.ar(In.ar(31,4),mix,room);

env=EnvGen.kr(Env.asr(0.01,2,7),gate,doneAction:2);

Out.ar(out,sen*env);

}).send(s)

);

 

 

)

 

 

///////////////////////

 

Código de interpretación:

 

 

“/Users/hms/SuperCollider/final/synths.rtf”.load

 

~introcna=Synth(\introrev,addAction:\addToTail);

~introcna.set(\room,1);

~introcna.set(\mix,0.5);

 

 

~revprocna=Synth(\rev,addAction:\addToTail);

 

Tdef(\tocagyc).play

Tdef(\tocagyc).stop

 

 

 

Tdef(\tocaimpulso).play

Tdef(\tocaimpulso).stop

 

 

Tdef(\tocanautilus).play

Tdef(\tocanautilus).stop

 

~revprocna.set(\room,0.9);

~revprocna.set(\mix,1);

 

//

~esperame={3}// ya declarada (funciones)

~esperame={1}

~esperame={0.5}

~esperame={0.3}

~esperame={2}

~esperame={rrand(2,0.1)}

~esperame={[3,2,1,0.5,0.3].wchoose([1,1,1,1,5].normalizeSum)}

 

Tdef(\tocawii1).play

Tdef(\tocawii1).stop

 

 

Tdef(\tocacamp).play

Tdef(\tocacamp).stop

 

//

~vas={2.5};//ya declarada (funcion)

~vas={2};

~vas={1.5};

~vas={1};

~vas={0.5};

~vas={Array.series(3,0.2,1).choose};

 

Tdef(\enlugar).play

Tdef(\enlugar).stop

 

//

 

~tespero={4};//ya declarada (funcion)

~tespero={rrand(0.5,3)};

 

Tdef(\tocacoda).play

Tdef(\tocacoda).stop

 

 

 

 

 

~pasta=4; //ya declarada

~pasta=6;

 

Tdef(\tocaclnr).play

Tdef(\tocaclnr).stop

 

~dale=2;// ya declarada

~dale=1

~dale=4

~dale=6

 

Tdef(\tocaggr).play

Tdef(\tocaggr).stop

 

//

 

Tdef(\tocagyc).play

 

 

~revprocna.set.free

~introcna.set.free

 

 

 

 

 

 

 

 

 

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s