[ Jpn | Eng ]

Main Menu



Recent

最近の記事

Search

サイト内検索:

Archive

Powered by
MTOS 5.2.2


g200kg > Web Audio API 解説 > 05.ノードのライフタイム

Web Audio API 解説

2016/11/14

05.ノードのライフタイム



ノードのライフタイム

さて、「オシレーターの使い方」の例でこんなサンプルを使いましたが・・・

var audioctx = new AudioContext();
 
function Setup() {
    var t0 = audioctx.currentTime;
    for(var i = 0; i < 10; ++i) {
        var osc = audioctx.createOscillator();
        osc.connect(audioctx.destination);
        osc.start(t0 + i * 0.5 + 0.5);
        osc.stop(t0 + i * 0.5 + 0.6);
    }
}

よく見るとループ内で作られたoscはループを抜けるとどこからも参照されなくなってしまいます。まだこれから音を出さないといけないのですが、これで破棄されてしまわないのでしょうか?

WebAudio APIでは各ノードのオブジェクトがいつ破棄されるかについて Javascript のルールに加えて幾つかの条件が決まっていて、この内のどれか1つでも残っていると破棄されません。この例だと2番目の条件で音を出し終わるまでオシレーターは維持されているわけです。

  1. 通常の Javascript のオブジェクトとしての参照がある
  2. Oscillator / AudioBufferSource で、今後発音する時刻が設定されている、または発音中
  3. 他のノードから接続されている
  4. ノード内部の処理でまだ処理すべきデータが残っている (これは例えばリバーブの残響部分などです)
  5. MediaStreamAudioSourceNode で、入力となっているストリームが再生中になっている
  6. MediaElementAudioSourceNode で、対応する HTMLMediaElements が再生可能な状態になっている

更にこういう例もあります。前と同じようにあらかじめスケジュールが設定された10個の音を出しますが、オシレーターとゲインの組になっていて音量を1音ごとに変化させようとしています。

各 osc と gain の組はマスターボリュームのゲインノードに接続します。 mastervol はグローバルに参照が保持されていますが、Setup()のループ内で作られる osc も gain も作り終わった後どこからも参照されません (せっかくなので各オシレーターの音程と音量を乱数で適当に設定しています)。


<!DOCTYPE html>
<html>
<head></head>
<body>
<h1>Node Lifetime</h1>
<img src="images/lifetime.png"/><br/>
<button onclick="Setup()">Start</button><br/>
<script type="text/javascript">

window.AudioContext = window.webkitAudioContext||window.AudioContext;
var audioctx = new AudioContext();

var mastervol = audioctx.createGain();
mastervol.connect(audioctx.destination);

function Setup() {
	var t0 = audioctx.currentTime;
	for(var i = 0; i < 10; ++i) {
		var osc = audioctx.createOscillator();
		var gain = audioctx.createGain();

		osc.frequency.value = 100 + Math.random() * 1000;
		gain.gain.value = 0.2 + Math.random() * 0.8;
		osc.connect(gain);
		gain.connect(mastervol);
		osc.start(t0 + i * 0.5 + 0.5);
		osc.stop(t0 + i * 0.5 + 0.6);
	}
}

</script>
</body>
</html>
テストページ:ノードのライフタイム

この場合 osc はスケジュールが設定されているので維持され、gain は osc から接続されているために維持されています。osc は音を出し終わると自動的に破棄されますが、するとその osc に繋がっている gain も他のノードからの接続を失って連鎖的に破棄される事になります。

全部音を出し終わると mastervol への接続もなくなりますが、mastervol はグローバルな参照を持っているために消えずに残ります。




g200kg