ホームに戻る
/*
nmVst1 サンプルの解説
1プログラム、1パラメーターの例
DLLの入り口は vstplugmain.cpp で記述されている。
本体は AudioEffectX を拡張したクラスを createEffectInstance で返せば良い。
VSTには「パラメーター」と「プログラム」という概念がある。
「パラメーター」はプラグインが持てる設定のこと。
「プログラム」は「パラメーター」群のこと。
例えば、
パラメーターが Param1, Param2, Param3 の3つだとして。
プログラムがProg1, Prog2, Prog3 の3つだとする。
Prog1で、Prog1のParam1、Prog1のParam2、Prog1のParam3、
Prog2で、Prog2のParam1、Prog2のParam2、Prog2のParam3、
Prog3で、Prog3のParam1、Prog3のParam2、Prog3のParam3、
Prog1 と Prog2 と Prog3 を切り替えて使用する。
nmVst1 のコンストラクタでは継承元の AudioEffectX で
プログラム数とパラメーター数を初期化する。
set と get の関数はなぜ必要か?
プラグインはプログラム数×パラメータのデータを持つ。
ただし、これらのデータはホストアプリ側で記録せざるをえない。
なぜならホストアプリのファイルAの設定をプラグイン側で保存すると、
ホストアプリのファイルBを呼び出した場合にファイルAの時の設定を呼び出してしまう。
よって、プラグインの設定はホストアプリ側のファイルが記録することとなる。
このためにデータの連絡をする関数が必要になる。
パラメーターの数値は float の 0.0 から 1.0 の数値に限る。
例えば、0.0 から 10.0 まで変化するパラメーターを使用したい場合は、
パラメーターに記録する際に 10 で割り、使用する場合にはパラメーターに 10 をかける。
この制限により、整数や文字列を扱う時でさえ float の 0.0 から 1.0 に変換する必要がある。
processReplacing がエフェクト処理そのものである。
バッファサイズが sampleFrames に入っているので、
in と out の間で処理を書けば良い。
Microsoft Visual C++ 2008
vst_sdk 2.4 を使用
*/
#include "audioeffectx.h"
class nmVst1 : public AudioEffectX{
public:
nmVst1(audioMasterCallback audioMaster);
~nmVst1();
// Processing
virtual void processReplacing(float** inputs, float** outputs, VstInt32 sampleFrames);
// Program
virtual void setProgramName(char* name);
virtual void getProgramName(char* name);
// Parameters
virtual void setParameter(VstInt32 index, float value);
virtual float getParameter(VstInt32 index);
virtual void getParameterLabel(VstInt32 index, char* label);
virtual void getParameterDisplay(VstInt32 index, char* text);
virtual void getParameterName(VstInt32 index, char* text);
protected:
float fParam1;
char programName[kVstMaxProgNameLen + 1];
};
AudioEffect* createEffectInstance(audioMasterCallback audioMaster){
return new nmVst1(audioMaster);
}
nmVst1::nmVst1(audioMasterCallback audioMaster) : AudioEffectX(audioMaster, 1, 1){
setNumInputs(2); // ステレオ入力
setNumOutputs(2); // ステレオ出力
setUniqueID ('nmV1'); // ID
canProcessReplacing ();
fParam1 = 1.f; // 現在のパラメーター1
vst_strncpy(programName, "Default", kVstMaxProgNameLen);
}
nmVst1::~nmVst1(){}
// programName に name をセット
void nmVst1::setProgramName(char* name){
vst_strncpy(programName, name, kVstMaxProgNameLen);
}
// name に programName をセット
void nmVst1::getProgramName(char* name){
vst_strncpy(name, programName, kVstMaxProgNameLen);
}
void nmVst1::setParameter(VstInt32 index, float value){
fParam1 = value;
}
float nmVst1::getParameter(VstInt32 index){
return fParam1;
}
void nmVst1::getParameterName(VstInt32 index, char* label){
vst_strncpy(label, "Param1", kVstMaxParamStrLen);
}
void nmVst1::getParameterDisplay(VstInt32 index, char* text){
dB2string(fParam1, text, kVstMaxParamStrLen);
}
void nmVst1::getParameterLabel(VstInt32 index, char* label){
vst_strncpy(label, "dB", kVstMaxParamStrLen);
}
void nmVst1::processReplacing(float** inputs, float** outputs, VstInt32 sampleFrames){
float* in1 = inputs[0];
float* in2 = inputs[1];
float* out1 = outputs[0];
float* out2 = outputs[1];
while(--sampleFrames >= 0){
(*out1++) = (*in1++) * fParam1;
(*out2++) = (*in2++) * fParam1;
}
}