【问题标题】:Beginner Question: How do I access this variable?初学者问题:如何访问此变量?
【发布时间】:2019-03-05 08:36:23
【问题描述】:

我正在通过以下教程学习 C++ 和 JUCE。但我仍然坚持我正在做的一些简单的事情。以下是根据 MIDI 数据生成正弦波的简单代码(简单正弦合成器)。

在代码中的某一点,正弦波的音量是通过乘以一个常数(当前为 0.15)来设置的。我想乘以水平滑块的值(又名 currentLevel 或 targetLevel 或“level.slider.getValue()”)

但是,我不知道该怎么做。如何在“struct SineWaveVoice”中引用来自 MainComponentClass 的“level.slider.getValue()”?

这可能吗?

谢谢

    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)
    };

【问题讨论】:

  • 去掉不相关的代码。
  • 好的,我删除了我认为可以的所有内容。我要处理的点仍然被标记。想法?

标签: c++ class pointers scope juce


【解决方案1】:

不能在结构中使用类的变量(除非结构在类中定义)。

或者,您可以做的是将 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 中访问它。但这仍然行不通。所以我仍然不明白如何将这些数据放到我想要的地方。
  • 你不能这样做。你不能在另一个结构中使用一个类的变量而不创建它的实例。要么在结构中创建 class'(MainContentClass) 实例,然后在 startNote 函数中使用它,要么创建(类和结构)的实例并使用上述函数声明。
猜你喜欢
  • 2014-05-11
  • 2011-08-30
  • 2021-04-26
  • 2021-01-28
  • 2016-10-13
  • 1970-01-01
  • 2020-01-04
  • 2020-11-23
  • 2015-03-16
相关资源
最近更新 更多