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

Все посты серии: Часть 1. Введение и настройкаЧасть 2. Изучение кодаЧасть 3. VST и AU______________________________________________________________В этом посте мы завершим необходимую настройку среды разработки и подготовим вспомогательное окружение.

VST и AUВ WDL-OL очень просто превратить приложение в VST или AU. Чтобы создать VST на Маке, измените схему: VST2 → My Mac 64-Bit. Нажмите Run. Ошибок быть не должно, но ничего и не запустилось! Откройте Finder и зайдите в ~/Library/Audio/Plug-Ins/VST. Там увидите MyFirstPlugin.vst Если папка Library не видна в домашней директории, нажмите Cmd+Shift+G, вставьте указанный путь и жмите Enter.

Следующая секция относится к Mac. Версия для Windows ниже.

Отладка в Xcode Чтобы запустить плагин, нам нужен хост. Скачайте желательно 64-битную версию REAPER и перетащите его в папку Applications/ Его можно использовать без каких-либо ограничений 60 дней, после этого вас попросят приобрести лицензию (но он продолжит работать). Мы хотим настроить все так, чтобы когда мы жали Run в Xcode, запускался REAPER и отладчик. Мы сможем использовать брейкпоинты так же, как делали это с приложением.

Зайдите в Product → Scheme → Edit Scheme…, выберите Run в списке слева. В подпункте Executable выберите Other…:

473dcdb1262379436b7b4b3f58a7da6a.jpg

Используйте диалоговое окно, чтобы найти REAPER64.app. Должно выглядеть так:

2841e38bfe8d7f5b6097315108eac88b.jpg

Жмите OK, и снова Run. Запустится REAPER. Чтобы создать в нем новую дорожку для звука, нажмите Cmd+T (Ctrl+T в Windows), и на ней — кнопку FX:

91b20b1bfa29f6beae6b1b054776fb47.jpg

В открывшемся окне введите myfirstplugin, и наш плагин найдется:

ef2b235fe91858c685dc540860735f62.jpg

Выбирайте, жмите ОК. Он должен появиться. Преимущество использования REAPER в том, что тут мы можем обрабатывать плагином любой звуковой файл и сразу слышать результат. Это намного интереснее, чем все время слушать со входа микрофона. Помимо этого, здесь можно использовать разные другие плагины, в том числе для анализа выходного сигнала нашего плагина. Это пригодится, но попозже.Скачайте этот файлик и перетяните его на дорожку в REAPER. Поставьте его вплотную к левой границе дорожки. Нажмите пробел, для воспроизведения. Станет слышен низкий звук:

7546d06fdd4421e9d30a53063f38095d.png

Для удобства было бы хорошо закольцевать звук, чтобы он бесконечно играл, пока снова не нажмем на пробел. Зажмите Cmd (Shift на Windows) и два раза щелкните по файлу на дорожке. Светлым прямоугольником выделится временной диапазон. Нажмите R, чтобы закольцевать его, и запускайте. Покрутите ручку плагина — громкость звука меняется!

440adcc7f3b85f0115eca43e28e64d22.png

При вращении ручки могут быть слышны щелчки. Это из-за того, что мы не интерполируем значения и создаем в сигнале резкие перепады. Теперь нажмите в Xcode Stop, чтобы закрыть REAPER.

Создать AU версию просто: измените таргет на AU. Прежним образом измените схему Run, чтобы запускался REAPER.app, и жмите Run. Плагин скомпилируется и его файл появится в ~/Library/Audio/Plug-Ins/Components. Запустится REAPER и можно будет проделать все те же вещи, что и с VST версией.

Все эти запуски, создания треков и закидывания на них плагинов постоянно повторяются. Я предпочитаю оптимизировать подобные вещи. Когда в REAPER все готово (звук закольцован и плагин уже висит на треке), сохраните проект (Cmd+S на Mac и Ctrl+S в Windows) в папку проекта в Xcode (~/plugin-development/wdl-ol/IPlugExamples/MyFirstPlugin/) и назовите reaper-project.RPP.

В окне Edit Scheme выберите VST2 вверху. Затем идите в закладку Arguments и щелкните на плюс под строкой «Arguments Passed On Launch». Перетяните reaper-project.RPP из папки проекта в новую строчку:

21077a309763b341af0ebcf5a067babd.jpg

То же самое надо повторить для AU. Если хотите, можно вообще создать отдельный проект для AU версии. Теперь каждый раз REAPER будет запускаться уже со всем барахлом. Здорово!

Если хочется, можно поиграться с брэйкпоинтами и отслеживать значения переменных плагина, даже несмотря на то, что он не запущен непосредственно в Xcode.

Отладка в Windows Открывайте Explorer и заходите в C:\Program Files. Создайте там новую папку с именем vsthost. Скачайте программку Savihost (нам понадобится savihostx86.zip), разархивируйте и скопируйте файл savihost.exe в эту папку:

1bd2693e80552981f42848385c1250e0.png

В Visual C++ правым щелчком по MyFirstPlugin-vst2 выберите Set as StartUp Project. Жмите F5, плагин запустится в Savihost:

64893a70a1a3dceac30dc41ee39bac5b.png

Если ничего не появилось, пощелкайте окошки на панели задач, он должен быть там.Нужно сделать еще одну вещь: сейчас Savihost ловит все исключения и старается сделать так, чтобы плагин не упал. Это здорово, если мы выступаем на сцене, но сейчас нам нужно его отлаживать. В Visual C++ правым кликом по MyFirstPlugin-vst2 выберите Properties. В открывшемся окне выберите Debugging. Справа к параметрам допишите /noexc /noft, как на картинке (не потеряйте пробелы):

f7ffceaa361d8cd493e1d687e7ef7f52.png

Теперь исключения будут передаваться отладчику Visual C++.

Если попробовать запустить VST3 версию, то может выскочить такое сообщение (не на немецком, наверное):

7f8c6627df2862ba16ddd098b526d421.png

В VST3 SDK, который мы скачали раньше, в подпапке \bin лежат архивы. В них содержатся установщики, которые создадут необходимые папки для 32 и 64-битных систем (C:\Program Files (x86)\Steinberg\VST3PluginTestHost\ и C:\Program Files\Steinberg\VST3PluginTestHost\ соответственно) и скопируют туда нужные версии файла VST3PluginTestHost.exe. При установке никакие параметры менять не обязательно.

В принципе, в Windows тоже можно проверить работоспособность плагина «в реальных условиях» вручную (если есть идея, как автоматизировать, буду рад добавить в статью). В папке проекта есть подпапка \build-win, в которой, помимо прочего, находятся .dll и .vst файлы плагинов. В настройках REAPER Options → Preferences → Plug-Ins → VST можно добавить директории, содержащие скомпилированные файлы плагинов:

2ff11249de91def9d3c9997c351f801f.png

Блокировка предупреждений для кода библиотек на Mac Версия для Windows будет дальше.

Как можно заметить, нам выдается куча предупреждений:

e2e9891f643440f8529e3103573ec0fb.png

Предупреждения очень полезны, так как обращают наше внимание на возможные проблемы и баги в коде. В данном случае 22 предупреждения относятся к коду используемой нами библиотеки, так что мы не можем просто исправить их, т. к. если когда-нибудь мы загрузим свежую версию этой библиотеки, все исправления придется вносить снова. Но и оставить все как есть тоже не годится: можно легко пропустить 23-ю ошибку, которая будет относиться уже к коду нашего плагина.

На мой взгляд, лучшим решением будет заблокировать эти предупреждения, чтобы когда появляется новое предупреждение, мы знали, что оно имеет отношение к нашему коду. Для этого мы можем использовать флаг компилятора -w. Щелкните в навигаторе на синюю иконку проекта, выберите таргет APP, зайдите в Build Phases и раскройте секцию Compile Sources. Отметьте все строки, кроме MyFirstPlugin.cpp, сделайте двойной щелчок по столбцу Compiler Flags, напечатайте -w и нажмите Enter:

9b5f63422a498e78b2d80b6781fd639a.png

Повторите то же самое для VST2, AU и других нужных таргетов.Создайте сборку снова. Мы увидим три предупреждения. Validate Project Settings исправить легко: двойной щелчок по нему, затем снять все галочки и щелкнуть Done:

72c24d9822656f9cee86da1c1a54ed0c.jpg

Теперь осталось два предупреждения:

6d92923796d4bd714672875a93427950.png

То, которое касается кодировки InfoPlist.strings, можно исправить, открыв файл и конвертировав его в UTF-8 при помощи Utilities справа:

933901298845d32cadc597c5451a7435.jpg

Предупреждение extra tokens убирается дополнением директивы #include в MyFirstPlugin.h:

#pragma clang diagnostic push #pragma clang diagnostic ignored »-Wextra-tokens» #include «IPlug_include_in_plug_hdr.h» #pragma clang diagnostic pop Теперь в таргетах APP и AU предупреждений нет. А при сборке VST2 выскакивает предупреждение об одном параметре в объявлении функции main. Исправим это дополнением директивы #include в MyFirstPlugin.cpp (не в .h!):

#include «MyFirstPlugin.h» #pragma clang diagnostic push #pragma clang diagnostic ignored »-Wmain» #include «IPlug_include_in_plug_src.h» #pragma clang diagnostic pop #include «IControl.h» #include «resource.h» Создайте сборку и убедитесь, что все чисто!

Блокировка предупреждений кода библиотек в Windows В целом VS C++ выдает другие предупреждения, нежели GCC/LLVM на Маке. Список всех предупреждений VS C++ 2010 находится на этой страничке слева.

Например, если вы видите предупреждения С4101 и С4129 о каком-нибудь файле в библиотеке WDL, их можно игнорировать: допишите #pragma перед #include в MyFirstPlugin.h:

#pragma warning (suppress: 4101 4129) #include «IPlug_include_in_plug_hdr.h» Suppress означает, что предупреждения будут игнорироваться только для следующей строки (то есть для #include). Так что предупреждения, касающиеся всего остального кода в файле, вы будете получать, а это хорошо. Обратите внимание, что надо писать только номер предупреждения, без «С». То же самое можно проделать и в MyFirstPlugin.cpp:

#pragma warning (suppress: 4101 4129) #include «IPlug_include_in_plug_src.h» Это касается файлов .h из библиотеки.Если вы получаете предупреждения о конкретном .cpp, найдите его в project explorer, по правому щелчку зайдите в Properties, в окне слева выберите C/C++ → Advanced. Справа должна быть опция Disable certain warnings:

56c6e1e439fad029f666fbbadfc189ec.png

Тут можно добавить список номеров предупреждений, разделенных точкой с запятой. Как видите, отладчик уже игнорирует четыре предупреждения для этого файла. Обратите внимание, что данные изменения повлияют только на этот конкретный .cpp файл. Так что надо будет обозначить номера предупреждений для остальных файлов и так же добавить их в соответствующие настройки.Когда будете создавать новый проект, используйте скрипт duplicate, чтобы не пришлось снова вносить все эти коррективы.

Красотища! Мы разгребли все предупреждения: скрыли лишние и облегчили наблюдения за важными для нас. В следующий раз мы запачкаем руки в написании грязного дисторшена.

© Habrahabr.ru