VST3ホストを作ろう（３） 〜VST3 SDK 入門〜

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

## はじめに

　連載の第一回で解説したとおり、VST3 規格に対応したホストアプリケーションやプラグインを開発するには、 VST3 SDK を使用します。

　今回の記事では、 VST3 SDK の入手方法とビルド方法について紹介します。

　ちなみに、サンプルとして用意したホストアプリケーション Vst3SampleHost のプロジェクトには、 VST3 SDK を入手してビルドする仕組みがビルドスクリプトの中に含まれているので、 Vst3SampleHost をビルドするにあたっては、今回この記事で解説するビルド処理を自分で行なう必要はありません。

## VST3 SDK の入手方法

　VST3 SDK を入手する方法は二つあります。

1. Steinberg 社のサイトから VST3 SDK のパッケージをダウンロードする方法
2. GitHub から VST3 SDK のリポジトリを clone する方法

　前者の方法で取得できる VST3 SDK を zip 版、後者の方法で取得できる VST3 SDK を git 版と呼ぶことにします。

　これらのうち、 zip 版のほうが git 版よりも含んでいるファイルが多く、より完全なパッケージになっています。そのため、最初は前者の方法で zip 版を入手して利用するほうが問題が起きにくいかもしれません。

　これに対して後者の方法は git コマンドに慣れている人に便利な方法です。特定のバージョンの SDK を入手したり、ビルドスクリプトで作業を自動化したりする場合はこちらの方法を使用するのが良いでしょう。

　それぞれの方法の手順について詳しく解説します。

### Steinberg 社のサイトから VST3 SDK のパッケージをダウンロードする方法

　Steinberg 社のサイトに、最新バージョンの VST3 SDK の zip ファイルが公開されているため、これをダウンロードします。

　まず、以下の URL から Steinberg の開発者向けページを開きます。

* https://www.steinberg.net/en/company/developers.html 

　そして、そのページの\[VST 3 Audio Plug-Ins SDK\]リンクから zip ファイルをダウンロードします。

![vst3_sdk_download_link.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/944/fab3917c-07aa-eac6-5cc9-1a40363bd676.jpeg)

　zip ファイルがダウンロードできたら、これを好きな場所に展開します。
これで完了です。

### github から VST3 SDK のリポジトリを clone する方法

　VST3 SDK は、 github 上にもホスティングされています。

* https://github.com/steinbergmedia/vst3sdk

　このリポジトリを以下の手順で clone します。ここでは、ユーザーのホームディレクトリ以下に develop ディレクトリを作成して、その中に VST3 SDK を clone します。

```batchfile:Windows環境（コマンドプロンプト）
cd "%HOMEDRIVE%%HOMEPATH%"
mkdir develop
cd develop
git clone --recursive https://github.com/steinbergmedia/vst3sdk
```

```bash:macOS環境（ターミナル）
cd ~
mkdir -p develop
cd develop
git clone --recursive https://github.com/steinbergmedia/vst3sdk
```

　これによって、`develop`ディレクトリ以下に`vst3sdk`ディレクトリが作成され、その中に SDK のファイルがチェックアウトされます。

　github 上で確認すると分かりますが、このリポジトリ自体にはほとんどファイルは含まれていません。VST3 SDK に含まれる基本ライブラリ、インターフェースクラス定義、ドキュメント関連ファイルなどはそれぞれ個別のリポジトリに細かくまとめられており、`vst3sdk` リポジトリはそれらをサブモジュールとして取り込む仕組みになっています。

　そのため、`vst3sdk` リポジトリのブランチやコミット位置を変更したときは、以下のコマンドを実行してサブモジュールの状態をそれに追従させる必要があるため注意してください。

```
cd vst3sdk
git submodule update --recursive
```

## VST3 SDK のディレクトリ構成

　以下に、 zip 版 VST3 SDK のディレクトリ構造を示します。

```
VST_SDK/.............................zip 版 VST3 SDK のルートディレクトリ
├── VST2_SDK/........................VST2 関連ファイルのディレクトリ
├── VST3_SDK/........................VST3 関連ファイルのディレクトリ
│   ├── CMakeLists.txt...............CMakeビルド設定ファイル
│   ├── LICENSE.txt..................ライセンステキスト
│   ├── README.md....................READMEファイル
│   ├── VST3_License_Agreement.pdf...ライセンス契約書
│   ├── VST3_Usage_Guidelines.pdf....VST3使用者ガイドライン
│   ├── base/........................SDK 内で用いられる基礎的な型やクラス
│   ├── bin/.........................プラグイン検証用簡易ホストのインストーラ
│   ├── cmake/.......................CMake 関連ファイル
│   ├── doc/.........................SDK のドキュメント関連ファイル
│   ├── index.html...................ドキュメントのトップページ
│   ├── pluginterfaces/..............VST3 プラグインインターフェース
│   ├── public.sdk/..................SDK の実装コードとサンプルプログラム
│   └── vstgui4/.....................VST3 プラグイン用GUIフレームワーク
├── copy_vst2_to_vst3_sdk.bat........VST2 サポートを有効にするためのバッチファイル
├── copy_vst2_to_vst3_sdk.sh.........VST2 サポートを有効にするためのシェルスクリプト
└── my_plugins/......................自作プラグイン開発のためのプロジェクトテンプレート
```

　git 版の VST3 SDK は若干構成が異なり、以下の違いがあります。

* ルートディレクトリが、上記の `VST3_SDK` ディレクトリとなります。そのため、上記の `VST3_SDK` と同じ階層にある `VST2_SDK`／`my_plugins` などのディレクトリや、VST2 サポートのためのスクリプトファイルなどが含まれません。
* VST3_SDK 内に `bin` ディレクトリが含まれません。つまり、プラグインの動作検証を行うための簡易ホストのインストーラが含まれません。

## VST3 SDK のビルド方法

　VST3 SDK を利用するには、 VST3 SDK のソースコードを静的リンクライブラリとしてビルドし、それをアプリケーションやプラグインのビルド時にリンクさせる必要があります。

　VST3 SDK をビルドするには CMake を使用します。ここでは CMake をコマンドラインで使用する方法を解説しますが、 cmake-gui のような GUI ツールに慣れている人はそちらを使用しても問題ありません。この手順については、VST3 SDK ドキュメントの "How to use cmake for Building VST 3 Plug-ins" にも記載されています。

　`cmake` コマンドを以下のように実行します。（ここでは zip 版を想定しています。もし git 版をビルドする場合は、 `vst3sdk` ディレクトリ内に `build` ディレクトリを作成して、その中で `cmake` コマンドを実行するなどに読み替えてください。）[^about_out_of_source_build]

[^about_out_of_source_build]: このように専用のビルドディレクトリを作成して、その中で `cmake` コマンドを実行する方法を `out-of-source` ビルドといいます。参考: https://qiita.com/osamu0329/items/7de2b190df3cfb4ad0ca
  
```sh:CMakeコマンドの実行例
cd /path/to/VST_SDK
mkdir build
cd build
cmake -G <generator> ../VST3_SDK
cmake --build . --config <Debug or Release>
```

　このコードを詳しく解説していきます。

```sh
cd /path/to/VST_SDK
mkdir build
cd build
```

　最初の部分では、 VST3 SDK をビルドするためのディレクトリを準備しています。 CMake のビルド設定が何かおかしくなったりよく分からない状態になったときは、このディレクトリを削除して作り直すことで、作業をやり直せます。

```sh
cmake -G <generator> ../VST3_SDK
```

　続く cmake コマンドでは　VST3 SDK をビルドするための IDE のプロジェクトファイルを生成します。`<generator>` の箇所には `Xcode` や `"Visual Studio 15 2017 Win64"` など、読者の環境で適切なものを指定します。[^platform_specification_for_msvc2019]

[^platform_specification_for_msvc2019]: `<generator>` に `"Visual Studio 16 2019"` を使用する場合は、ビルド対象のプラットフォームを指定する `Win64` のような Suffix を渡せません。この場合は `-G "Visual Studio 16 2019" -A x64` のように `-A` オプションでプラットフォームを指定してビルドしてください。

　また、このときに VST3 SDK で定義されたオプションを渡すとビルド設定を変更できます。
　デフォルトのビルド設定では、 VST3 SDK の静的リンクライブラリの他に、プラグイン開発用の GUI ライブラリである VSTGUI や、サンプルホストアプリケーション、サンプルプラグインなどがビルドされます。もし必要なものが VST3 SDK の静的リンクライブラリだけでそれ以外をビルドする必要がない場合は、以下のようにオプションを設定することでビルドにかかる時間を短縮できます。

```sh
cmake -G <generator> -DSMTG_ADD_VST3_HOSTING_SAMPLES=OFF -DSMTG_ADD_VST3_PLUGINS_SAMPLES=OFF -DSMTG_ADD_VSTGUI=OFF ../VST3_SDK
```

　IDE のプロジェクトファイルが生成できたら、`cmake --build` コマンドで静的リンクライブラリをビルドします。

```sh
cmake --build . --config <Debug or Release>
```

　ここで、`cmake --build` コマンドを使用せず、 `build` ディレクトリに生成された `vstsdk.sln` ファイルや `vstsdk.xcodeproj` を開いて IDE 上でビルドしても構いません。
　ビルドが成功すると、 `build/lib/<Debug or Release>` ディレクトリに、ビルドした静的リンクライブラリが作成されます。作成されるファイルは以下のとおりです。[^other_lib_on_windows]

[^other_lib_on_windows]: Windows環境では、この他に各サンプルプラグインの静的リンクライブラリも生成されますが、ここでは無視します。

|ファイル名（Windows)|ファイル名（macOS）|解説|
|:------------------|:-----------------|:--|
|base.lib|libbase.a|VST3 SDKの `base` ディレクトリ内のソースファイルから作られる静的リンクライブラリファイル|
|pluginterfaces.lib|libpluginterfaces.a|VST3 SDKの `pluginterfaces` ディレクトリ内のソースファイルから作られる静的リンクライブラリファイル|
|sdk.lib|libsdk.a|VST3 SDKの `public.sdk/source` ディレクトリ内のソースファイルから作られる静的リンクライブラリファイル|
|vstgui*.lib|libvstgui*.a|VSTGUI ライブラリの静的リンクライブラリファイル|

　これらのうち、先頭の３つのライブラリは VST3 プラグインやホストの開発の際には必ずリンクするようにします。名前に vstgui を含んでいる静的リンクライブラリファイルは、プラグイン開発時に VSTGUI ライブラリを利用する場合にリンクします。

## VST3 SDK の利用方法

　VST3 SDK を利用するには、ホストアプリケーションやプラグインのプロジェクトファイルで以下の設定を行います。

1. VST3 SDKのディレクトリをインクルードディレクトリに追加する。
    * zip 版の VST3 SDK では `VST3_SDK` ディレクトリ。
    * git 版の VST3 SDK では、`clone` した `vst3sdk` ディレクトリ。
2. ビルドした静的リンクライブラリをリンク設定に追加する。

　これらの設定を行った上で、自身のソースファイル内で以下のように VST3 SDK のヘッダーファイルをインクルードし、ビルドを行うことで、VST3 SDK を利用するアプリケーションを開発できます。

```c++:includeの書き方の例
#include <public.sdk/source/vst/vsteditcontroller.h> 
#include <pluginterfaces/vst/ivstparameterchanges.h>
```

　VST3 SDK には、使用頻度の多いヘッダーファイルをまとめてインクルードした、「これだけインクルードすれば VST3 SDK の基本的なクラスや関数を利用できるようになるヘッダーファイル」のようなものは用意されていないので、各自が自分のソフトウェアで必要となるヘッダーを適切にインクルードする必要があります。どのクラスや関数を利用する場合にどのヘッダーファイルをインクルードする必要があるかは、それぞれのドキュメントを参照してください。

## VST3 SDK に含まれるサンプルプラグインについて

　VST3 SDK には何種類かサンプルのプラグインが含まれていて、ホスト開発時にはこれらのプラグインを使って、ホストが正しく実装できているか検証できます。

　サンプルプラグインは、 [VST3 SDK のビルド方法](# VST3 SDK のビルド方法) に記載したコマンドでビルドできます。もし先に `-DSMTG_ADD_VST3_PLUGINS_SAMPLES=OFF` 指定して cmake を呼び出してしまった場合は、その値がキャッシュされて、サンプルプラグインがビルドされないかもしれません。その場合は、明示的に `-DSMTG_ADD_VST3_PLUGINS_SAMPLES=ON` を指定して cmake コマンドを実行してください。

　以下にサンプルプラグインの一覧を記載します。

|名前|説明|
|:---|:--|
|ADelay|シンプルなディレイエフェクトプラグイン|
|AGain|シンプルな VST3 プラグインのサンプル実装として用意されたプラグイン|
|mda|DSP 処理を VST3 プラグインとしてラップする仕組みのサンプルとして用意されたプラグイン集。オープンソースの [mda プラグイン](http://mda.smartelectronix.com/)をもとにしている。|
|Note Expression Synth|Note Expression Event に対応したインストゥルメントプラグイン|
|PitchNames|音階に別名を付ける Pitch Name 機能を実装したプラグイン|
|HostChecker|ホスト側の挙動をチェックするためのプラグイン|
|TestChannelContext|ホストからプラグインへ Channel Context という情報を渡すための機能を実装したプラグイン|
|TestLegacyMIDICCOut|プラグインから MIDI CC イベントを出力するための LegacyMIDICCOutEvent 機能を実装したプラグイン|
|TestPrefetchableSupport|プラグインの合成処理を Prefetch というモードに切り替え機能を実装したプラグイン|
|TestProgramChange|プログラムチェンジ機能を実装したプラグイン|

## おわりに

　今回は VST3 SDK の入手方法とビルド方法を解説しました。[次回](https://qiita.com/hotwatermorning/items/1015406ca955f11bf43d) は VST3 SDK のドキュメントについて解説します。