2012-06-24 12 views
12

Per le esigenze del mio gioco ho bisogno di audio 2D. Ciò significa che l'emmiter dovrebbe essere posizionato da qualche parte su un piano 2D. Come posso ottenere questo effetto in Javascript? Devo usare uno speciale formato audio o posso controllare il volume degli altoparlanti?Suono spaziale (2D) in Javascript

Penso di poter arrivare al punto in cui ho 2 volumi per ciascun diffusore, ma non ho la minima idea di come applicare diversi volumi per lo stesso suono in Javascript.

+2

Un gioco ''? Da dove viene il suono? Un elemento '

+4

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

+0

@ ŠimeVidas, infatti. – corazza

risposta

7

Un articolo che descrive esattamente questo tra cui una demo può essere trovato here.

Per evitare legame marciume sarò citando le parti più rilevanti sotto

Per fortuna, Web Audio API viene fornito con built-in con accelerazione hardware caratteristiche audio posizionale che sono abbastanza semplice da usare.

L'idea centrale è dimostrato nel seguente codice:

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(); 
    } 
}; 

Il codice sorgente completo della demo lavoro nel primo link sopra può essere trovato here.

offtopic: ho considerato riscrivere l'articolo citato a mano come una risposta personalizzata qui, ma che sembrava relativamente inutile in quanto l'articolo è già più che sufficiente chiara e fare doppio lavoro sembra inutile


Compatibilità, solo una combinazione di flash e il codice menzionato in precedenza offrono una vera soluzione di posizionamento/panning per browser cross-browser (dato che il flash non è disponibile su alcuni dispositivi mobili). Idealmente, consiglierei contro l'uso dell'API audio se questo può essere aggirato in quanto non è improbabile che le cose cambino nelle specifiche, quindi potrebbe infrangere il codice (+ non è improbabile che ciò non funzioni in alcun modo sui dispositivi mobili). L'unico scenario in cui l'uso delle API audio web più avanzate ha senso è se ci si aspetta di lavorare almeno da 6 a 18 mesi sul proprio gioco (poiché è probabile che impiegheranno le implementazioni per stabilizzare persino in un punto utilizzabile) .

+0

Non mi interessa la compatibilità, anche se mi piacerebbe che il mio codice non contenga alcun Flash. – corazza

+0

Haha, in questo caso la soluzione di cui sopra è perfetta per te sì: D (Immagino che lo stiate facendo solo per imparare, che è fantastico: D) –

+0

Uomo, stai davvero cercando di vendere la tua "soluzione" ". Sono solo + 50 punti, prenditela comoda. Rilassare. – MMeah

2

Abbiamo usato SoundManager2 al lavoro, era una soluzione chiavi in ​​mano davvero semplice e API ben documentata.

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

Esempio:

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

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

+4

Per il pan sonoro, è possibile registrare solo il canale sinistro o destro e sfumare tra i due. Qualsiasi editor audio lo permetterà. Richiede due file, ma è una soluzione. – MMeah

+0

Lo sbiadimento tra 2 file richiede una corrispondenza esatta dei tempi, che a volte non è facile da fare? – wizzard0

+0

L'API audio web ha un numero considerevole di strumenti utili, anche se ovviamente non è possibile utilizzare la libreria soundmanager per cose serie come quella.(Vedere l'articolo nella mia risposta e scorrere un po 'per alcune spiegazioni sui tempi) –