May 2009 Archives

今週は外出が多かったのでコードをいじる時間があまり無かったので、今日ようやく少しだけ更新。

PortMidiPlayerを少しいじった。まずSysExメッセージのサポート。portmidiのPm_WriteSysEx()の引数の意味が不明確で、ソースを読まないと冒頭でF0/F7を指定してやらなければならないということが分からなかった。わざわざPm_WriteSysEx()なんて名前にしているんだから、それくらい自動的に補完してやれば良いのに。

あと非同期演奏モードを追加した。と言ってもまだThread.Sleep()でタイミングをとっている同期プレイヤを、別スレッドで走らせて、一時停止でスレッドを止めたりしているだけだ。そしてMoonlight上で動かしたらどうもきちんと動いてくれないので、やはりUIスレッドの問題を解決しなければならないだろうというところに落ち着いた。いずれTimerベースで書き換えるかもしれないけど、とりあえずDispatcher.BeginInvokeを使うことにして、イベントをループから拾って描画できるようにはなった。

ただ、一時停止機能を実装していて、ひとつ大きな問題があることに気がついた。MIDI楽器における一時停止というのは、単なるメッセージ送信の一時停止で済むものではなく、ノートオンに対応するノートオフを送信するべきだということだ。そうしないと、発音しているものがそのまま発音しっぱなしで残ってしまうのである。これでは必要な一時停止の機能が実現できていない。

これを解決するために何が必要になるか。通常のMIDIプレイヤでは、一時停止すると、ノートオンしているキーの全てについて、対応するノートオフを送信していると思われる。ということは、現在どのキーがオンになっているか、把握しているということになるだろう。16チャネルの128キーの全てについて、これを把握しているということになる(まあGM Level 1では、同時発音数は16 + 8 = 24音までなので、本当はそこまで必要ないはずだけど、実際の音源モジュールではもっと発音できるのが普通だ)。記憶するだけなら、16 x 128のビットフラグ = 256バイトのメモリがあれば足りる。

ただ、これは面倒なので、いっそVolume = 0 を送信してしまえばいいのではないかとも考えている。ただ、確かVelocity = 0でも音が出る音源があったはずなので、Volume=0が安全かどうかは確実なことは言えない。Volumeと異なりVelocityにはリリースレートやキーオフディレイなどの要素があり得るので消音ではない、というだけのことかもしれないけど。

いずれにせよ、ある程度音源に送信しているMIDIステータスを、プレイヤ側で把握するレジスタマシンのような、エミュレータのような存在が、必要になるかもしれないと思った。そういうものを作るのも楽しそうだ。

mmchromakey

| No Comments | No TrackBacks

クロマトーンはmmkをベースに作ったらほんの小一時間でリファクタリングも含めて出来た。出来上がったものを実際にいじってみると、確かに面白い。ピアノ配列のmmkよりも曲が作りやすいような気も確かにする。ただキーボードだと、キー(音階)のレンジが広くないので、狭い範囲で音階の移動が小さい音楽しか作れないようにも思う。これはあまり本格的にいじるものではないな。本物のクロマトーンの方が良さそうだ。

portmidi-sharpのリポジトリも、PortMidiSharp.cs自体は割とどうでも良くて、サンプルとして作られているアプリケーションとかライブラリの方が有意義なものになっていきそうな感じだ。SMFプレイヤーのサンプルも、そのうちRCPとかVSQとか、いろいろ無駄に幅広く対応してもいいかもなあと思っている。

名前がchroma keyなのはもちろんKevin Mooreとは何の関係も無い。ということにしておきたい。

諸君、私はautotoolsが嫌いだ

| No Comments | No TrackBacks

実のところ元ネタをよく知らないのだけど。

portmidi-sharpはportmidiのdynamic libraryが前提となっていて、portmidiに対して環境依存のパッチを当てた上でビルドしなければならないのだけど、いつまでもパッチを当ててくれというのでは使う人が出てこなくなる。portmidiに1つのパッチを当てるだけですむようになれば、本家にもpostできるようになる。もっとも、彼らはautotoolsを避けるためにこそ、いろいろやってきたのかもしれないけど...

そもそもportmidiはどうも開発が停止しているようなので、自分で勝手リポジトリを作って改善していった方が良いような気がしているのだけど、いずれにしてもautotoolizationは必要だ。

というわけでglibtoolizeのテストを追加したり、AM_CONDITIONALで環境依存の部分を切り分けたり、cygwin/gcc依存の部分を条件分岐するなどして、autogen.sh / configure.in を一本化しようとしているのだけど、いろいろハマりどころがあって困っている。とりあえずSUBDIRSをMakefile.amの中で条件分岐することは良くても、configure.in の中でAM_CONFIG_FILES()の中身について条件分岐してはいけない、みたいな部分でかなりハマった。そして今はlibtoolに絶対パスを要求されて困っている。いつ終わるのやら。

そんなことより、クロマトーンがなかなか面白そうなので、そのうちmmkをちょこっと改造して作ってみたいと思っている。本当はその前にmldspを演奏モニタにしたいのだけど。

線描画の挙動

| No Comments | No TrackBacks

tsukimiの実装を、少しずつprocessingに近づける作業をしていたのだけど、どうもline()の動作が違うところが直せない。

この辺の「色が妙に薄くなる」現象が謎で、色自体は同じ値のはずだし、Lineのプロパティをいろいろ試してみても(Silverlightはよくわからんので、その辺からやってみないと分からない)、どうも変わらない。Rectangleとrect()については、どうやら終端側(右と下)の線を1ドットずつずらさないと合わない感じだったが、line()はそもそもprocessing上では厚さが1ドットのものが2ドットにぼやけて描画される。アンチエイリアスがかかっているんだろうか。Java2DとSilverlightの違いなのかもしれないし。じっくり調べないと分からなそうだ。

全然関係ないけど、rectModeとellipseModeを実装したので、こんなものも動くようになった。 http://veritas-vos-liberabit.com/tmp/tsukimi/output/Basics/Input/Clock/Clock.html

やっぱりそのうちWritableBitmapに移行すべきだろうな。processingのdraw()の動きが分からなかったので躊躇していたのだけど、単なる描画だけでオブジェクトの配置とか削除が行われているわけではないようだから、描きっぱなしでたぶん問題は無いだろう。

draw() support in tsukimi

| No Comments | No TrackBacks

tsukimiにいくつか手を加えて、とりあえずdraw()関数がFPSベースで正しく何度も呼び出されるようにした。そしたら案の定重い重い。これでどこまで実用出来るかは分からんけど、まあとりあえずproof of conceptに近いのでまあいいだろう。

実のところDispatcherTimerで割り込んでdraw()を呼び出しているだけにすぎないので、Silverlightのアニメーションとは全然性格が異なるのだけど、アニメーションっぽいコードが動いているのが見られるようになると、何となく楽しい。

tsukimiもそろそろproof of conceptというフェーズを脱してもいいかもしれない。というより、moonlight自体がコロコロ変わるので、なかなか安定したものが作れない。pde (processing development environment)みたいなのを作って、もう少し使いやすくしたいところだが、今日tsukimi-tool (importer)にmxapの機能をコピーしようとしたら、芋づる式にいろいろコピーしなければならないツールが出てきて、今日はやる気がなくなってしまった。とはいえ、いずれそれくらいは作らなければならなくなるだろう...

あと、tsukimiでprocessingのexamplesをバッチで取り込んだもののうち、上手く取り込めたものを全部アップロードして、一覧ページを生成するスクリプトを書いて載せてみた。 http://veritas-vos-liberabit.com/tmp/tsukimi/

たまにブラクラになるものがあるので、開く時はブラウザが落ちても良いようにしておくと吉。

tsukimi build is fixed

| No Comments | No TrackBacks

tsukimiのビルド問題は、結局2.1依存部分を切り離して、processing APIをテキストリストから取得する方式にすることで解決した。解決したとはいえ、tsukimi-toolがLinux上で(mxapのある環境で)のみ動作するというのはやや気持ち悪い。MonoDevelop.MoonlightではMac上でもSilverlightアプリが普通にビルド出来ているので、同じことが出来るのではないかと思って、MonoDevelop.Moonlightのソースを眺めてみたけど、そもそもMonoDevelopのリリース版とtrunk版ではGACにインストールされるアセンブリが異なるので、trunkではやはり動作しないのではないかと気がついた。trunk版はこれからどうするのかな。

なるべく他の環境でも実行出来るようにしたいと思うのだけどな。mxapはともかく、xamlgはMonoDevelop.Moonlightでも独自にもっているようだし、mxap自体がやっていることはそんなに難しいことではない。smcsを呼び出したりはしているので、Silverlight上から行うことはできないけど。

how to fix assembly references ...

| No Comments | No TrackBacks

tsukimiのアセンブリ参照を解決するのが一筋縄ではいかなくて困る。

Processing.Core.dllというアセンブリをProcessing.Importer.dllというインポータライブラリで参照しているのだけど、Processing.Core.dllが2.1のSystem.Windows.dllを参照していて、しかもリフレクション経由で単なる参照だけでなく呼び出しもしているため、実際にこのアセンブリが必要になる。しかし、moonlightの場合はビルドしたアセンブリが必要になるし(インストールされるのはxpiのみ)、SDKはまだ用意されていない。Windows/Silverlightにおいても、C#を使ってコマンドラインからSilverlightアプリケーションをビルドする方法が存在していない。

あれこれ考えて、とりあえずmoonlightのアセンブリをローカルに参照用としてコピーしてくればいいだろうと思ってやってみたら、今度は2.0.5.0のmscorlib.dllやSystem.dllが要求される。かといって、それらを置いてしまうと今度はインポータが2.0.5.0モードで実行されてしまい、Processクラスなどが使えなくなってしまう。

どうも2.1と2.0の混合ソリューションてのは筋が悪そうなので、2.1依存部分を切り離して書き直すしか無いかなあと思っている。

make VST portable to Linux

| No Comments | No TrackBacks

初音ミクがLinuxで動くようになってほしい。持っていないけど。

VSTは移植性のあるDTM環境を実現するにあたって最大の障壁になるのではないかと思う。SMFの作成にはMMLコンパイラを使えば良いが(本当か)、VSTは、プラグインAPIを通じて実装されるのが単なるネイティブコードなので、それだけでは移植性が低い。OpenGLなどを使えば、ある程度クロスプラットフォームなコードが書けるかもしれないが、どうせなら移植性のあるmanaged codeで実現すれば、Win/MacだけでなくLinux上でも動作するVSTが書けるではないか。

そんなわけで、今VST.NETというプロジェクトに注目している: http://www.codeplex.com/vstnet

これ自体はWindowsのみを前提としているように見えるが、VSTのAPIを呼び出している部分を書き換えれば、MacやLinux上でも使い物になるかもしれない。場合によっては開発に積極的に関与してみようかなあとも思っている。

Linux上でVSTあるいは類似の機能を実現するフレームワークは、いくつか存在している。wineを利用する物もあるし、あくまで独自に枠組みを用意しているものもある。VST.NETからのP/Invokeで済むのであれば、大きな障壁にならないのではないか。

もっとも、VST.NETはGPLv2で公開されていて、クローズドソースがほぼ全体を占めるVSTにおいて、VST.NETが採用される可能性はあまり高くないとも言える。その場合は、独自にライブラリを作成することになるかもしれない。VST.NETは比較的大規模なライブラリなので、これに追従するのは大変そうではあるけど。

追記: ソースコードを眺めてみたが、それなりに大規模なunmanaged C++ projectのコードが存在しているようだ。このままでは移植生は高くないな。

mldsp launched

| No Comments | No TrackBacks

3月の頭に、processingでお絵かきをしてみたことがあった。それは音楽ファイルのビジュアルプレイヤーのUIの基本構造を描いてみたものだった。そのprocessingのデータは、tsukimiを使用してMoonlight上で走らせてみることはしなかった。tsukimiはかなり不完全なもので、移植版では明らかに動かなかったし、音楽を再生させるためのC#コードも何一つ存在していなかった。

今週、SMFのプレイヤーがある程度実装できて、同期版のプレイヤーは多少のレイテンシを覗けば問題なく動作しているので、ビジュアルプレイヤーを作る作業を再開することにした。

まずは、processingで描いたUIをMoonlight上で動作させなければならない。XAMLやC#で書き直すことも出来なくはないが(実のところ勉強しなければ出来ないのだけど)、それよりむしろtsukimiを使ってprocessingでデザインを試行錯誤しながら進める方が楽しいだろうと考え、tsukimiの実装を進めることにした。

ただ、インポータがビルドできないので、本来なら自動生成できるコード部分は手作業で作って、ランタイム部分にのみ手を加えていく作業だ。もっとも、手作業といっても、tsukimiの仕様上、ほとんどprocessingのコードをそのままコピペできるようになっているので、これは大した手間にはならなかった。

数十件の問題を修正して、とりあえずそれらしいUIは出るようになった。これがprocessing版:

mldsp rough sketch with processing

これを現在のtsukimiで実行するとこうなる:

mldsp take1 screenshot

コードはこれだけ。短いものだ: processing, tsukimi-hC#

xapも試しに実行できるようにしておいた

もちろんまだ枠組みしかないので、何が再生できるわけでもないし、少なくともSilverlightではSMFを再生することは(カスタムメディアストリームだけでソフトウェアMIDIを再現するような変態的なコードを書かない限り)不可能だ。SMFプレイヤーとしては、あくまでGtk.Moonlightのような環境で動かすことを前提としている。

こういうのが動くと、Linux環境でのMIDIいじりも楽しくなってくるんじゃなかろうか。

tsukimi build issue

| No Comments | No TrackBacks

portmidi-sharpアプリの最初の一歩が実現したので、今度はGUIだと思ってprocessingをmoonlightベースで実現するtsukimiに戻ってきた。すると、moonのビルド環境がだいぶ変わってきたこともあって、ビルド出来なくなってしまった。

問題はいくつかあったが、現在の問題としては、ビルドそのものは成功するが、processingプロジェクトのインポータが、mscorlib 2.0と2.1の両方を見に行くところで失敗してしまうところにある。かつては2.1のmscorlibもGACに含まれていたのだが、これがmake installしてもmonoのライブラリのようにインストールされることがなくなってしまったせいだ。

tsukimi自体は3つの部品で作られている

  • Processing.Core.dll : 2.1. processing互換クラスライブラリ(?)のランタイム
  • Processing.Importer.dll : 2.0. processingプログラムをtsukimiベースのコードに変換するためのインポータ
  • tsukimi-tool.exe : 2.0. インポータのCLIフロントエンド

インポータがCoreへの参照をもっていたので、そこはアセンブリをリフレクションで呼び出すことで解決したつもりだったのだが、リフレクションで参照されるメンバが結局System.Windows.dllを参照するので、そこで参照の解決に失敗して先に進めなくなった。

解決策は見つかっていない。いっそこのままAgDLRに行ってしまうべきだろうか。

mmk: MIDI keyboard

| No Comments | No TrackBacks

昨日はplayerがbreak throughを得たので、そのまま調子に乗ってもうひとつ予定していた小物アプリを書き上げた。PCのキーボードを利用した仮想MIDIキーボードである。これもportmidi-sharpのリポジトリに入っている。

実は同じ目的のプログラムを大昔にWindows APIベースで書いたことがあるのだけど、ソースもどこかに行ってしまったし今さらMFCのソースを眺める気もしない。その割に、MIDIをいじって打ち込もうとする時には未だに手放せない。世にあるMIDIキーボードツールの大半はマウスでクリックしないと発音できない(どうやって和音を出すというのだろう)。キーボード入力を受け付ける賢いやつは、まあWindowsでしか見たことが無い。

そんなわけで、portmidi-sharpで書き直そうと思っていたのである。

仕組みは大変簡単で、KeyDownしている間だけ、そのキーに割り当てられた音で発音し、KeyUpで消音する。上下矢印キーでオクターブを変更する。出力デバイスと音色だけ変えられればとりあえず実用に堪える。

単純なアプリだが、標準的なUIをもっているというわけではない。ボタンはそれ自身のUIイベントとは無関係にup/downしなければならないし(ボタンにしないという選択は無くもないが)、音色選択やデバイス選択のコンボボックスにフォーカスがある時は、それ自身のキーバインドを有効にしなければならない一方で、ボタンはフォーカスを受け取ると変なUIになってしまう(発音/消音とフォーカスは無関係)。

何で書くかは一寸考えたが、結局winformsで書くことにした。そしたらキーイベントの拾い方ではまるはまる。Formはフォーカスを受け取らないし、キーイベントを消費したことを明示してもなお上下カーソルを押したらフォーカスが移動してしまう(オクターブ上下に使うために使っているのに)。仕方ないのでダミーのTextBoxを用意して、ここでキーイベントを全て受け取るようにして解決した。

こんな風に、Linux環境にも少しずつ打ち込み環境を整えていきたい。

SMF utility library

| No Comments | No TrackBacks

portmidi-sharpを試験的に使って作ろうと思っていた小物ツールが2つある。昨日それらの基本版がどちらも完成した。portmidi-sharpのリポジトリに入っている。

ひとつは単純なSMFのプレイヤーで、SMFを解析してportmidiで出力するだけ。間はThread.Sleep()しているだけなので、微妙に遅延が発生するので、理想的とは言えないのだが、実質的にあまり困るところまではいっていないと思う。

小物なのだけど、実はいろいろバグに悩まされて、時間がかかってしまっている。一番困ったのはパフォーマンスが出なくて命令の取りこぼしが発生すること...だと思っていたのだが、実は命令の取りこぼしなどではなかった。パフォーマンスの問題だとしたら面倒だと思いながらコードの改善にあたる。

プレイヤーは、ひとつのイベントリストを受け取って、デルタタイムを見ながらThread.Sleep()をかけて、時間が来たら次の待ちまでの命令を全部処理する、という仕組みになっている。トラックごとにスレッドを使うのも無駄だ。このため、プレイヤーの中では、複数トラックを一つのトラックにマージする処理を行っている。まず全てのイベントの時間単位を先頭からのデルタタイムに変換した、長大なイベントのリストを作って、そのデルタタイムでList<MidiEvent>.Sort()して、最後に絶対値にしたデルタタイムを相対値に戻すようにした。

この処理が長くて問題が多そうなので、まずportmidi-sharpのMidiEventに変換してからマージする仕組みを捨てて、SMFサポートのライブラリでSmfTrackMergerというのを作ってSmfEventのレベルで並べ替えることにした。結果的にこれはSMF Format 0からSMF Format 1へのコンバータとしても使えることになった。

実装をSmfEventで書き換えても相変わらず命令のとりこぼしのような状態は続いたので、取りこぼしがデータのレベルで発生しているのではないかと思ってコードを数日間眺めた(これだけ眺めていたわけではないが)。そして昨日唐突にソートがまずいことに気がついた。

たとえば、MMLで "@5 q0 v100 o5 ccc" ようなシーケンスがあったとする(q0は減算ゲートタイムなしを表すとする)。このとき、ソートされる前の命令は次のようになる: C005 906064 ... 806000 906064 ... 806000 906064 ... FF2F00 (...はデルタタイムによる待機)

"..." ごとに区切られたMIDIメッセージは、先頭からの絶対デルタタイム(命令送信時間)こそ同一だが、その順序は維持されていなければならないのだ。これまでの実装では単純にList`1.Sort()を使っていたから、維持されなければならない順序が失われていたことになる。上記の例だと、note onしてから音色を変更したり(変更前の音色で発音してしまう)、note onしてから直前のnote offが続く(直前の発音も同じキーだと、発音したばかりのnoteも消えてしまう)といった問題になる。

そういうわけで、ソートの実装を変更して、待機時間ごとに区切ったインデックスをもとにブロックを作って、ブロックレベルでソートしてから、ブロックインデックスをもとにイベントリストの再構築を行う、というやり方にしたら、この「取りこぼし」問題はあっさり解決した。

ちなみに、Format 1 -> Format 0の変換を実装したので、それならば逆もアリなのではないか?とふと考えて実装してみた。基本的には、チャネルごとにトラックを割り振るという仕組みにしてあって(SysExやMetaは別のマスタートラックを用意)、MIDI命令ごとに出力するトラックをオーバーライド出来るような関数にしてある: pubic virtual int GetTrackNumber(SmfEvent)

これを活用すれば、たとえば、noteon/noteoffとその他の命令を全て切り離すようなカスタムコンバータを作ることも可能だ。そうするとかなりイベントリスト型のシーケンサに優しくなるだろうし、今後SMFからMMLへの逆コンバータを作る時にも重宝しそうだ。

プレイヤーについてはまだ多少やるべきことがあるのだけど、とりあえず基本中の基本は出来たので安堵している。これもテンポ計算に使うデルタタイム指定をいじくると、簡単に倍速再生だのスロー再生だのが出来ておもしろい。もちろんプレイヤークラスではMIDIイベント出現時の処理をオーバーライドできるようにしてある。

portmidi-sharpの問題ではなく自分のautotoolized portmidiの問題だったのだけど、OSXでも無事に問題の無いlibportmidi.dylibをビルドしてportmidi-sharpからMIDIを叩くことが出来た。 portmidi-autotoolize-osx.tar.bz2

ちなみに、どの環境についても、autotoolizeしたのはライブラリだけで、テストコードの類はいっさいサポート出来ていない。trunkにあるMakefileを置き換えるのはちょっと困難そうだ。

これでPortMidiPlayerがまともに動作するなら、そのままサンプルとして投げることもできるのだけど、まずバグを潰さないと先に進めない。今日、サンプルコードに含まれるSMFサポートをリファクタリングして、SMF出力もきちんと処理するようにしたので、SMF読み込みの部分で間違いは無くなっただろうと思っている。次はプレイヤ側のトラックマージ処理を直そうと思っているが、そのためにSMF Format 1 to 0 変換を実装しようと思っている。おそらくそこが今のネックだ。

PortMidiPlayer

| No Comments | No TrackBacks

portmidiをいじってクロスプラットフォームなMIDIアプリケーション作成環境を構築しようとしていることは今さら言うまでもないけど、とりあえずportmidiのC#バインディングはそれなりに動いてきている。というわけで、まずはサンプルとしてSMFを読み込んで再生するだけのコンソールアプリケーションを作っている。まだproof of conceptでしかないけど。 http://github.com/atsushieno/portmidi-sharp/tree/master

このアプリもWindows上でしか動作確認できていない。でも多分Linux上では実行するだけで落ちないところまでは持って行ったので、動いていると思う。動作確認できていないのは、単にうちのLinux環境のalsaが死んでいてtimidityの音が鳴らないためだ。ハードウェアMIDI音源に繋げば確認できる予定。OSX環境では、そもそもハードウェアMIDI音源しか手元に無いので(timidity -iAのようなことができない)、これも動作確認がおあずけ状態だ。

追記: alsaは生きていたようだ。単なるテスト時の音環境の問題だった。というわけで動作するのを確認。ついでにSC-8820でもちゃんと(と言うべきかは分からないが)動作するのを確認した。

今のところ特定のファイルを再生するだけでしかないが、ちょいちょいとソースを書き換えてやれば、キーをずらしたりテンポを動的に変更したりといった遊び方もできる。MIDIメッセージのタイミングでイベントも飛んでくるので、それに合わせて何らかの処理を挟むこともできる(実際、僕がほしいと思っているのはビジュアルな再生環境だ)。

まだいろいろ問題がある。ひとつには、処理落ちが著しいということ。MIDIメッセージの送信をThread.Sleep()で待っているだけの構造になっているし、コードは全然最適化していない。また、データの解析にも一部失敗している。昨日突き詰めたら、そもそもSMF処理クラスに多々問題があることが分かったので、根本的に書き直そうと思っている。SysExメッセージも送ろうとするとportmidiからエラーが返ってくるので(これは原因不明)、修正しなければならない。

この辺の問題を一通り片付けたら、いよいよビジュアルプレイヤを作ることもできるだろう。もっとも、他にも作っておきたいものがいくつかある。一番ほしいのがお手軽な仮想MIDIキーボードだ。次に手持ちのMOTIF RACK ESの音色を簡単に作るためのエディタがほしい。あとvocaloidのNRPN/DTEメッセージを簡単に作成できるようなエディタもほしい。もっとも、vocaloid自体クロスプラットフォームではないのだが...。

accelerando

| No Comments | No TrackBacks

またしばらくこっちに書き忘れていた。

しばらく前の話だけど、gainerの加速度センサでMIDIノートをコントロールするおもちゃを作った: http://veritas-vos-liberabit.com/tmp/2009/accelerando.tar.bz2

一言で書くと、ここでしばらく書いていたportmidiのC#バインディングportmidi-sharpを使って、MIDIノートオン/ノートオフとプログラムチェンジを行う簡単なwinformsアプリに、C#で書かれたgainerコントロールライブラリMnGainerを組み合わせて、gainerに加速度センサを繋いで、アナログ入力にピッチベンド操作をマッピングしただけのものだ。ちなみに、加速度センサで音をいじるからaccelerando.exeという名前になっているだけで、テンポをコントロールするものではない。

やっていることは単純だけど、実際に動作させるためには、いろいろビルドしないといけない。まず、実行環境として、パッチをあてたmono on winfowsまたは.NET Framework、独自ビルドしたmono on OSX、あるいは標準のmono on Linuxが必要だ(Linuxが一番簡単そうだ)。特にOSX環境ではパッチを当てた後でautotoolsマクロも書き換えてやらなければならず、僕は具体的なやり方を把握していない。

次に、実行環境に合わせたportmidiの動的ライブラリが必要になる。こちらは、mono on Windows / .NET Frameworkでしか確認できていないが、OS X環境向けにautotoolizeしたものと、Linux環境向けに以前autotoolizeしたものをバグフィックスしたものを用意してある: portmidi-autotoolize-osx.tar.bz2 portmidi-autotoolize-linux.tar.bz2

portmediaのsvnからチェックアウトしてきて(僕が作っているのはr147の修正だ)、それぞれの環境に合わせたtarballをtrunkディレクトリ上で展開して、autogen.sh -> make -> make install でいけるはずだ。この辺は、一応動作確認してから、おりをみて本家に投げたい(以前のバージョンは動作確認もしないうちに投げてしまった。いずれにせよ本家リポジトリには反映されていない)。

OSX環境で動作させる場合は、accelerando.exe.configファイルを作ってdllmapを設定してやらないといけないかもしれない。内容はおそらく <configuration><dllmap dll="porttime" target="libporttime.dylib" ><dllmap dll="portmidi" target="libportmidi.dylib" ></configuration> でいい。

ちなみに加速度センサからのフィードバックは、実際に繋がっているデバイスの振り幅とかなんも見ないで、適当に実物に合わせてつじつまを合わせているので、機器によっては期待通りに触れてくれないかもしれない。というより、そもそも僕の環境で期待通りの振れ方になってくれなくて困っている。まあ、これはあくまでproof of conceptでしかないので、深入りするとしたらもっときちんとしたものを作ってからだろう...。

というわけで、一応monoを使ってクロスプラットフォームに作られているはずなのだけど、茨の道なので良い子は真似しない方が良いと思う。

About this Archive

This page is an archive of entries from May 2009 listed from newest to oldest.

March 2009 is the previous archive.

June 2009 is the next archive.

Find recent content on the main index or look in the archives to find all content.

Categories

Pages

OpenID accepted here Learn more about OpenID
Powered by Movable Type 4.23-en