I can get the panning effect by changing only the first argument to setPosition () and leaving the other arguments null.
<!DOCTYPE html> <html> <head> <script> var c = new webkitAudioContext(); var s = c.createBufferSource(); var g = c.createGainNode(); var p = c.createPanner(); s.connect(g); g.connect(p); p.connect(c.destination); function play(e) { var fr = new FileReader(); var file = document.getElementById("file").files[0]; fr.onload = function(e) { c.decodeAudioData(e.target.result, function (buf) { s.buffer = buf; g.gain.value = 0.5; s.noteOn(0) }, function () { console.error('decodeAudioData failed.'); } ); }; fr.readAsArrayBuffer(file); } function pan(range) { var x = Math.sin(range.value * (Math.PI / 180)); p.setPosition(x, 0, 0); } </script> </head> <body> Choose your MP3 file:<br> <input type="file" id="file" name="file" /><br> <input type="submit" id="go" onclick="play()" value="Play" /><br> L<input type="range" min="-45" max="45" value="0" onchange="pan(this);">R </body> </html>
But in order to get a natural panning effect, you also need to specify a third argument.
function pan(range) { var xDeg = parseInt(range.value); var zDeg = xDeg + 90; if (zDeg > 90) { zDeg = 180 - zDeg; } var x = Math.sin(xDeg * (Math.PI / 180)); var z = Math.sin(zDeg * (Math.PI / 180)); p.setPosition(x, 0, z); }
source share