The Linux MIDI-HOWTO By Phil Kerr, phil@plus24.com v1.20, May 2002 日本語訳: 小林雅典, zap03216@nifty.ne.jp v1.20j, 20 Dec 2003 この文書には Linux で MIDI を演奏したり作成するのに必要なハードウェア やソフトウェアおよびその手順が記述されています。 ______________________________________________________________________ 目次 1. はじめに 2. この文書の著作権 3. どこでこの文書を入手できるか 4. 謝辞 5. 免責 6. MIDI についての予備知識 7. MIDI デバイスの設定 7.1 ALSA 0.9 の手早いインストール法 7.2 レイテンシ 8. ソフトウェア 8.1 ドライバ 8.1.1 Alsa ドライバ 8.1.2 OSS 8.1.3 Notemidi 8.2 MIDI ファイルプレイヤー 8.2.1 KMid 8.2.2 Pmidi 8.2.3 TiMidity++ 8.3 シーケンサ 8.3.1 Brahms 8.3.2 Anthem 8.3.3 Jazz++ 8.3.4 Linux Ultimate Music Editor 8.3.5 Melys 8.3.6 MidiMountain Sequencer 8.3.7 MusE 8.3.8 Rosegarden 8.4 MIDI トラッカー 8.4.1 tektracker 8.4.2 ShakeTracker 8.5 ドラムエディタ 8.5.1 DrumPatterns 8.6 パッチエディタ 8.6.1 JSynthLib 8.7 ソフトウェアシンセ 8.7.1 Spiral Synth 8.7.2 UltraMaster Juno-6 8.7.3 Pure-Data (PD) 8.7.4 Csound 8.7.5 Bristol synthesiser emulator 8.8 プラグイン 8.8.1 xmms-midi 8.9 楽譜作成 8.9.1 Mup 8.9.2 Lilypond 8.10 開発 8.10.1 sfront 8.10.2 jMax 8.10.3 TSE3 8.10.4 KeyKit 9. MIDI を扱うプログラムの開発 9.1 例 1 9.2 例 2 9.3 例 3 10. ソフトウェアシンセサイザといっしょに MIDI シーケンサを使う 10.1 はじめに 10.2 デバイスの設定 10.3 MIDI イベントのルーティング 10.3.1 aconnect 10.4 グラフィカルな MIDI パッチベイ 10.4.1 aseqview 10.5 アプリケーション 10.6 シーケンサ 10.6.1 MusE 10.6.2 ttrk 10.6.3 Shaketracker 10.7 ソフトウェアシンセサイザ 10.7.1 Pure Data 10.7.2 Csound 10.7.3 おわりに 10.8 謝辞 11. 有用なリンク 12. フィードバック 13. 日本語版謝辞 ______________________________________________________________________ 1. はじめに この文書は、以下の項目を網羅しています。 o MIDI インタフェースの設定 o ソフトウェアシンセサイザの設定と使用 o MIDI ファイルの演奏 o シーケンサの使用 o 外部 MIDI 機器の制御 o MIDI でコントロールするソフトウェアベースの音響合成 o MIDI を使うプログラム例 2. この文書の著作権 この HOWTO 文書の著作権は 2002 Phil Kerr にあります。 「ソフトウェアシンセサイザといっしょに MIDI シーケンサを使う」章の著作 権は 2002 Frank Barknecht にあります。この文書は GNU フリー文書利用許 諾契約書の条件のもとで配布されています。本文書に付属しているはずです が、そうでない場合は、以下のサイトで入手できます。 . 3. どこでこの文書を入手できるか この文書の公式バージョンは Linux Documentation Project から入手できま す: この HOWTO の最新版があるホームページは です。 4. 謝辞 この HOWTO は Hideki Saito によって書かれた MIDI-SB mini-HOWTO の発展 版です。彼の Linux コミュニティーへの貢献に深く感謝します。この HOWTO 文書には現在、Frank Barknecht による 'HOWTO Use MIDI Sequencers With Softsynths' が含まれています。Frank に深く感謝します。この HOWTO に含 まれているプログラム例の多くは Linux Audio Developers (LAD) メーリング リスト由来のものです。プログラム例をこの文書に含めることを許可してくれ た彼らに深く感謝します。 5. 免責 この文書に記載されている情報は、自己責任にて用いてください。 筆者はこの文書の内容について、いかなる責任も負いません。この文書に記載 されている概念、実例、その他の内容については、完全な自己責任において用 いてください。 特記なきものすべての著作権は著作権者に帰属します。 この文書で使われる用語が、なんらかの商標やサービスマークの有効性を侵害 するとみなしてはなりません。 特定の製品名やブランド名を支持しているとみなしてはなりません。 大規模なインストール作業の前にシステムのバックアップを取ることと、一定 の間隔で定期的にバックアップを取ることを強く推奨します。 6. MIDI についての予備知識 MIDI とは、ハードウェアとソフトウェアのプロトコルがひとつのセットに なったもので、電子楽器が通信するために用いられます。最初に制定されたの は 1982 年のことで、事実上電子楽器間の標準通信手段になりました。このプ ロトコルはケーブルおよびインタフェースの物理的なハードウェア上のパラ メータを規定し、音楽や時間のデータを交換するための通信プロトコルのきち んと定義されたセットを提供します。 MIDI 以前にも、アナログの通信プロトコルやその後にできた初歩的なデジタ ルの通信プロトコルがいくつか存在しました。 1974 年ごろの最も初期のもの は、音符の情報を電圧として、あるキーボードから別のキーボードへと電線経 由で送信しました。その後、1980 年 から 1981 年に、ローランド社は初歩的 なデジタルのプロトコルである DCB を作成しました。 MIDI Manufacturers Association (MMA) は機器メーカーとの共同作業で、規格に従ったメーカー製 の機器すべてが互いに接続し通信できるようにする標準プロトコルと物理的な 接続規格を制定しました。 1985 年から MIDI インタフェースが家庭用コンピュータに姿を現しはじめ、 その後すぐにシーケンサのプログラムが登場しました。 7. MIDI デバイスの設定 MIDI デバイスはサウンドカードと一体になっていることもあれば、独立した デバイスになっていることもあります。外部 MIDI インタフェースは、シリア ルポートか USB ポートのどちらかに取り付けることができます。 最初にやるべきであり、なおかつ「最も重要な」ことは、お使いのカードがサ ポートされているかどうかチェックすることです! MIDI デバイスの設定法は、Linux ディストリビューションによって様々で す。よくサポートされているカードだと、OS のインストール時に設定できま す。 (訳注: 2.4 以前の)Linux カーネルには OSS ドライバが、2.5 のカーネルに は ALSA ドライバが含まれています。たいていのディストリビューションには (おもにサウンドカード向けの) 設定ツールが用意されています。でも、サウ ンドカードについている MIDI ポートを使うのなら、 MIDI ポート向けの設定 をする必要があるでしょう。Red Hat では sndconfig を、 SuSE では yast を、Mandrake では DrakConf を使います。 上記のツールでお使いの MIDI インタフェースを設定できない、もしくは問題 がある場合は、次の段階を踏むべきです。 lsmod で MIDI 関係のモジュールが表示されますか? OSS ベースのシステムで の典型的な出力はこのようなものです。 ______________________________________________________________________ [root@beatbox]# lsmod Module Size Used by lockd 32208 1 (autoclean) sunrpc 54640 1 (autoclean) [lockd] autofs 9456 2 (autoclean) usb-ohci 12624 0 (unused) usbcore 43632 1 [usb-ohci] hisax 470096 0 (autoclean) (unused) isdn 104208 0 (autoclean) [hisax] slhc 4544 0 (autoclean) [isdn] eepro100 16144 1 (autoclean) #---- Soundcard modules opl3 11376 2 mad16 7968 1 ad1848 16848 1 [mad16] sb 34752 1 [mad16] uart401 6384 1 [mad16 sb] sound 58368 0 [opl3 mad16 ad1848 sb uart401] soundlow 464 0 [sound] soundcore 2800 6 [sb sound] nls_cp437 3952 2 (autoclean) vfat 9408 1 (autoclean) fat 30432 1 (autoclean) [vfat] ide-scsi 7664 0 ______________________________________________________________________ mpu401, olp3, uart401, oss を探してください。 USB デバイスをお使いなら、USB モジュールがあるかどうかチェックするのを 忘れずに。 設定をチェックするには、sndstat ファイルを cat します: ______________________________________________________________________ [root@beatbox]# cat /dev/sndstat OSS/Free:3.8s2++-971130 Load type: Driver loaded as a module Kernel: Linux mega 2.2.17-21mdk #1 Thu Oct 5 13:16:08 CEST 2000 i686 Config options: 0 Installed drivers: Card config: Audio devices: 0: MAD16 WSS (82C930) (DUPLEX) Synth devices: 0: Yamaha OPL3 Midi devices: 0: Mad16/Mozart Timers: 0: System clock Mixers: 0: MAD16 WSS (82C930) ______________________________________________________________________ ここで MIDI デバイスが mad16 ひとつであることがわかります。上記 lsmod の出力にもリストアップされていましたね。 もし MIDI 関連のデバイスが見当らなければ、/etc/modules.conf ファイルの 内容をチェックしてみましょう。 ______________________________________________________________________ [root@beatbox]# cat /etc/modules.conf alias net-pf-4 ipx pre-install pcmcia_core /etc/rc.d/init.d/pcmcia start alias usb-interface usb-ohci alias parport_lowlevel parport_pc alias block-major-11 scsi_hostadapter pre-install plip modprobe parport_pc ; echo 7 > /proc/parport/0/irq alias scsi_hostadapter ide-scsi alias eth0 eepro100 alias eth1 hisax #---- Soundcard alias sound-slot-0 mad16 options sound dmabuf=1 alias midi opl3 options opl3 io=0x388 options sb support=1 options mad16 io=0x530 irq=5 dma=0 dma16=1 mpu_io=0x300 mpu_irq=7 joystick=1 ______________________________________________________________________ MIDI のモジュールがカーネルにロードされているかどうかを、/proc/modules を出力してチェックします。 ______________________________________________________________________ [root@mega /proc]# cat modules 0000-001f : dma1 0020-003f : pic1 0040-005f : timer 0060-006f : keyboard 0070-007f : rtc 0080-008f : dma page reg 00a0-00bf : pic2 00c0-00df : dma2 00f0-00ff : fpu 0170-0177 : ide1 01f0-01f7 : ide0 02f8-02ff : serial(auto) #---- MIDI device 0300-0303 : MPU-401 UART 0376-0376 : ide1 0388-038b : Yamaha OPL3 03c0-03df : vga+ 03f6-03f6 : ide0 03f8-03ff : serial(auto) 0530-0533 : MAD16 WSS config 0534-0537 : MAD16 WSS de00-de1f : Intel Speedo3 Ethernet f000-f007 : ide0 f008-f00f : ide1 ______________________________________________________________________ あなたのところでも、上記に似た結果になったはずです。そうでなければ、 MIDI ドライバをインストールする必要があります。 ALSA 0.5x ドライバを使うのはやめたほうがいいですが、どうしても使う予定 があるなら、下記リンクで入手できる Valentijn Sessink 著の Alsa-sound- mini-HOWTO をよく読むことをおすすめします。 バージョン 0.9 より新しい ALSA を使うことを、強く推奨します。 0.9 より 後の ALSA ドライバ向けには、Madhu Maddy 著の ALSA-HOWTO をよく読むとよ いです。 7.1. ALSA 0.9 の手早いインストール法 以下は、ALSA 0.9 ドライバと、たいていの MIDI アプリケーションが必要と するライブラリをとても手早くインストールする手順です。 ______________________________________________________________________ [root@beatbox] # tar jxvf alsa-driver....tar.bz2 [root@beatbox] # cd alsa-driver..... [root@beatbox] # ./configure messages - no errors [root@beatbox] # make messages - no errors [root@beatbox] # make install messages - no errors [root@beatbox] # ./snddevices ______________________________________________________________________ 次に、/etc/modules.conf を編集する必要があります。もしくは、ディストリ ビューションによっては、modules ディレクトリにある ALSA 向けファイルを 編集する必要があります。 他にも、MIDI 以外のデバイス向けのエントリがあるかもしれないので、ファ イルを編集する際は注意してください。典型的なシステムには、ファイル中に 古い ALSA か OSS の設定があるかもしれないので、消すか、コメントアウト する必要があります。 以下は modules.conf ファイル中の、典型的な OSS 互換 ALSA の設定箇所で す。 ______________________________________________________________________ alias char-major-116 snd alias char-major-14 soundcore alias snd-card-0 (MIDI/サウンドカード) alias sound-slot-0 snd-card-0 alias sound-service-0-0 snd-mixer-oss alias sound-service-0-1 snd-seq-oss alias sound-service-0-3 snd-pcm-oss alias sound-service-0-12 snd-pcm-oss ______________________________________________________________________ (MIDI/サウンドカード) のエントリをお使いのカードのものに変更します。こ この情報は通常、ALSA のウェブサイトで見つかります。 ALSA ドライバをインストールしたら、次に ALSA ベースのプログラムに必要 なヘッダとライブラリファイルをインストールする必要があります。これは、 alsa-libs パッケージに含まれています。 ______________________________________________________________________ [root@beatbox] # tar jxvf alsa-libs....tar.bz2 [root@beatbox] # cd alsa-libs..... [root@beatbox] # ./configure messages - no errors [root@beatbox] # make messages - no errors [root@beatbox] # make install ______________________________________________________________________ お使いのシステムの設定が完了しました :) 簡単な C のプログラムで、設定がうまくいったかチェックできます。コンパ イルと実行ができたら、システムはうまくいっているはずです。 ______________________________________________________________________ // Compile this test program like so: gcc alsatest.c -o alsatest -lasound #include #include int main (int argc, char *argv[]) { snd_seq_t *seq_handle; if (snd_seq_open(&seq_handle, "hw", SND_SEQ_OPEN_DUPLEX, 0) < 0) { fprintf(stderr, "Error opening ALSA sequencer.\n"); exit(1); } printf("The ALSA libraries are installed.\n"); return 0; } ______________________________________________________________________ 7.2. レイテンシ MIDI はリアルタイムのプロトコルなので、レイテンシは重大な問題です。 現在、応答時間短縮のための作業をしている何人かの開発者がいます。カーネ ルの応答時間が短縮されると、Linux は MIDI 向けのすばらしいプラット フォームになっていきます。 標準の Linux ディストリビューションでも満足に動作するかもしれません が、プロ向けの機器にはロウレイテンシパッチをあてるべきです。 より詳細な情報はここで入手できます: ロウレイテンシ Mini Howto 8. ソフトウェア Linux ベースの MIDI システムへの関心が高まるにつれて、このリストは入手 可能な MIDI ソフトウェアの正確な数をたぶん反映しなくなっていくでしょ う。でも、アプリケーションの妥当な選択にはなっているはずです。もしあな たが他の、ここにリストアップされていない MIDI アプリケーションを開発し ている、もしくはご存知ならば、著者にメールをください。 8.1. ドライバ 8.1.1. Alsa ドライバ Advanced Linux Sound Architecture は、いくつかの部分で構成されていま す。まず第一に挙げられるのは完全にモジュール化されたサウンドドライバ で、モジュールの自動ロード、devfs、isapnp の自動設定をサポートし、オー ディオハードウェアのアナログオーディオ、デジタルオーディオ、コントロー ル、ミキサー、シンセサイザ、DSP、MIDI、タイマーといった各部分への完全 なアクセスができるようになります。また、完全なカーネルレベルでのシーケ ンサ、OSS/Free アプリケーションのための完全な互換性を提供するレイ ヤ、ALSA カーネルドライバのアプリケーション向けの機能 (クライアント/ サーバ、プラグイン、PCM シェアリング/マルチプレクシング, PCM メータリ ングなど) をカバーし強化するオブジェクト指向の C ライブラリ、ドライバ を対話的に設定するプログラム、基本的な管理を行なういくつかのシンプルな ユーティリティも含まれています。 8.1.2. OSS OSS は Linux と FreeBSD でたいていの一般的なサウンドカード向けのサウン ドカードドライバを提供します。ドライバは、サウンドカードのデジタルオー ディオ、MIDI、シンセサイザ、ミキサーの機能をサポートします。サウンドド ライバは Open Sound System API の仕様書に完全準拠します。OSS はサウン ドドライバのインストールやサウンドカードの設定がとても簡単になるユーザ フレンドリーな GUI を提供します。 200 を超える種類のサウンドカードをサ ポートし、サウンドカードの自動検出、プラグアンドプレイ、PCI オーディオ サウンドカード、フルデュープレックスオーディオのサポートが提供されてい ます。 8.1.3. Notemidi Notemidi はノートブック/ラップトップコンピュータの RS-232 シリアルポー トを経由して MIDI を出力するためのデバイスドライバです。 Notemidi は MIDIator MS-124W インタフェース、 Roland Sound Canvas サウンドモジュー ル、 Yamaha MU-x シリーズサウンドモジュールで使用できます。 8.2. MIDI ファイルプレイヤー 8.2.1. KMid KMid は、Linux と FreeBSD に対応した X11 / KDE ベースの MIDI プレイ ヤーです。カラオケファイルの歌詞を表示する際、演奏されている箇所の色が 変化するので、曲が簡単に追えます。KMid は、/dev/sequencer を外部シンセ サイザ、 AWE、FM、GUS カードをサポートする出力デバイスとして使います。 8.2.2. Pmidi Pmidi は、ALSA シーケンサ経由で MIDI ファイルを演奏する簡単なコマンド ラインのプログラムです。 8.2.3. TiMidity++ TiMidity は MIDI から WAVE へのコンバータです。一般的な MIDI ファイル からデジタルオーディオデータを生成するのに Gravis Ultrasound シリーズ 互換のパッチファイルを使います。生成されたオーディオデータは、任意のサ ウンドデバイス経由での演奏やディスクへの保存が可能です。速いマシンだ と、リアルタイムで演奏できます。 8.3. シーケンサ 8.3.1. Brahms Brahms はシーケンサ兼楽譜作成プログラムです。現時点で、スコア、ピアノ ロール、ドラム、マスタートラックエディタを含む様々な編集方法を備えてい ます。 C++ プログラマであれば、一般的なエディタクラスを借用してさらな るエディタを実装するのは簡単です。MIDI のインポートとエキスポートも実 装されています。 aRts-0.3.4 と組み合わせると、wave ファイルの再生が可 能になり、 MIDI イベントをソフトウェアシンセに送信するのに aRts の MIDI バスが使用できるようになります。 以前は KooBase という名前で知られていました。 8.3.2. Anthem Anthem は先進的なオープンソースの MIDI シーケンサです。Anthem では、洗 練された評価の高いオブジェクト指向の技術を使って、音楽の録音、編集、再 生が可能です。 8.3.3. Jazz++ JAZZ++ は完全な、オーディオ対応の MIDI シーケンサです。 Linux と Windows に対応しています。 8.3.4. Linux Ultimate Music Editor UltiMusE-LX (the Ultimate Music Editor) は作曲プログラムです。といって も、あなたのために作曲してくれるわけではありません。音楽向けの「ワープ ロ」です。マウスや、コンピュータのキーボードを使って、画面上で楽譜が書 けます。 16 パートもしくは 16 声までの音符を、7 つまでの譜表に書き込め ます。たいていの標準的な音楽記号がサポートされています。MIDI 楽器パッ チの変更、 MIDI イベント、リアルタイムクロックもサポートされています。 8.3.5. Melys Melys は Advanced Linux Sound Architecture (ALSA) 対応の MIDI シーケン サアプリケーションです。 Melys は ALSA のシーケンササポートを使用しま す。GNOME ライブラリのおかげでシーケンサをパワフルかつ簡単に操作できま す。 8.3.6. MidiMountain Sequencer MidiMountain はスタンダード MIDI ファイルの編集機能があるシーケンサで す。簡単に使えるインタフェースは、MIDI の楽曲(シーケンス)を編集・作成 する初心者の助けになるでしょう。そのうえ MidiMountain は、スタンダード MIDI ファイルや MIDI 転送プロトコルのすべての定義簡単なピアノロールの 編集からバイナリのシステムエクスクルーシブメッセージの変更までが編集で きるように設計されています。 8.3.7. MusE MusE は Qt 2.1 ベースの Linux 向けシーケンサで、編集も録音もできます。 シーケンサの再生中でも、ピアノロールエディタやスコアエディタを使ってリ アルタイムでイベントを編集できます。記録された MIDI イベントはパートご とにグループ分けすることができ、アレンジエディタで編曲できます。 8.3.8. Rosegarden Rosegarden は、MIDI シーケンサと楽譜エディタが統合されたソフトウェアで す。 8.4. MIDI トラッカー 8.4.1. tektracker ttrk (tektracker) は、トラッカースタイルのステップエディタを備えたコン ソール MIDI シーケンサです。ライブ演奏向けに作られており、使いやすいト ラックミュートボタンとループコントロール機能があります。ttrk は MIDI クロックパルスの送信と同期の両方をサポートしています。 8.4.2. ShakeTracker ShakeTracker は、トラッカーのインタフェースを備えた完全な MIDI シーケ ンサを目指しています。目下のところ、申し分なく動作する上、ほとんどのト ラッカーのエフェクトをサポートしています。以前 Impulse トラッカーを 使ったことがある方は、なじみのある感じがするでしょう。はじめて使う方に は、簡単ながら広範囲にわたるヘルプシステムが用意されています。コマンド とショートカットのほとんどは、トラッカーのそれに似ています。 8.5. ドラムエディタ 8.5.1. DrumPatterns DrumPatterns はフリーでオープンソースの、web 指向のドラムパターンジェ ネレータです。用途はドラムパターンを教える手助けをすることです。高度な リズムも初歩のリズムも教えることができます。文字、スコア、MIDI での出 力が可能で、何時間ものサンプルが含まれています。 8.6. パッチエディタ 8.6.1. JSynthLib JSynthLib はオープンソースの、様々な環境で使えるシンセサイザパッチエ ディタ/ ライブラリアンソフトで、Java 言語で書かれています。サポートさ れていないシンセ用のドライバやエディタをユーザが開発しプロジェクトに寄 贈できるように、そのやり方と技術文書を提供することによって、最終的には 実在するすべてのシンセサイザをサポートすることをこのプロジェクトは志し ています。 8.7. ソフトウェアシンセ 8.7.1. Spiral Synth Spiral Synth はポリフォニックアナログシンセサイザを物理モデル化したソ フトウェアです。ハードウェアアナログシンセによって作られるたぐいの音 や、電子音楽に使われるノイズの作成が可能です。もっと奇妙な音の作成にも 使えます。MIDI がサポートされており、また、標準的な OSS/Free サウンド 出力 (/dev/dsp) を使用します。 訳注: 後継の SpiralSynthModular が、現在活発に開発されています。 8.7.2. UltraMaster Juno-6 UltraMaster Juno-6 は、Roland Juno-6 ポリフォニックシンセサイザを忠実 にソフトウェアで再現したものです。リアルタイム 64 ビットインターナル ULTRANALOG ウェーブシンセシス、80 年代初期スタイルのアルペジエーターと コーラス、利用者自身のカスタムセッティングを保存するための 100 のパッ チが特色です。すべてのパラメータはリアルタイムで、スクリーン上の GUI もしくは 外部の MIDI コントローラ経由でコントロールできます。 8.7.3. Pure-Data (PD) Pd は pure data の略称です。Pd は音楽やマルチメディアのライブパフォー マンスのためのリアルタイムソフトウェアシステムです。 Miller Puckette 他によって活発に開発されています。システムは未完成ですが、高度なプロ ジェクトにも十分使えます。すでに Linux, IRIX, 各種 Windows にポートさ れています。 訳注: 現在では Mac OSX にもポートされています。 8.7.4. Csound Csound はソフトウェア音響合成のプログラムです。でも単なるそれを超えて います。 Csound では、他のソフトウェア/ハードウェアシンセサイザに存在 するような制限を受けることがありません。ひとつのプログラムが使用できる オシレータやフィルタの総数に制限がないのです。さらに、Csound は完全な モジュール方式です。ですから、Csound のどの機能も多種多様なやり方で使 用できます。 8.7.5. Bristol synthesiser emulator Bristol はシンセサイザエミュレーションのパッケージです。 Moog Mini, Moog Voyager, Hammond B3, Prophet 5, Juno 6, DX 7 などが含まれていま す。 8.8. プラグイン 8.8.1. xmms-midi xmms (旧名 x11amp) に、(timidity を経由させることによって) MIDI ファイ ルのサポートを追加します。そっけないミキサーインタフェースが、設定ダイ アログによって提供されます。 8.9. 楽譜作成 8.9.1. Mup Mup はテキストファイルを入力に用いて、楽譜印刷用の PostScript を出力し ます。普通の楽譜とタブ譜の両方が扱えます (MIDI での出力も可能です)。 8.9.2. Lilypond LilyPond は譜面用の植字ソフトです。概要が記述されたファイルを入力に用 いて、美しい譜面を生成します。LilyPond は GNU Project の一部です。 8.10. 開発 8.10.1. sfront Sfront は MPEG 4 Structured Audio (MP4-SA) のビットストリームを、実行 時にオーディオを生成する効率的な C プログラムにコンパイルします。 MP4-SA とは、規範に従ったアルゴリズミックなサウンド用の規格で、オー ディオシグナル処理言語 (SAOL) とスコア言語 (SASL と旧式の MIDI ファイ ル形式) を結合したものです。 Linux では、Sfront はリアルタイム、ロウレ イテンシなオーディオ入出力、サウンドカードからのローカル MIDI 入力、 RTP と SIP を用いてのネットワーク経由での MIDI 入力をサポートしていま す。バークレーのキャンパスでホストされた SIP サーバがセッションを管理 します。この Web サイトには、MP4-SA についてのオンラインブックもありま す。 8.10.2. jMax jMax を使えば、対話的にデータフロー回路を設計できます。使用できる基本 的なデータタイプは整数、シンボル、リストなどです。イベントドリブンのシ ステムで、MIDI の処理に使われていました。システムの別の部分 (DSP) で は、回路に継続的な信号を流すことができます。これは、PCM サウンド (すな わち、マイク経由の音やサウンドファイルなど) にとって最も有用です。シス テムはシェアードライブラリの使用によって拡張可能なので、データプロセッ サタイプ、データタイプ、GUI 要素、デバイスタイプ、その他を追加できま す。データプロセッサも回路としての設計や再利用が可能です。 8.10.3. TSE3 TSE3 は C++ で書かれたパワフルなオープンソースのシーケンサエンジンで す。なぜ「シーケンサエンジン」なのかというと、TSE3 はシーケンサの実動 部分を提供するだけで、ユーザインタフェースのフォームを提供しないからで す。 TSE3 ライブラリを使えば、シーケンサアプリケーションやマルチメディ アプレゼンテーションパッケージを作成する際、 MIDI シーケンスの扱いが楽 になります。 8.10.4. KeyKit KeyKit はマルチタスクのインタプリタ型プログラム言語です (awk に触発さ れています)。リアルタイムかつアルゴリズミックな MIDI の操作に特化して 設計されています。KeyKit の GUI は、アルゴリズミックな音楽実験用の様々 なツールを何ダースも供給します。その中にはマルチトラックシーケンサやド ラムパターンエディタも含まれています。 GUI とすべてのツールは、完全に KeyKit 言語それ自体で書かれています。おかげで、ユーザはたとえシステム の動作中でも、存在しているツールに新たなツールや命令を追加できます。 9. MIDI を扱うプログラムの開発 MIDI アプリケーションの開発志望者にとって、開発に着手するために良いプ ログラム例が必要となることはありがちです。 次に挙げる例は、LAD メーリングリストの、プログラム例と文書・チュートリ アルについてのスレッドに投稿されました。 9.1. 例 1 以下のプログラムは Dr. Matthias Nagorni による、ちょっとしたシーケンサ のルーチンです。リンク集にリストアップされている Matthias のサイトから さらに多くの例が入手できます。 このようにコンパイルします: ______________________________________________________________________ [phil@beatbox] $ gcc seqdemo.c -o seqdemo -lasound #include #include #include #include snd_seq_t *open_seq(); void midi_action(snd_seq_t *seq_handle); snd_seq_t *open_seq() { snd_seq_t *seq_handle; int portid; if (snd_seq_open(&seq_handle, "hw", SND_SEQ_OPEN_DUPLEX, 0) < 0) { fprintf(stderr, "Error opening ALSA sequencer.\n"); exit(1); } snd_seq_set_client_name(seq_handle, "ALSA Sequencer Demo"); if ((portid = snd_seq_create_simple_port(seq_handle, "ALSA Sequencer Demo", SND_SEQ_PORT_CAP_WRITE|SND_SEQ_PORT_CAP_SUBS_WRITE, SND_SEQ_PORT_TYPE_APPLICATION)) < 0) { fprintf(stderr, "Error creating sequencer port.\n"); exit(1); } return(seq_handle); } void midi_action(snd_seq_t *seq_handle) { snd_seq_event_t *ev; do { snd_seq_event_input(seq_handle, &ev); switch (ev->type) { case SND_SEQ_EVENT_CONTROLLER: fprintf(stderr, "Control event on Channel %2d: %5d \r", ev->data.control.channel, ev->data.control.value); break; case SND_SEQ_EVENT_PITCHBEND: fprintf(stderr, "Pitchbender event on Channel %2d: %5d \r", ev->data.control.channel, ev->data.control.value); break; case SND_SEQ_EVENT_NOTEON: fprintf(stderr, "Note On event on Channel %2d: %5d \r", ev->data.control.channel, ev->data.note.note); break; case SND_SEQ_EVENT_NOTEOFF: fprintf(stderr, "Note Off event on Channel %2d: %5d \r", ev->data.control.channel, ev->data.note.note); break; } snd_seq_free_event(ev); } while (snd_seq_event_input_pending(seq_handle, 0) > 0); } int main(int argc, char *argv[]) { snd_seq_t *seq_handle; int npfd; struct pollfd *pfd; seq_handle = open_seq(); npfd = snd_seq_poll_descriptors_count(seq_handle, POLLIN); pfd = (struct pollfd *)alloca(npfd * sizeof(struct pollfd)); snd_seq_poll_descriptors(seq_handle, pfd, npfd, POLLIN); while (1) { if (poll(pfd, npfd, 100000) > 0) { midi_action(seq_handle); } } } ______________________________________________________________________ 9.2. 例 2 以下は Nick Dowell 作の ALSA 0.9 対応 MIDI リダイレクタです。 ______________________________________________________________________ /* ALSA Sequencer MIDI redirector. Redirects the input to outputs determined by the MIDI channel (as requested by Nathaniel Virgo on Linux-Audio-Dev ;-) based on Dr. Matthias Nagorni's ALSA seq example Nick Dowell */ #include #include #include #include int main() { snd_seq_t *seq_handle; snd_seq_event_t *ev; int i; int portid; /* input port */ int oportid[16]; /* output ports */ int npfd; struct pollfd *pfd; char txt[20]; if (snd_seq_open(&seq_handle, "hw", SND_SEQ_OPEN_DUPLEX, 0) < 0) { fprintf(stderr, "Error opening ALSA sequencer.\n"); exit(1); } snd_seq_set_client_name(seq_handle, "MIDI Redirect"); /* open one input port */ if ((portid = snd_seq_create_simple_port (seq_handle, "Input", SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE, SND_SEQ_PORT_TYPE_APPLICATION)) < 0) { fprintf(stderr, "fatal error: could not open input port.\n"); exit(1); } /* open 16 output ports for the MIDI channels */ for (i=0; i<16; i++){ sprintf( txt, "MIDI Channel %d", i ); if ((oportid[i] = snd_seq_create_simple_port (seq_handle, txt, SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ, SND_SEQ_PORT_TYPE_APPLICATION)) < 0) { fprintf(stderr, "fatal error: could not open output port.\n"); exit(1); } } npfd = snd_seq_poll_descriptors_count(seq_handle, POLLIN); pfd = (struct pollfd *)alloca(npfd * sizeof(struct pollfd)); snd_seq_poll_descriptors(seq_handle, pfd, npfd, POLLIN); while (1) /* main loop */ if (poll(pfd, npfd, 1000000) > 0){ do { snd_seq_event_input(seq_handle, &ev); snd_seq_ev_set_source( ev, oportid[ev->data.control.channel] ); snd_seq_ev_set_subs( ev ); snd_seq_ev_set_direct( ev ); snd_seq_event_output_direct( seq_handle, ev ); snd_seq_free_event(ev); } while (snd_seq_event_input_pending(seq_handle, 0) > 0); } return 0; } ______________________________________________________________________ 9.3. 例 3 以下は Craig Stuart Sapp による、OSS の /dev/midi インタフェースにデー タを書き込む例です。 リンクの節にリストアップされている Craig のサイトには、さらに多くの例 があります。 ______________________________________________________________________ // // Programmer: Craig Stuart Sapp [craig@ccrma.stanford.edu] // Creation Date: Mon Dec 21 18:00:42 PST 1998 // Last Modified: Mon Dec 21 18:00:42 PST 1998 // Filename: ...linuxmidi/output/method1.c // Syntax: C // $Smake: gcc -O -o devmidiout devmidiout.c && strip devmidiout // #include #include #include #include int main(void) { char* device = "/dev/midi" ; unsigned char data[3] = {0x90, 60, 127}; // step 1: open the OSS device for writing int fd = open(device, O_WRONLY, 0); if (fd < 0) { printf("Error: cannot open %s\n", device); exit(1); } // step 2: write the MIDI information to the OSS device write(fd, data, sizeof(data)); // step 3: (optional) close the OSS device close(fd); return 0; } ______________________________________________________________________ 10. ソフトウェアシンセサイザといっしょに MIDI シーケンサを使う Frank Barknecht 訳注: 日本語訳は この HOWTO では、MIDI 受信可能なソフトウェアシンセサイザを、 MIDI シー ケンサから ALSA 0.9 の仮想的な MIDI 接続経由で制御する際に必要となる設 定を述べます。本文書は自由に翻訳や配布が可能です。 GNU Free Documentation License で公開されています。 10.1. はじめに Csound, PD, jMax, Spiral Synth Modular のようなソフトウェアシンセサイ ザは、既知や未知、尋常もしくは奇抜な音響体験を創造するほとんど無限の自 由を提供します。ソフトウェアシンセサイザは、高価なハードウェアシンセサ イザや、安価なサウンドカードの、音質が悪いことが多い MIDI シンセサイザ 機能 (いずれにしても Linux でサポートされていればですが) を置き換える こともできます。一方、それらのソフトウェアシンセサイザを使って作曲する のは退屈な作業になることもありますたとえば Csound では、表計算ソフトの ような作法で果てしない数列を記述しなくてはならないのです。これは、音楽 を作るのに快適なやりかたではありません。 MIDI シーケンサアプリケーションは、こういった作業により適しています。 シーケンサは、音符を挿入したりデータを制御したりするインタフェースを使 いやすいやりかたで楽譜の音符、ピアノロールのマーク、MIDI イベントのリ ストといった好みに応じた表現方法で提供します。他の種類の MIDI シーケン サには、音符を入力するのにトラッカーのようなステップ入力方式を提供する ものがあります。多くの人達が、このやりかたがシーンでの最先端だった古き 良き時代から慣れ親しんでいる方式です。最後に、忘れてはならない方式があ ります。 MIDI シーケンサの中には、鍵盤や他の物理デバイスでの演奏を記録 できるものもあります。これは、多くのユーザにとって最も自然な作曲方法で す。 ところで、MIDI シーケンサは、通常は音符を MIDI デバイスに出力します。 普通、MIDI イベントを世界の外側すなわちハードウェアシンセやサンプラー に送信するということです。でも仮想 MIDI デバイスを使えば、MIDI データ をコンピュータの内側にキープし、同じマシンで実行している他のソフトウェ アを制御させることができます。この HOWTO では、この目的に達するために 必要なすべてを述べます。 10.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 のような形式で、必要なデバイス名を記入するだけです。 10.3. MIDI イベントのルーティング 10.3.1. aconnect 仮想 MIDI カードの作成と設定をした上で、さらなる準備をしないと、 MIDI イベントをシーケンサからソフトシンセに送信することはできません。そのた めには、最初にふたつのポートをご想像通り aconnect ユーティリティで接続 する必要があります。このツールはふたつ、もしくはそれより多くのポートを 接続します。-i と -o が使用可能なポートを表示するオプションであること は、すでに以前説明した通りです。簡単な構文で、これらのポートを一方向に 接続することができます。 ______________________________________________________________________ $ aconnect [送信ポート] [受信ポート] $ aconnect 80:0 81:0 ______________________________________________________________________ この例では、port 80:0 に送信されたすべての MIDI データを port 80:1 に 向けてルーティングします。本文書の構成だと、/dev/midi20 に入ってきたす べてのイベントは /dev/midi21 に送信されることになるので、/dev/midi21 から他のアプリケーションはその MIDI イベントを読む(受信する) ことがで きます。 VirMIDI カードをカード index 1 であるふたつ目のカードとして設定した場 合、これらのポートが存在するはずです: ______________________________________________________________________ $ aconnect -lo client 72: 'Virtual Raw MIDI 1-0' [type=kernel] 0 'VirMIDI 1-0 ' client 73: 'Virtual Raw MIDI 1-1' [type=kernel] 0 'VirMIDI 1-1 ' client 74: 'Virtual Raw MIDI 1-2' [type=kernel] 0 'VirMIDI 1-2 ' client 75: 'Virtual Raw MIDI 1-3' [type=kernel] 0 'VirMIDI 1-3 ______________________________________________________________________ この時点で、たとえばポート 72:0 (/dev/midi10) からポート 73:0 (/dev/midi11) に接続できます: ______________________________________________________________________ $ aconnect 72:0 73:0 ______________________________________________________________________ aconnect で -lo や -li オプションを使うと、接続状況を表示できます: ______________________________________________________________________ $ aconnect -lo client 72: 'Virtual Raw MIDI 1-0' [type=kernel] 0 'VirMIDI 1-0 ' Connecting To: 73:0 client 73: 'Virtual Raw MIDI 1-1' [type=kernel] 0 'VirMIDI 1-1 ' Connected From: 72:0 client 74: 'Virtual Raw MIDI 1-2' [type=kernel] 0 'VirMIDI 1-2 ' client 75: 'Virtual Raw MIDI 1-3' [type=kernel] 0 'VirMIDI 1-3 ______________________________________________________________________ "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 を二度実行すると: ______________________________________________________________________ $ aconnect 72:0 73:0 $ aconnect 72:0 74:0 ______________________________________________________________________ /dev/midi10 に送信したのと同じデータを、/dev/midi11 と /dev/midi12 で 同様に受信できます。当然、もっとたくさんの仮想 MIDI カードを作成し、そ れらをでたらめに接続した場合は、本当にマシンを酷使することになります。 もうわたしたちを止めるものはなにもありません すべてのポートの接続を切るには: ______________________________________________________________________ $ aconnect -x ______________________________________________________________________ 接続をひとつだけ切るには: ______________________________________________________________________ $ aconnect -d 72:0 74:0 ______________________________________________________________________ 10.4. グラフィカルな MIDI パッチベイ Bob Ham 作の ALSA MIDI Patch Bay は、ALSA の MIDI 接続の設定をするのにとても有用なグラフィックフロントエンドです。 使い方はとても簡単で直感的です: 左側は MIDI イベントを送信可能な MIDI ポート群で、もう一方の右側には受信可能な MIDI ポート群があります。左側 のポートをクリックすると、次にクリックする右側のポートへの新たな接続が できるようになります。右側のポートをクリックすると、そのポートが接続さ れている場合はそれを切ります。本 HOWTO を余計なものにしてしまいかねな いくらいクリーンで簡単なツールです. ;) 10.4.1. aseqview MIDI イベントをルーティングするためのもうひとつの有用なツールが、 ALSA 開発者岩井隆さん作の aseqview です。岩井さんのホームページ でダウンロードできますが、多 くのディストリビューションにも含まれています。このグラフィカルなユー ティリティは、コンピュータを通過する MIDI イベントを眺めたり変更したり する目的で設計されましたが、 aconnect のように、異なる MIDI ポートにイ ベントをルーティングすることもできます。 aconnect では時に操作できない こともある OSS シーケンサデバイスを使うアプリケーションを扱わなければ ならない時に、 aseqview は有用です。コマンドラインオプションなしで aseqview を起動すると、きれいな GUI と新たな MIDI ポートが手に入りま す。デフォルトは port 128:0 です。このようになります: ______________________________________________________________________ client 128: 'MIDI Viewer' [type=user] 0 'Viewer Port 0 ' ______________________________________________________________________ このポートを使って、これまで説明してきた aconnect の作業すべてが可能で す。でも、aseqview のポートを別のポートに接続することだけが必要なら、 -d オプションを使えば、aseqview だけで実現できます: ______________________________________________________________________ $ aseqview -d 73:0 & ______________________________________________________________________ ちょうど aseqview の起動時から、(使用可能であれば) port 128:0 から port 73:0 に接続がなされます。 これらのツールととてもよく似た機能があるグラフィカルな aconnect ツール がほかにもいくつかあります。Maarten de Boer は、オリジナルの aconnect のソースコードのほとんどを使って、FLTK ツールキットで "aconnectgui" と いうグラフィカルフロントエンドを書きました。 で、入手できます。筆者の意見では、彼 のソフトウェアが最も見栄えがよいです。 個人的に、筆者は kaconnect を使っています。たぶん名前がいちばん短かい ので、速くタイプできるからでしょう。kaconnect は Suse の Dr. Matthias Nagorni によって、ALSA 向けのツールとソフトシンセのシリーズである kalsatools の一部として開発されました。名前に "k" がついているからと いって、勘違いしないでください。kaconnect は KDE を必要とせず、QT GUI ライブラリだけを使います。kaconnect その他は で、入手できます。 10.5. アプリケーション 最後のこの節では、様々なアプリケーションでの仮想 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' されています: ______________________________________________________________________ $ aconnect 80:0 81:0 ______________________________________________________________________ これまで説明してきたとおり、これはつまり /dev/midi20 (もしくは port 80:0 もしくは /dev/snd/midiC2D0) に送られたすべての MIDI データ は、/dev/midi21 (もしくは port 80:1 もしくは /dev/snd/midiC2D1) で読め ていることを意味しています。 10.6. シーケンサ 10.6.1. MusE MusE は、Werner Schweerによって作られた完全な MIDI シーケンサです。 で入手できます。 ``Config->Midi Ports'' セクショ ンで、仮想 MIDI ポートを出力ポートとして設定する必要があります。 MusE では、指定するポートは ALSA での名前 'VirMIDI X-X' です: ここで、出力ポートに正しいポートを選んでいるか確認してください。つまり その MIDI イベントを受信・演奏させたいソフトウェアシンセサイザが待ち受 けているチャンネルです。 どういうわけか、筆者は MuSE 0.4.9 で、'VirMIDI 2-0' を出力デバイスとし て使うことができませんでした。'VirMIDI 2-1' で受信したい時、'VirMIDI 2-0' デバイスに送信したかったのですが、そのふたつを逆にして使わなくて はならなかったのです。多分筆者がまぬけなせいなのでしょうが、筆者には原 因が分からないので、あなたはちょっと実験をしなくてはならないかもしれま せん。 midi02 や midi2 形式のデバイスを使うことも可能でしょう。 10.6.2. ttrk Billy Biggs 作の ttrk は、シンプルで軽く安定し た MIDI シーケンサで、トラッカーのようなステップ入力のインタフェースを 備えています。このシーケンサは、MIDI データを $HOME/.ttrkrc ファイルで 設定された MIDI ポートに送信することができます。 ttrk が /dev/snd/midiC2D0 に送信するようにするには、次の行を $HOME/.ttrkrc ファイルに書いてください。 ______________________________________________________________________ mididev = /dev/snd/midiC2D0 ______________________________________________________________________ これで設定完了です... 10.6.3. 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' として表示されます: このユーザデバイスに、'Null Output' のかわりに分かりやすい名前をつける と便利です。 aseqview を、コマンドラインオプションなしで起動した場合、 aseqview の ポートをソフトシンセのポートと aconnect する必要があります。でも、以前 説明したように、接続先ポートの指定つきで直接 aseqview を起動することも できます。ソフトシンセに送信する各トラックごとに、この新たなユーザデバ イスを使用するのを忘れないでください。筆者はいつも小さなシェルスクリプ トを用いて Shaketracker を起動します。これは aseqview を起動し、ポート が作られる時間を待ち、それから Shaketracker を起動します: ______________________________________________________________________ #!/bin/sh aseqview -d 81:0 & # sleep 2 seconds to let aseqview do its work: sleep 2 shaketracker ______________________________________________________________________ 10.7. ソフトウェアシンセサイザ 10.7.1. Pure Data Miller Puckette は、オープンソースのソフトウェアシンセかつマルチメディ ア開発環境の Pure Data を生 んだ天才です。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 デバイスを確認する上で、とても重宝します。 10.7.2. Csound Csound は、いまどきのソフトウェアシンセサイザ ほとんどの祖母にあたります。そして、MIDI にも対応がなされていま す。'csound --help' を実行すると、MIDI 入力デバイスの設定が必要な箇所 を表示します: ______________________________________________________________________ -M dnam or --midieventdev=dnam ........ Read MIDI realtime events from device ______________________________________________________________________ よって本書の例では、Csound を以下のように起動する必要があります: ______________________________________________________________________ $ csound -M /dev/midi21 -o devaudio midi.csd ______________________________________________________________________ 10.7.3. おわりに ここまでの説明で、MIDI シーケンサで作曲・再生した音楽を、ソフトウェア シンセサイザの音で演奏する方法がお分かりになったと思います。もちろ ん、aconnect や aseqview のようなツールは、必ずしも MIDI ソフトウェア シーケンサといっしょに使う必要がある訳ではありません。外部のシーケンサ や外部の MIDI キーボードからマシンに入ってきたイベントを、MIDI シーケ ンサを通さずに直接ソフトウェアシンセにリダイレクトすることもできます。 外部の MIDI デバイスを、お使いのソフトシンセや、サウンドカードのオン ボードシンセに 'aconnect' するだけでよいのです。振り返っておさらい: PD, Csound, あるいは KeyKit のような環境では、アルゴリズミックなやりかたで MIDI イベントを作成する ことができます。アルゴリズミックな作曲は、古典的な Cubase ライクな MIDI シーケンサではほとんど不可能です。aconnect を使うと、生成された MIDI イベントを、お使いの MIDI 受信可能なサウンドモジュールならどのよ うなものにでもルーティングできます。 10.8. 謝辞 筆者は、岩井隆さんに、この記事を準備するにあたっての技術的な援助と、日 本語に関する貴重なアドバイスをいただいたことを感謝します。隆さん、あり がとう! 11. 有用なリンク 以下は MIDI と Linux をカバーするサイトと情報源へのリンク一覧です。 Sound & MIDI Software For Linux. MIDI と オーディオ関連情報の巨大な情報源。 Linux Audio Developers mailing list. 開発者に関連した議論。 The Linux Audio Quality HOWTO. MIDI カードの節がよい。Linux スタジオを構築するのに必読。 Alsa Project - オーディオ/MIDI ドライバ OSS - オーディオ/MIDI ドライバ Low Latancy patches 訳注: カーネル 2.4 向けは Linux scheduling latency Introduction to MIDI programming in Linux. Craig Stuart Sapp による著 述は C/C++ での OSS ドライバ対応の基本的な MIDI ユーティリティの書きか たを網羅しています。 Dr. Matthias Nagorni によって書かれた ALSA 0.9 での MIDI と PCM の C プログラム例の優れたコレクション。 12. フィードバック 依然として、本 HOWTO は製作進行中です。Linux で MIDI を使った新たなア プリケーションやその他開発中のものについて、フィードバックをいただける とありがたいです。 MIDI カードは種類が多いため、ドライバのサポートや設定オプションの様々 な段階に応じた設定に苦労することがあります。問題解決のためのベストな参 照源は、ALSA や OSS のウェブサイト、ニューズグループです。それでも行き 詰まった場合は、Linux Audio メーリングリストの検索を試してみてくださ い。 13. 日本語版謝辞 翻訳にあたり貴重なアドバイスをいただいた、武井伸光さん、カーテス典子さ んに感謝します。