Ubuntu Weekly Recipe

第150回MIDIとUbuntuの素敵な出会い(2)ソフトウェアシンセサイザで演奏してみる

今回は予告どおり、Ubuntuを楽器にして演奏してみようと思います。前回はtimidity++をMIDIプレイヤーとして使っていましたが、timidity++にはソフトウェアシンセサイザとしての使い方もあります。timidity++以外にもUbuntuで使えるソフトウェアシンセサイザがいくつかありますが、今回は導入ということで、そうしたシンセサイザを使う際にベースとなる話、具体的にはハードウェアMIDIコントローラ(鍵盤等)の接続・ALSAシーケンサ機能・ソフトウェアMIDIコントローラ/シーケンサ・レイテンシを低減する方法をお伝えしていきます。

ハードウェアMIDIコントローラの導入

まず最初に、⁠演奏」に用いるインターフェイスの準備が必要です。⁠演奏」のためのインターフェイスとしては、MIDI接続可能な鍵盤などを用います。これらをここでは「MIDIコントローラ」と呼ぶことにします。

MIDIコントローラをUbuntuに接続してみます。今回は筆者が所有するMIDIコントローラRoland/Edirol PCR-M30を接続してみます。古典的なMIDIコントローラの場合は、MIDIで一般的に使われているプラグ(DIN規格の5ピン丸形コネクタ)での接続が基本ですが、PCR-M30はUSBで接続してUSBバスパワーで動作させることもできます。USB接続することでALSAがこのデバイスのドライバとして割り当てられ、システムで利用可能となります。

図1 Roland/Edirol PCR-M30
図1 Roland/Edirol PCR-M30

USB接続ではなく、MIDIプラグのケーブルで接続することもできます。この場合は、MIDIジャックを備えているPCIバス接続、PCI Expressバス接続、USB接続の「MIDIジャックを持つサウンドデバイス」が別に必要となり、ハードウェアを余計に確保する必要が出てきます。ただし、この場合は「MIDIジャックを持つサウンドデバイス」をALSA経由で認識できれば問題ないため、⁠USB接続も可能だが、ALSAがUSB接続では認識してくれないMIDIコントローラ」を用いる場合の回避策になります。

筆者が所有しているUSB接続のサウンドデバイスの中では、Creative EMU 0404 USBがUSBオーディオ機能とともに、⁠MIDIジャックを持つサウンドデバイス」としての機能を持っています。

図2 Creative EMU 0404 USB。MIDIジャックは背面にあり、この角度では見えない
図2 Creative EMU 0404 USB。MIDIジャックは背面にあり、この角度では見えない

なお、ALSAが対応するサウンドデバイスについて調べるには、ALSAウェブサイトのMatrix:Main - AlsaProjectを参照して下さい。

ALSAシーケンサ機能について

Ubuntu標準環境においては、MIDIコントローラはALSA (Advanced Linux Sound Architecture) サブシステムのシーケンサ機能にポートを開きます。MIDIコントローラのみならず、MIDI信号を扱うものであれば何でもこのALSAシーケンサ機能にポートを開くように設定されます[1]⁠。そして、開かれたポート同士をALSAシーケンサ機能によって「接続」することで、MIDI信号のやりとりを行うことになります。

ポートの接続

それでは実際に、⁠ポートの接続」を行ってみましょう。今回は、ポートの接続/切断を画面上で行うことができる、Aconnectguiというソフトウェアを使います。まず、Synapticパッケージマネジャーでパッケージ「aconnectgui」をインストールしてください。

デスクトップのメニューの項目「サウンドとビデオ」「Aconnectgui」が表示されますので、クリックして起動します。起動してみると、ALSAシーケンサ機能に現在開かれている入出力ポートが表示されます。画面上部のハサミアイコンとケーブルアイコンで機能を選択し、マウス操作で切断と接続を行うことができます。

図3 Aconnectguiの画面。ポートが見えている
図3 Aconnectguiの画面。ポートが見えている

ここで、冒頭に紹介した2つのデバイス、Roland/Edirol PCR-M30とCreative EMU 0404 USBが開いているポートを、このAconnectguiで確認してみます。USBで接続したPCR-M30は、デバイスからの出力ポートとして「PCR MIDI」「PCR 1」そして「PCR 2」を、デバイスへの入力ポートとして「PCR MIDI」「PCR 1」を開きます。筆者が確認した限りでは、鍵盤やボタンを押した時の信号はすべて「PCR 1」から出力されていました。

図4 Aconnectguiの画面。PCR-M30がポートを開いているのがわかる
図4 Aconnectguiの画面。PCR-M30がポートを開いているのがわかる

次にEMU 0404 USBです。入出力ポートを一組開いているのがわかります。デバイスのMIDIジャックにMIDIコントローラを接続して信号を発生すると、ここに表示されているポートから出力されるという仕組みです。

図5 Aconnectguiの画面。EMU 0404 USBのMIDI入出力ポートが見えている
図5 Aconnectguiの画面。EMU 0404 USBのMIDI入出力ポートが見えている

ソフトウェアMIDIコントローラの導入

MIDIコントローラとなりうるハードウェアがない場合、ソフトウェア的な入力デバイスを利用し、マウスや(PC用の)キーボードを用いて「演奏」することも可能です。

このためのソフトウェアはいくつかありますが、ここではまず、vkeybdとvmpkを導入してみます。Synapticパッケージマネジャーでパッケージ「vkeybd」「vmpk」をインストールしてください。すると、デスクトップのメニューに項目「Virtual MIDI Keyboard」か、⁠VMPK」が作られるので、クリックして起動します。

図6 vkeybdの画面。ツールバーの項目「View」でコントロールを表示した状態
図6 vkeybdの画面。ツールバーの項目「View」でコントロールを表示した状
図7 vmpkの画面。サウンドフォントを読み込ませ、外部からMIDI信号を入力することで単独で演奏することもできる
図7 vmpkの画面。サウンドフォントを読み込ませ、外部からMIDI信号を入力することで単独で演奏することもできる

どちらも、一般的な文字キーボードからの入力や、画面上のマウス操作でMIDI信号を発生する仕組みを備えているため、MIDIコントローラとなる鍵盤を購入しなくても、手軽にMIDI信号を発生させ、⁠演奏」することができます。例えばVMPKでキーボードのCキーを押すと、(C4)のMIDI信号(キーノート)を発生します。

図8 Aconnectguiの画面。vkeybdはMIDI入力ポートのみ、vmpkはMIDI入出力ポートを開く
図8 Aconnectguiの画面。vkeybdはMIDI入力ポートのみ、vmpkはMIDI入出力ポートを開く

ソフトウェアMIDIシーケンサの導入

MIDIシーケンサは、ファイルなどの形であらかじめ作られた一連のMIDI信号を読み込み、それに基づいてMIDI信号を発生させるソフトウェアです。事前に作成されたファイルに基づいて、自動的に「演奏」を行うもの、ということもできます。

ここではそのようなソフトウェアとしてAudaciousとRosegardenを紹介します。なお、ソフトウェアによってはAconnectguiに表示されないものもあり、そういう場合はソフトウェア内の設定で接続を行う必要があります。

Audaciousはプラグインで様々な拡張が可能な音楽プレイヤーで、MIDIファイル以外の再生も可能です。Synapticパッケージマネジャーなどでパッケージ名「audacious」をインストールすることで利用できます。プラグインパッケージである「audacious-plugins」を合わせてインストールすると、AMIDIプラグインを利用してMIDIファイルを扱うことができます。

プレイリストの作成など、Audaciousの音楽プレイヤーとしての機能をそのまま利用できるため、MIDIファイルをたくさん持っていて、ハードウェアMIDI音源を使いたい方にはおすすめです。なお、aconnectgui経由での設定はできないため、Audaciousのプラグイン設定画面で接続を行う必要があります。

図9 Audaciousの設定画面から、AMIDIプラグインのALSAバックエンド設定画面。接続する入力ポートを指定できます
図9 Audaciousの設定画面から、AMIDIプラグインのALSAバックエンド設定画面。接続する入力ポートを指定できます

Rosegardenはシーケンサ機能やデジタルレコーディング機能、プラグイン音源、プラグインエフェクトを備えたソフトウェアで、Linuxで利用できるDAW環境の一つです。パッケージ「rosegarden」をインストールすることで利用できます。DAWに慣れていない方にとっては設定など面倒かもしれませんが、音楽作成/編集目的ではかなり強力なソフトウェアの一つです。JACKサウンドサーバと併用するのが一般的ですが、MIDI信号源としてのみ利用することも可能です。ただしこの場合、JACK対応プラグインの大半が利用できなくなります。

図10 Rosegardenでピアノロールとトランスポートを表示した画面
図10 Rosegardenでピアノロールとトランスポートを表示した画面
図11 Aconnectguiでtimidity++とRosegarden、USB接続のPCR-M30を接続。出音はtimidity++のバックエンドに依存するため、ここからはコントロールできない
図11 Aconnectguiでtimidity++とRosegarden、USB接続のPCR-M30を接続。出音はtimidity++のバックエンドに依存するため、ここからはコントロールできない

timidity++をALSAシーケンサインターフェイスで起動し、演奏する

それでは、timidity+を使ったリアルタイム演奏の準備に入ります。

前回は「-ig」オプションでGTK+インターフェイスを指定していました。ALSAシーケンサ機能を使うようにtimidity++を起動するには、⁠-iA」オプションを指定します。

$ timidity -iA -Oe --sequencer-ports=1;

この方法は、timidity++のマニュアル内では「ALSAシーケンサインターフェイス」という名前で登場しています。オプション「--sequencer-ports」で、ALSAシーケンサ機能に開くポート数を指定します。これを指定しない場合は4つのポートが開きます。

さて、全く変化しない画面に不安が募りますが、ここでaconnectguiを起動してみてください。timidityの外部入力ポートが1つ表示されているのがわかると思います。なお、timidity++のコマンドを実行した端末でコントロールキーとCを同時に押すと、timidity++を終了することができます[2]⁠。

それでは、aconnectguiやMIDIシーケンサソフトの設定を使い、MIDI信号源とtimidity++を接続して演奏してみましょう。無事に音が鳴ったら成功です。

図12 Aconnectguiの画面。timidity++と、USB接続のPCR-M30とを接続
図12 Aconnectguiの画面。timidity++と、USB接続のPCR-M30とを接続

レイテンシ対策

ハードウェア/ソフトウェアMIDIキーボードでMIDI信号を発生させた場合は、⁠演奏」の音が出てくるまでに結構な遅延を感じたかと思います。オーディオ関係の用語ではこれをレイテンシと呼んでいます。リアルタイム演奏をする際、レイテンシが大きいと使い物になりません。そこで、レイテンシに対する対策をいくつか施すことになります。

Linux環境においてレイテンシを低減する方法として、バッファの調整と、リアルタイム優先実行の許可という2つの方法が知られています。

バッファの調整

一般的に、コンピュータで音声データを扱う場合、システム内のデータの一時貯蔵場所(バッファ)にいったん貯められてから、必要な分だけ読み込まれて処理されます。ALSAでは、リングバッファという構造のバッファを使っています。リングバッファはバッファの開始点と終端が「輪」になるように接続されており、⁠最後まで読み込んだら(あるいは書き込んだら⁠⁠、最初の場所に戻る」という構造を持っています。読み出しが利用するよりも前に書き込みを終えることで、⁠追いかけっこ」のような形になり、書き込みと読み出しが切れ目なく行われるようになっています。

図13 リングバッファの図解。図では1つのリングバッファが3ピリオドで構成されている
図13 リングバッファの図解。図では1つのリングバッファが3ピリオドで構成されている

ALSAのリングバッファを構成する要素は、ピリオド数と1ピリオドに処理されるフレーム(サンプル)数です。コンピュータではさらに、1秒間に発生させるサンプル数(いわゆるサンプリング周波数)を必ず扱うため、以下の式でレイテンシを計算する事ができます。

ピリオド数 × 1ピリオドに処理されるフレーム(サンプル)数 ÷ サンプリング周波数 × 1000 (ミリ秒)

実際はこれに加えてケーブル電送における遅延や、スピーカーから人間の耳に届くまでにかかる時間などが加わりますが、これらは短距離であればほとんど無視できますので、上記の式で見通しを立てることができます。

リングバッファ上では、音データの書き出しと読み込みが「追いかけっこ」をしていると考えてください。タイミングが合わないと、読み込まれてない音データでバッファがいっぱいとなって書き込めないとか、音データの書き出しが間に合わずに読み出せないとかいったことが起こります。ALSAではこの状態をXRUNと呼び、前者をoverrun、後者をunderrunと名づけています。あまりにもシビアな設定をしてしまうと、このXRUNによって再生の音切れや再生音がまともに出力されない可能性があるので、環境ごとに調整が必要です。

なお、サウンドバッファはLinuxに限らず、WindowsやMac OS Xでもほぼ同様の実装がされています。また、PulseAudioサウンドサーバやJACKサウンドサーバもこのバッファを持つため、そちらでも設定を最適化することで、音に関するトラブルを解消できる可能性があります。注3

さて、timidity++でも、バッファ関連の各種数値を調整することができます。デフォルト値はピリオド数が4、フレーム(サンプル)数が8192(2の13乗⁠⁠、サンプリング周波数44100Hzです。この場合のレイテンシを上記の式で計算すると、約80ミリ秒となります。設定を変更するには、⁠--buffer-fragments」オプションを使います。このオプションは、⁠-Os」オプションや「-Oj」オプションでALSAライブラリやJACKサウンドサーバをバックエンドに指定している場合のみ有効のため、EsounDをバックエンドに指定する「-Oe」との併用は出来ません。

このオプションの設定値はカンマで区切られた二つの数字となり、1つ目でピリオド数を、2つ目で1ピリオドあたりのフレーム(サンプル)数を2の累乗の指数で指定します。例えば3ピリオド、128サンプル(2の7乗)で指定したい場合は、以下のように実行します。

$ timidity -iA -Os --buffer-fragments 3,7;

デフォルトのサンプリング周波数は44100Hzなので、この設定だとレイテンシは約9ミリ秒となります。環境や使うデバイスのタイプによって妥当な値が異なるため、自分の環境に適した値はユーザが見つける必要があります。⁠--sampling-freq」オプションにてサンプリング周波数を設定することもできますが、PulseAudioを経由する場合、標準の設定ではすべての音声データは最終的に44100Hzにリサンプリングされるため、あまり意味がありません。

なお、Ubuntuで使えるソフトウェアシンセサイザはqsynthのように、こういったバッファ調整をGUIで行えるものもあります。

リアルタイム優先実行の許可

timidity++では、iオプションでALSAシーケンサを指定している場合に限り、--realtime-priorityオプションを使うことができます。このオプションを有効にすると、Linuxカーネルのスケジューリング機能において、timidity++が優先的に処理されるグループに登録されます。そのため、例えば複数のアプリケーションを起動している場合などに、レイテンシを低減することができます。

この設定は、Ubuntu StudioのユーザにはJACKサウンドサーバのリアルタイムオプションでお馴染みかと思います。Ubuntu Studioの標準状態ではこのオプションはどのユーザでも利用可能ですが、Ubuntuの標準状態では利用できません。そのため、Ubuntuのシステム設定を変更する必要があります。具体的には、PAMの設定を変更します。

PAM (Pluggable Authentication Modules) は、アプリケーションの実行ユーザに対し、その実行権限を付与するための認証機能です。今回は「アプリケーションのリアルタイム優先実行のための権限(Realtime Priority⁠⁠」を、一般ユーザにも許可するように設定を変更します。PAMの設定ファイルはパス「/etc/security/limits.conf.d/」以下のファイルです。ここに、ファイル末尾が「.conf」で終わるテキストファイルを作成し、以下の4項目からなる1行を追記します。

(許可したいユーザ名)   -   rtprio   90

ひとつめは@audioとして、audioグループに所属するユーザを指定することもできます。最後の値で、優先度の最大値を設定します。今回はそれぞれのアプリケーションで90まで設定できるようになります。ファイル作成の具体的な方法ですが、以下のコマンドを実行します。パスワードを入力するとテキストエディタが開きますので、先の一行を追記して保存してください。

$ sudo gedit /etc/security/limits.conf.d/audio.conf;

そうすると、次回ログインからtimidity++の「--realtime-priority」オプションが有効に機能するようになります。Ubuntuで利用できるソフトウェアシンセサイザにはamSynthのように、リアルタイムオプションを自動で有効にするものもあります。

なお、PAMについてのマニュアルは以下を参照してください。

$ man 7 pam;

加えて、PAMの設定ファイルに記述する内容の詳細は、以下で参照してください。

$ man limits.conf;

レイテンシ対策をして演奏する

それではいよいよ、レイテンシ対策を実践してみましょう。以下のコマンドを実行してください。

$ timidity -iA -Os --buffer-fragments=3,7 --realtime-priority=50  --sequencer-ports=1;

先ほどと同じようにして、演奏してみましょう。おそらく、レイテンシが以前と比べて劇的に小さくなり、リアルタイム演奏に使えるようになるはずです。

図14 モジュレーションホイールやプログラムチェンジキーもちゃんと動く
図14 モジュレーションホイールやプログラムチェンジキーもちゃんと動く

なお、JACKサウンドサーバで使う場合は以下のように実行します。

$ timidity -iA -Oj --buffer-fragments=3,7 --realtime-priority=50  --sequencer-ports=1;
Opening sequencer port: 129:0
cannot complete execution of the processing graph (Resource temporarily unavailable)
zombified - calling shutdown handler

zombifiedやshutdownという怪しげな出力が表示されますが、これはtimidity++が、MIDI接続を検知しない限りはサウンドの出力ポートを開かないためです。そのため、qjackctlのconnectウィンドウでtimidity++のMIDI入力ポートに出力ポートを接続すると、サウンドの出力ポートが見えるようになります。

図15 Patchageの画面。PatchageはJACKサウンドサーバにおいて、音の入出力とMIDI入出力を自在に接続するためのユーティリティで、timidity++のMIDIポートに接続をすると、音の出力ポートが設けられるのがわかる
図15 Patchageの画面。PatchageはJACKサウンドサーバにおいて、音の入出力とMIDI入出力を自在に接続するためのユーティリティで、timidity++のMIDIポートに接続をすると、音の出力ポートが設けられるのがわかる

timidity++は残念ながらソフトウェアシンセサイザとしてのウィンドウを持たないため画面操作ができませんでしたが、これは稀なケースです。Ubuntuではtimidity++以外にも、ソフトウェアシンセサイザのパッケージが提供されており、画面操作できるものが大半です。こういったシンセサイザに関しては、また機会に紹介できればと思います。

さてこうやって見渡してみると、ソフトウェアからハードウェアまで、果てはバッファやLinuxのスケジューリングまで、話が広範囲に及んでしまいました。読者のみなさんも大変だったと思います。ですが、LinuxでMIDIやサウンドを扱うのに必要な知識はおおよそこのくらいです。機材を揃えるのは大変ですのでまずはソフトウェアから試してみて、Linuxのサウンド環境に慣れていっていただければ幸いです。

おすすめ記事

記事・ニュース一覧