www.diyfactory.ru



  Ответ в темуСоздание новой темыСоздание опроса

> Синт на ПЛИС, Синтезатор на базе ПЛИС
sea
7.12.2014 - 19:04
Цитировать сообщение




Unregistered












:


Я уже давно начал ставить эксперименты с синтезом, сначала на микроконтроллерах, но как-то очень сильно не хватало вычислительных ресурсов, пока не открыл для себя ПЛИС. Программируемые логические матрицы для проектирования синтезаторов оказались очень хороши тем, что все получается блочно и независимо друг от друга (как на ТТЛ микросхемах, только в одном корпусе).

Изначально я начал делать конкретный синт с конкретными параметрами, но сам модульный принцип создания устройств на ПЛИС привел к тому, что начала вырисовываться платформа для создания в принципе любого синтезатора: нужно просто набрать нужных блоков, соединить их, скомпилировать и зашить в микросхему ПЛИС. К внешним выводам подключить необходимые внешние платы расширения (миди вход, аудио выход, VCF, VCA и так далее).

Развитие проекта состоит в том, что разрабатываются модули. Часть модулей существуют в виде логических схем исключительно в ПЛИС, например DCO (Digital VCO). Другие модули являются программно аппаратными, то есть модуль внутри плис через внешние выводы как то взаимодействует с какой-либо схемой снаружи.

Уже готовы следующие блоки:

- MIDI_IN - программно-аппаратный модуль: состоит из схемы на оптроне, которая преобразует сигнал к ПЛИСовому 3.3 вольтовому входу. Программная часть принимает поток МИДИ и разбирает его. Реализована поддерка пока только канальных сообщений ( Note ON, Note OFF, Polyphonic Key Pressure, Control Change, Program Change, Channel Pressure, Pitch Wheel Change).
- DCO - Цифровой генератор на базе DDS. Частота дискретизации (как и у всех остальных блоков) равна 50 МГц. Разрядность - 32 бита, то есть через заданный интервал времени, значение аккумулятора DDS меняется от 0 до МАКС. По сути это пила. Нужно 8 битную пилу - берем старшие 8 бит. Нужно 16 битную - берем старшие 16.
- Note2DDS - преобразователь ноты (0..127) в значение приращения аккумулятора dds32 чтобы при добавлении его 50М раз в секунду получалась нужная частота(50МГц). Преобразую по таблице.
- Note+pitch2DDS преобразователь Note (0..127) + pitch (0..8192) в значение приращения аккумулятора dds32. Пришлось повозиться с математикой, чтобы получать промежуточные значения. В прямую посчитать функцию корня и степени на ПЛИС никак, пробовал аппроксимацию полиномом... но сравнив точность и ресурсоемкость применил таблицу и линейную интерполяцию. В итоге питч сейчас от -1200 до +1199 при значении питча от 0 до 8192, то есть +- одна октава. В FL студии отрабатывает корректно.
- DCA Digital VCA. Модуль, который перемножает два 8битных значения и получает одно 16 битное. Может применяться для создания чистого ПЛИС синтезатора, без внешних аналоговых модулей.
- VCA VCA на базе аналогового ключа. Состоит из аппаратного модуля схемы с ключем и фильтром и модуля внутри ПЛИС, который генерирует управляющие сигналы для ключей. По сути ПЛИС генерит ШИМ сигнал с параметрами 8бит 195 КГц. Модуль еще в стадии разработки, но я уже смог сравнить разницу между VCA и DCA.
- ADSR модуль внутри ПЛИС, с 4 входами: A, D, S, R каждый 32 бита. Уже работает. Для его работы еще есть модуль экспопреобразователя, чтобы МИДИ число 0..127 преобразовать во время нарастания 0..12 секунд.
- DCF цифровой БИХ фильтр, готов где-то на 75%, есть нюансы с математикой. Но пока его разработку отложил из за того, что аналоговый VCF интереснее.
- VCF на переключаемых конденсаторах. Управляется частотой, которая в Х раз выше частоты среза. Пока в разработке.
- Audio OUT - 1 битный ЦАП. Есть варианты: ШИМ, дельтасигма, есть еще идеи.

Из того, что есть уже в принципе можно собирать синты, не хватает только фильтра. Сейчас уже получается подключить и "попиликать".


Прелести платформы.
- Переносимость. Дело в том, что в принципе разработка модулей для ПЛИС ведется на Verilog, после этого они без без изменений могут быть применены на любой ПЛИС из линейки одного производителя (в моем случае Altera). И даже могут быть перенесены на Xilinx (у меня пока нет возможности проверить, но не вижу проблем). При сборке проекта мы просто создаем нужное количество модулей, соединяем, назначаем их на пины корпуса ПЛИС и смотрим результат: влезает проект в ПЛИС - отлично - загружаем. Не влезает - берем ПЛИС пожирнее и грузим в нее. Изменения исходных кодов, чтения мануалов по портам и прочим внутренне-архитектурным вопросам не потребуется.
- Плюсы благодаря тому, что это ПЛИС. Микроконтроллер все свои вычисления делает последовательно, это накладывает ограничения на скорость, например, расчетов волноформ. Это приводит к тому, что приходится снижать дискретизацию. На ПЛИС никаких последовательных вычислений по программе не производится (во всяком случае пока). Внутри ПЛИС организуется жесткая логическая схема из регистров и элементов И/ИЛИ/НЕ, и, к примеру, генераторы сигнала работают независимо друг от друга. Независимо от того, сколько их. На данный момент почти все модули проекта работают на частоте 50 МГц. Ну и естественно все тайминги, временные интервалы можно получать очень точно и достаточно просто (к примеру на МК сделать VGAвыход - это на пределе, а ПЛИС самого начального уровня делают это легко, т.к. это тупо счетчики).
- Возможность подключения большого количества внешних модулей. Любая самая простая ПЛИС имеет минимум 40 линий ввода вывода, поэтому тут можно вздохнуть свободно.

Как строить свой синт?
Пайка микросхем на 200 ног! Это не потребуется. Я просто беру девборду с ПЛИС и соединяю ее с платой внешних модулей. Плату внешних модулей можно делать ЛУТ, или я не знаю как еще. Кому как удобнее. Мне сейчас удобнее монтаж накруткой, что я и делаю. Вот пример пиликалки на текущий момент

User posted image

user posted image

Подробнее про монтаж накруткой можно почитать в моих статьях на хабре 1, 2.

На данный момент пока не разработаны внешние модули по работе с элементами управления, типа крутилок-резисторов, енкодеров, экранами и прочее. Поэтому синт может быть пока только МИДИ управляемым. Для этого надо писать VSTi плагин. Но благодаря Ctrlr.com все немного упрощается.

user posted image

Но в принципе ADSR я назначил на стандартные контролы, поэтому получается рулить прямо из FL Studio.

user posted image

Есть первые результаты на SoundCloud. Музыкант из меня никакой, поэтому не претендую на оригинальность композиций. Плюс фильтров пока нет, а они создают основной характер для электронного синта.
SAW 220 Hz
Square 440 Hz
Stereo Noise
SAW 200 Hz and SAW 1 Hz to DCA (Digital VCA)
Mixer test (poliphonic sound)
Pitch Wheel Test

Обоснованность некоторых решений
Очень, блин, трудно иногда разговаривать с человеками, которые любят старые аналоговые синтезаторы. Новый и не совсем аналоговый синтезатор по определению для такого человека не будет тру, че бы ты ему не говорил. Так же и синт на базе ПЛИС будет тут же причислен к ЦИФРЕ, хотя он цифровым может и не являться. Тот же электроорган Вермона с микросхемой-дителетем по сути является цифровым - ведь там логическая микросхема! А фиг - не убедишь.

Что решено сразу НЕ ДЕЛАТЬ, так это не делать синт, у которого будет выход с помощью стерео ЦАП. Потому что в принципе что бы там до ЦАП не происходило, результат будет такой же, как на компьютере, а если нет разницы.... Во-вторых это дискретизация. В третьих - всего один стерео выход.

Как я решил делать: каждый голос должен выводиться из ПЛИС по отдельности. То есть, в приниципе, если понадобится, то можно будет каждый голос хоть по отдельности записать или подать на отдельный вход миксера.

Цепочка отдельного голоса VCO-VCF-VCA. Вывод волноформы из ПЛИС пока делается с помощью ШИМ. Пока получается 8бит и 195 КГц, но у меня есть мысли на тему того, как это улучшить. Но даже если этого не делать, то 8 бит идет только на один голос, плюс громкость не меняется (она будет меняться на VCA), то есть чистая волноформа идет с размахом на все 8 бит (а это около 60дб). Даже если там что-то и не так, то вся дискретность сигнала потеряется на аналоговых VCF и VCA. Если не убедил - копаем в сторону PPG Synth.

В принципе, никто не мешает сделать модуль чисто аналогового генератора, с контролем его модулем на ПЛИС. Тут уже будет чисто аналоговый генератор. Не подкопаешься.

Генерацию LFO и ADSR внутри плис. По ADSR я обосновываю тем, что в таком случае можно будет четко определять, когда работа одного голоса уже точно закончилась и его можно будет применять повторно. Это пригодится при работе с полифонией.

Буду рад услышать комментарии, предложения и критику (если она не по теме "не аналог"). Еще, конечно, нужна бы определенная мат. помощь, но я в чудеса практически не верю.

sea - 7.12.2014 - 19:15
Top
кактус
18.06.2016 - 15:42
Цитировать сообщение




Unregistered












:


sea сам не молод, но цифра не цифра не важно, важен сам звук! Поэтому давно слежу за этой темой, есть единицы и на других форумах кто ПЛИС использует в этом же ключе. Мне тема интересна...но ничего в программировании не понимаю..))
Жду продолжения. Вот.
Top
2 (2 0 )
0 :

Опции темы Ответ в темуСоздание новой темыСоздание опроса

 

<% COPYRIGHT %>