Как создать «буферную» задержку для изменений переменных? то есть. То есть изменение переменной «передается» только через определенное время? - PullRequest
0 голосов
/ 03 ноября 2018

Я очень новичок в C ++ и работаю в JUCE над некоторыми проектами по синтезированию звука, чтобы изучить их.

Я использую этот синусоидальный генератор для создания тональной синусоиды в JUCE просто так:

  double oscOutput()
    {
        return testOsc.sinewave(frequency);
    }

JUCE передает изменение частоты в эту синусоидальную волну при получении новой ноты MIDI следующим образом:

 void startNote (int midiNoteNumber, float velocity, SynthesiserSound* sound, int currentPitchWheelPosition) override
    {
        frequency = MidiMessage::getMidiNoteInHertz(midiNoteNumber);
    }

Я хотел бы реализовать некоторый код в новом классе / функции, который бы задерживал передачу с изменением частоты на определенное количество выборок / секунд. то есть.

  • frequency назначено изменение с помощью функции startNote выше.
  • Объект / функция задержки получает это новое значение frequency на startNote, а также
  • Объект / функция задержки вводит значение в буфер и удерживает его там до определенного времени (т. Е. Зацикливается currentSampleIndex++ один раз для каждой выборки до currentSampleIndex >= _____)
  • Как только эта точка достигнута, она может установить frequencyDelayed = frequency
  • Настройте генератор на использование этой переменной frequencyDelayed, и, таким образом, изменение частоты будет задерживаться на ____ # выборок

Или, например, это может выглядеть так:

  double oscOutput()
    {
        return testOsc.sinewave(delayedFrequencyOutput());
    }

  double delayedFrequencyOutput()
    {
        return frequencyDelay.getOutput();
    }

 void startNote (int midiNoteNumber, float velocity, SynthesiserSound* sound, int currentPitchWheelPosition) override
    {
        frequency = MidiMessage::getMidiNoteInHertz(midiNoteNumber);
        frequencyDelay.setDelay(frequency, 0.05); //ie. (input, delay time in seconds)
    }

Это простой вопрос? Как можно это сделать? Спасибо.

...