1

我有一个简单的课程

#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)

(for) 不起作用,因为我需要在每个对象中同时输出值...

在类内部应该有一种方法来拥有一个全局函数,该函数将在一个函数调用中返回每个创建的对象的输出总和......

我是 oop 的初学者,所以如果解决方案看起来很明显,请原谅我。如果你能指出一个有用的方向,请提前感谢。

编辑:

我有一个以采样率(44100hz)调用的回调。

我有一个语音对象向量(它们输出简单的合成器波形)来形成一个发声和弦,我需要“同时”对每个语音的输出求和。

然后,我以采样率频率将每个样本的总和馈送到我的声卡。

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

希望这能澄清一点......

是的,我忘记了 += 所以我测试了它,它停止了我的程序形式输出声音。当我用我丑陋的方法做它时,它虽然可以工作......

4

2 回答 2

3

您可以执行一个简单的循环,因为没有理由相信 for 不起作用,给定您的代码示例:

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

另一种选择是使用std::accumulate和合适的仿函数:

// 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);
于 2012-09-05T20:40:30.837 回答
2

一个例子:

int sum = 0;
for(std::vector<voice>::iterator i = voices.begin(); i != voices.end(); i++)
    sum += i->getOutput();
于 2012-09-05T20:43:58.647 回答