試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

FluidSynth/QsynthでサウンドフォントをリアルタイムなALSAのMIDI音源として使用

TiMidity++とFluidSynth

サウンドフォントはTiMidity++から使用することができるが、FluidSynthというツールを用いることで、ALSA上で使用可能なソフトウェアMIDI音源として動作することもできる。
TiMidity++ALSAMIDI音源として使用*1すると音が遅れて出るという問題があるが、FluidSynthは遅延が非常に短いのもメリット。逆に、過去のMIDI音源向けのデータを読ませたりすると、TiMidity++よりもひどい演奏になったりすることも多い。また、TiMidity++と違って、設定ファイルで音色単位で音量や左右の振りを調整するといったこともできない。
TiMidity++と比べると、再生よりもオーディオ作成用途に向いている気がする。

Qsynthについて

FluidSynth自体はCLIのツールとなっていて、対話シェル上でサウンドフォントを読み込んだり各種調整を行ったりするのだが、これでは使いにくいため、Qsynth(http://qsynth.sourceforge.net/)というGUIが存在する。これは、JACK Audio Connection KitのGUIであるQjackCtl(http://qjackctl.sourceforge.net/)の姉妹品っぽい。
以下はQsynthを使用した覚え書きとなっている。

PCMオーディオの出力

ALSA PCMもしくはJACK Audio Connection Kitのいずれかを利用できる。別のアプリケーションで録音したい場合なども含め、JACK Audio Connection Kitを推奨。

エンジンとバンク・音色

1つの「音源」として扱えるひとまとまりを「エンジン」といい、制御用のMIDIポートはエンジンごとにそれぞれ用意される。
各エンジンでは、「Setup...」ボタンからMIDI/オーディオ出力/サウンドフォントの設定が行える他、音量やリバーブ・コーラスの値も設定できる。
オーディオの設定では、サンプルレートの既定値が44100Hzになっているが、JACKを使用しているときに、このままだと音の高さが変わる現象が起きることがあり、その場合は、48000Hzにする。

ドラムが鳴らない?

既存のMIDIデータを再生したとき、ドラムパートが通常の楽器のパートとして演奏されてしまう場合がある。この場合、Qsynthの「Channels」ボタンを押すと出るチャンネル一覧から10チャンネルをダブルクリックしてバンク番号を「128」に指定すると、ドラムチャンネルとして使用できる。127番に独自のドラムを含むものもある。

同一エンジンに複数のサウンドフォントを含める場合の注意点

複数のサウンドフォントを1つのエンジンに含めることもできるが、バンク*2が衝突することがある。エンジン設定の「Soundfonts」タブでバンクのオフセットを指定することで、バンク番号をずらす*3ことはできるが、指定可能値が「128」までで、「128」にすると、前のフォントの128番(ドラム)と次のフォントの0番がぶつかることがあるため、ドラムを含んだタイプのものを複数使用することは難しいかもしれない。
また、バンク選択の命令*4をアプリケーションから送信する場合、アプリケーションからバンク指定できないことがある(128以上の値は送信できない)。

音色の指定について

プログラムチェンジの命令を送ることで音色を変えることもできるが、チャンネル一覧で音色のプリセットが作成でき、何番のチャンネルにどの音色を使用するかの割り当てを記憶することができる。
エンジンの設定でMIDIチャンネル数が多く(16チャンネル単位・256まで)確保できることや、上のバンク番号の指定方法(バンク番号がずれる*5/128以上のバンク番号を用いる場合がある/ドラムの指定が特殊?)などを合わせて考えると、曲ごとにプリセットを用意しておいて、MIDIデータの中ではバンクセレクトやプログラムチェンジは使用しない、という形での使い方が無難かもしれない。
ドラムに関しては、128未満のバンクのものに限り、アプリケーション側からバンクセレクトを送信すると変更できる。バンク128のものはバンクセレクトでは指定不可?

アプリケーションからの扱い

ALSA MIDIバイスが使用できる環境上では普通にMIDIバイスとして使用できる。Wineでも使用できるが、BGMを鳴らす用途には向かない気がする。
STed2上で音を鳴らすには、「STed2上の演奏と独自インターフェースについて(VirMIDIとrcpplayを使用した例(前半後半)」のVirMIDIとrcpplayを使用する。外部プレーヤの設定方法もこの記事と同様。

関連記事:

使用したバージョン:

  • FluidSynth 1.0.8
  • Qsynth 0.3.2

*1:-iAオプションで実行

*2:扱える音色数を多くするために拡張されたまとまり。LSB/MSBの2種類あり、音色数は元々の128に2種類のバンクがそれぞれ128ずつあるので、128x128x128=2,097,152音色扱える計算だが、サウンドフォントではバンクは1種類のようだ

*3:オフセット値分大きなバンク番号で扱うことになる

*4:色々試したところ、FluidSynth 1.0.8の時点では、バンクセレクトLSBもバンクセレクトMSBも、受信すると、サウンドフォントの(1種類の)バンクを変更するようだ

*5:MIDIデータの中で、独自にずれたバンク番号を指定するのは分かりにくい