Web Audio API on node.js
Web Audio API が node.js でも使えたら便利かも知れないし、何か活動している感じを演出できると言うことで、 g200kgさんの WAAPISim を fork してみた。
node.jsで音を出したいときは readable-stream と node-speaker を使います。readable-streamのドキュメントに _read
は直接呼ぶなって書いてあるので、良くない例だと思う。
あとは WAAPISim 側にインターフェイスを設けただけ。ここらへん。逆中抜き構造みたいな感じ。 オシレーターでプーいわすくらいしか確認してないけど、たぶんいけてる。
var Readable = require("stream").Readable; var Speaker = require("speaker"); if (!Readable) { Readable = require("readable-stream/readable"); } var node = new Readable(); var buf = new Int16Array(0); var index = 0; var currentTime = 0; var currentTimeIncr = 1/44100; node._read = function(n) { var out = new Buffer(n); for (var i = 0; i < n; i+=2) { if (index >= buf.length) { waapisim._updateCurrentTime(currentTime); // ここで信号処理して interleaved な Int16Array を受け取る buf = waapisim._onaudioprocess(); index = 0; } out.writeInt16LE(buf[index++], i); currentTime += currentTimeIncr; } this.push(out); }; node.pipe(new Speaker({sampleRate:44100}));