node.js で mac から音が鳴るやつ
Web Audio API や Audio Data API を使ってブラウザから音を出したりやっているけど、音を生成する部分だけを確認したいときにいちいちブラウザでページを開くのも億劫だし良くクラッシュするのもだるいので、ターミナルから使えるように node.js のモジュールを書いてみた。
https://github.com/mohayonao/node-macaudio
出来ることは少ない(1つだけ)だけど、その分使い方はシンプル。
var macaudio = require("macaudio"); var node = new macaudio.JavaScriptOutputNode(1024); // bufferSize node.onaudioprocess = function(e) { var L = e.getChannelData(0); var R = e.getChannelData(1); for (var i = 0; i < e.bufferSize; i++) L[i] = R[i] = (Math.random() - 0.5) * 0.2; }; node.start(); // node.stop();
AudioUnitで音を鳴らしながら適宜JavaScriptにコールバックして次の信号を受け取る。Web Audio APIのインターフェイスを参考にしたつもりだけど、なんか格好わるい感じになってしまった。
GitHubにある examples/prelude.coffee は簡単に出来る範囲では頑張って書いたのでぜひ聴いて欲しいです。
参考になった
Writing node.js extensions with C++ and V8
http://kkaefer.github.com/node-cpp-modules/
C++でnode.jsの拡張を書こうというスライド、めっちゃ分かりやすかった。
iPhone Core Audio プログラミング(本)
http://www.amazon.co.jp/dp/4797355158
AudioUnitの使い方とか。iPhoneとmacでは微妙に違うみたいなので注意が必要。
わかったこと
C++で書いていてクラスとか使っているけど、オブジェクト指向な感じではなくて static な関数でプロパティ値の構造体をどうにかゲットして処理をする。Cでオブジェクト指向っぽくするならこんな感じっていうときの感じ。そもそもJavaScriptにクラスはないということを思い出して、v8.h を見まくったりしながらC++でJavaScriptを書いているという風に意識すると、なんか分かった気分になる。V8のインターフェイスは慣れると結構分かりやすい。
よくわからなかった
コールバックの引数の一部に Float32Array を使いたかったのだけどよく分からず、結局 float の配列っぽいけど length プロパティすらないものになってしまった。
JavaScriptOutputNodeをめっちゃ生成しまくったり、 start したまま stop せずにGC発動するとセグメンテーションエラーがでる。。