La percepción espacial del sonido es un elemento importante en el desarrollo de juegos o aplicaciones de audio. La Web Audio API nos permite a través del AudioPannerNode
trabajar la espacialidad del sonido. Mediante sus métodos y atributos podemos parametrizar la posición de la fuente y conseguir un ambiente sonoro en 2D o incluso en 3D.
Si escuchas este ejemplo con tus auriculares estéreo, advertirás que mediante los 3 controles espaciales del panner, podrás variar la percepción izquierda-derecha de la fuente (L-R) la posición enaltura (eje Y) y la posición relativa frente a ti, delate o detrás (eje Z).
Profundizando en el PannerNode encontraremos atributos y métodos que incrementan la complejidad de la percepción espacial del sonido, como:
panningModel
a utilizar en la espacialización, a elegir entre paneados equipotenciales o algoritmos complejos de alta calidad o HRTF. coneInnerAngle
o ángulo del conos de radiación, en el cual no habrá reducción de nivel.setVelocity
sirve para declarar el vector de velocidad de la fuente de audio, este vector controlará tanto la dirección como la velocidad en un entorno 3D y determinará la cantida de efecto doppler a aplicar.En el ejemplo hemos utilizado el método setPosition(x, y, z);
del nodo de paneado o AudioPannerNode
para conseguir espacialidad en la percepción del sonido. Podríamos haber utilizado la interfaz AudioListener
que usa tambien un sistema cartesiano de coordenadas para establecer la posición relativa del oyente frente a la fuente, entre otras variables, y exteinde las posibilidades de la espacialización del sonido con la Web Audio API.
El siguiente fragmento de código muestra cómo asignamos los valores de los sliders (aquí potenciómetros) HTML al método setPosition
del nodo de Paneado. Así descriiremos la posición relativa de la fuente frente al oyente. Los valores oscilarán entre 1 y -1, teniendo como centro a posición (0,0,0).
//creamos el panner
panner = contextoDeAudio.createPanner();
// Ajustamos los valores del nodo a los del potenciómetro
// Panner
var panX = document.querySelector('#pan').value;
var panY = document.querySelector('#pany').value;
var panZ = document.querySelector('#panz').value;
panner.setPosition(panX, panY, panZ);
// x,y,z representan las coordenadas en el espacio del oyente
Para graficar los valores de nuestra cadena de datos creamos una función de dibujo utilizando el elemento <canvas>
que recorra este array de datos y los imprima en pantalla