September 2009 Archives

portmidi/win32はしばらく壊れるらしい

| No Comments | No TrackBacks

しばらくぶりの更新。前回のエントリを書いたときにはすでにそうだったのだけど、PCが使えなくなって新調していたり、手持ちのYAMAHA音源にささっていたヘッドフォンの先が折れて未だに使えなくなっていたりして、いろいろ問題続出していて、すっかり放置になってしまった。現実逃避でGoogleのAppEngineを初めていじったり(これはこれで1日ちょろっとやっただけで放置しっぱなしだ...)、JSONのAPIをたたくコードを書いたり(これも放置している...)、Snow LeopardとiPhone SDKをいじったり(これはこれから放置する予定)...

そんなわけで、昨日ひさしぶりにこっちの世界(?)に帰ってきた。しばらくFM音色いじりで遊んでいたのだけど、昔と違って今は音源ドライバ(のエミュレータ)しかなく、便利な小物ツールが存在しない。とりあえず音取りが出来ないので、mmkをビルドしようと思って、ひさしぶりにportmidiをチェックアウトしたら、数ヶ月ぶりに開発が進行していた。それは良いことなのだけど、Windowsでビルドできなくなってしまっていた。mingwビルドはハマりどころなので、少し時間をとって原因を探ったら、どうやらそもそもビルドできないコードがcommitされていた(よくあることだ)。とりあえず修正パッチを開発MLに投げたら、今開発進行中だからしばらく壊れていく可能性がある、と言われてしまった。そりゃ困った。てかuntestedでcommitしているならともかく、開発中のプラットフォームなのにビルドできないのか...

learning pd

| No Comments | No TrackBacks

今週はハードウェアトラブルで公私ともにいろいろやりたかった作業が吹っ飛んでしまった。そんなわけで、今週特記すべきネタは今日見てきたMAX/MSP関係のイベントにかかる、音響系プログラミングの話くらいかと思う。

音響系プログラミングの経験は全くない。触ったこととしても、FM音源のパラメータをいじったことがあるという程度だ(OPNはそれなりにいじったけど)。知っているパラメータをいじるとどういう音が出来るかというのは何となくわかるけど、発信器をどのように合成するかという仕組みはよくわかっていない。このレベルで、とりあえずpure dataを試してみることにした。一番参考になったと思ったのが、pddocというサイトだ。サンプルと丁寧な説明というpdに全くないものが提供されていて、これを読むだけでだいぶ基礎がわかった気がする。今日勉強して把握した特徴としては

  • オブジェクトがコネクションを通じてメッセージを送受信する
  • 数値や文字列のデータ変更やbangが出力先でのアクションを引き起こす
  • オブジェクトには複数の入力があって、左側への入力だけがアクションを引き起こす
  • UIによる指示と、タイマやディレイなどタイムライン経由での指示が中心

という感じだろうか。

pdは、今日観戦してきたトークイベントのために予習していったのだけど、実際の話に出てきたのはむしろMAX/MSPやSuperColliderで、すっかりハズレとなってしまった...かと思いきや、MAX/MSPは(知識としては知っていたけど確かに)pure dataにそっくりで、MAXを使ったデモも、何も引っかかることなく楽しむことが出来た。SuperColliderはVPLではなくサウンドモジュール制御のための言語で、今日のデモでは、コサイン波を少しいじっただけの音声モジュールの周波数をパラメータにして、それをOpenSoundControl経由でMAXのudpsendやiPhoneのTouchOSCでいじるために登場した。SuperColliderはpure dataの音響・合成と、Javascriptの関数オブジェクト程度のことが分かれば、基本はわかるのではないかと思う。

イベント自体はMAX/MSPの権威がトークしたり、OpenFrameworksでおもしろいデモを見せたりしていて、それはそれで話が書けるのだけどそこは割愛。

で、pdはVPLとしてはかなりチャチなので、それこそtsukimiのようにSilverlight環境で実現することもできるのではないかという気がしているし、ライブラリを実装するのもエディタを構築するのもそれほど困難ではないように思っているのだけど、これは「その先」に作りたいものが無いとおもしろくないような気がしている。pure data相当のものを、たとえばiPhone上で実現するというのであれば、RjDjがすでにあるので、今さら必要はない。見栄えのいいものは、自分で作れるかもしれないけど。むしろロジックを組みやすくしたり、GUI以外の方法(コンソールやらハードウェアやらAPIやら)でbangなどの指示が出せる方が楽しいような気がしている。まあそれはOSCで出来なくもないけど...

WebMidiPlayer(のようなもの)

| No Comments | No TrackBacks

portmidi-sharpのサンプルとして、WCF経由でportmidiを叩くものを追加してみた。本当はRESTful APIを使いたいのだけど、まだしばらく不安定になりそうなのと、Silverlight環境で使えないということがあるので、今回はまだBasicHttpBindingだ。 サーバ, クライアント

これが実におそろしいもので、mono環境ではまだきちんと動作しない可能性が高い。mono on Windowsのコンソール上では、一応.NETクライアント/サーバとmonoクライアント/サーバの任意の組み合わせで実行できるはずだけど、同じものをMac環境にもっていくとなぜか途中で止まったりする。たぶんネットワークまわりの実装が異なるためだろう。非同期メッセージングはそもそも最初からきちんと動作しないので、この辺も解決していく必要がある。

で、何がおそろしいかというと、今回の実装はMIDIメッセージをそのまま送信する仕様になっているので、無駄に演奏のハードルが高いのである(WCFのdogfoodingのためにあえてそうしている)。MIDIプレイヤで送られるMIDIメッセージの数量はとてつもなく多いし、処理速度もかなり要求される、という点だ。monoのWCFのコードは全くと言っていいほど最適化されていないので、これから最適化していく必要があるだろう。まあ、こんなにヘビーな使い方は想定していないのだけど。ただ、.NET環境ではそれなりに再生できているので、多少なりとも張り合えるところまではもっていきたい。

実用上は、SMFの生データと演奏制御命令(play/stop/pause)を送受信すれば全て解決だ。これはmldsp上で実際に必要になる(実装する)予定なので、それは別のものと考える。

さて、このweb playerの目的はSMFを演奏することではない(それはそれであるけど)。自宅で接続するのが面倒くさいYAMAHAのラック音源を別のネットワークマシンに接続して、そのマシンでserviceを起動しておいて、ローカルのclientがそれを叩く、ということを主な用途として想定している。

もちろん、serviceはローカルマシン上で動作させておいて、mldspのようなsilverlightアプリから演奏命令を送信するということもできる。これはFlashでgainerをコントロールするgspと同じやり方だ。

ただ、mldspに関しては、ただでさえCLRのHttpWebRequestを経由するWCFで重いところを、ブラウザへのXPCOM呼び出し経由でHttpWebRequestを介して通信するのが現実的であるとは考えにくい。やはりSMFと制御命令を送受信するのが現実的だ。そもそも本当に利用したくなったらWCFなんて使わない。

今この方法で設計しようと思っているのがMIDI音色エディタ(のようなもの)だ。MIDI制御命令を全てこのWebプレイヤ経由で処理するようにすれば、ブラウザのみで利用できるようにすることもできる。GUI部分に何を使って設計するのが一番良いか、いろいろ考えたのだけど、とりあえずmoonlightを使ったやり方はアリだと思っている。コレとは別に、OpenTKを使う方法も検討している。ただ、テキスト入力をどうするか別途検討する必要もありそうだ(WinFormsを使えば実現できるが、iPhoneなどでは使えなくなる)。

MIDI INのデータがPortMidiSharpで上手く取れない問題は解決した。バッファサイズを修正して、戻って来るバッファが中途半端であることを前提として、生バイトからメッセージへの変換処理を実装したら、きちんと動くようになった。...というには一つまだメモリアクセス違反が生じる問題が残っているのだけど。Marshal.UnsafeAddrOfPinnedArrayElement()が返す値だか引数のindexだかがおかしいようだ。とりあえずそういうアクセスを起こさない形にしたら、上手く動くようになった。

あと、今日になって気づいたのだけど、たぶんバルクダンプのsysexの戻り値は、そもそも音源あるいはportmidiのプラットフォームレイヤのレベルで、順番通りに返ってこない。これはportmidiのダンプでも同じことだった。今試しているのは10年以上前のRolandの音源なのだけど、YAMAHAの5年くらい前の別の音源だとまた別かもしれない。

まあそんなわけで、寄り道だったMIDI INはクリアということにしようと思う。これでリアルタイム入力を使ったシーケンサの作成も出来るようになったと考えれば、なかなか悪くない。MIDIメッセージを送りつけるようなハードウェアを自作しても役に立ちそうだ。

ついでにこの前のb=の問題も解決させておいた。引数が二重に定義されていた。最適化以前のコンパイラでは、引数の扱いが異なっていて、チェックされていなかった。いや実におそろしい。

ちなみに先日知人とマクロ定義の引数のスコープの扱いを変えた話をしていたら(MMLの話をしていたというよりは、コンパイラで関数を展開する話をしていた)、これはどうやら古典的lispとschemeの違いでもあるらしい。lispでは呼び出し元の関数で定義した引数をそのまま参照できていたが、それでは呼び出し元を全て辿って参照解決しなければならないので引数参照の解決の効率が悪いとして、schemeではこれを許さないようにしたという。たかだかMMLコンパイラでも、過去の話が繰り返されているようだ。面白い話があったものだ。

MIDI INいじりの続き

| No Comments | No TrackBacks

最近なかなかこっちのプログラミングに時間が取れない。昨日はとりあえず怪しいMIDI IN周りを調べようと思って、Cでportmidiだけを叩くサンプルを書いてみたのだけど、どうやら正しそうなバイナリがとれている。どうやらC#バインディングが怪しいようだ。また次回チェックしてみようと思う。

ちなみに、どうせバルクダンプを取得しても、その後のデータ解析が必要になるんだろうと思って、SC-8850の音色リストのテキストを解析するコードはもう書いてしまった。

About this Archive

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

August 2009 is the previous archive.

November 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