- PVSM.RU - https://www.pvsm.ru -

Создание аудиоплагинов, часть 12

Все посты серии:
Часть 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].

В следующий раз займемся редизайном, чтобы плагин выглядел приятнее:

Создание аудиоплагинов, часть 12

Оригинал статьи:
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/