トレモロの実装例
トレモロとは入力音声の音量(振幅)を一定周期で増減させるエフェクターです。
パラメーターとして下記がよく利用されます。
パラメーター | 意味 | だいたいの範囲 |
---|---|---|
周期 | トレモロの周期 | 0Hz~30Hz程度 |
深さ | トレモロの効き具合(振幅をどの程度制御するか?) | 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 30 |
void tremolo(float inL[], float inR[], float outL[], float outR[], int wavelength) { // inL[]、inR[]、outL[]、outR[]はそれぞれ入力信号と出力信号のバッファ(左右) // wavelenghtはバッファのサイズ、サンプリング周波数は44100Hzとする // エフェクターのパラメーター float freq = 4.0f; // トレモロの周期。0Hz~30Hz程度 float depth = 0.5f; // トレモロの効き具合。0~1の間。 // 内部変数 float theta = 0; // sin関数の角度 θ。初期値は0 float speed = (2.0f * 3.14159265f * freq) / 44100.0f; // トレモロのスピード。角速度ωと同じ。 // 入力信号にエフェクトをかける for (int i = 0; i < wavelength; i++) { // 角度θに角速度を加える theta += speed; // sin関数の結果を0~1の間にする float a = (sin(theta) * 0.5f) + 0.5f; // depthと先ほどの結果から掛け合わせる値を計算する float b = (1.0f - depth) + (a * depth); // 入力信号と掛け合わせる outL[i] = b * inL[i]; outR[i] = b * inR[i]; } } |
質問はコメント欄や掲示板、Twitterでいただけばとおもいます。
他のエフェクター実装例はこちらにもあります。 → エフェクターの簡単な実装例
■掲示板
■Twitterアカウント:@vstcpp URL:https://twitter.com/vstcpp