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"; // エラー (型が違う)