Найти в Дзене
Rust.rs

Создание плагина Vst3 и Clap на Rust с помощью NIH-plug.

NIH-plug - Это незавершенный API-независимый фреймворк аудио плагинов VST3 и CLAP, написанный на Rust. Незавершенный!!!. Некоторые функции или переменные могут измениться, функции будут принимать другое количество аргументов или переменные изменят тип. (Во время написания статьи уже происходили изменения). Нам будет необходимо, не только подключить библиотеку в cargo.toml, но настроить систему сборки по инструкции.. Если всё сделано правильно, то создать плагин можно будет командой терминала. $ cargo xtask bundle plugin-rs --release Компиляция проекта `plugin-rs` Создание базового плагина: Для создания базового плагина, мы должный создать общую структуру для всего плагина. Для неё мы должный реализовать минимум 3 трейта Plugin + Default и трейт формата плагина Vst3 или Clap. Данную структуру мы должны передать макросу nih_export_clap!(), nih_export_vst3!(), который и создаст нам плагин в нужном формате. 1. В папке src/lib.rs я создал несколько модулей в которых реализовал необходимые т
Оглавление

NIH-plug - Это незавершенный API-независимый фреймворк аудио плагинов VST3 и CLAP, написанный на Rust.

Незавершенный!!!. Некоторые функции или переменные могут измениться, функции будут принимать другое количество аргументов или переменные изменят тип. (Во время написания статьи уже происходили изменения).

Нам будет необходимо, не только подключить библиотеку в cargo.toml, но настроить систему сборки по инструкции..

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

$ cargo xtask bundle plugin-rs --release

Компиляция проекта `plugin-rs`

Создание базового плагина:

Для создания базового плагина, мы должный создать общую структуру для всего плагина. Для неё мы должный реализовать минимум 3 трейта Plugin + Default и трейт формата плагина Vst3 или Clap. Данную структуру мы должны передать макросу nih_export_clap!(), nih_export_vst3!(), который и создаст нам плагин в нужном формате.

1. В папке src/lib.rs я создал несколько модулей в которых реализовал необходимые трейты.

2. Создал структуру App в модуле plugin, которая будет общей всего плагина. основную реализацию Plugin + Default.

Константы NAME, VENDOR, URL, EMAIL, VERSION - отвечают за информацию. Имя плагина, производитель, ссылка на сайт, почта, и версия плагина.
Константы NAME, VENDOR, URL, EMAIL, VERSION - отвечают за информацию. Имя плагина, производитель, ссылка на сайт, почта, и версия плагина.

3. В модулях vst3, clap реализовал соответствующему формату трейт и макрос.

-3
-4

Реализация сводится к тому что необходимо заполнить константы. Это просто информация о плагине.

Результат

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

Чтобы правильно заполнить константы достаточно почитать документацию. Использовать авто-заполнение трейта или посмотреть пример.

Пропустить звук сквозь плагин.

На данный момент, я хочу создать плагин который пропускает через себя звуковой сигнал. Другими словами плагин, будет принимать сигнал из входного канала и передавать в выходной. Нам стоит убедится, что каналов больше нуля. DEFAULT_INPUT_CHANNELS, DEFAULT_OUTPUT_CHANNELS - создаст нужное количество входных и выходных каналов в буфере. Buffer передается в качестве аргумента в метод fn process().

-5

Метод fn process(), это то место где происходит вся обработка сигнала, создание нового (подмена сигнала на новый). Получение миди-событий, сайдчейна, или в нашем случае буфера.

Давайте рассмотрим на буфер более подробно. Этот тип содержит вектор с массивом f32, иными словами канал который хранит семпл. С помощью метода .iter_samples() мы сможем получить каждый канал, а у него и каждый семпл в нем. В итоге мы получим указатель(*) на семпл выходного канала (*sample), при этом который уже содержит семпл из входного канала. В нашем случае, мы добились первоначальной цели.

-6

т.е. мы можем получить значения через указатель и вернуть в туже переменную, как-то изменить или присвоить новое значение.

Громкости.

Наш плагин пропускает через себя сигнал, далее мы можем создать эффект который будет изменять уровень сингала Gain. Этот эффект очень прост, нужно представить что сигнал (*sample) который приходит в плагин - это 1.0, и уменьшение и увеличение этого числа это и есть наш эффект.

-7

Параметры:

Чтобы управлять нашим эффектом мы создадим параметр. Параметр будет отображаться средствами хоста.

1. В папке src/lib.rs я создал модуль в котором реализовал необходимый трейт.

-8

2. Новая структура Parameters, будет хранить все параметры в плагине.

-9

Мы использовали тип FloatParam, который принимает имя параметра, его значение, и диапазон. а также дополнительные методы со сглаживанием, размером шага изменения параметра, и имя формата измерений.

3. В модуле plugin подключил созданные параметры через Arc, и заполнил fn params(), так как этого требовал трейт Plugin.

-10

4. В методе process(), мы будем использовать созданный параметр для взаимодействия как эффект gain. Мы буде получать при каждой итерации значение из параметра и преобразовывать их в децибелы.

-11

Bypass.

1. По аналоги создадим еще один эффект Bypass, создает обходной путь чтобы получить неизменный сигнал. Имеет два состояния активный и неактивный.

-12

2. Теперь создадим параметр, который будет делать тоже самое.

-13

Мы использовали тип BoolParam, который прижимает два аргумента имя параметра и его состояние (Не активный).

3. В методе process(), мы будем использовать созданный параметр для взаимодействия.

-14

$ cargo xtask bundle plugin-rs --release

После компиляции мы получим два плагина vst3 и clap.