Taller de Audio del Centro Multimedeia del CNA

Clase 2 - Filtros

Curso de SuperCollider Principiantes

Soluciones a la tarea 1

{SinOsc.ar(1360,0,0.6)*WhiteNoise.kr(0.3)}.scope
{Saw.ar(60,0.5)*SinOsc.kr(780,0,0.34)}.scope
{SinOsc.ar(1000,0,0.5)*SinOsc.kr(240,0,0.5,0.5)}.scope   // Esto esta más alla del conocimiento que tienes, no cuenta para calificación.
{BrownNoise.ar(0.3)*SinOsc.kr(3,0,0.9)}.scope
{Pulse.ar(10,0.1,0.5)*LFTri.kr(100,0.5)}.scope
{Saw.ar(30,0.3)*WhiteNoise.kr(0.6)}.scope
{LFTri.ar(30,0.1,0.3)*WhiteNoise.kr(0.6)*SinOsc.kr(10,0,0.4,0.6)}.scope
{Saw.ar(302,0.3)*SinOsc.kr(10.6,0,0.6)*WhiteNoise.kr(0.710)}.scope
{SinOsc.ar(100,0,0.5)*SinOsc.kr(2,0,0.5,0.5)}.scope
{Saw.ar(12000,0.4)*WhiteNoise.kr(0.3)*Saw.ar(1200,0.4)*SinOsc.kr(40,0,0.6)}.scope
{(PinkNoise.ar(0.2)*WhiteNoise.kr(0.2))+Saw.ar(40,0.041)}.scope
{(Pulse.ar(40,0.01,0.3)*SinOsc.kr(30,0,0.4,0.5)*WhiteNoise.kr(0.8))+Saw.ar(10,0.4)}.scope
{((WhiteNoise.ar(0.5)*Dust.kr(10))+PinkNoise.ar(0.9))*SinOsc.kr(100,0,0.4,0.5)}.scope
{Saw.ar(30,0.3)+Saw.ar(70,0.3)}.scope
{((Saw.ar(460,0.3)+Pulse.ar(462,0.4,0.3))*Dust.kr(10))+LFTri.ar(42,0.1,0.2)}.scope
{SinOsc.ar(14000,0,0.9)*Dust.kr(300)}.scope
{LFTri.ar(70,0,0.3)*Dust.kr(100)}.scope
{SinOsc.ar(45,0,0.3)+SinOsc.ar(40,0,0.3)+SinOsc.ar(100,0,0.2)+SinOsc.ar(50,0,0.3)}.scope
{LFTri.ar(30,0,0.5)*SinOsc.kr(1000,0,0.7)}.scope
{Saw.ar(130,0.2)+SinOsc.ar(100,0,0.3)+WhiteNoise.ar(0.031)}.scope




Filtros

Un filtro es un sistema que, dependiendo de algunos parámetros, realiza un proceso de discriminación de una señal de entrada obteniendo variaciones en su salida. Notar que en todos los casos de los filtros que vamos a ver el primer argumento es la señal que se desea filtar y el segundo argumento es la frecuencia de corte. La frecuencia de corte en los filtros HPF y LPF tiene un significado ligeramente distinto que en el filtro BPF. Los tres filtros que veremos a continuación pueden funcionar tanto con .ar como con .kr. La condición al usarlos es que la señal que se quiera filtrar tenga el mismo rate que el filtro.


 
HPF    - High Pass Filter -- Filtro Pasa Altas
Es aquel que permite el paso de frecuencias desde una frecuencia determinada hacia arriba, sin que exista un límite superior especificado. Esta frecuencia determinada es la frecuencia de corte. Por ejemplo, si determinamos que sea 700 Hz la frecuencia de corte dejaremos pasar todas las frecuencias mas altas que 700 Hz.

Argumentos: entrada, frecuencia de corte, multiplicación y adición.

Sintaxis : HPF.ar(entrada, frecuencia de corte, multiplicación, adición)

    entrada : La señal que queremos filtrar. Tiene que tener .ar.

    frecuencia de corte : Frecuencia en Hertz a partir de la cual se permitirá el paso de frecuencias mas altas.

    multiplicación : Número por el cual multiplicamos la señal del filtro. Generalmente se identifica con el
                   volumen o amplitud del sonido siendo 0 el mínimo y 1 el máximo recomendado. El default es
                   1 dejando la señal sin alterar.

    adición : Número que se le suma a la señal del filtro. Observar que a la señal se le aplica primero el mul y luego el add. El default es 0 dejando la señal sin             alterar.


LPF    - Low Pass Filter-- Filtro Pasa Bajas.
Es aquel que permite el paso de  frecuencias bajas, desde la frecuencia 0 hasta una frecuencia determinada. Esta frecuencia determinada es la frecuencia de corte. Por ejemplo, si determinamos que sea 200 Hz la frecuencia de corte dejaremos pasar todas las frecuencias mas bajas que 200 Hz. Recordemos que no hay frecuencias menores a 0 Hz.

Argumentos: entrada, frecuencia de corte, multiplicación y adición.

Sintaxis : LPF.ar(entrada, frecuencia de corte, multiplicación, adición)

    entrada : La señal que queremos filtrar. Tiene que tener .ar.

    frecuencia de corte : Frecuencia en Hertz a partir de la cual se permitirá el paso de frecuencias mas bajas.

    multiplicación : Número por el cual multiplicamos la señal del filtro. Generalmente se identifica con el
                   volumen o amplitud del sonido siendo 0 el mínimo y 1 el máximo recomendado. El default es
                   1 dejando la señal sin alterar.

    adición : Número que se le suma a la señal del filtro. Observar que a la señal se le aplica primero el mul y luego el add. El default es 0 dejando la señal sin             alterar.

BPF    - Band Pass Filter -- Filtro Pasa Banda
Es aquel que perimte el paso de frecuencias contenidas dentro de un determinado rango o banda, comprendido entre una frecuencia  inferior y otra superior. La distancia entre estas frecuencias determina el ancho de banda. La frecuencia que está en el centro de esta distancia es la frecuencia de corte. Por ejemplo, si determinamos que sea 1000 Hz la frecuencia de corte y 200 Hz el ancho de banda podemos saber cual es el rango de frecuencias que dejaremos pasar usando la siguiente fórmula:

cota inferior = frecuencia de corte - ancho de banda/2

cota superior = frecuencia de corte + ancho de banda/2

La cota superior es la frecuencia límite superior y la cota inferior es la frecuencia límite inferior.

Si sabemos cuáles son las cotas inferior y superior que queremos entonces podemos obtener el ancho de banda y la frecuencia de corte con la siguiente fórmula:

ancho de banda = cota superior - cota inferior

frecuencia de corte = cota inferior + ancho de banda/2


BPF no es el único filtro que utiliza un ancho de banda. En este filtro y en todos los demás de este tipo el ancho de banda no se puede escribir directamente como un argumento. En vez de ancho de banda estos filtros tienen como argumento rq.

q =  frecuencia de corte / ancho de banda.
Por lo tanto el reciproco de q = 1/q = ancho de banda / frecuencia de corte = rq

Argumentos : entrada, frecuencia de corte, rq, multiplicación y adición.

Sintaxis : BPF.ar(entrada, frecuencia de corte, rq, multiplicación, adición)

    entrada : La señal que queremos filtrar.

    frecuencia de corte : Frecuencia en Hertz que determina el centro de la banda de nuestro filtro.
    
    rq : recíproco de q, es decir, ancho de banda / frecuencia de corte.

    multiplicación : Número por el cual multiplicamos la señal del filtro. Generalmente se identifica con el
                   volumen o amplitud del sonido siendo 0 el mínimo y 1 el máximo recomendado. El default es
                   1 dejando la señal sin alterar.

    adición : Número que se le suma a la señal del filtro. Observar que a la señal se le aplica primero el mul y luego el add. El default es 0 dejando la señal sin             alterar.


Algunos ejemplos.


{ HPF.ar(WhiteNoise.ar(0.1), 7030)}.scope // Aqui un WhiteNoise (Ruido Blanco) es filtrado por un filtro pasa altas dejando pasar frecuencias arriba de los 7030 Hz

{ LPF.ar(WhiteNoise.ar(0.1), 7030)}.scope // Aqui lo contrario: pasan las frecuencias debajo de los 7030 Hz

{ BPF.ar(WhiteNoise.ar(0.1), 7030, 700/7000)}.scope // El tercer argumento del filtro pasa banda es el reciproco de Q.


En este ejemplo tenemos ancho de banda=700 y frecuencia de corte=7000. O sea, 700/7000=0.1 Por lo tanto rq=0.1
A veces es mas rapido escribir el numero decimal que el quebrado. Veamos entonces como queda sustituyendo del ejemplo anterior:

{ BPF.ar(WhiteNoise.ar(0.1), 7030, 0.1)}.scope

{ BPF.ar(WhiteNoise.ar(0.1), 7030, 1)}.scope // Aqui tenemos otro valor para el rq.

Si tenemos que 1 = ancho de banda / frecuencia de corte = rq, entonces sabemos que ancho de banda=frecuencia de corte = rq.
Y si frecuencia de corte = 7030,
entonces rq = 7030 / 7030.
Por lo tanto sabemos que la linea de codigo anterior se puede escribir tambien de la siguiente forma:

{ BPF.ar(WhiteNoise.ar(0.1), 7030, 7030/7030)}.scope





Hay señales que se prestan a ser filtradas y otras que no. Por ejemplo, una senoide (SinOsc) no se presta a ser filtrada por que solo contiene una frecuencia. No existe nada mas arriba ni mas abajo de esa frecuencia para ser retirado. Los ruidos, que son un conjunto complejo se frecuencias son los que dan resultados mas notables al ser filtrados.


Control con el Mouse

Una forma de controlar los argumentos de los UGens en SuperCollider es através de las Clases MouseY, MouseX y MouseButton Estas clases son UGens de control por lo que trabajan con el mensaje kr. Los argumentos principales de los UGens MouseY y MouseX son el valor mínimo y el valor máximo que queremos obtener al mover nuestro mouse. En MouseButton los argumentos son el valor cuando el mouse no está apretado y cuando si.

En SuperCollider para Windows se utiliza JMouseY, JMouseX y JMouseButton. Al final de tu linea de código agregar

JMouseBase.makeGUI

separado por;

Ejemplos:

MouseX.kr(0,100) // obtengo numeros desde 0 cuando el mouse esta hasta la izquierda hasta 100 cuando el mouse esta  en el extremo derecho.

MouseY.kr(0,100) // obtengo numeros desde 0 cuando el mouse esta hasta arriba hasta 100 cuando el mouse esta  hasta abajo.

Notar que en Y el maximo es abajo y el minimo arriba. En X el maximo es a la derecha y el minimo a la izquierda.

MouseButton.kr(0,1) // Cuando no esta apretado tengo el valor 0 y cuando si el valor 1.

{SinOsc.ar(MouseY.kr(1000,100))}.scope  // Puedo hacer un barrido desde la frecuencia 100 cuando el mouse esta abajo hasta 1000 cuando el mouse esta hasta arriba

{SinOsc.ar(400,0,MouseX.kr(0,1))}.scope  // Amplitud (volumen) 0 cuando el mouse esta en el extremo izquierdo hasta 1 cuando el mouse esta en el extremo derecho


{SinOsc.ar(MouseX.kr(1000,100),0,MouseY.kr(0,1))}.scope // Mezclando los dos ejemplos anteriores con MouseY y MouseX

{Pulse.ar(MouseY.kr(10000,20),MouseX.kr(0.001,0.5),MouseButton.kr(0,1))}.scope

Los mismos ejemplos de filtros usando la clase MouseY y MouseX

{ HPF.ar(WhiteNoise.ar(0.1), MouseY.kr(10000,100))}.scope

{ LPF.ar(WhiteNoise.ar(0.1), MouseX.kr(10000,100))}.scope

{ BPF.ar(WhiteNoise.ar(0.1), MouseY.kr(10000,100), 0.05)}.scope
{ BPF.ar(WhiteNoise.ar(0.5), 130, MouseX.kr(0.05,1.5))}.scope

{ BRF.ar(WhiteNoise.ar(0.1), MouseY.kr(10000,100), 1)}.scope
{ BRF.ar(WhiteNoise.ar(0.1), 7030, MouseX.kr(0.05,1.5))}.scope

Los mismos ejemplos pero para SuperCollider en Windows

{SinOsc.ar(JMouseY.kr(1000,100))}.jscope;JMouseBase.makeGUI
{SinOsc.ar(400,0,MouseX.kr(0,1))}.jscope;JMouseBase.makeGUI
{SinOsc.ar(MouseX.kr(1000,100),0,MouseY.kr(0,1))}.jscope;JMouseBase.makeGUI
{Pulse.ar(MouseY.kr(10000,20),MouseX.kr(0.001,0.5),MouseButton.kr(0,1))}.Jscope;JMouseBase.makeGUI

Los mismos ejemplos de filtros usando la clase MouseY y MouseX

{ HPF.ar(WhiteNoise.ar(0.1), JMouseY.kr(10000,100))}.jscope;JMouseBase.makeGUI
{ LPF.ar(WhiteNoise.ar(0.1), JMouseX.kr(10000,100))}.jscope;JMouseBase.makeGUI
{ BPF.ar(WhiteNoise.ar(0.1), JMouseY.kr(10000,100), 0.05)}.jscope;JMouseBase.makeGUI
{ BPF.ar(WhiteNoise.ar(0.5), 130, JMouseX.kr(0.05,1.5))}.jscope;JMouseBase.makeGUI
{ BRF.ar(WhiteNoise.ar(0.1), JMouseY.kr(10000,100), 1)}.jscope;JMouseBase.makeGUI
{ BRF.ar(WhiteNoise.ar(0.1), 7030, JMouseX.kr(0.05,1.5))}.jscope;JMouseBase.makeGUI





Tarea 2

/* 1  */ {_______.ar(BrownNoise.ar(0.5),160)}.scope
/* 2  */ {HPF.ar(_______.ar(10,0.75)*WhiteNoise.ar(1),10000)}.scope
/* 3  */ {Saw.ar(10,0.75)*___.ar(WhiteNoise.ar(1),10000)}.scope
/* 4  */ {_______.ar(Saw.ar(2,0.6),3000,100/3000)+BPF.ar(_______.ar(3,0.4),_______,50/500)}.scope
/* 5  */ {LFTri.ar(1,0,1)*LPF.ar(_______.ar(30,0.1,1),1000)}.scope
/* 6  */ {Pulse.ar(117,_______.kr(0.5,0.01),0.5)}.scope
/* 7  */ {_______.ar(MouseX.kr(60,800),0,0.6)}.scope
/* 8  */ {_______.ar(_______.ar(100),MouseY.kr(15000,160),60/MouseY.kr(15000,160))}.scope
/* 9  */ {Pulse.ar(_______.kr(5,20))_______(SinOsc.ar(10000,0,0.6)_______SinOsc.ar(90,0,0.6))}.scope
/* 10 */ {Pulse.ar(MouseY.kr(110,90),_______,0.5)*_______.ar(100,0.1,0.5)}.scope

Descargar Documento