问题描述
嗨,我正在Juce框架中编写合成器。
当我的adsr运行时,我需要覆盖isVoiceActive()并将其从声音内部设置为true。这是SynthesiserVoice类的公共成员函数。
virtual bool SynthesiserVoice::isVoiceActive ( ) const
如果此声音当前正在忙于播放声音,则返回true。
默认情况下,这仅检查getCurrentlyPlayingNote()值,但是 可以覆盖以进行更高级的检查。
所以在声音中,我还有另一个成员函数virtual void renderNextBlock()
,我想从内部重写isVoiceActive
class SynthVoice : public SynthesiserVoice
{
public:
void renderNextBlock (AudioBuffer <float> &outputBuffer,int startSample,int numSamples) override
{
for (int sample = startSample; sample < (startSample + numSamples); ++sample)
{
float env_value = adsr.getNextSample();
if(env_value > 0)
isVoiceActive = true; //???????
...
解决方法
您不能执行此操作,因为isVoiceActive不是属性,而是函数,可以将isVoiceActive用作数据成员而不是函数成员,因此可以将其分配为true或false。或者如果要使用函数,则必须添加“&”,以便可以为该函数分配一个值(如果不使用“&”,则您将无法做您想做的事情。 您有2个选择:
1 /将isVoiceActivat用作数据成员,您可以这样:
class SynthesiserVoice
{
public:
bool isVoiceActive;
};
class SynthVoice :public SynthesiserVoice
{
public:
oid renderNextBlock (AudioBuffer <float> &outputBuffer,int startSample,int numSamples) override
{
for (int sample = startSample; sample < (startSample + numSamples); ++sample)
{
float env_value = adsr.getNextSample();
if(env_value > 0)
isVoiceActive = true;
}
}
};
2 /执行以下操作:
class SynthesiserVoice
{
public:
bool i = false;
virtual bool& isVoiceActive() { return i; } // or virtual bool& isVoiceActive()=0;
};
class SynthVoice :public SynthesiserVoice
{
public:
bool& isVoiceActive()override { return i; }
void renderNextBlock (AudioBuffer <float> &outputBuffer,int numSamples) override
{
for (int sample = startSample; sample < (startSample + numSamples); ++sample)
{
float env_value = adsr.getNextSample();
if(env_value > 0)
isVoiceActive ()= true;
}
}
};
现在您必须实现此功能以适合您的功能和数据。
希望它清楚且有用