Вопрос для начинающих: как мне получить доступ к этой переменной? - PullRequest
0 голосов
/ 29 сентября 2018

Я изучаю C ++ и JUCE, следуя инструкциям.Но я все еще застрял на чем-то простом, что я делаю.Ниже приведен просто код синусоидальной волны, которая генерируется на основе данных MIDI (простой синусоидальный синтезатор).

В одной точке кода громкость синусоидальной волны устанавливается путем умножения на константу (в настоящее время 0,15).Я хотел бы умножить на значение ползунка уровня (aka. CurrentLevel или targetLevel или "level.slider.getValue ()")

Однако я не могу понять, как это сделать.Как мне обратиться к "level.slider.getValue ()", который приходит из MainComponentClass, а внутри "struct SineWaveVoice"?

Возможно ли это?

Спасибо

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

1 Ответ

0 голосов
/ 29 сентября 2018

Невозможно использовать переменную класса внутри структуры (если структура не определена внутри класса).

В качестве альтернативы вы можете отправить 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.

...