2012-06-24 18 views
12

Para las necesidades de mi juego, necesito tener sonido 2D. Eso significa que el emitador debe colocarse en algún lugar en un plano 2D. ¿Cómo logro este efecto en Javascript? ¿Necesito usar un formato de sonido especial o puedo controlar el volumen en los parlantes?Sonido espacial (2D) en Javascript

Creo que puedo llegar al punto en que tengo 2 volúmenes para cada altavoz, pero no tengo ni idea de cómo aplicar diferentes volúmenes para el mismo sonido en Javascript.

+2

¿Un juego de ' '? ¿De dónde viene el sonido? Un elemento '

+4

Lea esto: [Web Audio API] (http://www.w3.org/TR/webaudio/) –

+0

@ ŠimeVidas, de hecho. – corazza

Respuesta

7

Un artículo que describe exactamente este incluyendo una demostración se puede encontrar here.

Para evitar enlace roto Voy a citar las partes más relevantes a continuación

Por suerte, la API de Web Audio viene con una función de aceleración por hardware características de audio posicional que son bastante sencillo de usar.

La idea central se demuestra en el siguiente código:

PositionSample.prototype.changePosition = function(position) { 
    // Position coordinates are in normalized canvas coordinates 
    // with -0.5 < x, y < 0.5 
    if (position) { 
    if (!this.isPlaying) { 
     this.play(); 
    } 
    var mul = 2; 
    var x = position.x/this.size.width; 
    var y = -position.y/this.size.height; 
    this.panner.setPosition(x * mul, y * mul, -0.5); 
    } else { 
    this.stop(); 
    } 
}; 

El código fuente completo de la versión parcial de programa de trabajo en el primer link anterior se puede encontrar here.

Offtopic: consideré volver a escribir el artículo citado por la mano como una respuesta personalizada aquí, pero que parecía relativamente inútil como el artículo ya es más que suficiente clara y hacer doble trabajo parece inútil


Compatibilidad, solo una combinación de flash y el código mencionado anteriormente ofrece una verdadera solución de posicionamiento/panoramización de audio entre navegadores (ya que el flash no está disponible en ciertos dispositivos móviles). Lo ideal sería desaconsejar el uso de la API de audio si se puede eludir, ya que no es poco probable que las cosas cambien en la especificación, posiblemente rompiendo el código (+ no es poco probable que esto no funcione de cualquier manera en los dispositivos móviles). El único escenario donde usar las aplicaciones de audio web más avanzadas tiene sentido es si esperas trabajar al menos otros 6 a 18 meses en tu juego (ya que es el tiempo probable que tomará para que las implementaciones se estabilicen en un punto utilizable) .

+0

No me importa la compatibilidad, aunque me gustaría que mi código no contenga ningún Flash. – corazza

+0

Jaja, en ese caso la solución anterior es perfecta para usted, sí: D (supongo que eso significa que solo lo está haciendo para aprender, lo cual es genial: D) –

+0

Hombre, realmente está tratando de vender su "solución" ". Es solo + 50pts, tómalo con calma. Relajarse. – MMeah

2

Hemos utilizado SoundManager2 en el trabajo, era una solución realmente fácil de usar y una API bien documentada.

http://www.schillmania.com/projects/soundmanager2/

Ejemplo:

soundManager.createSound({ 
id:'mySound1', 
url:'../mpc/audio/CHINA_1.mp3' 
}); 
soundManager.play('mySound1'); 

BSD Licencia: http://www.schillmania.com/projects/soundmanager2/license.txt

+4

Para Sound Pan, puede grabar solo el canal izquierdo o derecho y fundir entre los dos. Cualquier editor de sonido lo permitirá. Requiere dos archivos, pero es una solución. – MMeah

+0

¿No es necesario que el desvanecimiento entre 2 archivos requiera una sincronización exacta, que a veces no se realiza fácilmente? – wizzard0

+0

La API de audio web tiene un buen número de herramientas útiles para eso, aunque, por supuesto, no se puede usar la biblioteca de Soundmanager para cosas serias como esa.(Vea el artículo en mi respuesta y desplácese un poco hacia arriba para ver las explicaciones de tiempo) –