Antes de comenzar nuestro trabajo de programación del sistema estereofónico, debemos tener en cuenta que los
objetos que calculan el seno y el coseno requieren que el ángulo esté expresado en radianes, y no en grados sexagesimales.
Recordemos que un radián es el ángulo que se forma cuando la longitud del arco de circunferencia barrido
es igual al radio. Siguiendo la definición, 360° equivalen a 2π radianes (el radio entra 2π veces en la longitud de la
circunferencia), 180° a π radianes, 90° a π /2 radianes, etcétera.
Para convertir grados a radianes podemos multiplicar el valor del ángulo por 2π y dividirlo por 360°. A los efectos de
evitar repetir cálculos innecesarios en las aplicaciones que programemos, podemos resolver de antemano la división
de estas dos constantes y multiplicar al ángulo directamente por el resultado de esta operación:
Si multiplicamos un ángulo medido en grados por 0,0174533, lo convertimos a radianes.
El siguiente gráfico ilustra un patch que implementa la simulación de una fuente virtual en estereofonía. Para designar
a la técnica de balance de la intensidad entre dos parlantes suele emplearse el anglicismo paneo. La denominación
en inglés es intensity panning.
Se observa en el ejemplo que la señal de la fuente a espacializar (subpatch sonido) se divide en dos canales, y cada uno
se multiplica por el coseno y el seno de un ángulo entre 0° a 90°, convertido a radianes. Cambiando el ángulo entre
esos valores, el sonido parece desplazarse de izquierda a derecha en un arco de circunferencia cuyo radio equivale a
la distancia entre el oyente y los parlantes.
El patch “63-paneo.pd” contiene la programación de G.8.4.
Procederemos a implementar la simulación de la distancia. Según vimos, la intensidad decrece con el cuadrado de la
distancia. Nuevamente, como operamos sobre las amplitudes y no sobre las intensidades, debemos considerar que
la amplitud decrece inversamente con la distancia (1 / d). La amplitud que llega al sujeto receptor es la amplitud de la
onda que emana la fuente, dividida la distancia que los separa.
A fin de controlar el ángulo de lateralización de la fuente y la distancia fuente-sujeto con un único dispositivo virtual,
vamos a recurrir al objeto grid, de la librería unauthorized, que forma parte de la instalación de PD-extended. Este
objeto consta de una matriz de dos dimensiones que registra el paso del puntero del mouse y devuelve las coordenadas
correspondientes (ver G.8.5.). Podemos establecer, entonces, que los movimientos sobre el eje horizontal correspondan
al ángulo de lateralización (0° a 90°), y que los movimientos sobre el eje vertical correspondan a la distancia
fuente-sujeto. Para fijar esos rangos, presionamos el botón derecho del mouse sobre el objeto y accedemos al menú
Properties. Tanto el ángulo como la distancia los enviamos remotamente con objetos send y receive.
El patch “64-paneo con distancia.pd” contiene la programación de G.8.5.
Es importante considerar que al dividir por la distancia, esta nunca puede ser igual a 0, pues, en ese caso el resultado
sería indeterminado. Por esa razón, fijamos para la distancia mínima un valor igual a uno, que corresponde a la distancia
a la que se encuentran los parlantes. Si los parlantes se ubican a dos metros del oyente la distancia mínima a la que
se encuentra la fuente (d = 1) también son dos metros, y para una distancia igual a dos (d = 2), la fuente se encuentra
al doble de distancia que los parlantes, es decir, a cuatro metros. Por consiguiente, nuestra unidad de medida no es
otra que la distancia entre el sujeto y los parlantes.
A fin de tornar más realista la sensación de distancia vamos a simular el efecto de absorción del aire. Si bien ese efecto
sería despreciable para distancias relativamente pequeñas, sirve a nuestro propósito, pues engaña efectivamente a
la percepción, reforzando la sensación de acercamiento o lejanía de la fuente sonora. Para ello recurrimos a un filtro
pasa bajos (objeto lop~), cuya frecuencia de corte haremos disminuir a medida que aumente la distancia. El escalamiento
de los valores de distancia lo realizamos con maxlib/scale, de la librería maxlib. A este objeto ingresan números
entre 1 y 10 (distancia) y salen números que varían proporcionalmente entre 8000 a 1500 y representan a la frecuencia
de corte del filtro (ver G.8.6.).
El patch “65-paneo con dist y filtro.pd” contiene la programación de G.8.6.
Nuestro espacializador estéreo está listo para ser encapsulado. Una vez logrado esto, podremos generar copias y utilizar varios de ellos en una misma aplicación. G.8.7. muestra la abstracción, denominada pan, y su contenido.
El patch “66-espacializador estéreo encapsulado.pd” contiene la programación de G.8.7.
Supongamos ahora que nos encontramos en un ambiente de dimensiones considerables, con un elevado tiempo
de reverberación (una iglesia, un garaje, etc.). Si nos hablan desde una distancia cercana, percibimos un nivel alto
de sonido directo y muy poco sonido reverberado. Pero, en cambio, si nos hablan desde lejos, percibimos un nivel
de sonido reverberado mucho mayor, pues, el directo disminuye con la distancia, mientras que la reverberación se
mantiene más o menos constante.
Tratemos ahora de recrear esta situación a través de la simulación de un recinto cerrado. Para ello, agregamos una
cámara de reverberación (ver subpatch con el objeto freeverb~, en G.8.8). Controlamos el nivel de reverberación con
una perilla (objeto mknob de la librería Moonlib) unida al subpatch reverb. Configurando un nivel bajo lograremos
que, a medida que la fuente se aleja, se haga más intensa la reverberación, y a medida que se acerca, el sonido directo
de la fuente la enmascare.
El patch “67-espacializador estéreo con reverberación.pd” contiene la programación de G.8.8.