Этот пост — первый из серии переводов руководства Мартина Финке о написании собственных аудио плагинов.
Отличительной особенностью этого материала является отсутствие зависимости от формата плагина и платформы его использования. Внимание сфокусировано на общей структуре аудиоплагина. Затем алгоритмы оборачиваются в слой абстракции для сборки в форматы VST, VST3, AU, RTAS, AAX или в отдельное приложение.
Сам Мартин больше работает на Маке, но руководство содержит и все необходимые шаги для разработки на Windows.
Введение
Аудиоплагины — это программы, которые загружаются в хост (например Ableton Live, Logic или REAPER). Они обрабатывают аудио иили MIDI данные. У них, как правило, есть GUI (графический пользовательский интерфейс). Вот три примера (U-He Zebra, Sonalksis FreeG и D16 Decimort):
Как видите, в GUI присутствуют элементы управления (чаще всего это какие-нибудь ручки), меняющие то, как плагин обрабатывает входящие данные. Еще есть набор пресетов (предустановок — на скриншотах они называются Combo и Emulator), в которых хранятся положения ручек и других параметров.
Начнем мы с дисторшена — это достаточно простой плагин. После этого мы сделаем вот такой субстрактивный синтезатор, шаг за шагом:
Будем использовать С++ и библиотеку WDL-OL. Она основана на библиотеке Cockos WDL (произносится как «уитл»). Она делает за нас кучу работы, вот самые важные моменты:
- Содержит уже готовые проекты Xcode / Visual Studio
- Создает плагины в форматах VST, AudioUnit, VST3 и RTAS из нашего кода. Просто выбираем формат и жмем запустить!
- Создает 3264-битные версии
- Запускает ваш плагин как самостоятельное приложение в Windows или MacOS
- Содержит множество разных элементов GUI, которые используются в аудиоплагинах
Также в этой библиотеке есть некоторые часто используемые алгоритмы, например, передискретизация. Вот в этой ветке форума есть много скринов плагинов, написанных при помощи WDL.
Разные форматы плагинов делают более-менее одно и то же. Следовательно, в коде обычно бывает много копипасты. Как программист, вы должны стараться не повторяться, так что рано или поздно вы бы написали свой собственный слой абстракции над разными форматами. Но это уже существует в виде фрэймворка IPlug, являющегося частью WDL. Это самая раздражающая часть процесса разработки, так что теперь мы сможем сфокусироваться на таких интересных штуках, как:
- Обработка аудио и MIDI
- Внешний вид плагина
- Интеграция с хостом (автоматизация, пресеты и прочее)
Еще одна замечательная вещь в WDL это разрешительная лицензия. Библиотеку можно свободно использовать даже в коммерческих продуктах (см. детальную информацию по ссылкам выше).
Как мы это сделаем
«Погоня лучше, чем добыча» — Эйч Пи Бакстер
В программировании результат сам по себе — это уже вознаграждение, но именно по пути к результату мы учимся. В этом руководстве не будет длинных листингов с идеальными решениями. Мы начнем с того, что работает, и будем постепенно развивать это, встречаясь с разными проблемами. Минус в том, что вы будете писать код, который впоследствии замените на лучший. Но программистам к этому не привыкать. Первый плюс: не будет переполняющей радости, т. к. мы будем подходить к решению постепенно вместо того, чтобы сделать все одним махом. Второй — это то, что мы получим некоторые ценные знания в программировании.
Эта серия постов — не о решении задач по матану без калькулятора на бумажке. Она о том, как создавать хорошее программное обеспечение, которое вы можете дать своему другу-продюсеру, чтобы он сделал бас пожирнее.
Что нам понадобится
- Mac с Xcode 4 или выше, или Windows с Visual Studio C++ 2010 или выше
- Некоторое понимание С++ (синтаксис, указатели, основы ООП, механизмы памяти). Вы могли слышать, что С++ это тяжелый язык, но мы не будем использовать слишком сложные приемы.
- Некоторые общие знания о [цифровом] звуке: что такое амплитуда и частота, что делает фильтр, как аудио представляется с определенной частотой дискретизации (sample rate) и битовой глубиной (bit depth). Если вы делали музыку раньше, то, скорее всего, это все вам уже знаете.
- Заинтересованность в обработке цифровых сигналов и в разработке GUI: это две основные темы данного руководства. Если у вас нет никаких знаний в обработке цифровых сигналов, то по ходу разработки вам придется почитывать дополнительные материалы для заполнения пробелов. Я постараюсь давать ссылки на дополнительное чтение.
Полезные ресурсы
Пара ссылок, которые нам могут пригодиться:
- Stack Overflow: здесь можно узнать, например, что значат непонятные предупреждения, которые вы будете получать от компилятора.
- DSP Guide: очень хорошая бесплатная книга (на английском), покрывает больше материала, чем нам нужно. Если вам будет непонятен какой-нибудь концепт из обработки сигналов, почитайте эту тему в ней.
Теперь пора все настроить и подготовить.
Установка и настройка WDL-OL
Сейчас мы установим библиотеку WDL-OL и ее зависимости. Затем запустим пример, просто чтобы убедиться, что все работает как надо.
Большая часть этого материала есть в видео Оли Ларкина:
Материал следующей секции в основном для настройки на Mac. Windows будет немного ниже.
Настройка на Mac OS X с использованием Xcode 4
Перед тем, как мы начнем, надо скачать и установить парочку новых вещей. Это немного муторно, но придется сделать только один раз.
Предварительная подготовка
- Если не установлен Xcode, скачайте и установите.
- Cкачайте последнюю версию VST3 SDK. Для скачивания нужно зарегистрировать аккаунт.
- Скачайте Audio Tools for Xcode. В меню Xcode щелкните Open Developer Tool → More Developer Tools… (или кликайте сюда). Найдите Audio Tools for Xcode в списке, скачайте и установите. Для разных OS X есть разные версии, так что выбирайте внимательнее.
- Скачайте RtAudio (в пакет включены некоторые нужные файлы из ASIO SDK).
- Если у вас нету git, стоит его установить.
Загрузка WDL-OL
Откройте Terminal и напечатайте следующие строки, чтобы создать новую папку в вашей домашней директории и переместиться туда:
mkdir ~/plugin-development
cd !$
Давайте загрузим WDL-OL:
git clone https://github.com/olilarkin/wdl-ol
cd wdl-ol
git checkout 0a360c90b3460717210eeaee7464bc7009c9a5ba .
Эти строчки можно скопировать и вставить. Главное — не забудьте точку в конце! Тогда вы наверняка будете использовать ту же версию WDL-OL, что и в этом руководстве. На данный момент должна появиться подпапка wdl-ol.
Добавление зависимостей
Заходите в ASIO_SDK и скопируйте сюда файлы .cpp и .h из папки include из RtAudio.
Разархивируйте VST3 SDK и скопируйте файлы aeffect.h и aeffectx.h из папки pluginterfaces/vst2.x в подпапку wdl-ol/VST_SDK (они могут быть уже включены в VST3 SDK в подпапке pluginterfaces/vst2.x). Помимо этого для VST3 вам понадобятся base/source, pluginterfaces и public.sdk/source. Скопируйте из следующим образом:
Обратите внимание, что папку public.sdk надо будет создать вручную. Так в итоге должно выглядеть ваше дерево папок:
Теперь откройте common.xcconfig (он должен открыться в Xcode) и внесите следующие изменения:
CERTIFICATE_ID = Your Name
// Comment this line out:
// COMPILER = com.apple.compilers.gcc.4_2
// Uncomment this line:
COMPILER = com.apple.compilers.llvm.clang.1_0
// Add these lines:
VST_FOLDER = ~/Library/Audio/Plug-Ins/VST
VST3_FOLDER = ~/Library/Audio/Plug-Ins/VST3
AU_FOLDER = ~/Library/Audio/Plug-Ins/Components
// Comment these out:
//VST_FOLDER = /Library/Audio/Plug-Ins/VST
//VST3_FOLDER = /Library/Audio/Plug-Ins/VST3
//AU_FOLDER = /Library/Audio/Plug-Ins/Components
Также мы будем использовать Mac OS X 10.5 для переменных BASE_SDK
и MACOSX_DEPLOYMENT_TARGET
. Продюсеры, и в особенности владельцы студий, часто очень ленятся обновлять свою ОС. Им не нужны новые фишки, а вот несколько дней простоя из-за проблем с обновлением софта могут вылиться в большие финансовые потери.
На самом деле deployment target содержит информацию о той версии, которая понадобится пользователям, но я предпочитаю прописывать ту же версию для основного SDK.
SDK 10.5 не включен в Xcode 4. Если он у вас уже установлен, переходите к пункту «Запуск тестового проекта». Если нет, то читайте дальше:
Установка SDK 10.5
Чтобы его установить, нужно скачать Xcode 3.2.6. Когда вы его скачаете, смонтируйте .dmg файл, откройте Terminal.app и введите
open /Volumes/Xcode and iOS SDK/Packages/
Откроется окно поисковика и там будет файл с именем MacOSX10.5.pkg. Щелкнике по нему два раза. Если у вас версия OS X 10.8 или выше, появится сообщение, что программа от неизвестного разработчика не может быть установлена. В этом случае правый клик по файлу, в меню надо нажать Open и подтвердить, что вы действительно хотите установить софт. При установке выберите change install location, кликните по диску, на который хотите установить, чтобы можно было выбрать на нем директорию. Установите, например, в папку Downloads в папке пользователя. После завершения установки в выбранном месте появится новая папка MacOSX10.5.sdk. Напечатайте в Terminal.app следующее:
open /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs
Снова появится окно поисковика. Перетащите в него папку MacOSX10.5.sdk. После перезапуска Xcode старый SDK должен быть доступен в Xcode 4. Убедитесь, что вы сделали резервную копию MacOSX10.5.sdk где-нибудь: если вы будете обновлять Xcode до более поздней версии, вам, возможно, придется повторить эти действия.
Запуск тестового проекта
В Терминале перейдите в папку с примерами:
cd IPlugExamples
Запустите скрипт dublicate чтобы создать свой первый плагин (замените YourName что-нибудь свое):
./duplicate.py IPlugEffect/ MyFirstPlugin YourName
Теперь там появилась новая папка MyFirstPlugin. Зайдите в нее и откройте MyFirstPlugin.xcodeproj. Выберите таргет APP:
В WDL-OL есть маленький баг: самостоятельное приложение не будет выводить звук, если не выбрать другой аудиовход. Но это легко исправить. В навигаторе проектов Xcode откройте Other Sources → OSX App Wrapper → app_main.h. Измените содержание 34-й строки (в которой #define DEFAULT_INPUT_DEV
) на следующее:
#define DEFAULT_INPUT_DEV "Built-in Microphone"
Кликните Run. Выскочат несколько ошибок линкера:
Их легко исправить. Вернитесь в настройки сборки вашего проекта (убедитесь, что вы выбрали именно ваш проект, а не какой-то другой target) и поменяйте значение параметра Implicitly Link Objective-C Runtime Support на No:
Снова кликните Run. Через пару секунд плагин появится в виде самостоятельного приложения:
Проверка версии AudioUnit при помощи Logic
Если у вас нет Logic, можно использовать бесплатный инструмент auval
для проверки. Убедитесь, что сборка AU Target прошла успешно, откройте Terminal и введите:
auval -a 2> /dev/null | grep MyFirstPlugin
Он должен выдать что-то типа этого:
aumu Abcd Efgh - YourName: MyFirstPlugin
Если Logic или auval не находят AU (а другие хосты типа REAPER его видят), зайдите в настройки сборки и убедитесь, что вверху слева выделен таргет AU. В поиске вбейте “active arch”. В результатах должна быть только одна строка параметра Build Active Architecture Only, значение которого . Измените его на No. Таким образом 32-х и 64-х битные версии будут компилироваться даже в режиме Debug. После этого зайдите в Product → Clean (Cmd+Shift+K) и запустите сборку снова. Теперь должно заработать.
Установка на Windows с использованием Visual C++ 2010 Express
Для начала установите Visual C++ 2010 Express.VS 2012 вроде тоже подойдет, но лично я не проверял.
Для создания 64-х битных версий плагинов понадобится обновление компилятора, что, в свою очередь, может требовать наличия Windows SDK v 7.1. Корректная установка Windows SDK v 7.1 после установки обновления VisualStudio 2010 SP1 очень затруднительна. При установке может выскочить fatal error
.
Чтобы исправить положение, повторно запустите установщик Windows SDK v 7.1 и снимите галочку с Visual C++ Compilers and libraries.
Чтобы наверняка иметь правильную конфигурацию, удалите следующие продукты и установите их в таком порядке:
- Visual Studio 2010
- Windows SDK 7.1
- Visual Studio 2010 SP1
- Visual C++ 2010 SP1 Compiler Update for the Windows SDK 7.1
Пост с описанием других возможных проблем и их решений находится здесь.
Затем установите Git для Windows, используя настройки по умолчанию. Я использовал версию 1.8.4. Запустите Start → Program Files → Git → Git Bash. Откроется окно терминала. В этом окне введите несколько команд:
cd c:
git clone https://github.com/olilarkin/wdl-ol
cd wdl-ol
git checkout 0a360c90b3460717210eeaee7464bc7009c9a5ba .
Чтобы вставить строки в окно, сделайте правый клик по его заголовку и выберите Edit → Paste:
Теперь скопируйте все файлы VST2/VST3/ASIO SDK в нужные папки, так же, как описано выше. Установите Python, используя настройки по умолчанию. Я использовал 2.7.5.
Чтобы создавать плагины формата VST3, надо создать папку VST3. Выполните в терминале эту команду:
mkdir -p "C:Program FilesCommon FilesVST3"
Теперь перейдите в терминале в подпапку IPlugExamples:
cd IPlugExamples/
Запустите скрипт duplicate при помощи Python:
c:Python27python.exe duplicate.py IPlugEffect MyFirstPlugin YourName
Появится новая папка MyFirstPlugin. Зайдите в нее и откройте MyFirstPlugin.sln. Не обращайте внимания на предупреждения, они говорят о том, что мы не сможем собрать форматы AAX и TDM. В окне project explorer слева убедитесь, что MyFirstPlugin-app выделено жирным:
Если это не так, кликните по нему и выберите Set as StartUp Project. Жмите F5, должно появиться такое окно:
Мило, да?
Возможные проблемы
Если вы видите ошибку fatal error LNK1123
в процессе сборки, вам нужно отключить incremental linking: правым кликом по проекту MyFirstPlugin-app, кликайте по Properties и заходите в Configuration Properties → Linker (General) → Enable Incremental Linking → “No (/INCREMENTAL:NO)”.
Если проблема не решается, попробуйте установить Visual Studio 2010 SP1, если еще не устанавливали. Так же может пригодиться обновление компилятора для создания 64-х битных версий плагинов.
Если появляется предупреждение CreatePackage.bat […] exited with code 1
, не надо беспокоиться, разве что вы хотите создавать плагины в формате AAX. Ошибка попросту говорит о том, что не установлен AAX SDK.
Предупреждение Cannot open include file: ‘ForcedInclude.h’: No such file or directory
означает, что RTAS SDK не найден. Опять же, если RTAS не нужны, на это можно не обращать внимания.
В следующий раз мы изучим код проекта.
Автор: 1eqinfinity