vst plugin что это
Плагины, какие они бывают.
Мы привыкли к слову «плагин», но что же это такое и понимаем ли мы смысл? Давайте разбираться, что это и какие они бывают.
Что такое плагин?
Плагин (англ. plug-in, от plug in «подключать») — независимо компилируемый программный модуль, динамически подключаемый к основной программе и предназначенный для расширения и/или использования её возможностей. Плагины обычно выполняются в виде библиотек общего пользования.
Суть в том, что плагины расширяют или делают более удобным базовый функционал. Существуют плагины для движков сайтов, для программ, для игр. Но нас сейчас интересуют плагины, которые наиболее часто используют для видеомонтажа.
Какие виды плагинов бывают?
Существует много плагинов, но что касается плагинов для видеомонтажа, то в основном это: OFX, VFX, AVX, AE, VST. Бывают и другие, но встречаются крайне редко. Рассмотрим их более подробно:
Плагины звуковые
Особнячком стоят плагины для работы со звуком. Самый основной, с которым вам придется сталкиваться, это VST. Вообще со звуком работает множество плагинов, такие как VST/AU/AAX/RTAS/DXi, но с ними сталкиваются в основном «звукари», поэтому о них говорить не будем.
Плагин, с которым вы будите сталкиваться, это VST.
VST (англ. Virtual Studio Technology — технология виртуальной студии) — самый популярный формат плагинов, работающий в Windows, macOS и Linux. Формат изначально создавался для переноса аналоговых аудиоэффектов (компрессоров, эквалайзеров, ревербераторов) в цифровую среду. Сегодня под термином «VST — плагин» понимаются любые виртуальные инструменты и эффекты.
VST — плагины напрямую зависят от ресурсов компьютера. Плагины функционируют в режиме реального времени, производя обработку звука за счет ресурсов компьютера (в основном, процессора).
История
В 1996 году Steinberg представила формат VST. Это событие навсегда изменило музыкальную индустрию и методики создания музыки на PC. Теперь любой человек мог создать собственную аудио студию дома. Технология VST перенесла студийные аналоговые эффекты в цифровую среду — компьютер смог заменить огромный парк профессионального оборудования.
В 1999 году Steinberg произвела вторую революцию в музыкальном мире, опубликовав формат VST2. Новая версия позволила перенести в цифровую среду не только эффекты, но и музыкальные инструменты. Благодаря этому пользователи смогли использовать виртуальные версии реальных гитар, синтезаторов и барабанов как отдельные программы. Теперь компьютер мог заменить не только профессиональное оборудование, но и живых музыкантов.
Популярность VST привела к появлению ряда конкурирующих форматов. Так, Apple адаптировала VST под macOS, создав новый формат AU. Видя это, в дело включилась Digidesign, разрабатывавшая Pro Tools, — так появился конкурирующий формат RTAS. Билл Гейтс и Microsoft также не стали отставать и выпустили собственный формат DX, основанный на популярной технологии DirectX.
В конце 1990-х музыканты разделяли форматы, но сегодня термин «VST-плагины» стал именем нарицательным — этим термином в разговорной речи обозначают любые виртуальные инструменты и эффекты, вне зависимости от их настоящего формата. Проблема в том, что такое обобщение вызывает множество вопросов у начинающих.
Установка
Обычно плагины устанавливаются, как и обычная программа. Во время установки плагин сам определяет установленную у вас на компьютере программу и встраивается в неё. Или в процессе установки нужно будет отметить галочками программы, в которых плагин должен появиться.
Если написано, что плагин для какой-то определенной программы, то проблем нет. Просто устанавливаете его и он появится в программе. Однако бывает, что нужно плагин для старой версии, установить на новую версию программы, тогда нужно чуть доработать руками. Один из примеров показан тут, где показана установка плагина для Edius 7 на Edius 8 версии — Neat Video на Edius 8
Для примера, вот как ставиться Magic Bullet Suite в программу Edius — Magic Bullet Suite в Edius
О том, как устанавливать VST плагины, у нас есть отдельный материал — Установка VST плагинов. (Показана установка в программы Edius, Audition, Premiere.)
Выводы
OFX — для программ: Vegas, Lightworks, DaVinci и другие …
AE — для продуктов компании Adobe. Обычно это After Effects и Premiere Pro.
AVX — это плагины для продуктов Avid.
VST — плагины для работы со звуком, их могут использовать практически все программы для обработки звука и видео.
Теперь вы знаете, что все на самом деле просто и если откинуть все нюансы, то сокращение в названии плагина говорит вам с какой программой его можно использовать.
10 недорогих VST-плагинов для монтажа подкаста
Далеко не каждая рабочая станция полностью покрывает потребности монтажера в эффектах обработки. И даже если вам хватает стоковых модулей, вы всегда можете найти в интернете плагины, которые лучше встроятся в ваш рабочий процесс, или больше понравятся по звучанию. Я хочу поделиться некоторыми бесплатными или недорогими эффектами обработки, и попросил коллег по цеху также рассказать о некоторых любимых программах.
В этой статье я бы хотел ограничиться перечислением плагинов, без углубленного объяснения принципов работы эффектов. Если вам нужна помощь в установке плагинов — можете посмотреть эту статью.
Что такое VST?
VST — это аббревиатура к Virtual Studio Technology, то есть к универсальному формату плагинов для написания музыки и обработки звука. Это могут быть как синтезаторы и инструменты, так и эффекты обработки, которые сами не генерируют звук, а меняют звучание уже записанных голосов. Для использования плагинов понадобится DAW, или Digital Audio Workstation, это программа в которой вы монтируете записи.
Вы можете использовать один или несколько плагинов на конкретном голосе, или даже накинуть эффект на мастер-канал, чтобы обработать весь подкаст целиком. VST-плагины позволяют компенсировать недостающий функционал: если в вашей рабочей станции нет, например, де-эссера, вы можете найти и установить бесплатный сторонний плагин. Также все плагины отличаются по звучанию и пользовательскому интерфейсу, так что вы можете найти такой набор модулей, который идеально встроится именно в ваш рабочий процесс.
I. TDR Nova
TDR Nova — это динамический эквалайзер: он позволяет понизить или повысить громкость определенной полосы частот тогда, когда громкость этой полосы достигает нужного уровня. С помощью него я понижаю громкость сибилянтов или свиста, когда они проявляются, не затрагивая голос в остальные моменты.
Вот мой порядок действий для удаления свиста из голоса:
II. Waves Debreath
Я попробовал практически все существующие плагины для удаления вдохов, и все они либо плохо работали с речью на русском, либо не предлагали необходимой тонкости настройки. И только DeBreath от Waves при верном подборе параметров работает практически безукоризненно. Плагин платный, но на распродажах его можно купить за
$25. Это была моя лучшая покупка, которая уже сэкономила несколько десятков часов рабочего времени.
Настройка плагина заключается в следующих шагах:
Если в записи есть небольшой шум, с помощью кнопки Room Tone можно подмешать тихий тон комнаты, чтобы заполнить «дырку», образующуюся при удалении вдоха.
На некоторых рабочих станциях плагин вносит долгую задержку при воспроизведении: в это время он «заглядывает» наперед и определяет, является конкретно этот фрагмент записи вдохом или голосом.
Все эти тонкости кастомизации дают возможность точно настроить плагин для конкретного голоса, и делают Waves DeBreath лучшим в категории.
III. Youlean Loudness Meter
Яков Кушнир,
ведущий подкаста «Дьявол Носит Худи»
Скорее всего в вашей программе для монтажа есть встроенный анализатор громкости (LUFS), но он не очень наглядный. Для большего удобства можно скачать Youlean Loudness Meter 2. Благодаря графикам проще следить за перепадами громкости в динамике и более точно выравнивать звук. В плагине можно настроить целевые значения и так же наглядно контролировать соответствие реальных уровней тому, что должно получиться в результате. А встроенные пресеты позволят не копаться в интернете в поисках стандартов вещания для разных платформ. Выбираешь Apple Podcast и в бой. Для работы более чем достаточно бесплатной версии, PRO вариант не дает никаких жизненно необходимых функций. Тем не менее, спустя полгода работы с этим плагином я решил заплатить разработчикам просто за хороший удобный продукт и качественно проделанную работу.
Одна из частых проблем, которую я замечаю в подкастах — несоответствие требованиям стриминговых платформ по громкости. Часто финальный файл эпизода либо пережат лимитером настолько, что визуально больше напоминает кирпич, убивая всю динамику голоса и вытягивая все шумы, либо наоборот, голос очень тих.
Часто это связано с незнанием о том, что стандарты громкости вообще существуют, или же с неимением плагина для измерения громкости. Здесь на помощь придет Youlean Loudness Meter 2 — бесплатный анализатор громкости. Как правило, плагин располагается в самом конце мастер-канала, для того чтобы достоверно измерить громкость целого эпизода, уже после всей обработки.
Больше про стандарты громкости и LUFS можно прочитать здесь, или в этом видео.
Подробнее о плагине: документация
IV. Loudmax
V. T-De-Esser
T-De-Esser — это бесплатный плагин, который занимается уменьшением громкости чрезмерно шипящих и свистящих согласных. Помимо того, что он бесплатный, он еще и простой, и идеально подойдет для новичка.
Интерфейс плагина предоставляет доступ к следующим параметрам:
Сейчас на рынке очень мало бесплатных де-эссеров, и еще меньше тех из них, которые реально работают. T-De-Esser выделяется на фоне остальных, и станет хорошим дополнением для вашей коллекции плагинов.
Подробнее о плагине: документация
VI. Slate Digital Fresh Air
Fresh Air — это эксайтер, который безукоризненно работает с голосом. Он подмешивает шум в высоких и очень высоких частотах, которые обычно описывают как «воздух», «чистота» или «яркость» — это облагораживает голос, делая его приятным для прослушивания. Для меня самого стало сюрпризом то, насколько хорошо он работает даже при самых щадящих настройках.
Послушайте эти два примера и попробуйте сами определить, какой из них звучит более ярко. В этих записях применена довольно агрессивная обработка, чтобы можно было услышать разницу, но в финальном материале я немного понизил силу эффекта.
Пользовательский интерфейс минималистичен настолько, что даже новичок разберется без изучения мануала: анализатор громкости в центре, две большие ручки, отвечающие за «средний воздух» и «высокий воздух» — поняв, как они звучат, вы научитесь пользоваться плагином.
По моему опыту, нет необходимости обрабатывать записи подмешиванием шума более чем на 15-30 единиц: этот эффект должен быть незаметен, так что этим плагином я хочу просто немного компенсировать недостаток того самого воздуха, не заставляя голос шипеть и бить по ушам. Далеко не каждая запись нуждается в такой обработке, так что попробуйте плагин в работе и решите сами, нуждается ли конкретный голос в окрашивании.
VII. ADHD Leveling Tool
Я долго искал бесплатный компрессор, который можно было бы легко встроить в свой рабочий конвейер: большинство из доступных компрессоров всё-таки нуждались в тонкой настройке. Мне нужно было найти тот, который бы выдавал стабильно хороший результат из коробки. В поисках я неожиданно наткнулся на ADHD Leveling Tool, и теперь пользуюсь только им.
Помимо непосредственно компрессии, плагин эмулирует ламповую сатурацию, которую можно подмешать к голосу ручкой Drive. С изначальными настройками компрессор увеличивает громкость голоса, добавляя довольно агрессивный перегруз, который часто можно понизить до 0-10 процентов. Чуть более агрессивная сатурация хорошо работает с низким мужским голосом, если вы хотите сделать его еще более «радийным».
Интерфейс может немного запутать, потому что ручка Peak Reduction отвечает за порог срабатывания компрессора, и чем больше значение, тем ниже Threshold. При этом Gain применяется не до, а после компрессии, и, также как и Drive, связан с сатурацией: чем больше значение Gain, тем сильнее сатурация.
Сложность изучения интерфейса и принципов работы плагина компенсируется тем, что после освоения у вас в арсенале появится классный универсальный компрессор, который можно просто бросить на дорожку с голосом, зная, что он выдаст стабильно хороший результат.
Кирилл Баталкин,
ведущий подкаста « Эффект Наблюдателя »
Да компрессор как компрессор, просто не тупит и не окрашивает ничего.
VIII. Waves Vocal Rider
Бывают ситуации, когда диапазон громкости речи очень высок. Некоторые гости любят 10 раз за эпизод перейти с шепота на крик и обратно. Выравнивать каждый фрагмент аудио вручную никому не захочется, а выставлять порог срабатывания компрессора по самому тихому участку такого голоса тоже не очень правильно, потому что он будет слишком пережимать громкую речь. Для таких ситуаций и подойдет левелер: этот инструмент автоматизирует ручку громкости так, чтобы голос находился в определенном диапазоне.
Я пользовался демо-версией плагина, и он мне очень понравился. Также у Vocal Rider феноменально позитивные отзывы в интернете. По моему опыту левелер звучит «натуральнее» компрессора, и я использую их в связке: компрессирую голос с очень щадящими параметрами и затем дополнительно выравниваю его левелером. Порядок обработки можно менять, также левелером стоит попробовать выравнивать не один, а целую группу голосов — попробуйте сами и решите, что именно встроится в ваш рабочий процесс лучше.
Другой бесплатный левелер, которым я пользовался, TriLeveler, предоставляет доступ к бо́льшему набору параметров. Это позволяет точнее его настроить для ваших целей, пусть и ценой немного более сложного освоения.
IX. RX 8 Elements
Хоть это и не плагин, а Standalone программа, не включить RX в этот список было бы ошибкой. Izotope RX изначально предназначен для хардкорной реставрации проблемных записей, но с появлением нескольких «грейдов» в линейке — Elements, Standard и Advanced, стал доступен не только для больших студий пост-продакшена, но и для нас с вами.
RX может похвастаться одним из лучших в индустрии алгоритмом шумоподавления для голоса, отличным де-клиппером и де-кликером, модулем для удаления гула. Также вы можете воспользоваться Repair Assistant, который проанализирует файл и предложит несколько вариантов цепи эффектов для обработки.
Я не представляю, что бы я делал без RX, и пользуюсь им в каждом проекте для подготовки сырых файлов к монтажу.
X. BABY Operator Smooth
Казалось бы, в обработке аудио придумано уже всё, что можно придумать. Сегодня никого не удивишь удалением реверберации, изолированием инструментов в песне и искусственным интеллектом в эффектах. Тем не менее, за последние полтора года стала популярна технология, которая на мой взгляд переизобрела работу со спектром звука.
Все более популярными становятся динамические эквалайзеры с приставкой «спектральный»: одним из таких и является Smooth Operator. Механизм его работы даже мне не до конца понятен, но на практике эквалайзер анализирует спектр звука и самостоятельно убирает резонансы — такие повышения частот, которых в «натуральном» сигнале быть не должно. Это может быть специфический «коробочный» бубнеж комнаты или сибилянты в высоких частотах. Используя спектральный эквалайзер, мы лишь выбираем диапазон частот, избирательность эквалайзера и силу подавления, чтобы эквалайзер «целился» в тот диапазон частот, который мы считаем проблемным. Кажется, что спектральный эквалайзер — это волшебная таблетка, возможности применения которого практически безграничны.
По отзывам в интернете, Smooth Operator лучше всего помогает избавляться от именно низкочастотного «бубнения» в речи, вызванных записью голоса в акустически неподготовленном помещении.
Технология достаточно новая, такие эквалайзеры как Soothe 2, Gullfoss или DSEQ3 стоят очень дорого, да и за Smooth Operator придется отдать 69 долларов — это довольно большая сумма для начинающего монтажера. Тем не менее, я захотел рассказать о плагине. Посмотрите примеры использования на ютубе, воспользуйтесь бесплатной демо-версией и решите, стоит ли он таких денег. В любом случае, можно подписаться на рассылку разработчика и дождаться скидок.
Достойные упоминания
Рынок плагинов очень велик, и одной статьи точно не хватит, чтобы рассказать даже о десятой части классных программ. Я посоветую несколько ресурсов и для того, чтобы вы сами могли следить за новыми разработками. А мои коллеги и знакомые рассказали о своих любимых компаниях и производителях.
VST плагины, что это такое?
Стандарт VST-плагинов
И так, что же такое VST-плагины?
Virtual Studio Technology (виртуальная студийная технология, сокращенно VST) — стандарт плагинов звуковых эффектов и программных синтезаторов, введенный в 1996 г. фирмой Steinberg.
Работа с VST-инструментами (VSTi), осуществляется через так называемую программу-хост (англ. host), например секвенсер, в среде которого запускается плагин. К самым известным программам-хостам относятся такие программы как Ableton Live, Cubase, FL Studio, Reaper и Sonar.
VST-RTAS адаптеры
VST-плагины можно подключить и к совместимым с этим стандартом программам, используя специальные адаптеры. Например существуют VST-RTAS адаптеры, обеспечивающие подключение VST-плагинов в программу Pro Tools или VST-AU адаптеры, обеспечивающие подключение VST-плагинов в Logic Pro, которая работает под Mac OS X.
Инструменты VST имеют, как правило, собственный интерфейс, включающий разнообразные контроллеры подобны контроллерам аппаратных синтазаторов, которыми музыкант может управлять в реальном времени.
Политика Steinberg, направленная на выдачу бесплатных лицензий фирмам на использование технологии VST своих разработках стала причиной того, что этот стандарт стал основным на рынке музыкального программного обеспечения.
В 1999 была внедрена новая версия технологии, обозначаемая как VST 2.0.
Разновидности VST
При наличии соответствующего аппаратного обеспечения и драйверов, а именно звуковой карты поддерживает протокол ASIO, VST-плагины могут использоваться в реальном времени. ASIO обходит более медленные средства Windows, обеспечивая меньшую задержку.
Существует три 3 типа VST плагинов:
Программирование&Музыка: понимаем и пишем VSTi синтезатор на C# WPF. Часть 1
Занимаясь музыкальным творчеством, я часто делаю аранжировки и записи на компьютере — используя кучу всяких VST плагинов и инструментов. Стыдно признаться — я никогда не понимал, как «накручивают» звуки в синтезаторах. Программирование позволило мне написать свой синтезатор, «пропустить через себя» процесс создания звука.
Я планирую несколько статей, в которых будет пошагово рассказано, как написать свой VST плагин/инструмент: программирование осциллятора, частотного фильтра, различных эффектов и модуляции параметров. Упор будет сделан на практику, объяснение программисту простым языком, как же все это работает. Теорию (суровые выводы и доказательства) обойдем стороной (естественно, будут ссылки на статьи и книги).
Ниже представлен обзорный ролик моего простого синтезатора, полученных интересных звучаний.
Предстоит нелегкий путь, если вы готовы — добро пожаловать под кат.
Цикл статей
Оглавление
Загадочный мир синтеза звука
Я очень люблю музыку, слушаю разные стили, играю на различных инструментах, и, конечно, сочиняю и записываю аранжировки. Когда я начинал использовать эмуляторы синтезаторов в звукозаписывающих программах (да и сейчас) я всегда перебирал кучу пресетов, искал подходящее звучание.
Перебирая пресеты одного синтезатора можно встретить как «ожидаемый» звук электронного синтезатора из детства (музыка из мультика Летучий Корабль) так и имитацию ударных, звуков, шума, даже голоса! И все это делает один синтезатор, с одними и теми же ручками параметров. Это меня всегда удивляло, хотя я понимал: каждый звук — суть конкретная настройка всех ручек.
Недавно я решил наконец-таки разобраться, каким же образом создаётся (или, правильнее сказать, синтезируется) звук, как и почему нужно крутить ручки, как видоизменяется от эффектов сигнал (визуально и на слух). И конечно же, научиться (хотя бы понять основы) самому «накручивать» звук, копировать понравившиеся мне стили. Я решил последовать одной цитате:
«Скажи мне — и я забуду, покажи мне — и я запомню, дай мне сделать — и я пойму.»
Конфуций
Конечно, все подряд делать не надо (куда столько велосипедов?), но сейчас я хочу получить знания и самое главное — поделиться ими с вами.
Цель: не углубляясь в теорию, создать простой синтезатор, сделав упор на объяснение процессов с точки зрения программирования, на практике.
В синтезаторе будут:
Все составляющие я планирую рассмотреть в нескольких статьях. В данной будет рассмотрено программирование осциллятора.
Программировать будем на C#; UI можно писать либо на WPF, либо на Windows Forms, либо вообще обойтись без графической оболочки. Плюс выбора WPF — красивая графика, которую достаточно быстро кодить, минус — только на Windows. Владельцы других ОС — не расстраивайтесь, всё-таки цель — понять работу синтезатора (а не запилить красивый UI), тем более, код, который я буду демонстрировать, можно быстро перенести, скажем, на С++.
Программирование логики синтезатора начнется с главы Пишем простой осциллятор. Если вам не интересны технические стороны написания VST плагинов, вы просто хотите прочитать про, собственно, синтез (и ничего не кодить) — милости прошу сразу к этой главе.
Исходный код написанного мной синтезатора доступен на GitHub’е.
Звук в цифровом виде
По-сути, конечная наша цель — создание звука на компьютере. Обязательно прочитайте (хотя бы, бегло) статью на хабре «Теория звука» — в ней изложены базовые знания о представлении звука на компьютере, понятия и термины.
Любой звуковой файл в компьютере в несжатом формате представляет собой массив семплов. Любой плагин, в конечном счете, принимает и обрабатывает на входе массив семлов (в зависимости от точности это будут float или double числа, либо можно работать с целыми числами). Почему я сказал массив, а не одиночный семпл? Этим я хотел подчеркнуть что обрабатывается звук в целом: если вам нужно сделать эквализацию, вы не сможете оперировать одним лишь семплом без информации о других.
Хотя, конечно, есть задачи, которым не важно знать, что вы обрабатываете — они рассматривают конкретный семпл. Например, задача — поднять уровень громкости в 2 раза. Мы можем работать с каждым семплом по-отдельности, и нам не нужно знать про остальные.
VST SDK
VST (Virtual Studio Technology) — это технология, позволяющая писать плагины для программ обработки звука. Сейчас существует большое множество плагинов, решающих различные задачи: синтезаторы, эффекты, анализаторы звука, виртуальные инструменты и так далее.
Чтобы создавать VST плагины, компания Steinberg (некоторые ее знают по программе Cubase) выпустила VST SDK, написанный на C++. Помимо технологии (или, как еще говорят, «формата плагинов») VST, есть и другие — RTAS, AAX, тысячи их. Я выбрал VST, из-за большей известности, большого количества плагинов и инструментов (хотя, большинство известных плагинов поставляется в разных форматах).
На данный момент актуальная версия VST SDK 3.6.6, хотя многие продолжают использовать версию 2.4. Исторически складывается, что сложно найти DAW без поддержки версии 2.4, и не все поддерживают версию 3.0 и выше.
VST SDK можно скачать с официального сайта.
В дальнейшем мы будем работать с библиотекой VST.NET, которая является оберткой для VST 2.4.
Если вы намерены серьезно разрабатывать плагины, и хотите использовать последнюю версию SDK, то вы можете самостоятельно изучить документацию и примеры (все можно скачать с официального сайта).
Сейчас я кратко изложу принципы VST SDK 2.4, для общего понимания работы плагина и его взаимодействия с DAW.
Дальнейшие функции, перечисления и структуры вы можете найти в скачанном VST SDK в исходниках из папки «VST3 SDK\pluginterfaces\vst2.x».
Библиотека должна экспортировать функцию со следующей сигнатурой:
Функция принимает указатель на коллбэк, чтобы плагин мог получать необходимую ему информацию от хоста.
Все делается на достаточно «низком» уровне — чтобы хост понял, что от него хотят, нужно передавать номер команды через параметр opcode. Перечисление всех опкодов хардкорные C-кодеры могут найти в перечислении AudioMasterOpcodesX. Остальные параметры используются аналогичным образом.
VSTPluginMain должна вернуть указатель на структуру AEffect, которая, по-сути, и является нашим плагином: она содержит информацию о плагине и указатели на функции, которые будет вызывать хост.
Основные поля структуры AEffect:
Информация о плагине. Название, версия, число параметров, число программ и пресетов (читай далее), тип плагина и прочее.
Фунции для запроса и установки значений параметров.
Функции смены пресетов/программ.
Фунция обработки массива семплов
float** — это массив каналов, каждый канал содержит одинаковое количество семплов (количество семплов в массиве зависит от звукового драйвера и его настроек). В основном встречаются плагины, обрабатывающие моно и стерео.
Супер-функция, подобна audioMasterCallback.
Вызывается хостом, по параметру opcode определяется необходимое действие (список AEffectOpcodes). Используется, чтобы узнать дополнительную информацию о параметрах, сообщать плагину об изменениях в хосте (изменение частоты дискредитации), для взаимодействия с UI плагина.
При работе с плагином было бы очень удобно, чтобы юзер мог сохранить все настроенные ручки и переключатели. А еще круче, чтобы была их автоматизация! Например, вы можете захотеть сделать знаменитый эффект rise up — тогда вам нужно менять параметр cutoff (частота среза) эквалайзера во времени.
Чтобы хост управлял параметрами вашего плагина, в AEffect есть соответствующие функции: хост может запросить общее количество параметров, узнать или установить значение конкретного параметра, узнать название параметра, его описание, получить отображаемое значение.
Хосту все равно, какая логика у параметров в плагине. Задача хоста — сохранять, загружать, автоматизировать параметры. Хосту очень удобно воспринимать параметр, как float-число от 0 до 1 — а уж плагин пусть как хочет, так его и толкует (так и сделали большинство DAW, неофициально).
Пресеты (в терминах VST SDK — programs/программы) это коллекция конкретных значений всех параметров плагина. Хост может менять/переключать/выбирать номера пресетов, узнавать их названия, аналогично с параметрами. Банки — коллекция пресетов. Банки логически существуют только в DAW, в VST SDK есть только пресеты и программы.
Поняв идею структуры AEffect можно набросать и скомпилировать простой DLL-плагинчик.
А мы пойдем дальше, на уровень выше.
WDL-OL и JUCE
Чем плоха разработка на голом VST SDK?
На сцену выходит WDL-OL. Это C++ библиотека для создания кроссплатформенных плагинов. Поддерживаются форматы VST, VST3, Audiounit, RTAS, AAX. Удобство библиотеки состоит в том, что (при правильной настройке проекта) вы пишете один код, а при компилировании получаете свой плагин в разных форматах.
WDL-OL решает, по крайней мере, первые три пункта минусов разработки на VST SDK. Все, что вам нужно — корректно настроить проект (первая статья из блога), и отнаследоваться от класса IPlug.
Теперь с чистой совестью можно реализовать функцию ProcessDoubleReplacing, которая, по сути и является «ядром» плагина. Все заботы взял на себя класс IPlug. Если его изучать, можно быстро понять, что (в формате VST) он является оберткой структуры AEffect. Коллбэки от хоста и функции для хоста превратились в удобные виртуальные функции, с понятными названиями и адекватными списками параметров.
Помимо WDL-OL я так же узнал про библиотеку JUCE. JUCE похожа на WDL-OL, решает все заявленные минусы разработки на VST SDK. Помимо всего прочего, она уже имеет в своем составе и UI-редактор, и кучу классов для работы с аудио данными. Я лично ее не использовал, поэтому советую прочитать о ней, хотя бы, на вики.
Если вы хотите писать серьезный плагин, тут я бы уже всерьез задумался над использованием библиотек WDL-OL или JUCE. Всю рутину они сделают за вас, а у вас же остается вся мощь языка C++ для реализации эффективных алгоритмов и кроссплатформенность — что не маловажно в мире большого количества DAW.
Чем же мне не угодили WDL-OL и JUCE?
Страничка библиотеки — vstnet.codeplex.com, там есть исходники, бинарники, документация. Как я понял, библиотека находится в стадии почти доделал и забил заморозки (не реализованы некоторые редко используемые функции, пару лет нет изменений репозитория).
Библиотека состоит из трех ключевых сборок:
Работает все это следующим образом
При загрузке вашей либы необходимо, чтобы в ней был класс, реализующий интерфейс IVstPluginCommandStub:
VstPluginInfo содержит базовую о плагине — версия, уникальный ID плагина, число параметров и программ, число обрабатываемых каналов. PluginConfiguration нужна для вызывающей либы-обертки Jacobi.Vst.Interop.
В свою очередь, IVstPluginCommandStub реализует интерфейс IVstPluginCommands24, который содержит методы, вызываемые хостом: обработка массива (буфера) семплов, работа с параметрами, программами (пресетами), MIDI-сообщениями и так далее.
Jacobi.Vst.Framework содержит готовый удобный класс StdPluginCommandStub, реализующий IVstPluginCommandStub. Все что нужно сделать — отнаследоваться от StdPluginCommandStub и реализовать метод CreatePluginInstance(), который будет возвращать объект (instance) вашего класса-плагина, реализующего IVstPlugin.
Опять же, есть готовый удобный класс VstPluginWithInterfaceManagerBase:
Если смотреть исходный код библиотеки, можно увидеть интерфейсы, описывающие компоненты плагина, для работы с аудио, параметрами, MIDI и т.д. :
Класс VstPluginWithInterfaceManagerBase содержит виртуальные методы, возвращающие эти интерфейсы:
Эти методы и нужно перегружать, чтобы реализовывать свою логику в кастомных классах-компонентах. Например, вы хотите обрабатывать семплы, тогда вам нужно написать класс, реализующий IVstPluginAudioProcessor, и вернуть его в методе CreateAudioProcessor.
Используя различные готовые классы-компоненты можно сосредоточиться на программировании логики плагина. Хотя, вам никто не мешает реализовывать все самому, как хочется, основываясь только на интерфейсах из Jacobi.Vst.Core.
Для тех, кто уже кодит — предлагаю вам пример просто плагина, который понижает громкость на 6 дБ (для этого нужно умножить семпл на 0.5, почему — читай в статье про звук).
При программировании синта я столкнулся с некоторыми проблемами при использовании классов из Jacobi.Vst.Framework. Основная проблема заключалась в использовании параметров и их автоматизации.
Во первых, мне не понравилась реализация событий изменения значения; во вторых, обнаружились баги при тестировании плагина в FL Studio и Cubase. FL Studio воспринимает все параметры как float-числа от 0 до 1, даже не используя специальную функцию из VST SDK с опкодом effGetParameterProperties (функция вызывается у плагина чтобы получить дополнительную информацию о параметре). В WDL-OL реализация закомментирована с пометкой:
could implement effGetParameterProperties to group parameters, but can’t find a host that supports it
Хотя, конечно же, в Cubase эта функция вызывается (Cubase — продукт компании Steinberg, которая и выпустила VST SDK).
В начале я внес правки саму библиотеку, написал автору, чтобы он дал разрешение выложить исходники в репозиторий, либо сам создал репозиторий на GitHub’е. Но внятного ответа я так и не получил, поэтому решил сделать надстройку над либой — Syntage.Framework.dll.
Помимо этого, в надстройке реализованы удобные классы для работы с UI, если вы хотите использовать WPF.
Самое время скачать исходный код моего синтезатора и скомпилировать его.
Правила использования моей надстройки просты: вместо StdPluginCommandStub юзаем SyntagePluginCommandStub, а свой плагин наследуем от SyntagePlugin.
WPF UI
В VST плагине не обязательно должен быть графический интерфейс. Я видел много плагинов без UI (одни из них — mda). Большинство DAW (по крайней мере, Cubase и FL Studio) предоставят вам возможность управлять параметрами из сгенерированного ими UI.
Автосгенерированный UI для моего синтезатора в FL Studio
Чтобы ваш плагин был с UI, во-первых, у вас должен быть класс, реализующий IVstPluginEditor; во-вторых, нужно вернуть его инстанс в перегруженной функции CreateEditor вашего класса плагина (наследник SyntagePlugin).
В своем синтезаторе Syntage я написал пару контролов — слайдер, крутилка (knob), клавиатура пианино — если вы хотите, можете их скопировать и использовать.
UI-поток (thread)
Я тестировал синтезатор в FL Studio и Cubase 5 и уверен, что, в других DAW будет тоже самое: UI плагина обрабатывается отдельным потоком. А это значит, что логики аудио и UI обрабатывается в независимых потоках. Это влечет все проблемы, или, последствия такого подхода: доступ к данным из разных потоков, критические данные, доступ к UI из другого потока.
Для облегчения решения проблем я написал класс UIThread, который, по сути, является очередью команд. Если вы в какой-то момент хотите что-то сообщить/поменять/сделать в UI, а текущий код работает не в UI-потоке, то вы можете поставить на выполнение в очередь необходимую функцию:
Здесь в очередь команд помещается анонимный метод, обновляющий нужные данные. При вызове ProcessIdle все накопившиеся в очереди команды будут выполнены.
UIThread не решает всех проблем. При программировании осциллографа необходимо было обновлять UI по массиву семплов, который обрабатывался в другом потоке. Пришлось использовать мьютексы.
Обзор архитектуры синтезатора Syntage
При написании синтезатора активно использовалось ООП; предлагаю вам познакомиться с получившейся архитектурой и использовать мой код. Вы можете сделать все по-своему, но в этих статьях придется терпеть мое видение)
Класс PluginCommandStub нужен только чтобы создать и вернуть объект класса PluginController. PluginController предоставляет информацию о плагине, так же создает и владеет следующими компонентами:
Чтобы обрабатывать аудиоданные есть интерфейсы IAudioChannel и IAudioStream. IAudioChannel предоставляет прямой доступ к массиву/буферу семплов (double[] Samples). IAudioStream содержит массив каналов.
Представленные интерфейсы содержат удобные методы обработки всех семплов и каналов «скопом»: микширование каналов и потоков, применение метода к каждому семплу в отдельности и так далее.
Для интерфейсов IAudioChannel и IAudioStream написаны реализации AudioChannel и AudioStream. Здесь важно запомнить следующую вещь: нельзя хранить ссылки на AudioStream и AudioChannel, если они являются внешними данными в функции. Суть в том, что размеры буферов могут меняться по ходу работы плагина, буферы постоянно переиспользуются — не выгодно постоянно перевыделять и копировать память. Если вам необходимо сохранить буфер для дальнейшего использования (уж не знаю, зачем) — копируйте его в свой буфер.
IAudioStreamProvider является владельцем аудиопотоков, можно попросить создать поток функцией CreateAudioStream и вернуть поток для его удаления функцией ReleaseAudioStream.
В каждый момент времени длина (длина массива семплов) всех аудиопотоков и каналов одинакова, технически она определяется хостом. В коде ее можно получить либо у самого IAudioChannel или IAudioStream (свойство Length), так же у «хозяина» IAudioStreamProvider (свойство CurrentStreamLenght).
Класс AudioProcessor является «ядром» синтезатора — в нем-то и происходит синтез звука. Класс является наследником SyntageAudioProcessor, который, в свою очередь, реализует следующие интерфейсы:
Синтез звука проходит длинную цепочку обработки: создание простой волны в осцилляторах, микширование звука с разных осцилляторов, последовательная обработка в эффектах. Логика создания и обработки звука была разделена на классы-компоненты для AudioProcessor. Каждый компонент является наследником класса SyntageAudioProcessorComponentWithParameters — содержит ссылку на AudioProcessor и возможность создавать параметры.
В синтезаторе представлены следующие компоненты:
Все этапы создания звука вы можете найти в функции Routing.Process и на следующей схеме:
Звук одновременно создается на двух одинаковых осцилляторах (юзер может по-разному настроить их параметры). Для каждого осциллятора его звук проходит через огибающую. Два звука смешиваются в один, он проходит через фильтр частот, идет в эффект дисторшн, дилэй и клип. В мастере регулируется результирующая громкость звука. После мастера звук больше не модифицируется, но передается в осциллограф и блок LFO-модуляции (нужно для их внутренней логики).
Далее будет рассмотрено программирование логики класса Oscillator, а в следующих статьях будут рассмотрены другие классы-компоненты.
Настраиваем проект для создания плагина/инструмента
Предлагаю вам использовать следующий скрипт (его нужно прописать в Project → Properties → Build Events → Post-build event command line, выполнение скрипта поставьте на On successful build):
Отладка кода
Пишем простой осциллятор
Я надеюсь, что вы прочитали главу «Обзор архитектуры синтезатора Syntage» — я буду объяснять все в терминах своей архитектуры.
Самый простой звук — это чистый тон (синусоидальный сигнал, синус) определенной частоты. В природе вы вряд ли сможете услышать чистый тон. В жизни же можно услышать чистые тона в какой-нибудь электронике (и то, уверенности мало). Фурье сказал, что любой звук можно представить как одновременное звучание тонов разной частоты и громкости. Окраска звука характеризуется тембром — грубо говоря, описанием соотношения тонов в этом звуке (спектром).
Мы пойдем схожим путем — будем генерировать простой сигнал, а затем воздействовать на него и менять с помощью эффектов.
Какие выбрать «простые» сигналы? Очевидно, сигналы, спектр которых известен и хорошо изучен, которые легко обрабатывать. Возьмем четыре знаменитые типа сигналов:
Периоды четырех типов сигналов: синус, треугольник, импульс/квадрат, пила.
Чтобы синтезировать звуки, вы должны четко представлять себе исходное звучание этих простых сигналов.
Синус имеет глухое и тихое звучание, остальные же — «острое» и громкое. Это связано с тем, что, в отличие от синуса, другие сигналы содержат большое количество других тонов (гармоник) в спектре.
Наш генерируемый сигнал будет характеризоваться двумя параметрами: типом волны и частотой.
На графике изображены периоды нужных нам волн. Заметьте, что все волны представлены в интервале от 0 до 1. Это очень удобно, так как позволяет одинаково запрограммировать расчет значений. Такой подход позволяет задать произвольную форму сигнала, я даже видел синтезаторы, где можно вручную его нарисовать.
По представленным картинкам напишем вспомогательный класс WaveGenerator, с методом GetTableSample, который будет возвращать значение амплитуды сигнала в зависимости от типа волны и времени (время должно быть в пределах от 0 до 1).
Добавим так же в тип волны белый шум — он полезен в синтезе нестандартных звуков. Белый шум характеризуется тем, что спектральные составляющие равномерно распределены по всему диапазону частот. Функция NextDouble стандартного класса Random имеет равномерное распределение — таким образом, мы можем считать, что каждый сгенерированный семпл относится к некоторой гармонике. Соответственно, мы будем выбирать гармоники равномерно, получая белый шум. Нужно лишь сделать отображение результата функции из интервала [0,1] в интервал минимального и максимального значения амплитуды [-1,1].
Необходимо запросить у IAudioStreamProvider (для нас это будет родительский AudioProcessor) аудиопоток, и в каждом вызове функции Generate заполнять его сгенерированными семплами.
Пока что у нашего осциллятора будет два параметра:
Оформим все вышесказанное:
Осталось написать функцию GenerateToneToStream.
Каждый раз когда мы будем генерировать семплы сигнала, мы должны помнить о двух значениях:
Оба параметра могут меняться во время работы плагина, поэтому не советую каким-либо образом их кешировать. Каждый вызов функции Generate() на вход плагину подается буфер конечной длины (длина определяется хостом, по времени она достаточно короткая) — звук генерируется «порциями». Мы должны запоминать, сколько времени прошло с момента начала генерирования волны, чтобы звук был «непрерывным». Пока что звук будем генерировать с момента старта плагина. Синхронизировать звук с нажатием клавиши будем в следующей статье.
Семплы генерируются в цикле от 0 до [длина текущего буфера].
Частота дискретизации — число семплов в секунду. Время, которое проходит от начала одного семпла до другого равно timeDelta = 1/SampleRate. При частоте дискретизации 44100 Гц это очень маленькое время — 0.00002267573 секунды.
Теперь мы можем знать, сколько времени в секундах прошло с момента старта до текущего семпла — заведем переменную _time и будем прибавлять к ней timeDelta каждую итерацию цикла.
Чтобы воспользоваться функцией WaveGenerator.GetTableSample нужно знать относительное время от 0 до 1, где 1 — период волны. Зная нужную частоты волны, мы знаем и ее период — значение, обратное частоте.
Нужное относительное время мы можем получить как дробную часть деления прошедшего времени на период волны.
Пример: мы генерируем синус со знаменитой частотой 440 Гц. Из частоты находим период синуса: 1/440 = 0.00227272727 секунды.
Частота дискретизации 44100 Гц.
Рассчитаем 44150-й семпл, если на нулевом семпле время равнялось нулю.
На 44150-м семпле прошло 44150/44100 = 1.00113378685 секунд.
Смотрим, сколько это в периодах — 1.00113378685/0.00227272727 = 440.498866743.
Отбрасываем целую часть — 0.498866743. Именно это значение и нужно передать в функцию WaveGenerator.GetTableSample.
Если записать все символьно, получим:
Оформим выкладки в виде отдельной функции WaveGenerator.GenerateNextSample и запишем итоговую функцию GenerateToneToStream.
Обычно, в параметры осциллятора добавляют следующие:
Данные параметры есть в реализованном мною синтезаторе — вы можете самостоятельно их реализовать.
Осталось реализовать классы AudioProcessor (будет создавать осциллятор и вызывать у него метод Generate) и PluginController (создает AudioProcessor).
Посмотрите реализацию данных классов в моем коде Syntage. На текущем этапе AudioProcessor нужен, чтобы:
В следующей статье я расскажу как написать ADSR-огибающую.