Keywriter. Как это делалось

22nd Апрель 2009 | Метки:

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

Началось все много лет назад, когда мне в руки попалась славная программа SynthEdit Джефа Макклинтока. Честно говоря, тогда я совершенно не понял всего того потенциала, который в нее заложен, а стандартные примеры, которыми она оснащалась, энтузиазма не вызывали. В результате SynthEdit был благополучно забыт и долго пылился на задворках жесткого диска. А вспомнил я о нем лишь после того, как появился его конкурент — Synthmaker. К этому времени Интернет уже был хорошенько набит синтезаторами и эффектами, созданными в этих модульных станциях.

Скачав демоверсию Synthmaker, я поначалу пребывал в состоянии легкой эйфории. Красивый, современный, интуитивный интерфейс и обилие базовых элементов вызвали ощущение безграничности возможностей программы. Казалось, стоит только слегка разобраться в этом многообразии, и я быстренько заткну за пояс Native Instruments вместе со Steinberg. Я даже начал подумывать о покупке лицензии (это около $200). Однако дни шли, а ничего кроме стандартных осцилляторов, огибающих и эффекта частотной модуляции у меня не получалось. Эйфория сменилась прозрением: оказалось, что мне катастрофически не хватает фундаментальных знаний в области элементарной физики и математики, не хватает понимания тех процессов, которые я хотел эмулировать.

Желание создавать синтезаторы, правда, не пропало. И я углубился в Интернет с целью восполнить пробелы в знаниях. К сожалению, русскоязычный сегмент Интернета практически не содержит полезной информации. Все самое ценное хранится в англоязычных форумах и группах… вроде дело пошло, но этот новомодный Synthmaker стал все больше меня раздражать: DLL синтезатора пустого проекта занимает добрых 4 мегабайта (против 1 у SynthEdit), векторный интерфейс получаемых плагинов красив, но съедает прилично ресурсов (в синтэдите только битмапы, зато с альфа-каналом и с очень быстрой отрисовкой). К тому же лишь у SynthEdit оказался полноценный API, позволяющий писать любые модули, которых изначально нет в программе. Таких модулей в Интернете сейчас лишь немногим меньше готовых плагинов. Все это подтолкнуло меня к возврату к незаслуженно забытому инструменту.

Однако, с преамбулой я что-то затянул.

Итак. Ближе к делу. Для создания VST-версии печатной машинки мне понадобились следующие вещи: собственно идея, печатная машинка, фотоаппарат, микрофон, микрофонная стойка, микшер, Adobe Audition, Photoshop, Awave Studio и Synthedit.

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

Первым делом я устроил печаталке фотосессию. Фотографий было сделано десятка два.

Фотосессия «Эрики»

Фотосессия «Эрики»

Подобрав наиболее удачное изображение, его пришлось еще «пофотошопить»: с помощью инструмента Lens Correction исправить искажения линзы, сделав все линии параллельными, затем подрулить цветность и стереть оригинальные клавиши.

Следующим этапом была звукозапись. Для этих целей я выбрал Adobe Audition 1.5. Очень удобная в своем роде программа. Конечно, можно было воспользоваться и Wavosaur’ом, но в последнем нет модуля шумоподавления и возможности редактирования метаданных для семплера, о которым пойдет речь ниже.

Этап звукозаписи

Этап звукозаписи

Каждый звук, издаваемый машинкой, я тоже записал по нескольку раз, чтобы потом выбрать наиболее удачный. Также я записал несколько секунд «тишины» в качестве профиля для «шумодава». И все равно пришлось переписывать все еще раз, повысив чувствительность микрофона, т.к. на тихих звуках слишком сильно было заметно влияние шумодава. Компрессию звука я не применял, только шумоподавление и нормализацию.

Очистка и нарезка записанных звуков

Очистка и нарезка записанных звуков

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

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

Самое главное готово, осталось собрать это все в VST-плагин. В синтэдите есть замечательная штука SoundFont Oscillator, который позволяет использовать готовые банки звуковых таблиц, нужно только сделать этот банк. Можно воспользоваться стандартной программой Vienna SoundFont Studio, которой оснащаются все звуковые карты от Creative. Но у меня она отказалась запускаться. Снова покопавшись в Интернете, я остановил свой выбор на Awave Studio. В Awave оказалось довольно просто назначить полученные звуки конкретным клавишам и сохранить это все в нужном нам формате EMU SoundFont v.2.0 (SF2). Единственная сложность, возникшая на данном этапе, заключалась в том, что у каждого семпла должна быть заполнена мета-информация о ключевой ноте (root key), а по умолчанию всегда принимается C4, из-за чего звуки ресемплируются. Выставляется этот параметр в Audition в меню View / Wave Properties.

Настройка параметров семплов

Настройка параметров семплов

Ну, а дальше уже дело техники. Проект в синтэдите прост до безобразия (к слову, проект Organaut’а на порядок сложнее): SoundFont Oscillator, две ADSR-огибающие (для левого и правого каналов), chorus для имитации стереозадежки и дисторшн для усиления сигнала. Пришлось еще, правда, подредактировать визуальную тему, но об этом как-нибудь в другой раз.

Проект в SynthEdit

Проект в SynthEdit

Собственно все. Выбираем в меню Save As VST. Ставим галки, что нам нужен именно инструмент, а не эффект, и в закладке Embedded Files добавляем наш SF2 банк, чтобы он вкомпилировался в DLL-ку.

Итого: пол года вынашивания идеи и один вечер на реализацию. Сегодня я уже понимаю, что конкурировать с теми же Native Instruments (да и с конторами поменьше масштабом) в одиночку практически невозможно, но сделать что-то свое, оригинальное под силу каждому. Главное — идея!

Напоминаю, что скачать синтезатор можно тут:

Ну и бонусом к этой статье выкладываю тот самый SF2-банк :

  1. Gendos
    22nd Апрель 2009 в 10:46

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

    • 22nd Апрель 2009 в 13:07

      Ну сам я по конструированию звуков ничего не читал. Премудрости субстрактивного синтеза постигал в FL 3xSOC и, конечно, в SynthEdit. В нем же я расковырял и FM-синтез. В общем настоятельно рекомендую эту штуку. Это не только конструктор VST, но и замечательный исследовательский полигон: в нем есть различные средства анализа сигналов.

      А для общего развития рекомендую почитать: базу знаний Websound

  2. LXNDR
    22nd Апрель 2009 в 13:23

    я давно заметил что синтмэйкеровские плуги тяжёлые, новинки в нём сделанные у меня энтузиазма не вызывают и в моей коллекции их практически нет

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

    a AWave мощнейшая программка, конвертирует и читает чуть ли не всё, к тому же лёгкая, особенно когда портативная

    • 22nd Апрель 2009 в 13:42

      Я как-то не подумал о выходах) Это можно сделать.

      Ну и, конечно, они будут тяжелые. Хотя те же классические Superwave Pro и Superwave Performer вполне шустрые. В книге Дэйва Хаупта «Visual VSTi Programming» есть целая глава посвященная оптимизации synthedit’овских плагинов.

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

      • LXNDR
        1st Май 2009 в 23:25

        кстати справедливости ради надо сказать что Superwave Pro и Superwave Performer всё-таки продукт СинтЭдита, как в их About окне:
        «This product was developed exclusively with the SynthEdit development system and many thanks to Jeff McClintock for his kind assistance»

  3. 22nd Апрель 2009 в 20:59

    а я вот синтмейкером балуюсь(((

    • 23rd Апрель 2009 в 06:06

      Ну так это дело вкуса :)
      Мне он не подошел по ряду перечисленных причин. Зато синтмейкер может делать standalone-приложения, позволяет писать код прямо в проекте и обещает рекомпиляцию плагинов. Я же не говорю, что это плохой продукт.

      • 25th Апрель 2009 в 20:54

        а как насчет совместной разработки плагина? есть идея на этот счет, если интересно можем обсудить!!!

        • 27th Апрель 2009 в 06:25

          Только если это будет бесплатный плагин :)
          Я всегда за сотрудничество. Идей у меня тоже куча — проблемы только со временем. У меня сейчас в разработке сразу 4 оригинальных плагина.

          Но если что-то интересное предлагаете, могу что-нибудь подвинуть.

  4. kozak
    24th Апрель 2009 в 14:37

    Да, интересно, было почитать. А как насчет реактора? Была идея что-то соорудить на нем?

    • 24th Апрель 2009 в 14:52

      Стыдно признаться — никогда с ним не работал. Меня немного смущает тот факт, что для запуска сделанных на нем плагинов нужен… реактор :)
      В синтедите-то VST-шка получается. В любой DAW засовывай. К тому же shareware, ограничения минимальные: наличие надписи «synthedit» рядом с названием, максимум 16 пресетов и отсутствие возможности добавлять NAG-screen.

  5. 29th Апрель 2009 в 16:06

    Необычная идея. Поздравляю с успешной реализацией. На таких примерах понимаешь, что порой новое – это хорошо забытое старое.

  6. gt
    8th Май 2009 в 19:46

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

  7. gt
    11th Май 2009 в 12:46

    Большое спасибо, надеюсь не только мне будет полезно.
    Не нашел Русского хелпа или мануала по синт эдиту, он вообще существует ?
    Если нет, возможно найду время для перевода.

    • 11th Май 2009 в 13:04

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

  8. gt
    13th Май 2009 в 12:56

    Появился вопрос, как лучше организовать ручку выходной громкости ?
    Если подцепить к VCA volume, то нота играется после того как клавиша отпущена.

    • 13th Май 2009 в 13:34

      Я делаю так:

      На самом деле ADSR тут не обязателен: его вполне можно убрать. Но я, обычно, оставляю. Тогда можно, например, Decay регулировать. Ну или полноценно огибающую.

  9. gt
    13th Май 2009 в 14:35

    Спасибо, работает !

  10. gt
    14th Май 2009 в 21:17

    Еще вопрос, если не затруднит, как можно реализовать воспроизведение не с начала сэмпла, а с позиции заданной ползунком?

  11. gt
    15th Май 2009 в 10:18

    Он играет свой файл, мне нужно ирать аудио которое подается на вход, спасибо за вектор, буду искать.

    • 15th Май 2009 в 11:06

      Эм… не понял, а как ты собираешься разделять вход? Я вижу только один способ — создать фиксированный буфер, заполнять его входящим сигналом, а уж затем резать. Но такой модуль мне не известен. Подсказка: тут можно попробовать поизучать SDK.

  12. gt
    16th Май 2009 в 16:58

    Действительно ерунда какая-то, не подумал.
    У меня по какой-то причине на выходе моно, хотя скармливаю стерео sf2, я могу тебе выслать проэкт? ты наверно сразу найдешь мою ошибку.

  13. gt
    18th Май 2009 в 14:20

    Выслал на мыло,
    вообще, субъективно, звук «мылится», это особенности синтмейкера или я накосячил ?

    • 18th Май 2009 в 14:53

      Хм. Пока вижу только один момент, но не принципиальный: вполне можно обойтись одним ADSR, и его Signal Out отправлять на оба VCA.
      По поводу замыливания ничего сказать не могу, т.к. Вы не приложили SF2-шку :)
      Но попробую предположить, что проблема в настройках синтэдита: скорее всего у вас стоит 22кГц (значение по умолчанию)

  14. gt
    18th Май 2009 в 21:36

    Спасибо, с ADSR так и поступил, да про банк, не подумал ),
    в настройках поставил 44,1, и выплыл еще один момент прыгает атака при нажатии, это ручка громкости, после уровень приходит в должное состояние, если выкрутить в ноль, то звук проходит(!) с уровнем сэмпла, те overal level на adsr влияет только на атаку!
    Хочу поделится своими соображениями по созданию sf2 банка, маппинг удобно делать в полноценном сэмплере, например контакте, наглядно и быстро, а после можно конвертирвать с помошью CdXtract в sf2.

    • 19th Май 2009 в 06:15

      Так-с. Давайте еще раз: высылайте проект и банк — погляжу. Что-то ерунда какая-то творится.
      А для создания банков я использую Awave, потому, что «родная» Vienna SoundFont Studio к железу привязывается.

  15. gt
    19th Май 2009 в 09:15

    Выслал. С уровнем я вчера, что-то не так включил, сейчас собрал заново уже лучше, но все равно атака прыгает, у сэмплов она не такая и в нулевом положении ручки уровня звук проходит (

  16. gt
    22nd Май 2009 в 10:00

    Не хочу показаться назойливым,
    есть ли какой-то прогресс по файлам, что я выслал ?

    • 22nd Май 2009 в 10:31

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

      Значит что я вам скажу, любезный, вы столкнулись с типичной проблемой SF2 — завышением уровня. Встроенный в FL проигрыватель саундфонтов тоже изрядно перегружает. Лечится это уменьшением громкости, только и всего. Для этого в свойствах Slider’а, который регулирует громкость подберите такое значение Max, при котором перегруз не возникает.

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

  17. gt
    22nd Май 2009 в 11:33

    Простите вместо проэкта dll запихал в архив ( выслал повторно.
    Значение Max это Hi Value ?

    • 22nd Май 2009 в 13:43

      Да, это оно.

      Но я вот еще что заметил: вы на Overall Level у ADSR вешает и регулятор и Velocity. Их значения суммируются, отсюда и перегруз. Вы бы лучше тогда регулятор вторым каскадом делайте через VCA.

      Так, еще при соединенном Patch к Soundfont Oscillator соскакивает номер программы (наверное потому, что он в банке под номером 2, а не 1). Связь я разорвал, выбрал вручную — бубнит нормально.

  18. gt
    22nd Май 2009 в 15:29

    вас не затруднит скриншот на правильный коннект, не понятно:
    «регулятор вторым каскадом делайте через VCA»

  19. LXNDR
    29th Май 2010 в 15:54

    zipp, ты не мог бы объяснить смысл, с одной стороны, двух огибающих громкости и двух усилителей вместо одного, и с другой – наличия модулей огибающих в твоём проекте в принципе?

    • 30th Май 2010 в 16:55

      Все просто: отдельные огибающая и усилитель для левого канала и отдельные для правого. А с помощью огибающих, в данном примере, я регулировал velocity.

      • LXNDR
        30th Май 2010 в 21:05

        а в чём преимущество подключения велосити к усилителю через огибающую? без огибающей она ведь тоже работает

        • 30th Май 2010 в 21:31

          Да, работает. Просто без огибающей зацикленные семплы будут звучать бесконечно (ну, т.е. не совсем бесконечно, а пока есть свободные голоса).

          К тому же у меня выработалась привычка всегда ставить огибающую еще потому, что если вместо SoundFont Oscillator (Sample Oscillator) используется обычный осциллятор, то он тоже будет генерировать вечно, что не очень удобно.

          Ну и такие плюшки как редактирование атаки, удержания и спада нужны почти всегда, кроме варианта с пишущей машинкой :)

          И последнее. SoundFont Oscillator уже переведен в разряд устаревших модулей. Вместо него теперь рекомендуется использовать Sample Oscillator. Он тоже воспроизводит файлы SF2 и WAV, но теперь правильно трактует громкость семплов и имеет несколько режимов оверсемплинга.

          Вообще этот модуль появился еще в версии 1.1, но в 1.183 наконец-то научился играть встроенные в DLL-ку файлы.

  20. LXNDR
    31st Май 2010 в 16:45

    ну для регулировки это конечно само собой разумется, cпасибо за разъяснение

    а SoundFont Oscillator не умеет проигрывать голые wav файлы, правильно? и если судить по названию

Страницы комментариев