- PVSM.RU - https://www.pvsm.ru -
Все посты серии:
Часть 1. Введение и настройка [1]
Часть 2. Изучение кода [2]
Часть 3. VST и AU [3]
Часть 4. Цифровой дисторшн [4]
Часть 5. Пресеты и GUI [5]
Часть 6. Синтез сигналов [6]
Часть 7. Получение MIDI сообщений [7]
Часть 8. Виртуальная клавиатура [8]
Часть 9. Огибающие [9]
Часть 10. Доработка GUI [10]
Часть 11. Фильтр [11]
Часть 12. Низкочастотный осциллятор [12]
Низкочастотный осциллятор (Low Frequency Oscillator, LFO) — это важная составляющая любого классического синтезатора, и мы добавим ее в свой плагин. Как понятно из названия, это просто осциллятор. Мы используем написанный нами ранее класс Oscillator
и зададим ему низкую частоту.
Начнем с Synthesis.h. Добавьте в private
:
Oscillator mLFO;
double lfoFilterModAmount;
lfoFilterModAmount
обозначает, как сильно LFO будет влиять на фильтр. Этот параметр надо инициализировать в конструкторе в Synthesis.cpp:
lfoFilterModAmount(0.1)
Почему именно 0.1
? Тут мы просто хотим показать принципиальную легкость создания LFO. Мы добавим отдельные ручки управления этому осциллятору позже, на этапе редизайна. В конец конструктора допишите:
mLFO.setMode(OSCILLATOR_MODE_TRIANGLE);
mLFO.setFrequency(6.0);
mLFO.setMuted(false);
Тут просто выбирается треугольная волна, частота 6 Гц, и снимается флаг isMuted
. Если добавлять для LFO элементы управления в интерфейс, то первые две функции должны вызываться из OnParamChange
. А флаг isMuted
зависит от того, равно ли нулю значение параметра lfoFilterModAmount
.
Так как это осциллятор, мы должны сообщать ему об изменениях частоты семплирования в Synthesis::Reset
:
mLFO.setSampleRate(GetSampleRate());
Теперь давайте установим в ProcessDoubleReplacing
некоторые значения LFO. Замените цикл for
на следующий:
for (int i = 0; i < nFrames; ++i) {
mMIDIReceiver.advance();
int velocity = mMIDIReceiver.getLastVelocity();
double lfoFilterModulation = mLFO.nextSample() * lfoFilterModAmount;
mOscillator.setFrequency(mMIDIReceiver.getLastFrequency());
mFilter.setCutoffMod((mFilterEnvelopeGenerator.nextSample() * filterEnvelopeAmount) + lfoFilterModulation);
leftOutput[i] = rightOutput[i] = mFilter.process(mOscillator.nextSample() * mEnvelopeGenerator.nextSample() * velocity / 127.0);
}
Значение lfoFilterModulation
меняется от -1
до +1
. Для аргумента функции setCutoffMod
мы складываем контролируемую огибающей частоту среза и величину lfoFilterModulation
, то есть срез теперь изменяется под воздействием двух параметров.
Вот, собственно, и все! Протестируйте — звук должен быть слегка пульсирующим, это особенно заметно, если выбрать форму волны, отличную от синуса.
Код проекта на данной стадии можно скачать отсюда [13].
В следующий раз займемся редизайном, чтобы плагин выглядел приятнее:
Оригинал статьи:
martin-finke.de/blog/articles/audio-plugins-014-lfo/ [14]
Автор: 1eqinfinity
Источник [12]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/c-3/63534
Ссылки в тексте:
[1] Часть 1. Введение и настройка: http://habrahabr.ru/post/224911/
[2] Часть 2. Изучение кода: http://habrahabr.ru/post/225019/
[3] Часть 3. VST и AU: http://habrahabr.ru/post/225457/
[4] Часть 4. Цифровой дисторшн: http://habrahabr.ru/post/225751/
[5] Часть 5. Пресеты и GUI: http://habrahabr.ru/post/225755/
[6] Часть 6. Синтез сигналов: http://habrahabr.ru/post/226439/
[7] Часть 7. Получение MIDI сообщений: http://habrahabr.ru/post/226573/
[8] Часть 8. Виртуальная клавиатура: http://habrahabr.ru/post/226823/
[9] Часть 9. Огибающие: http://habrahabr.ru/post/227475/
[10] Часть 10. Доработка GUI: http://habrahabr.ru/post/227601/
[11] Часть 11. Фильтр: http://habrahabr.ru/post/227791/
[12] Часть 12. Низкочастотный осциллятор: http://habrahabr.ru/post/227827/
[13] отсюда: http://martin-finke.de/blog/articles/audio-plugins-014-lfo/source.zip
[14] martin-finke.de/blog/articles/audio-plugins-014-lfo/: http://martin-finke.de/blog/articles/audio-plugins-014-lfo/
Нажмите здесь для печати.