音の鳴るブログ

鳴らないこともある

Web Audio API でもテストがしたい

開発中に node.js でもテストできるように Web Audio API のテスト用APIを書いた。

最終的なオーディオ処理の結果については耳で確認するしかないのだけど、音を聞くまでもない段階のときに AudioNode(音を出す部品) がどう接続されているのかを調べたりできる。便利だと思うけど、これがあって嬉しい人は少ないと思う。あるのはインターフェースと型のチェックくらいで、信号処理的なのは一切していません。こういう事ができます。

グラフの確認

JSON化すると接続状態が返ってくるのでテストできる。

var ctx = new AudioContext();
var osc = ctx.createOscillator();
var amp = ctx.createGain();

osc.type = "sawtooth";
osc.frequency.value = 220;

osc.connect(amp);
amp.connect(ctx.destination);

ctx.toJSON();
{
  "name": "AudioDestinationNode",
  "inputs": [
    {
      "name": "GainNode",
      "gain": {
        "value": 1,
        "inputs": []
      },
      "inputs": [
        {
          "name": "OscillatorNode",
          "type": "sawtooth",
          "frequency": {
            "value": 220,
            "inputs": []
          },
          "detune": {
            "value": 0,
            "inputs": []
          },
          "inputs": []
        }
      ]
    }
  ]
}

オーディオデコード

var ctx = new AudioContext();

it("AudioContext#decodeAudioData", function(done) {

  // このフラグで成功/失敗を切り替える
  // ctx.DECODE_AUDIO_DATA_FAILED = true;

  ctx.decodeAudioData(buffer, function(e) {
    expect(e).to.be.instanceOf(AudioBuffer);
    done();
  }, function() {
    // failed
  });

});

スクリプティング

var ctx = new AudioContext();

it("ScriptProcessorNode#onaudioprocess", function(done) {
  var scp = ctx.createScriptProcessor(1024, 2, 2);
  var count = 0;

  scp.onaudioprocess = function(e) {
    count += 1;
    expect(e).to.be.instanceOf(AudioProcessingEvent);
    if (count === 5) {
      done();
    }
  };

  // 0.5 秒分処理する
  ctx.process(0.5);
});

型チェック

Web Audio API よりも厳しく型のチェックをするので、動くけど厳密には間違っているみたいなのを検出できます。

var ctx = new AudioContext();

var osc = ctx.createOscillator();

osc.frequency = 880; // エラー (代入は frequency.value にする)
osc.frequency.value = "880"; // エラー (型が違う)