Documentos de Académico
Documentos de Profesional
Documentos de Cultura
In
La clase In nos permite leer señales de audio o de control desde un bus.
Esto es sumamente recomendable a la hora de tener señales tipo dry/wet. Para esto
usaremos una combinacion entre el Out, osea el canal por donde saldra nuestra
señal y la clase In por donde recibiremos esa señal que queremos alterar.
Tenemos un SynthDef con un argumento out con el que podemos sacar la señal
por diferentes canales o buses. Al sacar la señal por el canal 0 el sonido sale por la
bocina izquierda, pero si lo sacamos por el canal 4 no suena. Si tuvieramos una
interfaz de audio con 8 canales podríamos conectar una bocina a la salida 5 de la
interfaz y escuchar lo que esta mandando collider por el canal 4 (recuerden que el
primer canal es el cero). En todo caso podemos ver lo que hay en el bus 4 si
abrimos el scope del servidor con s.scope(5). El argumento 5 le pide que nos
muestre 5 buses o canales.
(
SynthDef(\ki,{|gate=1, out=0|
var sen,env;
sen=WhiteNoise.ar(0.1);
env=EnvGen.kr(Env.asr(0,1,0),gate,doneAction:2);
Out.ar(out,sen*env)
}).send(s)
)
~ki=Synth(\ki)
~ki.set(\out, 4);
s.scope(5);
~ki.set(\out, 0);
~ki.set(\gate, 0);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
Contruimos un synth con la clase In. Esta clase recibe la señal de audio del canal 4
y la manda por un Out al tipico canal 0. Algo importante de destacar es que
cuando llamamemos a este Synth(\in) debemos de hacerlo con el mensaje .after.
Este mensaje determina la ubicacion de nuestros synth en un arbol de nodos.
Ahora podemos "tomar" la señal que está en el bus 4 y sacarlo de nuevo al canal 0.
(
SynthDef(\in,{|gate=1|
var sen,env;
sen=In.ar(4);
env=EnvGen.kr(Env.asr(0,1,0),gate,doneAction:2);
Out.ar(0,sen*env)
}).send(s)
)
t=Synth.after(s,\in)
t.set(\gate,0)
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Hagamos un ejercicio para utilizar las clases In y Out para asignar efectos a una
señal. Primero hacemos un SynthDef que lea una muestra de audio de un Buffer y
mandamos su señal al bus 9.
a=Buffer.read(s,"/home/tito/share/SuperCollider/sounds/Sonidos_tito/gritos.aiff")
a.play
(
SynthDef(\sample,{|gate=1|
var sen,env;
sen=PlayBuf.ar(1,a.bufnum,loop:1);
env=EnvGen.kr(Env.asr(0.1,0.5,0.1),gate,doneAction:2);
Out.ar(9,sen*env)
}).send(s)
)
d=Synth(\sample)
d.set(\gate,0)
Después creamos un SynthDef(\clean) que lea la señal del bus 9 y la saque limpia
por el bus 0
(
SynthDef(\clean,{|gate=1|
var sen,env;
sen=In.ar(9);
env=EnvGen.kr(Env.asr(1,0.4,2),gate,doneAction:2);
Out.ar(0,sen*env)
}).send(s)
)
e=Synth.after(s,\clean)
e.set(\gate,0)
(
SynthDef(\efx1,{|gate=1|
var sen,env;
sen=In.ar(9);
15.do({ sen = AllpassN.ar(sen, 0.05, [0.05.rand, 0.05.rand], 2) });
sen;
env=EnvGen.kr(Env.asr(2,0.5,2),gate,doneAction:2);
Out.ar(0,sen*env)
}).send(s)
)
t=Synth.after(s,\efx1)
t.set(\gate,0)
Así alternando entre el Synth(\clean) y el Synth(\efx1) podemos sacar la señal
limpia o con efecto.
///////////////////////////////////////////////////////////////////////////////
s.boot
Aqui hacemos lo mismo pero con una señal prveniente del micrófono de la
computadora usandp la clase AudioIn. Esta clase toma el 1 como primer canal de
entrada.
(
SynthDef(\audio,{|gate=1|
var sen,env;
sen=AudioIn.ar(1);
env=EnvGen.kr(Env.asr(0,1,0),gate,doneAction:2);
Out.ar(9,sen*env)
}).send(s)
)
q=Synth(\audio)
q.set(\gate,0)
////
(
SynthDef(\lp,{|gate=1|
var sen,env;
sen=In.ar(9);
env=EnvGen.kr(Env.asr(1,0.4,1),gate,doneAction:2);
Out.ar(0,sen*env)
}).send(s)
)
w=Synth.after(s,\lp)
w.set(\gate,0)
(
SynthDef(\rev,{|gate=1|
var sen,env;
sen=In.ar(9);
15.do({ sen = AllpassN.ar(sen, 0.05, [0.05.rand, 0.05.rand], 2) });
sen;
env=EnvGen.kr(Env.asr(1,0.4,1),gate,doneAction:2);
Out.ar(0,sen*env)
}).send(s)
)
z=Synth.after(s,\rev)
z.set(\gate,0)
s.queryAllNodes
Con el método queryAllNodes podemos pedirle al servidor que nos muestre qué
nodos están activos. Esto es útil por si no estamos seguros de haber apagado todos
los Synths.
///////////////////////////////////////////////////////////////////////////////////////
En el siguiente código creamos varios SynthDefs como efectos que pueden ser
aplicados a una señal que sale por el canal 11. También hacemos una GUI para
poder asignar por medio de botones el efecto que queremos aplicar.
q=Buffer.read(s,"/home/tito/share/SuperCollider/sounds/Sonidos_tito/gritos.aiff")
q.numFrames
(
(
SynthDef(\sample,{|gate=1|
var sen,env;
sen=PlayBuf.ar(1,q.bufnum,1,Impulse.kr(LFNoise1.kr(1,4.3,4.5)),LFNoise2.kr(3,
759051/2,759051/2),loop:1)*1.2;
env=EnvGen.kr(Env.asr(1,1,0.6),gate,doneAction:2);
Out.ar(11,sen*env)
}).send(s)
);
(
SynthDef(\clean,{| gate=1|
var sen,env;
sen=Pan2.ar(In.ar(11),0);
env=EnvGen.kr(Env.asr(2,1,1),gate,doneAction:2);
Out.ar(0,sen*env)
}).send(s)
);
(
SynthDef(\efx1,{| gate=1|
var sen,env;
sen=In.ar(11);
3.do({ sen = AllpassN.ar(sen, 0.15, 0.05.rand, 2) });
sen;
env=EnvGen.kr(Env.asr(2,1,4),gate,doneAction:2);
Out.ar(0,Pan2.ar(sen*env,SinOsc.kr(0.8)))
}).send(s)
);
(
SynthDef(\efx2,{|gate=1|
var sen,env;
sen=In.ar(11);
sen=Pan2.ar(HPF.ar(sen,12000,1),SinOsc.kr(1));
env=EnvGen.kr(Env.asr(3,1,3),gate,doneAction:2);
Out.ar(0,sen*env)
}).send(s)
);
(
SynthDef(\efx3,{|gate=1|
var sen,env;
sen=In.ar(11);
sen=Pan2.ar(Clip.ar(sen,-0.51,0.2).trunc(0.062),SinOsc.kr(1));
sen=sen+LPF.ar(sen,400,1);
env=EnvGen.kr(Env.asr(1,1,2),gate,doneAction:2);
Out.ar(0,sen*env)
}).send(s)
);
(
SynthDef(\efx4,{|gate=1|
var sen,env;
sen=In.ar(11);
sen=Pan2.ar(DelayN.ar(RLPF.ar(sen,1200,0.1),2,0.4),SinOsc.kr(2));
env=EnvGen.kr(Env.asr(1,1,2),gate,doneAction:2);
Out.ar(0,sen*env)
}).send(s)
);
(
SynthDef(\ff, { |gate=1|
var sen, env;
sen=In.ar(11);
sen=Pan2.ar(PitchShift.ar(sen, 0.02, Line.kr(0.1,4,20), 0, 0.0001),SinOsc.kr(2));
env=EnvGen.kr(Env.asr(0,1,0),gate,doneAction:2);
Out.ar(0, sen*env);
}).send(s);
);
//(
//SynthDef(\moog, { |gate=1|
// var sen, env;
// sen=In.ar(11);
// sen=Pan2.ar(MoogFF.ar(sen, MouseX.kr(300,13000), 2),SinOsc.kr(2));
// env=EnvGen.kr(Env.perc(0,0.5),gate,doneAction:2);
// Out.ar(0, sen*env);
//}).send(s);
//);
(
SynthDef(\spr,{|gate=1|
var sen,env,kernel;
sen=In.ar(11)*0.2;
kernel= Mix.ar(LFSaw.ar([3560,5770,1003,6500]*2,0,0.3));
sen=Pan2.ar(Convolution.ar(sen,kernel, 1024, 0.1),SinOsc.kr(2));
3.do({ sen = AllpassN.ar(sen, 0.05, 0.05.rand, 2) });
sen;
env=EnvGen.kr(Env.asr(2,1,2),gate,doneAction:2);
Out.ar(0,sen*env)
}).send(s)
)
(
var ventana, boton1,boton2,boton3,boton4,boton1a,boton5,boton6,boton7;
ventana=JSCWindow('sample/efx',Rect(100,100,380,220));
ventana.view.background = Color.new255(148, 0, 211);
boton1=JSCButton(ventana,Rect(23,40,161,50));
boton1.font_(Font("Helvetica-Bold", 25));
boton1.states=[["IN",Color.black,Color.new255(205, 16, 118)],
["off",Color.yellow,Color.black]];
boton1.action={|i| if(i.value==1,{f=Synth(\sample)});
if(i.value==0,{f.set(\gate,0)})};
boton1a=JSCButton(ventana,Rect(193,40,151,50));
boton1a.font_(Font("Helvetica-Bold", 25));
boton1a.states=[["clean",Color.black,Color.new255(205, 16, 118)],
["off",Color.yellow,Color.black]];
boton1a.action={|i| if(i.value==1,{b=Synth.after(s,\clean)});
if(i.value==0,{b.set(\gate,0)})};
boton2=JSCButton(ventana,Rect(23,100,101,30));
boton2.font_(Font("Helvetica-Bold", 25));
boton2.states=[["REV",Color.black,Color.new255(255, 165, 0)],
["off",Color.yellow,Color.black]];
boton2.action={|i| if(i.value==1,{x=Synth.after(s,\efx1)});
if(i.value==0,{x.set(\gate,0)})};
boton3=JSCButton(ventana,Rect(133,100,101,30));
boton3.font_(Font("Helvetica-Bold", 25));
boton3.states=[["HPF",Color.black,Color.new255(255, 165, 0)],
["off",Color.yellow,Color.black]];
boton3.action={|i| if(i.value==1,{e=Synth.after(s,\efx2)});
if(i.value==0,{e.set(\gate,0)})};
ventana.front;
boton4=JSCButton(ventana,Rect(243,100,101,30));
boton4.font_(Font("Helvetica-Bold", 25));
boton4.states=[["CLIP",Color.black,Color.new255(255, 165, 0)],
["off",Color.yellow,Color.black]];
boton4.action={|i| if(i.value==1,{u=Synth.after(s,\efx3)});
if(i.value==0,{u.set(\gate,0)})};
boton5=JSCButton(ventana,Rect(23,140,101,30));
boton5.font_(Font("Helvetica-Bold", 25));
boton5.states=[["LPF",Color.black,Color.new255(255, 165, 0)],
["off",Color.yellow,Color.black]];
boton5.action={|i| if(i.value==1,{c=Synth.after(s,\efx4)});
if(i.value==0,{c.set(\gate,0)})};
boton6=JSCButton(ventana,Rect(133,140,101,30));
boton6.font_(Font("Helvetica-Bold", 25));
boton6.states=[["pitch",Color.black,Color.new255(255, 165, 0)],
["off",Color.yellow,Color.black]];
boton6.action={|i| if(i.value==1,{n=Synth.after(s,\ff)});
if(i.value==0,{n.set(\gate,0)})};
boton7=JSCButton(ventana,Rect(243,140,101,30));
boton7.font_(Font("Helvetica-Bold", 25));
boton7.states=[["conv",Color.black,Color.new255(255, 165, 0)],
["off",Color.yellow,Color.black]];
boton7.action={|i| if(i.value==1,{g=Synth.after(s,\spr)});
if(i.value==0,{g.set(\gate,0)})};
ventana.front;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////
///Aplicaciones
///Utilitis
//configuracion de audio midi o midi set up
//en la pestaña superior AUDIO, abrir editor de dispositivos agregados.
//añadir [pon el nombre que mas te guste (sc3)]
//columna usar, señalar mic integrado y salida integrada
//salir.
Server.local.options.devices = "sc3";
Server.internal.options.devices = "sc3";