VSTプラグインを作ってみよう!

アドカレ記事企画12/7(日)!DTM課リーダーのもやしです!
先日初めてVSTのSDKに触れたので、自分用の記録も兼ねてVSTにまつわる記事を書きます!
こちらの記事を参考にさせていただいております(自分はこの記事を見ながら+GPTをぶん殴りながらやってみました🙏)

VSTとは?

VSTとは、音楽制作ソフトウェア(DAW)上で動作するプラグインの規格のことです。1996年にSteinbergがこの規格を発表し、多くのDAWがこれを採用しました。
VSTの規格を用いて作られたプラグインをVSTプラグインと呼び、そのうち楽器(シンセサイザ)として機能するものをVSTiと呼びます。

必要なもの

  • Visual Studio (C++開発環境)
  • VST SDK (VST/VSTiプラグインを作成するための雛形(C++のクラス)が記載されたソースコード一式)

1. Visual StudioとVST SDKを準備

Visual Studio(VS)のインストールは省略します、そんなに細かいことはない はず…

  • VST SDKのインストールはhttps://www.steinberg.net/developers/vstsdk/から行います。画面スクロール後、「VST 3 Audio Plug-ins SDK」をクリックしてDLします。
  • DL完了後、ZIPを解凍し、適当な場所にフォルダを置きます(C:ドライブ直下がやりやすいかも?

VST基本ライブラリの準備

VST SDKを使用するために、VST基本ライブラリ(ZIPに同梱)をVSでコンパイルして作成します。

「ローカルフォルダを開く」を選択し、VST_SDKのフォルダを指定します。

フォルダを選択すると次のような画面が出るので、「ソースディレクトリを有効化して設定する」を選択し、「VST_SDK->vst3sdk->CMakeLists.txt」を選択し、「開く」を選択。また、「VST_SDK」フォルダの下に「CMakeSettings.json」があることを確認してください。なければvst3sdkフォルダの中にありますので、コピペしてください(CMakeの生成に必要っぽい…??)

プロジェクト画面が開いた際に「このアプリ(Windowsコマンドプロセッサ)がデバイスに変更を加えることを許可しますか。」と聞かれる場合がありますが、これはフォルダ「C:\Program Files\Common Files\VST3\」を作成するだけなので「はい」を選んでください。既にDAWを使用していてVST3フォルダがある場合は閉じてOKです。

上のメニューバーから「プロジェクト」を選択し、「CMakeの設定」を選択。

左側のリストから「x64-Debug」を選択し、構成名が「x64-Debug」であることを確認する(「(既定値)」などの日本語が入っていないことを確認、入ってると時たまエラーが出るみたいです)

画像にはx64-Releaseの構成がありますが、これは既に作ったフォルダたちを持ってきただけなのでなくても大丈夫です👌(というか無いと思います)

変更・確認後は「ファイル」->「すべて保存」。しばらくすると、「VST_SDK\vst3sdk/out/build/x64-Debug/lib」配下にDebug版のVST基本ライブラリが作成されます。

failed to create symbolic link 'C:/Users/satsu/AppData/Local/Programs/Common/VST3/adelay.vst3':
クライアントは特権を持っていません。

のようなエラーが出た場合、Visual Studioを「管理者として実行」するかWindows11を開発者モードにすると解決する場合があります

次のファイルたちがあることを確認します(このあたりが基本ライブラリ)

  • base.lib
  • sdk.lib
  • sdk_common.lib
  • pluginterface.lib
  • vstgui.lib
  • vstgui_support.lib
  • vstgui_uidescription.lib

これでDebug版の基本ライブラリができました。次はRelease版の基本ライブラリを生成します。Debugは開発用(便利な処理がある代わりにおそい)、Releaseは実際にVST公開用です。

左側の「構成」の+ボタンを選択、x64-Releaseを選択します。

x64-Releaseの構成の種類を「RelWithDebInfo」から「Release」に変更し、メニューバーの「ファイル->すべて保存」を選択。

しばらくすると「VST_SDK\vst3sdk/out/build/x64-Release/lib」配下にRelease版のVST基本ライブラリが作成されます。

これで基本ライブラリが出来ました!次はVST3を作るためのプロジェクトを作成します

補足?

書き忘れていましたが、VSTにはバージョンがあり、VST2.4(VST2とも)とVST3があります。今はほとんどVST3で造られていますが、古いプラグインなどはVST2.4で作られていたりします。利用者としての違いは32bitか64bitかくらい…?

閑話休題

VST3プロジェクトの作成

個人的に隘路はここでした…

まずはVSにて「新しいプロジェクトの作成」を選択します(上記の保存ができているなら一回VS閉じてもOK)。

開いたプロジェクトの作成画面で「Windows デスクトップ ウィザード」を選択し、「次へ」。


プロジェクトの構成画面が表示されるので、プロジェクト名を入力し、「作成」ボタンを押します。プロジェクト名/ソリューション名はなんでもいいです。

Windows デスクトッププロジェクト画面でアプリケーションの種類を「ダイナミック リンク ライブラリ(.dll)」とし、追加オプションの「空のプロジェクト」にチェックを入れ、「OK」ボタンを押します。

これでVisual Studioのプロジェクトが作成されるので、Visual Studioのウィンドウの上部にあるソリューション構成を「Debug」「x64」に設定しておきます。

「プロジェクト」->「既存の項目を追加」を選択。

VST_SDK/vst3sdk/public.sdk/source/main/dllmain.cppを選択し、追加。

これで画面右方のソリューションエクスプローラーのソースファイルにdllmain.cppが追加されます。

これでプロジェクトが作成されたので、次はプロジェクトの設定を行います。

プロジェクトの設定

作成されたプロジェクトで開発を行うには、VST SDKのヘッダファイルや、上述したVST基本ライブラリをこのプロジェクトに引っ張ってくる必要があります。ここでエラーがめちゃめちゃ出て萎えかけました。がんばろう

まずは設定変更のために「プロジェクト」->「プロパティ」を開き、

Debug版の設定変更

Debug版とRelease版でそれぞれ設定を行います。まずはDebugから。

開いたウィンドウ上部の「構成」と「プラットフォーム」が、それぞれ「アクティブ(Debug)」と「アクティブ(x64)」になっていることを確認します。違ったらリストから選んで選択します。

そして、以下の設定を行います。

(カテゴリ)(設定項目)(値)
詳細ターゲットの拡張子.vst3
VC++ディレクトリインクルード ディレクトリC:\VST_SDK\vst3sdk
C:\VST_SDK\vst3sdk\vstgui4
VC++ディレクトリライブラリ ディレクトリC:\VST_SDK\vst3sdk/out/build/x64-Debug/lib
C/C++->
プリプロセッサ
プリプロセッサの定義VSTGUI_LIVE_EDITING=1
DEVELOPMENT=1
(すでに定義されているものは消さないこと)
リンカー->
入力
追加の依存ファイルbase.lib
sdk.lib
sdk_common.lib
pluginterfaces.lib
vstgui.lib
vstgui_support.lib
vstgui_uidescription.lib
設定項目

各値の設定時は以下のように各値のトグルを開き「<編集…>」を選択してから一行ずつ値を入れましょう。

また各パスはVST_SDKフォルダがCドライブ直下にある場合ですので、別の場所に保存している場合は適宜読み替えてください。

設定が完了したら「適用」を押すことを忘れずに。

Release版の設定変更

次はRelease版の設定です。「構成」をReleaseに変更、プラットフォームを「x64」にします。

そして下記の設定を行います。たまにライブラリディレクトリに指定した…/x64-Release/libになーんにもファイルが入ってないことがあるので、GPTをぶん殴って確認しましょう。私はそれで4時間くらい格闘していました。

(カテゴリ)(設定項目)(値)
詳細ターゲットの拡張子.vst3
VC++ディレクトリインクルード ディレクトリC:\VST_SDK\vst3sdk
C:\VST_SDK\vst3sdk\vstgui4
VC++ディレクトリライブラリ ディレクトリC:\VST_SDK\vst3sdk/out/build/x64-Release/lib
リンカー->
入力
追加の依存ファイルbase.lib
sdk.lib
sdk_common.lib
pluginterfaces.lib
vstgui.lib
vstgui_support.lib
vstgui_uidescription.lib
設定項目

設定が完了したら「OK」を押します。

また今回の開発とは直接関係ありませんが、作成したVST3プラグインは「C:\Program Files\Common Files\VST3\」の、VST3専用フォルダまたはその配下へ移動・コピーしなければ使えません。DAWを使用したことがある方なら見たことあるかも。

また.vst3ファイル(VST3プラグインファイル)を保存する際のフォルダ構成を決められているため、例えば(本記事ではそこまで行きませんが)画像を用いたGUIでVSTを作った場合はそれに従う必要があります。

くわしくはこちらが参考になると思います。

VST3プラグインをつくろう

や~~~~~~っと!!本題!です!実際にVisual StudioでのVST3プラグイン開発を行います。

今回作成するプラグインは、

・パラメーターなし

・入力をそのまま出力する

・入力バス、出力バスは1つ、ともにステレオ

です。まずはシンプルなものから。

バス」については(SDKのバスに関する情報がなく確実ではないのですが)情報の流れる道のことだと思ってOKです。

たとえば、

  • モノラル/ステレオのエフェクター
    • モノラル/ステレオのオーディオバス入力が1つ
      同様のオーディオバス出力が1つ
  • サイドチェイン付きのステレオエフェクター
    • ステレオのオーディオバス入力が2つ(ひとつがサイドチェイン用)
    • ステレオオーディオバス出力が1つ
  • シンセサイザー
    • イベントバス入力が1つ(MIDIのノートオン、ノートオフメッセージの受け取り)
      ステレオオーディオバス出力が1つ

といったふうになります。

さて、VST3プラグインの開発では、主に以下の3つを実装します。

  • FUIDの作成
  • プラグイン情報の設定
  • 音声処理クラスの作成

※尚、今回作成するVST3プラグインはパラメータを持たないため、一部ホストアプリケーションやDAWではエラーが発生する場合があります。

FUIDの作成

VST3プラグインの開発では、FUIDというIDが必要になります。これはCOM(Component Object Model, Microsoftによる仕様規格)におけるGUID(グローバル一意識別子)と同様で、IDをクラスに関連付けます。(1プラグインに1FUID)

VSにはGUID作成ツールが付属しているので、これを用いて取得します。

メニューバーから「ツール」->「GUIDの作成」を選択

「4.レジストリ形式」にチェックを入れ「コピー」ボタンを押す

クリップボードにGUIDがコピーされるので、どこかに保存する。

次に、FUIDを生成するヘッダファイルを作成します。

「ヘッダーファイル」を右クリック->「追加」->「新しい項目」を選択し、

myvst3fuid.hを作成。

// VST3 SDKのインクルードファイル
#include "pluginterfaces\base\funknown.h"

// VST3 SDKの名前空間
namespace Steinberg {
	namespace Vst {

		// プロセッサ用のユニークID
		static const FUID ProcessorUID (0xF287858C, 0xF5BF477D, 0xB5CE8AAC, 0x76E8808A);

	}
}

1VSTプラグインに1FUIDですので、同じFUIDは使いまわさないように注意してください。

プラグイン情報の設定

VST3プラグイン情報の設定を行います。

ホストアプリケーション(DAW)が音声処理クラス(やパラメータ操作クラス)を呼び出すための情報を設定します。(一部の値は実際にDAWに表示されるものです)

各プラグイン情報はマクロを用いて定義・作成します。(参考記事のSDKと最新のSDKでバージョンが違うため、インクルードファイル構成等が異なることに注意)

// VST3 SDKのインクルードファイル
#include "public.sdk/source/main/pluginfactory.h"

// ヘッダファイルのインクルード
#include "myvst3fuid.h"
#include "processor.h" //<-後ほど作成します

// 製作者情報
#define MYVST_VENDOR   "Moyashi"
#define MYVST_URL      "https://www.MoyashiVST.com/"
#define MYVST_EMAIL    "mailto:xxxx@example.com"

// プラグイン情報
#define MYVST_VSTNAME  "MyVST Name"
#define MYVST_VERSION  "0.0" 
#define MYVST_SUBCATEGORIES Vst::PlugType::kFx

// DLLファイルの初期化と終了処理
// 基本的に何もする必要はないが、SDK 3.7.1より前のバージョンの場合はコメントを外す。
//bool InitModule() { return true; }
//bool DeinitModule() { return true; }


// VSTプラグインの生成
using namespace Steinberg;
using namespace Steinberg::Vst;


// ファクトリの定義
BEGIN_FACTORY_DEF(MYVST_VENDOR, MYVST_URL, MYVST_EMAIL)

DEF_CLASS2(
    INLINE_UID_FROM_FUID(Steinberg::Vst::ProcessorUID), // プロセッサのUID
    PClassInfo::kManyInstances,      // 複数インスタンス可
    kVstAudioEffectClass,            // AudioEffect
    MYVST_VSTNAME " Controller",	// プラグイン名(+"Controller")
    0, "",						    // 未使用
    MYVST_VERSION,                   // バージョン
    kVstVersionString,               // SDKのバージョン
    Steinberg::Vst::MyVSTProcessor::createInstance
)

END_FACTORY

音声処理を行うクラスの作成

最後に核となる音声信号処理を行うクラスを作成します。

// VST3 SDKのインクルードファイル
#include "public.sdk/source/vst/vstaudioeffect.h"

// VST3 SDKの名前空間
namespace Steinberg {
	namespace Vst {

		// 音声処理を行うVSTプロセッサ
		class MyVSTProcessor : public AudioEffect
		{
		public:
			// 初期化
			tresult PLUGIN_API initialize(FUnknown* context);

			// バス構成設定
			tresult PLUGIN_API setBusArrangements(SpeakerArrangement* inputs, int32 numIns, SpeakerArrangement* outputs, int32 numOuts);

			// 音声信号処理
			tresult PLUGIN_API process(ProcessData& data);

			// インスタンス生成
			static FUnknown* createInstance(void*) { return (IAudioProcessor*)new MyVSTProcessor(); }
		};


	}
}
// 自作VST用のインクルードファイル
#include "myvst3fuid.h"
#include "processor.h"


namespace Steinberg{
namespace Vst {

tresult PLUGIN_API MyVSTProcessor::initialize(FUnknown* context)
{
	// 親クラス初期化
	tresult result = AudioEffect::initialize(context);
	if (result == kResultTrue)
	{
		// ステレオ入出力を追加
		addAudioInput(STR16("AudioInput"), SpeakerArr::kStereo);
		addAudioOutput(STR16("AudioOutput"), SpeakerArr::kStereo);

		// 以下固有の初期化を実施。(今回は何もしない)
	}

	// 初期化が成功すればkResultTrueを返す。
	return result;
}

tresult PLUGIN_API MyVSTProcessor::setBusArrangements(SpeakerArrangement* inputs, int32 numIns, SpeakerArrangement* outputs, int32 numOuts)
{
	// ステレオ1in/1outのみ対応
	if (numIns == 1 && numOuts == 1 && inputs[0] == SpeakerArr::kStereo && outputs[0] == SpeakerArr::kStereo)
	{
		return AudioEffect::setBusArrangements(inputs, numIns, outputs, numOuts);
	}

	// 対応していないバス構成の場合、kResultFalseを返す。
	return kResultFalse;
}


tresult PLUGIN_API MyVSTProcessor::process(ProcessData& data)
{
	// ステレオ入出力バッファ
	Sample32* inL = data.inputs[0].channelBuffers32[0];
	Sample32* inR = data.inputs[0].channelBuffers32[1];
	Sample32* outL = data.outputs[0].channelBuffers32[0];
	Sample32* outR = data.outputs[0].channelBuffers32[1];

	// 入力をそのまま出力
	for (int32 i = 0; i < data.numSamples; i++)
	{
		outL[i] = inL[i];
		outR[i] = inR[i];
	}

	// 問題なければkResultTrueを返す(おそらく必ずkResultTrueを返す)
	return kResultTrue;
}

} }

processor.cppの各関数について、

  • initialize()
    • クラスの初期化を行う。バス構成に応じて、addAudioInput()とaddAudioOutput()を呼び出し入出力バスを定義する。
    • プラグイン固有の初期化があればここで実行する(今回は特になし)
  • setBusArrangements()
    • バス構成変更時に呼び出される。(入力がモノラルからステレオになった、等)
    • 今回あんまりやることが無いので割愛…
  • process()
    • 音声処理を行う関数
    • 引数のProcessDataやdateに、処理に必要な情報が入っている(パラメータの変更内容や入出力バッファのポインタなど)
    • 56~59行目あたりでSample32型のポインタ変数に代入。
    • 61~66行目で音声処理を実施(今回はそのまま入力音声データをそのまま出力する)

ビルド

これら4つ(processor.h、processor.cpp、myvst3fuid.h、factory.cpp)を作成した後にビルドするとようやっとVST3プラグインが完成します。特に何も設定していなければ、「C:\Users\(ユーザ名)\source\repos\(プロジェクト名)\x64\debug\(プロジェクト名).vst3」の形でできます。

メニューバーから「ビルド」->「(プロジェクト名)のビルド」を選択。

画面下部にコンソールが出てビルドが始まるので、上手くいくように本気で祈ります。

ビルドが成功したら、あなたの勝ちです。上述のパスを探すと…

プリクラースナ!VST3プラグインの完成です。お疲れ様でした。

おわりに・雑談

以上がVisual StudioによるVST3プラグイン開発になります。前提が多くてややこしかった(自省)ですが、核となるのはバスによるデータ入出力信号処理クラスによる音声信号処理です。GUI作成に関しては参考記事(記事最初の方にあります)がマジでとっても参考になります。作りたい人は作ってみましょう。

また、2025/10/28、SteinbeigがVST SDK 3.8のリリースに伴いVST SDK(開発キット)をMITオープンソースライセンス化し、それに伴いオーディオI/O規格であるASIO SDKにはGPLv3ライセンスが追加されたため、VSTを配布する際に会社名義を作ってからSteinbegとの契約(たぶん)が不要となり、SDKの再配布、改変、プラグインの商用配布が、契約や公開義務なしで可能になったため、これから需要も供給もかなり増えていくと思われます。

↑さらっと公開されましたが結構すごいニュースだと思います。

UnityのSDKやOBSのSDKと組み合わせることで、Unity上でVSTの利用が可能になったりOBS上での配信中にリアルタイムでVSTプラグインを適用することもできるかもしれません。超ウキウキです。

ニーズはトントコ増えていくと思います。ぜひぜひ作ってみてくださいね

コメントを残す

CAPTCHA