Я очень новичок в 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)
}
Это простой вопрос? Как можно это сделать? Спасибо.