0

私は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 ++; }}

4

2 に答える 2

3

return関数をすぐに終了するという事実を知っていますか?したがって、その後に値をバッファに格納するコードは実行されません。

代わりに、関数の最後にreturn呼び出しを配置する必要があります。

その他の注意事項:

  • 最初の要素のみを使用するのに、なぜバッファへのポインタが必要なのかは私にはわかりません。
  • -L関数と-R関数に重複するコードがあります。代わりに、「mono」クラスの2つのインスタンスを使用して、クラスごとに1つのチャネルのデータのみを保存します。
  • あなたは(ほとんど)を使用する必要はありませんthis->。そのままにしておいてください。
于 2011-02-02T15:39:30.933 に答える
1

ここで見つかったネストされたクラスに関する新しい質問を作成した後、解決策が見つかりました。

フィルタクラスは、myPluginクラス内で宣言されます。

ここから、コンストラクタとデストラクタは次のように構築されます。

myPlugin::aFilterL::aFilterL()
myPlugin::aFilterL::~aFilterL()

myPluginコンストラクターで、新しいインスタンスが作成されます。

aFilterL *my_aFilter1L = new aFilterL();

そして、パズルの最後のピースは、それらがmyPluginエフェクトにインスタンスとして追加されていることを確認することです。

aFilterL my_aFilter1L;
aFilterR my_aFilter1R;

my_aFilter1LなどにprocessReplacingを介してアクセスできるようになり、正しく機能しているようです。

この件に関して皆様のご協力に感謝いたします。

于 2011-02-03T11:42:40.243 に答える