Open6

RustでVST(nih-plug)

おるとろおるとろ

前もRustでVSTを書こうとして、GUIをつけようというところで挫折した。
バックグラウンド側の処理に対して、GUI側のスレッドからパラメーターを渡す方法が分からなかったんですよね。

僕が知ってる限り、RustでVSTを作るのはこういう変遷があったと思う

  1. vst3-sysで実装
  2. baseplug, baseviewで実装

それぞれがどういう関係性なのかはわからん 分かったら追記する

RustでGUIの問題は色々あったっぽい。例えばguiとしてwindowを作ろうとしたときにwinit(https://github.com/rust-windowing/winit) では初期値を渡せなくて、バックグラウンド(音響ソフト部分)へのポインタを渡せなかったり。だからRustAudioとしてBaseViewっていうフォークを作ったんじゃないかな、知らん。
今はeguiで実装するとうまくいくのかな? eguiの例が多い。winit使ってないのかな。
とりま最新情報は RustAudio のディスコード鯖に行くといいです。僕もここを読んでいるだけです。
https://discord.gg/ykxU3rt4Cb

おるとろおるとろ

nih-plugというレポジトリでbase-plugを使って作られた例がでているっぽいのでそれを見てみるためのスクラップです。

https://github.com/robbert-vdh/nih-plug
こちらです。
とりあえず動くみたいだけどRustでVST組んだ時はGPLv3ライセンスになるみたいなので商用には無理じゃないかな......

とりあえずサンプルを動かしてみます。

git clone git@github.com:robbert-vdh/nih-plug.git # gitでクローン
cd nih-plug # フォルダ移動
おるとろおるとろ

サンプルをビルドしてみます。

cargo xtask bundle gain --release

xtaskっていうのはよくわからないがcargoのコマンドっぽいですね。gainのサンプルをビルドします。

すると、以下の場所にclapファイルとvst3ファイルが作られます。

Created a CLAP bundle at 'target/bundled\gain.clap'
Created a VST3 bundle at 'target/bundled\gain.vst3'

clapはよく知らないけどプラグインの次世代規格じゃないかなどうせ。
じゃあ今回はvst3を動かしてみましょう。ローカルでの動作チェックにはvsthostを使います。

おるとろおるとろ

実際に使ってみました。

今回は以前別のプロジェクトでビルドしたwhisperプラグインの後段に、先ほどビルドしたgain.vst3を差してみました。

whispter -> gain -> output という流れですね。

まずnew pluginからgain.vst3を読み込みます。適切なプラグインの後段に差しましょう。

プラグインの左上のchain after...の部分から繋ぎ変えることができます。

おるとろおるとろ

久々にやってみる。
NihPlugを使ってプロジェクトを開始するには、python系のプロジェクトビルダを使う。cookiecutterというパッケージらしい。もちろん作者さんのサンプルコードの依存関係を見ながら自分で組んでも良い。そう複雑なものではない。

pip install pipx # pipxをインストール。恐らく外部コマンドをネットワーク経由で即時取得、即時実行するもの
pipx run cookiecutter gh:robbert-vdh/nih-plug-template # cookiecutterコマンドを取得し、nihplugテンプレートを使ってプロジェクト作成
おるとろおるとろ

nih_plugでサポートしているGUIはicedとか色々あるけどviziaが真新しい感じしますね
どのGuiクレートを使うにしても、nih_plugで使うスレッドセーフなArc<Param>を各GUI向けに拡張したウィジェットを作成する必要がある Viziaだと内部的にイベントを使って値を読みに行くような機構を持ったウィジェットみたいです 例えばgainのサンプルではParamSliderというウィジェットが作られている。nih_plugの中にはParamBaseなる構造体が用意されているので、これを利用して独自のウィジェットを定義するといいみたいです
https://github.com/robbert-vdh/nih-plug/blob/master/nih_plug_vizia/src/widgets/param_base.rs