6軸センサーをMax/MSPから使う(後編)

やっぱりMac OS Xで直接USBを叩くのはめんどくさくなってしまい、作りかけだったMax/MSPのヘッドトラッキングっぽいパッチを完成させました。ヘッドホンのヘッドバンド部分に秋月電子で買ってきたTDS01V評価キットを両面テープで貼り付けてハードの準備は完了。ソフト側はFTDI社のドライバとMax/MSPのみ。シリアル通信で100msごとに地磁気データから頭が向いている方角を取得してきます。それをもとにILD/ITDを計算してヘッドホンへの出力をリアルタイムで変化させてやれば、簡単なヘッドトラッキング・ヘッドホンのできあがり。ヘッドホンの特性をキャンセルすること、ILD/ITDのかわりにHRTFを畳み込むこと、部屋の特性を含めること、などをやればそれなりに使えるサラウンド・ヘッドホンになりそうです。

それにしても、アルゴリズムも分かってるしMatlabでは(非リアルタイムだけど)動いているのに、それをMax/MSPで表現しようとしたときにかかる労力がハンパないです。仕事の合間にやっているのでなかなか進みません。

これは去年の年末からすっかりほったらかしてあった「6軸センサーをMax/MSPから使う(前編)」の続きでもありました。中編に相当するのはJavaScriptで書いたセンサーからの文字情報をfloatに変換する部分(下にソースコード)。評価キットを購入してから2年くらいたって、ようやく一段落。

setinletassist(0, "data from port");
setoutletassist(0, "angle");

var tmp = new Array();
var pos = 0;

function anything() {
  var a = arrayfromargs(messagename, arguments);
  var z = "";
  tmp[pos] = parseInt(a);

  if (tmp[pos-1]==13 && tmp[pos]==10) {
    if (pos==5) {
      hoge = parseInt(String.fromCharCode(tmp[0])
                    + String.fromCharCode(tmp[1])
                    + String.fromCharCode(tmp[2])
                    + String.fromCharCode(tmp[3]), 16) / 10;
      hoge = 360-hoge;
      while (hoge >  180) hoge-=360;
      while (hoge < -180) hoge+=360;
      outlet(0, hoge);
    }
    pos = 0;
  } else {
    pos++;
  }
}