ファズの実装例
ファズとは入力信号を増幅し、振幅の最大値を超えたものをクリッピングすることで音を歪ませるエフェクターです。
※ファズやオーバードライブ、ディストーションは本やサイトによって説明が変わるようですが、ここでは単純に入力信号を増幅し、クリッピングしたものをファズとします。
パラメーターとして下記がよく利用されます。
パラメーター | 意味 | だいたいの範囲 |
---|---|---|
ゲイン | 入力信号の増幅量 | 10~300倍程度(dB換算で20dB~50dB程度) |
ボリューム | 出力信号の音量 | 0~1の範囲 |
実装は入力信号にゲインを掛け、振幅の最大値・最小値を超えたものをそれぞれ最大値・最小値に合わせます。
あくまで実装例ですのでいい音質のものがほしい場合は、ご自身で試行錯誤いただくようお願いします。
【実装イメージ】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
void fuzz(float inL[], float inR[], float outL[], float outR[], int wavelength) { // inL[]、inR[]、outL[]、outR[]はそれぞれ入力信号と出力信号のバッファ(左右) // wavelenghtはバッファのサイズ、サンプリング周波数は44100Hzとする // エフェクターのパラメーター float gain = 200.0f; // 増幅量。10~300程度(dB換算で20dB~50dB程度) float volume = 0.5f; // 出力信号の音量。0.0~1.0の範囲 // 入力信号にエフェクターを適用する for (int i = 0; i < wavelength; i++) { // 入力信号にゲインを掛けて増幅する float tmpL = gain * inL[i]; // 振幅の最大値(ここでは-1.0~1.0)を超えたものをクリッピングする if (tmpL > 1.0f) { tmpL = 1.0f; } if (tmpL < -1.0f) { tmpL = -1.0f; } // 右側の入力信号も同様に処理 float tmpR = gain * inR[i]; if (tmpR > 1.0f) { tmpR = 1.0f; } if (tmpR < -1.0f) { tmpR = -1.0f; } // 音量を調節して出力する outL[i] = volume * tmpL; outR[i] = volume * tmpR; } } |
上記はあくまで実装例です。
クリッピングする値を非対称(例:-1.0~0.5 等)にしたり、上記if文の代わりに飽和関数(tanh関数など)を適用しても面白いかもしれません。
質問はコメント欄や掲示板、Twitterでいただけばとおもいます。
他のエフェクター実装例はこちらにもあります。 → エフェクターの簡単な実装例
■掲示板
■Twitterアカウント:@vstcpp URL:https://twitter.com/vstcpp