[Перевод] Шарманка на Ардуино

Эта публикация является переводом моей инструкции размещенной на сайте instructables.com. Проект занял первое место в DIY Arduino contest 2020 от Instructables


Привет! Это статья о том, как я делал шарманку на Arduino.


Демо



Немного истории

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

m9zgewvwqkbger49ea-nclntcvg.jpeg

С середины XVIII века и до изобретения граммофона существовали различные автоматические инструменты. В основном это были пианолы и ручные уличные шарманки. Эти инструменты были автоматизированы механикой и пневматикой.

vqah-mtmmhx0xqavbworeokbnkc.jpeg

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

В конце XIX-начале XX веков появились более совершенные инструменты, управляемые с помощью перфорированных бумажных лент. В таких инструментах использовалась пневматическая схема с мехами и трубками, а отверстия в ленте играли роль миниатюрных пневматических клапанов.

r32-wmxnojnpjyvhkh3lwxbjtts.jpeg


Считывание нот

Сперва нужно определить — нажата клавиша пианино или нет.

Старинные музыкальные инструменты используют довольно сложные механизмы. Я же могу использовать Arduino и электронные датчики, чтобы определить — нажата клавиша или нет. Например, используя ИК-сенсор или датчик линии. Эти датчики широко используются в мире Arduino для гонок по линии. Они позволяют определить — белый или черный цвет поверхности под ними.

42lniri9hcaydujqmxztjpz71f4.jpeg

Идея следующая. Пусть один ИК-датчик представляет собой одну ноту и клавишу пианино. Имеется несколько датчиков. Под датчик помещается лист бумаги, разделенный на параллельные дорожки. Дорожки состоят из черных и белых областей. Лист начинает движение относительно датчиков. Если на дорожке под датчиком находится черная область, то клавиша нажата. Если белая область — клавиша отжата. В момент, когда клавиша переходит из освобожденного состояния в нажатое — нота начинает звучать. Звук удерживается, пока область под датчиком остается черной.

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

Я сделал клавиатуру, состоящую из 40 клавиш. Для этого я использовал пять модулей Octoliner. Модуль Octoliner — это восьмиканальный датчик линии. Каждый модуль имеет восемь оптопар TCRT5000 и может быть использован для 8 различных клавиш пианино. Модуль управляется по шине I2C, и его легко связать с Arduino.

Я разместил пять модулей последовательно, чтобы создать единую обширную линейную матрицу из 40 (5×8) датчиков. Вы можете сделать клавиатуру из меньшего количества клавиш, или сделать полноразмерную клавиатуру пианино с 88 клавишами. Я выбрал 40, потому что это примерно половина всех клавиш на реальном инструменте.


Ардуино как миди устройство

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

3eyqrc6cq3nvaq-oekjrzln-a4g.jpeg

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

Arduino способна переводить данные о нажатых клавишах в MIDI-сообщения. Я выбрал плату Arduino, которая способна эмулировать USB HID-устройство. Передавая MIDI-сообщения через USB-порт, Arduino превращается в настоящую электронную клавиатуру пианино. С USB MIDI устройством, я смогу извлечь звук — используя синтезатор просто подключив Arduino к USB-порту компьютера.

Выбор пал на плату Arduino MKR ZERO. Она способна эмулировать USB HID из коробки. Плата очень производительная, а ее большой объем флэша идеально подойдет для хранения пресетов кучи музыкальных композиций. Также я использовал обычную тактовую кнопку для переключения пресетов и знакогенерирующий I2C LCD дисплей 16×2 для отображения текущего пресета.


Конструкция шарманки

Я не буду описывать всю конструкцию подробно. Шарманка делалась с первого раза и наугад. Только ради эксперимента. Здесь довольно много деталей, проще взглянуть на 3D-модель и спецификацию. Для изготовления деталей я использовал оргстекло, лазерную резку, 3D-печать, а также материалы и механику, которые у меня были дома.

msst9kk0ak5diheel6zvri4igwg.jpeg

Условно я разделил конструкцию на две основные части и назвал их «выпрямитель» и «съемник». Обе части крепятся к опорной плите. Выпрямитель крепится к основанию с помощью стоек M3 длиной 65 мм, а съемник — с помощью напечатанных на принтере уголков. Крепеж не показан на сборках, но есть в спецификации.


Сборка выпрямителя

zxjei3-magekaqufguc6dnrtrmu.jpeg

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

Выпрямитель собран из нескольких пластин. Бумажный лист зажат между основанием и крышкой. Между крышкой и листом сделан небольшой зазор в 1–2 мм, чтобы лист не закусывало при движении. По бокам установлены две направляющие пластины. Пять модулей датчиков линии установлены на пластине на определенной высоте над листом и крепятся к основанию четырьмя стойками 6 мм.


Сборка съемника

vq1u7-6af6malhzuin7ef-scaty.jpeg

Эта часть предназначена для подачи листа. Она тянет лист из выпрямителя.

На валах установлены четыре колеса с резиновыми кольцами. Они плотно зажимают нотный лист. Вращаясь, эти колеса вытягивают считанный лист из выпрямителя. Съемник фиксируется на опорной плите уголками. Съемник состоит из трех пластин оргстекла и трех 6 мм валов между ними. Валы закреплены в пластинах фланцевыми подшипниками F626ZZ. Подшипники зафиксированы с помощью напечатанных крышек.

Валы вращаются маховиком через ременную передачу. Я использовал 2GT ремень без натяжения. Замкнутый ремень шириной 6 мм с 250 зубьями. Такие ремни и шкивы для них распространены в хобби-станках с ЧПУ и 3D-принтерах, поэтому их легко найти и купить. Малый шкив — купленный GT2 20 6 B6.

ud4osldaireor6aff0hdpovdjny.jpeg

Больший шкив самодельный, изготовлен лазерной резкой из оргстекла. Он состоит из 4 пластин толщиной 2 и 4 мм и алюминиевого фланца на вал 6 мм.

29368xsm_xtbvdttwv5xn3nksm0.jpeg

Маховик состоит из пластины оргстекла, подшипника F625ZZ, фланца на вал 6 мм и напечатанной рукоятки. Подшипник запрессован на рукоятке и зафиксирован в пластине напечатанной крышкой.

wn2ibjnj3uuzwlwyp4ryyok7g2a.jpeg

Колеса, тянущие лист, тоже сборные. Каждое колесо состоит из 4 пластин, толщиной 3 и 2 мм, и фланца на вал 6 мм. На пластины натянуто резиновое уплотнительное кольцо. Я использовал обычное уплотнительное кольцо ГОСТ 9833 050–060–58.


Экранирование оптопар

kldlhrkzzl76j9enr3c-a8cjqgw.jpeg

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

_qobpwzb12ydahauvv97axfaskk.jpeg

Я решил максимально избавиться от помех, и экранировал каждую оптопару колпачком. Колпачки которые подходят к оптопарам TCRT5000 очень маленькие, напечатал их на фотополимернике.


Перевод нотного листа

Подготовка нотного листа — это, пожалуй, самое утомительное занятие, особенно если не знаком с музыкальной нотацией.

Итак, один датчик линии имеет 8 каналов, отвечающих за считывание 8 нот. Длина датчика составляет 80 мм. Поместив 5 модулей рядом, я получаю общую длину в 400 мм. Добавлю еще 5 мм свободного места по краям. Таким образом, общая ширина нотного листа равна 410 мм.

Ширина одной нотной дорожки равна ширине одной оптопары и составляет 5,8 мм. Расстояние между оптронами на датчике — 4,2 мм. Такое же расстояние между нотными дорожками на листе.

xley_cg4a2yne75z6hrtlmb5q4s.jpeg

Ноты делятся по длительности, где длительность — это доля такта. Нота может быть целой, половиной, четвертой, восьмой, шестнадцатой итд. За основу я беру длительность шестнадцатой ноты, и назначаю ей высоту 10 мм на листе. Теперь весь лист может быть разлинован горизонтальными линиями с интервалом 10 мм, так как это минимальный шаг. Черный прямоугольник размером 10×5,8 мм на дорожке даст звук длительностью шестнадцатой ноты. Прямоугольник высотой 20 мм — это восьмая, 40 мм — четвертая, 80 мм — половина, 160 мм — целая.

В формате MIDI каждая нота фортепианной клавиатуры имеет свой уникальный номер. Эти номера будет присвоены каналам датчиков линии. При транскрипции для себя я сформировал несколько шагов, чтобы не запутаться. Покажу на примере простой мелодии «дождь дождь уходи» © www.teaching-children-music.com.

iue31-g-cax4xcxodidjtig_y-u.jpeg


  1. Смотрим на все ноты, которые используются в музыкальном произведении, и записываем их MIDI номера в порядке возрастания. Эта мелодия использует только три ноты первой октавы: E, G и A. Нота E первой октавы имеет MIDI-номер 64, G имеет номер 67, а A имеет номер 69.
  2. Присваиваем MIDI-номера каналам датчика линии. Например, я назначаю на первый канал номер 64, второй канал номер 67 и на третий номер 69.
  3. Смотрим на размер произведения. Эта мелодия имеет размер 2/4. Это означает, что длина от одного такта до другого равна двум нотам с четвертой длительностью. Таким образом, высота одного такта на листе равна 40 мм (2×80 мм). Полная мелодия имеет 4 такта, и я могу разместить все тактовые линии.
  4. Переводим произведение. Закрашиваем прямоугольные черные области на листе в соответствии с длительностью нот.
  5. Правим нотный лист и удаляем помарки. Например, эта мелодия имеет две одинаковые восьмые ноты, которые звучат последовательно во втором, третьем и четвертом тактах. На переведенном фрагменте эти две восьмые ноты слились в единую четвертую ноту. Их необходимо разделить, слегка укоротив длительность первой ноты. Для этого уменьшаем высоту первого прямоугольника, обеспечив пустой белый зазор.


Переведенная музыка

Вся нотная запись получилась слишком длинной, чтобы физически поместиться на одном бумажном листе. Чтобы уместить все ноты, я распечатал их частями на нескольких листах А1. Затем обрезал края листов до нужной ширины и последовательно склеивал их в один большой рулон. Всего я попробовал перевести три музыкальных отрывка.


  1. «Hedwig’s Theme» из Гарри Поттера, а аранжировке Patrick Piesman.
    Используемые MIDI ноты:
    41, 42, 43, 45, 48, 49, 50, 52
    54, 55, 56, 58, 59, 60, 61, 62
    63, 64, 65, 66, 67, 68, 69, 70
    71, 72, 73, 74, 75, 76, 77, 78
    79, 80, 81, 82, 83, 84, 85, 86
  2. «The Black Pearl» из Пиратов карибского моря в аранжировке Klaus Badelt.
    Используемые MIDI ноты:
    31, 33, 34, 36, 38, 40, 41, 43
    45, 46, 48, 50, 52, 53, 55, 57
    58, 59, 60, 61, 62, 63, 64, 65
    66, 67, 68, 69, 70, 71, 72, 73
    74, 76, 77, 79, 81, 82, 85, 86
  3. Оригинальная первая часть «The Entertainer» Джоплина.
    Используемые MIDI ноты:
    43, 44, 45, 47, 48, 50, 51, 52
    53, 54, 55, 56, 57, 58, 59, 60
    62, 63, 64, 65, 67, 69, 71, 72
    74, 76, 77, 78, 79, 81, 83, 84
    86, 87, 88

Прикладываю ссылки на оригинальные фортепианные ноты, на мои переведенные ноты для шарманки и пустой линованный CAD-лист формата А1, который может пригодиться для ваших переводов.


XOD и библиотеки

Для прошивки Arduino я использую визуальную среду программирования XOD. Я часто использую XOD в своих проектах, и этот не исключение. Тем более, что все необходимые для проекта библиотеки уже созданы пользователями.

amperka/octoliner — библиотека от производителя для работы с восьмиканальным датчиком линии. Она содержит все необходимые ноды для быстрого начала работы с датчиком, а также некоторые ноды расширенного функционала, такие как настройка яркости/чувствительности оптронов или изменение адреса I2C.

Это крутые пользовательские библиотеки XOD позволяющие работать с MIDI-форматом. Библиотека e/midi используется для создания MIDI-сообщений. С помощью библиотек e/serial-midi/ и e/usb-midi/ можно обмениваться MIDI-сообщениями через последовательный интерфейс или USB-порт Arduino.

Главный патч проекта находится в библиотеке gabbapeople/barrel-organ/


Патч проекта

tg0sl1uc1o61nqzxa6l0eiahnns.jpeg

Патч шарманки начинается с инициализации датчиков. Для инициализации устройств датчиков используются quickstart ноды octoliner из библиотеки amperka/octoliner. Каждое устройство имеет свой адрес I2C. Адрес датчика линии можно изменить, используя пример в библиотеке amperka/octoliner. Для каждого датчика нода set-brightness устанавливает значение яркости ИК-излучателей равное 1. Затем нодой set-sensitivity устанавливается чувствительность ИК-приемников равная 0,9. Для пяти устройств выведены отдельные шины DEV1, DEV2, DEV3, DEV4, DEV5. Нода usb-midi-device создает и хранит экземпляр пользовательского типа MIDI, используемого для генерации и отправки MIDI-сообщений. При подаче питания происходит задержка в 1 секунду. После инициализации параметров всех сенсоров нода gateначинает пропускать через себя непрерывные импульсы.

В программе есть счетчик пресетов. Каждый пресет соответствует определенному набору MIDI нот назначенных на каналы датчиков линий. Пресеты переключаются с кнопкой и нодой track-charger. На дисплее text-lcd-i2c-16x2 отображается, какой пресет активен в данный момент.

Далее идет нода keyboard. Эта нода принимает в себя шины всех датчиков, шину `midi, а также текущее значение счетчика пресетов.


Нода клавиатуры

stxxw62lbxzzkirybi6mqzgize8.jpeg

Нода keyboard составная и очень большая, это сердце устройства. Структура ноды начинается с шин сенсоров и значения текущего пресета.

Затем следуют пять нод octoliner-read-channels. Одна такая нода считывает восемь аналоговых сигналов от восьми оптронов на датчике. Сигналы считываются последовательно и оцифровываются по простой формуле. Если сигнал >= 0,7, то клавиша нажата; если нет, то она отпущена. Суммарно нодыoctoliner-read-channels имеют 40 выходных пинов пронумерованных от CH0 до CH7 и выводят в них 40 булевых значений.

Далее следует выбор MIDI номера ноты исходя из пресета. Один канал может соответствовать разным нотам. Выбор ноты для конкретного канала зависит от текущего пресета. Нода note-switcher выбирает нужный MIDI-номер в зависимости от номера пресета. За каждой нотой закреплена шина с уникальным именем, например — 48_1, где первое значение это номер MIDI, а второе значение номер пресета. Логические ноды xor отсекают неиспользуемые шины.

Отсортированные шины MIDI номеров поступают в ноды octave. Всего я сделал шесть «октавных» нод от 1 до 6. Эти ноды соответствуют шести октавам настоящего фортепиано. Каждая нода octave состоит из двенадцати входных булевых пинов для двенадцати MIDI номеров нот. Например, для четвертой октавы входными пинами будут MIDI номера 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71. При изменении значения на любом из входных пинов, нода octave генерирует и отправляет MIDI-сообщение через USB-порт.


Вывод звука

_vsydvhp-f_5eppunckk12evjle.jpeg

Шарманку можно подключить к любому синтезатору с USB. Например, можно подключить её к компьютеру c ОС Windows и использовать Synthesia. Или подключите её к малине и использовать QjackCtl & Qsynth.

© Habrahabr.ru