初学者问题:如何访问此变量? 我通过以下教程学习C++和JUCE。但我仍然停留在我正在做的一些简单的事情上。下面是基于MIDI数据simple sine synth生成正弦波的简单代码
在代码中的某一点,正弦波的体积通过乘以当前为0.15的常数来设置。我想乘以水平滑块的值。currentLevel或targetLevel或level.slider.getValue 然而,我不知道该怎么做。在struct SineWaveVoice中,如何引用来自MainComponentClass的level.slider.getValue 这可能吗 谢谢初学者问题:如何访问此变量? 我通过以下教程学习C++和JUCE。但我仍然停留在我正在做的一些简单的事情上。下面是基于MIDI数据simple sine synth生成正弦波的简单代码,c++,class,pointers,scope,juce,C++,Class,Pointers,Scope,Juce,在代码中的某一点,正弦波的体积通过乘以当前为0.15的常数来设置。我想乘以水平滑块的值。currentLevel或targetLevel或level.slider.getValue 然而,我不知道该怎么做。在struct SineWaveVoice中,如何引用来自MainComponentClass的level.slider.getValue 这可能吗 谢谢 class LabeledSlider : public GroupComponent { public
class LabeledSlider : public GroupComponent
{
public:
LabeledSlider (const String& name)
{
setText (name);
setTextLabelPosition (Justification::centredTop);
addAndMakeVisible (slider);
}
void resized() override
{
slider.setBounds (getLocalBounds().reduced (10));
}
Slider slider
{
Slider::RotaryHorizontalVerticalDrag, Slider::TextBoxBelow
};
};
//==============================================================================
//SINE WAVE PROGRAM
//==============================================================================
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; ///************** HERE IS WHERE I WANT TO MULTIPLY BY LEVEL SLIDER *******************************
tailOff = 0.0;
auto cyclesPerSecond = MidiMessage::getMidiNoteInHertz(midiNoteNumber);
auto cyclesPerSample = cyclesPerSecond / getSampleRate();
angleDelta = cyclesPerSample * 2.0 * MathConstants<double>::pi;
}
//==============================================================================
//MAINCONTENTCOMPONENT
//==============================================================================
class MainContentComponent : public AudioAppComponent,
private Timer
{
public:
MainContentComponent()
: synthAudioSource(keyboardState),
keyboardComponent(keyboardState, MidiKeyboardComponent::horizontalKeyboard)
{
LabeledSlider *control = new LabeledSlider("Frequency");
control->slider.onValueChange = [this] { targetFrequency = frequency.slider.getValue(); };
control->slider.setTextBoxStyle(Slider::TextBoxBelow, false, 100, 20);
addAndMakeVisible(knobs.add(control));
control = new LabeledSlider("Level"); //// HERE IS THE LEVEL SLIDER
control->slider.setRange(0.0, 1.0);
control->slider.onValueChange = [this] { targetLevel = (float)level.slider.getValue(); };
addAndMakeVisible(knobs.add(control));
}
private:
double currentSampleRate = 0.0, currentAngle = 0.0, angleDelta = 0.0;
double currentFrequency = 500.0, targetFrequency = 500.0;
float currentLevel = 0.1f, targetLevel = 0.1f;
int rotaryDiam = 100;
LabeledSlider frequency{ "Frequency" };
LabeledSlider level{ "Level" }; //// HERE IS THE LEVEL SLIDER AGAIN
OwnedArray<LabeledSlider> knobs;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainContentComponent)
};
除非在类内部定义了结构,否则不可能在结构内部使用类的变量 或者,您可以将level.slider.getValue作为函数中的另一个参数发送到调用函数startNote的任何位置,即
void startNote(int midiNoteNumber, float velocity,
SynthesiserSound*, int levelSlider, int /*currentPitchWheelPosition*/) override
{
currentAngle = 0.0;
level = velocity * levelSlider; //Mutliply by the parameter levelSlider
tailOff = 0.0;
auto cyclesPerSecond = MidiMessage::getMidiNoteInHertz(midiNoteNumber);
auto cyclesPerSample = cyclesPerSecond / getSampleRate();
angleDelta = cyclesPerSample * 2.0 * MathConstants<double>::pi;
}
LevelSlider应该具有MainContentComponent类对象的值。去掉不相关的代码。好的,我删除了我认为可以删除的所有内容。我要处理的点仍然有标签。想法?原则上,这就是我想做的,但它不起作用。我尝试在MainContentComponent的public下添加一行:float-levelSlider=level.slider.getValue;。然后我想我可以通过使用:level=velocity*MainContentComponenet::levelSlider在struct SineWaveVoice中访问它。但这仍然不起作用。所以我仍然不明白如何把数据放到我想要的地方。你不能这样做。如果不创建类的实例,则不能在另一个结构中使用类的变量。要么在结构中创建类的MainContentClass实例,然后在startNote函数中使用它,要么创建类和结构的实例,然后使用上述函数声明。