Ubuntu Weekly Recipe

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

この記事を読むのに必要な時間:およそ 5 分

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とを接続

注2
このコントロールキーとCを同時押しで終了するという方法は,端末上で実行したアプリケーション一般に使えます。また,timidity++は-iADオプションで実行すると常駐アプリケーションとなりますが,その際はコマンド$ killall timidity;で終了する必要があります。

レイテンシ対策

ハードウェア/ソフトウェア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で行えるものもあります。

注3
Firewire接続のサウンドデバイスに対するドライバであるFFADOも同様の構造のリングバッファを実装しているため、JACKサウンドサーバでバッファの調整をする事ができる

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

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;

著者プロフィール

坂本貴史(さかもとたかし)

Ubuntuのマルチメディア編集環境であるUbuntu Studioのユーザ。主にUbuntu日本コミュニティとUbuntu Studioコミュニティで活動。いつかユーザ同士で合作するのが夢。