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

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

STed2上の演奏と独自インターフェースについて(VirMIDIとrcpplayを使用した例・後半)

STed2上の演奏と独自インターフェースについて(VirMIDIとrcpplayを使用した例・前半)」の続き。

  1. STed2上の設定
  2. STed2上の操作
  3. ポート接続の他の形(好みの問題)
  4. 注意点(仕様)
  5. ALSA MIDI(実)デバイスを使用する場合の覚え書き

STed2上の設定

問題がなければ、STed2の設定ファイルの外部プレーヤの設定を更新し、他の「player」行があれば、行頭に「*」を付けてコメントにする。
ファイル名: ~/.sted2rc

#player=1,rcpplay --dev0 /dev/snd/midiC2D0 --dev1 /dev/snd/midiC2D1

「#player=1」の数字部分はプレーヤの種類を知らせるのに必要で、パッチ済みTiMidity++ 1と同様、「3」ではうまくいかず、「1」指定で動作した。コマンド名はrcpplayにする。

STed2上の操作

再生位置の表示はできたが、一時停止はできなかった。音色テストなども、TiMidity++ 1と同様に機能していない。

ここまでの作業を行えば、TiMidity++ 2を使用してSTed2上で

  • 2ポートまでの演奏
  • 演奏位置表示
  • 演奏モニタ
  • リアルタイムでのトラックミュート/ミュート解除

が全て行える。

ポート接続の他の形(好みの問題)

もし、下のように

ASeqView経由でTiMidity++に接続するのが気に入らなければ、その代わりに

  • VirMIDIの0番 > TiMidity++の0番
  • VirMIDIの1番 > TiMidity++の1番

というポート接続を行い、下のように、「VirMIDIの出力ポートからTiMidity++ASeqViewへ分岐する」形にすることもできる。

更にASeqViewが不要なら、ASeqViewを起動せずに、ポート接続を上の2つのみにすればよい(画像は割愛)。
ポート接続の手動操作はaconnectというコマンドで行うこともできるが、作業を自動化するのでなければ、GUIQjackCtl(http://qjackctl.sourceforge.net/)を使用するのが分かりやすくておすすめ。

注意点(仕様)

以下の動作は仕様となる。

  • TiMidity++上の音の鳴りと画面上の表示には少し「ずれ」が起こる。
  • TiMidity++のポートがどこか*1と接続している間は「データ再生中」扱いで、音を出さなくてもTiMidity++がCPUを使用し続ける。

ALSA MIDI(実)デバイスを使用する場合の覚え書き

実デバイスを使用している場合、/dev/midi[カード番号]/dev/snd/midiC[カード番号]D0が直接使用できるが、(手元のSC-8820では)これらのデバイスを使用中には

$ 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
$ aplaymidi -p 20:0 [midファイル]
Cannot connect to port 20:0 - Resource temporarily unavailable

上のように、ALSAのポートが一時的に使えなくなるため、これが問題になる場合、

「VirMIDI > 音源」という接続を作成し、Raw MIDIバイスを指定する側が/dev/snd/C[カード番号]D[デバイス番号]を指定することで、ALSAのポートも使用できるようになる。
複数ポートを同時に使用する演奏に関しては、提供されるデバイスファイルが1つ(下の例では/dev/snd/midiC1D0)なのでできないようにも見えたが、

$ smfplay --dev0 /dev/snd/midiC1D0 --dev1 /dev/snd/midiC1D0 [midファイル]

のように、同一のデバイスファイルを指定することでできた*2ため、複数ポート演奏目的でVirMIDIを使用する必要はなさそう。
なお、

$ smfplay --dev0 /dev/midi1 --dev1 /dev/midi1 [midファイル]

ではうまくいかなかった。

使用したバージョン:

  • ALSA 1.0.15, 1.0.16
  • TiMidity++ 2.13.2(2.13.2-r5)
  • ASeqView 0.2.8

*1:ASeqViewもしくはVirMIDI

*2:VirMIDIから音源への接続があると、このデバイスファイルを指定しても再生されず、逆に、Raw MIDIバイスファイルを使用しているときには、VirMIDIと音源とを接続することはできなかった