// ============================================================================================
// インクルードファイル
// ============================================================================================
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <windows.h>
#include "audioeffectx.h"
// ============================================================================================
// 設計情報の記入
// ============================================================================================
#define MY_VST_VENDOR "test vendor" //作者(ベンダー)名
#define MY_VST_VERSION 1 //このVSTバージョン
#define MY_VST_PRODUCT_NAME "Sample Tremolo VST" //このVSTの製品名
#define MY_VST_NAME "Tremolo" //このVSTの名前
#define MY_VST_INPUT_NUM 2 //入力数。モノラル入力=1、ステレオ入力=2
#define MY_VST_OUTPUT_NUM 2 //出力数。モノラル出力=1、ステレオ出力=2
#define MY_VST_UNIQUE_ID 'SMPL' //ユニークID
//公開する場合は以下URLで発行されたユニークIDを入力する。
//http://ygrabit.steinberg.de/~ygrabit/public_html/index.html
#define MY_VST_PRESET_NUM 1 //プリセットプログラムの数
#define MY_VST_PARAMETER_NUM 2 //パラメータの数
//このVSTのパラメータを定義しておく。
//0からの連番でなければならない。
#define TREMOLO_SPEED 0
#define TREMOLO_DEPTH 1
// ============================================================================================
// VSTの基本となるクラス
// ============================================================================================
class MyTremoloVST : public AudioEffectX
{
protected:
float fTime; //トレモロ用に経過時間を保存する変数
float fTremoloSpeed; //トレモロの周期
float fTremoloDepth; //トレモロの振幅
public:
MyTremoloVST (audioMasterCallback audioMaster);
~MyTremoloVST ();
//作者(ベンダー)名、バージョン、製品名、VSTの名前を
//Hostアプリケーションへ知らせるメンバー関数
virtual bool getVendorString (char* text);
virtual VstInt32 getVendorVersion ();
virtual bool getProductString (char* text);
virtual bool getEffectName (char* name);
// エフェクターのパラメータに関するメンバー関数
virtual void setParameter (VstInt32 index, float value);
virtual float getParameter (VstInt32 index);
virtual void getParameterName (VstInt32 index, char* text);
virtual void getParameterLabel (VstInt32 index, char* label);
virtual void getParameterDisplay (VstInt32 index, char* text);
// 音声信号を処理するメンバー関数
virtual void processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames);
};
// ============================================================================================
// このVSTのを生成するための関数
// ============================================================================================
AudioEffect* createEffectInstance (audioMasterCallback audioMaster)
{
//newでこのVSTを生成したポインタを返す
return new MyTremoloVST (audioMaster);
}
// ============================================================================================
// コンストラクタ、デストラクタ(VSTの初期化、終了処理を記述)
// ============================================================================================
MyTremoloVST::MyTremoloVST (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); //このVSTがSynthかどうかのフラグを設定。
//Synthの場合…true、Effectorの場合…false
canProcessReplacing (); //このVSTが音声処理可能かどうかのフラグを設定。
//音声処理を行わないVSTはないので必ずこの関数を呼び出す。
//このVSTのパラメータを初期化する。
fTime = 0.0f;
fTremoloSpeed = 1.0f / 4.0f; //トレモロの周期 0.25秒
fTremoloDepth = 0.5f; //トレモロの振幅 0.5倍
}
MyTremoloVST::~MyTremoloVST ()
{
//VSTの終了処理をする。
//このVSTでは特に実行する処理はなし。
}
// ============================================================================================
// 作者(ベンダー)名、バージョン、製品名、VSTの名前をHostアプリケーションへ知らせるメンバー関数
// ============================================================================================
bool MyTremoloVST::getVendorString (char* text)
{
//作者(ベンダー)名をtextに格納してtrueを返す。
//kVstMaxVendorStrLenは「vstsdk2.4\pluginterfaces\vst2.x\aeffect.h」に
//定義されている。(kVstMaxVendorStrLen = 64)
vst_strncpy (text, MY_VST_VENDOR, kVstMaxVendorStrLen);
return true;
}
VstInt32 MyTremoloVST::getVendorVersion ()
{
//バージョン(整数)を返す。
return MY_VST_VERSION;
}
bool MyTremoloVST::getProductString (char* text)
{
//製品名をtextに格納してtrueを返す。
//kVstMaxProductStrLenは「vstsdk2.4\pluginterfaces\vst2.x\aeffect.h」に
//定義されている。(kVstMaxProductStrLen = 64)
vst_strncpy (text, MY_VST_PRODUCT_NAME, kVstMaxProductStrLen);
return true;
}
bool MyTremoloVST::getEffectName (char* name)
{
//製品名をnameに格納してtrueを返す。
//kVstMaxEffectNameLenは「vstsdk2.4\pluginterfaces\vst2.x\aeffect.h」に
//定義されている。(kVstMaxEffectNameLen = 32)
vst_strncpy (name, MY_VST_NAME, kVstMaxEffectNameLen);
return true;
}
// ============================================================================================
// エフェクターのパラメーターの設定、表示を行うメンバー関数
// ============================================================================================
void MyTremoloVST::setParameter (VstInt32 index, float value)
{
//indexで指定されたパラメータに値を設定する。
//valueは0.0f~1.0fで与えられる。
switch (index)
{
case TREMOLO_SPEED:
fTremoloSpeed = 1.0f / (29.0f*value +1.0f); //1秒~1/30秒の範囲にする
break;
case TREMOLO_DEPTH:
fTremoloDepth = value;
break;
}
}
float MyTremoloVST::getParameter (VstInt32 index)
{
//indexで指定されたパラメータの値を
//0.0f~1.0fの範囲で返す
float value = 0.0f;
switch (index)
{
case TREMOLO_SPEED:
value = (1 / fTremoloSpeed - 1.0f) / 29.0f; //1秒~1/30秒を0.0f~1.0fの範囲にする
break;
case TREMOLO_DEPTH:
value = fTremoloDepth;
break;
}
return value;
}
void MyTremoloVST::getParameterName (VstInt32 index, char* text)
{
//indexで指定されたパラメータの名前をtextに格納する
//kVstMaxParamStrLenは「vstsdk2.4\pluginterfaces\vst2.x\aeffect.h」に
//定義されている。(kVstMaxParamStrLen = 8)
switch (index)
{
case TREMOLO_SPEED:
vst_strncpy (text, "Speed", kVstMaxParamStrLen);
break;
case TREMOLO_DEPTH:
vst_strncpy (text, "Depth", kVstMaxParamStrLen);
break;
}
}
void MyTremoloVST::getParameterLabel (VstInt32 index, char* label)
{
//indexで指定されたパラメータの単位をlabelに格納する
//kVstMaxParamStrLenは「vstsdk2.4\pluginterfaces\vst2.x\aeffect.h」に
//定義されている。(kVstMaxParamStrLen = 8)
switch (index)
{
case TREMOLO_SPEED:
vst_strncpy (label, "Hz", kVstMaxParamStrLen);
break;
case TREMOLO_DEPTH:
vst_strncpy (label, "dB", kVstMaxParamStrLen);
break;
}
}
void MyTremoloVST::getParameterDisplay (VstInt32 index, char* text)
{
//indexで指定されたパラメータの表示内容をtextに格納する
//kVstMaxParamStrLenは「vstsdk2.4\pluginterfaces\vst2.x\aeffect.h」に
//定義されている。(kVstMaxParamStrLen = 8)
switch (index)
{
case TREMOLO_SPEED:
float2string (1.0f / fTremoloSpeed, text, kVstMaxParamStrLen);
break;
case TREMOLO_DEPTH:
float2string (fTremoloDepth, text, kVstMaxParamStrLen);
break;
}
}
// ============================================================================================
// 音声信号を処理するメンバー関数
// ============================================================================================
void MyTremoloVST::processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames)
{
//入力、出力は2次元配列で渡される。
//入力は-1.0f~1.0fの間で渡される。
//出力は-1.0f~1.0fの間で書き込む必要がある。
//sampleFramesが処理するバッファのサイズ
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; //円周率
while (sampleFrames > 0)
{
//ここで音声処理を行う。
//dt分時間を進める。
//トレモロ周期を超えた場合は、周期分戻す。
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)));
inL++;
inR++;
outL++;
outR++;
sampleFrames--;
}
}