Sinkオブジェクトの生成


Sinkオブジェクトの生成について、詳しく見ていきましょう。

音声合成を行うSinkオブジェクトの生成を行うメソッドは、下記の用になっています。

var sink = Sink([callback=null], [channelCount=2], [preBufferSize=4096], [sampleRate=44100])

各引数について見ていきましょう。順番が前後してしまいますが、わかりやすい順に説明していきます。

  • 2個目の引数channelCountはチャンネルの数。モノラルの場合は1、ステレオの場合は2です。
  • 4個目の引数sampleRateはサンプリング周波数です。1秒間を何等分するか、という値でデフォルトはCDと同じ44100Hzになっています。

1秒間に処理をするデータの量はチャンネル数×サンプリング周波数となるので、上の二つの設定が大きくなれば大きくなるほど計算量が増え、重くなっていきます。

  • 3個目の引数preBufferSizeは、一度に処理するバッファーの長さです。

リアルタイムなサウンドプログラムの経験がない人にはピンとこないかもしれません。コンピュータ上の音声合成の仕組みを説明するとそれだけで長い時間かかってしまうので省略しますが、簡単に言ってしまえばバッファーの長さが長くなると負荷は小さくなり安定しますが、レイテンシが大きくなります(反応が鈍くなります)。逆に短いと負荷が大きくなり、音が途切れやすくなります。2のn乗のサイズを指定するのが基本です。

  • 最初の引数callbackは、バッファーを埋めるための関数です。

これも経験がない人にはピンとこないかもしれませんが、簡単に言うと「スピーカーに送るn秒分の信号を作る」ための関数です。ここに音響合成の処理内容を実装します。

2,3,4個目の引数で指定している内容は、基本的に最初に指定したら後から変更することはありません。殆どのPCでは左右二つのスピーカーから音が再生されるのでステレオ(channelCount=2)、サンプリング周波数はCDと同じ44100Hzが使われます(sampleRate=44100)。バッファーサイズについては、作るアプリケーションの内容によっては調整する必要があるかもしれませんが、多くの場合デフォルトの設定4096で問題ありません。

というわけで、これらの引数は必要がなければ指定せずデフォルトの値を使うだけで問題がありません。

実際、前の記事のサンプルでもこれらの引数は指定していません。

var sink = Sink(function(buffer, channelCount){
  var i;
  for (i=0; i<buffer.length; i++){
    buffer[i] = Math.random() - 0.5;
  }
});

ただし、今後もう少しちゃんとした合成(サイン波をならしていったり)をする上では、チャンネル数とサンプリング周波数を意識していく必要がありますが、少し長くなってしまったので続きはまた次の記事で。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です