我是C ++ / JUCE的新手。我一直在努力运行一个基本的合成器,并只是测试了一些东西以学习绳索。
它已经可以正常工作了。但是我仍然只是学习有关C ++ / JUCE的方法,以及如何声明或访问类/对象/变量。
我正在尝试对自己坚持的东西进行修改。
我有以下内容(仅摘录进行演示)…
在此处设置合成器级别:
struct SineWaveVoice : public SynthesiserVoice
{
SineWaveVoice() {}
bool canPlaySound (SynthesiserSound* sound) override
{
return dynamic_cast<SineWaveSound*> (sound) != nullptr;
}
void startNote (int midiNoteNumber, float velocity,
SynthesiserSound*, int /*currentPitchWheelPosition*/) override
{
currentAngle = 0.0;
level = velocity * 0.15;
tailOff = 0.0;
即。级别由速度* 0.15设置。
在测试设置中,我已经在MainContentComponent下定义了一个电平旋钮,如下所示:
class MainContentComponent : public AudioAppComponent,
private Timer
{
public:
MainContentComponent()
: synthAudioSource(keyboardState),
keyboardComponent(keyboardState, MidiKeyboardComponent::horizontalKeyboard)
{
LabeledSlider* control = new LabeledSlider("Frequency");
control->slider.setRange(20.0, 20000.0);
control->slider.setSkewFactorFromMidPoint(500.0);
control->slider.setNumDecimalPlacesToDisplay(1);
control->slider.setValue(currentFrequency, dontSendNotification);
control->slider.onValueChange = [this] { targetFrequency = frequency.slider.getValue(); };
control->slider.setTextBoxStyle(Slider::TextBoxBelow, false, 100, 20);
control->slider.setRange(50.0, 5000.0);
control->slider.setSkewFactorFromMidPoint(500.0);
control->slider.setNumDecimalPlacesToDisplay(1);
addAndMakeVisible(knobs.add(control));
control = new LabeledSlider("Level");
control->slider.setRange(0.0, 1.0);
control->slider.onValueChange = [this] { targetLevel = (float)level.slider.getValue(); };
addAndMakeVisible(knobs.add(control));
....
private:
{
float currentLevel = 0.1f, targetLevel = 0.1f;
LabeledSlider level{ "Level" };
因此,假设我要使用此级别滑块变量“ targetLevel”乘以上面“结构”中的速度,而不是0.15。
我需要在那里输入什么才能访问和使用“ targetLevel”?我尝试了多种方法,但我不太清楚。
谢谢
答案 0 :(得分:0)
我假设您的SineWaveVoice位于SynthAudioSource类之内,并且声音是Synthesizer对象的一部分。要从MainContentComponent访问SineWaveVoice结构中的任何内容,您都需要通过SynthAudioSource以某种方式公开此内容。因此,我的建议是,在您的SynthAudioSource中添加如下所示的方法:
void setLevel(double lvl)
{
for (auto i=0; i<synth.getNumVoices(); i++)
{
SineWaveVoice *v = dynamic_cast<SineWaveVoice *>(synth.getVoice(i));
v->level = lvl * v->velocity;
}
}
然后在MainContentComponent中访问它,只需执行以下操作:
control->slider.onValueChange = [this] {
targetLevel = (float)level.slider.getValue();
synthAudioSource.setLevel(targetLevel);
};
但是,请注意,每次获得新的startNote事件时,该值都将被覆盖。因此,您可能应该在SineWaveVoice中存储目标级别的副本,然后将其乘以而不是0.15。