8.4. Implementación del sistema estereofónico en PD

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.

G.8.4. Paneo de amplitud

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.

G.8.5. Paneo con distancia

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.).

G.8.6. Paneo con distancia y filtro PB

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.

G.8.7. Espacializador estéreo encapsulado

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.

G.8.8. Espacializador con reverberación

El patch “67-espacializador estéreo con reverberación.pd” contiene la programación de G.8.8.