Effector Tips


VSTでのシンプルなディレイの作成

前回のリングバッファを用いて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ループ内)で以下の処理を行っている

  1. 入力信号をリングバッファへデータを保存する
  2. リングバッファから取り出したデータにfDelayLevelを乗算したものと入力信号を加算。出力信号とする。
  3. リングバッファの読み取り位置、書き込み位置を進める。


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


No. 概要
ディレイ01 ディレイとは、ディレイの処理内容概要
ディレイ02 ディレイ用バッファについて、ディレイの実装概要
ディレイ03 リングバッファの実装
ディレイ04 VSTでのシンプルなディレイの作成
ディレイ05 シンプルなディレイへのフィードバックの追加

最終更新:2010年06月04日 01:00