0

ネストされたクラスで助けが必要です。これは私がここで尋ねた質問から生まれました

基本的に、「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() を作成しようとしましたが、これらはより多くのエラーを引き起こしました。

私に何ができるのかよくわかりません。私は以前にクラス/関数を扱ったことがありますが、クラスをネストしたことはなかったので、少し迷っています。オンラインで多くのスレッドを見てきましたが、すべての答えが完全に当てはまるわけではありません。または、見つけた解決策を試しましたが、うまくいきませんでした。

4

1 に答える 1

2

次のように、それらをエフェクトのインスタンスに追加する必要があります(エディターにコピーして、ここでLOOKを検索してください)。

class myPlugin : public AudioEffectX {

public:
    myPlugin (audioMasterCallback audioMaster);
    ~myPlugin ();

// 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;
        }
    };
    /* LOOK HERE */
private:
    aFilterL filterL;
    aFilterR filterR;
};


myPlugin::myPlugin (audioMasterCallback audioMaster) : AudioEffectX (audioMaster, 1, 1), filterL(), /* LOOK HERE */ filterR() /* LOOK HERE */ {

    setNumInputs (2); // stereo in
    setNumOutputs (2); // stereo out
    setUniqueID ('Gain'); // identify
    canProcessReplacing (); // supports replacing output
    canDoubleReplacing (); // supports double precision processing

    /* LOOK HERE */
    //myPlugin *my_aFilter1L = new aFilterL();
    //myPlugin *my_aFilter1R = new aFilterR();
}

ネストされたクラスは単なる宣言です(名前空間のようなものですが、可視性に関していくつかの追加オプションがあります)。このスコープでクラスを宣言しても、エフェクトにフィルターが自動的に追加されるわけではありません。クラスの静的変数またはインスタンス変数とまったく同じように宣言する必要があります。

于 2011-02-03T11:01:33.630 に答える