MIDI-синтезатор реализованный на ПЛИСобладает минимальной задержкой от нажатия на клавишу и до начала звучания, это заметно, особенно по сравнению с софтовыми синтезаторами. Но главное, такое решение открывает широкое поле для музыкальных экспериментов, поскольку сочетает гибкость программного со скоростью, производительностью и реакцией аппаратного.
Дополнительное оборудование: миди-клавиатура, миди-кабель, динамик.
Использованные готовые модули: приёмник UART из проекта http://opencores.org/project,uart2bus (uart_rx.v, baud_gen.v)
Получение команд.
Миди-клавиатура сама по себе не создаёт звука, только воспринимает и передаёт команды, главным образом нажатия и отпускания клавиш. Моя клавиатура Axelvox key 49j посылает сообщения одновременно через usb-интерфейс на компьютер, и в миди-порт. Миди-порт по сути представляет собой uart, и я просто завожу его прямо на плату. Этого вообще-то делать нельзя, должна быть развязка оптопарой, (эх, сделали бы совместимость с papilio - можно было бы использовать это - http://papilio.gadgetfactory.net/index.php?n=Papilio.MIDIAudioWing ). Пока всё нормально работает, видимо, потому что и клавиатура и плата висят на usb одного компьютера.
Для расшифровки сигналов uart на ПЛИС я использовал готовый компонент с open cores. Если с уарта пришло три байта, и старший из них код нажатия или отпускания, то у нас готова команда для выполнения. Второй и третий байт дают номер клавиши и скорость нажатия. Подробнее можно почитать вот здесь: http://www.midi.org/techspecs/midimessages.php
Синтез звука.
Синтезатор имеет 4 голоса (задаётся параметром), при нажатии ищется первый свободный канал. Звуковые сигналы от каналов в конце просто суммируются. Генерация начинается с синусоиды, которую я взял целиком из проекта "апгрейд Подмосковных вечеров". Разрядность повышать не стал, вот будь бы ЦАП получше... Начинаем модулировать.
Генератор огибающей.
Начнём с того, что звук клавиши должен меняться со временем - сначала атака (https://ru.wikipedia.org/wiki/Атака (музыка)), затем удержание и затухание. Эта задача решается в модуле AttackModulate - исходный сигнал умножается на кусочно-линейную функцию.
Обертоны.
Далее, звук простой синусоиды не слишком интересный, поэтому во-первых, частота слегка модулируется пилой (FM-синтез, частотное вибрато). Чтобы обогатить звук гармоническими обертонами впринципе можно использовать тот же FM-синтез, но я отдельно сгенерировал три гармоники частоты 1/2, 1/4, 1/8 каждая со своей огибающей(каждый очередной обертон затухает быстрее), и сложил. Принцип построения позаимствован из справочника Л.А.Кузнецова "Акустика музыкальных инструментов", рис. 2.33.
После синтеза цифровой звук преобразуется в аналоговый сигнал методом ШИМ, хорошо бы его заменить на настоящий ЦАП. В итоге сигнал выводится на колонку.
Вспомогательные функции.
На плате ко входу АЦП присоединён переменный резистор, который позволяет динамически менять какой-нибудь параметр, или выбрать, какую часть отладочной переменной отобразить на имеющиеся на плате четыре светодиода.
Итог: синтезатор работает, звук ... не слишком впечатляет, зато скорость реакции заметно лучше чем у MS software midi-synth. Гибкость ПЛИС-решения позволяет менять любую часть решения, можно например, сделать инструмент в натуральном строе вместо равномерно-темперированного, а также реализовать свой алгоритм синтеза звука.
Проект Altera Quartus II для платы Марсоход2 можно взять в разделе "загрузки" или вот здесь:
Обновление для проекта вот здесь:
Подробнее...