Простой вопрос - как получить доступ к переменной из «класса» внутри отдельной «структуры»? - PullRequest
0 голосов
/ 04 сентября 2018

Я новичок в 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» для умножения на скорость в «struct» выше вместо 0,15.

Что мне нужно набрать там, чтобы иметь доступ и использовать «targetLevel»? Я пробовал несколько вещей, но не могу понять это.

Спасибо

1 Ответ

0 голосов
/ 12 октября 2018

Я предполагаю, что ваш SineWaveVoice находится в вашем классе SynthAudioSource и что голос является частью объекта Synthesizer. Чтобы получить доступ к чему-либо в вашей структуре SineWaveVoice из MainContentComponent, вам нужно как-то это представить через 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.

...