ネストされたクラスで助けが必要です。これは私がここで尋ねた質問から生まれました
基本的に、「myPlugin」というクラスがあります。このクラスは私のプログラムの大部分であり、「processReplaceing」関数が含まれています。
processReplaceing 内で、DSP を使用して信号をフィルター処理する必要があります。現在、11 個のフィルターを使用しており、11 個のフィルター (およびすべてのバッファー) が processReplaceing にハードコードされています。
ただし、フィルター クラスを作成することにしたので、フィルターごとに新しいインスタンスを作成し、必要に応じて呼び出して、コードの効率を向上させることができます。
これまでのところ、私はほとんど成功していません。しかし今、私はネストされたクラスを使用しています。これは、仕事に取り掛かることができれば、他のすべてがそれに続くべきであることを意味するはずです。
ヘッダーのクラス定義は次のとおりです。
class myPlugin : public AudioEffectX
{
public: myPlugin (audioMasterCallback audioMaster); 〜マイプラグイン ();
// Processing
virtual void processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames);
virtual void processDoubleReplacing (double** inputs, double** outputs, VstInt32 sampleFrames);
virtual void midiOutNoteOn (int iKey, int iVel);
virtual void midiOutNoteOff (int iKey, int iVel);
// 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);
virtual bool getEffectName (char* name);
virtual bool getVendorString (char* text);
virtual bool getProductString (char* text);
virtual VstInt32 getVendorVersion ();
virtual VstInt32 canDo (char* text);
class aFilterL
{
friend class myPlugin;
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;
virtual float aFilterMethodL (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;
}
};
class aFilterR
{
friend class myPlugin;
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;
virtual float aFilterMethodR (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;
}
};
};#endif
私の問題は、フィルター クラスを正しく初期化できないことです。「myPlugin」のコンストラクターは次のようになります (これは実際のコンストラクターの非常に単純化されたバージョンであることに注意してください)
myPlugin::myPlugin (audioMasterCallback audioMaster)
: AudioEffectX (audioMaster, 1, 1) // 1 プログラム、1 パラメータのみ {
setNumInputs (2); // stereo in
setNumOutputs (2); // stereo out
setUniqueID ('Gain'); // identify
canProcessReplacing (); // supports replacing output
canDoubleReplacing (); // supports double precision processing
myPlugin *my_aFilter1L = new aFilterL();
myPlugin *my_aFilter1R = new aFilterR();
}
myPlugin::~myPlugin ()
{ }
次に、processReplaceing で my_aFilter1L などを使用しようとすると、次のエラーがスローされます:
myPlugin コンストラクター内のフィルター クラスに格納されている値を初期化しようとしました。フィルター コンストラクター、つまり myPlugin::aFilter1L()またはaFilter1L::aFilter1L() を作成しようとしましたが、これらはより多くのエラーを引き起こしました。
私に何ができるのかよくわかりません。私は以前にクラス/関数を扱ったことがありますが、クラスをネストしたことはなかったので、少し迷っています。オンラインで多くのスレッドを見てきましたが、すべての答えが完全に当てはまるわけではありません。または、見つけた解決策を試しましたが、うまくいきませんでした。