※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

VST(エフェクター)作成例


音声処理

音声の処理

入力音声信号を加工して出力する関数を作成する。

processReplacing関数について

入力音声信号の加工と出力はprocessReplacing関数で行われる。
processReplacing関数の引数は3つあり、以下のようになっている。

引数 説明
float** inputs 入力音声信号のバッファ。2次元配列で渡される。
1次元目の大きさはVSTの初期化時にsetNumInputsで指定したサイズ。
2次元目の大きさは後述のsampleFramesとなる。
書き込まれている音声信号は-1.0~+1.0の範囲
float** outputs 出力音声信号のバッファ。2次元配列で渡される。
1次元目の大きさはVSTの初期化時にsetNumOutputsで指定したサイズ。
2次元目の大きさは後述のsampleFramesとなる
音声信号は-1.0~+1.0の範囲で書き込まなければならない。
VstInt32 sampleFrames 入力音声信号、出力音声信号のバッファサイズ

processReplacing関数ではinputsの音声信号を加工した値をoutputsに代入すればよい。

サンプルエフェクターの処理内容

サンプルエフェクターでは次のようにしている。

  1. void MyTremoloVST::processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames)
  2. {
  3. //入力、出力は2次元配列で渡される。
  4. //入力は-1.0f~1.0fの間で渡される。
  5. //出力は-1.0f~1.0fの間で書き込む必要がある。
  6. //sampleFramesが処理するバッファのサイズ
  7. float* inL = inputs[0]; //入力 左用
  8. float* inR = inputs[1]; //入力 右用
  9. float* outL = outputs[0]; //出力 左用
  10. float* outR = outputs[1]; //出力 右用
  11.  
  12. float dt = 1.0f / getSampleRate (); //1フレームで進む秒数
  13. float pi = 3.14159265f; //円周率
  14.  
  15. while (sampleFrames >= 0)
  16. {
  17. //ここで音声処理を行う。
  18.  
  19. //dt分時間を進める。
  20. //トレモロ周期を超えた場合は、周期分戻す。
  21. fTime = fTime + dt;
  22. if (fTime > fTremoloSpeed)
  23. {
  24. fTime -= fTremoloSpeed;
  25. }
  26.  
  27. //出力バッファへ書き込む。
  28. (*outL) = (*inL) * ( 1.0f - fTremoloDepth *
  29. (0.5f + 0.5f*sin(2.0f*pi*fTime/fTremoloSpeed)));
  30. (*outR) = (*inR) * ( 1.0f - fTremoloDepth *
  31. (0.5f + 0.5f*sin(2.0f*pi*fTime/fTremoloSpeed)));
  32.  
  33. inL++;
  34. inR++;
  35. outL++;
  36. outR++;
  37. sampleFrames--;
  38. }
  39.  
  40. }


まず、引数は以下のようになっている。
inputs[MY_VST_INPUT_NUM][sampleFrames] //MY_VST_INPUT_NUM=2
outputs[MY_VST_OUTPUT_NUM][sampleFrames] //MY_VST_OUTPUT_NUM=2
(VSTの初期化時にsetNuminputs(MY_VST_INPUT_NUM)、setNumOutputs(MY_VST_OUTPUT_NUM)としているため。「MY_VST_INPUT_NUM」 「MY_VST_OUTPUT_NUM」の詳細は宣言部に記載。)

上記引数をわかりやすいよう、サンプルエフェクターでは入力音声信号・出力音声信号ともにチャンネルごとに別の変数へ代入している。
float* inL  =  inputs[0]; //入力 左用
float* inR  =  inputs[1]; //入力 右用
float* outL = outputs[0]; //出力 左用
float* outR = outputs[1]; //出力 右用


次に音声処理で使用するローカル変数も定義・設定している。
float dt = 1.0f / getSampleRate (); //1フレームで進む秒数
float pi = 3.14159265f;             //円周率
(getSampleRate関数は継承元クラス(AudioEffect)のメンバー関数。ホストアプリケーションで設定されているサンプルレートを返す。多くの場合44100が返されると思われる。)


最後に、出力音声信号をoutputsに代入するため、sampleFrames分処理するループ(while分)を作成する。
while (sampleFrames >= 0)
{
	//ここで音声処理を行う。
		:
		:
}


ループ内ではまずトレモロ用の経過時間(fTime)を更新している。
fTime = fTime + dt;
if (fTime > fTremoloSpeed)
{
	fTime -= fTremoloSpeed;
}


次に入力音声信号バッファにトレモロの現在のボリュームを掛け合わせたものを出力音声信号バッファに代入してる。

//出力バッファへ書き込む。
(*outL) = (*inL) * ( 1.0f - fTremoloDepth * (0.5f + 0.5f*sin(2.0f*pi*fTime/fTremoloSpeed)));
(*outR) = (*inR) * ( 1.0f - fTremoloDepth * (0.5f + 0.5f*sin(2.0f*pi*fTime/fTremoloSpeed)));
(sin()関数の戻り値は-1.0~1.0のため、0.5倍し0.5を足すことで0~1.0の範囲にしている。)


最後に入力・出力音声信号のバッファのポインタ位置を1つ進め、sampleFramesの値を一つ減らしている。
inL++;
inR++;
outL++;
outR++;
sampleFrames--;



合計: -
今日: -
昨日: -