Domino と FluidSynth の連携 ― オープンソースのサウンドフォント・シンセサイザー

苦労してもビルドする価値があるオープンソースのサウンドフォント・シンセサイザー

PC  :dynabook T552/58GKD
OS  :Windows 10(ver 1803)
IDE:Visual Studio 2017 Community

はじめに:

GitHub から、FluidSynth というサウンドフォント・シンセサイザーのコードパッケージをダウンロードしてみた。これは SF2 形式のサウンドフォントをサンプル音源として使用する、オープンソースのシンセサイザーだ。実行ファイルをビルドするのにかなり高度な開発ツールを使うが、プログラミングの知識は必要ないので、根気さえ続けば誰でもビルドすることができる。

最新版の v 2.0.1 (2018/10/31 現在)は、全部で 16 個のプロジェクトで構成されている。
その中で特に重要なのは libfluidsynth プロジェクトと libfluidsynth-OBJ プロジェクト、それに fluidsynth プロジェクトだ。前 2 者は libfluidsynth.dll (以下 LibFluidSynth)をビルドし、後者はその DLL を用いて MIDI 再生コンソールアプリケーションの fluidsynth.exe(以下 FluidSynth)をビルドする。

私は今 FluidSynth と LibFluidSynth の両方で色々なテストをしているが、この記事では Domino とFluidSynth の連携について少し説明するつもりでいる。それほど多くの実例は挙げられないが、MIDI チャンネルごとに違うサウンドフォントを割り当てる方法は、多分良い使用例になっていると思う。

ビルドの説明を後回しにしたのは、まず各位に FluidSynth の特徴を知って頂いた方が良いだろうと考えたからだ。
最初に言ったように、FluidSynth のビルドには根気が必要だ。それに開発環境として使う Microsoft Visual Studio はかなりのディスクスペースを占有する。これらは決して小さくないリスクだ。なのでこれをビルドする / しないの判断は、メリットとリスクを秤(はかり)にかけた後で下しても遅くはない。

スポンサーリンク

1)FluidSynth を使ってみる(メニューへ戻る

ここでは、Domino と FluidSynth を loopMIDI で接続して、Domino から送られた MIDI 信号を FluidSynth 側で受信・再生するための設定の実例を示す。

実例は FluidSynth の機能の一部を使用しているにすぎないが、それでもサウンド・フォントプレイヤーとしては、DAW で VST プラグイン TX16Wx  を使用した場合と、ほぼ同等の性能を実現できる。
audio ドライバーとして ASIO を使用しないので、音質はその組み合わせよりむしろ優れている。

BAT ファイルと設定ファイル:

この FluidSynth の使用例では、BAT ファイルと 2 個の設定ファイルを使っている。
FluidSynth のほとんどの機能は、起動時のオプション引数と専用シェルコマンドで設定することができる。実際に設定している機能の概略は、下の枠内のリストを参照して頂きたい。

FluidSynth は MIDI データ再生中でもシェルコマンドを受け付けるが、プロンプト上の直接入力によるコマンドの発行は、テスト以外の意味を持たない。なので、FluidSynth のデフォルト設定を変更する場合は、設定ファイルの作成は必須事項だ。BAT ファイルは必須とまでは言わないが、作っておいた方が便利であることは間違いない。

テスト中の機能:

  • 複数プロセスの実行。
  • 複数のサウンドフォント(sf2 形式)の読み込み。
  • チャンネルに任意のサウンドフォントのプログラム(※)を設定。
  • 外部 MIDI シーケンサーの出力を再生。

※ 今後サウンドフォントのプログラムについては、ソースコード内のオブジェクトの名称にならいプリセットと言う。プリセットはひとつ以上のインストゥルメント(楽器)で構成されている。

他の機能の使い方と設定方法は次のリンクを参考にして頂きたい。
両方とも英文サイトだが、Google Chrome ならかなり正確に翻訳してくれる。Microsoft Edge は逐語訳的でかなり読みづらい。

FluidSynth:UserManual
FluidSynth:BuildingWithCMake

追記:2020年 5月14日

ビルド用ドキュメントのリンクを BuildingWithCMake に変更。

FluidSynth の複数プロセスの非同期起動の設定は  fluidsynth.bat に記載してある。オプション引数が指定してあるので、見逃さないようにして頂きたい。

あとは、設定内容に応じた FluidSynth のシェルコマンドを、設定ファイル ElectricChannel.config と DrumsChannel.config にそれぞれ記載してある。

  • 複数プロセスの起動と、MIDI デバイス、MIDI チャンネル設定などの実例

BATファイル:fluidsynth.bat

#最初のプロセスを起動する。MIDIデバイスを loopMIDI port 1 に設定し、MIDI データを STD OUT に書き出す。設定ファイルを読み込む。
start D:\FluidSynth\fluidsynth.exe -o midi.winmidi.device=”loopMIDI Port 1″ -d -f D:\FluidSynth\ElectricChannel.config

# 2番目のプロセスを非同期で起動する。MIDIデバイスを loopMIDI port 2 に設定し、MIDI データを STD OUT に書き出す。設定ファイルを読み込む。
start D:\FluidSynth\fluidsynth.exe -o midi.winmidi.device=”loopMIDI Port 2″ -d -f D:\FluidSynth\DrumsChannel.config

設定ファイル:ElectricChannel.config

#最初のプロセスにサウンドフォントを 2個読み込む。
load d:\\sf2\\32MbGMStereo.sf2
load d:\\sf2\\A320U.sf2

#fluidsynth チャンネル 1 に、32MbGMStereo のプリセット 18 を設定する。
select 0 1 0 18
#fluidsynth チャンネル 3 に、A320U のプリセット 37 を設定する。
select 2 2 0 37

#Router を設定する。関連コマンドは loopMIDI からの入力に対してのみ有効。
#以下の設定は機能の確認だけを目的にしている。実用的な意味はない。

#fluidsynth Router をクリアする。
router_clear

#MIDI チャンネル 1 の入力を fluidsynth チャンネル 1 に出力する。
router_begin note
router_chan 0 0 0 0
router_end
#MIDI チャンネル 3 の入力を fluidsynth チャンネル 3 に出力する。
router_begin note
router_chan 2 2 0 2
router_end

#ピッチベンドを有効にする(すべてのチャンネル)。
router_begin pbend
router_end
#プログラムチェンジを有効にする(すべてのチャンネル)。
router_begin prog
router_end
#コントロールチェンジを有効にする(すべてのチャンネル)。
router_begin cc
router_end
#チャンネルプレッシャーを有効にする(すべてのチャンネル)。
router_begin cpress
router_end
#キープレッシャーを有効にする(すべてのチャンネル)。
router_begin kpress
router_end

設定ファイル:DrumsChannel.config

#2 番目のプロセスに、ドラムスのサウンドフォントを読み込む。
load d:\\sf2\\KDrum.sf2

# fluidsynth チャンネル 10 に、KDrum のバンク 128 のプリセット 32 を設定する。
select 9 1 128 32

router_clear

#MIDI チャンネル 10 の出力を Drums 専用 fluidsynth チャンネル 10 に入力する。
router_begin note
router_chan 9 9 0 9
router_end

router_begin prog
router_end
router_begin cc
router_end
router_begin cpress
router_end
router_begin kpress
router_end

BAT ファイルのバックスラッシュ「\」は 1本だが、設定ファイルでは全部 2本になっていることに注意!
バックスラッシュは、通常のテキストエディタでは円マーク「¥」として表示される。

  • 2 個のプロセスの動作状態

下の図は FluidSynth の 2 個のプロセスが動作中の様子を示している。
上がギター、オルガン、ベースなどのエレクトリック楽器で、下がドラムスだ。ドラムス画面で警告が出ているのは、使用しているサウンドフォントの KDrum に bank 0(ゼロ)と program 0 が存在しないからだ。

また、event というプリフィックス付きの行は、Domino から受信した MIDI イベントのデータだ。起動時オプション引数に【-d】を指定すると、音声の再生と同時にデータがダンプされる。


起動中の 2 個のプロセス
  • プロセスごとの音量調整

下の図は、前回紹介した音量ミキサー EarTrumpet の様子を示している。

タスクバーで EarTrumpet のミキサーを表示させ、そこで再生中の FluidSynth のアイコンを右クリックすると、このような画面になる。動作中の 2 個のプロセスの音量を、それぞれ個別に調節することができることが分かる。テストで 2 個のプロセスを起動しているのは、EarTrumpet でそれが可能かどうか確認したかったからだ。

こういうことは、もう少し早く言っておくべきだったかな?


EarTrumpet

2)FluidSynth をビルドしてみる(メニューへ戻る

私は CMake のこと何も知らずにビルドを開始したので、CMake で Visual Studio のソリューションをビルドするところでかなり苦労した。苦労の大半は、マニュアルとして参照した Building FluidSynth with CMake の説明不足か、そうでなければ私の読み違いか、または私の知識不足が原因だ。

Visual Studio を使うのだからと言って、マニュアルの Building with Visual Studio on Windows セクションに書かれている手順だけに従っていたのでは、ビルドはうまく行かない。私は次の段で説明する【コンポーネントのダウンロード】からやり直して、ビルドに成功した。

マニュアルトップ:Building FluidSynth with CMake
コンポーネントのダウンロード:
  • (1)参考サイト内の【Building with MinGW on Windows】の 64-bit Windows 、または 32-bit Windows  のリンクにあるコンポーネントをダウンロードする。
  • (2)マニュアルに書かれている手順を実行する。ただし MinGW は使わないので、それに関する部分は無視してかまわない。

32bit 版の gettext-runtime-018 は、ファイルが不足しているため使用できない。私は下のリンクから gettext-runtime-0.13.1.bin.woe32.zip をダウンロードして使用した。

ダウンロード先:Index of /gettext

(2)の手順では freesw というフォルダにコンポーネントを集約して、 freeswinclude フォルダのパスを環境変数 %Path% に登録している。

私は 32bit 版 と 64bit 版の両方をビルドするために freesw32 と freesw64 というフォルダを作ったが、誤って両方の include フォルダを %Path% に登録したため、64bit 版のビルド時に Visual Studio のコンパイルエラーを大量に発生させてしまった。
どちらかを作成する場合は、作成しない方のフォルダを %Path% から削除するか、またはフォルダ名を変更する必要がある。

それと、include フォルダに dsound.h をコピーするかまたは DirectX SDK をインストールしなければならないと書いてあるが、Visual Studio を使う場合はそれらを実行する必要はない。

FluidSynth コードパッケージのダウンロード:

以上でコンポーネントの準備はできたので、次はソースコードパッケージのダウンロードだ。

下の枠内のリンクへ移動して FluidSynth のコードパッケージをダウンロードする。
バージョンが数種類用意されているので好きなものを選ぶことができるが、あまり古いの選ぶと、CMake 使用時に警告が出てストップする可能性がある。警告は「ダブルクォーテーションが不要だ」とかいうものだ。当然最新版を使うのがお勧めだ。

2018/10/22 現在の最新は v 2.0.1 だ。
私は v 1.1.10 を使っていたが、この記事を書くために最新版に変更した。
FluidSynth のホームで Download を選択すると、最新バージョンのダウンロードサイトが表示される。

FluidSynth :Home

開発ツールのダウンロード:

FluidSynth をビルドするのにプログラミングの知識は必要ない。
開発ツールと FluidSynth のソースコード、それと上に挙げた必須コンポーネントを全部揃えることができたら、今まで開発ツールなど使ったことがない人でもビルドできるだろう。

Visual Studio のダウンロードには Microsoft アカウントが必要になる。
Windows ユーザーならほとんどの人が持っていると思うが、持っていない人は、Visual Studio をダウンロードする時に新規作成すれば良い。

CMake は 次のリンクの cmake-3.13.0-rc1-win64-x64.msi をインストールして使用した。Visual Studio は無償バージョンのコミュニティ版をダウンロードした。

CMake :Download
Microsoft Download: Visual Studio 2017

私はこの記事を書くために CMake を最新バージョンに変更したのだが、リンクを再度チェックしてみたら、バージョンが上がっているようだ。今は rc1 が rc2 になっている(2018/10/30 現在)。

Visual Studio のダウンロードとインストールには 3 ~ 4 時間程度はかかると思った方が良い。

Visual Studio のインストールが終了したら、無償バージョンといえども製品登録する必要がある。
Visual Studio を起動し【ヘルプ > 製品の登録】を選択して登録を済ませる。はい、おめでとう。これであなたも開発者コミュニティーの仲間入りだ。

ビルドの注意事項:

ここではビルドの詳細な手順は説明しない。

何しろ、CMake については私自身が納得していない部分がたくさんあるので、うっかりしたことは書けないのだ。そのうち何か書くことがあるかもしれないが、いつということは言えそうもない。なので、ここでは注意事項を二つほど挙げるにとどめておきたい。

  • Visual Studio 使用時のエラーと対策

私の環境で、Visual Studio の【ソリューションのリビルド】を実行するか、または libfluidsynth プロジェクトをビルドした後に fluidsynth プロジェクトをビルドすると、ほぼ 100% の確率で次のようなエラーが発生する。

重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー LNK1104 ファイル ‘Debugfluidsynth.lib’ を開くことができません。 fluidsynth D:FluidSynth-Projectvs-projectfluidsynth-2.0.1srcLINK 1

このエラーは、おそらく他の環境でも発生するんじゃないかと思うが、【ソリューションのリビルド】をもう一度実行するとビルドは必ず成功するので、気にする必要はない。

  • CMake 使用時の注意

32bit 版をビルドする時は、Configure ボタンを押したときに表示される次の画面で、必ずを Visual Studio 15 2017 を選択する。64bit 版は当然 Visual Studio 15 2017 Win64 だ。

それと、私は Configure を 2 回実行してから Generate を実行している。
SourceFoge で見つけた別バージョンのマニュアルに書いてあったとおりにしているのだが、本当にその必要があるかどうかは検証していない。なお、そのエントリーは既に削除されている。


CMake のコンパイラ選択画面

あとがき:(メニューへ戻る

私が今取り組んでいるのは、NFluidsynth という、atsushieno 氏が作成した Visual Studio ソリューション LibFluidSynth の中のラッパークラスの編集作業だ。
何をやっているのかということについては次回に報告するつもりだが、どのように取り組んでいるのかという点については、すぐ答えを言うことができる。下のリストがそうだ。

1)FluidSynth の動作を起動時引数と専用シェルコマンドで設定する(これは今回説明した)。
2)Domino の MIDI データを 使って LibFluidSynth に実装された関数の動作を確認する。
3)その結果得た知識を NFluidsynth でのコード作成・編集作業に反映する。

FluidSynth は単に LibFluidSynth のためのサンプルプログラムではない。
これがもし GUI を備えていたら、本格的な MIDI シーケンサーかまたは DAW になり得たかもしれない、と思わせるほど実は多機能なのだ。

その FluidSynth を良い手本にして、LibFluidSynth の API 関数をマネージコード C# のプロジェクトから使ってみたい、ということでコードの編集に取り組んでいる訳だ。今のところ「編集」というよりむしろ「遊んでいる」と言う方が良いようなレベルだが、しかし、ほんのわずかながら NFluidsynth のサンプルプログラムは拡張できたので、少しは役に立つ情報を提供できるんじゃないかと思っている。

スポンサーリンク

スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です