MIDI-синтезатор.

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

Несколько лет назад, для развития музыкальных наклонностей в моей семье, я приобрел MIDI-клавиатуру. Это был компромиссный выбор основанный на детальном сравнении различных видов электронных клавишных инструментов. Первым важным плюсом моего выбора было то, что MIDI-клавиатура намного дешевле полного синтезатора. И второй, самый «жирный» плюс — при подключении ее к запущенному на ПК программному синтезатору можно получить весь спектр звуков и эффектов как и у дорогих аппаратных синтезаторов. Найти в Сети пакеты виртуальных музыкальных инструментов совсем не проблема. Некоторые из них звучат очень классно, особенно меня впечатлили классические инструменты Edirol Super Quartet. Существенным минусом тандема «клавиатура-ПК» оказался длительный запуск и настройка программного обеспечения для начала музицирования. Я с этим мирился, но для моего ребенка это была серьезная проблема. Ему нужно было что-то простое, типа «включил и играй», пусть и не супер звучащее. Пока я не начал заниматься микроконтроллерами эта проблема висела в воздухе.

В один прекрасный день я решил, что может стоит замутить на AVR дешевый MIDI-синтезатор. Подобный проект был очень интересен мне как эмбеддеру. Поиски информации о принципах генерации сложных звуков на AVR контроллерах привели к выводу, что это очень, очень, … очень не тривиальная тема. В найденных мной примерах разработки MIDI-синтезаторов количество тембров и многоголосие были весьма ограничены. Это меня совсем не устроило, к тому же я не хотел завязнуть в собственных изысканиях по синтезу звуков. Продолжив поиск далее, я нашел ссылку на замечательный чип от VLSI Solution — VS1053B. Его официальная спецификация — OggVorbis/MP3/AAC/WMA/FLAC/MIDI Audio Codec. Вот даташит на это чудо. Согласно даташиту на борту у этого чипа присутствует MIDI-синтезатор с двумя банками инструментов и эффектом реверберации. Сам чип обошелся бы мне в 143 грн. По сравнению со стоимостью самого дешевого готового промышленного MIDI-синтезатора это сущие копейки. Чтобы не возится с платой под корпус LQFP48, я решил купить уже готовый модуль от SparkFun для Ардуины на базе VS1053B, который у них называется — Music Instrument Shield. Вот на него ссылка. Модуль потянул на 260 грн., что вполне вписывалось в бюджетное решение. Спаяв на макетке цепь опторазвязки входа MIDI, я смог запустить модуль, подключить клавиши и послушать звучание синтезатора на чипе VS1053. Качество конечно не такое как у Super Quartet, но вполне приемлемое, и к тому же 128 инструментов только в первом банке инструментов (их список есть в даташите) — это замечательно. Это было именно то, что я искал. Возможно на этом можно было бы и остановиться, но а где тут AVR? Где же наш дорогой и любимый эмбеддинг? Все далее….

Моя MIDI-клавиатура M-Audio Keystation 61, как очень дешевое изделие, сильно урезана функционально. На ней есть всего две кнопки выбора функций, которых не достаточно для быстрого и удобного управления инструментом. По-умолчанию после включения питания, эти кнопки позволяют смещаться вверх или вниз на одну октаву. Чтобы переназначить управление другими функциями, надо совершить очень хитрые комбинации нажатий кнопок и клавиш, которые запомнить сложно. Поэтому я решил к MIDI-модулю добавить микроконтроллерное управление, которое бы оживило недоступные с клавиатуры функции.

Интерфейс MIDI по сути оказался простым UART работающим на скорости 31250 бод, 8 бит данных, 1 стоп-бит и без контроля четности. Поэтому добавить AVR-посредника между клавишами и MIDI-модулем была не проблема. Этот контроллер должен был транслировать через себя MIDI-команды полученные с клавиатуры и вставлять необходимые команды управления. Так родилась концепция моего синтезатора. Детальная проработка позволила разделить устройство на три блока: питание, MIDI-Audio и управление.

Первый блок — блок питания.  Ничего революционного в нем нет. Схема классическая. Трансформатор 20 ватт, на выходе выпрямителя получаем 9 вольт, которые отдельным шнуром выводятся для питания MIDI-клавиатуры (т.е. мой синтезатор выступает еще и блоком питания для клавиш). После выпрямителя идет стабилизатор на LM7805 (КРЕН05), который выдает питание 5 вольт на все цифровые и аналоговые цепи. Тут все просто.

Второй блок — блок MIDI-Audio. Блок имеет цифровую и аналоговую части. На плате четко видно разделение цифровой и аналоговой земли. MIDI-модуль подключается сверху в разъемы на плате блока (прям как к Ардуине). На цифровой части находятся разъем MIDI, опторазвязка преобразователя MIDI-TTL и контроллер-посредник ATtiny2313. Контроллер транслирует через себя данные со входа Rx на выход Tx, это канал от клавиш к синтезатору VS1053. Команды управления контроллер получает от блока управления асинхронно параллельным кодом (это для скорости) на порт В. Блок управления сигнализирует контроллеру о готовности передачи байта сигналом внешнего прерывания. По окончании приема всех байтов MIDI-команды контроллер сразу выталкивает их на выход Tx, т.е. в синтезатор. На этом пока все обязанности контроллера-посредника заканчиваются. Работает контроллер только на прерываниях. На аналоговой части блока расположено два стерео усилителя: первый — линейный, второй — для наушников. Линейный усилитель усиливает слабый сигнал с аудио-выхода MIDI-модуля и выводит его на разъемы линейного выхода (разъемы типа тюльпан). На усилитель для наушников сигнал линейного выхода попадает через сдвоенный потенциометр регулятора громкости. Выход усилителя наушников оформлен в виде разъема под пальчиковый штекер. В этом блоке тоже все достаточно просто, без нюансов.

Третий блок — блок управления. Основа блока контроллер ATmega16. Порт С этого контроллера используется для передачи команд управления в блок MIDI-Audio. К этому же порту также подключен LCD на 2 строки по 16 символов (в моем случае это WH1602С). На LCD выводится номер и название (по даташиту VS1053) текущего инструмента. Все выводы порта A контроллера используются как входы АЦП. На текущий момент задействованы только 2 входа. К ним подключены потенциометры, с помощью которых задается уровень реверберации и время задержки реверберации. Остальные шесть входов пока заглушены и возможно будут использованы для будущих функций. На плате блока имеется преобразователь уровней RS232-TTL — чип MAX232N, для обеспечения подключения синтезатора к СОМ-порту компьютера. Это задел для будущих функций. Есть у меня мысли о загрузке с ПК небольших музыкальных семплов в память контроллера для подыгрывания исполнителю на втором MIDI-канале. Порт B используется для работы с матричной клавиатурой и светодиодами. Половина выводов этого порта подключена к двоично-десятичному дешифратору 74HC154N (аналог К155ИД3), который позволяет организовать до 16 вертикалей для матрицы клавиатуры (хотя я использовал всего 7). Эти выводы также управляют сдвиговым регистром 74HC595, который на прикрепленной к передней панели платке может зажигать до 8 светодиодов (запаяно 3, используется пока 1).

Клавиатура выполнена на отдельной плате, которая прикреплена к передней панели корпуса. Кнопки разделены на две группы: 8 кнопок управления и 20 кнопок для быстрого выбора инструментов. Текущая версия прошивки контроллера блока управления позволяет кнопками управления выбрать один из 128 инструментов и привязать его к любой из кнопок быстрого выбора. Данная привязка сохраняется в энергонезависимой памяти и сохраняется с выключением питания. Также сохраняется и последний выбранный инструмент, который автоматически выбирается сразу после включения устройства.

На этом я пока завершу рассказ о моем синтезаторе. Данный проект обязательно будет развиваться далее, впрочем как и эта статья. По мере появления доработок и интереса к моему устройству, я буду сюда дописывать.

Ссылка на архив с разводками плат и исходниками прошивок на IAR. 

Ссылка на схемы

Запись опубликована в рубрике Разное с метками , , . Добавьте в закладки постоянную ссылку.

27 комментариев: MIDI-синтезатор.

  1. s_black говорит:

    Уровень исполнения потрясающий !!!

  2. Висоник говорит:

    Неплохой проект

  3. саша говорит:

    а когда будит схема самого девайса?

  4. саша говорит:

    хочется попробовать повторить и оценить инструмент 🙂

  5. s_black говорит:

    Схема скоро будет. Обязательно повторите и оцените!

  6. BQ Elite говорит:

    Корпус, БП, процессорный модуль,усилитель… То,что надо. Но я бы еще добавил маленький штрих в схемку процессорного модуля — а именно sd карточку. Поиграл — и прослушал, на карту сохранять в формате микросеквенсера, если будет прямо в midi или rmi писать — замечательно. Для ребенка запись и прослушивание своей игры одной кнопкой должно понравиться. Да и для взрослого =)

  7. rtgv говорит:

    Номиналы рассыпухи бы…хотя бы…

  8. servio говорит:

    Я постараюсь нарисовать схему в течении одного, двух дней.

  9. Василий говорит:

    Звук как, ничего? Демо можешь выложить?

  10. Анатолий говорит:

    Хотел бы повторить ваш проект. Будут ли схемы в открытом доступе?

  11. s_black говорит:

    НаписАл письмо автору…. Пока молчит (((

  12. s_black говорит:

    Многоуважаемый автор ответил — был долгое время в командировке. Схемы сейчас готовит, так что в открытом доступе они будут. Демо звука также запишет, а я потом выложу на сайт.

  13. servio говорит:

    Я начал рисовать схемы блоков. В статью добавил ссылку на PDF-файл со схемами. Пока в этом файле только схема блока MIDI-Audio. Схему блока управления нарисую на выходных. Демо звука запишу уже после завершения рисования всех схем. Пока могу описать звук по своим субъективным ощущениям. Схожесть с реальными инструментами есть, но далеко не идеальная. Это понятно. Чип дешевый, метод синтеза звуков самый простой, к тому же миди-синтезатор в нем не самая главная функция. Этот чип позиционируется как кодек MP3 и других аудио-форматов. Но несмотря на среднее качество некоторых (т.е. не всех) инструментов, играть можно. Детям будет вообще кайф. 128 инструментов — 128 разных звуков.

  14. servio говорит:

    Схемы дорисовал. Все в файле PDF на 3 страницах. Если будут вопросы по схемам, то обращайтесь, постараюсь отвечать на них без задержек.

  15. tramper говорит:

    Отличное исполнение! Очень хотелось бы повторить. Из этого возник вопрос: где и как преобретали данную плату? Ответ можно в личку.
    Ну и по поводу «любимого эмбеддинга»: не пробовали разобраться с возможностями программирования самого VS1053B? Вроде как можно было бы все реализовать непосредственно на нем? Или я путаю с VS1103 (я на него изначально «глаз положил»)?
    Ну да, разбираться с новой архитектурой и все такое. Но обвески меньше и задерки по отклику…

  16. servio говорит:

    Music Instrument Shield я купил в магазине на Ушинского 1, это около радиобазара Караваевы Дачи. На их сайте http://www.rcscomponents.kiev.ua уже этой позиции нет в наличии, но она доступна под заказ (код товара 41656). Возможно кто-то еще продает эту платку, стоит погуглить SPARKFUN Music Instrument Shield for Arduino. Если есть возможность самостоятельно изготовить плату с разводкой под корпус LQFP48, тогда получиться сэкономить 100-150 грн.

    Судя по даташиту в VS1103 тоже есть синтезатор, такой же как и в VS1053B. Для перевода этих чипов в режим миди-синтезатора можно обойтись и без специального программирования. В даташите описано какие ноги нужно посадить на землю при подаче питания, чтобы включить данный режим.

    Music Instrument Shield мне не позволил управлять конфигурацией VS1053B, т.к. его выводы серийного порта на плате не доступны. Я не стал курочить плату и ограничился конфигурацией по-умолчанию. Но эта конфигурация не самая идеальная. В даташите я прочел, что можно разогнать чип по частоте и улучшить тем самым звук инструментов и эффект реверберации.

  17. s_black говорит:

    Вот отличный вариант покупки VS1053 за 13,10 $ с бесплатной доставкой.

  18. Андрей говорит:

    Здравствуйте,может уже и запоздал с вопросом,но всё же спрошу в надежде на ответ. Заказал такой модуль http://www.ebay.com/itm/MP3-music-breakout-board-VS1053-with-SD-card-slot-work-with-Arduino-/311309482122?pt=LH_DefaultDomain_0&hash=item487b7db88a&nma=true&si=qx2KB%252B2ZQv0ADOG25TIdyov6IPI%253D&orig_cvip=true&rt=nc&_trksid=p2047675.l2557 Как его согласовать с миди клавиатурой http://www.cme-pro.ru/uf-80.html В клаве имеется отдельный четирёх -жильный провод питания с фишкой 9V и отдельно двух-жильный с фишкой миди.Хотелось бы управлять переключением звуков с клавиатуры,а не как в вашем варианте.На какие ножки на плате что подключать.Очень надеюсь на вашу помошь.Собирается для занятий ребёнка и хотелось бы иметь независимое от компа устройство.С ув.Анрей

  19. servio говорит:

    Здравствуйте. На плате заказанного Вами модуля не используется вывод midi-входа VS1053. Я на фото модуля на сайте не нашел разводку к этой ноге чипа. Возможно плату можно будет доработать и отдельно подключиться к этому выводу. Я рекомендую почитать даташит на VS1053, который есть в моей статье. Там есть описание назначения ног чипа и описание как запускать режим синтезатора при включении питания. С этим надо разобраться, иначе не получится использовать этот модуль напрямую с клавиатурой.

  20. Андрей говорит:

    Вот что нашёл :
    1. VS10xx Real-Time Midi Input

    With a small addition to the prototyping board / standalone player board, it can be
    used as a standalone real-time MIDI synthesizer, that takes its input from a generic
    MIDI keyboard. The following circuit implements a MIDI IN connection that can be
    used with all standard MIDI equipments that has a MIDI OUT connection

    This is very convenient way to compose MIDI music intended to be played with the
    VS1003B or VS1033C. Optimizing and fine-tuning the music to the specific chip will
    become faster and easier.
    In addition to the handling of real-time MIDI IN from UART (31250 bps), the RT-Midi
    code also handles real-time input from the serial data interface (SDI). Both UART and
    SDI inputs can be used with the same code, but they should not be used simultaneously.
    When SDI is used, 0x00 must be sent first, then the actual MIDI byte. This guarantees
    that the midi command goes straight to processing and does not get stuck waiting in the
    16-bit SDI receive register.
    In VS1053b and VS1103b the real-time MIDI mode is available in the firmware ROM,
    and can be started by having GPIO pins in specific states at reset or by a small patch
    code

    1.1 Boot Images
    The real-time midi input software is loaded from SPI eeprom at power-up or reset when
    GPIO0 is tied high with a pull-up resistor. The memory has to be an SPI Bus Serial
    EEPROM with 16-bit addresses. The SPI EEPROM boot images can be found from the
    code/ subdirectory. Note that this application is highly chip-specific. It only
    works on the exact firmware versions mentioned.
    For RT-MIDI with VS1053b and VS1103b consult their respective datasheets.

    Chip File Features
    VS1003B rtmidi1003b.bin Version for VS1003B
    VS1033C rtmidi1033c.bin Version for VS1033C

    The input clock is assumed to be 12.288 MHz. The SCI CLOCKF value is 0xc000 (4.0£
    12.288 MHz). Volume (SCI VOL) default value is 0x0303, i.e. -1.5 dB.

    В документе есть ещё схемка.Как сюда можно загрузить файл в формате pdf?

  21. Андрей говорит:

    А вот всё что есть в дата шите :
    9.10 Real-Time MIDI
    If GPIO0 is low and GPIO1 is high during boot, real-time MIDI mode is activated. In this mode the PLL
    is configured to
    4
    .
    0
    ×
    , the UART is configured to the MIDI data rate 31250 bps, and real-time MIDI data
    is then read from UART and SDI. Both input methods should not be used simultaneously. If you use
    SDI, first send 0xff and then send the MIDI data byte.
    EarSpeaker setting can be configured with GPIO2 and GPIO3. The state of GPIO2 and GPIO3 are only
    read at startup.
    Real-Time MIDI can also be started with a small patch code using SCI.
    Note: The real-time MIDI parser in VS1053b does not know how to skip SysEx messages. An improved
    version can be loaded into IRAM if needed.

  22. Андрей говорит:

    Не могу понять ,куда можно подпаяться,к 9 и 34 ноге?или там ставится перемычка для включения режима миди?Спасибо за помощь.

  23. servio говорит:

    Вот-вот именно это я и имел ввиду, когда говорил о включении режима синтезатора при подаче питания. Т.е. эти выводы чипа должны иметь указанный уровень на момент включения. Тоже касается и выхода наушников. В даташите есть описание стартовой конфигурации и этого выхода. Остаётся только подключить клавиатуру. Там все просто. Нужно собрать только преобразователь уровней на оптроне. Если посмотреть схему блока MIDI-Audio моего устройства, которая приложена в pdf-файле к статье, то там можно увидеть такую развязку на оптроне 6N138 (кусок схемы под словом MIDI-IN). Сигнал с 6 вывода 6N138 можно подавать на вывод входа midi VS10XX и этого будет достаточно.

  24. Lheu001 говорит:

    день добрый!
    меня очень заинтересовала данная статья, но у меня другая проблема.
    Есть у меня миди клавиатура FATAR SL880, которая перестала функционировать, при включении светодиоды загораются, переключаются режимы видно визуально все те же светодиоды, а на выходе команды в звуковой модуль нет. полазил на разных форумах, все сталкиваются с проблемами в этих клавиатурах. Схематично установлен один процессор ( о котором информации хрен найдешь) и микросхема памяти с прошивкой.
    Можете мне помочь (посоветовать), хочется выкинуть всю долбаную Фатаровскую начинку и поставить другую. КАКУЮ — вот и вопрос.

  25. servio говорит:

    Добрый день.
    Готового модуля, который бы заменил мозги клавиатуры вы не найдете. Мне ничего подобного не попадалось на глаза. Самый ПРОСТОЙ способ решить проблему — найти рабочий контроллер из другой клавиатуры. Конечно можно пойти и сложным путем — самостоятельно собрать такой контроллер, но этот путь больше подойдет опытному эмбеддеру.
    Когда я разрабатывал схему представленного в статье синтезатора, я детально изучал особенности midi-протокола. Как оказалось, в нем нет ничего сложного. Простейшую схему, которая будет генерировать midi-команды можно собрать на любом микроконтроллере у которого есть аппаратный UART. Это действительно не очень сложно. Такое можно сделать даже на Ардуине. Но простота генерации midi-команд теряется в сложности схемы сканирования клавиш в большой клавиатуре. Это самая тяжелая функция. Ее конечно можно решить и это для эмбеддера интересная задача, но времени уйдет куча.

  26. Lheu001 говорит:

    я думал по поводу платы с другог контролера, но попадаются на 49 или 61 клавиша. А как я понимаю, в них не подключишь клавиатуру в 88 клавиш.
    По сути мне бы без наворотов схему, достаточно что бы были колеса пич-бенд, модуляция и динамика и послекасание.

  27. ub9yuf говорит:

    А под иной чип синтезатора всю систему, я так понял, доработать можно??? Например, иногда, в старых DVD-плеерах встречается чип Dream SAM2193 (ATSAM2193 в версии от Atmel). Аппаратный таблично-волновой синт, с довольно неплохим банком CleanWave, полифонией 38 голосов, ревером и хорусом. Справочный лист на микру: http://pdf1.alldatasheet.com/datasheet-pdf/view/100290/ATMEL/ATSAM2193-G.html

Добавить комментарий

Ваш e-mail не будет опубликован.