VST3ホストを作ろう（２） 〜サンプルホストについて〜

[目次](https://qiita.com/hotwatermorning/items/5ab2a687a4cbc73a0f56)

## はじめに

　この連載では、ホストアプリケーション上に VST3 プラグインをロードして利用できるところまでの解説を目指します。実際にどのように VST3 プラグインを利用できるようになるかをイメージしやすくなるように、サンプルのホストアプリケーションを用意しました。

今回は、このサンプルホストアプリケーション（Vst3SampleHost）について解説します。

![screenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944/8cdc86aa-ebf4-8598-8d6d-0412df6dc836.png)

Vst3SampleHost は、MIT ライセンスのもとでオープンソースソフトウェアとして以下の URL で公開しています。

* https://github.com/hotwatermorning/Vst3SampleHost

　今後の連載では、適宜この Vst3SampleHost のコードや実行画面も参照しながら解説を進めていきます。

　読者は、この Vst3SampleHost をデバッガ上で動かしてみたり自分でソースを書き換えて挙動を調べるたりすることで、VST3 プラグインをホストする仕組みについてより理解を深められるでしょう。

　また、ビルド環境が用意できない場合や手っ取り早く Vst3SampleHost を動かしてみたい人のために、ビルド済みアプリケーションを用意しています。（参照: [ビルド済みアプリケーションについて](#ビルド済みアプリケーションについて)）

## Vst3SampleHostのビルド方法について

　Vst3SampleHost のプロジェクトは github でホスティングしていて、Gradle[^about_gradle] というビルドシステムでビルドできるようになっています。

[^about_gradle]: オープンソースのビルドシステム。 Groovy というスクリプト言語でビルドスクリプトを記述できる。

　この手順については、プロジェクトの Wiki ページ [ビルド方法について](https://github.com/hotwatermorning/Vst3SampleHost/wiki/%E3%83%93%E3%83%AB%E3%83%89%E6%96%B9%E6%B3%95) に詳しく記載しているので、そちらを参照してください。 

## Vst3SampleHost のプロジェクトファイルについて

　Gradle で Vst3SampleHost をビルドすると、 `build_debug`ディレクトリ（リリースビルドを行った場合は `build_release` ディレクトリ）に、以下の名前でプロジェクトファイルが生成されます。

* Windows環境: Vst3SampleHost.sln
* macOS環境: Vst3SampleHost.xcodeproj

　読者は、このファイルを IDE 上で開いて、 Vst3SampleHost をデバッグしたり、コードを変更して挙動を変更したりできます。

## ビルド済みアプリケーションについて

Vst3SampleHost のビルド済みアプリケーションは、以下リンクからダウンロードできます。

* https://github.com/hotwatermorning/Vst3SampleHost/releases

　ビルド済みアプリケーションにはコード署名が付いていないため、これをダウンロードしてきてそのまま起動しようとすると、OSから警告がでる場合があります。これを回避するには、以下の手順に従って起動してください。

#### 起動方法（Windowsの場合）

　Windowsでは、インターネットからダウンロードしてきた実行ファイルを起動しようとすると、 Microsoft SmartScreen によって起動がブロックされ、以下のようなダイアログが表示される場合があります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944/a90fa4a4-c8d2-4892-fd86-564412f20428.png" alt="ms_smartscreen.png" width=66%></img>

この画面が表示された場合は、\[詳細情報\]をクリックして\[実行\]ボタンを表示し、それをクリックして実行してください。

#### 起動方法（macOSの場合）

　macOSでは、インターネットからダウンロードしてきた不明なアプリケーションを実行しようとすると、Gatekeeperによって実行がブロックされ、以下のようなダイアログが表示される場合があります。[^about_xattr_quarantine]

![スクリーンショット 2019-09-19 4.33.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944/ce92729a-04a1-81f0-c79d-58e101f5b974.png)

　これが表示された場合は、一度ダイアログの\[OK\]ボタンを押してダイアログを閉じ、以下の手順でアプリケーションを起動します。

1. Finder 上で Vst3SampleHost アプリケーションを右クリックしてコンテキストメニューを表示する。
2. Option キーを押しながらコンテキストメニューの\[開く\]をクリックする。

[^about_xattr_quarantine]: Gatekeeper によって実行がブロックされるのは、ダウンロードしてきたファイルの拡張属性に `com.apple.quarantine` が付くためなので、コマンドラインからこの属性を取り除く方法も有効です。 https://qiita.com/youcune/items/203fdc0b757e386b6345

## Vst3SampleHost の使い方

### 初回起動時

　初回起動時は、以下のように、どのデバイスを使用するかを選択するためのオーディオデバイス設定ダイアログが表示されます。読者の環境で適切なオーディオデバイスを選択してください。

![スクリーンショット 2019-09-20 19.25.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944/b67ddd2f-092e-c6a7-23fa-f6f8642e7169.png)


　この設定は、 `<ユーザーのホームディレクトリ>/Documents/diatonic.jp/Vst3SampleHost/Vst3SampleHost.conf` に保存され、次回起動時に自動で読み込まれます。

### 画面構成

![ui_items.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944/88ccc618-7b73-8f15-de5f-8354dd112948.png)

* ①: オーディオ出力音量を調整するスライダー。左端が最小（無音）で、右端が最大（0.0 dB）を表します。デフォルトでは -10.0 dB になります。
* ②: 音量メーター。チャンネルごとのオーディオ出力レベルを表示します。
* ③: マイク入力を有効にするかどうかを切り替えるスイッチ。これを有効にするとマイクやオーディオインターフェースからオーディオを入力します。
     * マイクとスピーカーの距離が近いときにオーディオ出力音量を大きくするとハウリングする可能性があるので注意してください。
     * デバイス設定でオーディオ入力デバイスをオープンしていない場合は、この機能は無効になります。
* ④: 拡張子 `*.vst3` のプラグインファイルを読み込むボタン。左側には読み込んだプラグインファイルのパスが表示されます。
* ⑤: 読み込んだプラグインファイルに含まれる`プラグインファクトリ`と呼ばれるクラスから取得した情報を表示するテキストエリア。
* ⑥: プラグインファイルの中で定義されたプラグインを列挙するドロップダウンリスト。このリストから一つプラグインを選んで、それをロードします。
* ⑦: ロードしたプラグインから取得したプラグイン情報を表示するテキストエリア。
* ⑧: プラグイン独自のエディターウィンドウや汎用的なパラメータ編集ウィンドウを開くためのボタン。
* ⑨: 鍵盤 UI 。この鍵盤をクリックすると、テスト用のオーディオ信号を生成して音を鳴らしたり、インストゥルメントプラグインに MIDI 信号を送って音を鳴らしたりできます。

### Vst3SampleHostから音が鳴るかどうか確認する

　VST3 プラグインをロードして使用する前に、 Vst3SampleHost が正しくオーディオデバイスを使える状態になっているかどうかを確認しましょう。

　Vst3SampleHost は、エフェクトプラグインで音を加工するために、基本的なテスト用オーディオ信号を生成する機能が付いています。

　PC キーボードの A, S, D などのキーを押すか Vst3SampleHost 上の鍵盤 UI をクリックするとそれに反応して音が鳴るので、試してみてください。 PC キーボードと鍵盤は以下のように対応しています。また、 PC キーボードの Z/X キーでオクターブを変更できます。

![pc_keyboard_layout.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944/81e96329-5a87-3f43-9dfb-969370753b99.png)

　もし PC キーボードを押したり Vst3SampleHost 上の鍵盤 UI をクリックしたりしても音が鳴らない／正しく再生できない場合は、以下の点を確認してみてください。

* Vst3SampleHost 上部の出力レベルの値が小さすぎないか
    * 出力レベルが小さくなっているときは、聞こえないほど音が小さくなっている可能性があります。
    * オーディオ出力音量スライダーの値をデフォルトの -10.0dB 付近に戻して試してみてください。
* オーディオ出力デバイスが正しく選択されているか
    * Vst3SampleHost が開いているオーディオデバイスが、期待しているのとは別のデバイスになって、正しいスピーカーにオーディオ信号が送られていない可能性があります。
    * 下記の [デバイス設定を変更する](#デバイス設定を変更する) を参照し、正しいオーディオ出力デバイスを選択してから試してみてください。
* サンプリングレートやバッファサイズが正常かどうか
    * サンプリングレートやバッファサイズが、オーディオデバイスが正しく対応していないものになっている可能性があります。
        * 例えば筆者の Windows 環境では、 オーディオドライバに DirectSound を使用した状態でバッファサイズの値を小さくすると、音が途切れるのではなく音が全く鳴らなくなることがありました。
    * 下記の [デバイス設定を変更する](#デバイス設定を変更する) を参照し、いくつか設定値を変更して試してみてください。

### プラグインをロードする

　Vst3SampleHost から正しく音が鳴ることが確認できたら、実際に VST3 プラグインをロードしてみましょう。

　もし一つも VST3 プラグインを持っていない場合は、無料で公開されている以下のプラグインを試してみると良いでしょう。

* インストゥルメントプラグイン
    * [Tyrell N6]: https://u-he.com/products/tyrelln6/ [^note_for_vst3_program_list]
    * プラグインデベロッパーとして有名な u-he が作成しているバーチャルアナログシンセのプラグイン。
* エフェクトプラグイン
    * [OldSkoolVerb]: https://www.voxengo.com/product/oldskoolverb/
    * Voxengo というデベロッパーが開発しているリバーブ（残響を加えるエフェクト）のプラグイン。

[^note_for_vst3_program_list]: VST3 規格は VST2 よりも仕様が複雑化したため、プログラムリスト機能が十分に実装されていないプラグインがいくつか存在します。例えば、ここで紹介している Tyrell N6 というプラグインはダミーのプログラムリストをホストに返す仕様になっていて、ホストはプラグインの本当のプログラムリストを取得できません。そのため、 Vst3SampleHost や DAW 側からプログラムを切り替えても、プラグイン側のプログラムが切り替わらない問題があります。

<!-- dummy -->
　Vst3SampleHost 上部にある \[Load Module\] ボタンを押すと、VST3 のプラグインファイルを選択するファイルダイアログが開きます。ファイルダイアログはデフォルトで以下のディレクトリからプラグインファイルを探索しますが、プラグインファイルが他のディレクトリに存在するときはそのディレクトリに移動してプラグインファイルを開いてください。
 
* Windows 環境: `C:/Program Files/Common Files/VST3`
* macOS 環境: `/Library/Audio/Plug-Ins/VST3`

![load_module.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944/851a2fc1-abae-8b1d-bfae-a46c25979b0e.png)

![open_file_dialog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944/053007ee-c856-33eb-1c3b-50795d35c393.png)

　拡張子が `*.vst3` のプラグインファイルを選択して開くと、 Vst3SampleHost はそのプラグインファイルを読み込み、プラグインファイルに含まれる`プラグインファクトリ`というクラスの情報を `Factory Info` 表示します。また、プラグインファイルに含まれるプラグインのリストをその下のドロップダウンリストに表示します。

　![display_factory_info.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944/a53ca31c-8fed-e614-2581-1f5ea21d8496.png)

　VST3 規格では、一つのプラグインファイルの中に複数のプラグインを含められるため、それらがこのドロップダウンリストに列挙されます。

　ドロップダウンリストから一つのプラグインを選択すると、そのプラグインをロードします。もしプラグインファイルに含まれているプラグインが一つだけの場合は、ドロップダウンリストは無効になり、自動でそのプラグインをロードします。

![display_plugin_list.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944/ce95dd73-0ff5-6c98-ddef-df1bb3c25670.png)

　プラグインがロードできると、そのプラグインの情報を `Component Info` というテキストエリアに表示し、エディター画面を開くためのボタンを表示します。

![display_plugin_info.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944/69ca957b-e087-afc9-f51f-5c8f9857ef8c.png)

　この状態になれば、プラグインで音を鳴らしたり加工したりできます。

### インストゥルメントプラグインで音を鳴らす

　読み込んだプラグインの `Component Info` の中に表示される `sub categories:` の中に `Instruments` という文字列が含まれていれば、そのプラグインはインストゥルメントとして動作するプラグインです。

　インストゥルメントプラグインをロードしたときは、 PC キーボードや Vst3SampleHost の鍵盤 UI で MIDI 信号を生成し、それをプラグインに渡して音を鳴らせます。

### エフェクトプラグインで音を加工する

　読み込んだプラグインの `Component Info` の中に表示される `sub categories:` の中に `Fx` という文字列が含まれていれば、そのプラグインはエフェクターとして動作するプラグイン（エフェクトプラグイン）です。

　エフェクトプラグインをロードしたときは、PC キーボードや Vst3SampleHost の鍵盤 UI でオーディオ信号を生成し、それをプラグインに渡して音を加工できます。あるいは、マイク入力を有効にしているときは、そこから取り込んだオーディオデータもプラグインへ渡されます。

### プラグインのエディターウィンドウを表示する

　プラグインを読み込んだときに表示される、\[Open Editor\]ボタンをクリックすると、各プラグインが独自に用意しているエディターウィンドウや、汎用的なパラメータ操作ウィンドウを表示できます。

　下の画像は、Vst3SampleHost 上に Waves 社の Element 2 というプラグインを読み込み、そのエディターウィンドウを開いたときのキャプチャー画面です。

![editor_window_waves_element.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944/49dc54f5-164a-f781-eca6-fc3bfacd4307.png)

　ここで、ウィンドウ上部に用意されているドロップダウンリストやチェックボックスは、プラグインを操作するためにVst3SampleHostが用意しているコントロールUIです。

![plugin_editor_controls.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944/af3b327a-65cb-ccdb-575a-5297fad18a58.png)

それぞれのコントロールの役割は以下のとおりです。

* ①: プラグインが用意しているUnitというデータ構造のリストを表すドロップダウンリストです。 各 Unit には一つのプログラムリストが紐付いています。
    * これを切り替えると、②に表示するプログラムのリストを切り替えられます。
    * Unit を複数用意しているプラグインは非常に稀なので、特に意識することは少ないかもしれません。有効な Unit を用意していないプラグインも多いです。
* ②: 現在選択中の Unit に属するプログラムのリストを表すドロップダウンリストです。
    * プログラムは、プラグインの各パラメータの状態を表すデータ構造です。
    * プログラムのリストから一つを選んで選択すると、それに合わせてプラグインの各パラメータの値が更新され、プラグインから出力される音が変化します。
* ③: 選択中のプログラムを一つ前／一つ後のものに切り替えるスイッチです。
* ④: プラグインが用意している専用のエディターウィンドウではなく、Vst3SampleHostが提供する汎用的なパラメータ編集ウィンドウを表示するためのスイッチです。

　プラグインによっては、専用のエディターウィンドウを用意していないことがあります。その場合は、 Vst3SampleHost が用意する汎用的なパラメータ編集ウィンドウを使用してプラグインのパラメータを編集できます。

![generic_parameter_editor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944/2578eca4-8cda-82fb-4b29-c7bf5dbd3976.png)

### プロジェクトを保存する

　プラグインを読み込んでパラメータを編集した状態は、「ファイル」メニューの「保存」コマンドで、`.vst3proj` ファイルとして保存できます。このファイルを「ファイル」メニューの「開く」コマンドで開き直すと、以前の状態を復元できます。

### テスト波形を変更する

　「再生」メニューの「テスト波形」で波形を選択すると、Vst3SampleHostが生成するテスト用のオーディオ信号の音を変更できます。

### デバイス設定を変更する

　「デバイス」メニューの「デバイス設定」コマンドを実行すると、デバイス設定ダイアログが開かれます。このダイアログから、使用するオーディオデバイスを切り替えたり、サンプリングレートやバッファサイズを変更できます。

　"Audio Input"／"Audio Output"のそれぞれのドロップダウンリストには、システムで見つかったオーディオデバイスが列挙されます。

　このリストの各要素の値は、 "デバイスの名前（オーディオドライバ API の名前）" のようになっています。環境によっては、一つのオーディオデバイスが複数のオーディオドライバ API から利用可能な場合があるため、これによってどのオーディオドライバ API を使用してオーディオデバイスをオープンするかを選択できるようにしています。

## Vst3SampleHost がうまく使えない時／バグを見つけたとき

　Vst3SampleHost の使い方が分からない場合は、 Twitter で [@hotwatermorning](https://twitter.com/hotwatermorning) 宛にお知らせください。

　Vst3SampleHost はこの連載のために用意したプロジェクトですが、まだ開発途上な部分があるため、バグがあったり、うまく動かないこともあるかもしれません。
　もしそのような問題を発見した場合は、 https://github.com/hotwatermorning/Vst3SampleHost/issues に問題を報告していただけると大変ありがたいです。可能な範囲で対応します。

## ライセンスについて

  Vst3SampleHost のソースコードは MIT ライセンスで公開しています。さらに、Vst3SampleHost はいくつかのライブラリに依存しているため、それらのライセンスにも従います。依存ライブラリについては、リポジトリの[README.md](https://github.com/hotwatermorning/Vst3SampleHost/blob/master/README.md)ファイルを確認してください。

　Vst3SampleHost のビルド済みアプリケーションはさらに、 Proprietary Steinberg VST3 License と Steinberg ASIO SDK License が適用されています。

　Proprietary Steinberg VST3 License は、 VST3 SDK を使用したアプリケーションを配布する場合に適用するライセンスのひとつです。 VST3 SDK は GPLv3 か Proprietary Steinberg VST3 License かどちらかのライセンスを選択できるようになっていて、 Vst3SampleHost ではこの内 Proprietary Steinberg VST3 License を適用しています。 （VST3 SDK のライセンスについては今後の記事で詳しく解説します。）

　もう一つの Steinberg ASIO SDK License は、 ASIO SDK を使用したアプリケーションを配布する場合に適用するライセンスです。 ASIO[^about_asio] は Steinberg が開発したオーディオドライバの規格で、オーディオ入出力を低レイテンシで行えるように設計されています。 Windows 環境では OS に標準で用意されている WASAPI[^about_wasapi] というオーディオドライバ以外に ASIO を利用することも多いため、 Vst3SampleHost でも ASIO を利用できるように ASIO SDK を使用しています。

[^link_to_sdklicense]: http://www.steinberg.net/sdklicenses

[^about_asio]: https://ja.wikipedia.org/wiki/ASIO

[^about_wasapi]: https://docs.microsoft.com/en-us/windows/win32/coreaudio/wasapi

### Vst3SampleHost の派生プロジェクトを開発して配布する場合

　もし Vst3SampleHost のコードを利用して派生プロダクトを作成し、それを公開する場合は、Vst3SampleHost のライセンスと Vst3SampleHost が依存しているライブラリのライセンスを適用する必要があります。

  特に、VST3 SDK は GPLv3 と Proprietary Steinberg VST3 License のデュアルライセンスなので、公開する派生プロダクトに対して、どちらを適用するかを選択する必要があります。

　さらに、Vst3SampleHost は ASIO SDK を使用しているため、派生プロダクトには Steinberg ASIO SDK License を適用する必要があります。

　つまり、派生プロダクトの作者は、派生プロダクトを以下のどちらかの形態で配布する必要があります。
* 派生プロダクトを、 GPLv3 と Steinberg ASIO SDK License のもとで公開する。
* 派生プロダクトを、 Vst3SampleHostのライセンス／その依存ライブラリのライセンス／Proprietary Steinberg VST3 License／Steinberg ASIO SDK License のもとで公開する。

　Proprietary Steinberg VST3 License を適用する場合は、 Steinberg と Proprietary Steinberg VST3 License Agreement の契約を結ぶ必要があります。この手順は今後解説します。

　同様に、 Steinberg ASIO SDK License を適用する場合は、Steinberg と Steinberg ASIO SDK Licensing Agreement という契約を結ぶ必要があります。この手順については ASIO SDK 内のドキュメントを参照してください。（とはいえ、これは Proprietary Steinberg VST3 License と似たライセンスのため、ほとんど同じ手続きで契約を結べます）

## 免責事項について

　本ソフトウェア（Vst3SampleHost）の使用は使用者の自己責任のもとで行い、筆者（@hotwatermorning）は本ソフトウェアを使用して生じたいかなる損害に対しても一切の責任を負いません。

## おわりに

今回はサンプルホストについて解説しました。

[次回](https://qiita.com/hotwatermorning/items/adf71e8a5b1a701ca585) は VST3 SDK の入手方法や使い方について解説します。