Я программирую плагин VST DSP на c ++.
Я создаю серию полосовых фильтров в наборе фильтров.Я реализовал класс фильтра в своем заголовке (включая функцию) и правильно построил конструктор / деструктор в .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;
виртуальный поплавок aFilterMethodL (поплавок a0, поплавок a1, поплавок a2, поплавок b1, поплавок b2, ввод с плавающей точкой, float prevInput1L, поплавок 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 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;
виртуальный поплавок aFilterMethodR (поплавок a0, поплавок a1, поплавок a2, поплавок b1, поплавок b2, float inputR, поплавок 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 (плавающие ** входы, плавающие ** выходы, 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;
// отправить в функцию для обработки
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);
// Отправить выходные данные фильтрана
* out1 = returnL;
* out2 = returnR;
* in1 ++;
* in2 ++;
* out1 ++;
* out2 ++;}}