NFluidsynth ― C# のプロジェクトで LibFluidSynth API 関数を利用する。
2. NFluidsynth と LibFluidSynth のソースコードを編集する
OS :Windows 10(ver 1803)
IDE:Visual Studio 2017 Community
はじめに:
前回は、サウンドフォント・シンセサイザー FluidSynth の設定方法について説明した。
今回は、FluidSynth の基盤である libfluidsynth.dll を、Visual Studio の C# プロジェクトで利用する方法について考えてみた。
幸いなことに、その目的で作成されたコードパッケージ NFluidsynth を GitHub からダウンロードすることができる。libfluidsynth.dll の API 関数のほとんどがクラスのコンストラクタ、プロパティ、クラスメソッドとしてラッピングされているので、利用者がやるべきことは、あまり残っていない、
せいぜいが自分の目的に合わせてデフォルトのコードを修正することくらいだ。もしそれで不足ならば新しいコードを追加すれば良い。
さて、この記事では NFluidsynth のビルドについてだけ説明する。
ビルドそのものが意外に手ごわいので、記事 1 本分のスペースが必要だったのだ。コードの修正と追加については次回の記事で説明する。
1. Visual Studio 2017 で NFluidsynth をビルドする
1)NFluidsynth ソリューションのビルド
1)NFluidsynth ソリューションのビルド
ソースコードの準備:
NFluidsynth のコードパッケージは下のリンクからダウンロードできる。
ついでに FluidSynth と Visual Studio 2017 Community のダウンロード先も再掲してある。
ソースコードのダウンロード:
FluidSynth はバージョン 2.0.1 を使用している。
最新版の v2.0.2 は実行時に不具合が発生して私の環境では使用できなかった(2018/11/29 現在)。
ビルドしたのは 32 bit 版だ。今のところ原因を調査する気はない。
NFluidsynth :nfluidsynth
FluidSynth :Home
Visual Studio 2017 Community のダウンロード:
Microsoft Download: Visual Studio 2017
- 著作権とライセンス
NFluidsynth および FluidSynth の著作権とライセンスは以下のとおり。
開発者に対する敬意と、ライセンス条項の遵守(じゅんしゅ)を忘れないようにして頂きたい。
NFluidsynth 著作権とライセンス:
The MIT License (MIT)
Copyright (c) 2014 Atsushi Eno
ライセンスの詳細:LICENSE
FluidSynth 著作権とライセンス:
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
ライセンスの詳細:LICENSE
NFluidSynth ソリューションとプロジェクトの設定:(return)
- libfluidsynth プロジェクトの追加
最初に、NFluidsynth ソリューションに FluidSynth ソリューションの二つのプロジェクトを追加する。
これで C で書かれたコード ―― ネイティブコード側の編集とデバッグが可能になる。
libfluidsynth プロジェクトの追加手順:
- (1)【メニュー > 追加 > 既存のプロジェクト】 を選択して、ファイルダイアログで前回作成した FluidSynth ソリューションが配置されているフォルダを開く。
- (2)src フォルダを開き、プロジェクトファイル libfluidsynth.vcxproj を指定する。
- (3)同じフォルダの libfluidsynth-OBJ.vcxproj を追加する。
- ソリューションの設定
プロジェクト数は、ネイティブ側の二つを含めて 10 個になった。
ビルド対象はそのうちの 6 個だ。ソリューションエクスプローラーでソリューションタイトルを右クリック 、メニューから構成マネージャーを選択して、Debug、Release の両方を下のテーブルの【変更後の設定】のとおりに設定する。
プロジェクト名 | デフォルトの設定 | 変更後の設定 |
libfluidsynth | ー | ○ |
libfluidsynth-OBJ | ー | ○ |
NFluidsynth.Desktop | ○ | ○ |
NFluidsynth.MidiAccess | ○ | ー |
NFluidsynth.MidiAccess.Shared | ー | ー |
NFluidsynth.Sample | ○ | ○ |
NFluidsynth.Shared | unavailable | unavailable |
NFluidsynth.Tests | ○ | ○ |
NFluidsynth.Shared は構成マネージャーで設定できない。
また今は次の二つのプロジェクトは無視する。Windows 上では alsa-sharp は必要ないので、ソリューションから削除しても良いだろう。ファイルが HDD から削除されるわけではないので、心配はいらない。
Commons.Music.Midi.Desktop:読み込み失敗
もし NFluidsynth.MidiAccess と NFluidsynth.MidiAccess.Shared をビルドしたければ、依存関係のある Commons.Music.Midi.Desktop の問題を解決する必要がある。
- プロジェクトの設定
libfluidsynth プロジェクトのデバッグを可能にするため、NFluidsynth.Sample プロジェクトのプロパティを設定する。
NFluidsynth.Sample プロジェクトの設定手順:
- (1)NFluidsynth.Sample プロジェクトを右クリックして、メニューの【プロパティ】を選択する。
- (2)プロパティ設定画面の【デバッグ】メニューを選択する。
- (3)デバッガ―エンジンの項目の【ネイティブコードのデバッグを有効にする】のチェックを ON にする。
プロジェクトのソースコードの修正:(return)
このままでもビルドは可能だが、プログラムの実行はできない。
なにが起きるのか確認したければ、F5 キーを押してみると良い。次から次へと実行時エラーが発生してがっかりするはずだ。それを解決するため、次の順番でプロジェクトのソースコードを修正・編集する。
- LibFluidsynth.cs ファイルの編集
NFluidsynth.Shared > NFluidsynth.Native フォルダを開き、フォルダ内のすべてのソースコードファイルを開く。LibFluidsynth.cs を選択して次のコード例を参考にしてコードを変更する。変更が終了したら、ファイルを保存してから必ず閉じる。
LibFluidsynth.cs の変更:
- 置換対象文字列
LibraryName = “fluidsynth”;
- 変更後のコード
“fluidsynth” を libfluidsynth.dll(※)のフルパス名で置換する。もしパス名の中に空白(スペース)が含まれている場合は、文字列リテラルの先頭に@マークを付ける。例ではバックスラッシュ「\」を一本で済ませるために付けている。日本語環境ではバックスラッシュは通常「¥」と表示されるので、注意して頂きたい。
1 2 3 4 5 6 7 |
#if DEBUG public const string LibraryName = @"C:\UserPath\fluidsynth-2.0.1\src\Debug\libfluidsynth"; #else public const string LibraryName = @"C:\UserPath\fluidsynth-2.0.1\src\Release\libfluidsynth"; #endif |
配布用のパッケージを作成する場合は、すべての DLL を実行ファイルと同じディレクトリに置く方が間違いが少ない。その場合は【LibraryName = “libfluidsynth”;】としなければならない(fluidsynth ではない)。
- ※ 例では libfluidsynth.dll となっているが、libfluidsynth プロジェクトはデフォルトで libfluidsynth-2.dll を作成するので、注意して頂きたい。私はプロジェクトの構成プロパティ > 全般 > ターゲット名を libfluidsynth.dll に変更している。ターゲット名を変更したら、ついでに構成プロパティ > リンカー >プログラムデータベースの生成のデータベース名も変更した方が良いだろう。変更しなくても問題はないので、これは各位の自由だ。
- その他 6 個のファイルの修正
文字列の修正:
- (1)編集 > 検索と置換 > クイック置換を選択して、検索・置換用パネルを開く。
- (2)検索テキストボックスに【LibraryName】と入力する。
- (3)下のコンボボックスに【LibraryName, CallingConvention = CallingConvention.Cdecl】と入力する。
- (4)下のリストで【すべての開かれているドキュメント】を選択する。
- (5)すべて置換する。
- (6)上の文字列の処理が終わったら、下のテーブルに従ってすべて置換する。
置換前文字列 | 置換後文字列 |
SysInt | I4 |
SysUInt | U4 |
I4)] bool | Bool) bool |
- (7)LibFluidsynth.Misc.cs の二つの関数の [return:MarshalAs (UnmanagedType.I4)] の【I4】を【Bool】に変更する。
これでソリューションのビルドと、サンプルプログラムの実行が可能になった。
ただしこれは最小限の処理だ。コードの変更にともない追加の文字列置換処理が必要になることがあるので、注意して頂きたい。
ソリューションのビルドとサンプルプログラムの実行:(return)
- サンプルプログラムの実行
実行プログラムで MIDI ファイルを再生する場合は、NFluidsynth.Sample プロジェクトのプロパティページの開始オプション > コマンドライン引数に、サウンドフォントファイルと MIDI ファイルのパス名をそれぞれ指定する。この時、パス名にダブルクォーテーションは不要だ。それと第一引数の前にスペースを挿入する必要がある。次の例を参考にして頂きたい。
では F5 キーを押してデバッグモードを開始して見よう。
MIDI ファイルを再生しない場合は、単音のシンセ音が再生されてから数秒後にプログラムが終了するはずだ。
- ネイティブコードのデバッグの確認
今のうちにネイティブコードのデバッグをテストしておく。
ソリューションエクスプローラーで libfluidsynth-OBJ > Source Files フォルダを展開して、fluid_midi.c ファイルをダブルクリックする。コードウィンドウの 601 行目あたりにある new_fluid_synth 関数の適当なところにブレークポイントを設定して、F5 キーを押す。コードの実行がそのプレークポイントで止まれば、テストは成功だ。
あとはブレークポイントを削除して、デバッグ > 続行を選択する。ツールバーの 【↑ :ステップアウト】を押して、この関数の呼び出し元に戻ってみるのも良いだろう。
この章のおわりに:
次回は少し C と C# のコードを編集する。
読み返してみると何となく「私は何でも知っている」的な雰囲気の記事になっているが、もちろんそんなことは全然ない。
確かに C# では結構な量のコードを書いたことがあるが、それは全部 SQLServer のデータベースがらみのことで、今回のようなハードウエア寄り、というかシステム寄りのプログラミングは今までほとんどやったことがないのだ。なのでこんなことを言い切って大丈夫か・・・みたいなところもあると思うので、間違いがあったらどうかビシバシと指摘して頂きたい。