MIDI Drums

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Проект посвящен созданию MIDI контроллера ударных инструментов.

Насколько это актуально - не знаю. В принципе, за 10-15 т.р. можно приобрести фабричный аналог любительского уровня.

Но, когда я начинал проект ASOLED ( http://arduino.ru/forum/proekty/asoled-kompaktnaya-biblioteka-dlya-oled-displeya-128kh64-s-kirillitsei-utf-8 ), у меня тоже были серьезные сомнения в его полезности, однако, кому-то он понадобился.

Датчики - на основе стандартных 27-мм пьезодисков с Алиэкспресс, конструктив - пластиковый контейнер на 1.35 л, к крышке которого, собственно, все и крепилось. Снизу - пьезодиск на двухсторонний скотч - тонкий на лавсановой основе:

Провод в двух точках закреплен термоклеем.

Сверху приклеена плотная резина толщиной 4.5 мм - тоже на двухсторонний скотч, только средней толщины на тканой основе.

Параллельно пьезодатчику был установлен резистор 1 МОм, но оказалось, что сигнал с датчика слишком велик, и резистор был заменен делителем из двух резисторов по 1 МОм.

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

Хотелось бы, конечно, такую зависимость несколько уменьшить. Если есть идеи, как это сделать, с удовольствием их выслушаю.

Тем не менее, выяснилось, что ширина наибольшего пика - величина довольно консервативная и лежит в пределах примерно от 2 до 5 мс. Раз так, чтобы достоверно измерить амплитуду пика, думаю, сигнал должен быть оцифрован не реже одного раза в 0.5 мс. И тут возникает первая проблема: стандартный analogRead() работает 0.112 мс, следовательно, с удовлетворительной частотой можно оцифровать не более четырех инструментов. Если больше - амплитуда сигнала, а, следовательно, и громкость ноты будут определяться со слишком большой погрешностью. В принципе, Atmel328 это позволяет, но придется писать свой более скоростной аналог analogRead(). Тем более, что ускорить его надо всего лишь вдвое, а, насколько я понял, запас там довольно велик.

Ну и еще: амплитуда сигнала даже после делителя все равно осталвсь слишком большой. Вероятно, целесообразно на каждом входе ставить потенциометр примерно так на 1 МОм, и только с его движка уже снимать сигнал на Ардуину. Можно, кстати, поэкспериментировать и с номиналом этого потенциометра, скажем, попробовать 100 кОм и 10 кОм. В частности, выяснить, как это влияет на ширину импульса.

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

Dok321
Offline
Зарегистрирован: 26.10.2018

andriano пишет:

Проект посвящен созданию MIDI контроллера ударных инструментов.

Насколько это актуально - не знаю. В принципе, за 10-15 т.р. можно приобрести фабричный аналог любительского уровня.

Но, когда я начинал проект ASOLED ( http://arduino.ru/forum/proekty/asoled-kompaktnaya-biblioteka-dlya-oled-displeya-128kh64-s-kirillitsei-utf-8 ), у меня тоже были серьезные сомнения в его полезности, однако, кому-то он понадобился.

Датчики - на основе стандартных 27-мм пьезодисков с Алиэкспресс, конструктив - пластиковый контейнер на 1.35 л, к крышке которого, собственно, все и крепилось. Снизу - пьезодиск на двухсторонний скотч - тонкий на лавсановой основе:

Провод в двух точках закреплен термоклеем.

Сверху приклеена плотная резина толщиной 4.5 мм - тоже на двухсторонний скотч, только средней толщины на тканой основе.

Параллельно пьезодатчику был установлен резистор 1 МОм, но оказалось, что сигнал с датчика слишком велик, и резистор был заменен делителем из двух резисторов по 1 МОм.

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

Хотелось бы, конечно, такую зависимость несколько уменьшить. Если есть идеи, как это сделать, с удовольствием их выслушаю.

Тем не менее, выяснилось, что ширина наибольшего пика - величина довольно консервативная и лежит в пределах примерно от 2 до 5 мс. Раз так, чтобы достоверно измерить амплитуду пика, думаю, сигнал должен быть оцифрован не реже одного раза в 0.5 мс. И тут возникает первая проблема: стандартный analogRead() работает 0.112 мс, следовательно, с удовлетворительной частотой можно оцифровать не более четырех инструментов. Если больше - амплитуда сигнала, а, следовательно, и громкость ноты будут определяться со слишком большой погрешностью. В принципе, Atmel328 это позволяет, но придется писать свой более скоростной аналог analogRead(). Тем более, что ускорить его надо всего лишь вдвое, а, насколько я понял, запас там довольно велик.

Ну и еще: амплитуда сигнала даже после делителя все равно осталвсь слишком большой. Вероятно, целесообразно на каждом входе ставить потенциометр примерно так на 1 МОм, и только с его движка уже снимать сигнал на Ардуину. Можно, кстати, поэкспериментировать и с номиналом этого потенциометра, скажем, попробовать 100 кОм и 10 кОм. В частности, выяснить, как это влияет на ширину импульса.

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


Я бы посоветовал клеить пьезы ровно посередине крышки, это может помочь снизить разброс амплитуды, в крайнем случае, можно приноровиться стучать ровно в середину пэда

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Что-то мне эта идея с серединой не нравится. Я специально выбирал место так, чтобы не было симметрии ни в одном направлении. 

Кстати, и в барабане рабочая зона отнюдь не в центре диафрагмы.

Попытаюсь еще приклеить другой диск через прокладку из пористой резины.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Dok321, Вы слышали что-то о двухзонных инструментах?

Dok321
Offline
Зарегистрирован: 26.10.2018

andriano пишет:

Dok321, Вы слышали что-то о двухзонных инструментах?


Нет, первый раз слышу

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Понятно.

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Что-то меня одолевают мысли о необходимости изготовления измерительного стенда.

Есть ли у кого какие идеи по поводу изготовления узла, который должен бить палочкой в пэд? 

Точка, в которую наносится удар, должна быть фиксированной, а сила удара - воспроизводимой и поддающейся настройке.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015
Dok321
Offline
Зарегистрирован: 26.10.2018

Привет, ну как код не меняли? Кстати я бы рекомендовал для имитации баса и педали хэта использовать настоящие педали, это будет дороже самодельных, но делать их самому - это дело крайне не благодарное

sadman41
Offline
Зарегистрирован: 19.10.2016

andriano пишет:

Что-то меня одолевают мысли о необходимости изготовления измерительного стенда.

Есть ли у кого какие идеи по поводу изготовления узла, который должен бить палочкой в пэд? 

Точка, в которую наносится удар, должна быть фиксированной, а сила удара - воспроизводимой и поддающейся настройке.

А ежели соленоидом стучать? Или только палка подходит? Тогда к серве ее примотать или к шаговику.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Dok321 пишет:
Привет, ну как код не меняли?

Какой код?

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

Потом составить ТЗ на код, исходя из характеристик датчика.

Исходя из ТЗ, выбрать подходящий контроллер. Уже сейчас склоняюсь в пользу stm32f103, т.к. AVR, похоже не обладают необходимыми возможностями. Ну и дешевле не только Леонардо или Мини, но даже Нано. В общем, по всем парамерам категорически превосходит Леонардо.

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

Цитата:
Кстати я бы рекомендовал для имитации баса и педали хэта использовать настоящие педали, это будет дороже самодельных, но делать их самому - это дело крайне не благодарное

Ну да, кстати, с точки зрения надежности и долговечности - это тоже более предпочтительный вариант.

Пока же меня волнуют датчики и способ их крепления. Непосредственно скотчем к крышке или мембране - дают огромную ЭДС (более 20 В), что, в общем-то, не так уж и хорошо, но заставляют задуматься, а долго ли датчик сможет проработать в таком режиме, и не будет ли он интенсивно деградировать, из-зда чего поплывут все параметры и настройки.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

sadman41 пишет:

А ежели соленоидом стучать? Или только палка подходит? Тогда к серве ее примотать или к шаговику.

Соленоид - как исполнительный механизм?

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

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

sadman41
Offline
Зарегистрирован: 19.10.2016

Тогда удлинить соленоид диэлектриком и замотать в экран? Пружина, в целом, по тому же принципу работает, но я не совсем понимаю, как гарантированно колебания/отскок погасить. Соленоид держать будет хотя бы.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Нейтральное положение пружины должно быть таким, чтобы палочка не доставала до мембраны. Без мембраны, если отвести палочку и отпустить, она будет совершать затухающие колебания. Т.е. амплитуда каждого последующего меньше амплитуды предыдущего. Если мы поставим мембрану, на первом колебании палочка ударится о мембрану, отскочит, затем снова приблизиться к мембране, но, опять же, за счет того, что колебания затухающие, до мембраны уже не достанет. А как это будет выглядеть в случае соленоида?

Опять же, управляющий ток: вероятно, чтобы его обеспечить, нужно будет ставить конденсатор и достаточно мощный ключ. Конденсатор с соленидом - колебательный контур.

Если же натягивать пружину маломощным двигателем, и токи вменяемые, и электромагнитных помех меньше.

 

PS. Родилась следующая идея: прежде, чем думать над конструкцией имитатора удаоа палочкой, нужно бы измерить характеристики реального удара. Т.е. определить скорость движения палочки при ударе рукой.

Dok321
Offline
Зарегистрирован: 26.10.2018

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Измерения, выполненные при помощи двух фототранзисторов 3DU5C и двухлучевого осциллографа, позволили сделать оценки диапазона возможных скоростей барабанной палочки: от 1 до 30 м/с.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Dok321 пишет:
Привет всем, все таки для меня остаётся большой загадкой, почему найденный мною скетч отказывается работать. Пока я не делал измерений осциллографом, попробовал просто подставить бОльшие значение, но все равно ничего не работает, при чем даже когда я подключаю не пэд, а просто пьезу. Ума не приложу в чём дело

А что именно выдает пьеза?

Dok321
Offline
Зарегистрирован: 26.10.2018

В том то и дело что ничего, cubase просто не реагирует на нее

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

То есть как, вообще ничего? Осциллограф что показывает? (если отключить пьезу от входа Ардуины)

Dok321
Offline
Зарегистрирован: 26.10.2018

Пока не подключал к осциллографу, кстати вы какую программу используете?

Dok321
Offline
Зарегистрирован: 26.10.2018

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

Dok321
Offline
Зарегистрирован: 26.10.2018

В программе-секвенсоре к определенным барабанам привязаны определенные клавиши на клавиатуре. В программе эти клавиши привязаны к определенным пьезодатчикам, каждая к своему. Суть программы состоит в том, что при ударе по пьезодатчику, происходит нажатие соответствующей ему определенной клавиши на клавиатуре. Например: 1-ая пьеза - Q, 2-ая пьеза - W и т.д. + к этому добавить тактовую кнопку. Если она находится в нажатом состоянии, то клавиша привязанная допустим к 7-ой пьезе меняется на другую. Т.е. например, если тактовая кнопка не нажата, то при ударе по 7-ой пьезе нажимается клавиша Y, а если нажата то клавиша U.(Таким образом будет сделана педаль хай-хэта) + к этому, сделать так чтобы при нажатии (подразумевается что при одновременном нажатии) на тактовую кнопку, также нажималась определенная клавиша, привязанная к ней(так будет сделана возможность игры на хай-хэте с помощью педали). 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Dok321 пишет:
Пока не подключал к осциллографу, кстати вы какую программу используете?

Не понял вопроса. О какой программе речь? В качестве среды использую Arduino IDE.

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

Барабаны без динамики? Нет, это без меня. Оно, конечно, здорово упрощает, но превращает всю затею в игрушку. Притом, низкокачественную игрушку.

Dok321
Offline
Зарегистрирован: 26.10.2018

andriano пишет:

Dok321 пишет:
Пока не подключал к осциллографу, кстати вы какую программу используете?

Не понял вопроса. О какой программе речь? В качестве среды использую Arduino IDE.

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

Барабаны без динамики? Нет, это без меня. Оно, конечно, здорово упрощает, но превращает всю затею в игрушку. Притом, низкокачественную игрушку.

1. Я имел ввиду какую программу-осциллограф?

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Если c USB-осциллографом - то его родную программу. 

Да, сейчас поставил на ту же мембрану (крышку емкости) второй пьезодатчик, но уже через прокладку из пористого материала, которым китайцы обкладывают свои посылки, толщиной 10 мм. Буду одновременно снимать сигнал с обоих.

И еще: думаю сейчас использовать не осциллограф, а писать сигнал на компьютер в виде обычного звукового файла. Только ослабить его нужно. Собираюсь поставить вместо просто переллельного резистора на 1 МОм делитель из резисторов 1 МОм и 10 кОм, и с 10 кОм снимать сигнал на звуковую карту. Ну а потом уже пересчитывать, исходя из коэффициента ослабления 100.

 

Что подразумевается под "нажимать на клавиши" - управление сервоприводом?

sadman41
Offline
Зарегистрирован: 19.10.2016

Нет, ему USB-keyboard эмулировать надо.

andriano, я, вобщем-то не музыкант вообще, про соленоид у меня просто идея возникла - я поделился. Он может и ритмично долбить и быстро и с нужным/переменным усилием.  С пружиной, наверное, придется очень тщательно жесткость подбирать и отлаживать механику для повторяемости результата.

 

Dok321
Offline
Зарегистрирован: 26.10.2018

Нет, не сервоприводом, я имел ввиду, чтобы происходил тот же эффект, как если бы я нажимал клавишу на клавиатуре. А про осциллограф, я думал вы просто программу используете, без самого физического осциллографа

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

1. "Нажать клавишу на клавиатуре" = "замкнуть контакт". Т.е. если нет физического нажатия, можно подцепить параллельно клавише реле, ключ или еще что-то, замыкающее контакт. А если знать, как эта клавиатура внутри устроена и к чему подключена, можно, вероятно, предложить и другие варианты.

2. "Физический" осциллограф в большинстве случаев гораздо удобнее. Опять же, программный осциллограф в принципе невозможен без соответствующей аппаратной поддержки. Как правило, в виде такой поддержки выступает звуковая карта, а у нее очень много ограничений. Да и по тем скриншотам, что я выкладывал, явно видно, что осциллограф аппаратный.

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

Dok321
Offline
Зарегистрирован: 26.10.2018

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

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

sadman41
Offline
Зарегистрирован: 19.10.2016

Засылать скан-коды обычной клавиатуры в компутер можно. Самое простой способ - через Micro Pro. Но есть нюансы, конечно - не все кнопки эмулируются, например.

Dok321
Offline
Зарегистрирован: 26.10.2018

Главное что можно, а клавиш нужно штук 7 всего

Dok321
Offline
Зарегистрирован: 26.10.2018

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

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

Так что вполне прогнозируемое поведение.

Dok321
Offline
Зарегистрирован: 26.10.2018

И как это должно выглядеть в скетче?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Что именно?

Dok321
Offline
Зарегистрирован: 26.10.2018

Ну то есть, как и куда в матче добавить в скетче то что вы написали

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Так скетча пока нет - "добавлять" некуда.

И до скетча еще далеко.

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

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

andriano пишет:

И до скетча еще далеко.

Очень интересная тема. Давно хочу сделать электронные барабаны с выводом на MIDI моего синтезатора.

Из того, что я читал - запуск удара идет по нарастаню сигнала (ну что не удивительно), а сброс на 1/3 сигнала.

andriano: Готов че-то написать. Если готов выступать ГИП, то давай задачу - сделаю. Золото пополам (шучу). Давно хочу себе сделать драм установку.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

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

2. У меня, честно говоря, проблема не с тем, чтобы что-то написать, а с тем, чтобы заставить себя провести исследование зависимости формы сигнала от характеристик удара (силы и места). В принципе, если это кого-то кроме меня интересует, - это тоже стимул.

3. Приближенные оценки показывают, что скорости AVR может хватить максимум на 4 датчика. Поэтому в качестве контроллера предполагаю использовать stm32f103: по таймеру производить циклическое по всем входам АЦ-преобразование, при помощи DMA сбрасывать в массив, а по окончании цикла генерировать прерывание, в кором анализировать введенные данные. Вот как-то так.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Я вот тут подумал: что-то механическая установка, при помощи которой можно было бы провести серии экспериментов с воспроизводимыми результатами, не придумывается. Может, прикрепить к палочке акселерометр и сверять амплитуду сигнала с пьезодатчика с показаниями акселерометра? Только вот нет уверенности, что у акселерометра хватит для этого "шкалы".