2. デバイスの設定

この HOWTO における設定では、 ALSA のライブラリとドライバモジュールを用います。なぜなら、ALSA は Linux で本格的にオーディオや MIDI を使う上での標準的な手段 (あるいはそうなるべき) だからです。 このチュートリアルでは、ALSA の 0.9.0 ブランチの使用を仮定します。 でも、仮想 MIDI のモジュールは ALSA 0.5.x にもあるので、 以下に述べるほとんどは ALSA 0.5.x でも同様に適応できるでしょう。 OSS/Free (2.5.x 以前のカーネルにあるサウンドモジュール)や OSS/Linux サウンドアーキテクチャでは v_midi モジュールが使えますが、 これは本文書の範疇ではありません。

ALSA の仮想 MIDI カードを使うには、snd-card-virmidi モジュールが存在して いなくてはなりません。最新バージョンの ALSA (や 2.5.x 開発版カーネル) では snd-card-virmidi は '-card' 接中辞(ミドルフィックス)が取り除かれ、snd-virmidi に名前を変えました。このモジュールをビルドしたことを確認してください。 実際に使っているカードのモジュールをビルドするように ALSA を configure しただけでは、おそらくこのモジュールはビルドされていないでしょう。

仮想 MIDI ポートを利用可能にするには、virmidi モジュールをロード しなくてはなりません。手動で試験的にロードできます:

$ modprobe snd-virmidi snd_index=1
  

訳注: alsa-driver 0.9.0rc4 以降、snd_index オプションは index に 名称変更されました。最新の alsa をお使いの場合は、index=1 と してください。

snd_index の値を、空いているカード index のひとつ目になるように設定します。 (カードがひとつだけなら、そのカードがすでに index 0 なので、 virmidi は index=1 に設定する) でも、仮想 MIDI カードが必要になった時に、自動的に設定がなされるように モジュールを設定すると、より便利です。そのためには、/etc/modules.conf (ディストリビューションによって、別の場所にあることもあります) の ALSA に関する箇所に、次の項目を追加します:

 # OSS の /dev/sequencer と /dev/music (別名 /dev/sequencer2)
 # をサポートするように設定する
 # 岩井隆さんが、これらのサービスをひとつ目のカード、
 # すなわち card 0 以外にエイリアスする必要はないと
 # アドバイスしてくれました
 alias sound-service-0-1 snd-seq-oss
 alias sound-service-0-8 snd-seq-oss

 # カード 1 (ふたつ目のカード) を仮想 MIDI カードに設定する
 alias sound-slot-1 snd-card-1
 alias snd-card-1 snd-virmidi

  

ここでは、お使いのサウンドカードのハードウェアがひとつと仮定し、 仮想 MIDI カードを index 1 であるふたつ目のカードとして設定しました (これはとても有用だと思います)。 もしあなたが筆者のようにふたつ目のサウンドカードをすでに お持ちなら、以下を読んで上記設定を変更してください:

 # カード 2 (三つ目のカード) を仮想 MIDI カードに設定する
 alias sound-slot-2 snd-card-2
 alias snd-card-2 snd-virmidi
  

もっと多くのカードをお使いでも、以上の説明を応用すれば何をやればいいかはもう お分かりですよね…

設定したら、ALSA サウンドシステムを再起動する必要があります。 その後、仮想 MIDI カードが /proc/asound/cards で確認できるはずです:

$ cat /proc/asound/cards 
0 [card0          ]: ICE1712 - M Audio Audiophile 24/96
                     M Audio Audiophile 24/96 at 0xb800, irq 5
1 [card1          ]: EMU10K1 - Sound Blaster Live!
                     Sound Blaster Live! at 0xc800, irq 11
2 [card2          ]: VirMIDI - VirMIDI
                     Virtual MIDI Card 1
  

筆者のマシンの例では、VirMIDI カードが index 2 である三つ目のカードに なっています。 この構成は、/proc/asound/devices [MIDI デバイスのみ表示される]では、次の raw MIDI デバイス群として 反映されます。

$ cat /proc/asound/devices 
  8: [0- 0]: raw midi
 41: [1- 1]: raw midi
 42: [1- 2]: raw midi
 75: [2- 3]: raw midi
 74: [2- 2]: raw midi
 73: [2- 1]: raw midi
 72: [2- 0]: raw midi
  

筆者の場合は、'2-' ではじまるデバイスが仮想 MIDI デバイスです。 お使いのシステムにあるハードウェアのサウンドカードがひとつだけなら、 '1-' ではじまるデバイスが仮想 MIDI デバイスになるでしょう。

ALSA に含まれている aconnect ユーティリティを使うと、 もっと分かりやすい一覧表が見られます。aconnect は 以後様々な用途で必要になるでしょう。-o (もしくは -lo) オプション付きで 実行すると、MIDI 出力が可能な MIDI デバイスを表示します。 また、-i オプション付きで実行すると、MIDI 入力が可能な MIDI デバイスを表示します:

$ aconnect -o
[...]
client 80: 'Virtual Raw MIDI 2-0' [type=kernel]
    0 'VirMIDI 2-0     '
client 81: 'Virtual Raw MIDI 2-1' [type=kernel]
    0 'VirMIDI 2-1     '
client 82: 'Virtual Raw MIDI 2-2' [type=kernel]
    0 'VirMIDI 2-2     '
client 83: 'Virtual Raw MIDI 2-3' [type=kernel]
    0 'VirMIDI 2-3     '
$ aconnect -i
[...]
client 80: 'Virtual Raw MIDI 2-0' [type=kernel]
    0 'VirMIDI 2-0     '
client 81: 'Virtual Raw MIDI 2-1' [type=kernel]
    0 'VirMIDI 2-1     '
client 82: 'Virtual Raw MIDI 2-2' [type=kernel]
    0 'VirMIDI 2-2     '
client 83: 'Virtual Raw MIDI 2-3' [type=kernel]
    0 'VirMIDI 2-3     '
  

表示されたデバイス群は、/proc/asound/dev ディレクトリツリーにある、 ALSA が提供する OSS 互換の raw MIDI デバイス群と一致します。 一例を示すと、/proc/asound/dev/midiC2D0 は、index 2 の 仮想 MIDI カードにあるひとつ目の MIDI デバイスです。 これは aconnect では Virtual Raw MIDI 2-0 と表示されます。 Debian では、これらのデバイスファイルは /dev/snd/ ディレクトリにも あり、旧来の OSS デバイスの場所である /dev/midiXX へ内部的に リンクされています。 シンボリックリンクを張った /dev/midiXX から ALSA の raw MIDI ポートにアクセスできるのを確認するには:

$ ln -s /dev/snd/midiC2D0 /dev/midi20
$ ln -s /dev/snd/midiC2D1 /dev/midi21
[...]
  

でも、これは必要不可欠ではありません。お父さんのマシンでやってはいけませんよ!

訳注: 最近の alsa では /proc/asound/dev が廃止され、/dev/snd 以下が 正式のデバイスファイルになりました。

ここまでで仮想 MIDI カードの作成と設定が完了しましたので、 他の MIDI デバイスと全く同様に、お使いのアプリケーションで使用することができます。 好みのシーケンサやシンセサイザのアプリケーションのきちんとした設定箇所に、 OSS 互換なら /dev/midi20 のような形式、ALSA MIDI ポートなら 80:0 のような 形式で、必要なデバイス名を記入するだけです。