January 2009 Archives

IXMFが面白そう

| No Comments | No TrackBacks

しばらくエントリを書いていなかったのは、仕事が少し忙しかったのと、空いた時間にSilverlight関係で遊んでいたのとがある。これはある程度落ち着いたらそのうち公開できるかもしれない。

その間にportmidiもある程度進展するのではないかと思ったら、案外スローなプロジェクトのようで、全然アップデートが無い。というわけで、そっちはしばらく個人的な試みで放置しておいても別にいいかもしれない。

その間に、IXMFという興味深い音楽データフォーマット仕様の存在を教えてもらった。 http://www.iasig.org/pubs/releases/pr_ixmf-public.shtml

Interactive XMFということで、基本的にはXMFが外部(てのがI/Oなのかソフトウェアなのかもよく分からないけど)とやりとりするためののようだ。しばらくこれを読み解いて何か実装できないか、遊んでみようと思っている。

今のところの懸念としては、XMFはMMA (MIDI Manifacturers Associates) の仕様を前提にしているので、タイマーモデルがMIDI前提になっているように見えるところだろうか。個人的にはOPNのtimerAやtimerBのサポートがほしいと思っているので、そこで切り捨てられたらちょっとなあ...とは思っている。

cygプレフィックスが邪魔をする...

| No Comments | No TrackBacks

Windows上でdllを作成することは既に出来ているのだけど、シェルでいちいちコマンドを渡すのは美しくないので、せっかくだからこっちもautotoolizeしようと思っていろいろ試してみた。とりあえず今出来ている一連のスクリプトは、先日のLinux版と競合するので、まだ実用的とは言えないが、とりあえずdllが出来ているとは言える。しかし...

portmidi-autotoolize-win32-20091011.tar.bz2

実際に出来上がるdllの名前がcygporttime-0.dllとかcygportmidi-0.dllになってしまう。どうやらこれはOpenLDAPのFAQを見る限り、既知の問題であるようだ。

実はmonoのビルドスクリプトにも、その辺りを鑑みてlibtoolをいじっていると思われる箇所があって、このスクリプトにもその部分をコピーしてある。しかしどうやら上手く適用されていないようだ。もう少し試行錯誤してみないと分からなそうだ。

まあ、autotoolizeしなくても、dllwrapを使ったビルドスクリプトで実用的に困ることは無いのだけど...

autotoolized pm_linux

| No Comments | No TrackBacks

autotoolsを使ってゼロからportmidi用のビルドスクリプト一式を作ってみた。とりあえずLinux環境しか対応していない。

portmidi-autotoolize-20080108.tar.bz2

autotoolsを使ったビルドスクリプトなど書いたことがないので、これでまともに書かれているものなのか、よくわからない。とりあえず、autogen.shとしてautomakeやらautoconfやらを呼び出すようにして、make installからmake distcleanまで出来ているようなので、一応は動作しているのだと思う。libportmidi.soも出来てインストールされているようだ。まずはめでたしめでたし。

しかしこれが昨日のPortMidiSharp.csとサンプルコードでちゃんとP/Invokeできない。とりあえずsoファイルが見つからないというごく基本的な部分で止まっている。どうすればいいんだったか、調べればすぐ分かりそうだが、とりあえず今のところはここまで。

PortMidiSharp.cs updated

| No Comments | No TrackBacks
昨日の続き。まだWindowsでのみ行っている。

まず、音が鳴るようなサンプルがportmidiに含まれていたので、それを簡単にしたやつをC#で書き直してみた。
http://monoport.com/38988

これを動かすには、昨日ここに載せたPortMidiSharp.csの更新版が必要になる。
PortMidiSharp.cs

実行したらめでたく音が鳴った。というわけで、ついでに上記P/Invokeラッパーをいくつか追加して、簡単な部分のバインディングとしてはとりあえず機能するようにした。MIDI入力デバイスは、繋いだことがないため、どこまで動作するものかは分からないが、多分動作するのではないだろうか。

次の目標は、Linux上で共有ライブラリをビルドして、これをmono経由でPortMidiSharpを使って叩いてみることである。soさえ出来れば動くだろう。と思いたい。

creating portmidi.dll

| No Comments | No TrackBacks
portmidiというプロジェクトがある。従来ソフトウェアでMIDI音源をいじるときは、プラットフォーム中立なAPIが存在しなかったので、MIDIの再生ソフトウェアはどうしてもプラットフォーム別になりがちだった。VideoLANのフォーラムでも、MIDIはプラットフォーム中立じゃないからサポートできんよ、という話が2008年あたりでもまだ書かれていたりする。これではクロスプラットフォームなMIDIサポートを実現するソフトウェアがなかなか登場しない。

そんな問題を解消できそうなのがこのportmidiだ。これは旧portaudio、現portmediaプロジェクトの一環として開発されている。Cベースの実装と、その各種言語ラッパーからなる。

このportmidiをC#ラッパー経由で叩こうというのが、とりあえずの目標である。そんなのはP/Invokeすれば一発である。というわけでとりあえずラッパーを作った。
PortMidiSharp.cs

しかし...

portmidiは、それなりに長いプロジェクトのはずなのに、現在まだまだ開発中で、まだビルドもちゃんと出来ていない。P/Invokeはsoやdllに対して行われるので、まずこれらをビルドしなければならないのだが、現状ではstaticライブラリしかビルドできないのである。Debianにはこれらの共有ビルドが含まれていて、それはちゃんと本家にbackportしてくれとか思うのだけど、しないなら仕方がない。できればこの辺をどうにかして改善してしまいたい。具体的には、Linux上ではshared libraryのビルドを、Windows上ではgcc/mingwを使ったビルドを、それぞれサポートしたい。

というわけで、本当ならautotoolsを使えばその辺は上手く出来るのだろうけど、まずそれよりgcc/mingwでdllをビルドするところを、とりあえずはやってみた。

portmidiには、porttimeとportmidiという2つのライブラリがある。ようだ。staticライブラリだと最終的にlibportmidi.aに全部含まれるし、一方でlibporttime.aもあるわけで、porttime.dllを別途生成する意味があるかどうかは分からないが、とりあえずportmidi/trunk/porttimeディレクトリで以下を実行:

gcc -mno-cygwin -mwindows -c porttime.c -o porttime.o
gcc -mno-cygwin -mwindows -c ptwinmm.c -o ptwinmm.o
dllwrap --target i386-mingw32 --export-all --output-def porttime.def --implib libporttime.a --driver-name gcc -mno-cygwin -mwindows -o porttime.dll porttime.o ptwinmm.o -lwinmm


これでporttime.dllが生成される。次にportmidi/trunk/pm_winディレクトリで以下を実行:

gcc -mno-cygwin -mwindows -c -o pmwin.o -I ../pm_common -I ../porttime pmwin.c
gcc -mno-cygwin -mwindows -c -o pmwinmm.o -I ../pm_common -I ../porttime pmwinmm.c
gcc -mno-cygwin -mwindows -c -o portmidi.o -I ../pm_common -I ../porttime ../pm_common/portmidi.c
gcc -mno-cygwin -mwindows -c -o pmutil.o -I ../pm_common -I ../porttime ../pm_common/pmutil.c
dllwrap --target i386-mingw32 --export-all --output-def portmidi.def --implib libportmidi.a --driver-name gcc -mno-cygwin -mwindows -I ../pm_common -I ../porttime pmwin.o pmwinmm.o portmidi.o pmutil.o -lwinmm -L../porttime -lporttime -o portmidi.dll


これでportmidi.dllが出来る。

コマンドラインにどれだけ余計なものが含まれているかは未検証だけど、この辺はLinux上でsoを作ってautotoolizeした時に再訪したい。

とりあえず先のPortMidiSharp.csと合わせてサンプルをビルドして実行してみた:



using System;
namespace PortMidiSharp
{
	public class Driver
	{
		public static void Main ()
		{
			Console.WriteLine (MidiDeviceManager.DeviceCount);
			Console.WriteLine (MidiDeviceManager.DefaultInputDeviceID);
			Console.WriteLine (MidiDeviceManager.DefaultOutputDeviceID);
			foreach (var dev in MidiDeviceManager.AllDevices) {
				Console.WriteLine (dev.IsInput);
				Console.WriteLine (dev.IsOutput);
				Console.WriteLine ("IF: " + dev.Interface);
				Console.WriteLine ("Name: " + dev.Name);
			}
			var o = MidiDeviceManager.OpenOutput (MidiDeviceManager.DefaultOutputDeviceID);
			o.Close ();
		}
	}
}
実行結果:

$ mono test.exe 2 -1 0 True False IF: Name: True True IF: Name: !!!NoError pm_winmm_term called pm_winmm_term exiting
表示内容がおかしすぎるわけだが、なんとかP/Invokeできてはいるようだ。pm_winmm_termとか呼ばれているようだし。とりあえずめでたしめでたし。

start

| No Comments | No TrackBacks
ここにはささいな調べ物とかをまとめていくことになると思う。

About this Archive

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

February 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