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

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

TiMidity++をWineのMIDIデバイスとして使用する

(2016/1/15)本記事は主にTiMidity++の音源と設定についてを扱っている。Wine関係については「WineにおけるMIDIデバイスの扱い」を参照。

Wineの設定(winecfg)から、オーディオをALSAライブラリ経由で出力する設定にすることで、ALSAMIDIバイスをそのままWineの中のMIDIバイスとして使用できる。
ハードウェアMIDI音源があって、ALSA用のMIDIプレーヤーからMIDIデータの再生ができる状態であれば、普通にWineでアプリケーションを起動させればよいのだが、MIDI音源が無い場合、TiMidity++ALSA MIDIバイスとして動作させることで、Wineの中からソフトウェアMIDIバイスとして使用することが可能。

  1. 音源データの選択
  2. Eawpatchesの入手
  3. Eawpatchesの設定(Gentoo Linux以外)
  4. TiMidity++の設定(Gentoo Linux)
  5. TiMidity++の設定(Debian/Ubuntu)
  6. TiMidity++をALSA MIDIデバイスとして動作させる
  7. TiMidity++の設定を使い分ける
  8. 問題点(TiMidity++自体とは関係がない)

音源データの選択

TiMidity++は、「サウンドフォント」という種類の(ものによっては)巨大な音源データを使用することで、比較的高品質な音を出すことができるのだが、これはメモリを非常に多く使用する上に、CPUにも結構負荷をかけてしまうため、例えばゲームのBGMにMIDIデータを使用しているような場合には適さない。そうでなくても、メモリ使用量や遅延がネックになって、結構厳しいのではないかという気がする。
そこで、データのサイズが小さく、動作も軽い割に、音もバランスも良い「Eawpatches」を選択することにする。
(2008/3/21)EawpatchesをベースにしたEawplusについてを「Eawplus音色セット(GUS/patch)について」にまとめた。
(2008/4/9)サウンドフォントを使用する場合は「TiMidity++でサウンドフォントを使用するための設定ファイルを自動生成するツール(cfgforsf)について」のツールで設定ファイルを自動生成し、必要に応じて編集して使用する。

Eawpatchesの入手

残念ながら、一次配布元にはアクセスできない。Gentoo Linuxではパッケージが用意されているので、

$ sudo emerge -av timidity-eawpatches

でインストールされるのだが、他のディストリの場合、TiMidity++本体やfreepatsはあったりしてもEawpatchesはパッケージ化されていないことが多い。そこで

のいずれかの方法で取得する。後者については次のようにコマンドを実行すればよい。

wget http://web.archive.org/web/20031208184211/http://www.stardate.bc.ca/eawpatches/eawpats12.rar
seq -f "http://web.archive.org/web/20031208184211/http://www.stardate.bc.ca/eawpatches/eawpats12.r%02g" 0 16 | wget -i -
mkdir eawpatches
unrar x *.rar eawpatches
rm eawpats12.* -f

Eawpatchesのディレクトリは、後で場所を指定するので、忘れない場所に配置しておく。ここでは、Gentoo Linuxのパッケージにならって/usr/share/timidity/eawpatches/というディレクトリに移動するものとする。

$ sudo mv eaw* /usr/share/timidity/eawpatches

Debian/Ubuntuでは、freepatsの配置場所(/usr/share/midi/freepats)にならって、以降/usr/share/midi/eawpatches/に読み替えるとよい。
(2008/12/4)その後、「TiMidity++向けの音色パッチ(EawpatchesとEawplus)のRPMパッケージを作成」でMandriva Linux向けのRPMパッケージを作成している。設定ファイルについては下の記述とは異なるので、リンク先の記事の説明を参照。

Eawpatchesの設定(Gentoo Linux以外)

eawpats12_full.tar.gzをダウンロードした場合と分割ファイルをダウンロードした場合とで、含まれているtimidity.cfgの場所と内容が異なる*1のだが、以下の内容のtimidity.cfgを用意*2すればよい。Gentoo Linuxの場合、「timidity-eawpatches」パッケージをインストールするとここまで自動でやってくれる。
ファイル名: /usr/share/timidity/eawpatches/timidity.cfg

dir /usr/share/timidity/eawpatches
source gravis.cfg
source gsdrums.cfg
source gssfx.cfg
source xgmap2.cfg

TiMidity++の設定(Gentoo Linux)

Gentoo Linuxの場合、eselectのtimidityモジュールにより、別の音色パッケージとの切り替えができるようになっているため、「eawpatches」が有効になっていることを確認。/etc/timidity.cfgはいじらないで以下の内容のままにしておく。

dir /usr/share/timidity
dir ~/.timidity
source current/timidity.cfg

TiMidity++の設定(Debian/Ubuntu)

(2007/6/16)/etc/timidity/timidity.cfgから、freepatsの設定をコメントアウトした上で、Eawpatchesの設定を読ませる記述を追加。更に、ホームディレクトリ以下にユーザごとの設定を置けるようにしておくと便利かも。
[diff]ファイル名: /etc/timidity/timidity.cfg

-source /etc/timidity/freepats.cfg
+# source /etc/timidity/freepats.cfg
+dir ~/.timidity
+source /usr/share/midi/eawpatches/timidity.cfg

TiMidity++をALSA MIDIバイスとして動作させる

$ timidity --sequencer-ports=2 -iA

を実行すると、Ctrl+Cなどで止めるまで、表示されたMIDIポート番号で、ALSA対応のMIDIプレーヤーやMIDIシーケンサで使用できるようになる。確保されるMIDIポートの数のデフォルトは4だが、ここでは2に指定している。ALSA MIDIポートの一覧表示には、alsa-utilsに含まれるaplaymidiが便利。pmidiというパッケージでも同様のことができる。ハードウェアMIDI音源がある場合には、それも一緒に表示される。

$ aplaymidi -l
 Port    Client name                      Port name
 20:0    SC-8820                          SC-8820 Part A
 20:1    SC-8820                          SC-8820 Part B
 20:2    SC-8820                          SC-8820 MIDI
128:0    TiMidity                         TiMidity port 0
128:1    TiMidity                         TiMidity port 1

この場合、TiMidity++からMIDIファイルを再生させるには

$ aplaymidi -p 128:0,128:1 (MIDIファイルの場所)

と実行する。この場合、2ポートまで演奏ができる。

$ timidity --sequencer-ports=2 -iAD

のように、後ろにDオプションを付けて実行させると、バックグラウンドで動作するので、常用する場合、ログイン時の自動起動スクリプトに記述させるとよいかも知れない。
また、--realtime-priorityオプションで、値に0から100までの値をセットすることで、SCHED_FIFO方式で優先度を指定できるが、一般ユーザ権限では優先度は変更できない。
(2008/1/31)一般ユーザの場合、優先度は変更できるが、
ファイル名: /etc/security/limits.conf

@audio - rtprio 90
もしくは
[ユーザ名] - rtprio 90

のように、リアルタイム優先度の許可をする設定を記述する必要がある。上の場合、--realtime-priority=90まで指定でき、91以上は指定できない。

TiMidity++の設定を使い分ける

上では、軽めのEawpatchesを使用しているが、サウンドフォントを使用して、高音質な音で再生させたり、オーディオファイルへの変換を行ったりしたいことも出てくる。その際には、-c(--config-file)オプションを使い、別の設定ファイルを指し示すようにすることで、Eawpatches用(Wineでの使用を想定)とサウンドフォント用設定(MIDIファイル観賞やオーディオ変換を想定)とを使い分けることができる。
例として、[ホームディレクトリ]/.timidity/custom/以下に設定ファイル群があるとした場合、

$ timidity -c ~/.timidity/custom/timidity.cfg (MIDIファイルの場所)

のように実行する。一例として、シェルのエイリアス

alias timidity-sf='timidity -c ~/.timidity/custom/timidity.cfg'

のように設定しておくと便利かも。

問題点(TiMidity++自体とは関係がない)

(2007/6/16)WineALSAMIDIバイスを使用してMIDIデータの再生をすると、システムへの負荷状況により、再生が詰まったり途切れたりすることがあるが、これは、TiMidity++を使用せず、ハードウェアMIDI音源を使用していても、Wineの中で使用している限りは発生する。ALSAMIDIプレーヤーでMIDIデータを再生する場合は問題なく再生される。
(2007/6/17)この問題は、Wine 0.9.39に上げたところ、多少改善されたように感じる。完全ではないが、テンポが乱れることなく、以前より安定してMIDIデータを再生できるようになった気がする。*3「Several improvements to the sound support.」と公式サイトにコメントがあるが、この改善は非常に嬉しい。これでGUIMIDIプレーヤーとしてWine+TMIDI Playerを使用したりもできそう。

使用したバージョン:

  • Wine 0.9.38, 0.9.39

*1:前者の場合、Windows用とGNU/Linux用の設定ファイルがそれぞれwinconfiglinuxconfigというディレクトリに含まれていて、音色ファイルの場所の指定の部分だけが異なっている。後者の場合は前者のwinconfigに含まれているほうのtimidity.cfgが置かれている

*2:一般ユーザでは書き込み権限がないため注意

*3:PCM音声の再生の場合、ハードディスクへのアクセスが激しいときの音切れは起きるが、以前よりは良くなっているかもしれない