Windows CUI環境における VST3 開発

あけましておめでとうございます、今年こそはWindowsにも慣れていこうと思います。

今回はVST3開発環境構築と簡単なプロジェクトの作り方のメモです。私は以前、Dplugを使ってD言語でVSTを作っていたときはVST2を使ってました。しかしVST2の開発サポートが終わってしまったので、そろそろVST3に移行しようと考えていました。具体的なゴールとしてはVST3で登場したMIDIエフェクトが作りたいです。まず仕組みを知るために、公式のC++から入ります。ちなみにDplugではすでにVST3がサポートされています。

問題点としては、いつもメインのWin開発環境はMSYS2なのでgccを使いたいのですが、CMakeのスクリプトやC++のプリプロセッサなどを見る限りWindowsではVS前提に書かれていました (cmake -G "MSYS Makefiles" で動くようにするのは、理解の浅い現時点ではハードルが高いです)。さらに私にとってネットによくあるVSとCMakeのGUIを使った開発が無理だったので、最低限シェル内で完結して開発する方法を模索しました。

cmakeとVS2019 (VC compiler + Win10 SDK) で、VST3 SDKビルド

公式サイト How to use cmake for Building VST 3 Plug-ins

全体のながれ

  • CMake公式からビルド済みバイナリzipをDLしPATHを通す。ちなみにpacmanのcmakeはVSをサポートしてない
  • Visual Studio 2019 Installer で “C++によるデスクトップ開発” > “MSVC v142” および “Windows 10 SDK” にチェックをいれてインストールします。これが最小構成かと
  • VST3 Audio Plug-Ins SDKをDLして、CUIからビルド

最後にSDKをビルドします。versionは 3.6.14_build-24_2019-11-29 でした。VST2と違ってVST3はgithubにあるのが良いですね。公式ドキュメントを参考にCUIからビルド:

cd "<解凍先>/VST SDK"

# vstsdk.sln を生成
mkdir build
cd build
cmake  -G "Visual Studio 16 2019" -A x64 ../VST3_SDK
cmake --build . --parallel 10

なお MSBuild.exe のログが日本語になって文字化けしていると思いますが、 $ chcp 850 と打てば英語になってくれます。筆者の環境ではビルド完了まで1分ほどかかりました。ちなみに--parallelがMSBuild.exeで効いていないような気がします…。

# ビルドした検証ツールとVSTサンプルをテスト
./bin/Debug/validator.exe ./VST3/Debug/adelay.vst3

一通りビルド成功していれば、VST3/Debug 以下にVSTプラグインのサンプルも一緒にビルドされていますので、動作確認に bin/Debug 以下にビルドされたVSTホストサンプルの検証ツールを使えるはずです。以上で環境構築は終わりです。

新しいVST3プラグインを書く

公式サイト How to add/create your own VST 3 Plug-ins

主にプロジェクト立ち上げ時に必ずやることとしては、

  1. 自分のプラグイン置き場にhelloworldをコピーする
  2. 置き場のCMakeList.txtに新しいサブディレクトリを追加
  3. 新しいプラグイン名でhelloworld/HelloWorldを置換
  4. 新しいuidでinclude/plugid.hを更新
  5. 新しいプラグイン名でinclude/version.hを更新
  6. 新しいプラグイン名でresource/info.plistを更新

これ毎回やるの地獄だな…と思ったので、初期プロジェクトの構築をシェルスクリプト化してみました(要bash)。使い方は

cd "<自作プラグイン置き場>"
git clone --recursive https://github.com/ShigekiKarita/vst3-tools
./vst3-tools/init-plugin.sh FooBar

# copyrightなどの情報を更新
emacs FooBar/include/version.h

これでFooBarというディレクトリとFooBarという表示名のfoobar.vst3が生成されるプロジェクトができます。include/version.hには著者名などを書き込む欄もありますので、忘れずに更新してください。ちなみに実装をすすめる際は次のようなステップがあるとのこと:

  • plugcontroller.cpp にパラメータ追加
  • plugprocessor.cpp にアルゴリズム追加
  • plugprocessor.cpp に永続化を実装
  • UI実装 (このへんのサンプルが参考になりそう?)

そして新しいプラグインを作ったときのビルド方法:

# このbuildディレクトリは自作プラグイン置き場の外に作らないといけない
mkdir build
cd build

cmake -DSMTG_ADD_VST3_PLUGINS_SAMPLES=OFF \
      -DSMTG_ADD_VST3_HOSTING_SAMPLES=OFF \
	  -DSMTG_MYPLUGINS_SRC_PATH="<自作プラグイン置き場>" \
	  -G "Visual Studio 16 2019" \
	  -A x64 \
	  "<解凍先>/VST_SDK/VST3_SDK"
cmake --build . --parallel 10

この例でもビルドに30秒かかるので、毎回新しいプラグインやファイル作るたびにSDKと全自作プラグインがビルドし直しなのは嫌ですね。ただし、モジュールのない時代のC++にビルド設定で深入りするのも面倒ですし、SDK側もそこそこな頻度でアップデートあるからそういうものかと無理やり納得しています。

追記

上記のビルド問題が嫌なので実験として下記のようにbuildディレクトリを消さずに、使いまわして新しくプロジェクトを追加したところ、普通に動くことがわかった。CMakeもVSのキャッシュもよくわかっていないので気持ち悪いけど、とりあえずこれで…。

mkdir build
mkdir myVSTs
cd myVSTs
git clone --recursive https://github.com/ShigekiKarita/vst3-tools

# 1つ目のVST (SDKもビルドされる)
./vst3-tools/init-plugin.sh Vst1
cd ../build
cmake -DSMTG_ADD_VST3_PLUGINS_SAMPLES=OFF \
      -DSMTG_ADD_VST3_HOSTING_SAMPLES=OFF \
	  -DSMTG_MYPLUGINS_SRC_PATH=../myVSTs \
	  -G "Visual Studio 16 2019" \
	  -A x64 \
	  "<解凍先>/VST_SDK/VST3_SDK"
cmake --build . --parallel 10
./bin/Debug/validator.exe ./VST3/Debug/vst1.vst3

cd ../myVSTs

# 2つ目のVST (SDK、1つ目はビルドされずに使い回す)
./vst3-tools/init-plugin.sh Vst2
cd ../build
cmake --build . --parallel 10
./bin/Debug/validator.exe ./VST3/Debug/vst2.vst3

おわりに

今回は環境構築で力尽きましたが、次回は作りたかったMIDIエフェクト、もしくはdplugでのVST3出力をやっていこうと思います。