【Web Audio API】サンプルどおりにプログラムしても音が出ない時には…。

PC版へ 2014年12月04日

JavaScriptでサウンドをごにょごにょしてみよう…と思います。HTML5やJavaScript関連の解説ドキュメントでは日頃からMDN(Mozilla Developer Network)あたりを頼りにしているわけですが、ここのサンプルコードをそのまんま走らせてみても、デバイスやブラウザによってはなかなか上手く動きません。

やりたいこと

実装は…

<script>
var AudioContext = window.AudioContext || window.webkitAudioContext;
var acx = new AudioContext();
var osc = acx.createOscillator();

osc.connect(acx.destination);
osc.type="sine";
osc.frequency.value = 1000;
osc.start();
</script>

音が鳴らない…

原因・回避方法

…というわけで、こんな感じでコードを書くとiOSデバイスやSafariでもちゃんと音が出ます。

<div id="start">Start</div>
<div id="stop">Stop</div>
<script>
var AudioContext = window.AudioContext || window.webkitAudioContext;
var acx = new AudioContext();
var osc = acx.createOscillator();

osc.connect(acx.destination);
osc.type="sine";
osc.frequency.value = 1000;
//osc.start();
document.getElementById('start').addEventListener('click',function(){osc.start(0);},false);
document.getElementById('stop').addEventListener('click',function(){osc.stop(0);},false);
</script>

サンプルページはこちら。"Start" を押すと1kHzの純音が再生され、"Stop" で停止します。

Web Audio API sample01 - freefielder.jp

で、OscillatorNode.stop で音声再生を止めると、このOscillatorNode は破棄されてしまうのですね。なので音を停止した後にもう一度 "Start" をクリックしても音が出ずにエラーが出ます。

これを回避するためには…

…のように書き換えると、何度でも再生→停止を繰り返すことができます。そんな動作をするサンプルはこちら

Web Audio API sample02 - freefielder.jp

ということで。

関連記事

コメント

現在、コメント機能は停止しています。