Vst3Interop 1.0.1
dotnet add package Vst3Interop --version 1.0.1
NuGet\Install-Package Vst3Interop -Version 1.0.1
<PackageReference Include="Vst3Interop" Version="1.0.1" />
<PackageVersion Include="Vst3Interop" Version="1.0.1" />
<PackageReference Include="Vst3Interop" />
paket add Vst3Interop --version 1.0.1
#r "nuget: Vst3Interop, 1.0.1"
#:package Vst3Interop@1.0.1
#addin nuget:?package=Vst3Interop&version=1.0.1
#tool nuget:?package=Vst3Interop&version=1.0.1
Vst3Interop
.NET 10 向けの VST3 ホストライブラリです。64bit の VST3® 音声エフェクトを読み込み、ステレオ音声をリアルタイムに処理し、パラメータと状態を公開します。UI フレームワークに依存せず、専用の STA スレッドとネイティブウィンドウでプラグインエディターまでホストします。
目次
概要
Vst3Interop は C# で実装した VST3 ホストです。指定した .vst3 を読み込み、コンポーネント、プロセッサー、コントローラーを初期化して音声を渡します。音声は 32bit float、512 サンプル単位、ステレオまたはモノラルで処理します。
ライブラリは WPF や WinForms へ依存しません。プラグインとのやり取りは、ライブラリが所有する専用の STA スレッドで行います。このスレッドは Win32 メッセージポンプを備えるため、プラグインのエディターやタイマーがそのまま動作します。プラグインが応答しない場合はタイムアウトで処理を中断するため、呼び出し側のスレッドは固まりません。
音声の処理だけを呼び出し側のスレッドで実行し、再構成との競合を単一のロックで直列化します。パラメータの編集、状態の保存と復元、エディターの表示は、いずれも専用スレッドへ委譲します。
動作要件
| 項目 | 要件 |
|---|---|
| OS | Windows 10 バージョン 2004(ビルド 19041)以降 / Windows 11(64bit) |
| ランタイム | .NET 10.0 以降 |
| VST3 プラグイン | 64bit(x86_64-win)の VST3 音声エフェクト |
ライブラリ本体は AnyCPU ですが、VST3 モジュールはプロセスと同じアーキテクチャで読み込みます。64bit プロセスで利用してください。
インストール
dotnet add package Vst3Interop
<PackageReference Include="Vst3Interop" Version="1.0.0" />
外部パッケージへの依存はありません。
使い方
1. プラグインの読み込み
Vst3Plugin.Load で .vst3 を読み込みます。フォルダーを渡した場合は、中の 64bit バイナリを自動で探します。第 2 引数でサンプルレート、第 3 引数で復元する状態を指定できます。
using Vst3Interop;
using var plugin = Vst3Plugin.Load(@"C:\Plugins\Reverb.vst3", sampleRate: 48000);
読み込みに失敗した場合は Vst3Exception、ファイルが見つからない場合は FileNotFoundException を送出します。
2. 音声の処理
Process はステレオのインターリーブ配列を受け取り、その場で加工します。1 フレームは左右 2 サンプルで構成します。framePosition は再生位置をフレーム単位で表します。プラグインがモノラル入力の場合は左右を混ぜて渡し、モノラル出力の場合は左右へ複製します。
float[] buffer = new float[512 * 2];
long framePosition = 0;
var transport = new Vst3Transport(120, 4, 4, isValid: false);
bool succeeded = plugin.Process(buffer, framePosition, transport);
framePosition += buffer.Length / 2;
戻り値が false の場合、プラグインの処理が失敗しています。呼び出し側で原音への差し戻しなどを判断してください。ブロック長は内部で 512 サンプルへ分割するため、任意の長さを渡せます。
再生位置を移動したときは Reset で内部状態を初期化します。
plugin.Reset();
サンプルレートを変更するときは SetSampleRate を呼びます。
plugin.SetSampleRate(44100);
3. パラメータの操作
SetParameter で正規化した値(0.0 〜 1.0)を設定します。値は次の処理呼び出しへ反映します。
plugin.SetParameter(parameterId: 0, normalizedValue: 0.5);
エディターやプラグインがパラメータを変更すると ParameterChanged が発生します。編集の区切りでは EditFinished が発生します。状態の保存契機として利用できます。
plugin.ParameterChanged += (id, value) => Console.WriteLine($"{id} = {value}");
plugin.EditFinished += () => SaveToProject(plugin.SaveState());
4. 状態の保存と復元
SaveState はコンポーネントとコントローラーの状態を生のバイト列として返します。LoadState で元に戻します。シリアライズ形式は呼び出し側で決めてください。
Vst3PluginState state = plugin.SaveState();
byte[]? component = state.Component;
byte[]? controller = state.Controller;
plugin.LoadState(state);
読み込み時に状態を渡すと、有効化の前に適用します。
using var restored = Vst3Plugin.Load(path, 48000, state);
5. レイテンシー
LatencySamples はプラグインの遅延をサンプル数で返します。遅延が変化すると LatencyChanged が発生します。原音との時間のずれを補正する際に利用してください。
int latency = plugin.LatencySamples;
plugin.LatencyChanged += () => Recalculate(plugin.LatencySamples);
6. テンポ同期
Vst3Transport でテンポ、拍子、再生位置をプラグインへ通知します。isValid を true にしたときだけテンポと拍子を有効な情報として渡します。テンポに同期するディレイや LFO を持つプラグインで利用します。
var transport = new Vst3Transport(
Tempo: 128,
TimeSignatureNumerator: 4,
TimeSignatureDenominator: 4,
IsValid: true);
plugin.Process(buffer, framePosition, transport);
7. エディターの表示
プラグインが GUI エディターを備える場合、OpenEditor でネイティブウィンドウを開きます。ウィンドウの生成、リサイズ制約、DPI の扱いはライブラリが処理します。エディターを持たないプラグインでは HasEditor が false を返し、OpenEditor は null を返します。
if (plugin.HasEditor)
{
using Vst3Editor? editor = plugin.OpenEditor();
editor?.Activate();
}
親ウィンドウのハンドルを渡すと、そのウィンドウを所有者として関連付けます。
using var editor = plugin.OpenEditor(ownerHwnd);
閉じたときは Closed が発生します。Close または Dispose でいつでも閉じられます。プラグインを破棄すると、開いているエディターも閉じます。
editor.Closed += (_, _) => SaveToProject(plugin.SaveState());
8. 破棄
Vst3Plugin と Vst3Editor はいずれも IDisposable です。using で確実に解放してください。エディターを開いている場合は、プラグインより先に閉じることを推奨します。
plugin.Dispose();
公開API
| 型 | 説明 |
|---|---|
Vst3Plugin |
モジュールを読み込み、音声処理、パラメータ、状態、レイテンシー、エディターを公開します。 |
Vst3Editor |
プラグインの GUI エディターをホストするネイティブウィンドウです。 |
Vst3Transport |
プラグインへ通知するテンポ、拍子、有効フラグです。 |
Vst3PluginState |
コンポーネントとコントローラーの状態を表す生のバイト列です。 |
Vst3Exception |
プラグインの操作が失敗したときに送出します。 |
Vst3Plugin の主なメンバーを次に示します。
| メンバー | 種別 | 説明 |
|---|---|---|
Load(path, sampleRate, state) |
メソッド | プラグインを読み込みます。 |
Process(buffer, framePosition, transport) |
メソッド | ステレオ音声を処理します。 |
SetParameter(id, value) |
メソッド | 正規化したパラメータ値を設定します。 |
SaveState() / LoadState(state) |
メソッド | 状態を保存、復元します。 |
SetSampleRate(hz) / Reset() |
メソッド | サンプルレート変更と内部状態の初期化を行います。 |
OpenEditor(owner) |
メソッド | エディターを開きます。 |
Name / SampleRate / LatencySamples |
プロパティ | 名称、サンプルレート、遅延を返します。 |
InputChannelCount / OutputChannelCount |
プロパティ | 主バスのチャンネル数を返します。 |
HasEditor |
プロパティ | エディターの有無を返します。 |
ParameterChanged / EditFinished / LatencyChanged |
イベント | パラメータ変更、編集完了、遅延変化を通知します。 |
設計
Vst3Interop.Interopは VST3 の COM ABI と、ホストがプラグインへ提供するコールバックオブジェクトを含みます。ホストアプリケーション、属性リスト、メッセージ、接続プロキシ、ストリーム、パラメータ変更キューがここに属します。Vst3Interop.Hostingはモジュールローダーと、STA ホストスレッドおよび Win32 メッセージポンプを所有するディスパッチャーを含みます。リアルタイム処理以外のプラグイン呼び出しは、すべてこのスレッドへ委譲します。- ルート名前空間が公開面を担います。音声は呼び出し側のスレッドで処理し、再構成との競合を単一のロックで直列化します。
制限事項
- 対応するのは 64bit の VST3 音声エフェクトです。VST2 や 32bit のプラグイン、音声を生成する楽器には対応しません。
- 音声はステレオまたはモノラルの主バスのみを処理します。サイドチェーンや複数の入力バスは扱いません。
- 音声は 32bit float、リアルタイムモードで処理します。
- Windows 専用です。
注意事項
- プラグインの用意: VST3 プラグインはライブラリに同梱していません。使用する
.vst3は各自で用意してください。 - 状態の保存: 状態は生のバイト列で返します。プロジェクトへ保存するときは、同じ
.vst3を同じ環境で読み込んでください。 - 応答しないプラグイン: プラグインの読み込みや操作が一定時間応答しない場合はタイムアウトし、処理を中断します。
- 商標: VST は Steinberg Media Technologies GmbH の登録商標です。VST is a registered trademark of Steinberg Media Technologies GmbH.
免責事項
本ライブラリは MIT ライセンスのもとで公開しています。
本ソフトウェアは現状のまま提供しており、明示、黙示を問わず、商品性、特定目的への適合性、権利非侵害に関する保証を含む、いかなる保証も行いません。
作者は、本ライブラリの使用または使用不能に起因するいかなる損害についても、一切の責任を負いません。ご利用は自己責任でお願いします。
ライセンス
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0-windows7.0 is compatible. |
-
net10.0-windows7.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.