VST Синтезаторы
#1 ilovemusic
А. Шлеёнкин (Syncer)
VST Синтезаторы.
Взгляд изнутри.
В данной статье я попытаюсь раскрыть для рядового пользователя идею создания VST синтезаторов, которой, как мне кажется, не хватает музыкантам, в особенности тем, кто постоянно ищет всё новые и новые синтезаторы и тем кто любит поспорить какой синтезатор лучше и чем. Моё мнение естественно не является истиной в последней инстанции и я тоже могу заблуждаться. В связи с тем что многие вопросы имеют под собой психическую основу придётся рассматривать и процесс выбора “любимого” синтезатора и с точки зрения классической психологии.
Взгляд среднего уровня
Синтезатор из коробочки
Как я упоминал ранее, существуют синтезаторы, из которых можно собирать другие синтезаторы как из конструктора. Плюсы такого подхода в том, что люди постепенно начинают понимать описанные выше проблемы и приходят к какому то одному синтезатору.
Таких конструкторов ныне очень много, но рассмотреть я хочу всего два это Reactor и SynthEdit. Не смотря на очевидные плюсы первого, такие как реклама другой продукции этой фирмы, SynthEdit часто обвиняют в одинаковости звука, как будто забывая что как и SynthEdit так и Reactor стоят каждый на своём одном ядре – следовательно и звук поделок из каждого из них будет схожим (это можно, как писалось выше, отнести и не только к конструкторам синтезаторов). Звук у Reactor действительно приятнее чем у SynthEdit, к остальным плюсам Reactor можно отнести то что делался он “для дурака”, сложен в обучении, но напутать там что-то сложно. В противопоставление SynthEdit очень прост в обучении и более гибок в отношении напутать и получить уникальный звук, да это происходит нередко. Кроме того, Reactor плох тем, что пользователи зависят от создателей, то есть ничего добавить и убрать нельзя, использовать можно только имеющиеся и не более. SynthEdit открыв архитектуру модулей наводнило интернет разными модулями, за частую с исходными текстами на C++, так что здесть возможно дорабатывать и развивать свой синтезатор без ожидания “когда ж разработчики тоже придут к необходимости этого нововведения в данном модуле”, если говорить честно, то этого уже достаточно чтобы говорить о том, что SynthEdit оказывается явно впереди. Из этого можно заключить что поделка сделанная на SynthEdit зачастую гораздо ценнее аналогии на Reactor. И чтобы как то закруглится со статьёй могу сказать, что все синтезаторы это и есть собранные из подобного конструктора, только местом для сборки является не SynthEdit или Reactor, а на C++ или Delphi, но идея сборки мало меняется от этого.
Программные аналоги железных синтезаторов
Заблуждение в понятиях
Лучшие VST синтезаторы по версии сайта Fierymusic.ru
В этой статье речь пойдет про лучшие VST синтезаторы по версии Fierymusic.ru . Дело это конечно сугубо индивидуальное. И нельзя объективно судить о качестве того или иного плагина. Кому-то нравиться Z3TA+2, а кому-то Alchemy. Кроме того, разные синтезаторы могут быть использованы для достижения разных целей. Одни больше подходят для написания подкладов, другие – для лидов, а третьи – для баса и т.д.
Исходя из своего опыта, я выделил несколько плагинов. И сегодня я расскажу про эти лучшие VST синтезаторы (на мой взгляд). В этот список вошли не только синты, но и программные сэмплеры. Однако я не буду составлять очередной рейтинг популярности, а лишь хочу выразить собственное мнение. Как говорится: «На вкус и цвет…».
LennarDigital Sylenth1 – это прекрасный полифонический VST синтезатор. Звучит он, действительно, очень здорово. Имеет не плохие низа как для VST и не нагружает процессор. В этом синтезаторе разработчики собрали воедино качество, удобство настройки и экономию ресурсов. Sylenth1 является одним из самых популярных плагинов на данный момент. В нем можно написать практически любую партию от басов до пэдов. Я обычно использую этот синт на басах и в качестве дополнения при лееринге других инструментов (пэды, лиды и т.п.).
Sonic Academy A.N.A. – прекрасный синт, однако более требовательный к ресурсам. A.N.A. расшифровывается как Analog. Noise. Attack. Всё потому, что этот плагин имеет три осциллятора для генерации сигнала, два осциллятора для подмешивания шума и один осциллятор для добавления звуку атаки. Используя последний можно добавить звуку больше панча и агрессии. Ведь очень многим синтезатором не достаёт именно этого. Я часто использую A.N.A. для создания баса и партий лидов.
Native Instruments Massive – великолепный VST плагин, который основан на таблично-волновом синтезе. Он состоит из 3-х генераторов волны, модулирующего осциллятора и генератора шума. В синтезаторе Massive используется необычная технология реализации управления какими-либо параметрами модуляции (использование LFO, ADSR и т.д.). Этот плагин обладает своим особым необычным звучанием. В большинстве случаев я применяю Massive для создания партий лидов и басов.
Native Instruments Kontakt 5 – очень мощный и оригинальный сэмплер. Мне вообще очень нравятся продукты компании NI. В них есть что-то особенное. Нестандартный подход.
Kontakt 5 – это плагин, который может быть использован для различных целей. Благо библиотек для этого сэмплера полным полно. Это и аналоговые синтезаторы, и струнные, и клавишные, и даже различные хоры. В общем, многофункциональный инструмент.
Tone2 Gladiator – необычный синтезатор с ярким насыщенным звуком. Многие скажут, что этот синт слишком размазанный. Однако мне нравиться яркость его тембров и насыщенность звучания в среднем и высоком регистре. Низа конечно у него не ахти. Но для придания звуку большей плотности и яркости – самое оно. Я использую этот синтезатор при лееринге лидов, партий арпеджио, басов и пэдов.
ReFX Nexus – хороший ромплер, который прекрасно подойдет для лееринга пэдов, лидов, арпеджио и партий других инструментов. Этот инструмент имеет большое количество различных банков, которые рассортированы по категориям, что сильно упрощает поиски нужного тембра. Nexus не так требователен к ресурсам компьютера, но это не делает его рядовым плагином.
Native Instruments Battery 3 – прекрасный сэмплер для работы с oneshots. Этот плагин уже стал классикой. Он предназначен (в первую очередь) для работы с драм партиями. Простой и удобный в управлении. Я использую его в том случае, если работаю в программе Cubase.
В этой статье я постарался выделить те лучшие VST синтезаторы (и сэмплеры), которые, на мой взгляд, являются флагманами нынешних тенденций. Хотя должен подчеркнуть, что есть множество других плагинов заслуживающих внимания.
Пишем электронную музыку. VSTi синтезаторы
Сейчас обычного компьютера вполне достаточно для создания качественной электронной музыки. Многие пробовали писать свою музыку, интересовались этой темой. Возникло желание поделиться своим опытом. Первая статья из серии будет на важнейшую тему — VSTi синтезаторы.
Что такое VSTi? Зачем нужны VSTi? Почему не хватит одних только семплов для создания качественной музыки?
Во-первых: такого семпла, который звучал так как хочешь, еще нужно найти. А это не так просто. Естественно существуют продакшен-библиотеки с готовыми мелодическими лупами, но в таком случае создание музыки подобно складыванию конструктора лего.
Во-вторых: семплу нельзя так же просто изменять звучание как звуку синтезатора.
В-треьих: при игре с семплом при помощью миди-клавиатуры стоит учитывать возможные артефакты, такие как алиасинг, разная длительность нот.
Семплы, конечно же, используються в ряде VSTi — семплерах и ромплерах, где например может быть засемплировано пианино или гитара. Что не возможно качественно создать одним синтезом. Но занимают много места и не имеют возможности полностью изменять звук как генерированые синты.
Как же можно создавать свое звучание?
Технология VST (Virtual Studio Technology) была создана немецкой компанией Steinberg в 1996 году. На данный момент VST де-факто является одним с самых популярных форматов аудио-плагинов (windows платформа). Формат является программно-зависимым, для работы плагина необходима DAW (Digital Audio Workstation) программа — хост — звуковой редактор или секвенсор.
VST плагины можно условно разделить на VST — эффекты и VSTi — инструменты. Первые предназначены для обработки звука (эквалайзеры, ревербраторы, компресоры и т.д.). VSTi (буква «i» обозначает instrument) предназначены для получения звука, о них в данной статье и пойдет речь.
Для каждого из синтов я подготовил пример звучания
На сегодняшний день существуют тысячи VSTi синтезаторов, которые создаются как одиночками любителями, так и крупными компаниями. Например, Native Instrument или Arturia.
VSTi синтезаторы используют самые разные алгоритмы генерации звука: субтрактивный (вычитающий), аддитивный (суммирующий), FM — синтез, физическое моделирование и самый распространённый гибридный синтез — комбинация предыдущих трех. Также следует упомянуть синтезаторы, которые фактически не создают звук с нуля, а используют заранее записанные библиотеки звуков. Это — так называемые семплеры и ромплеры. Их звуковые библиотеки могут занимать десятки гигабайт на жестком диске.
Управление VST инструментом происходит в реальном времени с помощью внешнего midi контроллера или дорожки автоматизации в секвенсоре. Пользователь изменяя параметры синта изменяет параметры получаемого звука, такие как тембр, длительность и другие.
Существуют VSTi эмуляторы реально существующих «железных» синтезаторов, например таких легендарных аппаратов как Minimoog, Roland TB-303 или Yamaha CS-80. Проблема создания виртуальных клонов заключается в большой трудности повторить в точности аналоговую схему. Естественно нельзя говорить о полной идентичности их звучания. Но все же разработчикам порой удается достичь больших успехов в этой отрасли. Одной с самых известных компаний выпускающей такие программные копии является Arturia.
Об использовании виртуальных синтов в своих работах заявляли композитор Ханц Зиммер, рок-музыкант Трент Резнор, транс диджей и продюсер Армин Ван Бюрен и многие другие всемирно известные муз-деятели. В электронной музыке наблюдается тенденция того как VSTi вытесняет «железные» синтезаторы.
Естественно, существует очень большое количество виртуальных плагинов. Охватить хотя бы малую их часть крайне сложно. Самый известный зарубежный ресурс посвященный VST и VSTi – www.kvraudio.com. Также им посвящены некоторые специализированные издания, такие как Computer Music Magazine, Digital Music Magazine, Future Music. C рускоязычного сегмента можно отметить работы Романа и Юрия Петелиных — petelin.ru
Ниже представлен обзор 5 интересных на мой взгляд VSTi синтезаторов. К каждому плагину прилагаются аудио-дэмо выполненные вашим покорным слугой. В написании дэмо использовались только те синты, которые идут в обзорах, внешних обработок использовано не было.
Нужно напомнить, что запустить любой VSTi синт без программы-хоста невозможно. Для этого нужно воспользоваться любым музыкальным редактором: секвенсором с поддежкой VSTi, например Steinberg Cubase, Image Line FL Studio, Ableton Live, Cockos Reaper или другим. Для загрузки плагина выделяется отдельная дорожка на мультитреке и указывается папка с установленным синтом. Следует заранее устанавливать плагины в одну папку, обычно по умолчанию — это C:\Program Files\Vstplugins.
Sonic Charge Microtonic
Создан бывшим инженером Propellerhead Software Магнусом Лидстромом (Magnus Lidstrom). Интерфейс плагина попадает под все критерии того, что называют скандинавский дизайн — он аскетичен, но в то же время очень красив.
Microtonic представляет собой квазианалоговую драм-машину, то есть синтезатор для написания барабанных партий. Все звуки генерируются в реальном времени, а не являются семплами. В отличии от большинства программных драм-машин. Звук Microtonic достаточно специфичный, он не имеет ничего общего с живыми барабанами, впрочем, он достаточно интересен. Он получил большое признание у техно музыкантов из-за своей подчеркнутой синтетичности. По утверждению разработчика программы корнями Microtonic уходит в аналоговые драм-машины 70-х годов.
Здесь есть один осциллятор с тремя формами волны, генератор шума, несколько эффектов (модулятор, эквалайзер и дисторшн). Одновременно доступно 8 звуков, ритмичный рисунок каждого с которых пользователь «набивает» в пошаговый секвенсор в самом плагине. Синт имеет крайне низкую нагрузку на процессор.
Официальный сайт: soniccharge.com/microtonic
Впрочем, даже не имея этого плагина можно оценить как он звучит. Для этого достаточно зайти на онлайн-сервис Patternarium на soniccharge.com/patternarium. Здесь находится флеш анимация, которая при помощи алгоритмов microtonic автоматически создает непрерывный ритмичный рисунок.
Native Instruments Massive
Флагманский продукт компании Native Instrument заслужено является одним из самых популярных синтов в мире. Спектр его применения достаточно широк — это басы, лидирующие звуки, протяжные пады, секвенции и звуковые эффекты. За счет этого massive применим в широком диапазоне стилей. Впрочем, его изюминкой является создание басов.
По заявлениям разработчиков секрет звучания синта — высококачественный движок, позволяющий создавать весьма насыщенный звук.
Его интерфейс на первый взгляд кажется сложным. Тем не менее он интуитивно понятен. Состоит из 3-х вкладок, две с которых отвечают за навигацию пресетов — готовых настоек синта. Для работы с параметрами звука предназначена вкладка synth.
Основа синтеза — 3 осциллятора, содержащих большое количество аналоговых и цифровых форм. Также применим широкий спектр всевозможных фильтров и эффектов. Но главной особенностью Massive являются возможности его модуляции и синхронизации. Так, например, любой с параметров можно синхронизировать с любым другим параметром. Это обеспечивает очень широкие возможности звучания.
Плагин может достаточно сильно загружать процессор. На этот случай можно уменьшить параметры оверсемплинга — качества звука.
QuikQuak Glass Viper
Малоизвестный, но очень интересный, на мой взгляд, синт. Особенностью Glass Viper является сам способ синтеза — пользователь может сам рисовать форму осциллятора, в отличии от большинства аддитивных синтов, где формы осцилляторов неизменяемые. Также каждый с четырех осцилляторов можно обрабатывать отдельно, изменяя параметры огибающих, фильтров и питча, которые как и осцилляторы доступны в графическом виде.
Все эти манипуляции происходят в одном окне, которое является одновременно и осциллоскопом. С эффектов доступны качественные хорус, ревербратор и дэлай. Звук Glass Viper очень насыщенный, он обладает своеобразным эффектом движения.
Korg MS-20
Выпущен фирмой Korg, которая известна своим музыкальным оборудованием. В частности аналоговыми синтезаторами.
Плагин является программным эмулятором старого аналогового синтезатора Korg MS-20, выпускавшегося серийно с 1978 по 1983 годы.
Данный синт входит в пакет Korg Legacy, который также включает в себя еще несколько эмуляторов железной продукции Korg.
Интерфейс с схема плагина детально повторяет конструкцию своего предка. Правда, в отличии от него плагин полифонический, в то время как оригинальный MS-20 был строго монофоническим.
Здесь есть два генератора: первый может производить треугольную, пилообразную, импульсную формы волны и белый шум; второй — пилообразную, прямоугольную, импульсную формы волны и кольцевую модуляцию. Очень качественные фильтры с огибающими дают тот самый корговский звук, известный по синти-попу 80-х и ранней электронике.
Интересной особенностью, наследием оригинала, является большая коммутационная панель с 35 разъемами (джеками). Их можно использовать для соединения различных частей синтезатора, что отменяет внутренние соединения. Таким образом, можно получать как простые звуки с помощью внутренних соединений, так и сложные, чаще встречающиеся в модульных системах.
Благодаря усилиям разработчиков синт имеет очень аналоговое звучания со слегка металлическим оттенком крайне приближенное к оригиналу. Он является одним с лучших виртуальных эмуляторов существующих синтезаторов. MS-20 продается в составе korg legacy collection.
Lennar Digital Sylenth1
Очень популярный и высоко оцененный специализироваными изданиями виртуал-аналоговый синтезатор. Одним с основных его достоинств является крайне низкая нагрузка на процессор. Тем не менее, при этом он имеет очень качественный и насыщенный звук. Благодаря своему интерфейсу он крайне удобен в настройке. Основа — четыре осциллятора с восьмью формами волны с очень хорошим разрешением. Каждый с осцилляторов имеет 8-ми голосовую полифонию и унисон. В центре окна плагина размещены 8 эффектов: арпеджиратор, дисторшен, фазер, хорус, эквазайзер, дэлай, ревербратор и компрессор.
В комплекте к синту идет огромное количество пресетов. Подобно Massive он подходит для создания очень многих звуков. Конек Sylenth — полифонические лиды и пэды. Звучание Sylenth1 часто сравнивают с дорогим железным синтезатором Access Virus, популярным в электронной музыке.
Программирование&Музыка: понимаем и пишем 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-огибающую.








