パンナーの実装例
パンナーとは入力音声の音量(振幅)を一定周期で左右に揺らすエフェクターです。
パラメーターとして下記がよく利用されます。
パラメーター | 意味 | だいたいの範囲 |
---|---|---|
周期 | パンの周期 | 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
あくまで実装例ですのでいい音質のものがほしい場合は、ご自身で試行錯誤いただくようお願いします。
【実装イメージ】
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 31 |
void panner(float inL[], float inR[], float outL[], float outR[], int wavelength) { // inL[]、inR[]、outL[]、outR[]はそれぞれ入力信号と出力信号のバッファ(左右) // wavelenghtはバッファのサイズ、サンプリング周波数は44100Hzとする // エフェクターのパラメーター float freq = 4.0f;// パンの周期。0Hz~16Hz程度 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); float c = (1.0f - depth) + ((1.0f - a) * depth); // 入力信号と掛け合わせる outL[i] = b * inL[i]; outR[i] = c * inR[i]; } } |
質問はコメント欄や掲示板、Twitterでいただけばとおもいます。
他のエフェクター実装例はこちらにもあります。 → エフェクターの簡単な実装例
■掲示板
■Twitterアカウント:@vstcpp URL:https://twitter.com/vstcpp