簡単なエフェクターを作成してみる

簡単なエフェクターを作成してみる

前項では、VSTプラグインとして最低限動作するものを作成しました。
せっかくなので入力信号を加工する簡単なエフェクターを作成してみます。

作成するエフェクターはトレモロにします。
理由は、比較的簡単に実装でき、エフェクター効果がわかりやすいためです。

作成するVSTプラグインの概要は下記のとおりです。

  • ホストアプリケーション上でエフェクターとして動作する
  • 入力、出力共にステレオ(2チャンネル)
  • 入力された音声にトレモロをかけて出力する
  • サンプリング周波数は44,100Hzのみ対応

なお、前回作成したVSTプラグインはここを参照してください。 → VSTプラグインを作成してみる
また、プロジェクトの作成方法についてはここを参照してください。 → Visual Studioのプロジェクト作成する


トレモロとは

トレモロとは入力音声の音量(振幅)を一定周期で増減させるエフェクターです。
入力信号に0Hz~30Hz程度の正弦波や三角波を掛け合わせることで実装することができます。

実装イメージ(入力信号と正弦波の掛け合わせ)


ソースコードの説明

ここで作成するVSTプラグインの全ソースコードは下記のリンク先に記載しています。
ここでは下記のソースコードをもとに説明いたします。

ソースファイル 概要
MyMiniTremoloVST.cpp VSTプラグインのメインとなるソースファイル。

ソースコード全体はここに記載しています。 → ソースコード全体


ヘッダーファイルのインクルード

まず、VSTプラグインを作るために必要なヘッダーファイルのインクルードと定数の定義を行います。

前項で説明したヘッダファイル(audioeffectx.h)以外に、Sin関数等の算術関数を使うため5行目でmath.hをインクルードしております。
そのほかは変わっておりません。


VSTプラグインクラスの定義

次にVSTプラグインクラスの定義を行います。今回は前項のメンバー関数に加えてトレモロのパラメーターを定義しています。(赤色部分)

各メンバー変数はクラス外部から参照される必要はありませんので、privateで定義しております。それぞれのメンバー変数の内容は下記のとおりです。

変数名 内容
float theta sin関数の角度 θ。初期値は必ず0にする。
float tremolospeed トレモロのスピード。角速度ωと同じ。
サンプリング周期ごとにthetaに足し合わせる。
トレモロスピードは2×π×トレモロの周波数÷サンプリング周波数で求める
float tremolodepth トレモロの効き具合。
0~1の間で、0がトレモロはまったく効かない状態で1がもっともトレモロの効く状態


VSTプラグインの初期化

VSTプラグインの初期化を行います。前項のコンストラクタで説明したVSTプラグインの基本設定(55~65行目)に加え、トレモロのパラメータを初期化しています。(赤色部分)

tremolospeedとtremolodepthは今回は適当な値を設定しています。


入力信号への正弦波の掛け合わせ

最後にprosessReplacing関数で入力信号(第1引数 inputs)と正弦波を掛け合わせます。掛け合わせた結果は前項のとおり、第2引数のoutputsに代入します。

まず、89行目でSin関数の角度thetaにtremolospeed(=角速度)を加えて角度thetaを更新します。

次に96行目でSin関数の振幅を取得し、0~1の範囲にします。

99行目で入力信号と掛け合わせる値をtremolodepthとSin関数の振幅(0~1の範囲にしたもの)から計算します。

そして最後に102~103行目で入力信号と掛け合わせ、出力バッファ(outputs[])に代入します。


コンパイルとビルド

以上の内容でコンパイルとビルドを行えば、トレモロエフェクターとして動作するVSTプラグイン完成するはずです。

前項で説明したとおり、いくつかのwarningとエラーが発生しますが、プロジェクトのReleaseフォルダ配下に「~~.dll」が
作成されていれば特に問題はありません。


最後に

いかがでしたでしょうか?

今回は簡単でわかりやすいという理由からトレモロを実装しました。簡単なコードですがそこそこきれいにトレモロがかかるかと思います。
しかし、パラメーターがハードコーディングされているためホストアプリケーション上で調整がまったくできません。

次項はここで作成したエフェクターのパラメーターをホストアプリケーション上からコントロールするための機能を追加いたします。


コメントを残す