Статьи:

Профиль:

Создание Модулей в программе синтэдит


Программа Синтэдит имеет свою собственную СДК библиотеку, с помощью которой Вы сможете создавать Ваши собственные модули, для их дальнешего использования в Ваших плагинах. Модули программы Синтэдит могут обрабатывать миди, аудио и другие данные. Модули также содержат графику, для их адаптирования в интерфейс программы Синтэдит.

Для создания собственных модулей для синтэдита Вам необходимо уместь программировать на языке С++, иметь С++ компилятор. Также Вам необходимо скачать саму СДК библиотеку, это можно сделать с официального сайта:  Перейти. Тут же приведён перевод её документации на русский язык :) .

Итак, Вы имеете базовые навыки программирования на языке С++. Вам необходимо скачать один из компиляторов. Разработчиками программы были протестированы три компилятора:

Синтэдит
Руководство пользователя
Описание модулей
Описание модулей 2
Создание синтезатора 1
Создание синтезатора 2
Создание синтезатора 3
Единицы измерения
Оптимизация
синтез методом фазовых искажений
FM синтез
Создание Модулей
Создание фильтра
Создание дилея
Создание ревербератора
Создание флангера и хоруса
Создание эквалайзера
Создание компрессора
Создание вокодера
  • Microsoft Visual C++ — сама СДК библиотека была написана с использованием этого компилятора. Данный компилятор бесплатен (экспресс версия).
  • Gnu C++ — Это хороший, современный и бесплатный компилятор.
  • Borland free compiler — этот компилятор слишком старый и не работает с СДК библиотекой синтэдита.

Компиляция

Наипростейший пример модуля находится в папке «se_gain» (или используйте любую другую папку с файлами комплиляторов).

  • Пользователи Visual Studio — откройте проект модуля  »/se_gain/se_gain.vcproj», дайте команду «Rebuild All». В результате будет создан новый .dll файл, который будет готов к тестированию и автоматически скопирован в папку «C:\Program Files\SynthEdit\modules\MyModules\se_gain.sem».
  • Пользователи Dev C++ — откройте проект модуля «/se_gain/se_gain.dev», дайте команду »Rebuild All». В результате будет создан файл /se_gain/se_gain.dll. Копируйте его в папку с модулями программы Синтэдит и переименуйте его (C:\Program Files\SynthEdit\modules\MyModules\se_gain.sem) .
  • Пользователи  Borland Free Compiler — запустите файл «/se_gain/bc_make.bat», проект автоматически построится и скопируется в папку с модулями программы синтэдит.

После следующего старта программы Синтэдит — данный модуль будет доступен из меню программы  «Insert->MyModules->Gain Example».

Редактирование примеров для создания собственных модулей

Копируйте папку «se_gain». Не трогайте файл-проект (*.vcproj), но удалите файл-решения (*.sln). Откройте проект в Developer Studio. Измените название .sem файла. Откройте настройки проекта, выберите  пункт «build step» измените название файла напротив пункта «копировать». Постройте проект заново (FULL rebuild). Поместите Ваш алгоритм в тело функции «sub_process()» файла module.cpp

Технический обзор

Untitled-95

Синтэдит разделяет модуль на две секции:

  1. Цифровая обработка сигналов (DSP).
  2. Графика (GUI), внешний интерфейс плагина, каким его видит пользователь.

Обработка аудио данных должна иметь высокий приоритет (как процесс) и незначительную задержку, без прерывания на прорисовывание графики. Графика имеет меньший приоритет и имеет доступ к пользовательскому интерфейсу Windows (клавиатура, мышка и т.д.). Программа Синтэдит хранит эти данные разделяя каждый модуль на два класса, каждый из которых работает независимо, задания дублируются. Библиотека СДК обеспечивает механизм связи между этими двумя класами.

Класс внешнего интерфейса  GUI обновляется каждые 50 мс (20 гц), такая же частота обновлений как и между ВСТ плагинами/хост программами.

Некоторые модули, такие как Gain, содержат только код обработки аудио данных, некоторые только графики (Bitmap), некоторые объединяют в себе оба интерфейса (Waveshaper).

Как работает цифровая обработка сигналов (DSP).

Наиболее важная часть плагинов — это функция «sub_process». Именно эта функция и производит обработку сигналов. Для примера, Вы можете открыть файл gain.cpp, находящийся в папке gain, и найти в коде эту функцию.

Открыли ? Первое что можно заметить, это то что я использовал указатели (pointers) для доступа к буферам (после синтеза, звук помещается в маленькие контейнеры, последовательно пропускаемые в буфер, которые после воспроизводятся, это обусловлено тем что невозможно одновременно писать и считывать информацию). Когда в Вашей программе для создания музыки Вы задаёте уровень задержки (latency), — Вы задаёте именно размер  контейнера, измеряемый колличеством выборок (при частоте дискретизации в 44100 Гц в 1 секунде сигнала ровно столько выборок). Далее эти контейнеры распознаются звуковой картой, проходят через ВСТ модуль, потом наконец направляются на воспроизводящее устройство.

Итак, в данном модуле имеется указатель (pointer) и подсчёт колличества выборок, которые нужно обработать.

Untitled-104

Каждый контейнер содержит примерно 96 выборок. Допустим Вашему модулю даётся задание: «обработай первые 50 выборок контейнера, потом оставшиеся 46″.

float *in1   = buffer_offset + input1;

В данном коде вычисляется точка начала обработки.  Звёздочка не является умножением, это указатель (pointer) «in1″ на первую выборку. Во время обработки контейнера данный указатель будет перемещаться. Указатели второго входа и выхода работают в том же режиме.

Далее мы зададим петлю/цицл, для обработки запрашиваемого колличества выборок:

while(—sampleFrames >= 0)
{
}

Данный код считает запрашиваемое колличество выборок. Двойной минус означает «вычесть 1″. Т.е. это простая реверсивная петля/цикл (можно считать и прибавлением единицы). Далее обычно следует код, который отличает функциональность одного плагина от другого…

float result = input1 * input2;

Всё просто — входящие сигналы, значения выборок, перемножаются. Аудио данные представляются числами с плавающей точкой, которые обычно находятся в диапазоне [-1,+1], где ноль — это тишина. В программе синтэдит сигналы представлены как Вольты (+/- 10 вольт), т.е. Вам нужно вручную конвертировать значения умножением/делением на 10.

Далее мы скопируем результат наших расчётов в буфер аудио выхода

*out1 = result; //присвоили указателю out1 новое значение

Вот! Одна выборка готова, переходим к следующей:

in1++;

++ означает прибавление единицы, можно заменить кодом

in1 = in1 + 1;

Настройка входов и выходов модуля

Untitled-117

Модуль Gain имеет три коннектора: два входа и один выход. Коннекторы задаются функцией getPinProperties(). Однако в недавно вышедшей 3-ей версией СДК это можно сделать с помощью XML файлов.  Стандартно, когда Вы подсоединяете регулятор ко входу, то диапазон допустимых значений — [0,10]. Вы можете вручную изменить этот параметр.

SEM XML

Данный код предназначен для декларирования входов и выходов Вашего модуля. В старой SEM SDK входы и выходы описывались следующим образом:

// описание коннекторов (входов/выходов)

bool Module::getPinProperties (long index, SEPinProperties* properties)

{

switch( index )                                // перечислите Ваши входы/выходы

{

// типичный вход

case 0:

properties->name                = «Input»;

properties->variable_address    = &input1_buffer;

properties->direction           = DR_IN;

properties->datatype            = DT_FSAMPLE;

properties->default_value       = «8″;

break;

В 3-ей версиии СДК использован более простое, освновывающееся на XML описание:

<Audio><Pin id=»0″ name=»Input» direction=»in» datatype=»float» rate=»audio» default=»8″/>

Благодаря этому методу файлы описания модулей стали менее объёмными, добавление нового модуля более простым.

Ниже перечислены XML свойства плагина :

id
name
category
helpUrl
graphicsApi{HWND,composited,none}
polyphonicSource{ true, false }
polyphonicAggregator{ true, false }
cloned{ true, false }
voiceMonitorIgnore{ true, false }
GUI
Parameters
Pins
номер
название
категория
ссылка на помощь
графика{HWND,созданная,нет}
полифонич. источник{ правда, ложь }
Полифонич. арпеджиатор{ правда, ложь }
клонирован (?){ правда, ложь }
Игнорирование диагностики{ правда, ложь }
Пользовательский визуальный интерфейс плагина
Параметры
Входы/выходы

К сожалению подробной документации по свойствам плагинов нет. Ниже также приведены XML свойства входов/выходов:

id
name
datatype {float, int, text, blob, midi, bool, enum (DSP only. not fully supported)}
default
direction {in,out}
rate {audio} — float pins only.
private{ true, false }
autoRename{ true, false }
isFilename{ true, false }
linearInput{ true, false }
ignorePatchChange{ true, false }
autoDuplicate{ true, false }
isMinimised{ true, false }
isPolyphonic{ true, false }
autoConfigureParameter{ true, false }
parameterId
parameterField{ Value, writeable only in SynthEdit environment -ShortName , MenuItems,MenuSelection,RangeMinimum,RangeMaximum,EnumList,FileExtension
IgnoreProgramChange,Private,Automation,Automation Sysex,Default,Grab,Normalized }
metadata («,,40,0″ sets connected slider’s range 0->40).
notes
hostConnect{ PatchCommands, MidiChannelIn, ProgramNamesList, Program, ProgramName, Voice/Trigger, Voice/Gate, Voice/Pitch, Voice/VelocityKeyOn, Voice/VelocityKeyOff, Voice/Aftertouch, Voice/VirtualVoiceId, Voice/Active, VoiceAllocationMode, Bender, HoldPedal, Channel Pressure, Time/BPM, Time/SongPosition, Time/TransportPlaying }
номер
название
тип данных
настройки по умолчанию
направление {вход, выход}
частота {аудио}
приватный{ правда, ложь }
автоматическое переименование{правда, ложь }
имя файла ? {правда,ложь }
линейный вход{ правда, ложь }
игнорировать изменение установки{ правда, ложь }
авто-дублирование{ правда, ложь }
минимизирован ?{ правда, ложь }
полифонический ?{ правда, ложь }
автоматически настраиваемый параметр{ правда, ложь }
номер параметра
поле параметра{ значение, изменяемое только инструментами синтэдита -ShortName , MenuItems,MenuSelection,RangeMinimum,RangeMaximum,EnumList,FileExtension
IgnoreProgramChange,Private,Automation,Automation Sysex,Default,Grab,Normalized }
мета-данные
ноты
связь с хостом{ PatchCommands, MidiChannelIn, ProgramNamesList, Program, ProgramName, Voice/Trigger, Voice/Gate, Voice/Pitch, Voice/VelocityKeyOn, Voice/VelocityKeyOff, Voice/Aftertouch, Voice/VirtualVoiceId, Voice/Active, VoiceAllocationMode, Bender, HoldPedal, Channel Pressure, Time/BPM, Time/SongPosition, Time/TransportPlaying }

Обмен данными между графическим интерфейсом (GUI) и аудио (GSP)

Обмен данными в СДК3между граффическим и аудио интерфейсами такой же как и в СДК2, разве что в последней версии меньше кода. Посылающий интерфейс нуждается в выходе, получающий — во входе. Ниже приведён XML пример одного аудио коннектора, коннектора граффического интерфейса и параметра

<Plugin id=»SE PatchMemory Float Out»  name=»PatchMemory Float Out3″ category=»Sub-Controls» ><Parameters>
<Parameter id=»0″ datatype=»float» direction=»out»/>
</Parameters>

<Audio>
<Pin id=»0″ name=»PM Value Out» direction=»out» datatype=»float» parameterId=»0″ />
</Audio>

<GUI>
<Pin id=»0″ name=»PM Value In» direction=»in» datatype=»float» parameterId=»0″ />
</GUI>

</Plugin>

Декларация и инициализация интерфейса DSP происходит стандартно. Для посыла значения к графическому интерфейсу (GUI), просто задайте ассоциацию входа/выхода: «pinValueOut = 123.0;».

Типы окон

Программа Синтэдит поддерживает два типа окон:

1 — Стандартные окна.

Untitled-67

Это стандартные окна операционной системы Виндоус, которые используются практически во всех программах. Данные окна быстро рисуются, требуют незначительных ресусов процессора.

2 — Окна программы синтэдит.

Untitled-78

Данные окна предназначены для тех случаев, когда просто прямоугольных окон недостаточно, в графике есть, например, круглые элементы. При этом в загаловке Вашего файл с описанием графики нужно указать тип используемых окон.

Для простого окна Для окна синтэдита
MyPluginGui.hclass MyGui : public SeGuiWindowsGfxBase{MyPlugin.xml

<Plugin id=»SynthEdit Scope3″ graphicsApi=»HWND»>

class MyGui : public SeGuiCompositedGfxBase{

<Plugin id=»SynthEdit Scope3″ graphicsApi=»Composited»>

Настройка всплывающего меню

Также Вы можете настроить всплывающие окна, появляющиеся после нажатия по рабочей области правой кнопкой мыши.

Untitled-87

В Вашем .h файле В Вашем .cpp файле

virtual int32_t MP_STDCALL onCreateContextMenu();

virtual int32_t MP_STDCALL onContextMenu( int32_t selection );

int32_t MyGui::onCreateContextMenu()

{

getHost()->addContextMenuItem( L»Cat», 0, 0 );

getHost()->addContextMenuItem( L»Dog», 1, 0 );

return gmpi::MP_OK;

}

// действие, после выбора пункта

int32_t MyGui::onContextMenu( int32_t selection )

{

switch( selection )

{

case 0:

// ‘выбран пункт ’Cat

break;

case 1:

// выбран пункт  ‘Dog’

break;

};

return gmpi::MP_OK;

}

Размер буфера
Обычно размер буфера — 96 выборок, в звуковых картах обычно используется буфер объёмом 512-1024 выборок. Вы можете изменить размер в функции BlockSize().

Один комментарийСоздание Модулей в программе синтэдит

  • Vladimir

    Спасибо. Теперь осталось написать: как, конкретно, написать какой-либо модуль? По шагам. Тогда нам точно, ничего не нужно будет из плагинов — будем сами собирать:).

Вы должны быть залогинены для комментирования.