我正在尝试从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;
}
}
在创建新类时,我做错了什么?我基本上只希望ModalUnit
类在其中创建MaxiOsc
,然后从该类开始输出。
我该怎么做或解决此问题?谢谢。
答案 0 :(得分:0)
我相信正在发生的事情是您既在继承又拥有class MaxiOSc
的成员。继承类时,父级的所有成员现在都是子级的成员。通过包含父类的对象,可以复制这些成员。
在double getOutput(double frequency)
的{{1}}函数中,您使用类型ModalUnit
的成员对象进行输出。同时,当调用从MaxiOsc
继承到MaxiOsc
的方法时,将使用继承的成员。
答案 1 :(得分:0)
唯一的区别是函数getOutput的参数。它通过值传递
double getOutput(double frequency)
{
output = testOsc.sinewave(frequency);
return output;
}
因此调用getOutput函数时成员 frequency 会发生变化。成员 frequency 是否在其他地方使用?您可以在调试时检查该值。
答案 2 :(得分:0)
也许尝试从ModelUnit中删除注入的MaxiOsc,然后继续继承即可。在ModelUnit中,重写要在其中进行额外处理的MaxiOsc中的函数,然后从您的函数版本内部调用基类的实现。