Developing a DAW is an extensive and demanding task requiring a large team of specialized people working together. This article will cover the steps to follow and the best tools and abilities you should master to develop a DAW successfully.
A DAW (Digital Audio Workstation) is a software application used to record, edit, and produce audio. It is a powerful tool widely used for making music, podcasts, radio shows, and almost every task that includes digital audio.
So How To Develop Your Own DAW Software?
Developing a DAW requires a lot of expertise in different areas such as programming, coding, graphic designing, digital audio, and DSP among others. Understanding how it works, what musicians and audio technicians need, and how digital audio works is essential in order to create a DAW.
Disclaimer: Take this guide as an informational source to gather a general idea of developing a DAW, which tools you need, and what you need to know first, rather than as a complete guide.
Related Readings:
Cost of Developing Audio VST Plugin: Several Factors (With Table)
What Is a Digital Audio Workstation (DAW)? How Does It Work?
How To Make Music Without Using A DAW?
What’s The Most CPU Efficient DAW? – 5 DAWs Compared
Logic Pro X Review: Is It Worth It? (Cons & Pros)
What Abilities Does Developing a DAW Requires?
These are the abilities you, as a developer, are required to learn:
Audio
Developers should be familiar with audio flow and routing. Most DAWs tend to remain akin to analog consoles. That’s why an audio engineer will usually be a part of the team to advise about routing.
Coding
A DAW is an application made up of codes and algorithms. Multiple coders are going to be working together at the same time to accomplish different goals. One could be writing the display section to draw soundwaves as you record, while another one could be working on the audio engine and so on. We have listed some of the most recommended tools for programming and compiling the code of a DAW:
- Microsoft Visual Studio
This is an integrated development environment (IDE) that can be used to create applications, web pages, and services. This environment is where you will develop the coding and programming part of a DAW. A lot of programmers prefer this software due to its debugging tools as well as the testing platform. Visual Studio is compatible with most major programming languages. However, we advise you to work with C++ as it is a universal language and facilitates communication among the team members.
A brief introduction to Visual studio can be found here:
Visual Studio Code Tutorial for Beginners — Introduction
- Xcode
This IDE is ideal for developers wanting to create an Apple-exclusive DAW. It is not a huge limitation because some of the most popular digital audio workstations, such as Logic Pro, are only available on the macOS. You can find a lot of the features found in Visual Studio here. Hence, both are great IDEs but have different approaches.
Using Xcode segments the market for the DAW, which may or may not be a good thing, depending on what the developer aims for. Xcode is a good alternative for large teams because it allows programmers to compare two versions of a source code in real-time.
Xcode Tutorial for Beginners — (using the new Xcode 11)
- JUCE/Traction
JUCE is an open-source IDE used for developing applications. It has a wide fanbase among VST plugin developers due to its functionality and integration with audio signal development. Traction, a DAW that uses JUCE, released its codebase for people to experiment with and use as a DAW-developing starting point. So, even though there are arguably better alternatives, it is still a much-favored choice among developers.
Learn more about Tracktion here:
Juce Tutorial 43- Tracktion Engine Intro (Create your own DAW!)
Download the codebase here. Using this codebase can be an excellent opportunity for developers to see how the insides of a DAW look.
- GUI
Knowledge in graphic design and GUI development plays a significant role in any software development project. Creating the graphical user interphase requires a lot of effort and creativity. For this task, both programmers and designers must work together.
Some tips on how to develop a better GUI can be found in this video:
9 Tips for Becoming a GREAT UI Designer
- Digital Signal Processing
Digital signal processing is the use of digital processing to perform a wide variety of signal processing operations. DSP takes digitized real-world signals like audio, video or temperature, to manipulate them. A DSP is designed for performing mathematical functions like “add,” “subtract,” “multiply,” and “divide.” In addition, developers must also know about Analog-to-Digital conversion, which is a very vast topic that includes hardware and software development skills.
What is DSP?
What is DSP? Why do you need it?
Information about Analog to digital conversion as well as DSP can be found in this article.
- VST
Both DAW and VST have many similarities because they’re both software applications that deal with audio. We suggest getting started with developing plugins or VSTs to get familiar with Digital Signal Processing.
Related Readings:
Top 10 DAW Software For DnB, House, EDM, Rock, Metal, Hip-Hop
What Are The Best Tools To Develop VST Plugins & How Are They Made?
FL Studio vs. Ableton vs. Logic vs. Cubase vs. Pro Tools Which is Best ?
Is Ableton Really Worth The Money? (Should I Buy It?)
Steps On How To develop a DAW
The steps to develop a DAW are similar to any other application. In this section, we are going to make a list and explain what those steps consist of:
- Concept
Every project begins with an idea or a concept. Having a clear idea of what you want to develop is the first step to a successful project. It is essential to set objectives and answer questions like, “What kind of DAW am I going to develop? What kind of producers should I aim for? What will be special about my DAW?” Such an interrogative thought process is necessary to set the basis for the project.
When developing a DAW, it’s important to define what the main features are going to be. Perhaps music production? Recording? Mixing? It is better to focus on one thing and do it well.
- Sketch
The second step is sketching. It is vital to illustrate digitally or on paper how the DAW is going to look. How is it going to work? Where are the primary tools going to be placed? Sketching is essential because it allows the developers to lay down the foundation for the structure of the DAW. When making a sketch, it is helpful to add drawings and comments to point out the most critical parts, ideas, possible modifications, etc.
- Research
You must research to have a successful project. This step is vital and involves questions like:
- Who are the competitors?
- What are the needs of the customers?
- What business plan are you going to follow?
Regarding digital audio workstations, it can be a good idea to check out the most popular DAWs like Pro Tools, Logic Pro, FL Studio, Ableton Live, REAPER, and Cubase, as well as some open-source projects like Ardour and LMMS. Developers must be aware of the competition — finding their strengths and weaknesses will help your team develop a better DAW. Doing this kind of research will save a lot of time in the upcoming stages, as well as in helping the team avoid mistakes.
- Mockup
Creating mockups helps the whole team understand how the program is going to look. Mockups should try to be accurate because they will serve as the inspiration for the final look of the DAW. At this stage, we advise you to focus on the GUI layout rather than finer details such as colors and the exact positioning of items.
- Programing
This stage is probably the longest and most demanding development stage of every DAW. A lot of time must be spent in the programming and coding process because this is where the tools, processes, and functionalities will be developed. For this task, any of the IDEs mentioned above are going to be helpful. Additionally, using the programming language C++ can be the best choice.
You can learn about C++ in this video:
- Graphics
The graphics are one of the main features of an application. For example, how the app looks will determine how the users will interact with the DAW and what they will see using your application. At this stage, looking at other DAW GUI can be helpful to find inspiration as well as getting an idea of where you should locate essential tools like the mixer, FX window, transport, etc.
Working with experienced designers can make the difference between a successful and a failed app.
- Testing
Testing and finding bugs is important for any application software. Fortunately, some IDE, like Visual Studio, have tools for identifying bugs and fixing them. However, it is crucial to test the DAW in a real-life situation as well.
Testing is a stage that will have to be repeated multiple times in the development process. In general, you will ask both professional testers and the general public (referred to as beta testers) to use your DAW for some time and share feedback or report bugs. Since many people will be involved in the beta testing stage, it also doubles as a marketing strategy.
- Launching
Once all of the steps mentioned above are accomplished, it is time to finalize the project for launch. It’s worth noting that a launch date is generally determined about halfway through the development process for the marketing department to start promotion.
Once the DAW is released, the maintenance stage begins; programmers must keep working on fixing possible mistakes or bugs that the users will find in the initial days of usage. Also, updates should be released periodically so that the DAW doesn’t feel old and adapts to the ever-expanding world of technology.
Keeping the DAW updated as well as reviewing feedback from the users to fix developing mistakes must be a recurring task.
- Marketing
As mentioned before, you should have a marketing plan in the early or middle stages of a project. It is the most vital stage for a successful app or, in our case, a DAW as it will determine the number of sales the DAW will get.
Creating a website, releasing betas or demos, and publishing advertisements will generate anticipation among potential customers. In our current era, digital marketing and social media ads are potent tools for any release.
Some tips for an app release can be found in this video:
How To Market Your App In 2020
Conclusion
A DAW is a versatile tool that needs a lot of effort and knowledge to be developed. If you are interested in the field, we suggest first learning plugin development to get familiar with audio-based software before tackling full-fledged DAW software.
As with any creative work, experience helps you get better at coding itself, coordinating your team effort, and developing hype for your software. Consider watching tutorial videos, reading books, and reviewing articles on various audio software to understand where the general public stands on the major software releases.
Started as a rapper and songwriter back in 2015 then quickly and gradually developed his skills to become a beatmaker, music producer, sound designer and an audio engineer.
Общий музыкальный
Профиль
Лента
Друзья, коллеги, приветствую!
Блог создан, исходя из недавней темы https://promodj.com/forum/common/1151642/Nebolshoy_vopros_na_interesnuyu_temu , там имеется вводная часть.
Оформлена и готова, нулевая часть проекта. В целом, так как она нулевая, смотреть там особо и не на что, но в данном фундаменте заложен ряд базовых очень важных концепций, которые можно и важно обсудить. Снизу будут размещены скриншоты, для понимания сейчас и их достаточно, но желающие могут скачать архив по ссылке снизу. В архиве две версии
win32 и win64. В качестве рабочего названия, решил обозначить проект как JStation.
Итак, перечислю вышеуказанные концепции:
— Система плавающих окон и поддержка мультимониторности (имеется в виду дисплей)
— Архитектура интерфейса
— Система компонентов среды DAW
Теперь подробнее:
Система плавающих окон и поддержка мультимониторности
Практически все окна (формы) в программе имеют одинаковое представление и поведение. Центральная палитра программы имеет три зоны, к которой могут липнуть окна, слева, справа и в центре. Также окно можно вытащить из данных зон и оно приобретет свободноплавающий вид. Что будет в этих окнах, собственно весь функционал и привычный и непривычный. Окно секвенсора проекта также будет таким же окном с таким же поведением, можно разносить окна по разным мониторам, что очень удобно, если рабочее место имеет более одного монитора. Микшер, например, точно также, пианоролл — туда же. Т.е. все что будет в визуальных окнах DAW будет обладать описанным поведением. Перетаскиваем окно обычным образом, при этом либо делаем его свободноплавающим, либо прикрепляем к определенной зоне, сместив влево, вправо или к верху. При нажатии кнопки фиксатора в правом углу окна, форма закрепляется и автоматически не будет скрываться. Текущая конфигурация запоминается и будет восстановлена при перезапуске. В общем и целом, система направлена на то, чтобы каждый пользователь мог исходя из собственных удобств и конфигурации оборудования настроить среду удобно под себя.
Архитектура интерфейса
В целях увеличения вертикального пространства, главное меню вынесено в панель слева и
имеет кнопки с пиктограммами. Все главные функции, Открыть проект, Сохранить и т.п.
вынесены в отдельные кнопки для быстрого доступа, остальные функции доступны в виде
контекстного всплывающего меню, активация данного меню по самой нижней кнопке в меню.
Если какое-либо окно было закрыто, получить к нему доступ
можно из соответствующего пункта меню.
Система компонентов среды DAW
Программа имеет API для сторонних компонентов от независимых разработчиков. Компонент
похож на тот же обычный плагин, но имеет другое предназначение. Плагин работает с
аудио либо миди потоком и работает в достаточно изолированной среде. Компонент приложения
работает на уровне самой программы и ему предоставляются богатые возможности. Компонент
может создавать, открывать, закрывать миксы. Воздействовать на содержимое микса.
Т.е. компонент работает структурно вместе с DAW и дополняет ее возможности. Что-то
похожее сейчас реализовано во многих DAW через технологию ARA, но там также имеется
множество ограничений. В качестве первого компонента, реализован компонент JPluger.
Данный компонент может открыть любой плагин (в зависимости от версии win32 и win64) с
обзорной целью. Можно посмотреть вид плагина, послушать звуки и т.д.
Вот, вкратце, ряд фундаментальных частичек проекта. В следующей части будет реализован
аудио движок программы, компонент JPluger начнет издавать звуки от плагинов.
Присоединяйтесь, пишите, предлагайте. Все мнения будут учтены!
Ссылка на релиз программы: http://hw.h1n.ru/jstation.zip
Скриншоты:
Время на прочтение
3 мин
Количество просмотров 3.1K
В прошлый раз мы говорили о библиотеках для отрисовки графических интерфейсов плагинов DAW. Сегодня покажем пару программных инструментов, которые позволят настроить полноценную цифровую звуковую станцию.
VСV Rack
Это — модульный синтезатор с открытым исходным кодом (лицензия GPLv3), эмулирующий работу физических устройств формата Eurorack. Этот формат был разработан еще в 1996 году немецким производителем акустического оборудования Doepfer. Каждый модуль представлял собой отдельное устройство для обработки звука со множеством тумблеров и переключателей. Для управления сигналами использовали TRS-разъёмы («джеки»), которые перетыкали между гнездами. В каком-то смысле подход напоминал ручные коммутаторы на самых первых телефонных станциях. Аналогичный принцип заложен в основу VСV Rack, только пользователь «перетыкает» виртуальные провода.
Что умеет. На официальном сайте представлено множество модулей — секвенсоры, миксеры, конструкторы параметрических фильтров и матричные коммутаторы. Большинство из них платные (порядка $30), но есть и свободно распространяемые — например, фильтры и модуляторы от Mutable Instruments. При необходимости можно разработать собственный модуль — для этого должно хватить знания C++.
Недостатки. Пользователи отмечают, что инструмент порой работает нестабильно, а на выходе синтезатора присутствуют посторонние шумы — проблему решают перезагрузкой системы. В каком-то смысле к недостаткам можно отнести желание разработчиков эмулировать работу Eurorack. Хотя это и добавляет определённый шарм, начинающему музыканту или звукорежиссеру может быть сложно ориентироваться в обширной библиотеке модулей.
Как начать знакомство. Хорошими отправными точками станут репозиторий на GitHub с исходниками и официальное руководство от разработчиков, где разобраны ключевые модули и элементы меню. Также на сайте есть пошаговая инструкция по разработке собственных плагинов. Обсудить инструмент можно на тематических форумах, где энтузиасты выкладывают музыку, написанную на VCV Rack. Например, вот кавер на альбом английской группы Emerson, Lake & Palmer — «Trilogy».
Для его реализации потребовались десятки модулей и сотни виртуальных проводов — вот как это выглядит. Также инструментом часто пользуют начинающие инди-музыканты, которые выкладывают оригинальные работы на видеохостинги.
Tracktion Engine
Это — набор моделей и классов на языке C++ для построения аудиоприложений: от простых секвенсоров до полноценных DAW. Этот проект — результат трехлетней работы по рефакторингу движка цифровых звуковых рабочих станций от одноименной компании. Одним из разработчиков инструмента выступил Джулиан Сторер — автор языка программирования SOUL, о котором мы говорили в прошлом материале.
Что умеет. Tracktion Engine поставляется как модуль для фреймворка JUCE, заточенного под создание GUI мультиплатформенных аудиоприложений. Среди возможностей стоит выделить корректировку звука по кривым темпа, тональности и тактового размера, наличие режимов звукозаписи с послойным наложением (overdub) и поддержку MIDI с квантованием и генерацией шаблонов. Инструмент также умеет работать с форматами VST, VST3 и AU.
Недостатки. Новичкам может быть сложно влиться в работу с Tracktion Engine, поскольку он требует углубленных знаний C++. В то же время один из резидентов Hacker News заметил, что инструмент использует форк бесплатной библиотеки SoundTouch для тайм-стретчинга, а у неё возникают акустические артефакты при работе с оконными функциями.
Как начать знакомство. Ресурсов по теме достаточно мало — основная информация представлена в виде кратких текстовых руководств. Также разработчики выложили несколько обучающих видео на YouTube, но они ограничились лишь демонстрацией процессов автоматизации паттернов и синхронизацией пары лупов.
Дополнительное чтение в нашем мире Hi-Fi:
-
Что послушать, когда пишешь код: бесплатные миксы и эмбиент-плеер
-
Как писать музыку на Python — помогут три тематические библиотеки
-
Где послушать ZX Spectrum, ПК Искра-1030 и старые бытовые приборы
-
Влиться в муз. программирование — языки, которые помогут это сделать
У нас на Хабре — обсуждаем муз. программирование, звуки ОС и другие находки.
Чтобы создавать музыку на компьютере, недостаточно таланта и инструментов — необходима также специальная программа для записи и сведения дорожек. Лайфхакер рассмотрел девять популярных DAW и готов о них рассказать.
Выбор программной среды для записи и редактирования музыки — сложный и индивидуальный вопрос. Универсальных рекомендаций быть не может: достойное качество звука способна выдавать каждая программа из подборки, все они предлагают примерно одинаковые функции и имеют схожий интерфейс. Тем не менее они совсем не одинаковы, а поиск идеальной DAW может занять годы. В этой статье мы рассказываем, чем примечательна та или иная программа для записи музыки, и надеемся, что это сэкономит вам немного времени.
Для начала раскроем смысл нескольких терминов, которые будут часто встречаться в этой статье:
- DAW (секвенсор) — программная среда, в которой происходит запись и редактирование музыки.
- VST, VSTi, AU, AAX, RTAS — форматы плагинов — дополнительного ПО, позволяющего добавлять в DAW новые виртуальные инструменты или эффекты обработки.
- MIDI — в контексте статьи это внешние источники звука: клавиатуры, пэды, контроллеры.
- Piano roll — область редактирования партий виртуальных инструментов. На piano roll рисуются ноты, обозначается их длительность и громкость.
1. Ableton Live
Платформы: Windows, macOS.
Стоимость: от 79 евро за версию Intro до 599 евро за набор Suite при единоразовой покупке.
Для кого: для электронщиков. Особенно тех, которые играют вживую.
По данным опроса, проведённого изданием Ask.Audio, Ableton Live в 2015 году обогнал все остальные секвенсоры: 23,14% опрошенных признались, что используют его в качестве основной DAW-программы.
Ableton Live сочетает в себе качества классического секвенсора и контрольной станции для живых сетов. За эти две роли отвечают два режима отображения: Arrangement View для аранжировки и сведения и Session View для импровизаций и диджеинга.
Arrangement View напоминает интерфейс большинства других секвенсоров, но с важным преимуществом: в рабочей области мы видим только самое необходимое. Панель, не перегруженная кнопками и регуляторами, хорошо рассматривается даже на экране 13-дюймового ноутбука, а минимальные навыки владения программой приобретаются интуитивно.
Разработчики занимаются не только Live: так, они выпустили вторую версию контроллера Ableton Push (созданием первой занималась Akai), а также создали протокол синхронизации Ableton Link, который многие предпочитают устаревающему MIDI Sync, привязанному к отношениям Master / Slave. Всё это создавалось с расчётом на использование в связке с секвенсором: Ableton Live отлично взаимодействует с MIDI и интегрируется в живые наборы.
В Ableton также удобно работать с сэмплами и лупами, настраивать автоматизацию и накручивать плагины. Им пользуются многие известные артисты, например M83, kedr livanskiy и известный музыкальный блогер Эндрю Хуан (Andrew Huang).
Ableton Live →
2. Logic Pro X
Платформы: macOS.
Стоимость: 14 990 рублей. Также поставляется некоторым группам населения в комплекте программ для образования за 13 990 рублей.
Для кого: для маководов, которым тесно в рамках GarageBand.
Logic Pro X — серьёзный «яблочный» секвенсор, и переход на него — естественный эволюционный этап после работы в GarageBand. Секвенсор имеет ряд преимуществ, важнейшим из которых является принадлежность к экосистеме Apple. Всё, что работает с macOS, работает и с Logic. Дополнительное удобство обеспечивает использование сенсорной панели и iOS-устройств для удалённого контроля.
VST не поддерживаются — использовать можно только AU-плагины. Впрочем, многие отмечают, что на борту Logic Pro X уже есть все инструменты и эффекты, которые только могут понадобиться. Особенных похвал удостаивается трек Drummer — симулятор виртуального барабанщика.
Из минусов программы можно отметить высокую стоимость и рабочую область, которой неудобно пользоваться на небольших экранах. Несмотря на недостатки, Logic Pro X можно обнаружить почти в любой серьёзной студии звукозаписи, а пользуются ей десятки знаменитых артистов и групп. Среди них Disclosure и Foster the People, также в своей любви к секвенсору признавался, например, Антон Севидов из Tesla Boy.
Logic Pro X →
3. Avid Pro Tools 12
Платформы: Windows, macOS.
Стоимость: Pro Tools First доступна бесплатно, стандартная Pro Tools обойдётся в 24,92 доллара в месяц при покупке годовой подписки, а версия для профессионалов Pro Tools HD стоит 999 долларов в год.
Для кого: для владельцев определённых аудиокарт, которые стремятся выжать максимум из своего железа и знают, чего хотят.
Пожалуй, самый серьёзный секвенсор из представленных в подборке. Серьёзность Pro Tools обеспечивается не только обилием функций, но и богатой историей: первая версия программы вышла в 1991 году, имела четыре дорожки и стоила 6 000 долларов. Интерфейс её тогда сильно повлиял на то, какими мы видим секвенсоры сейчас. Первой песней на верхних строчках чартов, сделанной в DAW-программе, была работа Рики Мартина Livin’ la Vida Loca, сведённая в Pro Tools в 1999 году.
Преимущество Pro Tools — взаимодействие с аудиоинтерфейсами из списка сертифицированных устройств частным образом. Это позволяет достичь максимума производительности. Данное преимущество оборачивается и недостатком: использование HD-версии Pro Tools с несертифицированным железом чревато дополнительными багами и лагами. Pro Tools создаёт впечатление модульной рабочей станции: программа требует определённого железа, а некоторые пользователи рекомендуют выделять под DAW отдельный компьютер.
В программу вшит достойный набор инструментов и эффектов, она хорошо работает с MIDI и живым звуком. Спектр возможностей этой DAW широк, и на разбор всех функций может уйти много времени даже у уверенного пользователя секвенсоров. Новичкам Avid предлагает бесплатную First-версию с возможностью записи 16 дорожек.
У секвенсора есть проблемы с интеграцией VST, но он хорошо работает с AAX- и RTAS-плагинами. Как и Logic Pro X, программой Pro Tools пользуются звукорежиссёры многих профессиональных студий.
Avid Pro Tools →
4. Image-Line FL Studio 12
Платформы: пока только Windows. Версия для macOS находится в режиме тестирования, но запустить программу можно с помощью Boot Camp. Есть приложения для iOS- и Android-устройств.
Стоимость: от 99 долларов при единоразовой покупке.
Для кого: для электронщиков и битмейкеров, работающих на Windows.
Image-Line FL Studio 12 — один из самых любимых секвенсоров у тех, кому нравится сочетать сэмплы и партии инструментов, но не хочется утруждать себя глубинным погружением в механику DAW-программ. Путь от включения секвенсора до сохранения проекта у FL Studio, пожалуй, самый короткий, а чтобы набить простейший бит, можно вообще не обладать какими-то навыками.
Интерфейс FL Studio действительно отличается от внешнего вида других секвенсоров, но при этом программа обладает всеми необходимыми функциями. FL Studio пользуются многие известные артисты, в том числе Мартин Гаррикс, Avicii, Tyler, The Creator или музыкант-видеоблогер Enjoykin.
Здесь крайне неудобно осуществлять живую запись, но легко работать с композицией трека, сэмплами, MIDI, VST и набивать ноты в piano roll. В комплекте с полной версией программы идут инструменты и эффекты, некоторые из них заслуживают отдельного внимания. Например, Gross Beat, с помощью которого можно накрутить тремоло и сумасшедшие глитчи, или насыщающий и уплотняющий микс Soundgoodizer, ставший мемом в среде пользователей FL Studio.
Важное преимущество для тех, кто предпочитает пользоваться легальным софтом: за FL Studio придётся заплатить всего один раз, после чего все обновления будут доступны бесплатно.
Image-Line разработала и мобильные версии секвенсора для iOS- и Android-устройств. Проекты оттуда можно экспортировать в полноформатную FL Studio.
Image-Line FL Studio →
5. Steinberg Cubase Pro 9
Платформы: Windows, macOS, iOS (только iPad).
Стоимость: процесс покупки на официальном сайте очень неудобен. Необходимо сначала купить младшую версию программы Cubase Elements, после чего заплатить за апгрейд. Cubase проще приобрести у российского дистрибьютора «из коробки», стоимость в этом случае начинается примерно с 5 000 рублей за Cubase Elements 9 и заканчивается 27 000 рублей за Cubase Pro 9.
Для кого: для тех, кто ищет достойный и шустрый секвенсор без лишних наворотов.
Ещё одни ветераны звукозаписи — Cubase и Nuendo от Steinberg. Программы написаны на одном движке и похожи друг на друга, но первая — так исторически сложилось — пользуется большей популярностью у музыкантов. Именно Steinberg стояла у истоков технологий, без которых трудно представить современный секвенсор: временной варпинг (возможность растягивать звуковые фрагменты с сохранением тональности), VST- и VSTi-плагины.
Долгие годы Cubase не сходит с лидирующих позиций в списках популярных DAW-программ. Продуктами от Steinberg пользуются Chvrches, Dub FX, New Order и даже Ханс Циммер с Игорем Матвиенко.
Немаловажный плюс Cubase в том, что как оболочка она не тормозит даже на слабых компьютерах. В остальном программа похожа на классический секвенсор с набором необходимых инструментов, эффектов и интуитивно понятным управлением. Правда, многие считают его неудобным из-за множества рабочих областей, открытых одновременно.
Помимо полноформатной версии, есть урезанные варианты секвенсора для iPad.
Steinberg Cubase →
6. PreSonus Studio One 3
Платформы: Windows, macOS.
Стоимость: версия Prime бесплатна, Artist стоит 6 240 рублей, Professional — 25 151 рубль.
Для кого: для тех, кому писать музыку интереснее, чем ковыряться в программах.
Одна из самых молодых DAW-программ и мой личный фаворит — Studio One. В интерфейсе секвенсора — логика и удобство. Неплохие встроенные эффекты, возможность сосредоточить всё управление на одном экране (как и оставить одни дорожки), корректная работа с MIDI и удобная запись живых инструментов — это реализовано в Studio One так, что им приятно пользоваться. Отвлекаться на технические заморочки в процессе почти не приходится, достаточно включить Studio One и начать творить.
Секвенсор подступает к верхним позициям DAW-рейтингов, но ещё не готов сравниться с мастодонтами ни по популярности, ни по количеству предложенных инноваций. Но его достоинства отмечают композиторы, диджеи и авторы музыки для кино и рекламы, а гитарист On-the-go Максим Макарычев признался, что считает Studio One куда более хорошим, чем Logic.
Помимо того что в Studio One всё работает как надо, особенных преимуществ секвенсор не имеет. Можно отметить функции Track Management или Scratch Pad. Первая позволяет настроить отображение данных о треке и сохранить в пресет, а вторая — создать быстрые черновики на дополнительном экране, чтобы узнать, как те или иные изменения повлияют на дорожку.
Из минусов секвенсора можно отметить не самый удобный piano roll и необходимость использовать с программой достаточно большой монитор — иначе вся тирада об удобстве Studio One теряет смысл.
PreSonus Studio One →
7. Propellerhead Reason 9.5
Платформы: Windows, macOS.
Стоимость: 369 евро при первой покупке или 129 евро за апгрейд с версии 9.0.
Для кого: для тех, в ком живёт не только музыкант, но и инженер, любящий разбираться в сложных системах.
Reason всегда стоял особняком: интерфейс секвенсора выглядел гораздо сложнее, чем привычный набор дорожек, а сама программа не поддерживала плагины и запись звука.
Сейчас всё изменилось. Propellerhead внедрила в продукт все ключевые навыки современных секвенсоров, сохранив при этом предыдущие достоинства программы. Основное отличие Reason от других станций — то, что она не прячет механику происходящих процессов и настроек. Синтезаторы, сэмплеры, процессоры и микшеры выбираются на панели, напоминающей рэковую стойку (проще говоря, шкаф с оборудованием), и соединяются между собой виртуальными кабелями.
Предыдущие версии программы использовались в связке с другими DAW и VST, в которых можно было применять настройки рэковой стойки Reason. Новейшая версия секвенсора — самодостаточный продукт, подходящий для записи музыки и поддерживающий работу с протоколом Ableton Link.
Всё это делает Reason немного странным, наиболее сложным, но, возможно, самым интересным из представленных секвенсоров.
Propellerhead Reason →
8. GarageBand
Платформы: macOS, iOS.
Стоимость: бесплатно.
Для кого: для владельцев компьютеров Apple, предпочитающих не заморачиваться с поиском, покупкой и изучением сложных программ.
GarageBand — упрощённая версия Logic Pro X, которую не стоит недооценивать. Возможно, секвенсор отстаёт от полноформатных станций по техническим характеристикам, но появление GarageBand — важное событие в мире любительской музыки. Теперь качественную музыку может создавать любой владелец «яблочного» гаджета, вне зависимости от навыков работы с DAW-программами и наличия знаний о звукорежиссуре.
Не стоит сравнивать GarageBand с программами для создания дилетантских поделок от eJay: здесь приходится сочинять, а не комбинировать готовые лупы. Лёгкость секвенсора сказывается на кросс-платформенности: приложения для iPhone и iPad достаточно функциональны, чтобы сделать в них что-то стоящее, а проекты можно экспортировать в GarageBand или Logic Pro X на macOS.
Если на вашем компьютере красуется яблоко и вы думаете, с какой DAW-программы начать, лучшим кандидатом будет простая, эффективная и бесплатная GarageBand. У неё есть встроенные инструменты и эффекты, виртуальный гитарный педалборд, эмуляторы усилителей, виртуальный барабанщик Drummer и возможность устанавливать AU-плагины.
Также GarageBand (естественно, не в качестве основной DAW-программы) пользуются многие известные исполнители, например Рианна, Nine Inch Nails и Ноэль Галлахер.
GarageBand →
9. Cakewalk Sonar
Платформы: Windows.
Стоимость: годовая подписка стоит от 99 долларов за Sonar Artist до 499 долларов за Sonar Platinum. Есть скидки для студентов. Так, за платиновую версию программы учащимся придётся платить 349 долларов в год.
Для кого: для тех, кому по каким-то причинам не нравятся другие секвенсоры, и тех, кому приходится особенно много работать с партиями в piano roll.
Этот мощный и несложный в использовании секвенсор иногда называют Logic Pro X для Windows. К преимуществам Sonar можно отнести элегантный и настраиваемый интерфейс, ударные Addictive Drums и сэмплы от Cakewalk в комплекте и удобный piano roll.
Можно заметить, что Cakewalk не нумерует версии своей станции. Это связано с тем, что она перешла на систему подписки с ежемесячной оплатой. Помимо трёх основных редакций Sonar, разработчики предлагают Sonar Home Studio по вдвое меньшей цене, имеющую множество ограничений, но отлично подходящую для освоения навыков работы с секвенсором.
Из неочевидных преимуществ Sonar можно отметить функцию Pattern Tool — это дополнительная кисточка в piano roll, позволяющая быстро копировать музыкальные фрагменты.
Cakewalk Sonar →
Лайфхакер уже проводил краткий ликбез по созданию домашней студии звукозаписи. Выбор DAW, возможно, самый сложный этап на пути к этой цели. А каким секвенсором пользуетесь вы? Поделитесь ответом в комментариях.
Содержание
- — Какой язык программирования Pro Tools?
- — Что такое Pro Tools LE?
- — Насколько сложно кодировать DAW?
- — Какая текущая версия Pro Tools?
- — Какую DAW использует Канье?
- — Pro Tools лучше логики?
- — Подходит ли Pro Tools для новичков?
- — Что лучше Ableton или Pro Tools?
- — Какие производители используют Pro Tools?
- — Как вы делаете свою собственную DAW?
- — Насколько сложно создать плагин VST?
- — Pro Tools по-прежнему является отраслевым стандартом?
- — Вам нужно платить за Pro Tools каждый год?
- — Что лучше Pro Tools или FL Studio?
Какой язык программирования Pro Tools?
Профессиональные инструменты
Оригинальный автор (ы) | Эван Брукс Питер Готчер |
---|---|
Написано в | C, C ++, Сборка |
Операционная система | macOS, Windows |
Доступно в | 8 языков |
показать Список языков |
Что такое Pro Tools LE?
Pro Tools LE — это приложение для многодорожечной записи / редактирования / микширования на базе хоста. Перейдите на avid.com/protools для получения актуальной информации о продукте.
Насколько сложно кодировать DAW?
обработка сигнала в DAW относительно простой. вам придется работать с микшерами, файлами и графикой. Если вы уже умеете писать приложения, то, вероятно, многому не научитесь (помимо основ).
Какая текущая версия Pro Tools?
Pro Tools 2021.3 (март 2021 г.)
В последнем выпуске Pro Tools есть улучшения как для музыки, так и для аудиопроизводства, включая поддержку Big Sur для компьютеров Mac на базе Intel. Кроме того, все подписчики теперь будут иметь доступ к двум новым плагинам от IK Multimedia.
Какую DAW использует Канье?
Процесс отбора проб Канье Вестса
После создания собственных битов они записываются в Инструменты Avid Pro. DAW по-прежнему участвует в процессе создания музыки Канье, но только для записи, а не для создания битов и звуков.
Pro Tools лучше логики?
Функция редактирования в этой программе намного проще, чем в Logic, что делает такие задачи, как пролистывание, удаление и перемещение объектов, более эффективными. Поскольку это упрощает и ускоряет выполнение работы, Pro Tools лучше, чем Logic для сессий высокого давления.
Подходит ли Pro Tools для новичков?
Бесплатная версия Pro Tools, Pro Tools first может быть хорошим вводным шагом познакомиться с программным обеспечением без вложений, хотя это может оказаться непрактичным для повседневного создания музыки. Однако существует ряд ограничений, а именно: только облачное хранилище (включая 1 ГБ свободного места).
Что лучше Ableton или Pro Tools?
Ableton имеет гораздо больше возможностей для создания электронной музыки с использованием плагинов и приложений MIDI. Набор плагинов Pro Tools — это невероятная ценность для инженеров и микшеров с отличными возможностями отслеживания, редактирования и микширования. В Ableton есть гораздо больше плагинов и приложений для MIDI.
Какие производители используют Pro Tools?
Продюсеры поп- и рок-музыки с уважением к профессиональным инструментам
- Тимоти «Тимбалэнд» Мосли. Хотя его звучание сильно изменилось за эти годы, Тимбалэнд сохранил устойчивые отношения с Pro Tools и обладает сверхъестественной способностью создавать хиты. …
- Макс Мартин. …
- Пол Эпворт. …
- Мик Ронсон.
Как вы делаете свою собственную DAW?
если вы хотите написать DAW:
- как минимум получить ваш ноги мокрые от существующего проекта. если бы я лично выбирал проект, я бы внес свой вклад в Ardor.
- обработка сигнала в DAW относительно просто. вам придется работать с микшерами, файлами и графикой.
Насколько сложно создать плагин VST?
В каком-то смысле они довольно сложны, поскольку включают в себя:
- C ++: язык программирования, который считается одним из самых сложных для изучения.
- DSP или цифровая обработка сигнала: части кода, которые реализуют звуковой «материал». Подумайте о фильтрах, осцилляторах, эффектах и т. Д. Это может быть очень сложно.
Pro Tools по-прежнему является отраслевым стандартом?
Pro Tools по-прежнему является отраслевым стандартом— особенно в США — и их можно найти в большинстве крупных коммерческих студий. Это, пожалуй, самая мощная DAW для записи, редактирования и микширования звука.
Вам нужно платить за Pro Tools каждый год?
Используя стандартные Pro Tools и Pro Tools Ultimate, у вас есть выбор между подпиской или покупкой бессрочной лицензии. Подписки оплачиваются помесячно или авансом в течение 1 года.. … Однако вы не сможете загружать новые версии Pro Tools по истечении года бесплатной поддержки.
Что лучше Pro Tools или FL Studio?
Если вы в основном только начинаете заниматься производством электронной музыки, FL Studio — это место, куда можно пойти, так как его легче обойти по сравнению с Pro Tools. Pro Tools — не лучшая DAW для начала, так как рабочий процесс довольно запутан для новичков.
Интересные материалы:
Как удалить снимок экрана с экрана?
Как удалить снимок экрана с главного экрана?
Как удалить собственный URL-адрес YouTube?
Как удалить событие в календаре iOS 14?
Как удалить содержимое ячейки в Excel по условию?
Как удалить соевый соус из риса?
Как удалить сохранение в GTA San Andreas?
Как удалить сохранения Morrowind?
Как удалить сохраненные имена пользователей в Chrome?
Как удалить сохраненные ссылки?
Программирование, .NET, Алгоритмы
Рекомендация: подборка платных и бесплатных курсов Smm — https://katalog-kursov.ru/
Занимаясь музыкальным творчеством, я часто делаю аранжировки и записи на компьютере — используя кучу всяких VST плагинов и инструментов. Стыдно признаться — я никогда не понимал, как «накручивают» звуки в синтезаторах. Программирование позволило мне написать свой синтезатор, «пропустить через себя» процесс создания звука.
Я планирую несколько статей, в которых будет пошагово рассказано, как написать свой VST плагин/инструмент: программирование осциллятора, частотного фильтра, различных эффектов и модуляции параметров. Упор будет сделан на практику, объяснение программисту простым языком, как же все это работает. Теорию (суровые выводы и доказательства) обойдем стороной (естественно, будут ссылки на статьи и книги).
Обычно плагины пишутся на C++ (кроссплатформенность, возможность эффективно реализовать алгоритмы), но я решил выбрать более подходящий для меня язык — C#; сфокусироваться на изучении самого синтезатора, алгоритмов, а не технических деталей программирования. Для создания красивого интерфейса я использовал WPF. Возможность использования архитектуры .NET дала возможность библиотека-обертка VST. NET.
Ниже представлен обзорный ролик моего простого синтезатора, полученных интересных звучаний.
Предстоит нелегкий путь, если вы готовы — добро пожаловать под кат.
Цикл статей
- Понимаем и пишем VSTi синтезатор на C# WPF
- ADSR-огибающая сигнала
- Продолжение следует…
Оглавление
- Загадочный мир синтеза звука
- Звук в цифровом виде
- VST SDK
- WDL-OL и JUCE
- VST .NET
- Моя надстройка над VST .NET
- WPF UI
- UI-поток
- Обзор архитектуры синтезатора Syntage
- Настраиваем проект для создания плагина/инструмента
- Отладка кода
- Пишем простой осциллятор
- Список литературы
Загадочный мир синтеза звука
Я очень люблю музыку, слушаю разные стили, играю на различных инструментах, и, конечно, сочиняю и записываю аранжировки. Когда я начинал использовать эмуляторы синтезаторов в звукозаписывающих программах (да и сейчас) я всегда перебирал кучу пресетов, искал подходящее звучание.
Перебирая пресеты одного синтезатора можно встретить как «ожидаемый» звук электронного синтезатора из детства (музыка из мультика Летучий Корабль) так и имитацию ударных, звуков, шума, даже голоса! И все это делает один синтезатор, с одними и теми же ручками параметров. Это меня всегда удивляло, хотя я понимал: каждый звук — суть конкретная настройка всех ручек.
Недавно я решил наконец-таки разобраться, каким же образом создаётся (или, правильнее сказать, синтезируется) звук, как и почему нужно крутить ручки, как видоизменяется от эффектов сигнал (визуально и на слух). И конечно же, научиться (хотя бы понять основы) самому «накручивать» звук, копировать понравившиеся мне стили. Я решил последовать одной цитате:
«Скажи мне — и я забуду, покажи мне — и я запомню, дай мне сделать — и я пойму.»
Конфуций
Конечно, все подряд делать не надо (куда столько велосипедов?), но сейчас я хочу получить знания и самое главное — поделиться ими с вами.
Цель: не углубляясь в теорию, создать простой синтезатор, сделав упор на объяснение процессов с точки зрения программирования, на практике.
В синтезаторе будут:
- генератор волны (осциллятор)
- ADSR огибающая сигнала
- фильтр частот
- эхо/дилей
- модуляция параметров
Все составляющие я планирую рассмотреть в нескольких статьях. В данной будет рассмотрено программирование осциллятора.
Программировать будем на C#; UI можно писать либо на WPF, либо на Windows Forms, либо вообще обойтись без графической оболочки. Плюс выбора WPF — красивая графика, которую достаточно быстро кодить, минус — только на Windows. Владельцы других ОС — не расстраивайтесь, всё-таки цель — понять работу синтезатора (а не запилить красивый UI), тем более, код, который я буду демонстрировать, можно быстро перенести, скажем, на С++.
В главах VST SDK и WDL-OL и JUCE я расскажу про концепцию VST, ее внутреннюю реализацию; про библиотеки-надстройки, которые хорошо подойдут для разработки серьезных плагинов. В главе VST .NET я расскажу про данную библиотеку, ее минусы, мою надстройку, программирование UI.
Программирование логики синтезатора начнется с главы Пишем простой осциллятор. Если вам не интересны технические стороны написания VST плагинов, вы просто хотите прочитать про, собственно, синтез (и ничего не кодить) — милости прошу сразу к этой главе.
Исходный код написанного мной синтезатора доступен на GitHub’е.
Звук в цифровом виде
По-сути, конечная наша цель — создание звука на компьютере. Обязательно прочитайте (хотя бы, бегло) статью на хабре «Теория звука» — в ней изложены базовые знания о представлении звука на компьютере, понятия и термины.
Любой звуковой файл в компьютере в несжатом формате представляет собой массив семплов. Любой плагин, в конечном счете, принимает и обрабатывает на входе массив семлов (в зависимости от точности это будут float или double числа, либо можно работать с целыми числами). Почему я сказал массив, а не одиночный семпл? Этим я хотел подчеркнуть что обрабатывается звук в целом: если вам нужно сделать эквализацию, вы не сможете оперировать одним лишь семплом без информации о других.
Хотя, конечно, есть задачи, которым не важно знать, что вы обрабатываете — они рассматривают конкретный семпл. Например, задача — поднять уровень громкости в 2 раза. Мы можем работать с каждым семплом по-отдельности, и нам не нужно знать про остальные.
Мы будем работать с семплом как с float-числом от -1 до 1. Обычно, чтобы не говорить «значение семпла», можно сказать «амплитуда». Если амплитуда каких-то семплов будет больше 1 или меньше -1, произойдет клиппинг, этого нужно избегать.
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.
В Windows VST плагин версии 2.4 представляется как динамическая DLL библиотека.
Хостом мы будем называть программу, которая загружает нашу DLL. Обычно это либо программа редактирования музыки (DAW), либо простая оболочка, чтобы запускать плагин независимо от других программ (например, очень часто в виртуальных инструментах с .dll плагином поставляется .exe файл, чтобы загружать плагин как отдельную программу — пианино, синтезатор).
Дальнейшие функции, перечисления и структуры вы можете найти в скачанном VST SDK в исходниках из папки «VST3 SDKpluginterfacesvst2.x».
Библиотека должна экспортировать функцию со следующей сигнатурой:
EXPORT void* VSTPluginMain(audioMasterCallback hostCallback)
Функция принимает указатель на коллбэк, чтобы плагин мог получать необходимую ему информацию от хоста.
VstIntPtr (VSTCALLBACK *audioMasterCallback) (AEffect* effect, VstInt32 opcode, VstInt32 index, VstIntPtr value, void* ptr, float opt)
Все делается на достаточно «низком» уровне — чтобы хост понял, что от него хотят, нужно передавать номер команды через параметр opcode. Перечисление всех опкодов хардкорные C-кодеры могут найти в перечислении AudioMasterOpcodesX. Остальные параметры используются аналогичным образом.
VSTPluginMain должна вернуть указатель на структуру AEffect, которая, по-сути, и является нашим плагином: она содержит информацию о плагине и указатели на функции, которые будет вызывать хост.
Основные поля структуры AEffect:
- Информация о плагине. Название, версия, число параметров, число программ и пресетов (читай далее), тип плагина и прочее.
- Фунции для запроса и установки значений параметров.
- Функции смены пресетов/программ.
-
Фунция обработки массива семплов
void (VSTCALLBACK *AEffectProcessProc) (AEffect* effect, float** inputs, float** outputs, VstInt32 sampleFrames)
float** — это массив каналов, каждый канал содержит одинаковое количество семплов (количество семплов в массиве зависит от звукового драйвера и его настроек). В основном встречаются плагины, обрабатывающие моно и стерео.
-
Супер-функция, подобна audioMasterCallback.
VstIntPtr (VSTCALLBACK *AEffectDispatcherProc) (AEffect* effect, VstInt32 opcode, VstInt32 index, VstIntPtr value, void* ptr, float opt)
Вызывается хостом, по параметру opcode определяется необходимое действие (список AEffectOpcodes). Используется, чтобы узнать дополнительную информацию о параметрах, сообщать плагину об изменениях в хосте (изменение частоты дискредитации), для взаимодействия с UI плагина.
При работе с плагином было бы очень удобно, чтобы юзер мог сохранить все настроенные ручки и переключатели. А еще круче, чтобы была их автоматизация! Например, вы можете захотеть сделать знаменитый эффект rise up — тогда вам нужно менять параметр cutoff (частота среза) эквалайзера во времени.
Чтобы хост управлял параметрами вашего плагина, в AEffect есть соответствующие функции: хост может запросить общее количество параметров, узнать или установить значение конкретного параметра, узнать название параметра, его описание, получить отображаемое значение.
Хосту все равно, какая логика у параметров в плагине. Задача хоста — сохранять, загружать, автоматизировать параметры. Хосту очень удобно воспринимать параметр, как float-число от 0 до 1 — а уж плагин пусть как хочет, так его и толкует (так и сделали большинство DAW, неофициально).
Пресеты (в терминах VST SDK — programs/программы) это коллекция конкретных значений всех параметров плагина. Хост может менять/переключать/выбирать номера пресетов, узнавать их названия, аналогично с параметрами. Банки — коллекция пресетов. Банки логически существуют только в DAW, в VST SDK есть только пресеты и программы.
Поняв идею структуры AEffect можно набросать и скомпилировать простой DLL-плагинчик.
А мы пойдем дальше, на уровень выше.
WDL-OL и JUCE
Чем плоха разработка на голом VST SDK?
- Писать всю рутину с нуля самому?.. По-любому, кто-то уже это сделал!
- Структуры, коллбэки… а хочется чего-то более высокоуровневого
- Хочется кроссплатформенность, чтобы код был один
- А что насчет UI, которое легко разрабатывать!?
На сцену выходит WDL-OL. Это C++ библиотека для создания кроссплатформенных плагинов. Поддерживаются форматы VST, VST3, Audiounit, RTAS, AAX. Удобство библиотеки состоит в том, что (при правильной настройке проекта) вы пишете один код, а при компилировании получаете свой плагин в разных форматах.
Как работать с WDL-OL хорошо описано в Martin Finke’s Blog «Music & Programming», даже есть хабр статьи-переводы на русский.
WDL-OL решает, по крайней мере, первые три пункта минусов разработки на VST SDK. Все, что вам нужно — корректно настроить проект (первая статья из блога), и отнаследоваться от класса IPlug.
class MySuperPuperPlugin : public IPlug
{
public:
explicit MyFirstPlugin(IPlugItanceInfo instanceInfo);
virtual ~MyFirstPlugin() override;
void ProcessDoubleReplacing(double** inputs, double** outputs, int nFrames) override;
};
Теперь с чистой совестью можно реализовать функцию ProcessDoubleReplacing, которая, по сути и является «ядром» плагина. Все заботы взял на себя класс IPlug. Если его изучать, можно быстро понять, что (в формате VST) он является оберткой структуры AEffect. Коллбэки от хоста и функции для хоста превратились в удобные виртуальные функции, с понятными названиями и адекватными списками параметров.
В WDL-OL уже есть средства для создания UI. Но как по мне, все это делается с большой болью: UI собирается в коде, все ресурсы нужно описывать в .rc файле и так далее.
Помимо WDL-OL я так же узнал про библиотеку JUCE. JUCE похожа на WDL-OL, решает все заявленные минусы разработки на VST SDK. Помимо всего прочего, она уже имеет в своем составе и UI-редактор, и кучу классов для работы с аудио данными. Я лично ее не использовал, поэтому советую прочитать о ней, хотя бы, на вики.
Если вы хотите писать серьезный плагин, тут я бы уже всерьез задумался над использованием библиотек WDL-OL или JUCE. Всю рутину они сделают за вас, а у вас же остается вся мощь языка C++ для реализации эффективных алгоритмов и кроссплатформенность — что не маловажно в мире большого количества DAW.
VST .NET
Чем же мне не угодили WDL-OL и JUCE?
- Моя задача — понять как программируется синтезатор, обработка аудио, эффекты, а не как собрать плагин под максимальное количество форматов и платформ. «Техническое программирование» здесь отходит на второй план (конечно, это не повод писать плохой код и не использовать ООП).
- Я разбалован языком C#. Опять же, этот язык, в отличие от того же C++, позволяет не думать о некоторых технических моментах.
- Мне нравится технология WPF в плане ее визуальных возможностей.
Страничка библиотеки — vstnet.codeplex.com, там есть исходники, бинарники, документация. Как я понял, библиотека находится в стадии почти доделал и забил заморозки (не реализованы некоторые редко используемые функции, пару лет нет изменений репозитория).
Библиотека состоит из трех ключевых сборок:
- Jacobi.Vst.Core.dll — содержит интерфейсы, определяющие поведения хоста и плагина, вспомогательные классы аудио, событий, MIDI. Большая часть является оберткой нативных структур, дефайнов и перечислений из VST SDK.
- Jacobi.Vst.Framework.dll — содержит базовые классы плагинов, реализующие интерфейсы из Jacobi.Vst.Core, позволяющие ускорить разработку плагинов и не писать все с нуля; классы для более высокоуровневого взаимодействия «хост-плагин», различные менеджеры параметров и программ, MIDI-сообщений, работы с UI.
- Jacobi.Vst.Interop.dll — Managed C++ обертка над VST SDK, которая позволяет соединить хост с загруженной .NET сборкой (вашим плагином).
Как можно делать .NET сборки, если хост ожидает простую динамическую DLL? А вот как: на самом деле хост грузит не вашу сборку, а скомпилированную DLL Jacobi.Vst.Interop, которая уже в свою очередь грузит ваш плагин в рамках .NET.
Используется следующая хитрость: допустим, вы разрабатываете свой плагин, и на выходе получаете .NET-сборку MyPlugin.dll. Нужно сделать так, чтобы хост вместо вашей MyPlugin.dll загрузил Jacobi.Vst.Interop.dll, а она загрузила ваш плагин. Вопрос, а как Jacobi.Vst.Interop.dll узнает откуда грузить вашу либу? Вариантов решения много. Разработчик выбрал вариант называть либу-обертку одинаковым именем с вашей либой, а затем искать .NET-сборку как «мое_имя.vstdll».
Работает все это следующим образом
- Вы скомпилировали и получили MyPlugin.dll
- Переименовываем MyPlugin.dll в MyPlugin.vstdll
- Копируем рядом Jacobi.Vst.Interop.dll
- Переименовываем Jacobi.Vst.Interop.dll на MyPlugin.dll
- Теперь хост будет грузить MyPlugin.dll (т.е. Jacobi.Vst.Interop обертку) а она, зная что ее имя «MyPlugin», загрузит вашу сборку MyPlugin.vstdll.
При загрузке вашей либы необходимо, чтобы в ней был класс, реализующий интерфейс IVstPluginCommandStub:
public interface IVstPluginCommandStub : IVstPluginCommands24
{
VstPluginInfo GetPluginInfo(IVstHostCommandStub hostCmdStub);
Configuration PluginConfiguration { get; set; }
}
VstPluginInfo содержит базовую о плагине — версия, уникальный ID плагина, число параметров и программ, число обрабатываемых каналов. PluginConfiguration нужна для вызывающей либы-обертки Jacobi.Vst.Interop.
В свою очередь, IVstPluginCommandStub реализует интерфейс IVstPluginCommands24, который содержит методы, вызываемые хостом: обработка массива (буфера) семплов, работа с параметрами, программами (пресетами), MIDI-сообщениями и так далее.
Jacobi.Vst.Framework содержит готовый удобный класс StdPluginCommandStub, реализующий IVstPluginCommandStub. Все что нужно сделать — отнаследоваться от StdPluginCommandStub и реализовать метод CreatePluginInstance(), который будет возвращать объект (instance) вашего класса-плагина, реализующего IVstPlugin.
public class PluginCommandStub : StdPluginCommandStub
{
protected override IVstPlugin CreatePluginInstance()
{
return new MyPluginController();
}
}
Опять же, есть готовый удобный класс VstPluginWithInterfaceManagerBase:
public abstract class VstPluginWithInterfaceManagerBase : PluginInterfaceManagerBase, IVstPlugin, IExtensible, IDisposable
{
protected VstPluginWithInterfaceManagerBase(string name, VstProductInfo productInfo, VstPluginCategory category,
VstPluginCapabilities capabilities, int initialDelay, int pluginID);
public VstPluginCapabilities Capabilities { get; }
public VstPluginCategory Category { get; }
public IVstHost Host { get; }
public int InitialDelay { get; }
public string Name { get; }
public int PluginID { get; }
public VstProductInfo ProductInfo { get; }
public event EventHandler Opened;
public virtual void Open(IVstHost host);
public virtual void Resume();
public virtual void Suspend();
protected override void Dispose(bool disposing);
protected virtual void OnOpened();
}
Если смотреть исходный код библиотеки, можно увидеть интерфейсы, описывающие компоненты плагина, для работы с аудио, параметрами, MIDI и т.д. :
IVstPluginAudioProcessor
IVstPluginParameters
IVstPluginPrograms
IVstHostAutomation
IVstMidiProcessor
Класс VstPluginWithInterfaceManagerBase содержит виртуальные методы, возвращающие эти интерфейсы:
protected virtual IVstPluginAudioPrecisionProcessor CreateAudioPrecisionProcessor(IVstPluginAudioPrecisionProcessor instance);
protected virtual IVstPluginAudioProcessor CreateAudioProcessor(IVstPluginAudioProcessor instance);
protected virtual IVstPluginBypass CreateBypass(IVstPluginBypass instance);
protected virtual IVstPluginConnections CreateConnections(IVstPluginConnections instance);
protected virtual IVstPluginEditor CreateEditor(IVstPluginEditor instance);
protected virtual IVstMidiProcessor CreateMidiProcessor(IVstMidiProcessor instance);
protected virtual IVstPluginMidiPrograms CreateMidiPrograms(IVstPluginMidiPrograms instance);
protected virtual IVstPluginMidiSource CreateMidiSource(IVstPluginMidiSource instance);
protected virtual IVstPluginParameters CreateParameters(IVstPluginParameters instance);
protected virtual IVstPluginPersistence CreatePersistence(IVstPluginPersistence instance);
protected virtual IVstPluginProcess CreateProcess(IVstPluginProcess instance);
protected virtual IVstPluginPrograms CreatePrograms(IVstPluginPrograms instance);
Эти методы и нужно перегружать, чтобы реализовывать свою логику в кастомных классах-компонентах. Например, вы хотите обрабатывать семплы, тогда вам нужно написать класс, реализующий IVstPluginAudioProcessor, и вернуть его в методе CreateAudioProcessor.
public class MyPlugin : VstPluginWithInterfaceManagerBase
{
...
protected override IVstPluginAudioProcessor CreateAudioProcessor(IVstPluginAudioProcessor instance)
{
return new MyAudioProcessor();
}
...
}
...
public class MyAudioProcessor : VstPluginAudioProcessorBase // используем готовый класс из либы
{
public override void Process(VstAudioBuffer[] inChannels, VstAudioBuffer[] outChannels)
{
// обработка семплов
}
}
Используя различные готовые классы-компоненты можно сосредоточиться на программировании логики плагина. Хотя, вам никто не мешает реализовывать все самому, как хочется, основываясь только на интерфейсах из Jacobi.Vst.Core.
Для тех, кто уже кодит — предлагаю вам пример просто плагина, который понижает громкость на 6 дБ (для этого нужно умножить семпл на 0.5, почему — читай в статье про звук).
Пример просто плагина
using Jacobi.Vst.Core;
using Jacobi.Vst.Framework;
using Jacobi.Vst.Framework.Plugin;
namespace Plugin
{
public class PluginCommandStub : StdPluginCommandStub
{
protected override IVstPlugin CreatePluginInstance()
{
return new MyPlugin();
}
}
public class MyPlugin : VstPluginWithInterfaceManagerBase
{
public MyPlugin() : base(
"MyPlugin",
new VstProductInfo("MyPlugin", "My Company", 1000),
VstPluginCategory.Effect,
VstPluginCapabilities.None,
0,
new FourCharacterCode("TEST").ToInt32())
{
}
protected override IVstPluginAudioProcessor CreateAudioProcessor(IVstPluginAudioProcessor instance)
{
return new AudioProcessor();
}
}
public class AudioProcessor : VstPluginAudioProcessorBase
{
public AudioProcessor() : base(2, 2, 0) // плагин будет обрабатывать стерео
{
}
public override void Process(VstAudioBuffer[] inChannels, VstAudioBuffer[] outChannels)
{
for (int i = 0; i < inChannels.Length; ++i)
{
var inChannel = inChannels[i];
var outChannel = outChannels[i];
for (int j = 0; j < inChannel.SampleCount; ++j)
{
outChannel[j] = 0.5f * inChannel[j];
}
}
}
}
}
Моя надстройка над VST .NET
При программировании синта я столкнулся с некоторыми проблемами при использовании классов из 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).
В VST .NET этот коллбэк реализован в виде функции GetParameterProperties, возвращающей объект класса VstParameterProperties. Все равно, Cubase некорректно воспринимал и автоматизировал мои параметры.
В начале я внес правки саму библиотеку, написал автору, чтобы он дал разрешение выложить исходники в репозиторий, либо сам создал репозиторий на GitHub’е. Но внятного ответа я так и не получил, поэтому решил сделать надстройку над либой — Syntage.Framework.dll.
Помимо этого, в надстройке реализованы удобные классы для работы с UI, если вы хотите использовать WPF.
Самое время скачать исходный код моего синтезатора и скомпилировать его.
Компилирование кода
- Склонировать/скачать репозиторий.
- Собрать солюшн в Visual Studio в Debug.
- Чтобы запустить синт из студии, нужно использовать проект SimplyHost.
- Файлы плагина и зависимые библиотеки будут в папке «outvst»:
Правила использования моей надстройки просты: вместо StdPluginCommandStub юзаем SyntagePluginCommandStub, а свой плагин наследуем от SyntagePlugin.
WPF UI
В VST плагине не обязательно должен быть графический интерфейс. Я видел много плагинов без UI (одни из них — mda). Большинство DAW (по крайней мере, Cubase и FL Studio) предоставят вам возможность управлять параметрами из сгенерированного ими UI.
Автосгенерированный UI для моего синтезатора в FL Studio
Чтобы ваш плагин был с UI, во-первых, у вас должен быть класс, реализующий IVstPluginEditor; во-вторых, нужно вернуть его инстанс в перегруженной функции CreateEditor вашего класса плагина (наследник SyntagePlugin).
Я написал класс PluginWpfUI<T>, который непосредственно владеет WPF-окном. Здесь T — это тип вашего UserControl, являющийся «главной формой» UI. PluginWpfUI<T> имеет 3 виртуальных метода, которые вы можете перегружать для реализации своей логики:
- public virtual void Open(IntPtr hWnd) — вызывается при каждом открытии UI плагина
- public virtual void Close() — вызывается при каждом закрытии UI плагина
- public virtual void ProcessIdle() — вызывается несколько раз в секунду из UI-потока, для обработки кастомной логики (базовая реализация пустая)
В своем синтезаторе Syntage я написал пару контролов — слайдер, крутилка (knob), клавиатура пианино — если вы хотите, можете их скопировать и использовать.
UI-поток (thread)
Я тестировал синтезатор в FL Studio и Cubase 5 и уверен, что, в других DAW будет тоже самое: UI плагина обрабатывается отдельным потоком. А это значит, что логики аудио и UI обрабатывается в независимых потоках. Это влечет все проблемы, или, последствия такого подхода: доступ к данным из разных потоков, критические данные, доступ к UI из другого потока…
Для облегчения решения проблем я написал класс UIThread, который, по сути, является очередью команд. Если вы в какой-то момент хотите что-то сообщить/поменять/сделать в UI, а текущий код работает не в UI-потоке, то вы можете поставить на выполнение в очередь необходимую функцию:
UIThread.Instance.InvokeUIAction(() => Control.Oscilloscope.Update());
Здесь в очередь команд помещается анонимный метод, обновляющий нужные данные. При вызове ProcessIdle все накопившиеся в очереди команды будут выполнены.
UIThread не решает всех проблем. При программировании осциллографа необходимо было обновлять UI по массиву семплов, который обрабатывался в другом потоке. Пришлось использовать мьютексы.
Обзор архитектуры синтезатора Syntage
При написании синтезатора активно использовалось ООП; предлагаю вам познакомиться с получившейся архитектурой и использовать мой код. Вы можете сделать все по-своему, но в этих статьях придется терпеть мое видение)
Класс PluginCommandStub нужен только чтобы создать и вернуть объект класса PluginController. PluginController предоставляет информацию о плагине, так же создает и владеет следующими компонентами:
- AudioProcessor — класс со всей логикой обработки аудио данных
- MidiListener — класс для обработки MIDI-сообщений (из Syntage.Framework)
- PluginUI (наследник PluginWpfUI<View>) — класс, управляющий графическим интерфейсом синтезатора, главная форма — это UserControl «View».
Чтобы обрабатывать аудиоданные есть интерфейсы IAudioChannel и IAudioStream. IAudioChannel предоставляет прямой доступ к массиву/буферу семплов (double[] Samples). IAudioStream содержит массив каналов.
Представленные интерфейсы содержат удобные методы обработки всех семплов и каналов «скопом»: микширование каналов и потоков, применение метода к каждому семплу в отдельности и так далее.
Для интерфейсов IAudioChannel и IAudioStream написаны реализации AudioChannel и AudioStream. Здесь важно запомнить следующую вещь: нельзя хранить ссылки на AudioStream и AudioChannel, если они являются внешними данными в функции. Суть в том, что размеры буферов могут меняться по ходу работы плагина, буферы постоянно переиспользуются — не выгодно постоянно перевыделять и копировать память. Если вам необходимо сохранить буфер для дальнейшего использования (уж не знаю, зачем) — копируйте его в свой буфер.
IAudioStreamProvider является владельцем аудиопотоков, можно попросить создать поток функцией CreateAudioStream и вернуть поток для его удаления функцией ReleaseAudioStream.
В каждый момент времени длина (длина массива семплов) всех аудиопотоков и каналов одинакова, технически она определяется хостом. В коде ее можно получить либо у самого IAudioChannel или IAudioStream (свойство Length), так же у «хозяина» IAudioStreamProvider (свойство CurrentStreamLenght).
Класс AudioProcessor является «ядром» синтезатора — в нем-то и происходит синтез звука. Класс является наследником SyntageAudioProcessor, который, в свою очередь, реализует следующие интерфейсы:
- VstPluginAudioProcessorBase — чтобы обрабатывать буфер семплов (метод Process)
- IVstPluginBypass — чтобы отключать логику синтезатора, если плагин находится в режиме Bypass
- IAudioStreamProvider — чтобы предоставлять аудиопотоки для генераторов
Синтез звука проходит длинную цепочку обработки: создание простой волны в осцилляторах, микширование звука с разных осцилляторов, последовательная обработка в эффектах. Логика создания и обработки звука была разделена на классы-компоненты для AudioProcessor. Каждый компонент является наследником класса SyntageAudioProcessorComponentWithParameters<T> — содержит ссылку на AudioProcessor и возможность создавать параметры.
В синтезаторе представлены следующие компоненты:
- Input — обрабатывает сообщения о нажатии нот (MIDI-сообщения и нажатия из UI)
- Oscillator — осциллятор
- ADSR — огибающая сигнала
- ButterworthFilter — фильтр частот
- Distortion — эффект дисторшн
- Delay — эффект эхо/дилей
- Clip — ограничивает значение всех семплов от -1 до 1.
- LFO — модулирование параметров (обычно в синтезаторах модуляция осуществляется с использованием Low Frequency Oscillator — генератора низких частот)
- Master — мастер-обработка (финальная обработка) сигнала. В данном случае содержит ручку главной громкости.
- Oscillograph — осциллограф
- Routing — содержит в себе цепочку логики обработки звука
Все этапы создания звука вы можете найти в функции Routing.Process и на следующей схеме:
Звук одновременно создается на двух одинаковых осцилляторах (юзер может по-разному настроить их параметры). Для каждого осциллятора его звук проходит через огибающую. Два звука смешиваются в один, он проходит через фильтр частот, идет в эффект дисторшн, дилэй и клип. В мастере регулируется результирующая громкость звука. После мастера звук больше не модифицируется, но передается в осциллограф и блок LFO-модуляции (нужно для их внутренней логики).
Далее будет рассмотрено программирование логики класса Oscillator, а в следующих статьях будут рассмотрены другие классы-компоненты.
Чтобы использовать параметры, можно использовать абстрактный класс Parameter<T>, либо готовые реализации: EnumParameter, IntegerParameter, RealParameter и другие. Здесь важно понимать, что у параметра есть текущее значение Value типа T, и float-значение RealValue — отображающее обычное значение в отрезок [0,1] (нужно для работы с UI и хостом).
Настраиваем проект для создания плагина/инструмента
Наконец-то! Сейчас мы будем создавать плагин. Кодим мы на C#, и работаем в Visual Studio.
Создаем обычную .NET Class Library, и импортируем ссылки на Jacobi.Vst.Core.dll и Jacobi.Vst.Framework.dll, Syntage.Framework.dll.
Настроим копирование и переименование файлов при успешной компиляции проекта (зачем это нужно было написано в главе VST .NET).
Предлагаю вам использовать следующий скрипт (его нужно прописать в Project > Properties > Build Events > Post-build event command line, выполнение скрипта поставьте на On successful build):
if not exist "$(TargetDir)vst" mkdir "$(TargetDir)vst"
copy "$(TargetDir)$(TargetFileName)" "$(TargetDir)vst$(TargetName).net.vstdll"
copy "$(TargetDir)Syntage.Framework.dll" "$(TargetDir)vstSyntage.Framework.dll"
copy "$(TargetDir)Jacobi.Vst.Interop.dll" "$(TargetDir)vst$(TargetName).dll"
copy "$(TargetDir)Jacobi.Vst.Core.dll" "$(TargetDir)vstJacobi.Vst.Core.dll"
copy "$(TargetDir)Jacobi.Vst.Framework.dll" "$(TargetDir)vstJacobi.Vst.Framework.dll"
Отладка кода
В файле моего проекта Syntage вы найдете сборку SimplyHost. Это простой хост, который на старте загружает плагин с расширением «.vstdll» (файл ищется рядом с .exe или в дочерних папках). Рекомендую вам скопировать его к себе в проект — тогда вы без проблем сразу сможете отлаживать свой плагин.
Вы так же можете использовать другие хосты для отладки, но сделать это будет уже сложнее. Когда я тестировал синтезатор, я использовал две DAW: FL Studio 12 и Cubase 5. Если в FL Studio загрузить плагин, можно из Visual Studio приконнектиться к процессу FL Studio (Debug > Attach To Process). Это не всегда работает, нужно быть очень внимательным: загружаемая .dll должна соответствовать вашему коду в студии (пересоберите проект перед отладкой); коннектиться к процессу можно только после загрузки вашего плагина в DAW.
Пишем простой осциллятор
Я надеюсь, что вы прочитали главу «Обзор архитектуры синтезатора Syntage» — я буду объяснять все в терминах своей архитектуры.
Самый простой звук — это чистый тон (синусоидальный сигнал, синус) определенной частоты. В природе вы вряд ли сможете услышать чистый тон. В жизни же можно услышать чистые тона в какой-нибудь электронике (и то, уверенности мало). Фурье сказал, что любой звук можно представить как одновременное звучание тонов разной частоты и громкости. Окраска звука характеризуется тембром — грубо говоря, описанием соотношения тонов в этом звуке (спектром).
Мы пойдем схожим путем — будем генерировать простой сигнал, а затем воздействовать на него и менять с помощью эффектов.
Какие выбрать «простые» сигналы? Очевидно, сигналы, спектр которых известен и хорошо изучен, которые легко обрабатывать. Возьмем четыре знаменитые типа сигналов:
Периоды четырех типов сигналов: синус, треугольник, импульс/квадрат, пила.
Чтобы синтезировать звуки, вы должны четко представлять себе исходное звучание этих простых сигналов.
Синус имеет глухое и тихое звучание, остальные же — «острое» и громкое. Это связано с тем, что, в отличие от синуса, другие сигналы содержат большое количество других тонов (гармоник) в спектре.
Наш генерируемый сигнал будет характеризоваться двумя параметрами: типом волны и частотой.
На графике изображены периоды нужных нам волн. Заметьте, что все волны представлены в интервале от 0 до 1. Это очень удобно, так как позволяет одинаково запрограммировать расчет значений. Такой подход позволяет задать произвольную форму сигнала, я даже видел синтезаторы, где можно вручную его нарисовать.
По представленным картинкам напишем вспомогательный класс WaveGenerator, с методом GetTableSample, который будет возвращать значение амплитуды сигнала в зависимости от типа волны и времени (время должно быть в пределах от 0 до 1).
Добавим так же в тип волны белый шум — он полезен в синтезе нестандартных звуков. Белый шум характеризуется тем, что спектральные составляющие равномерно распределены по всему диапазону частот. Функция NextDouble стандартного класса Random имеет равномерное распределение — таким образом, мы можем считать, что каждый сгенерированный семпл относится к некоторой гармонике. Соответственно, мы будем выбирать гармоники равномерно, получая белый шум. Нужно лишь сделать отображение результата функции из интервала [0,1] в интервал минимального и максимального значения амплитуды [-1,1].
public static class WaveGenerator
{
public enum EOscillatorType
{
Sine,
Triangle,
Square,
Saw,
Noise
}
private static readonly Random _random = new Random();
public static double GetTableSample(EOscillatorType oscillatorType, double t)
{
switch (oscillatorType)
{
case EOscillatorType.Sine:
return Math.Sin(DSPFunctions.Pi2 * t);
case EOscillatorType.Triangle:
if (t < 0.25) return 4 * t;
if (t < 0.75) return 2 - 4 * t;
return 4 * (t - 1);
case EOscillatorType.Square:
return (t < 0.5f) ? 1 : -1;
case EOscillatorType.Saw:
return 2 * t - 1;
case EOscillatorType.Noise:
return _random.NextDouble() * 2 - 1;
default:
throw new ArgumentOutOfRangeException();
}
}
}
Теперь, пишем класс Oscillator, который будет наследником SyntageAudioProcessorComponentWithParameters<AudioProcessor>. В осцилляторе рождается звук, поэтому класс будет реализовывать интерфейс IGenerator, а именно функцию
IAudioStream Generate();
Необходимо запросить у IAudioStreamProvider (для нас это будет родительский AudioProcessor) аудиопоток, и в каждом вызове функции Generate заполнять его сгенерированными семплами.
Пока что у нашего осциллятора будет два параметра:
- Тип волны — WaveGenerator.EOscillatorType, используем класс EnumParameter из Syntage.Framework
- Частота сигнала — слышимый диапазон от 20 до 20000 Гц, используем класс FrequencyParameter из Syntage.Framework
Оформим все вышесказанное:
public class Oscillator : SyntageAudioProcessorComponentWithParameters<AudioProcessor>, IGenerator
{
private readonly IAudioStream _stream; // поток, куда будем генерировать семплы
private double _time;
public EnumParameter<WaveGenerator.EOscillatorType> OscillatorType { get; private set; }
public RealParameter Frequency { get; private set; }
public Oscillator(AudioProcessor audioProcessor) :
base(audioProcessor)
{
_stream = Processor.CreateAudioStream(); // запрашиваем поток
}
public override IEnumerable<Parameter> CreateParameters(string parameterPrefix)
{
OscillatorType = new EnumParameter<WaveGenerator.EOscillatorType>(parameterPrefix + "Osc", "Oscillator Type", "Osc", false);
Frequency = new FrequencyParameter(parameterPrefix + "Frq", "Oscillator Frequency", "Hz");
return new List<Parameter> { OscillatorType, Frequency };
}
public IAudioStream Generate()
{
_stream.Clear(); // очищаем все, что было раньше
GenerateToneToStream(); // самое интересное
return _stream;
}
}
Осталось написать функцию 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.
public static double GenerateNextSample(EOscillatorType oscillatorType, double frequency, double time)
{
var ph = time * frequency;
ph -= (int)ph; // реализация frac вычитанием целой части
return GetTableSample(oscillatorType, ph);
}
...
private void GenerateToneToStream()
{
var count = Processor.CurrentStreamLenght; // сколько семплов нужо сгенерировать
double timeDelta = 1.0 / Processor.SampleRate; // столько времени разделяет два соседних семпла
// кешируем ссылки на каналы, чтобы было меньше обращений в цикле
var leftChannel = _stream.Channels[0];
var rightChannel = _stream.Channels[1];
for (int i = 0; i < count; ++i)
{
// Frequency и OscillatorType лучше не кешировать - это параметры плагина и
// они могут меняться
var frequency = DSPFunctions.GetNoteFrequency(Frequency.Value);
var sample = WaveGenerator.GenerateNextSample(OscillatorType.Value, frequency, _time);
leftChannel.Samples[i] = sample;
rightChannel.Samples[i] = sample;
_time += timeDelta;
}
}
Обычно, в параметры осциллятора добавляют следующие:
- Громкость
- Подстройка (Fine) — изменение частоты генерируемой волны в большую или меньшую сторону. Можно получить эффект, похожий на wah-wah если модулировать этот параметр. Если генераторов много и они смешиваются, можно делать расстройку генераторов друг относительно друга.
- Панировка/Стерео (Pan/Panning/Stereo) отношение громкостей сигнала в левом и правом ухе.
Данные параметры есть в реализованном мною синтезаторе — вы можете самостоятельно их реализовать.
Осталось реализовать классы AudioProcessor (будет создавать осциллятор и вызывать у него метод Generate) и PluginController (создает AudioProcessor).
Посмотрите реализацию данных классов в моем коде Syntage. На текущем этапе AudioProcessor нужен, чтобы:
- Создать осциллятор
- Заполнить параметры (вызвать функцию CreateParameters)
- В функции обработки буфера семплов вызывать метод Generte у осциллятора
Простая реализация перечисленных классов, для ленивых
public class PluginCommandStub : SyntagePluginCommandStub<PluginController>
{
protected override IVstPlugin CreatePluginInstance()
{
return new PluginController();
}
}
...
public class PluginController : SyntagePlugin
{
public AudioProcessor AudioProcessor { get; }
public PluginController() : base(
"MyPlugin",
new VstProductInfo("MyPlugin", "TestCompany", 1000),
VstPluginCategory.Synth,
VstPluginCapabilities.None,
0,
new FourCharacterCode("TEST").ToInt32())
{
AudioProcessor = new AudioProcessor(this);
ParametersManager.SetParameters(AudioProcessor.CreateParameters());
ParametersManager.CreateAndSetDefaultProgram();
}
protected override IVstPluginAudioProcessor CreateAudioProcessor(IVstPluginAudioProcessor instance)
{
return AudioProcessor;
}
}
...
public class AudioProcessor : SyntageAudioProcessor
{
private readonly AudioStream _mainStream;
public readonly PluginController PluginController;
public Oscillator Oscillator { get; }
public AudioProcessor(PluginController pluginController) :
base(0, 2, 0) // у нас синт, на вход он не принимает данные, а только генерирует стерео-сигнал
{
_mainStream = (AudioStream)CreateAudioStream();
PluginController = pluginController;
Oscillator = new Oscillator(this);
}
public override IEnumerable<Parameter> CreateParameters()
{
var parameters = new List<Parameter>();
parameters.AddRange(Oscillator.CreateParameters("O"));
return parameters;
}
public override void Process(VstAudioBuffer[] inChannels, VstAudioBuffer[] outChannels)
{
base.Process(inChannels, outChannels);
// генерируем семплы
var stream = Oscillator.Generate();
// копируем полученный stream в _mainStream
_mainStream.Mix(stream, 1, _mainStream, 0);
// отправляем результат
_mainStream.WriteToVstOut(outChannels);
}
}
В следующей статье я расскажу как написать ADSR-огибающую.
Удачи в программировании!
P.S. В заголовке я писал что занимаюсь музыкой — если кому то интересно, можете послушать мою музыку, и в частности записанный diy-альбом.
Список литературы
- Теория звука. Что нужно знать о звуке, чтобы с ним работать. Опыт Яндекс.Музыки.
- Марпл-мл. С. Л. Цифровой спектральный анализ и его приложения.
- Айфичер Э., Джервис Б. — Цифровая обработка сигналов. Практический подход.
- Martin Finke’s Blog «Music & Programming» цикл статей по созданию синта от и до на C++, используя библиотеку WDL-OL.
- Хабр-переводы Martin Finke’s Blog
- Модульные аналоговые синтезаторы (большая хабр-статья затрагивающая вопросы синтеза звука, обзора аналоговых синтезаторов и их составляющих).
1. Музыкальное оборудование
Чтобы создавать электронную музыку для начала вам понадобится всего несколько девайсов. Причем, если вы начинающий музыкальный продюсер — делайте выбор в пользу бюджетных моделей, так как с развитием навыков вы все равно будете добавлять или убирать железо, пробовать различные сочетания, подходящие вам и вашей музыке. В первую очередь вам понадобятся мониторы или студийные наушники для контроля микса, аудиоинтерфейс и миди-контроллер, а также микрофон или рекордер. В будущем вы можете дополнять свой арсенал синтезаторами, драм-машинами, грув-боксами и многим другим, для того чтобы разнообразить музыкальный подход в вашем творческом процессе.
2. Цифровая рабочая станция (DAW)
Очень важно правильно подобрать рабочую среду, в которую вы будете проводить большую часть работы над треками. Многие продюсеры любят писать треки напрямую в DAW, создавая лупы и клипы, чтобы быстро накидать идеи.
С ее помощью вы сможете структурировать свой трек из одиночных семплов в завершенную композицию. Также DAW превращает сведение микса в доступный и приятный процесс. Одной из самых популярных и удобных рабочих станций является Ableton Live.
Вот комментарий нашего преподавателя курса “Создание электронной музыки“ Евгения Чигарева, который активно использует ее в своих проектах:
Для меня Ableton live является незаменимым DAW по ряду функций. Режим сессии (Session view), безусловно, помогает генерировать контент в разы быстрее, в противовес классическому подходу, к написанию аранжировок в так называемом режиме аранжировки, который присущ остальным DAW.
Я создаю музыку всегда в режиме сессии и всегда этот процесс мне доставляет огромное удовольствие. В режиме аранжировки я занимаюсь лишь редактированием ранее записанного материала. Данный workflow взялся не с потолка, и применяется создателями программы в своей работе.
Также хочу отметить возможность работы в программе с двух компьютеров (этот подход неклассический), данный подход просто незаменим и позволяет экономить время на рендеринге.
И, напоследок, отмечу среду Max for live в связке с самим MAX открывает безграничные возможности к продюсированию в цифре.
3. Сэмплы и плагины
Для достижения желаемого звучания нужно иметь некоторую базу библиотек семплов, плагинов эффектов и виртуальных инструментов. С их помощью вы будете создавать тона и текстуры вашего будущего микса. Выстроив необходимый набор инструментов, ваша композиция будет постоянно расти и развиваться, и с каждым разом получаться все ближе к идеалу.
Посмотрите видео от нашего преподавателя Евгения Чигарева с обзором лучших плагинов:
4. Структура трека и композиция
Нельзя переоценить этот пункт. Здесь важно понимание основ музыкальной теории. Без этого вы не сможете написать последовательность аккордов, мелодию и басовую линию или даже проработать структуру трека. Начните с малого — слушайте музыку ваших любимых исполнителей внимательно, обращая внимание на то, как работает гармония и выбранная тональность, как на них ложится мелодия и бас.
Не стоит сразу же забираться в дебри, на первое вам время вам будет достаточно самых базовых знаний. Но помните, что создание любой музыки неотделимо от музыкальной теории.
5. Аранжировка
Следующее, на что стоит обратить свое внимание — это аранжировка трека. Многое зависит от того, как инструменты работают вместе, ведь у каждого должна быть свое место и они не должны конкурировать в общем миксе. Аранжировка помогает вашей композиции развиваться, создавать напряжение в определенных моментах.
Убедиться в этом вам поможет наш бесплатный курс “DubStep шаг за шагом”.
6. Саунд-дизайн
Этот пункт вытекает из предыдущего, так как большинство инструментов в электронной музыке вы будет создавать сами с нуля.
Вы можете подбирать и компоновать сэмплы, углубиться в синтез или экспериментировать с эффектами. С таким количеством возможностей легко растеряться. Но это жизненно важный пункт при создании электронной музыки — звуки, которые вы используете, отображают стиль трека, а главное вашу музыкальную идентичность.
У нас есть интересный мастер-класс подходящей темы с преподавателем курса “Музыкальный саунд-дизайн“:
7. Сведение
Сведение музыки — это искусство правильного сочетания всех инструментов и партий, гармонирующих между собой, но при этом четко различимых. В процессе создания трека важно общее звучание, которое приятно слушать и легко расслышать. Базовый инструментарий для этих целей — эквалайзеры, компрессоры, ревербераторы, эффекты задержки и многие другие. Это очень сложный и трудоемкий процесс, которому следует обучаться. Но как только вы ознакомитесь с базовыми приемами, звучание ваших треков уже будет легче контролировать.
Создание современной музыки требует обширных знаний в различных областях. Очень важный навык для музыкального продюсера знать ответ на вопрос — почему ваш трек не звучит как надо? Из-за микса или аранжировки? Дело в партиях инструментов или в нотах? Или может быть что-то не так с эффектами? Трек скучный или просто неправильно структурирован? И с этим надо разобраться именно вам, как музыкальному продюсеру. Поэтому необходимо развивать свои навыки на всех этапах музыкального продюсирования.
Но не стоит забывать, что создание музыки остается в первую очередь творческим процессом. Да он сложный и не всегда предсказуем, но ведь это и есть самое привлекательное в нем, правда? Творите прямо сейчас, на вашем пути нет препятствий!