我正在尝试从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的方法时,将使用继承的成员。

10-08 04:15