試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

STed2上の演奏と独自インターフェースについて(概要と対応状況)

STed2上のMIDIデータの再生は、基本的に(子プロセスの)外部プレーヤに丸投げするだけで、演奏中の場所を表示したりもせず、再生の制御もできない。
しかし、これでは不便なので、STed2は、外部プレーヤと「協調動作」するためのインターフェースを持ち、これに外部プレーヤを対応させることで、ある程度の制御が行えるようになる。

[引用]ファイル名: sted2-20021104/contrib/timidity_interface/README.interface より

STed は、実際に MIDI 機器を操作する事は(ほとんど)ありません。
エディット中の演奏などは、外部の SMF/RCP player を呼び出す事により
行っています。このため、使用する MIDIバイス毎に ユーザー側で player を
用意することができ、より多くの環境に柔軟に対応する事ができるようになって
います。

通常 STed は、外部 player に対し内部演奏データを SMF ファイルの形で
渡し (player が RCP/R36 ファイルを解釈できる場合 (sted2.cnf で
設定される) は RCP ファイルの形で渡します)、外部 player にそのファイルを
演奏するよう指示 (fork) した後は、演奏を停止する / 演奏が停止するまでは
player に対する操作は一切行いません。放ったらかしです。
このため、通常の場合、一時停止などの player との通信が必要な処理は行うこと
ができません。

しかし player によっては、STed とのインタフェイスを持ち、演奏中の一時停止・
解除・演奏位置トレースなどの処理を行うことが出来ます。このインタフェイスは、
STed と player の間で共有メモリを介して情報を交換する事により実現されて
います。オリジナルである X680x0 でも、同様な方法で 専用 player(rcd.x) と
協調動作を行っていました。

対応プレーヤはsayleenと呼ばれるプレーヤ群(+ RCP/R36形式からSMF形式への変換ツール)に含まれるrcpplayと、パッチ済みTiMidity++ 1のみ。TiMidity++ 1向けのパッチはSTed2のソースに同梱されているが、本体は公式サイトの「Older package」にある(TiMidity++-1.3.9.tar.bz2がダウンロードできることを確認)以外は入手できなそう。
(2008/3/20)
http://www.onicos.com/staff/iz/timidity/
から普通に落とせる。
バージョン1.3.9に対するパッチ(sted2-20021104/contrib/timidity_interface/TiMidity++-1.3.2.patch)の適用は

$ tar jxf [TiMidity++-1.3.9.tar.bz2の場所]
$ cd TiMidity++-1.3.9/
$ patch -p1 < [TiMidity++-1.3.2.patchの場所]
patching file interface/Makefile.in
Hunk #1 succeeded at 198 (offset 1 line).
Hunk #2 succeeded at 224 (offset 1 line).
Hunk #3 succeeded at 701 (offset 7 lines).
patching file interface/sted_c.c
patching file interface.h.in
patching file timidity/controls.c
patching file timidity/controls.h
patching file timidity/playmidi.c
Hunk #3 succeeded at 2962 (offset 15 lines).
Hunk #4 succeeded at 3251 (offset 22 lines).
Hunk #5 succeeded at 3271 (offset 22 lines).
Hunk #6 succeeded at 3284 (offset 22 lines).
Hunk #7 succeeded at 3334 (offset 22 lines).
Hunk #8 succeeded at 3523 (offset 22 lines).
patching file timidity/playmidi.h
patching file timidity/rcp.c

のように成功するのだが、バージョン2系に対しては、ソースが結構変更されていて、簡単には適用できない。
TiMidity++にはダイナミックインターフェースという仕組みがあり、動的インターフェースのコードを外部の共有オブジェクトファイル(.so)にしてビルドして使用することができるのだが、TiMidity++ 2STed2サポートをダイナミックインターフェースとしてビルドしようとしても、

$ gcc -DHAVE_CONFIG_H -fpic -I../../sted2-20021104/sted2 -I../timidity -I../ -I../utils -I../libarc -c sted_c.c
sted_c.c:80: warning: initialization makes integer from pointer without a cast
sted_c.c:80: error: initializer element is not computable at load time
sted_c.c:80: error: (near initialization for 'sted_control_mode.flags')
sted_c.c:81: warning: initialization from incompatible pointer type
sted_c.c:82: warning: initialization from incompatible pointer type
sted_c.c:83: warning: initialization from incompatible pointer type
sted_c.c:84: warning: initialization from incompatible pointer type
sted_c.c:86: warning: initialization from incompatible pointer type
sted_c.c: In function 'play_mix_out':
sted_c.c:253: error: 'PlayMode' has no member named 'play_event'
sted_c.c:274: error: 'PlayMode' has no member named 'play_event'
sted_c.c:277: error: 'PlayMode' has no member named 'play_event'
sted_c.c:290: error: 'PlayMode' has no member named 'play_event'
sted_c.c: In function 'ctl_blocking_read':
sted_c.c:395: error: 'PlayMode' has no member named 'play_event'
sted_c.c: In function 'ctl_event':
sted_c.c:469: error: 'PlayMode' has no member named 'play_event'
sted_c.c:476: error: 'PlayMode' has no member named 'play_event'

このようになり、失敗する。このソースファイルだけでもTiMidity++ 2向けに修正しないと使用できず、ソースの対応のさせ方も、現状ではよく分からない。
(2014/10/2)一部URLを修正