エフェクターの簡単な実装例 – ディレイ

ディレイの実装例

ディレイは入力信号に数ミリ秒前の信号(ディレイ信号)を混ぜて出力するエフェクターです

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

パラメーター 意味 だいたいの範囲
ディレイタイム ディレイの時間 50ミリ秒~2秒程度
レベル ディレイの効き具合(ディレイ信号の振幅) 0~1の間
フィードバック フィードバックの効き具合 0~1の範囲

実装は入力信号にディレイ信号を加えて出力します。ディレイ信号はリングバッファを使用して保存します。
リングバッファは「リングバッファについて」で作成したものを使用しています。
あくまで実装例ですのでいい音質のものがほしい場合は、ご自身で試行錯誤いただくようお願いします。

【実装イメージ】

上記はあくまで実装例です。
加えるディレイ信号やフィードバックで利用するディレイ信号を左右逆にしたり、フィルタをディレイ信号にかけてみるのも面白いかもしれません。
なお、for文の中やリアルタイム処理など音声処理中にディレイタイム(上記のtime変数)を変更するとクリップノイズのようなものが入る可能性があります。
変更時は一時的にディレイレベルを 0 にするか、ディレイタイムをゆっくり変更していく必要があります。

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

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

リングバッファについて

リングバッファとは

ここではディレイやコーラスなどのエフェクターで利用されるリングバッファについて簡単に説明いたします。

リングバッファとはデータ確保領域が環状に配置されたエンドレスなバッファです。

リング状のバッファため通常の配列とは違って「先頭から○○番目のデータ」のような指定はできず、「読み込み位置から○○番目のデータ」と指定します。
そのため、リングバッファは内部的に読み取りと書き込みを行うバッファの位置の情報を持ちます。この読み取り位置・書き込み位置を動かす(進める)ことで必要なデータの読み取り・書き込みをします。

【リングバッファのイメージ】

実装に当たっては下記の図のように、1次元のバッファを用意し、読み取り位置や書き込み位置がバッファの大きさを超えるとバッファ先頭へ戻るという処理を行えば実装できます。
もっと見る

テンポの取得

VST3.6におけるテンポの取得

VSTプラグインを作成する際、ホストアプリ(DAWなど)からテンポの情報を取得したい場合があります。

テンポ情報は音声処理クラスのprocess()関数の引数ProcessData& dataに保存されています。

実際に取得する方法は下記となります。なお、ホストアプリ(DAWなど)によっては、取得できない場合もあります。
(情報を取得できなかったホストアプリについてはコメント欄や掲示板Twitterなどで教えていただけると助かります。)

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

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

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

エフェクターの簡単な実装例 – オーバードライブ・ディストーション

オーバードライブ・ディストーションの実装例

オーバードライブ・ディストーションとは不要な低音域をカットしたうえで入力信号を増幅し、振幅の最大値を超えたものをクリッピングすることで音を歪ませるエフェクターです。
一般的にオーバードライブ・ディストーションの区別は増幅量の大小だけですので、ここでは一緒に扱います。
※ファズやオーバードライブ、ディストーションは本やサイトによって説明が変わるようですが、ここでは入力信号にフィルタを掛け増幅し、クリッピングしたものをオーバードライブ・ディストーションとします。

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

パラメーター 意味 だいたいの範囲
ゲイン 入力信号の増幅量 10~300倍程度(dB換算で20dB~50dB程度)
ボリューム 出力信号の音量 0~1の範囲

実装は入力信号にフィルタを掛け、ゲインで増幅(乗算)したあと振幅の最大値・最小値を超えたものをそれぞれ最大値・最小値に合わせます。
フィルタは「簡単なデジタルフィルタのサンプルコード」を使用しています。
あくまで実装例ですのでいい音質のものがほしい場合は、ご自身で試行錯誤いただくようお願いします。

【実装イメージ】

上記はあくまで実装例です。
クリッピングする値を非対称(例:-1.0~0.5 等)にしたり、上記if文の代わりに飽和関数(tanh関数など)を適用しても面白いかもしれません。

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

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

今後の更新予定

今後の更新予定

今後はエフェクターの実装例VSTプラグインのTIPSを中心に更新予定です。

TIPSについては記載できそうなものをはじめてのVST3.6.8プラグインの作りのページに追加しております。

ご要望があればできるだけ先に記事を作成・記載するようにいたします。
はじめてのVST3.6.8プラグインの作り内のコメントや掲示板Twitterでご連絡いただけばとおもいます。

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

エフェクターの簡単な実装例 – ファズ

ファズの実装例

ファズとは入力信号を増幅し、振幅の最大値を超えたものをクリッピングすることで音を歪ませるエフェクターです。
※ファズやオーバードライブ、ディストーションは本やサイトによって説明が変わるようですが、ここでは単純に入力信号を増幅し、クリッピングしたものをファズとします。

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

パラメーター 意味 だいたいの範囲
ゲイン 入力信号の増幅量 10~300倍程度(dB換算で20dB~50dB程度)
ボリューム 出力信号の音量 0~1の範囲

実装は入力信号にゲインを掛け、振幅の最大値・最小値を超えたものをそれぞれ最大値・最小値に合わせます。
あくまで実装例ですのでいい音質のものがほしい場合は、ご自身で試行錯誤いただくようお願いします。

【実装イメージ】

上記はあくまで実装例です。
クリッピングする値を非対称(例:-1.0~0.5 等)にしたり、上記if文の代わりに飽和関数(tanh関数など)を適用しても面白いかもしれません。

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

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