私はC++でVSTDSPプラグインをプログラミングしています。
'filterbank'で一連のバンドパスフィルターを作成しています。ヘッダー(関数を含む)にフィルタークラスを実装し、.cppでコンストラクタ/デストラクタを正しく構築しました。
メソッドに値を渡して、それらを返すこともできます。ただし、問題は関数のバッファにデータを格納する領域にあります。関数メソッドが呼び出されるたびに、バッファーに格納されている値がリセットされる(または、そもそも正しく格納されない)ようです。したがって、返されるものは「完全」ではありません。
どんなアドバイスも大歓迎です!
nbこの投稿は新しいコードで更新されました:
クラスは次のとおりです。
class aFilterL
{{
フレンドクラスBeat_to_Midi;
public:aFilterL(); 〜aFilterL();
float fOut1_l;
float filterOut1_l;
float Out_1_l;
float Out_2_l;
float* buffer_Out_1_l;
float* buffer_Out_2_l;
仮想floataFilterMethodL(float a0、float a1、float a2、float b1、float b2、float inputL、float prevInput1L、float prevInput2L){
Out_1_l = buffer_Out_1_l[0];
Out_2_l = buffer_Out_2_l[0];
filterOut1_l = (a0 * inputL) + (a1 * prevInput1L) + (a2 * prevInput2L) - (b1 * Out_1_l) - (b2 * Out_2_l) + 1.0E-25;
fOut1_l = filterOut1_l;
buffer_Out_2_l[0] = buffer_Out_1_l[0];
buffer_Out_1_l[0] = fOut1_l;
return fOut1_l;
}
};
クラスaFilterR{
フレンドクラスBeat_to_Midi;
public:aFilterR(); 〜aFilterR();
float fOut1_r;
float filterOut1_r;
float Out_1_r;
float Out_2_r;
float* buffer_Out_1_r;
float* buffer_Out_2_r;
仮想floataFilterMethodR(float a0、float a1、float a2、float b1、float b2、float inputR、float prevInput1R、float prevInput2R){
Out_1_r = buffer_Out_1_r[0];
Out_2_r = buffer_Out_2_r[0];
filterOut1_r = (a0 * inputR) + (a1 * prevInput1R) + (a2 * prevInput2R) - (b1 * Out_1_r) - (b2 * Out_2_r) + 1.0E-25;
fOut1_r = filterOut1_r;
buffer_Out_2_r[0] = buffer_Out_1_r[0];
buffer_Out_1_r[0] = fOut1_r;
return fOut1_r;
}};
次に、これはcppで次のように構築/破棄されます。
aFilterL::aFilterL()
{fOut1_l = 0.f; filterOut1_l = 0.f;
Out_1_l = 0.f;
Out_2_l = 0.f;
buffer_Out_1_l = new float [1];
buffer_Out_2_l = new float [1];
buffer_Out_1_l[0] = 0.f;
buffer_Out_2_l[0] = 0.f;
}
aFilterL ::〜aFilterL(){
if (buffer_Out_1_l)
delete[] buffer_Out_1_l;
if (buffer_Out_2_l)
delete[] buffer_Out_2_l;
}
aFilterR :: aFilterR(){fOut1_r = 0.f;
filterOut1_r = 0.f;
Out_1_r = 0.f;
Out_2_r = 0.f;
buffer_Out_1_r = new float [1];
buffer_Out_2_r = new float [1];
buffer_Out_1_r[0] = 0.f;
buffer_Out_2_r[0] = 0.f;
}
aFilterR ::〜aFilterR(){
if (buffer_Out_1_r)
delete[] buffer_Out_1_r;
if (buffer_Out_2_r)
delete [] buffer_Out_2_r;
}
最後に、processReplacing関数に次のように実装されます。
void myPlugin :: processReplacing(float **入力、float **出力、VstInt32 sampleFrames){
float* in1 = inputs[0];
float* in2 = inputs[1];
float* out1 = outputs[0];
float* out2 = outputs[1];
aFilterL *my_aFilter1L = new aFilterL;
aFilterR *my_aFilter1R = new aFilterR;
while(--sampleFrames> = 0){
//入力をフィルタリングします
In_1_l = buffer_In_1_l [0];
In_1_r = buffer_In_1_r [0];
In_2_l = buffer_In_2_l [0];
In_2_r = buffer_In_2_r [0];
//管理でフィルタリング
buffer_In_2_l [0] = buffer_In_1_l [0];
buffer_In_2_r [0] = buffer_In_1_r [0];
buffer_In_1_l [0] = * in1;
buffer_In_1_r [0] = * in2;
//処理のために関数に送信します
returnsL = my_aFilter1L-> aFilterMethodL(0.000171f、0.0f、-0.000171f、-1.999911f、0.999943f、* in1、In_1_l、In_2_l);
returnsR = my_aFilter1R-> aFilterMethodR(0.000171f、0.0f、-0.000171f、-1.999911f、0.999943f、* in2、In_1_r、In_2_r);
//フィルター出力を送信します
* out1 = returnsL;
* out2 = returnsR;
* in1 ++;
* in2 ++;
* out1 ++;
* out2 ++; }}