音の鳴るブログ

鳴らないこともある

Web Audio API on node.js

Web Audio API が node.js でも使えたら便利かも知れないし、何か活動している感じを演出できると言うことで、 g200kgさんの WAAPISim を fork してみた。

node.jsで音を出したいときは readable-streamnode-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}));