Vst logob

Как написать VST-плагин

Привет гуру-сообществу!

Многие музыканты занимаются доводкой своих инструментов, собирают педальки, преампы и прочие аналоговые приборы. Это дает уверенность в том, что происходит после извлечения нот, как именно формируется звук, да и вообще является частью творческого процесса. Так получилось, что сам занимаюсь и музыкой, и цифровой обработкой сигналов (то, что называется модной аббревиатурой DSP), поэтому реализую свои звуковые замыслы не с паяльником в руках, а за ноутбуком.

Думаю, все, кто имеет хоть малейшее представление о современных аудио-редакторах знает, что такое VST. Поскольку формат очень распространен, и поддерживается подавляющим большинством редакторов, писать будем именно VST-плагин.

Постараюсь изложить все так, чтобы базового курса программирования и прямых рук было достаточно, чтобы все получилось.

Эта статья даст основу: подготовим необходимые инструменты для работы, реализуем один из самых простых эффектов — хард-клип овердрайв (или проще, цифровой дисторшн) и запустим его в редакторе.

Ставим и настраиваем все необходимое

Сначала скачаем необходимые программы:

  • Нам, конечно, понадобится DAW (редактор) с поддержкой vst, в котором мы будем обкатывать наш плагин. В целом, не так важно какой именно будем использовать, но в статье буду использовать Reaper, т.к. его можно скачать и опробовать в течение двух месяцев бесплатно: http://www.cockos.com/reaper/download.php
  • Нам понадобится SDK (это набор библиотек для разработки), который скачиваем отсюда: http://www.steinberg.net/en/company/developer.html — понадобится регистрация, но денег не просят. Качайте VST Audio Plug-Ins SDK второй версии, т.к. третью поддерживают далеко не все хосты (аудио-редакторы), в том числе и Reaper с тройкой не работает.
  • И последние: среда разработки. Будем использовать Microsoft Visual Studio Express 2013 для Windows Desktop (нужна именно desktop версия — не перепутайте!), который также бесплатен, нужна только регистрация: http://www.microsoft.com/visualstudio/rus/downloads

Устанавливаем Reaper и Visual Studio, распаковываем архив с SDK.

Запускаем Visual Studio. Чтобы не маяться с настройками проекта для начала используем пример из SDK.

Если мы не хотим затирать пример можно перед этим скопировать директорию “again” из “vstsdk2.4\public.sdk\samples\vst2.x\” в ту же директорию, назвав ее, например, “overdrive”.

Открываем проект из нашего скачанного и распакованного SDK: “vstsdk2.4\public.sdk\samples\vst2.x\again\win\again.vcproj” или, соответственно “vstsdk2.4\public.sdk\samples\vst2.x\overdrive\win\again.vcproj”

Естественно, соглашаемся со всеми вопросами.

Для проверки нажмем “F7”. В выводе должно появиться что-то вроде:

"… again.dll
Сборка: успешно:1, с ошибками:0…"

Используем плагин

Открываем Reaper, создаем проект и добавляем дорожку. Для тестов в дорожку можно добавить звук какого-нибудь инструмента, например отсюда: http://www.freemusicloops.co.uk/free-guitar-loops/page/3

Теперь добавим директорию с нашим плагином в Reaper: идем Options > Preferences > VST и в VST plug-in paths выбираем нужную директорию (у меня “D:\vst\vstsdk2.4\public.sdk\samples\vst2.x\overdrive\win\Debug”) и жмем re-scan.

Теперь в списке VST-эффектов появился “VST: Gain (x86) (Steinberg Media Technologies)”. Это только что скомпилированный (по F7) плагин. Добавляем эффект к дорожке, проверяем, что работает ползунок “Gain” в его настройках, сохраняем и закрываем проект (закрываем, чтобы он не блокировал dll-файл плагина на запись).

Я также добавил в проект JS: Analysis/gfxscope, по которому потом будем смотреть форму сигнала.

Пишем самый простой плагин

Общий план

Самая нудная часть позади, перейдем к интересному.

Чтобы понять идею как это все работает, напишем наконец овердрайв. У нас будет только одна регулировка — гейн.

Как это работает

Сначала общая суть:

На вход программа будет получать отрывок фиксированной длинны (в несколько миллисекунд), и возвращать отрывок после преобразования. Поскольку отрывки эти очень короткие, обработка может происходить в реальном времени (с незначительной задержкой). Т.е. при наличии ASIO-карточки вполне можно играть через него.

Алгоритм

Для хардклипа нам нужно 1) усилить сигнал 2) срезать его выше некоторого значения.

Величину среза возьмем равной 1. Поскольку сигнал может принимать как положительные, так и отрицательные значения, срезать нужно сигнал с амплитудой больше 1 и меньше -1.

Пишем код

Наш главный файл again.cpp находим в «обозревателе решений»: again/Source Files/again.cpp

Открываем его. Нам нужнен метод (функция) AGain:processDoubleReplacing, который находится в самом низу файла. Сначала разберем что в нем есть сейчас:

  • Аргумент inputs — входные данные, outputs — выходные данные, sampleFrames — длина входа и выхода в семплах (то есть, размер массивов).
  • Дальше, для тех кто знаком с указателями — все должно быть понятно, для остальных звездочки — это «магия». Главное что нужно знать: (*in1) и (*in2) — это семпл из левого и правого каналов соответственно, в (*out1) и (*out2) нам нужно записать что получилось после преобразования.
  • Сейчас, в примере, преобразование заключается в умножении входного сигнала на коэффициент dGain (т.е. просто меняется громкость сигнала.), который привязан к ползунку в графическом интерфейсе.

Выше есть метод AGain:processReplacing с тем же алгоритмом, но работает метод с float, а не double — она будет выполнятся в режиме одинарной точности (32-bit), но в Reaper по умолчанию установлена двойная (64-bit). В готовом плагине, конечно, нужно иметь обе функции.

Я обещал «базовый курс программирования», поэтому переписал метод в следующем виде (результат его работы ровно тот же):

void AGain::processDoubleReplacing (double** inputs, double** outputs, VstInt32 sampleFrames)
{
// устанавниваем начальные значения указателей
double* in1 = inputs[0];
double* in2 = inputs[1];
double* out1 = outputs[0];
double* out2 = outputs[1];
// преобразуем значение gain из GUI к double
double dGain = fGain;

// выполняем цикл sampleFrames раз
for (VstInt32 i = 0; i < sampleFrames; i++)
{
// выполняем преобразование
(*out1) = (*in1) * dGain;
(*out2) = (*in2) * dGain;

// смещаем указатели на следующий семпл
in1++;
in2++;
out1++;
out2++;
}
}

Дисторшн будет отличаться тем, что сигнал должен обрезаться на отметке 1.

Нам нужна функция std:min, которая возвращает меньшее из переданных в нее значений. Подключаем в начале файла соответствующую библиотеку (после #include “again.h”):

#include

И теперь преобразование выглядит так:

           // выполняем преобразование
(*out1) = std::min(1., (*in1) * dGain * 30);
(*out2) = std::min(1., (*in2) * dGain * 30);

Здесь умножаем на 30 для того, чтобы входной сигнал усиливался — иначе не будет перегруза. Клиппинг получается за счет того, что мы берем минимальное значение из 1.0 и полученного после умножения числа, соответственно больше 1.0 на выходе не получается.

Если мы попробуем скомпилировать (нажать F7; если вдруг ругается на то что не может записать dll — значит не закрыт проект в редакторе) и проверить в Reaper, то увидим что эффект работает, клиппинг есть.

Теперь нам нужно, чтобы клиппинг работал с двух сторон. Соответственно, нужно и ограничеть с двух сторон: минимальное значение в 1 уже есть, теперь добавим максимальное в -1:

<10>

И получаем:

<11>

Возможно, более понятный вариант программы через if-else:

<12>

И, тот же алгоритм в AGain:processReplacing для режима 32-bit:

<13>

That’s all Falks!

Что дальше?

Саму программу можно и нужно привести в порядок, я описал лишь минимально необходимый набор действий, чтобы получить плагин со своим алгоритмом. Так что, небольшой todo list:

  • Переименовать название (again) проекта, файлов и классов
  • Добавить собственное название в AGain:getProductString и AGain:getVendorString
  • Стоит поработать над GUI и контролами, например кроме pre-gain можно добавить и post-gain (без клиппинга), добавить возможность установки соотношения wet-dry.

Но последний пункт — тема для отдельной статьи, а если наводить красоту — то и цикла статей. Сами же алгоритмы обработки — все время появляются, развиваются и множатся.

Так что, в дальнейшем обязательно буду выкладывать новые туториалы по vst.

Moar!:

JS-Effects‎ — язык для быстрого создания плагинов: http://productionguru.ru/posts/90

5
Fe35beefc7fcff12f7dd155348fa79e9
Rudolf 05 ноября 2013, 01:13 {{comments[72].rating}} дБ

Ёлки, вспоминаем паскаль!

Ответить
Da63936167e68fa49fc80d6304b35f64
John the Revelator 05 ноября 2013, 03:24 {{comments[73].rating}} дБ

Это C++, дубина.

Ответить
42f6bc3ba0379ceccfe6b03957918d78
Super Yarik 05 ноября 2013, 15:56 {{comments[74].rating}} дБ

Офигенная статья) !!

Ответить
B6b947db47531ff6ac2f48943ac8716b
Дефаулт Юзер 05 ноября 2013, 16:54 {{comments[86].rating}} дБ

коммент такой же бестолковый как и статья

Ответить
7144327ecb02bf36f4ba0ce7f4b66fe0
Urvalla 05 ноября 2013, 17:32 {{comments[93].rating}} дБ

Спасибо, Super Yarik!

Ответить
B6b947db47531ff6ac2f48943ac8716b
Дефаулт Юзер 05 ноября 2013, 18:11 {{comments[98].rating}} дБ

за что же не боясь греха кукушка хвалит петуха?

Ответить
People img
Игорь Егоров 22 июня 2014, 16:37 {{comments[333].rating}} дБ

Программ тоже до жопы и сайтов тоже до жопы, однако их до сих пор сидят толпами и пишут злобный троль, всегда есть уникальные потребности и в обработке сигналов то же, чот я не могу найти плагин эмуляции "mesa boogie dual rectifier" может подскажешь где скачать бесплатный плугин, чтоб звук был как у Metallica или Panteraб дожопашник.

Ответить
B6b947db47531ff6ac2f48943ac8716b
Дефаулт Юзер 05 ноября 2013, 16:24 {{comments[75].rating}} дБ

Нафига это обычным музыкантам? Плагинов до ж...ы в интернете бесплатных в т.ч. Особенно ВСТ, давайте все болт забьем на изучение музыки и игру на инструменте и пойдем плагины писать и примочки паять. Их мало что ли? Кому это вообще нужно? Super Yarik, мне вообще не понятно что здесь "офигенного"? Статья полный шлак! Бесполезный, никому не нужный. Если есть такие айти познания, лучше бы полезное автор что-то написал! Короче моя решительная оценка - в топку такие публикации!

Ответить
7144327ecb02bf36f4ba0ce7f4b66fe0
Urvalla 05 ноября 2013, 17:31 {{comments[92].rating}} дБ

Ну, а играть музыку зачем? mp3 "до ж...ы в интернете" - качай и слушай...

Ответить
B6b947db47531ff6ac2f48943ac8716b
Дефаулт Юзер 05 ноября 2013, 18:10 {{comments[97].rating}} дБ

это типа творчество называется... творческие что ли вещи ты пишешь? Отстой скучный...

Ответить
People img
Игорь Егоров 22 июня 2014, 16:29 {{comments[331].rating}} дБ

Дебил ты программ, тоже до жопы в интернете, однако, до сих пор их пишут, ты троль никудышный, плагины писать штука хорошая, хоть их и до жопы, есть такие задачи по обработке сигралов где хуй

Ответить
People img
Игорь Егоров 22 июня 2014, 16:29 {{comments[332].rating}} дБ

Дебил ты программ, тоже до жопы в интернете, однако, до сих пор их пишут, ты троль никудышный, плагины писать штука хорошая, хоть их и до жопы, есть такие задачи по обработке сигралов где хуй

Ответить
Caffe5ccbe117cc314c52d6a367e5525
appelsin1 05 ноября 2013, 17:17 {{comments[94].rating}} дБ

Так ты бы выложил примеры звучания. Тут soundcloud можно вставлять.

Ответить
7144327ecb02bf36f4ba0ce7f4b66fe0
Urvalla 05 ноября 2013, 17:50 {{comments[95].rating}} дБ

Ок, выложу чуть позже. Конкретно эта статья, в первую очередь не про эффект, но взять за привычку стоит)

Ответить
B6b947db47531ff6ac2f48943ac8716b
Дефаулт Юзер 05 ноября 2013, 18:12 {{comments[99].rating}} дБ

не стоит...

Ответить
B6b947db47531ff6ac2f48943ac8716b
Дефаулт Юзер 05 ноября 2013, 18:14 {{comments[100].rating}} дБ

зачем выкладывать? это бессмысленно

Ответить
People img
Владимир Еремин 05 января 2014, 06:20 {{comments[120].rating}} дБ

Благодарю! Статья пригодилась =)

Ответить
People img
Владимир Гуринович 17 апреля 2014, 11:00 {{comments[308].rating}} дБ

большое спасибо за статью. Начал интересоваться созданием вст плагинов. Можешь посоветовать интересные ресурсы по этой тематике?

Ответить
7144327ecb02bf36f4ba0ce7f4b66fe0
Urvalla 17 апреля 2014, 13:13 {{comments[309].rating}} дБ

В основе плагинов лежат чистые алгоритмы, не привязанные именно к VST. VST, по сути - обертка для алгоритмов, отвечает за вход и выход, а также за графический интерфейс. В общем, в тот пример, который описан здесь можно вставить достаточно сложный алгоритм обработки. Так что, можно искать в целом DSP (Digital Signal Processing) на С++. Ну, а тема DSP очень широкая - подсказать могу, но нужно знать что именно интересует. И с чего начать зависит от того, насколько глубоки познания в программировании и математике)

Ответить
7144327ecb02bf36f4ba0ce7f4b66fe0
Urvalla 17 апреля 2014, 16:42 {{comments[310].rating}} дБ

Отвечая на Ваш вопрос более развернуто: http://productionguru.ru/posts/90 - для начала написания плагинов весьма удобный подход.

Ответить
People img
Андрей Луцкий 01 июня 2014, 22:17 {{comments[322].rating}} дБ

VS 2013 не собирает тестовую программу, пишет ошибку, не может открыть файл с расширением .h . не знаю как быть. Подскажите.

Ответить
People img
Андрей Луцкий 01 июня 2014, 22:20 {{comments[323].rating}} дБ

Ошибка 2 error C1083: Не удается открыть файл включение: windows.h: No such file or directory e:\program files\programming\programming vst vsti\sdk\vstsdk2.4\public.sdk\samples\vst2.x\minihost2\source\minihost.cpp 16 1 minihost

Ответить
7144327ecb02bf36f4ba0ce7f4b66fe0
Urvalla 02 июня 2014, 13:24 {{comments[325].rating}} дБ

Похоже на то, что не прописаны include path. Нужно добавить что-то вроде того: $(WindowsSdkDir)include\um;$(WindowsSdkDir)include\shared

Ответить
People img
Андрей Луцкий 03 июня 2014, 01:24 {{comments[326].rating}} дБ

В каком месте все это дело прописать необходимо?

Ответить
7144327ecb02bf36f4ba0ce7f4b66fe0
Urvalla 03 июня 2014, 17:51 {{comments[327].rating}} дБ

К сожалению, сейчас под рукой нет установленного Visual Studio. Нужно найти Configuration Properties, там вкладка C/C++, поле Additional Include Directories. Туда дописать через ";" (точку с запятой) в конец. Вообще, по данной ошибке гугл выдает какие-то варианты решения, это проблема общая, не специфическая для VST.

Ответить
People img
Андрей Луцкий 03 июня 2014, 20:33 {{comments[328].rating}} дБ

Сделал как вы написали. Все равно не работает. Та же ошибка.

Ответить
People img
Андрей Луцкий 04 июня 2014, 00:22 {{comments[329].rating}} дБ

Как вообще компилируется файл. Должен длл файл получиться в итоге? В папке Debug? Все было бы хорошо если бы не эта отвратительная ошибка. Которую я не могу побороть. Прошу вас мне помочь...

Ответить
7144327ecb02bf36f4ba0ce7f4b66fe0
Urvalla 07 ноября 2014, 22:39 {{comments[345].rating}} дБ

Также прошу прощения за большую задержку, тогда не получилось разобраться. Вдруг актуально будет еще - отпишусь. Сейчас похожий случай удалось решить, добавив в include paths "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include" - версия "v.7.1A" и наличие "(x86)" могут отличаться, нужно поискать, но смысл тот же.

Ответить
People img
Андрей Луцкий 01 июня 2014, 22:41 {{comments[324].rating}} дБ

а если вообщем собирать все элементы, суммарно 40 ошибок выходит при сборке. Я не понимаю в чем проблема.

Ответить
People img
Mr_Mojo_Risin 22 сентября 2014, 01:54 {{comments[337].rating}} дБ

Доброй ночи! Хочу написать простой плагин, суть которого сводится к получению уровней громкости всех дорожек в DAW(не регуляторов громкости, а именно уровней, которые отображают вертикальные прогрессбары у дорожек), и отправлять полученные данные в ком-порт. Можно ли такое сделать, если плагин будет находиться на мастер канале? Или посоветуйте, как лучше сделать?

Ответить
7144327ecb02bf36f4ba0ce7f4b66fe0
Urvalla 24 сентября 2014, 15:15 {{comments[338].rating}} дБ

Да, если знаете как отправлять на COM-порт, то все должно получится. Нужно будет осреднять за некоторое время амплитуду и отправлять дальше. Соответственно, на каком канале будет плагин, ту громкость и будет отображать.

Ответить
People img
Mr_Mojo_Risin 24 сентября 2014, 16:16 {{comments[339].rating}} дБ

Спасибо за ответ! На другом форуме мне посоветовали отправлять ни как в ком порт, а как выходные миди данные, потому что если с одной дорожки отправлять, то с другой уже не получится - порт будет занят. Но это уже вторая часть вопроса, а первая - какой функцией получить уровень сигнала? И да, не подскажете где можно скачать vst sdk? А то на сайте у штенбергов по ссылке не могу найти. Или там нужен какой-то другой вид регистрации(я регистрировался там, когда регистрировал кубейс)?

Ответить
7144327ecb02bf36f4ba0ce7f4b66fe0
Urvalla 07 ноября 2014, 22:17 {{comments[344].rating}} дБ

Прошу прощения за такую задержку. С SDK разобрались как скачать? Там нужна регистрация как разработчика, на сколько помню. Уровень сигнала - это и есть то, что приходит в буфер. Как до этого писал, при выводе на медленный порт лучше всего осреднять. Скорее всего, подойдет осреднение каждого буфера. Перед осреднением нужно брать по модулю значение (abs), т.к. в противном случае среднее значение будет около нуля.

Ответить