音の鳴るブログ

鳴らないこともある

AudioContext をたくさん作る会

やりかた間違っているんだけど、100個のオシレーターを100個の AudioContext で作りたいとき。webkit系(ChromeOperaで確認した)では上限があって怒られる。

_.range(100).map(function(i) {
  var ctx = new AudioContext();
  var osc = ctx.createOscillator();

  osc.frequency.value = i * 20 + 200;
  osc.start(0);
  osc.connect(ctx.destination);

  return osc;
});

// SyntaxError: Failed to construct 'AudioContext':
//   number of hardware contexts reached maximum (6).

なんでシンタックスエラーなのかは分からないけどとにかく上限がある。 Firefoxだと怒られなかったけど音が全然違う。プルルルとダサい音が鳴ってしまう。大丈夫か?Firefox

_.range(100).map(function() {
  return new AudioContext();
});

// AudioContext[100]

おっ、これは大丈夫・・

_.range(100).map(function() { 
  return new AudioContext();
}).map(function(ctx, i) {
  var osc = ctx.createOscillator();

  osc.frequency.value = i * 20 + 200;
  osc.start(0);
  osc.connect(ctx.destination);

  return osc;
});

// OscillatorNode[100]

これだと動く。なんなんだ...


webkit のソースを確認したところ、new AudioContext() をしたときに、ここ で上限をチェックしているのだけど、実際に初期化されるのは ちょっと遅れる みたいで、とりあえず最初に AudioContext だけを大量に生成するとチェックをすり抜けてしまう。