我有一个简单的课程
#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];
}
}
希望这能澄清一点......
是的,我忘记了 += 所以我测试了它,它停止了我的程序形式输出声音。当我用我丑陋的方法做它时,它虽然可以工作......