VST3におけるサイレンス処理

VST3におけるサイレンス処理

process()関数の引数 dataの入力オーディオバスにはサイレンスフラグというものがあり、「音声入出力バッファの値がすべて0の場合、サイレンスフラグを立てる」という決まりがあるようです。

このサイレンスフラグは、「何も音声入力がない場合に無駄な処理を行わないことでコンピューター(CPU)の負荷を下げる」ためにあります。
(多分、このフラグがSteinberg Webサイトにある「VST3新機能」の「パフォーマンスの改善」にあたるものと思われます。)

音声出力にサイレンスフラグを立てるのは、VST3プラグインが複数 接続される可能性を想定しているためです。
自身の作成したVST3プラグインの音声出力は次のVST3プラグインの音声入力となるため、音声出力がすべて0の場合はサイレンスフラグを立てる必要があります。

サイレンスフラグの処理方法はVST3プラグインによって異なります。
「音声入力のサイレンスフラグが立っているようであれば、音声出力もすべて0にしサイレンスフラグを立てる」といった処理を行うVSTプラグインもあれば、シンセサイザーやリバーブ(残響)エフェクトなどのように「音声入力のサイレンスフラグが立っていても、少し前の音声入力やMIDI入力から音声出力を計算し続ける」ものもあります。

実装方法の一例として、「サイレンスフラグが立っている場合は、音声出力もすべて0にする」方法を下記に記載します。

まず音声処理クラスにサイレンス処理を行う関数を実装します。

その後、process()関数内の「入力・出力バッファのポインタをわかりやすい変数に格納」の後に上記関数を入れます。
(バイパスパラメーターと合わせて下記のように実装します。)

silenceFlagsはオーディオバスのSpeakerArrangementと同じであるため、「どのフラグが立っているか?」を判断することで特定のチャンネルだけをサイレンスにすることもできます。

上記以外にもVST3.6についての情報があります。下記をご参照ください。

また、質問やご指摘はコメント欄や掲示板Twitterでいただけばとおもいます。

掲示板
■Twitterアカウント:@vstcpp   URL:https://twitter.com/vstcpp

VST3におけるバイパス処理

VST3におけるバイパス処理

バイパス処理とは入力信号をそのまま出力するための処理になります。
実は、VST3を作成する際にはバイパス処理も実装しなければいけません。

実装方法としては下記になります。

  • パラメータ操作クラスでバイパス用パラメータを作成する
    On/Off(1.0と0.0)の2段階の値を持つパラメータでkIsBypassフラグを立てる
  • バイパスパラメータがOnの時(1.0)の時に音声処理クラスでバイパス処理を行う。

バイパス処理のイメージは下記になります。
まず、パラメータ操作クラスでバイパス用パラメータを作成します。(パラメーター操作クラスのinitialize()関数に追加)

次に音声処理クラスにバイパス処理を行う関数を追加します。

process()関数内の「入力・出力バッファのポインタをわかりやすい変数に格納」の後に上記関数を入れます。
バイパスパラメータがOnの時(1.0)の時に呼ばれるかたちにします

上記以外にもVST3.6についての情報があります。下記をご参照ください。

また、質問やご指摘はコメント欄や掲示板Twitterでいただけばとおもいます。

掲示板
■Twitterアカウント:@vstcpp   URL:https://twitter.com/vstcpp

エフェクターの簡単な実装例 – フェイザー

フェイザーの実装例

フェイザーとはオールパスフィルターを使って音を揺らすエフェクターです。

パラメーターとして下記がよく利用されます。

パラメーター 意味 だいたいの範囲
干渉 フェイザーのかかり具合 0.0~1.0の間
レート 揺らぎの間隔・周期 0Hz~16Hz程度
深さ 揺らぎの深さ 0~5程度
周波数 オールパスフィルターの周波数 200~1kHz程度

実装はまず、カットオフ周波数を一定周期で揺らしたオールパスフィルターを入力信号にかけます。
次に元の入力信号とオールパスフィルタをかけた入力信号を混ぜ合わせて出力します。

フィルタは「簡単なデジタルフィルタのサンプルコード」を使用しています。
あくまで実装例ですのでいい音質のものがほしい場合は、ご自身で試行錯誤いただくようお願いします。

【実装イメージ】

上記はあくまで実装例ですので、オールパスフィルタの数や揺らし方等を工夫する余地があります。
また、フィードバックとしてtmpL/RやoutL/Rを次の入力信号に加算させることで音も変わります。

質問はコメント欄や掲示板Twitterでいただけばとおもいます。
他のエフェクター実装例はこちらにもあります。 → エフェクターの簡単な実装例

掲示板
■Twitterアカウント:@vstcpp   URL:https://twitter.com/vstcpp

エフェクターの簡単な実装例 – 2バンドイコライザー

2バンドイコライザーの実装例

2バンドイコライザーとは入力音声の低音域と高音域を増幅するエフェクターです。

パラメーターとして下記がよく利用されます。

パラメーター 意味 だいたいの範囲
低音周波数 増幅する低音域の周波数 50Hz~1kHz程度
低音ゲイン 低音域の増幅量 -15~15dB
高周波数 増幅する高音域の周波数 50Hz~1kHz程度
高音ゲイン 高音域の増幅量 -15~15dB

実装は入力信号をローシェルフフィルタとハイシェルフフィルタに通すだけです。

フィルタは「簡単なデジタルフィルタのサンプルコード」を使用しています。
あくまで実装例ですのでいい音質のものがほしい場合は、ご自身で試行錯誤いただくようお願いします。

【実装イメージ】

質問はコメント欄や掲示板Twitterでいただけばとおもいます。
他のエフェクター実装例はこちらにもあります。 → エフェクターの簡単な実装例

掲示板
■Twitterアカウント:@vstcpp   URL:https://twitter.com/vstcpp

エフェクターの簡単な実装例 – パンナー

パンナーの実装例

パンナーとは入力音声の音量(振幅)を一定周期で左右に揺らすエフェクターです。

パラメーターとして下記がよく利用されます。

パラメーター 意味 だいたいの範囲
周期 パンの周期 0Hz~30Hz程度
深さ パンの効き具合(どの程度左右に揺らすか?) 0~1倍

実装は左右の入力信号のボリュームを正弦波や三角波等で計算しかけ合わせるだけです。
例:
 右の音量が1.0の時、左の音量は1.0-1.0=0.0、
 右の音量が0.8の時、左の音量は1.0-0.8=0.2
:
 右の音量が0.2の時、左の音量は1.0-0.2=0.8

あくまで実装例ですのでいい音質のものがほしい場合は、ご自身で試行錯誤いただくようお願いします。

【実装イメージ】

質問はコメント欄や掲示板Twitterでいただけばとおもいます。
他のエフェクター実装例はこちらにもあります。 → エフェクターの簡単な実装例

掲示板
■Twitterアカウント:@vstcpp   URL:https://twitter.com/vstcpp

エフェクターの簡単な実装例 – トレモロ

トレモロの実装例

トレモロとは入力音声の音量(振幅)を一定周期で増減させるエフェクターです。

パラメーターとして下記がよく利用されます。

パラメーター 意味 だいたいの範囲
周期 トレモロの周期 0Hz~30Hz程度
深さ トレモロの効き具合(振幅をどの程度制御するか?) 0~1倍

実装は入力信号に正弦波や三角波等をかけ合わせるだけです。
あくまで実装例ですのでいい音質のものがほしい場合は、ご自身で試行錯誤いただくようお願いします。

【実装イメージ】

質問はコメント欄や掲示板Twitterでいただけばとおもいます。
他のエフェクター実装例はこちらにもあります。 → エフェクターの簡単な実装例

掲示板
■Twitterアカウント:@vstcpp   URL:https://twitter.com/vstcpp