Stockage des valeurs dans un tampon, dans la méthode de la fonction de classe

Je suis en train de programmer un plugin VST DSP en c ++.

Je crée une série de filtres passe-bande dans une “banque de filtres”. J’ai implémenté une classe de filtre dans mon en-tête (y compris la fonction) et construit correctement le constructeur / destructeur dans .cpp.

Je peux transmettre des valeurs à la méthode et les renvoyer également. Cependant, le stockage des données dans les tampons de la fonction pose problème. Il semble que chaque fois que la méthode de fonction est appelée, les valeurs stockées dans la mémoire tampon sont réinitialisées (ou bien ne sont pas stockées correctement en premier lieu). Par conséquent, ce qui est renvoyé n’est pas “complet”.

Tout conseil grandement apprécié!

nb Cet article a été mis à jour avec le nouveau code:

Voici les cours:

class aFilterL 

{

classe ami 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; 

float virtuel 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; 

}

};

classe aFilterR {

classe ami 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; 

float virtuel 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; 

}};

Ceci est ensuite construit / détruit dans le cpp comme suit:

 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; 

}

Enfin, il est implémenté dans la fonction processReplacing en tant que:

void myPlugin :: processReplacing (float ** input, float ** output, 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) {

// entrée de filtre

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];

// Filtre en gestion

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;

// envoyer à la fonction pour le traitement

returnL = my_aFilter1L-> aFilterMethodL (0.000171f, 0.0f, -0.000171f, -1.999911f, 0.999943f, * in1, In_1_l, In_2_l);

returnR = my_aFilter1R-> aFilterMethodR (0.000171f, 0.0f, -0.000171f, -1.999911f, 0.999943f, * in2, In_1_r, In_2_r);

// Envoyer la sortie du filtre vers la sortie

* out1 = retournéL;

* out2 = retournéR;

* in1 ++;

* in2 ++;

* out1 ++;

* out2 ++; }}

Etes-vous conscient du fait que return quitte la fonction immédiatement? Ainsi, le code après celui qui stocke les valeurs dans vos tampons n’est jamais exécuté.

Au lieu de cela, vous devriez placer l’appel de retour à la fin de la fonction.

Quelques autres notes:

  • Je ne comprends pas pourquoi vous avez besoin d’indicateurs de tampons si vous utilisez uniquement le premier élément.
  • Vous avez un code en double dans les fonctions -L et -R. Au lieu de cela, utilisez deux instances d’une classe ‘mono’, de sorte que vous ne stockez des données que pour un seul canal par classe.
  • Vous (presque) jamais besoin d’utiliser this-> . Il suffit de laisser tomber.

Après avoir créé ma nouvelle question sur les classes nestedes trouvées ici, la solution a été trouvée.

Les classes de filtre sont déclarées dans la classe myPlugin.

De là, les constructeurs et les destructeurs sont construits comme:

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

dans le constructeur myPlugin, les nouvelles instances sont créées:

 aFilterL *my_aFilter1L = new aFilterL(); 

La dernière pièce du puzzle consiste alors à s’assurer qu’ils sont ajoutés en tant qu’instance à l’effet myPlugin:

 aFilterL my_aFilter1L; aFilterR my_aFilter1R; 

my_aFilter1L, etc. est maintenant accessible via processReplacing et semble fonctionner correctement.

Un grand merci à tous pour toute votre aide dans cette affaire.