Max/MSP/Jitter」カテゴリーアーカイブ

quartzplayerが開発中

本家Cycling ’74のdevフォーラムで知りましたが、Remy Muller氏がQuartz ComposerのファイルをMaxで直接再生するオブジェクトquartzplayerを開発中だそうです。きっと、MaxのメッセージでQCコンポジションを操作できるようになるでしょうから、これは期待大ですね。

もっとも、まだまだ初期の段階だそうで、オブジェクトもダウンロードできないし、ヘルプ・パッチもありません。でも、Sourceforgeに登録されているので、自分でsvnしてビルドすれば、どのようなものか確かめることができます。

quartzplayer.jpg

と言う訳で、私もちょこっと試してみました。QCコンポジションの再生はバッチリっぽいですが、ウィンドウ周りがイマイチのようです。ソースを読む限りでは、MaxメッセージをQCコンポジションに送るようになっているみたいですけど(quartzplayer_genericのことね)、何故かうまくいかないですね。

ともあれ、Quartz Composerは描画が速いし、Jitterでは面倒なことが簡単にできる(その逆も真なり)ので、早く完成して欲しいですよね。ご本人は、自分はあまり時間が取れないので、興味のある人は開発に参加してね!っとおっしゃってます。腕に覚えのある人は是非参加してください〜と私は他人様頼みです。

GPS-CS1KのログをMaxで解析

今日の学校クエストは、GPS-CS1KのログをMaxで解析したい、ってことでした。GPS-CS1KはSONY製の小型で安価なGPSレシーバで、これを持って歩き回って(あるいは自転車や自動車で走り回って)、後でその行動を何らかのアート表現に結びつけるってことらしいです。

gps-cs1k.jpg

それで、なんか面倒っぽいなっと思ってたら、実際には意外と簡単でした。まず、GPS-CS1Kを持って適当に歩き回った後、GPS-CS1KをMacにUSBケーブルで繋ぎます。これでデスクトップにディスクとしてマウントされるので、そのディスクの中からログ・ファイル(GPSフォルダにある.logファイル)をMacのハード・ディスクにコピーします。このログ・ファイルは単純なテキスト・ファイルなので、適当なテキスト・エディタで開くことができますね。内容の一部はこんな感じ。

$GPGGA,081906,3523.1434,N,13637.3032,E,1,04,07.2,00079.7,M,035.0,M,,*4D
$GPGSA,A,3,11,16,25,27,,,,,,,,,14.0,07.2,12.0*04
$GPGSV,2,1,05,25,44,245,51,27,42,276,50,16,13,123,47,32,,,43*4A
$GPGSV,2,2,05,11,50,219,52,,,,,,,,,,,,*44
$GPRMC,081906,A,3523.1434,N,13637.3032,E,000.0,000.0,210907,,,A*7C
$GPVTG,000.0,T,,M,000.0,N,000.0,K,A*0D

このデータはNMEA-0183っていうフォーマットだそうです。本家はココらしいですが、他所様の英語解説日本語解説を拾い読み。ちゃんと仕様を読んでいないので間違ってるかもだけど、GPS-CS1Kのデータは、若干逸脱しているような気もします。

次に、Maxでログ・ファイルを読み込みますが、その前にログ・ファイルの拡張子を.txtに変えておきます。これは、MaxのTextオブジェクトが、明らかにテキストであるファイルしか開いてくれないからです。これはちょっと融通が利かない感じで、イマイチですね。

Textオブジェクトに読み込んだログは、lineメッセージで1行ずつ出力して解析します。ただし、各行はカンマ区切りなので、tosymbolとfromsymbolというオマジナイをかけてリストに変換します。なぜそうなるのか?と聞かれても、よく分からないんですが(笑)、知っている人教えてください。

後は、NMEA-0183フォーマットに従って、routeでデータを種類ごとに振り分けて、unpackで要素ごとに取り出すだけです。ここから先は目的次第ですね。元データがテキスト(ASCII表現)だから、数値処理する場合は、時刻とか単位の取り扱いに少々工夫が必要ね。基本パッチはコレです。

gps-01-logpat.gif

GPS-CS1Kは記録オンリーで、リアルタイム情報を外部に送れない(よね?)ので、私的にはナンジャラホイです。しかも、測位は15秒間隔で精度も10メートル程度らしいので、かなり大まかな情報しか得られません。ま、旅のお供にデジカメと一緒に使ってね的な位置付けの製品なので、文句を言う筋合いじゃないですけどね。

では、何でこんなことやってるかと言うと、もうすぐIAMASではモチーフ・ワークという1年生全員が参加する1週間のワークショップがあって、今回はGPSがモチーフだから、なんですね。全員と言っても50人しかいないんですが、普段はそんな大人数を相手にしないから、準備が結構大変(軟弱)。ただ、久々にMaxネタができたのでウレシイ(笑)。

本当は、のA-GPS付き3G iPhoneが登場して欲しいところですね。そうそう、iPhone勝手アプリも登場したNavizonってのもあるので、必ずしも人工衛星に頼らなくていいかもですね。と、まぁ、何にしてもiPhoneに流れちゃうのは、ビョーキっぽいな〜。

p.jit.gl.toolsで楽々GL

OpenGLは無茶苦茶パラメータ(アトリビュート)やコマンド(メッセージ)が多くて困っちゃいますよね。そんな時にちょいと便利なのが、pelado氏が作成したp.jit.gl.toolsです。

このユーティリティ集では、jit.gl.gridshapeならp.jit.gl.gridshapeのように「p.」が頭に付くオブジェクトが提供されています。このp.〜オブジェクトをダブル・クリックすれば、スーパー・ナイスなウィンドウが開くので、ここでアトリビュートの設定などをすれば良いわけです。このp.〜オブジェクトは、元のOpenGLオブジェクトを含んでいるので、設定結果がすぐに反映されるのが実用的ですね。

pjitgiltools.png

ただし、OpenGLオブジェクトは単体では意味がないことが多いので、まずは、p.jit.gl.tools.helpパッチやp.jit.gl.tools helpフォルダにあるヘルプ・パッチを開いてみると良いと思います。これらは一連のp.〜オブジェクトによってパッチが作られているので、各オブジェクトの動作を簡単に確認できます。

そして、普通にパッチを作っていてOpenGLオブジェクトの設定に困れば、オブジェクト名の先頭にp.を付けて、p.jit.gl.toolsのオブジェクトとして作業すればイイんじゃないでしょうか? パッチが完成すれば、先頭のp.を外して普通のオブジェクトに戻します。そのままではオーバーヘッドが大きいですからね。

現時点では、すべてのOpenGLオブジェクトのp.〜版が勢揃いってわけじゃないです。しかし、テンプレートが提供されていいるので、新しいp.〜オブジェクトを作るための配慮はバッチリかも。p.jit.gl.toolsは、力技の根性オブジェクト集なので、志のある人は手伝ってね!ってことのようです。

sfplay~でオーディオ・ファイル再認識

久々のクエストは知人からで、sfplay~で再生したオーディオ・ファイルを書き換えると、新しくなったオーディオ・ファイルの長さが反映されず、正しく再生されない、というものでした。

【解決策】fcloseしてからopenする

sfplayfclose.png

sfplay~はopenした時点でオーディオ・ファイルの情報を取得していて、そのファイルが書き変わったことを自動的には認識しないんでしょうね。なので、fcloseで一旦ファイルを閉じてから、ファイルを書き換えて、その後にopenでファイルを開き直すと良いみたいです。

aka.systemsound登場

システム・サウンドや警告音の音量を設定&取得するaka.systemsoundを公開しました。

akasystemsound.png

この手のオブジェクトかMaxメッセージがあったような気もするのですが、どうにも思い出せなかったので、仕方なく作りました(笑)。来週の和太鼓公演で使います(が、今頃オブジェクトを作っていて大丈夫なのか?〜笑)。

ところが、ドキュメントの読み方が悪いのか、プログラミングがマズいのか、音量設定が左右逆になってしまいました。現在公開しているオブジェクトでは、私の環境に合うようにしていますが、他のマシンでは左右逆になっているかもしれません。なので、このオブジェクトでの左右の音量設定が正しく動作しているかどうか、教えていただけると助かります。

aka.iphone登場?

ちょと弱気な?マークが付いていますが、先日の記事で紹介したiPhoneからMaxをコントロールする一連のファイルを公開しました。aka.iphone / experiment 1です。

akaiphone1.gif

他の人が発展させやすいように、ファイルは単純化しています。もっとも、マウス・ドラッグ(指ドラッグ)問題は解決していないし、レイテンシーを改善できる可能性がある(かもしれない)ので、ちょと弱気な?マークが付きという訳です。iPhoneをお持ちの方は、試してみてください。

余談ながら、某所ではiPhone所有者を「勝ち組」と呼ぶそうです。ヒドイな〜(笑)。

iPhoneでMaxコントロール

取り敢えずという程度なのですが、iPhoneでMaxをコントロールしてみました。

仕組みは、単純にWebアプリです。ボタン→JavaScript→PHP→OSC→Maxという流れになっています。Web系の人なら簡単に作れると思いますが、私はそれなりに苦労して(笑)、Galen Scorer氏のudp.phpを利用させていただきました。OSCなので、SuperColliderやReakterでも同じことができるハズですよね。

ちなみに、テキスト表現できるものなら何でもパラメータとしてMaxに渡すことができます。デモでは入力したテキストをMaxに送って、aka.speechで読み上げているのが分かりますよね。レイテンシーは許容範囲かな? シビアな演奏には向いていないでしょうけどね。

しかし、一番の問題は先の記事でも触れたように、iPhoneのWebアプリとしてはマウス・ドラッグ(指ドラッグ)が捉えられないことです。なので、このデモでもボタンを押すことしかしていません(しかも、onClickなので指を離した時に動作する)。引き続き、このあたりの情報をご存知の方は、是非教えてください。

【追記】よく考えたら、YouTubeだとiPhoneな人は見ることができないですよね(馬鹿FlashがH.264化されるまでは)。そんな訳で、QuickTime(MPEG-4)ムービーもアップロードしました。

send&receiveでシグナル送受信

今回の学生クエストは、send&receiveとsend~&receive~の相違です。パッチ。コードなしにメッセージ(やマトリックス)を送るにはsend&receive、オーディオ・シグナルを送るにはsend~&receive~ってのがジョーシキですよね。ところが、間違ってシグナルをsend&receiveしたら、ちゃんと動いちゃったのでビックリしたらしいです(ビックリするだけエライ!)。

さて、結論から言うと、シグナルをsendで送って、receiveで受け取ることができます。問題があるのは、シグナルをフィードバックするようなルーティングで、この場合はsend&receiveではシグナルを送ることができません。シグナルが止まっちゃいます(下図の右側)。send~&receive~ならフィードバックが生じてもシグナルを送ることができますが(下図の左側)、この場合はシグナル・ベクター・サイズ分だけシグナルが遅れます。そうでなければ、無限ループに陥っちゃいますからね。

send-vs-send.gif

ちなみに、send&receiveとsend~&receive~とでは、同じ名前を使うことはできませんね。それから、メッセージをsend~&receive~で送ることもできませんよ。

ともあれ、ジョーシキに沿うのが無難なのですが、私はシグナルにsend&receiveを使うことが多いかも。だって、sとrが使えますからね。

マウスによる無限コントローラ

先週の学生クエストで、マウスをコントローラとして使うためのテクニックです。マウスを使って、人の動作や物の動きを検出しようとする時に、問題はマウス・ポインタがスクリーンの端に達すると、それ以上はマウス・ポインタが動かないことですね。物理的な動きが続いても、ソフトウェア的な動きが止まってしまい、矛盾が生じるわけです。

この解決方法は、意外に簡単なのですけど、実は昔懐かしのDSPマガジン1035号に書いています。以下、引用。

■マウスはコントローラ

これまたタイトルを見て、なんじゃ?と思われるかもしれませんが、マウスをコントローラとして使う時のお役立ち情報です。インタラクティブなインスタレーションなどでは、鑑賞者の操作や動作を何らかの形で取り込む必要がありますよね。この時に、もっとも簡単な手段がマウスです。もろにマスウでなくても、トラックパッドとかトラックボールとか、マウスと同じように動作するデバイスもたくさんあります。

多くの場合は、フルスクリーン表示したいので、「;max hidemenubar」というメッセージ・ボックスにbangを送り、jit.windowに「fullscreen 1」を送ってウィンドウを全画面に広げます。さらにマウス・ポインタを消すために「;jitter cursor 0」メッセージ・ボックスにbangを送ります。Mac OS XならDockも「自動的に隠す」にしておきます。そして、MouseStateオブジェクトなどでマウス・ポインタの位置やマウス・ボタンの状態を読み取れば、鑑賞者の操作状態が得られます。

と、ここまでは常識(?)ですね。しかし、これで困るのは、消えてるとは言え、マウス・ポインタがスクリーンの端に達すると、それ以上移動しないので、無限に動作できないことが挙げられます。また、Mac OS Xなら、マウス・ポインタがスクリーンの上端や下端に来ると、自動的にメニュー・バーやDockが現れ、マウス・ポインタも現れてしまいます。これでは、せっかくのフルスクリーン表示がオジャンです。

このような問題を解決するために考えたのは、以前にも紹介したMaxへのpupdateメッセージで、強制的にマウス・ポインタの位置を戻す方法です。まず、screensizeオブジェクトなどでスクリーンの中心座標を求め、そこにマウス・ポインタを移動します。次に、MouseStateオブジェクトでマウス・ポインタの位置を求め、スクリーンの中心座標からの差を求めます。この差がユーザがマウスを動かした相対変化値になります。そして、すかさずマウス・ポインタをスクリーンの中心に戻し、以下、これを繰り返します。

このようにすれば、マウス・ポインタは常にスクリーンの中心に戻りますから、メニュー・バーやDockに影響を与えることがありません。マウスが移動した相対変化値をそのまま用いても構いませんし、相対変化値を加算し続けることで、無限に値を大きく、あるいは小さくできる(と言っても数値の精度範囲ですが)絶対変化値として用いることもできます。

簡単なサンプル・プログラムも作りましたので、以下のリンクからダウンロードして試してみてください。このプログラムでは動作状況が分かるように、マウス・ポインタを消去していません。escキーを押すことで動作開始、もう一度escキーを押せば動作終了です。

実際のパッチは以下のようになります。ダウンロードはmousecontrollerpat.zip

mousecontroller.gif

ちなみに、マウスでコントローラ云々ってのはIAMASでは普通に話が通じるんですが、世間では一般的ではないかもしれませんね。それは何じゃい?と思われた方は、もうすぐIAMASオープンハウスがあるので、遊びに来てください。このマウス・コントローラを使った作品もあるハズです。

【追記】このパッチを使う場合に、システム環境設定の「マウス」で、軌跡の速さをもっとも遅くすると良いかも。このようにすれば、マウスの動かし方によって移動量が変化せず、リニアな移動になる(たぶん)からね。

Max Object Thesaurus

同じくStefan Tiedje氏が作成したMax Object Thesaurusもご紹介。こっちは、こんなことをしたいけど、どのようなオブジェクトが利用できるんだろう?って時に、該当しそうなオブジェクトをザザっと表示してくれます。オブジェクトをクリックすれば、ヘルプ・パッチを開いてくれるのもお約束の通り。

max_object_thesaurus.gif

内容自体は、MaxやMSPのリファレンス・マニュアルから取られているみたいです。なので、Jitterやサードパーティのオブジェクトは含まれていません。それから、このパッチはSt.oolsを必要としませんので、特別なインストール作業は不要です。

このシソーラスは結構便利なので、誰か日本語版を作ってくれませんかね? 私も一瞬日本語版を作ろうと思ったのですが、アルファベット順の索引をどうするか?って問題でフリーズしました。英語版も厳密な感じはしないので、あまり気にしなくてもいいのかもしれませんけどね。それから、私のブラウザもそうなんですけど、検索機能が欲しいですよね。

このパッチもStefan Tiedje氏のShareページからダウンロードすることができます。