Миди файлы в формате smf

Обновлено: 07.07.2024

В своих статьях о переходе на российский микроконтроллер К1986ВЕ92QI я ни раз рассказывал о генерации звука средствами микроконтроллера. Тогда передо мной стояла задача лишь воспроизвести данные. Для создания этих самих данных, получаемых из MIDI файлов, использовались весьма экзотические методы, например, как в этой статье. Да, подобные методы имеют право на жизнь, если требуется получить данные для воспроизведения пару раз в жизни. Но так как я достаточно часто сталкиваюсь с задачами, когда на контроллере нужно получить достаточно сложный звук, или же звук — лишь дополнительная опция, то задача преобразовывать MIDI файлы такими экзотическими способами, становится весьма нетривиальной. В этой небольшой серии статей я поставил для себя задачу создать (а за одно и подробно рассказать о процессе создания) универсальную программу для преобразования MIDI файлов в приемлемый для микроконтроллера формат, а так же генерирующую все необходимые для микроконтроллера данные инициализации.


Итогом данной статьи станет реализация основного функционала программы: создание массивов нота-длительность, созданного из MIDI файла. Кто заинтересовался — прошу под кат.

Структура статьи

  1. Выработка требований к программе.
  2. Определение способа реализации.
  3. Общие сведения о MIDI.
  4. Заголовок.
  5. Блок MIDI файла.
  6. События.
  7. Разбор полученных данных.
  8. Заключение.

Выработка требований к программе

Как уже говорилось выше, основной задачей нашей программы будет преобразование данных из MIDI формата в наш собственный. Иначе говоря, перед нами не стоит задачи учитывать силу нажатия клавиш, использование редких инструментов или же использования эффектов, предусмотренных стандартом MIDI. Всю эту и подобную ей ненужную информацию мы должны игнорировать. По окончании работы программы, мы должны получить N-е число массивов, в каждом из которых в текущий момент времени будет играть лишь одна клавиша (это нужно для упрощения программы в микроконтроллере). Иначе говоря, мы должны получить список массивов с полифонией в одну ноту.

Определение способа реализации

Общие сведения о MIDI

Многие знакомы с MIDI форматом, или, по крайне мере, о нем наслышаны. В этом формате удобно хранить, например, ноты музыкальных произведений, с возможностью прослушать их. Именно для этой цели, чаще всего, MIDI и используется в современном мире. Но когда-то в него пытались запихать достаточно много всяких дополнительных функций. Так из чего состоит MIDI файл?


  • Заголовка файла (он начинается с четырех символов, составляющих слово MThd).
  • Блоков файла (начинающихся с символов MTrk).

Заголовок


Разберем, из чего состоит заголовок MIDI файла.

  • Стандартные значения. В заголовке присутствуют ячейки, значения которых одинаковы для всех MIDI файлов.
    1. Надпись заголовка «MThd». Данный параметр позволяет однозначно сказать, что перед нами блок заголовка.
    2. Размер индивидуальных параметров файла в блоке заголовка. Так как в заголовке всегда присутствуют 3 индивидуальных параметра, каждый из которых занимает по 2 байта — то общая длинна блока заголовка (без учета надписи «MThd» и четырех байт самого размера) составляет 6 байт.
  • Индивидуальные параметры.
    1. Формат MIDI файла. По сути говоря, форматов MIDI файла всего 2: 0 и 1. Имеется еще формат 2, но за всю свою девятилетнюю работу со звуком, в реальной жизни мне так и не довелось столкнуться с MIDI файлом в этом формате. Данный параметр показывает, как упакованы события (в нашем случае, нажатия/отпускание клавиш). Если перед нами формат 0, то мы знаем наверняка, что вся полезная информация обо всех каналах (коих может быть до 16) расположена в одном единственном блоке MTrk. Если же перед нами формат 1, то каждый канал имеет свой собственный блок MTrk. Наша программа будет иметь возможность работать с обоими форматами.
    2. Число блоков MIDI файла (MTrk). Тут мы можем посмотреть, сколько блоков содержится в нашем MIDI файле. Данный параметр актуален лишь для формата 1. Ибо в формате 0 блок всегда 1.
    3. Формат времени MIDI файла. А вот тут дела обстоят весьма интересно. Дело в том, что в MIDI файле счет идет не секундами, а «тиками». Причем существует музыкальный способ, когда значение нашего параметра показывает, сколько «тиков» приходится на музыкальную четверть и абсолютный, показывающий количество «тиков» в SMPTE блоке. Опять же. Чаще всего встречается первый способ. Второй, все таки, экзотика. Поэтому мы не будем учитывать существования абсолютного способа отсчета времени и будем оперировать только музыкальным.

Итак, считываем заголовок.

  1. Для работы нам нужно создать Windows Forms приложение (WPF тут без надобности, но если хотите, то никто не запрещает).
  2. Внутри формы создадим button и richTextBox (у меня они имеют имена button1 и richTextBox1 соответственно), а так же окно для открытия файла openFileDialog (у меня, опять же, имеет имя openFileDialogMIDI).
  3. Создадим событие, привязанное к нажатию на кнопку, в котором очистим richTextBox от старых данных. Так же получим путь к MIDI файлу и передадим его функции, которая откроет его. (openMIDIFile)


Почему-то каждый год, когда на горизонте начинает маячить начало ноября, я вспоминаю композицию November Rain.

Я не большой фанат хард-рока, но это отличная песня, успех которой Guns N’ Roses не смогли превзойти за 27,5 лет, прошедших с тех пор, как она стала самой раскрученной на радио. Это самая длинная песня, попавшая в десятку лучших хитов Billboard Hot 100 – длиннее, чем American Pie. Много лет она была эталоном популярной музыки.

Видеоклип был самым крутым из того, что показывали на MTV – и, несколько десятилетий спустя, стал одним из самых популярных видеоклипов в истории YouTube.

Она длится девять минут. И повествует об опыте длиною в жизнь – если ваша жизнь похожа на жизнь Эксла Роуза.

Но, какой бы она ни была потрясающей, она ещё более удивительна в формате файла MIDI – в таком формате её распространяли в интернете в году этак 1996 – поскольку ему удаётся точно передать дух песни, занимая при этом меньше 50 Кб (в зависимости от вашей звуковой карты).

Сегодня мы вспоминаем слишком краткий период времени, в течение которого MIDI-файлы были значительной частью интернета.


Как браузерные войны помогли популяризации MIDI

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

В работе был рекомендован «универсальный интерфейс синтезаторов» для музыкальных инструментов, который бы гарантировал возможность переноса музыкальных данных с одного инструмента на другой. Изначально эта технология полагалась на телефонные разъёмы и предназначалась для синтезаторов, но в итоге в 1983 превратилась в цифровой интерфейс музыкальных инструментов, или MIDI [Musical Instrument Digital Interface], совмещающий интерфейсы для оборудования и протокол распространения данных.

Формат MIDI никуда не исчезал – и вообще стал ключевым способом совместного творчества музыкантов за последние 40 лет. Ассоциация производителей MIDI приблизилась к выпуску версии 2.0 – основной вехе для протокола, чей изначальный вариант 1.0 определил современное состояние музыки.

MIDI – база большей части популярной музыки, но в своей истории он редко переходил в такое состояние, в котором им интересовались бы обычные потребители.

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

MIDI мал. Это сделало его прекрасным форматом для передачи музыки в онлайне – особенно, поскольку к середине 1990-х практически у любого домашнего компьютера, который можно было купить в магазине, была какая-либо звуковая карта.

В поисках дополнительных возможностей два основных разработчика веб-браузеров той эры — Microsoft и Netscape – добавили функциональность, позволявшую использовать аудиофайлы при загрузке сайтов, либо в виде фоновой музыки, либо в виде включаемых страницу файлов со специальным проигрывателем. В любом случае, это был один из ранних примеров плагина, с которым столкнулось большинство – ещё до появления Flash.

В частности, Microsoft Internet Explorer поддерживал его ещё с версии 1.0, а Netscape Navigator поддерживал при помощи плагина, а встроенную поддержку сделал с версии 3.0. Во время пика популярности сайта Geocities был период, когда сайты, загружавшиеся с MIDI-файлами, были обычным делом.

Когда в 2009 году Geocities закрыли, MIDI-файлы с различных сайтов были собраны командой веб-архива. В архиве Internet Archive хранится более 51 000 файлов в коллекции The Geocities MIDI Collection. Список имеющихся там песен – это капсула времени, относящаяся к определённой эре. У вас есть любимая песня из 1998? Поищите её название там без пробелов, и вы, вероятно, её найдёте (я нашёл в архиве не менее семи разных версий November Rain).

Они звучат, как музыкальная капсула времени, и вызывают воспоминания о том периоде у многих веб-сёрферов того времени.

«Даже в эру высококачественных MP3 простенькие звуки MIDI-файлов отзываются в вебе», — писал Дуглас Уолк для журнала Spin в 2000-м, объясняя причину этого: «Их можно играть практически на всём чуть умнее сковородки, а ещё они очень маленькие».


Однако чего у них не было, так это постоянства. Когда MIDI-файлы стали популярными из-за звуковых карт, качество последних очень серьёзно отличалось. Sound Blaster ввёл некую базовую линию, однако гарантии постоянства у MIDI-файлов в конце 90-х не было. Вероятно, что MIDI-файл на безымянной звуковой карточке в дешёвой системе от Packard Bell с б/ушными компонентами звучал не так хорошо, как на Sound Blaster AWE32, настолько максималистской звуковой карте, что у неё были собственные разъёмы для расширения памяти.

MIDI-файлы продаются на дискетах – даже в 2019-м

Стоит отметить, что к моменту появления MIDI-файлов в браузерах их использование в качестве инструмента для распространения контента уже не было чем-то новым. В 1983 году компания Synth-Bank – управляемая Брайаном Беллом, сотрудничавшим с Сантаной и Херби Хэнкоком – первой реализовала идею распространения музыкальных файлов по модему, используя такие ранние онлайн-сервисы, как GE Link и AppleLink. Предполагалось, что сервисом будут пользоваться профессиональные музыканты для облегчения совместной работы.

«Я пытаюсь создать всемирный доступ для звуковиков и конечных пользователей, чтобы они могли работать вместе без проблем, связанных с отсутствием музыкантов, занятостью и поездками, а также с отправкой дисков по почте», — рассказал Белл журналу Network World в 1986.

Были попытки продавать MIDI на коммерческом рынке. Наиболее примечательным было пианино Disklavier от Yamaha, использовавшее дискеты и CD с DRM-защитой для работы с MIDI-файлами. А если вам не нужно было всё пианино, то Roland продавал устройство с динамиком, проигрывавшее файлы MIDI с дискет. Однако ключевая аудитория была такой узкой, а дискеты – такими редкими, что извлечь файлы MIDI вопреки DRM-защите для редактора журнала Hackaday стало по-настоящему трудной задачей.

Как вы можете догадаться, файлы MIDI делались и продавались с той же коммерческой целью, что и обычная музыка – однако их редко настолько тщательно изучали, как их старшего брата, MP3.

Довольно странно думать об этом, но в то время мы могли распространять файлы MIDI пиратским методом, даже не понимая этого.

«Выход стандартных файлов MIDI является работой авторов, подлежащей защите авторских прав, поскольку информация, содержащаяся в файле, заставляет звуковое устройство выдавать музыкальные ноты определённой высоты, тембра, скорости и длительности в определённом порядке, как делает механическое пианино на основе валика с мелодией, или плеер компакт-дисков на основе компакт-диска».

Так писала Шарлотта Дуглас, главный юридический консультант общего совета при Бюро авторского права США в 1996 году в решении о том, что файлы MIDI считаются защищёнными авторским правом. Это решение облегчило задачу лицензирования и обмена файлами MIDI с продюсерами, хотя в онлайне вопрос копирайта был не решён.

MIDI-музыкант, сделавший делом своей жизни сохранение регтайма

Используя эти композиции по мотивам популярных песен в формате MIDI, часто забывают о том, что их делают люди – либо профессионалы для наполнения банка песен (что может пригодиться, например, для караоке), либо дилетанты, пытающиеся воссоздать песни, которые им нравятся, или которые они услышали по радио.

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

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

В 1980-х он обнаружил первую возможность комбинировать носители посредством инструмента SIDPlayer, позволявшего извлекать музыку из Commodore 64 – включая и обожаемый им регтайм. В то время он начал писать музыку специально для SIDPlayer, и помог привлечь такой интерес к этому формату, что его композиции даже продавало издательство Softdisk, большую известность которому принесло его участие в карьерах разработчиков Doom и Quake.

Commodore, конечно, канул в Лету, но к середине 1990-х Роак открыл для себя MIDI – и вскоре интернет открыл для себя Роака, построившего своё интернет-присутствие благодаря созданию файлов MIDI и распространению дифирамбов регтайму. Его сайт на AOL помог набрать популярности как Роаку, так и регтайму, о котором забыли, когда от него произошли блюз, джаз, кантри и в итоге рок-музыка.

В обзорной статье 1997 года в газете The Baltimore Sun журналист Майкл Химовиц был поражён тем, насколько он увлёкся страстью Роака.

Не знаю, как именно я наткнулся на этот закуток веба – до этого я особенно не интересовался регтаймом. Однако я провёл пару восхитительных часов за прослушиванием музыки Роака, чтением его эссе и изучением ссылок на другие страницы с регтаймом и джазом. Это было чистым откровением.

Затем я вдруг подумал, что мне нужно больше писать о том, что делает веб таким особенным – о возможности заниматься любимым делом. В отличие от всех прочих носителей, существовавших ранее, веб даёт людям с необычными талантами и интересами шанс поделиться своей страстью со аналогичными энтузиастами – и с такими людьми, как я, случайно заглянувшими на огонёк.

Роак отметил, что его интерес к регтаймы идеально подходил для подчёркивания возможностей формата MIDI – в частности потому, что это был стиль музыки, основанный на пианино, то есть, его качество оставалось более-менее постоянным вне зависимости от качества вашей звуковой карты.

«Музыка регтайм хороша потому, что пианино – это и есть пианино, а большинство синтезаторов хорошо его воспроизводят, — рассказал Роак газете. – Но если вы начинаете играться со струнными и басами, то то, что хорошо звучит у вас, не обязательно будет хорошо звучать у меня».

На сайте Роака, работающем до сих пор, есть информативные уроки истории этой музыкальной формы, а также созданные Роаком версии классических песен регтайм, написанных такими титанами этого жанра, как Скотт Джоплин и Джелли Ролл Мортон. Роак месяцами работает над композициями, полагаясь на Sound Blaster AWE32 и пианино от Roland. Единственный минус, который находит во всём этом Роак, состоит в том, что его руки недостаточно велики для того, чтобы как следует играть регтайм.

В каком-то смысле, Роак просто создал личную веб-страничку, посвящённую предмету своей страсти – вместе с моделью распространения, подходящей для его работы. Но в процессе он вышел за пределы этой формы, и хотя он не дорос до бренда, он стал важной частью регтайм-сообщества в конце 90-х, записав два альбома, Syncopated Odyssey и Hot Kumquats при помощи формата MIDI.


Когда в 1999 году он умер – безвременно – он, можно сказать, произвёл революцию в старинной музыке, добавив к ней технологию. Его сайт по сей день остаётся в онлайне, являясь капсулой времени для цифровой личности, вдохновлённой творческими возможностями MIDI.

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

Как и многие форматы файлов, файлы MIDI никогда не предполагалось использовать так, как они реально использовались.

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

Файл MIDI, даже вырванный из контекста, предлагал неплохой компромисс.

Однако этот период уже окончательно прошёл. Когда я загружал веб-страницы в целях изучения этой темы, они не проигрывали мне файлы MIDI. Вообще. А если они должны были проигрывать музыку, то часто вместо того, чтобы играть в браузере, файлы MIDI просто скачивались на мой компьютер.

В итоге мне удалось заставить их работать при помощи плагина Jazz-Plugin, доступного для большинства популярных браузеров, Firefox, Safari и Chrome.

Это во многих аспектах напоминает мне развитие интернета, оставившую за бортом Gopher, когда-то по умолчанию включённый во многие браузеры, однако удалённый оттуда после выхода протокола из моды.

Популярные браузеры постоянно проделывают подобное – и они уже собрались сделать это с FTP, что разработчики Chrome на полном серьёзе обсуждают уже более пяти лет.

Можно ещё сравнить историю с MIDI с историей HTML-тега blink, точно так же исчезнувшего из браузеров.

Как я уже говорил, MIDI не умер – вовсе нет. Его сила в том, что iPad, поддерживающий MIDI, вполне может обмениваться данными с самыми ранними из поддерживающих MIDI устройств, типа Commodore 64.

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

А теперь извините, я пойду отрываться под MIDI-версию November Rain. Или какую-нибудь композицию в стиле регтайм. Я пока не определился.


Предлагаемый проигрыватель не требует карты памяти, он хранит MIDI-файл длиной до 6000 байт непосредственно в микроконтроллере ATtiny85 (в отличие от этой классической конструкции, которая проигрывает WAV-файлы, и карту памяти, естественно, требует). Четырёхголосное проигрывание с затуханием при помощи ШИМ реализовано программно. Пример звучания — по ссылке.

Устройство выполнено по схеме:

Электролитический конденсатор между микроконтроллером и динамической головкой не пропустит постоянную составляющую, если в результате программного сбоя на выходе PB4 появится логическая единица. Индуктивное сопротивление головки не пропускает частоту ШИМ. Если вы решите подключить устройство к усилителю, во избежание перегрузки последнего сигналом ШИМ нужно добавить ФНЧ, как здесь.

MIDI-файл необходимо поместить в исходник прошивки в виде массива вида:


Для перевода файла в такой формат в UNIX-подобных ОС есть готовое решение — утилита xxd. Берём MIDI-файл и пропускаем через эту утилиту так:


В консоль будет выведено что-то вроде:


2708 — это длина в байтах. Получилось меньше 6000 — значит, поместится. Последовательность шестнадцатеричных чисел через буфер обмена переносим в скетч (только не забываем: в консоли — никакого Ctrl+C) вместо массива по умолчанию. Или не проделываем всего этого, если желаем его оставить.

Таймер-счётчик 1 будет работать на частоте в 64 МГц от ФАПЧ:


Переведём этот таймер в ШИМ-режим для работы в качестве ЦАП, скважность будет зависеть от значения OCR1B:


Частота прямоугольных импульсов зависит от значения OCR1C, оставим его равным 255 (по умолчанию), тогда частота в 64 МГц будет поделена на 256, и получится 250 кГц.

Таймер-счётчик 0 будет вырабатывать прерывания:


Тактовая частота в 16 МГц делится делителем на 8, а затем на значение OCR0A, равное 19+1, и получается 100 кГц. Проигрыватель четырёхголосный, на каждый голос получается по 25 кГц. По прерыванию происходит вызов процедуры его обработки ISR(TIMER0_COMPA_vect), которая рассчитывает и выводит звуки.

Сторожевой таймер сконфигурирован на выработку прерывания каждые 16 мс, что требуется для получения частот нот:


Для получения колебаний заданной формы применён прямой цифровой синтез. Аппаратного перемножения в ATtiny85 нет, поэтому берём прямоугольные импульсы и умножаем амплитуду огибающей на 1 или -1. Убывает амплитуда линейно, и чтобы рассчитать её в тот или иной момент времени, достаточно линейно же уменьшать показания счётчика.

Для каждого из каналов предусмотрено по три переменных: Freq[] — частота, Acc[] — фазовый аккумулятор, Amp[], значение амплитуды огибающей. Значения Freq[] и Acc[] суммируются. Старший бит Acc[] используется для получения прямоугольных импульсов. Чем больше Freq[], тем больше частота. Готовая форма колебаний перемножается на огибающую Amp[]. Все четыре канала мультиплексируются и поступают на аналоговый выход.

Важной частью программы является процедура обработки прерывания от таймера-счётчика 0, которая выводит колебания на аналоговый выход. Вызов этой процедуры происходит с частотой около 95 кГц. Для текущего канала c она обновляет значения Acc[c] и Amp[c], а также рассчитывает значение текущей ноты. Результат поступает на регистр сравнения OCR1B таймера-счётчика OCR1B для получения аналогового сигнала на выводе 4:


прибавляет к аккумулятору Acc[c] значение частоты Freq[c]. Чем больше Freq[c], тем быстрее будет меняться значение Acc[c]. Затем строка


уменьшает значение амплитуды для данного канала. Фрагмент (Amp[c] != 0) нужен, чтобы после достижения амплитудой нуля она не уменьшалась дальше. Теперь строка


переносит старшие 9 бит Acc[c] в Temp. И строка


оставляет старший бит этой переменной равным единице, если единице равны два старших бита, и устанавливает старший бит в нуль, если это не так. Получаются прямоугольные импульсы с соотношением включённого и выключенного состояний 25/75. В одной из предыдущих конструкций автор применил меандр, при новом же способе гармоник получается чуть больше. Строка


переносит в остальные биты байта значения старшего, например, если старший бит был 0, то получится 0x00, а если 1 — то 0xFF. Строка


переносит в Env тот бит Amp[c], который задан значением Volume, по умолчанию — старший, так как Volume = 8. Строка


всё это объединяет. Если Mask = 0x00 то Note присваивается значение Env. Если Mask = 0xFF, то Note присваивается значение, дополнительное к Env + 1, то есть Env со знаком минуса. Теперь Note содержит текущую форму колебаний, меняющуюся от положительного до отрицательного значений текущей амплитуды. Строка


прибавляет к Note число 128 и записывает результат в OCR1B. Строка


выводит четыре канала по соответствующим прерываниям, мультплексируя голоса на выходе.

Двенадцать частот нот заданы в массиве:


Частоты нот других октав получаются делением на 2 n . Например, делим 10973 на 2 4 и получаем 686. Верхний бит Acc[c] будет переключаться с частотой в 25000/(65536/685) = 261.7 Гц.

На звучание влияют две переменных: Volume — громкость, от 7 до 9 и Decay — затухание, от 12 до 14. Чем значение Decay больше, тем медленнее затухание.

Простейший интерпретатор MIDI обращает внимание только на значения ноты, темпа и коэффициента деления, а прочие данные игнорирует. Подпрограмма readIgnore() пропускает заданное количество байт в массиве, полученном из файла:


Подпрограмма readNumber() считывает число из заданного количества байт с точностью до 4:


Подпрограмма readVariable() считывает число с принятой в MIDI переменной точностью. Количество байт при этом может быть от одного до четырёх:


Из каждого байта берётся по семь бит, а восьмой равен единице, если дальше нужно прочитать ещё один байт, или нулю, если нет.

Интерпертатор вызывает подпрограмму noteOn() для проигрывания ноты в следующем доступном канале:


Переменная Ptr указывает на следующий считываемый байт:


Первый блок в MIDI-файле — это заголовок, указывающий на количество дорожек, темп и коэффициент деления:


Коэффициент деления обычно равен 960. Теперь считываем заданное количество блоков:


Считываем последовательные события до окончания блока:


В каждом событии задана delta — задержка в единицах времени, определяемых коэффициентом деления, которая должна произойти перед этим событием. Для событий, которые должны произойти тут де, delta равна нулю.

Метасобытия — это события типа 0xFF:


Единственный вид интересующих нас метасобытий — это Tempo, значение темпа в микросекундах. По умолчанию оно равно 500000, то есть, полсекунды, что соответствует 120 ударам в минуту.

Остальные события — это MIDI-события, определяемые первым шестнадцатеричным разрядом своего типа. Нас интересует только 0x90 — Note On, проигрывание ноты на следующем доступном канале:


Значение velocity игнорируем, но при желании можно устанавливать по нему начальную амплитуду ноты. Остальные события пропускаем, длина у них может быть различной. При ошибке в MIDI-файле включается светодиод.

Микроконтроллер работает на частоте в 16 МГц, чтобы кварц не требовался, нужно соответствующим образом сконфигурировать встроенный ФАПЧ. Чтобы микроконтроллер стал Arduino-совместимым, применена эта наработка Spence Konde. В меню Board выбираем подменю ATtinyCore, а там — ATtiny25/45/85. В последующих меню выбираем: Timer 1 Clock: CPU, B.O.D. Disabled, ATtiny85, 16 MHz (PLL). Затем выбираем Burn Bootloader, потом заливаем программу. Программатор применён типа Tiny AVR Programmer Board фирмы SparkFun.

Прошивка под CC-BY 4.0, в которой уже есть фуга Баха в ре миноре, находится здесь, оригинальный MIDI-файл взят здесь.

Читайте также: