我正在尝试从Juce学习C++并构建音频合成器。
我有一个合成器,可以简短地从振荡器类(MaxiOsc
)输出音频:
class SynthVoice : public SynthesiserVoice
{
private:
MaxiOsc testOsc;
double frequency = 0; // frequency is then changed by another function by new notes from the keyboard of course ...
public:
double oscOutput()
{
return testOsc.sinewave(frequency);
}
void renderNextBlock (AudioBuffer <float> &outputBuffer, int startSample, int numSamples) override
{
for (int sample = 0; sample < numSamples; ++sample)
{
for (int channel = 0; channel < outputBuffer.getNumChannels(); ++channel)
{
outputBuffer.addSample(channel, startSample, oscOutput() //MAIN OUTPUT HERE
}
++startSample;
}
}
我正在尝试创建一个名为
ModalUnit
的新类,该类继承自MaxiOsc
并在其中创建一个MaxiOsc
对象。这个想法是在上面的合成器代码中使用ModalUnit
代替MaxiOsc
,并最终向ModalUnit
类代码添加额外的处理。这是
ModalUnit
类的内容:class ModalUnit : public MaxiOsc
{
public:
ModalUnit()
{
}
double getOutput(double frequency)
{
output = testOsc.sinewave(frequency);
return output;
}
private:
MaxiOsc testOsc;
double output = 0.0;
};
但是,当我尝试在合成器代码中实现此功能时,它不会输出任何音频:
class SynthVoice : public SynthesiserVoice
{
private:
ModalUnit testModalUnit;
double frequency = 0; // frequency is then changed by another function by new notes from the keyboard of course ...
public:
double modalUnitOutput()
{
return testModalUnit.getOutput(frequency);
}
void renderNextBlock (AudioBuffer <float> &outputBuffer, int startSample, int numSamples) override
{
for (int sample = 0; sample < numSamples; ++sample)
{
for (int channel = 0; channel < outputBuffer.getNumChannels(); ++channel)
{
outputBuffer.addSample(channel, startSample, modalUnitOutput() //MAIN OUTPUT HERE
}
++startSample;
}
}
在这个新类(class)的创作中我做错了什么?我基本上只希望
ModalUnit
类在其中创建MaxiOsc
,然后从该输出开始。我该怎么做或解决此问题?谢谢。
最佳答案
我相信发生的事情是您既继承又拥有class MaxiOSc
的成员。继承类时,父级的所有成员现在都是子级的成员。通过包含父类的对象,可以复制这些成员。
在double getOutput(double frequency)
的ModalUnit
函数中,您使用MaxiOsc
类型的成员对象输出。同时,当调用从MaxiOsc
继承到ModalUnit
的方法时,将使用继承的成员。