c ++ oop beginner — возвращать выходную сумму каждого созданного объекта в векторе за один вызов функции

У меня простой класс

#ifndef _VOICE
#define _VOICE
#include "maximilian.h"
class voice{
public:
voice(int waveType);
void setNote(double pitch,double amplitude);
void triggerNote();
void releaseNote();
double getOutput();
bool getState();
private:
maxiOsc op;
convert mtof;
double amp;
double freq;
double out;
int type;
bool state;
};

#endif // _VOICE

#include "voice.h"
voice::voice(int waveType){
type=waveType;
state=false;
out=0;
}

void voice::setNote(double pitch,double amplitude){
freq=pitch;
amp=amplitude;
}

void voice::triggerNote(){
if(type==1)
out=op.sinewave(mtof.mtof(freq))*amp;
if(type==2)
out=op.triangle(mtof.mtof(freq))*amp;
if(type==3)
out=op.saw(mtof.mtof(freq))*amp;
if(type==4)
out=op.square(mtof.mtof(freq))*amp;
state=true;
}

void voice::releaseNote(){
out=0;
state=false;
}

bool voice::getState(){
return state;
}

double voice::getOutput(){
return out;
}

Затем я храню эти голоса в векторе

Я хочу найти более эффективный способ доступа к выходной сумме всех объектов в векторе

это выглядит примерно так:

double PreMaster;
PreMaster=voices[0].getOutput()+voices[1].getOutput()+voices[2].getOutput()+voices[3].getOutput()....(n-object)...;

(в моей программе до 34)

(для) не работает, так как мне нужно вывести значение одновременно в каждом объекте …

внутри класса должен быть способ иметь глобальную функцию, которая будет возвращать выходную сумму каждого созданного объекта в рамках одного вызова функции …

Я новичок в работе, поэтому, пожалуйста, простите меня, если решение кажется очевидным.
И спасибо заранее, если вы можете указать мне полезное направление.

РЕДАКТИРОВАТЬ:

У меня есть обратный вызов, который вызывается с частотой дискретизации (44100 Гц).

У меня есть вектор голосового объекта (они выводят простые сигналы синтезатора)
чтобы сформировать звучащий аккорд, мне нужно суммировать выход каждого голоса «одновременно».

Затем я передаю сумму на мою звуковую карту каждый семпл с частотой дискретизации.

void testApp::audioOut (float * output, int bufferSize, int nChannels){

for (int i = 0; i < bufferSize; i++){

for(int j=0;j<voices.size();j++){
if(keys[j]==true){
voices[j].triggerNote();
}
else if(keys[j]==false)
voices[j].releaseNote();
}

PreMaster=voices[0].getOutput()+voices[1].getOutput()+voices[2].getOutput()+voices[3].getOutput()
+voices[4].getOutput()+voices[5].getOutput()+voices[6].getOutput()+voices[7].getOutput()
+voices[8].getOutput()+voices[9].getOutput()+voices[10].getOutput()+voices[11].getOutput()
+voices[12].getOutput()+voices[13].getOutput()+voices[14].getOutput()+voices[15].getOutput()
+voices[16].getOutput()+voices[17].getOutput()+voices[18].getOutput()+voices[19].getOutput()
+voices[20].getOutput()+voices[21].getOutput()+voices[22].getOutput()+voices[23].getOutput()
+voices[24].getOutput()+voices[25].getOutput()+voices[26].getOutput()+voices[27].getOutput()
+voices[28].getOutput()+voices[29].getOutput()+voices[30].getOutput()+voices[31].getOutput()
+voices[32].getOutput()+voices[33].getOutput();

MasterOut.stereo(PreMaster, outputs, 0.5);

lAudioOut[i] = output[i*nChannels    ] = outputs[0]; /* You may end up with lots of outputs. add them here */
rAudioOut[i] = output[i*nChannels + 1] = outputs[1];
}
}

надеюсь это прояснит немного …

Да, я забыл о + =, поэтому я проверил его, и он остановил мою форму программы, выводящую звуки. Когда я делаю это своим уродливым методом, он работает, хотя …

1

Решение

Вы можете выполнить простой цикл, поскольку нет причин полагать, что for не работает, учитывая ваш пример кода:

double sum = 0;
for (const auto& v : voices) {
sum += v.getOutput();
}

Другой вариант заключается в использовании станд :: аккумулируют и подходящий функтор:

// function to sum voice's getOutput() to get running total
double addOutput(double sum, const voice& v) { return sum + voice.getOutput(); }
....
double sum = std::accumulate(voices.begin(), voices.end(), 0.0, addOutput);
3

Другие решения

Пример:

int sum = 0;
for(std::vector<voice>::iterator i = voices.begin(); i != voices.end(); i++)
sum += i->getOutput();
2

По вопросам рекламы [email protected]