VST3ホストを作ろう（７） 〜VST3 プラグインのインストールディレクトリについて〜

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

## はじめに

　今回は、 VST3 のインストールディレクトリについて解説します。

　今回も前回と同様、 Windows／macOS 環境向けの VST3 プラグインに関する内容のみを取り上げます。 Linux 環境向けの VST3 プラグインに関する仕様に興味がある場合は、ドキュメントの以下のページを参照してください。

* https://steinbergmedia.github.io/vst3_doc/vstinterfaces/vst3loc.html

## VST3 プラグインのインストールディレクトリについて

　VST3 規格では、VST3 プラグインをインストールするためのディレクトリをいくつか定義しています。プラグインのインストーラは、このディレクトリやその中に作ったサブディレクトリにプラグインファイルをインストールします。

　各ディレクトリには優先順位が定められていて、ホストアプリケーションのプラグインスキャン処理では、その優先順位に従ってそれぞれのディレクトリを再帰的にスキャンし、VST3 プラグインを探索します。ただし DAW によっては、 VST3 プラグインを探索するディレクトリをユーザーが任意に設定できるようにしているものもあります。[^scan_by_host]

[^scan_by_host]: Audio Units や DX プラグインなどのプラグイン形式では、プラグインのインストール時に（暗黙的あるいは明示的に）プラグインの情報をシステムに登録しておき、ホストアプリケーションはシステムの API を利用してプラグインを列挙する仕組みになっています。これに対して VST3 ではホストアプリケーションが自分でファイルシステムをスキャンしてプラグインを探索する仕組みになっています。

　また各ディレクトリには、そのディレクトリがどの目的で使用されるものかを表すディレクトリ種別が設定されています。それぞれのディレクトリ種別の意味は以下のとおりです。[^about_location_type]

[^about_location_type]: ここでいうディレクトリ種別は、ドキュメント上では Location と呼ばれています。この記事では分かりやすさのために言い方を変更しています。

|ディレクトリ種別|意味|
|:--------------|:--|
|User|あるユーザーが使用可能なプラグインをインストールするディレクトリ|
|Global|システム全体から利用可能なプラグインをインストールするディレクトリ|
|Application|あるホストアプリケーションで使用するためのプラグインをインストールするディレクトリ|

### macOS 環境のインストールディレクトリ

| スキャンの優先順位 | ディレクトリの種別 | ディレクトリのパス                            |
| ------------------ | ------------------ | --------------------------------------------- |
| 1                  | User               | /Users/$USERNAME/Library/Audio/Plug-ins/VST3/ |
| 2                  | Global             | /Library/Audio/Plug-ins/VST3/                 |
| 3                  | Global[^support_network_vst3]               | /Network/Library/Audio/Plug-ins/VST3/         |
| 4                  | Application        | $APPFOLDER/Contents/VST3/                     |

[^support_network_vst3]: このディレクトリは LAN 内にある他のマシンからも利用可能なプラグインをインストールするディレクトリとして定義されています。ただし、実際にこのディレクトリが利用されることはまれです。VST3 SDK 内には、プラグインファイルを扱う処理のリファレンス実装として VST3::Hosting::Module クラスが用意されていますが、そのクラスでもこのディレクトリへの対応は TODO 扱いになっていて、正しくサポートされていません。

　これらのうち、一般的には /Library/Audio/Plug-ins/VST3/ が使用されます。

### Windows 環境のインストールディレクトリ

| スキャンの優先順位 | ディレクトリの種別 | ディレクトリのパス                                        |
| ------------------ | ------------------ | --------------------------------------------------------- |
| 1                  | Global             | <システムドライブ>/Program Files/Common Files/VST3/       |
| 1                  | Global             | <システムドライブ>/Program Files (x86)/Common Files/VST3/ |
| 2                  | Application        | $APPFOLDER/VST3/                                          |

　これらのうち、一般的には /Program Files/Common Files/VST3/ あるいは /Program Files (x86)/Common Files/VST3/ が使用されます。

　/Program Files/Common Files/VST3/ というパスは、システムのネイティブなビット長のプラグインをインストールするディレクトリを表します。つまり、システムが 64 bit 版 Windows の場合はここに 64 bit 版のプラグインをインストールし、システムが 32 bit 版 Windows の場合はここに 32 bit のプラグインをインストールします。

　/Program Files (x86)/Common Files/VST3/ というパスは、 64 bit 版 Windows で 32 bit のプラグインをインストールするためのディレクトリです。 32 bit 版 Windows ではこのディレクトリは存在しません。

### リンクの扱いについて

　VST3 規格では、定義済みディレクトリへインストールするファイルは必ずしもプラグインファイル本体である必要はなく、プラグインファイルへのリンクであってもよいとされています。[^about_link_of_plugin_files] [^link_of_pluginfile_for_vst2]

[^about_link_of_plugin_files]: この仕組みについてはドキュメント上での記述が非常に少ないため、解釈が曖昧なところがあります。ここでは、ドキュメント上の記述と Steinberg 社が開発している Cubase 10 の挙動を調べた結果をもとに解釈しています。

[^link_of_pluginfile_for_vst2]: 以前から Ableton Live のような DAW では、 VST2 プラグインを探索するディレクトリの中にリンクがあるとそれをたどってプラグインを探索する仕組みを持っていました。これによって複数のドライブやディレクトリに散らばった VST2 プラグインをリンクの仕組みでまとめられます。 VST3 では、その仕組みが規格として明示されるようになったと言えます。

> A Plug-in should be installed at specific folder location (links, shortcuts could be used too); see below for different predefined locations.
> -- [Plug-in Locations](https://steinbergmedia.github.io/vst3_doc/vstinterfaces/vst3loc.html#pluginloc)

　つまり、プラグインファイル本体は定義済みディレクトリとは別のディレクトリへインストールしておいて、定義済みディレクトリへは、そのプラグインファイルやディレクトリへのシンボリックリンク／ショートカット（Explorer）／エイリアス（Finder）を配置することが認められています。

　このためホストアプリケーションは、プラグインスキャン処理で見つかったファイルがリンクだった場合は、適切にそのパスを解決してプラグインファイルの実体を参照する必要があります。

　ただし、この仕様は VST3 SDK のドキュメント上であまり詳しく書かれていないため、この仕様がどれだけ十分に実装されているかは、ホストアプリケーションごとに違いがあります。筆者が試した限りでは、Steinberg 社が開発している Cubase 10 ではシンボリックリンク／ショートカット／エイリアスのいずれも正しく扱えましたが、他の DAW では、シンボリックリンクは正しく扱えても、ショートカットやエイリアスは正しく扱えないというケースがありました。[^link_support_for_vst3sample_host]

[^link_support_for_vst3sample_host]: 筆者が用意した Vst3SampleHost でも、この仕組みはまだ対応できていません。

　これを踏まえて考えると、プラグインのインストーラを開発する場合は、やはり定義済みディレクトリへは、リンクではなくプラグインファイルを直接インストールするのが安全そうです。一方でホストアプリケーションを開発する場合は、シンボリックリンク／ショートカット／エイリアスすべてに対応して正しくパスを解決できるようにしておけば、そのホストアプリケーションを使うユーザーが VST3 プラグインを別のディレクトリやドライブに整理できるようになって、利便性が向上します。[^plugins_all_in_c]

[^plugins_all_in_c]: プラグインを VST2 から VST3 へ移行するとプラグインが全部 C ドライブにインストールされてしまって好ましくない、という話を時々目にします。もしユーザーが使用しているホストアプリケーションが正しくリンクを扱えるように実装されていれば、ユーザーは自分で VST3 プラグインを別ドライブへ整理できます。

### コラム: VST2 のインストールディレクトリについて

　VST2 規格では VST3 規格と異なり、標準のインストールディレクトリが規定されてませんでした。

　macOS 環境では、Apple が以下のディレクトリを VST2 プラグインの標準インストールディレクトリとして規定していため、多くのプラグインベンダーやユーザーがそのディレクトリを使用できて、あまり VST2 プラグインのインストールディレクトリについて問題になることはありませんでした。

* /Library/Audio/Plug-Ins/VST
* ~/Library/Audio/Plug-Ins/VST 

　一方で、 Windows 環境では、ユーザー環境ごとに VST2 プラグインのインストールディレクトリが異なって、問題となることがありました。[^user_support_for_vst2]

[^user_support_for_vst2]: 例えば、プラグインベンダーが想定したインストールディレクトリと、ユーザー環境で使用しているインストールディレクトリが異なって、「プラグインをインストールしたはずなのにプラグインが見つからない」というトラブルが発生することがありました。

　Windows 環境では、 VST2 のインストールディレクトリとして、以下のようなディレクトリがよく利用されていました。

* C:\Program Files\VSTPlugIns
* C:\Program Files\Steinberg\VSTPlugins

　また、VST2 のバージョン 2.4 からは、以下のレジストリキーに設定されたパスを VST2 プラグインの標準ディレクトリとする、という仕様が導入されました。

* HKEY_LOCAL_MACHINE\SOFTWARE\VST\VSTPluginsPath

　ただし、結局このレジストリキーの値が実際にどのディレクトリを指すのかは規定されていなかったため、DAW やプラグインインストーラがこのレジストリに好き勝手なパスを設定してしまい、変なパスが VST2 プラグインのインストールディレクトリとして使われてしまうケースがありました。

　このように問題の多かった VST2 のインストールディレクトリですが、現在 Steinberg 社は、 VST3 プラグインの標準インストールディレクトリを規定したのに合わせて、それと同様の /Program Files/Common Files/VST2 というディレクトリを VST2 プラグインの標準インストールディレクトリにすることを推奨しています。

* 参考: https://helpcenter.steinberg.de/hc/en-us/articles/115000177084
* 参考: https://helpcenter.steinberg.de/hc/en-us/articles/115000171310

# 終わりに

　今回は、 VST3 プラグインのインストールディレクトリに関する仕様について解説しました。 [次回](https://qiita.com/hotwatermorning/items/86c255aa874705c56453) は、モジュールとプラグインの構造について解説します。