Effector Tips
VSTでのシンプルなディレイの作成
作成するディレイは「
ディレイとは」にあるディレイ(下図)とする
なお、説明については要点のみ説明する。サンプルコード全体は以下よりダウンロードしてほしい。
ディレイのパラメーター
今回作成するディレイは以下のパラメーターを持つ
1. |
Delay Level |
遅延した音の音量。0%~100%の間で指定する。 |
2. |
Delay Time |
遅延させる時間。100ミリ秒~1000ミリ秒の間で指定する。 |
作成するクラスの定義
作成するクラスのメンバー変数として、リングバッファクラスのインスタンスを定義する。(左右のチャンネル分)
また、パラメータ用の変数も定義する。
class MyDelayVST : public AudioEffectX
{
protected:
CRingBuffer RingBufL;
CRingBuffer RingBufR;
float fDlayLevel;
float fDelayTime;
public:
MyDelayVST (audioMasterCallback audioMaster);
~MyDelayVST ();
//~~~以下、記載省略~~~
};
コンストラクタ
コンストラクタで初期化を行う。
ここではディレイレベルは40%に、ディレイタイムは100ミリ秒に設定している。
変数の設定後にリングバッファクラスのSetInterval()関数を呼び出して読み出し位置、書き込み位置の距離を設定している。距離の計算は以下の式で行っている。
なお、getSampleRate()関数は継承元クラス(AudioEffectX)に定義された関数で現在のサンプリングレートを返す関数である。
読み出し・書き込み位置の距離 = 設定した秒数 × サンプリングレート
= (fDelayTime ÷ 1000) × getSampleRate()
MyDelayVST::MyDelayVST (audioMasterCallback audioMaster)
: AudioEffectX (audioMaster, MY_VST_PRESET_NUM, MY_VST_PARAMETER_NUM)
{
//VSTの初期化を行う。説明は省略する
setNumInputs (MY_VST_INPUT_NUM); //入力数の設定
setNumOutputs (MY_VST_OUTPUT_NUM); //出力数の設定
setUniqueID (MY_VST_UNIQUE_ID); //ユニークIDの設定
isSynth (false);
canProcessReplacing ();
//このVSTのパラメータを初期化する。
fDlayLevel = 0.4f;
fDelayTime = 100.0f;
RingBufL.SetInterval((int)(fDelayTime / 1000.0f * getSampleRate() ));
RingBufR.SetInterval((int)(fDelayTime / 1000.0f * getSampleRate() ));
}
processReplacing()関数
ディレイの経路図に従って、processReplacing()関数の音声処理部分(whileループ内)で以下の処理を行っている
- 入力信号をリングバッファへデータを保存する
- リングバッファから取り出したデータにfDelayLevelを乗算したものと入力信号を加算。出力信号とする。
- リングバッファの読み取り位置、書き込み位置を進める。
void MyDelayVST::processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames)
{
float* inL = inputs[0]; //入力 左用
float* inR = inputs[1]; //入力 右用
float* outL = outputs[0]; //出力 左用
float* outR = outputs[1]; //出力 右用
while (sampleFrames > 0)
{
//入力信号をリングバッファへ
RingBufL.SetValue((*inL));
RingBufR.SetValue((*inR));
//リングバッファから取り出した値と入力信号を加算
(*outL) = (*inL) + fDlayLevel * RingBufL.GetValue();
(*outR) = (*inR) + fDlayLevel * RingBufR.GetValue();
//リングバッファの読み取り位置、書き込み位置を進める
RingBufR.ForwardReadPosition();
RingBufL.ForwardReadPosition();
RingBufR.ForwardWritePosition();
RingBufL.ForwardWritePosition();
inL++;
inR++;
outL++;
outR++;
sampleFrames--;
}
}
setParameter()関数、getParameter()関数
ホストアプリケーションからのパラメーター操作に対応できるようsetParameter()関数とgetParameter()関数をオーバーライドする。
setParameter()では引数のvalueの値を内部変数のfDelayLevelとfDelayTimeにあわせるように変換している。
ディレイレベル |
valueの範囲(0.0~1.0)をfDelayLevelの範囲(0%~100%)に変換 |
ディレイタイム |
valueの範囲(0.0~1.0)をfDelayTimeの範囲(100ミリ秒~1000ミリ秒)に変換 その後、RingBufLとRingBufRのSetInterval()関数を呼び出してリングバッファの読み込み・書き込み位置を変更。 |
void MyDelayVST::setParameter (VstInt32 index, float value)
{
//indexで指定されたパラメータに値を設定する。
//valueは0.0f~1.0fで与えられる。
switch (index)
{
case DELAY_LEVEL:
fDlayLevel = value;
break;
case DELAY_TIME:
fDelayTime = 900.0f * value + 100.0f; //100ミリ秒~1000ミリ秒
RingBufL.SetInterval((int)(fDelayTime / 1000.0f * getSampleRate() ));
RingBufR.SetInterval((int)(fDelayTime / 1000.0f * getSampleRate() ));
break;
}
}
getParameter()では内部変数のfDelayLevelとfDelayTimeを0.0~1.0の範囲に変換して戻り値を返している。
float MyDelayVST::getParameter (VstInt32 index)
{
//indexで指定されたパラメータの値を
//0.0f~1.0fの範囲で返す
float value = 0.0f;
switch (index)
{
case DELAY_LEVEL:
value = fDlayLevel;
break;
case DELAY_TIME:
value = (fDelayTime - 100.0f) / 900.0f; //100ミリ秒~1000ミリ秒を0.0f~1.0fの範囲にする
break;
}
return value;
}
同一カテゴリのTips
最終更新:2010年06月04日 01:00