## HOWTO Use MIDI Sequencers With Softsynths

Feb 24 2002
Frank
Barknecht

    barknech@ph-cip.uni-koeln.de

小林
雅典
日本語訳

         zap03216@nifty.ne.jp

Apr 04 2002

この HOWTO では、MIDI 受信可能なソフトウェアシンセサイザを、 MIDI シーケンサから ALSA 0.9 の仮想的な MIDI 接続経由で制御する際に 必要となる設定を述べます。本文書は自由に翻訳や配布が可能です。 GNU Free Documentation License で公開されています。

## はじめに

Csound, PD, jMax, Spiral Synth Modular のようなソフトウェアシンセサイザは、 既知や未知、尋常もしくは奇抜な音響体験を創造するほとんど無限の自由を提供します。 ソフトウェアシンセサイザは、高価なハードウェアシンセサイザや、 安価なサウンドカードの、音質が悪いことが多い MIDI シンセサイザ機能 (いずれにしても Linux でサポートされていればですが) を置き換えることもできます。一方、それらの ソフトウェアシンセサイザを使って作曲するのは退屈な作業になることもあります― たとえば Csound では、表計算ソフトのような作法で果てしない数列を記述しなくては ならないのです。これは、音楽を作るのに快適なやりかたではありません。

MIDI シーケンサアプリケーションは、こういった作業により適しています。 シーケンサは、音符を挿入したりデータを制御したりするインタフェースを 使いやすいやりかたで―楽譜の音符、ピアノロールのマーク、MIDI イベントのリストといった好みに応じた表現方法で―提供します。 他の種類の MIDI シーケンサには、音符を入力するのにトラッカーのような ステップ入力方式を提供するものがあります。 多くの人達が、このやりかたがシーンでの最先端だった 古き良き時代から慣れ親しんでいる方式です。 最後に、忘れてはならない方式があります。 MIDI シーケンサの中には、鍵盤や他の物理デバイスでの演奏を記録できるものもあります。 これは、多くのユーザにとって最も自然な作曲方法です。

ところで、MIDI シーケンサは、通常は音符を MIDI デバイスに出力します。 普通、MIDI イベントを世界の外側―すなわちハードウェアシンセやサンプラー― に送信するということです。でも仮想 MIDI デバイスを使えば、MIDI データを コンピュータの内側にキープし、同じマシンで実行している他のソフトウェアを 制御させることができます。 この HOWTO では、この目的に達するために必要なすべてを述べます。

## デバイスの設定

この 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 モジュールをロード しなくてはなりません。手動で試験的にロードできます:

### 訳注

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` で確認できるはずです:

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

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

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

表示されたデバイス群は、/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 ポートにアクセスできるのを確認するには:

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

### 訳注

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

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

## MIDI イベントのルーティング

### aconnect

仮想 MIDI カードの作成と設定をした上で、さらなる準備をしないと、 MIDI イベントをシーケンサからソフトシンセに送信することはできません。 そのためには、最初にふたつのポートを―ご想像通り― aconnect ユーティリティで接続する必要があります。このツールはふたつ、 もしくはそれより多くのポートを接続します。-i と -o が 使用可能なポートを表示するオプションであることは、すでに以前説明した通りです。 簡単な構文で、これらのポートを一方向に接続することができます。

この例では、port 80:0 に送信されたすべての MIDI データを port 80:1 に向けてルーティングします。 本文書の構成だと、/dev/midi20 に入ってきたすべてのイベントは /dev/midi21 に送信されることになるので、/dev/midi21 から 他のアプリケーションはその MIDI イベントを読む(受信する) ことができます。

VirMIDI カードをカード index 1 であるふたつ目のカードとして設定した場合、 これらのポートが存在するはずです:

この時点で、たとえばポート 72:0 (/dev/midi10) からポート 73:0 (/dev/midi11) に接続できます:

aconnect で -lo や -li オプションを使うと、接続状況を 表示できます:

'Virtual Raw MIDI 1-0' が現在 'Virtual Raw MIDI 1-1' に接続されている ことが分かります。この時点で、'Virtual Raw MIDI 1-0' に送信された MIDI データを 'Virtual Raw MIDI 1-1' から読み出すことができます。 OSS 互換デバイスだと、/dev/midi10 に送信された MIDI データは /dev/midi11 への経路をとり、/dev/midi11 から読み出すことができます。 どちらを使うかは、お使いのアプリケーションによります。

ふたつ以上のポートを、ひとつのポートに接続することもできます。 以下のように aconnect を二度実行すると:

/dev/midi10 に送信したのと同じデータを、/dev/midi11 と /dev/midi12 で同様に受信できます。当然、もっとたくさんの仮想 MIDI カードを作成し、 それらをでたらめに接続した場合は、本当にマシンを酷使することになります。 もうわたしたちを止めるものはなにもありません…

すべてのポートの接続を切るには:

接続をひとつだけ切るには:

### ALSA MIDI Patch Bay

Bob Ham 作の ALSA MIDI Patch Bay は、ALSA の MIDI 接続の設定をするのにとても有用なグラフィック フロントエンドです。使い方はとても簡単で直感的です: 左側は MIDI イベントを送信可能な MIDI ポート群で、もう一方の 右側には受信可能な MIDI ポート群があります。左側のポートを クリックすると、次にクリックする右側のポートへの新たな接続が できるようになります。右側のポートをクリックすると、その ポートが接続されている場合はそれを切ります。 本 HOWTO を余計なものにしてしまいかねないくらいクリーンで 簡単なツールです. ;)

#### ALSA Midi Patch Bay

### aseqview

#### aseqview

MIDI イベントをルーティングするためのもうひとつの有用なツールが、 ALSA 開発者岩井隆さん作の aseqview です。岩井さんのホームページ http://members.tripod.de/iwai/alsa.html でダウンロードできますが、多くのディストリビューションにも含まれています。 このグラフィカルなユーティリティは、コンピュータを 通過する MIDI イベントを眺めたり変更したりする目的で設計されましたが、 aconnect のように、 異なる MIDI ポートにイベントをルーティングすることもできます。 aconnect では時に操作できないこともある OSS シーケンサデバイスを使うアプリケーションを扱わなければならない時に、 aseqview は有用です。コマンドラインオプションなしで aseqview を 起動すると、きれいな GUI と新たな MIDI ポートが手に入ります。 デフォルトは port 128:0 です。このようになります:

このポートを使って、これまで説明してきた aconnect の作業すべてが可能です。 でも、aseqview のポートを別のポートに接続することだけが必要なら、 -d オプションを使えば、aseqview だけで実現できます:

ちょうど aseqview の起動時から、(使用可能であれば) port 128:0 から port 73:0 に接続がなされます。

## アプリケーション

最後のこの節では、様々なアプリケーションでの仮想 MIDI 接続の使いかたを、いくつかの 実例で説明します。システムの中で、仮想 MIDI カードが三つ目のカードになっていて、 ALSA MIDI ポートの 80:0 から 83:0 までが、raw OSS MIDI デバイスの /dev/midi20 から /dev/midi23 や、ALSA raw MIDI デバイスの /dev/snd/midiC2D0 から /dev/snd/midiC2D3 と一致する環境を仮定します。 これらのうち、最初のふたつが 'aconnect' されています:

これまで説明してきたとおり、これはつまり /dev/midi20 (もしくは port 80:0 もしくは /dev/snd/midiC2D0) に送られたすべての MIDI データは、/dev/midi21 (もしくは port 80:1 もしくは /dev/snd/midiC2D1) で読めていることを意味しています。

### シーケンサ

#### MusE

MusE は、Werner Schweerによって作られた完全な MIDI シーケンサです。 http://muse.seh.de で入手できます。 “Config->Midi Ports” セクションで、 仮想 MIDI ポートを出力ポートとして設定する必要があります。 MusE では、指定するポートは ALSA での名前 'VirMIDI X-X' です:

##### MusE - MIDI Device Configuration

ここで、出力ポートに正しいポートを選んでいるか確認してください。 つまりその MIDI イベントを受信・演奏させたい ソフトウェアシンセサイザが待ち受けているチャンネルです。

##### MusE - Trackview

どういうわけか、筆者は MuSE 0.4.9 で、'VirMIDI 2-0' を出力デバイスとして 使うことができませんでした。'VirMIDI 2-1' で受信したい時、 'VirMIDI 2-0' デバイスに送信したかったのですが、そのふたつを 逆にして使わなくてはならなかったのです。 多分筆者がまぬけなせいなのでしょうが、筆者には原因が分からないので、 あなたはちょっと実験をしなくてはならないかもしれません。 midi02 や midi2 形式のデバイスを使うことも可能でしょう。

#### ttrk

Billy Biggs 作の ttrk は、シンプルで軽く安定した MIDI シーケンサで、 トラッカーのようなステップ入力のインタフェースを備えています。 このシーケンサは、MIDI データを &dollar;HOME/.ttrkrc ファイルで設定された MIDI ポートに送信することができます。

ttrk が /dev/snd/midiC2D0 に送信するようにするには、次の行を &dollar;HOME/.ttrkrc ファイルに書いてください。

これで設定完了です...

#### Shaketracker

Juan Linietsky 作の Shaketracker は、MIDI 上でトラッカーのインタフェースを復活させました。 その点は ttrk 同様ですが、Shaketracker は、古典的なトラッカーの エフェクトを MIDI データに、より完璧に変換します。 あいにく、MIDI 出力には raw MIDI デバイスではなく OSS シーケンサデバイス (/dev/sequencer) が使われるので、筆者は aconnect を用いて動作させることが できませんでした。でも aseqview を使うなどすれば回避は可能です。 Shaketracker を起動する前に aseqview を起動すれば、 Shaketracker は aseqview のポートを認識し、それを使います。 必要な作業は、Shaketracker の 'User Devices' セクションで そのポートを選ぶだけです。'User Devices' セクションでは ALSA での名前 'Viewer Port 0' として表示されます:

##### Shaketracker - User Device Selection

このユーザデバイスに、'Null Output' のかわりに分かりやすい名前をつけると便利です。

aseqview を、コマンドラインオプションなしで起動した場合、 aseqview のポートをソフトシンセのポートと aconnect する必要が あります。でも、以前説明したように、接続先ポートの指定つきで直接 aseqview を起動することもできます。ソフトシンセに送信する各トラックごとに、 この新たなユーザデバイスを使用するのを忘れないでください。 筆者はいつも小さなシェルスクリプトを用いて Shaketracker を起動します。これは aseqview を起動し、ポートが作られる時間を 待ち、それから Shaketracker を起動します:

### ソフトウェアシンセサイザ

#### Pure Data

Miller Puckette は、オープンソースのソフトウェアシンセかつマルチメディア 開発環境の Pure Data (PD) を生んだ天才です。PD は MAX から発展し、それが逆に MAX の拡張である MSP の基礎となりました。PD では MIDI イベントを読むのに raw MIDI デバイスを使うことができます。raw MIDI デバイスは '-midiindev <デバイスの番号>' オプションで指定します。 しかし、使用するデバイスを指定するやりかたにはいらいらさせられます。 次のような形式です: /dev/midi0 を使うには、PD を '-midiindev 1' オプションで起動します。/dev/midi1 を使うには '-midiindev 2' で、以下同様です。理解できましたか? このオプションでは、 実際のデバイス番号に 1 を足した数字を指定しなくてはならないのです。 別の例です: /dev/midi21 を使うには、'-midiindev 22' オプションで PD を起動します。

PD には 'Test audio and MIDI' という名のヘルプパッチが用意されています。 正しい MIDI デバイスを確認する上で、とても重宝します。

##### PD - MIDI Test Patch

#### Csound

Csound は、いまどきのソフトウェアシンセサイザほとんどの祖母にあたります。 そして、MIDI にも対応がなされています。 'csound --help' を実行すると、MIDI 入力デバイスの設定が必要な箇所を表示します:

よって本書の例では、Csound を以下のように起動する必要があります:

## おわりに

ここまでの説明で、MIDI シーケンサで作曲・再生した音楽を、 ソフトウェアシンセサイザの音で演奏する方法がお分かりになったと思います。 もちろん、aconnect や aseqview のようなツールは、必ずしも MIDI ソフトウェアシーケンサといっしょに使う必要が ある訳ではありません。外部のシーケンサや外部の MIDI キーボードから マシンに入ってきたイベントを、MIDI シーケンサを通さずに直接 ソフトウェアシンセにリダイレクトすることもできます。 外部の MIDI デバイスを、お使いのソフトシンセや、サウンドカードの オンボードシンセに 'aconnect' するだけでよいのです。 振り返っておさらい: PD, Csound, あるいは KeyKit のような環境では、 アルゴリズミックなやりかたで MIDI イベントを作成することができます。 アルゴリズミックな作曲は、古典的な Cubase ライクな MIDI シーケンサでは ほとんど不可能です。aconnect を使うと、生成された MIDI イベントを、 お使いの MIDI 受信可能なサウンドモジュールならどのようなものにでも ルーティングできます。

## 謝辞

筆者は、岩井隆さんに、この記事を準備するにあたっての技術的な援助と、 日本語に関する貴重なアドバイスをいただいたことを感謝します。 隆さん、ありがとう!

## 日本語版あとがき

原文の最新版は http://linux-sound.org/quick-toots/4-sequencers_and_softsynths/quick-toot-midisynth_howto.html に、あります。

翻訳にあたり貴重なアドバイスをいただいた、中野武雄さん、濱崎健さんに 感謝します。 (2003/08/09)