La Catedral del Ruido

Para hacer tu mundo más interesante, puedes agregarle sonido. Estos pueden ser sonidos de ambiente, timbres, sirenas, lo que mejor te parezca.Todo esto se hace con dos tipos de nodos, Sound y AudioClip. Puedes imaginar al nodo Sound como la especificación del lugar en que se va a escuchar el soido, y en donde se origina. El propio sonido se especifica en el nodo AudioClip. En primer lugar, veremos el nodo Sound.

El sonido

El nodo Sound se usa para especificar la posicion y orientación de una fuente de sonido en tu mundo. El nodo Sound se coloca en un cierto lugar, y podrás oir ol sonido dependiendo del lugar en que te coloques en la escena respecto al sonido. El sonido se emite con un patrón elíptico, como se muestra en el cuadro de abajo:
Sound

Dentro del área roja, el sonido se oye con plena intensidad. Dentro del área amarilla, el sonido se desvanece segun la distancia del origen. Los campos minFront, maxFront, minBack y maxBack especificados en el nodo Sound son las distancias que miden esto, asi como la dirección. La sintaxis del nodo Sound es como sigue:

Sound {
   SFVec3f     direction         0 0 1
   SFFloat     intensity         1
   SFVec3f     location          0 0 0
   SFFloat     maxBack           10
   SFFloat     maxFront          10
   SFFloat     minBack           1
   SFFloat     minFront          1
   SFFloat     priority          0
   SFNode      source            NULL
   SFBool      spatialize        TRUE   
}

Los demás campos operan de la siguiente manera: direction es un vector que especifica la dirección a donde apunta el nodo sound. El campo intensity es el volumen del sonido. Un valor de 1 es volumen pleno, tal como se encuentra en el archivo original , y 0 es silencio. situation es la posición de la fuente de sonido en el mundo. Los cuatro parámetros max/min de Front/Back especifican la forma de la elipse correspondiente al diagrama de arriba. Por ejemplo, para tener un sonido que sea igualmente audible en todas las direcciones, tendrías el maxFront=maxBack, y minFront=minBack. Si no quisieras que este sonido disminuyera con la distancia, tendrías que poner todos los valores a la misma distancia, la cual deberá ser bastante grande como para cubrir tu mundo entero. Si quieres que el sonido vaya apagandose con la distancia, pon los valores máximos a 10 y los valores min darán una proporcion realista de caida.

El campo priority es la importancia del sonido. El navegador tendrá sólo un cierto número de canales de sonido disponibles para a él, y priority se utiliza para determinar cual de ellos se utilizará. Este campo toma valores de 0 a 1. Los sonidos de fondo de baja prioridad deben tener un valor de 0, y los prioritarios, sonidos cortos como timbres o lo que sea, deben tener un valor de 1.

El campo spatialize es usado por el navegador para determinar si debe espacializar el sonido. Esto significa que lo hara sonar a través de los altavoces como si viniera de su origen, y entonces oirás el sonido moviendose cuando te muevas relativamente a él. Si este campo es FALSE, el navegador no hará esto. Esto es útil para la optimización y para la creación de sonidos ambientales.

Sólo nos falta un campo del nodo Sound, y es el campo source (fuente, origen). Es realmente importante. Puede contener un nodo AudioClip o un nodo MovieTexture. Si usas MovieTexture, el navegador ejecutará el sonido del archivo de la película especificada. Esto puede ser útil para tocar archivos de sonido de MPEG, por ejemplo. ¡Más útil es el nodo AudioClip que cubriremos en detalle ahora mismo!

AudioClip

El nodo AudioClip especifica qué sonara por el nodo sound, y cuándo. La sintaxis es como sigue:

AudioClip {
   SFString    description       ""
   SFBool      loop              FALSE
   SFFloat     pitch             1.0
   SFTime      startTime         0
   SFTime      stopTime          0
   MFString    url               []
}

El AudioClip funciona así. El campo url es una lista de archivos en formato .WAV o General MIDI .MID tipo 1, que es útil para la representación compacta de música. El navegador tocará el primero de éstos que pueda cargar. loop especifica si el sonido se ejecuta en bucle, lo que es útil para los sonidos del ambiente y description es una descripción del sonido que el navegador puede desplegar si lo deseas. El campo pitch es un multiplicador para la velocidad de la cinta, y en consecuencia del sonido. Un pitch de 1.0 es la velocidad normal. Un pitch de 0.5 sonará a la mitad de la velocidad, y transpone el sonido abajo una octava. Un valor de 2.0 tendrá el efecto opuesto, mientras duplica la velocidad del sonido, y eleva la velocidad una octava.

El startTime y stopTime son valores SFTime que especifican cuándo el sonido comenzará y se detendrá. Si lo recuerdas, son los segundos desde el 1de enero de 1970. Puede parecer que esto no tiene mucho sentido, pero cuando los unamos a los sensores y rutas te aseguro que lo tendrá. Un sensor puede generar un EventOut activado con el tiempo, y si se dirige (via ROUTE) al AudioClip a través del eventIn set_startTime, se ejecutará el sonido. Esto Veremos más sobre esto después, cuando cubramos sensores e interacciones.

Desvanecerse en la lejanía...

Una cosa más sobre los nodos de sonido, y es acerca de los archivos no comprimidos tipo .WAV. El tema es que son GRANDES, y toman tiempos absolutamente enormes para descargarse. Por consiguiente, deben usarse con mucha moderación a favor de la eficencia. Los archivos MIDI son buenos para la música de fondo, de modo que intenta alejarte de archivos .WAV tanto como puedas. Si son los que tienes, házlos mas cortos y de baja calidad, dado que nadie esperará alrededor de 10 minutos para bajarse un archivo .WAV con calidad CD.

Ése es todo lo que necesitas saber sobre las cosas basicas de sonido. Para poder producir sonidos verdaderamente utiles, como por ejemplo timbres y demás, nosotros necesitamos poder actuar recíprocamente con el mundo a través de sensores y cosas de ese tipo. No los hemos cubierto todavía, así que dejaré una demostración de sonidos interactivos para más adelante, y en este mundo de ejemplo sólo he agregado redobles de tambor que vienen desde el podio al observador. Después, cubriremos los sensores y podremos hacer cosas más impresionantes.
Tutorial Mundo 9 y código.

Eso es todo entonces, en el próximo tutorial te mostraré cómo hacer formas más realistas y útiles con objetos avanzados.