2011年12月24日土曜日

NodeがつなぐMIDIシンセサイザーとGoogleマップ

JavaScript Advent Calendar 2011(Node.js/WebSocketsコース)に急遽参戦。24日分の投稿になります。

MIDI信号をNodeで読み取り、WebSocketでブラウザに送ることで、MIDIシンセサイザーをキーボードやトラックパッドにかわる入力デバイスにすることができます。過去にもやったネタなのですが、今回はGoogleマップをシンセで動かします。Nodeみたいなイベント駆動系とハードウェアって相性がいいに決まってるじゃないですか。

まずは動画で

要はこういうことなんです。つまみのぐりぐりに連動して、マップのズームが上下していますね。

MIDI信号をNodeで読むには

node-midiモジュールを使用します。インストールは次のコマンドで。

npm install midi

RtMidiという、MIDI信号をリアルタイムに読み取るC++のライブラリをつかっています。

サーバ側

https://github.com/niccolli/MidiMaps/blob/master/midi2socketio.js

input.on('message', function(deltaTime, message) {
 // ノブをいじった信号
 if(message[0]==176 && message[1]==99){
  if(message[2]==0){ // knob X
   state = 'X';
  }
  if(message[2]==2){ // knob Y
   state = 'Y';
  }
  if(message[2]==4){ // knob Z
   state = 'Z';
  }
 }
 if(message[0]==176 && message[1]==38){
  LSB = message[2];
  switch(state){
   case 'X':
    var temp = MSB*128 + LSB;
    value = (temp-500)/5000;
    break;
   case 'Y':
    if(MSB){
     value = LSB - 28;
    } else {
     value = 100 + LSB;
    }
    value = (value-200)/1000;
    break;
   case 'Z':
    value = LSB/100*20;
    break;
   default:
    break;
  }
  io.sockets.emit('message', { state: state, value: value });
 }
}

一部抜粋で。使用するMIDIシンセサイザーに依存した記述になっています。ここではALESISのMicronを使っています。input.onはMIDI信号の受信をトリガにして呼ばれるコールバックで、前半のifで3つあるノブのどれが回ったかを記録。後半は3つのノブそれぞれ最大最小値が違うので、なんとなくごまかす処理。最後のio.sockets.emitでブラウザに値を送ります。

クライアント側

https://github.com/niccolli/MidiMaps/blob/master/map.html

socket.on('message', function(data){
 switch(data.state){
  case 'Z':
   map.setZoom(Math.round(data.value));
   break;
  default:
   break;
 }
});

こちらも一部抜粋。GoogleマップのsetZoomにそのままつっこむと、上記の動画のようになるんですね。

やり残し

本当はノブが3つあるので、残り2つのノブで上下左右の移動を実装しようとしたのですが、「WebSocketを受け取る→マップの中心座標から次の中心を調整→setCenter」を受ける度に繰り返すと、中心座標がundefinedになりうまくうごかないんですね。setCenterの処理が終わる前に次のsetCenterが呼ばれるのがいけない気がするのですが、なかなかうまい解決法がみつけられず…。

加えて、node-midiモジュールはいまのところnodeの0.6に対応できていません。C++のコンパイルがあるので、node_events.hがなくなった状態に追いつけていない状態です。ここはなんとかしたいところ。

(追記 2011.12.26 )Nodeが0.5.2以上の場合、node-midiはこちらで。先を越されてた…。

2011年12月18日日曜日

WiLL Viが可愛すぎてキレそう

Toyota Will Vi
トランクについてるエンブレム。かわいい。 by Gipiosio GipiOsio

表題のとおりWiLL Viがかわいすぎるので、かわいさ加減を書き散らして発散させてください。

WiLL Viってなんだ

もともとWiLLシリーズとして、いろんなお友達業種を超えたメーカーがデザイン重視の製品を発売するムーブメントがあって、松下(当時)がMDプレーヤや洗濯機を出してたり、文具が出てたりしていました(参考:Wikipedia)。そのなかで、トヨタ自動車はWiLL Vi / WiLL VS / WiLL CYPHAの3車種が発売されていました。後者2車種の話はしません。

WiLL Viは1999年の東京モーターショーにコンセプトカーとして発表され、まさかのデザインほぼそのままで発売。当時の奥田社長直下の組織で設計されたおかげで、横やりが入って牙がそがれることもなく生産にもっていけたそうな。ガワは独特だけど、中身(内装ではなく)は初代Vitzと同じ。トロンボーンや60鍵シンセサイザーも積めるし、タイヤを外せばロードレーサーも積めるのです。かわいいのにパワフル。

トランクのふくらみ具合がかわいい

Now, if only Camrys were this intriguing...
みんな後ろから撮りたがる。 by joh3

リアウィンドウの傾きがふつうと逆なので、トランクのふくらみ具合が余計に強調されるんですよね。これはアレですよ、アレ。

Maid in Japan
メイドさん by ThisParticularGreg

そう、フリフリのスカートのようじゃないですか。フリフリスカート=かわいい、トランクのふくらみ=フリフリスカート。ゆえに、トランク=かわいいが成立するわけですね。

内装がみてて愛おしい

IMG_0206
暗闇でもきれいに撮れます、ではなくて。

コラムシフトのさきっぽが真ん丸だったり、ダッシュボードから速度計がのぞいてたり。内装がいちいちかわいいので、ずっと見ていたい気持ちになります。運転中は前をみていないといけないけど。できるだけ長く車内にいたいから、必然とスピードを出さなくなりますよね。無意識のうちに上品ドライバーになってしまうのです。

ホイールキャップも個性的

IMG_0014

ウィキペディアではスカシカシパン呼ばわりされてますけど。ちょっとふくらんでいるおかげで、道路の端に寄りすぎてしまうとこすってしまうのね。角をまがるときも「傷つけてしまわないように」と思いやりが芽生えるほどということ。

トヨタってどこにも書いてない

WiLLというブランドを推していく方針から、メーカーの名前は大きく出ない方向に。WiLL Viでも、外から見てわかるトヨタのしょっぱいロゴは窓ガラスのみ。あとは取扱説明書の背表紙くらい。

凶器にも棺桶にも廃車にもさせない

「自動車は凶器にも棺桶にもなりうる」とTBSの安東さんがおっしゃっていましたが、かわいいかわいいWiLL Viをそんな目にあわせるわけにはいかない。心は常に上品ドライバーで。

でも既に10年落ち。いつかはエンジンが死ぬ日がくるでしょう。そのときはエンジンを捨てて、中身を電気に改造してしまうのもいいかなと。ネタになるしね。絶対に廃車にはしない覚悟で面倒をみていきます。俺の嫁だからね。

自動車内の信号を(できるだけ手軽に)読み出したい

昨年の初夏くらいにWiLL Viを中古で買ってから早一年半、かわいすぎるあまり彼女のことをもっと知りたいので車内の信号をどうにかして読めないか探っています。


一番手前が俺の嫁。かわいいし荷物積めるし最高じゃないですか。

どんな信号が流れているのか

いまや自動車の中身はおおかたが電子機器になっています。速度やエンジン回転数なんかが車内の制御コンピュータどうしのネットワークで流れることで、タコメータの針がふれたり、縦列駐車をビシーッとキメられるようにハンドルが曲がったりと、そこそこ便利になるように利用されているんですね。

WiLL Viも2000年ごろの自動車ですが、エンジンやエアバッグなんかのコンピュータが搭載されているので、それら同士の通信用だったり、警告ランプを点灯させたりするために自動車内のネットワークが構成されているのです。

どうやって読み取るのか

配線にワニ口クリップで電圧を…みたいなことをする必要はなく、コンピュータの故障診断用ポートを使います。OBD2(On-Board Diagnostics)というコネクタがどの自動車にも搭載されていて、通常は診断ツールで読み出します。

IMG_0778
OBDコネクタ。WiLL Viの場合は運転席の下に装備。

最近の自動車で使われているのは、シリアル通信とCAN通信のどちらか。2000年〜2003年くらいに生産されたものはシリアル通信、それ以降はCAN通信になっています。前者はISO 9141-2にて規定されていて、10.4kbps。Highが5Vや3.3Vなどではなく、12Vらしい。後者はISO 15765(よく調べてない)で、2本の線の差動信号で信号を読み取ります。両者とも送受信を同じ配線で行います。

長くなったので、WiLL Viで今のところどんなことを試したかは別の記事に。

2011年12月14日水曜日

Node.jsでつくるプログラマブルなMIDIコントローラ

Node.jsとMIDIの続き。

前の投稿で、Node.jsでMIDI信号を横取りしていましたが、これによってシンセサイザー上のあるスイッチの状態によって、別のスイッチの出力信号を変化させるなんてこともできるようになります。信号を出して終わりじゃなくて、状態を持つかたちですね。

背景

Ableton Live(のお試し版)でDJごっこをして遊んでいるのですが、うちのシンセサイザーはノブが3つついているので、3バンドEQを割り当てるのにちょうどいいんですね。

PICT0014

いっぽうで、2つのチャンネルそれぞれに3バンドEQを割り当てようとすると、6個必要になるわけですね。足りない。ここで、横についているスライダーの位置に連動させられれば、3個でもなんとか事足ります。この信号の組み合わせをNode.jsでやってみましたと。

コード

githubにアップロードしたものを参照ください。ここではそのなかの解説を。

output.openVirtualPort('NodeMidi');

ここでNodeMidiという名前で仮想ポートを立てています。Node.jsにMIDI OUTの端子ができたようなものですね。

その後のinput.onでやっていることは前の投稿とほぼ同じ、スライダーの処理が増えただけです。スライダーやノブの位置を変数に保存しておいて、組み合わせてから出力しています。

output.sendMessage([channel,2,x]);

sendMessageでoutputに指定したポートから、引数のMIDI信号を出力します。冒頭でNodeMidiという仮想ポートを指定しているので、そこから出力することになります。

Live側では、MIDI入力機器としてNodeMidiを指定すればOK。Nodeで変換している間の負荷はLiveの邪魔をしない程度、Nodeの本気です。ひとつ問題があって、node-midiはNodeの0.6系ではコンパイルが通らないので、0.4系を使って動かしています。あとで直す、たぶん。

2011年12月1日木曜日

Nagoya.pm #2で発表してきました

もう10日ほど過ぎていますが、2011年11月20日に行われたNagoya.pmの模様を。

ぼくの発表

ひとつ前のエントリーに書いた、MIDIシンセでHTMLをぐりぐりいじる話。これをそのままPerlのAnyEventに移植しようとして、ライブラリがなく苦労した話を発表しました。シンセのつまみをいじって背景色がものすごい勢いでかわるリアルタイム感がばかうけで一安心でした。そしてまずはnkfのxsを読むと。

発表中の様子は、@jiheiさん撮影の動画で。きいろい服の人がおれです。

気になった話題

  • App::Ack
    これすごい。Perlに限らずいろんなソースコードの中から検索してくれるっぽい。
  • プレゼンにおけるスライドの役割。AUGM名古屋でみた教授の講演がセオリー通りだったのを思い出して納得。
  • にこぐらふ
    マッスルハウスの「矢郷さんの出番はありません。富山にお帰りください」で試してみたのはおれです。本人降臨が一番なのかーwww
  • useful oneline script for perl
  • Perl6の動作環境はレジスタマシン。CASL的なかと思いきや、全然そんなことはなく。ちょっと高級ぎみのアセンブラっぽい。
  • Nagoya.pmのサイトがこわい。なごやこわい。

まとめ

こういう場でデモも含めてちゃんと発表するのは初めてだったのですが、うまくいってよかったなと。デキる人に疑問点を直接きけるのもいいです。テキストだとうまく伝えられないんだよね。とりあえず3回続けることが目標のようなので、次回は来年の春が来る前くらいでしょうか。

おまけ

懇親会後、うちの近所まで帰るお姉さんをWiLL Viの助手席に乗せてきた。これが一番緊張した。上品ドライバーに徹しました。