GUI parte 2

SCSlider(parent, bounds)
Con esta clase podemos construir sliders en una SCWindow 

parent = Ventana en la que se quiere crear el Slider

bounds = Dimensiones del Slider usando la clase Rect

SCSlider funciona a través de métodos. En el ejemplo 1 ponemos un Slider de nombre "fader" en la ventana "ventana" y asignamos sus dimensiones con la clase Rect. Después con el método action especificamos la acción que queremos que realice. En este caso le pedimos que imprima el valor del slider. Hacemos esto con el método .value.

Ejemplo 1. fader horizontal

(
var ventana,fader;
ventana = SCWindow("fader",Rect(50,500,300,200)).front;
fader = SCSlider(ventana, Rect(70, 80, 100, 40));
fader.action={fader.value.postln};
)

Ejemplo 2. fader vertical

En el ejemplo 2 ponemos un slider similar pero de manera vertical. Esto depende de las dimensiones que esribamos en la clase Rect. Si el Slider es mas alto que ancho será veretical, si es más ancho que alto será horizontal.

(
var ventana,fader;
ventana = SCWindow("fader",Rect(50,500,300,200)).front;
fader = SCSlider(ventana, Rect(70, 80, 40, 100));
fader.action={fader.value.postln};
)  

Ahora utilicemos el valor del Slider para afectar la amplitud de un Synth. Creamos un Synth(\ji) primero con un argumento llamado "amp" para la amplitud. Después, hacemos una ventana con un slider dentro y abrimos el Synth(\ji). En el método action de nuestro slider utilizamos el .value como valor para el argumento \amp del Synth(\ji). En otra l[inea agregamos el método onClose a la ventana para que al cerrarla mande apagar al Synth(\ji).

Ejemplo 3

//synth
(
SynthDef(\ji,{|gate=1,freq=1000,amp=0|
       var sen,env;
           sen=SinOsc.ar(freq,0,amp);
               env=EnvGen.kr(Env.asr(0,1,0),gate,doneAction:2);
                   Out.ar(0,sen*env)
                   }).send(s)
                   )

//ventana prende el synth
//fader controla la amplitud
//al cerrar la ventana se activa el doneAction sacando el sytnh
//3
(
var ventana,fader;
ventana = SCWindow("fader",Rect(50,500,300,200)).front;
fader = SCSlider(ventana, Rect(70, 80, 100, 40));
x=Synth(\ji);
fader.action={x.set(\amp,fader.value)};
ventana.onClose={x.set(\gate,0)}
) 

Ejemplo 4

En este ejemplo utilizamos un slider para hacer un  cross fade entre la amplitud de un pulso a 570 htz, y una senoide a 670 htz. Observen como el .value de nuestro slider es igualado a una variable f y utilizado de manera distinta para la amplitud de cada Synth. Con la operación (f * -1.0)+ 1.0) estamos cambiando el volumen de y de manera inversa a x. Después imprimimos ambos valores en un  array.

(
(
SynthDef(\seno,{|gate=1,freq=670,amp=0|
       var sen,env;
           sen=SinOsc.ar(freq,0,amp);
               env=EnvGen.kr(Env.asr(0,1,0),gate,doneAction:2);
                   Out.ar(0,sen*env)
                   }).send(s)
                   );
                   
(
SynthDef(\puls0,{|gate=1,freq=570,amp=0|
       var sen,env;
           sen=Pulse.ar(freq,0.2,amp);
               env=EnvGen.kr(Env.asr(0,1,0),gate,doneAction:2);
                   Out.ar(0,sen*env)
                   }).send(s)
                   ) 
                   )                  

(
var ventana,fader;
ventana = SCWindow("fader",Rect(50,500,300,200)).front;
fader = SCSlider(ventana, Rect(70, 80, 150, 40));

fader.value=0.5;

f=fader.value;
x=Synth(\ji, [\amp, f]);
y=Synth(\puls0, [\amp, (f * -1.0)+ 1.0]);

 fader.action=  {f=fader.value;
				x.set(\amp,f);
				y.set(\amp, (f * -1.0)+ 1.0);
				[f,(f* -1.0)+1.0].postln};

ventana.onClose={x.set(\gate,0);y.set(\gate,0)}
)

SCNumberBox(parent, bounds)  
Una campo para desplegar valores numéricos en una SCWindow

parent = Ventana en la que se quiere crear la caja numérica

bounds = Dimensiones de la caja numérica usando la clase Rect

El ejemplo 5 muestra la forma  de hacer un SCNumberBox. Al igual que la mayoría de este tipo de clases declaramos la ventana en donde queremos poner la caja con sus dimensiones y le asignamos el método action. Ahora solo queremos que imprima el valor de la caja numérica. Podemos cambiar el valor de la caja escribiendo dentro de ella. Para que la caja reciba el dato es necesario dar ENTER o RETURN. En el ejemplo 6 usamos el valor de la caja numérica para cambiar la frecuencia de un Synth(\ji)

Ejemplo 5

(
var ventana,cajanumerica;
ventana = SCWindow("caja",Rect(50,500,300,200)).front;
cajanumerica=SCNumberBox(ventana, Rect(10, 20, 100, 40));
cajanumerica.action={|num|
      num.value.postln}
      )
 
Ejemplo 6     

(
var ventana,cajanumerica;
ventana = SCWindow("caja",Rect(50,500,300,200)).front;
cajanumerica=SCNumberBox(ventana, Rect(10, 20, 100, 40));
x=Synth(\ji,[\amp,0.2]);
cajanumerica.action={|num| x.set(\freq,num.value)};
ventana.onClose={x.set(\gate,0)}
)

En el ejemplo 7 vemos como cambiar los colores de la caja con el método setProperty

Ejemplo 7

(
var ventana,cajanumerica;
ventana = SCWindow("caja",Rect(50,500,300,200)).front;
cajanumerica=SCNumberBox(ventana, Rect(10, 20, 100, 40));
cajanumerica.setProperty(\boxColor,Color.red);
cajanumerica.setProperty(\stringColor,Color.white);
cajanumerica.setProperty(\align,\center);

x=Synth(\ji,[\amp,0.2]);
cajanumerica.action={|num| x.set(\freq,num.value)};

ventana.onClose={x.set(\gate,0)}
)

En el ejemplo 8 vemos como cambiar el valor de la caja desde un Tdef. Recuerden que para poder hacer esto necesitamos meter la linea de código entre llaves {} y agregamos el método .defer.

Ejempolo 8

(
SynthDef(\puls0,{|gate=1,freq=570,amp=0|
       var sen,env;
           sen=Pulse.ar(freq,0.2,amp);
               env=EnvGen.kr(Env.asr(0,1,0),gate,doneAction:2);
                   Out.ar(0,sen*env)
                   }).send(s)
                   ) 
                   ) 
                   
(
var ventana,cajanumerica;
(
e=Synth(\puls0,[\amp,0.1]);
Tdef(\koooooo,{var cont=0;
     inf.do{cont=cont+1;
     p=(cont%5*100)+10;
     e.set(\freq,p);
     {cajanumerica.value=p}.defer;
        
      0.1.wait
        }}
        ).quant_(0).play
        );

ventana = SCWindow("caja",Rect(50,500,300,200)).front;
cajanumerica=SCNumberBox(ventana, Rect(10, 20, 100, 40));
ventana.onClose={e.set(\gate,0); Tdef(\koooooo).stop}
)

Ahora veamos como trabajan en pareja el SCSlider y el SCNumberBox. En el ejemplo 9 igualamos el valor del slider al valor de la caja numérica. Además usamos ese valor para modificar la frecuencia de un Synth(\puls0).
(
var ventana,fader,cajanumerica;
ventana = SCWindow("fader",Rect(50,500,300,200)).front;
fader = SCSlider(ventana, Rect(70, 80, 40, 100));
cajanumerica=SCNumberBox(ventana, Rect(40, 20, 100, 40));
x=Synth(\puls0,[\amp,0.4]);

  fader.action={t=fader.value.round(0.01).linlin(0,1,40,3000);
  				cajanumerica.value=t;
 				 x.set(\freq,t)};
ventana.onClose={x.set(\gate,0)}
)  

Por último veremos cómo desplegar texto en la SCWindow para tener información sobre los objetos que hay en ella o para cualquier fin que se deseé. En el ejemplo 9 usamos la clase SCStaticText para esto. Usamos los métodos .font para determinar la fuenta y el tamaño y el método .string para determinar el texto que queremos que se despliegue entre comillas. Además, de pilón, agregamos una líea que muestra cómo cambiar el color de la SCWindow con el método .view.background.

SCStaticText(parent, bounds)

parent = Ventana en la que se quiere crear el texto.

bounds = Dimensiones del área en la que se mostrará el texto usando la clase Rect.

Ejemplo 9

(
var ventana,texto;
ventana=SCWindow("texto",Rect(50,500,600,200)).front;
ventana.view.background = Color(rrand(0.1,0.9),rrand(0.1,0.9),rrand(0.1,0.9));
   texto=SCStaticText(ventana, Rect(50,0,525,170));
   texto.font=Font("Impact", 40);
    texto.string="hola no soy tan tontito ";

   )

Ahora construimos un ejemplo, el ejemplo 10, en donde hacemos uso de todos los elementos que hemos visto en esta clase. Usamos dos SCSliders que muestran sus valores en dos SCNumberBox y que controlan las frecuencias de dos Synth's. Incluimos además otro SCSlider en horizontal para hacer el mismo cross fade que hicimos en el ejemplo 4.

(
var ventana,cajanumerica1,fader1,cajanumerica2,fader2,texto1,texto2,texto3,cross, crossText;
w=Synth(\puls0,[\amp,0.1]);
d=Synth(\seno,[\amp,0.1]);

ventana = SCWindow("caja",Rect(50,500,300,400)).front;
ventana.view.background = Color(rrand(0.1,0.9),rrand(0.1,0.9),rrand(0.1,0.9));

texto1=SCStaticText(ventana, Rect(40,0,175,30));
texto1.string="synth 1 ";

cajanumerica1=SCNumberBox(ventana, Rect(10, 20, 100, 40));
fader1 = SCSlider(ventana, Rect(30, 80, 40, 270));

fader1.action={ l=fader1.value;
				w.set(\freq,l.linlin(0,1,300,1200));
				cajanumerica1.value=l};

texto2=SCStaticText(ventana, Rect(170,0,175,30));
texto2.string="synth 2 ";

cajanumerica2=SCNumberBox(ventana, Rect(150, 20, 100, 40));
fader2 = SCSlider(ventana, Rect(180, 80, 40, 270));

fader2.action={ c=fader2.value;
				d.set(\freq,c.linlin(0,1,300,1200));
				cajanumerica2.value=c};

cross=SCSlider(ventana, Rect(74, 300, 100, 30));
cross.action=  {v=cross.value;
				d.set(\amp,v);
				w.set(\amp, (v * -1.0)+ 1.0);
				[v,(v* -1.0)+1.0].postln};
crossText=SCStaticText(ventana, Rect(74,340,100,30));
crossText.font=Font("Arial", 20);
crossText.string="Crossfade";

ventana.onClose={d.set(\gate,0);w.set(\gate,0)}
)