Официальный сайт компании Arduino по адресу arduino.cc
MIDI Drums
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Проект посвящен созданию 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 кОм. В частности, выяснить, как это влияет на ширину импульса.
Ну и еще один повод для размышлений: я видел схемы подключения пьезодатчика в различных местах, но, почему-то, везде измерялся только положительный полупериод, а отрицательный - тупо отсекался. Мне кажется, из отрицательного полупериода тоже можно извлечь какую-нибудь полезную информацию.
Проект посвящен созданию 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, Вы слышали что-то о двухзонных инструментах?
Dok321, Вы слышали что-то о двухзонных инструментах?
Нет, первый раз слышу
Понятно.
Я тут пока шуршу по И-нету в поисках полезной информации. Прочитал об этом на каком-то форуме по электронным барабанам (сейчас уже ссылку не дам). Но, в принципе, логично, т.к. по крайней мере тарелки имеют в MIDI по два разных звука: у края и ближе к центру. Обычно для этого используются два датчика, расположенные в разных местах пэда. Но, если анализировать форму сигнала, то мне кажется, это можно сделать и на единственном датчике.
Что-то меня одолевают мысли о необходимости изготовления измерительного стенда.
Есть ли у кого какие идеи по поводу изготовления узла, который должен бить палочкой в пэд?
Точка, в которую наносится удар, должна быть фиксированной, а сила удара - воспроизводимой и поддающейся настройке.
Пара любопытных статей по теме:
http://www.drumspeech.com/articles.php?id=277
http://www.drumspeech.com/articles.php?id=244
http://www.drumspeech.com/articles.php?id=1092
Привет, ну как код не меняли? Кстати я бы рекомендовал для имитации баса и педали хэта использовать настоящие педали, это будет дороже самодельных, но делать их самому - это дело крайне не благодарное
Что-то меня одолевают мысли о необходимости изготовления измерительного стенда.
Есть ли у кого какие идеи по поводу изготовления узла, который должен бить палочкой в пэд?
Точка, в которую наносится удар, должна быть фиксированной, а сила удара - воспроизводимой и поддающейся настройке.
А ежели соленоидом стучать? Или только палка подходит? Тогда к серве ее примотать или к шаговику.
Какой код?
Если тот, что Вы публиковали, то он не может быть принят за основу. И вообще, до кода еще очень далеко. Пока нужно придумать оптимальную конструкцию и способ крепления датчика, а также выяснить, какой от него можно ожидать сигнал, в частности, как этот сигнал зависит от силы и места удара.
Потом составить ТЗ на код, исходя из характеристик датчика.
Исходя из ТЗ, выбрать подходящий контроллер. Уже сейчас склоняюсь в пользу stm32f103, т.к. AVR, похоже не обладают необходимыми возможностями. Ну и дешевле не только Леонардо или Мини, но даже Нано. В общем, по всем парамерам категорически превосходит Леонардо.
Ну а потом писать код, выяснять, каких он требует настроек и придумывать, как эти настройки лучше всего осуществлять.
Ну да, кстати, с точки зрения надежности и долговечности - это тоже более предпочтительный вариант.
Пока же меня волнуют датчики и способ их крепления. Непосредственно скотчем к крышке или мембране - дают огромную ЭДС (более 20 В), что, в общем-то, не так уж и хорошо, но заставляют задуматься, а долго ли датчик сможет проработать в таком режиме, и не будет ли он интенсивно деградировать, из-зда чего поплывут все параметры и настройки.
А ежели соленоидом стучать? Или только палка подходит? Тогда к серве ее примотать или к шаговику.
Соленоид - как исполнительный механизм?
Мне это не нравится тем, что наверняка будет электромагнитная наводка, что вместе с высоким сопротивлением датчика будет способствовать внесению искажений в измеряемый сигнал.
Мне кажется, более предпочтительным будет пружина, взводимая маломощным электродвигателем. Думаю, что ни серва, ни шаговик не смогут обеспечить достаточной скорости перемещения палочки, отсутствия повторного касания после отскока, а серва - еще и регулировки силы удара.
Тогда удлинить соленоид диэлектриком и замотать в экран? Пружина, в целом, по тому же принципу работает, но я не совсем понимаю, как гарантированно колебания/отскок погасить. Соленоид держать будет хотя бы.
Нейтральное положение пружины должно быть таким, чтобы палочка не доставала до мембраны. Без мембраны, если отвести палочку и отпустить, она будет совершать затухающие колебания. Т.е. амплитуда каждого последующего меньше амплитуды предыдущего. Если мы поставим мембрану, на первом колебании палочка ударится о мембрану, отскочит, затем снова приблизиться к мембране, но, опять же, за счет того, что колебания затухающие, до мембраны уже не достанет. А как это будет выглядеть в случае соленоида?
Опять же, управляющий ток: вероятно, чтобы его обеспечить, нужно будет ставить конденсатор и достаточно мощный ключ. Конденсатор с соленидом - колебательный контур.
Если же натягивать пружину маломощным двигателем, и токи вменяемые, и электромагнитных помех меньше.
PS. Родилась следующая идея: прежде, чем думать над конструкцией имитатора удаоа палочкой, нужно бы измерить характеристики реального удара. Т.е. определить скорость движения палочки при ударе рукой.
Привет всем, все таки для меня остаётся большой загадкой, почему найденный мною скетч отказывается работать. Пока я не делал измерений осциллографом, попробовал просто подставить бОльшие значение, но все равно ничего не работает, при чем даже когда я подключаю не пэд, а просто пьезу. Ума не приложу в чём дело
Измерения, выполненные при помощи двух фототранзисторов 3DU5C и двухлучевого осциллографа, позволили сделать оценки диапазона возможных скоростей барабанной палочки: от 1 до 30 м/с.
А что именно выдает пьеза?
В том то и дело что ничего, cubase просто не реагирует на нее
То есть как, вообще ничего? Осциллограф что показывает? (если отключить пьезу от входа Ардуины)
Пока не подключал к осциллографу, кстати вы какую программу используете?
Господа, пришла ко мне мысль несколько изменить концепцию барабанов. В этом случае, увы барабаны при любой силе удара будут звучать одинаково громко, однако, мы сможем легко переназначать звуки барабанов для каждого пэда, также появится возможность игры педалью хэта, ну и конечно, мне кажется это будет сделать гораздо проще. Вот в чем суть мысли:
В программе-секвенсоре к определенным барабанам привязаны определенные клавиши на клавиатуре. В программе эти клавиши привязаны к определенным пьезодатчикам, каждая к своему. Суть программы состоит в том, что при ударе по пьезодатчику, происходит нажатие соответствующей ему определенной клавиши на клавиатуре. Например: 1-ая пьеза - Q, 2-ая пьеза - W и т.д. + к этому добавить тактовую кнопку. Если она находится в нажатом состоянии, то клавиша привязанная допустим к 7-ой пьезе меняется на другую. Т.е. например, если тактовая кнопка не нажата, то при ударе по 7-ой пьезе нажимается клавиша Y, а если нажата то клавиша U.(Таким образом будет сделана педаль хай-хэта) + к этому, сделать так чтобы при нажатии (подразумевается что при одновременном нажатии) на тактовую кнопку, также нажималась определенная клавиша, привязанная к ней(так будет сделана возможность игры на хай-хэте с помощью педали).
Не понял вопроса. О какой программе речь? В качестве среды использую Arduino IDE.
Барабаны без динамики? Нет, это без меня. Оно, конечно, здорово упрощает, но превращает всю затею в игрушку. Притом, низкокачественную игрушку.
Не понял вопроса. О какой программе речь? В качестве среды использую Arduino IDE.
Барабаны без динамики? Нет, это без меня. Оно, конечно, здорово упрощает, но превращает всю затею в игрушку. Притом, низкокачественную игрушку.
1. Я имел ввиду какую программу-осциллограф?
2. Да, безусловно, это совсем не то, но я просто хочу пока сделать хоть что то, и уже потом совершенствовать. А то уже два месяца их делаю, хочется какого то выхлопа. Вобщем то я хотел узнать, в ардуино в принципе можно сделать скетч, который будет нажимать клавиши на клаве?
Если c USB-осциллографом - то его родную программу.
Да, сейчас поставил на ту же мембрану (крышку емкости) второй пьезодатчик, но уже через прокладку из пористого материала, которым китайцы обкладывают свои посылки, толщиной 10 мм. Буду одновременно снимать сигнал с обоих.
И еще: думаю сейчас использовать не осциллограф, а писать сигнал на компьютер в виде обычного звукового файла. Только ослабить его нужно. Собираюсь поставить вместо просто переллельного резистора на 1 МОм делитель из резисторов 1 МОм и 10 кОм, и с 10 кОм снимать сигнал на звуковую карту. Ну а потом уже пересчитывать, исходя из коэффициента ослабления 100.
Что подразумевается под "нажимать на клавиши" - управление сервоприводом?
Нет, ему USB-keyboard эмулировать надо.
andriano, я, вобщем-то не музыкант вообще, про соленоид у меня просто идея возникла - я поделился. Он может и ритмично долбить и быстро и с нужным/переменным усилием. С пружиной, наверное, придется очень тщательно жесткость подбирать и отлаживать механику для повторяемости результата.
Нет, не сервоприводом, я имел ввиду, чтобы происходил тот же эффект, как если бы я нажимал клавишу на клавиатуре. А про осциллограф, я думал вы просто программу используете, без самого физического осциллографа
1. "Нажать клавишу на клавиатуре" = "замкнуть контакт". Т.е. если нет физического нажатия, можно подцепить параллельно клавише реле, ключ или еще что-то, замыкающее контакт. А если знать, как эта клавиатура внутри устроена и к чему подключена, можно, вероятно, предложить и другие варианты.
2. "Физический" осциллограф в большинстве случаев гораздо удобнее. Опять же, программный осциллограф в принципе невозможен без соответствующей аппаратной поддержки. Как правило, в виде такой поддержки выступает звуковая карта, а у нее очень много ограничений. Да и по тем скриншотам, что я выкладывал, явно видно, что осциллограф аппаратный.
Но вот сейчас, когда я уже посмотрел сигнал на осциллографе и узнал его основные характеристики, оказалось, что в дальнейшем по ряду причин в дальнейшем удобно будет использовать именно звуковую карту: во-первых, она в общем подходит по амплитудно-временным характеристикам, во-вторых, практически нет ограничения на длину записываемого файла и, в третьих, нет необходимости переносить файл с данными с осциллографа на компьютер для последующего анализа.
А что если эмулировать клавиатуру, существует же виртуальная, сделать так чтобы сигнал с пьезы был привязан к ней
Чтобы "эмулировать клавиатуру", нужно знать устройство клавиатуры. Это если эмулировать аппаратно. Виртуальная клавиатура может существовать лишь в некоторой программной среде. Соответственно нужно знать, что за среда, как она работает с клавиатурой, и как с этой средой работают другие виртуальные объекты, для которых используется клавиатурный ввод.
Засылать скан-коды обычной клавиатуры в компутер можно. Самое простой способ - через Micro Pro. Но есть нюансы, конечно - не все кнопки эмулируются, например.
Главное что можно, а клавиш нужно штук 7 всего
Всем, привет, сегодня испытал установку на том скетче, который кидал в первое обсуждение. Все заработало, динамка есть, но возникла проблема, при сильных ударах по пэду воспроизводится не один звук, а два или три сразу. Может кто знает в чем проблема?
там идет колебательный процесс из нескольких затухающих волн. Отсекаются только те, что ниже порога. А по-хорошему надо отсекать по функции, зависящей кроме порога еще от силы предыдущего удара и прошедшего с него времени.
Так что вполне прогнозируемое поведение.
И как это должно выглядеть в скетче?
Что именно?
Ну то есть, как и куда в матче добавить в скетче то что вы написали
Так скетча пока нет - "добавлять" некуда.
И до скетча еще далеко.
У микроконтроллера весьма ограниченные ресурсы, поэтому, как правило, универсальные решения для него не всегда подходят, лучше - специализированные, под каждый конкретный случай. А чтобы писать специализированное решение оптимальное для конкретного случая, нужно хорошо представлять себе особенности этого решания. В общем, надо набрать статистику по форме сигнала - как она изменяется в зависимости от силы и места удара. Так что пока думаю над конструкцией установки, при помощи которой можно было бы выполнить серию измерений для получения этой информации.
И до скетча еще далеко.
Очень интересная тема. Давно хочу сделать электронные барабаны с выводом на MIDI моего синтезатора.
Из того, что я читал - запуск удара идет по нарастаню сигнала (ну что не удивительно), а сброс на 1/3 сигнала.
andriano: Готов че-то написать. Если готов выступать ГИП, то давай задачу - сделаю. Золото пополам (шучу). Давно хочу себе сделать драм установку.
1. По поводу запуска и сброса - проблема в том, что там идут затухающие колебания. Т.е. нужно, чтобы была реакция даже на слабый первоначальный импульс, но не было на достаточно сильный второй. Посмотрите осциллограммы сигналов - я их приводил в исходном сообщении. Проблема еще и в том, что форма сильно зависит от места удара.
2. У меня, честно говоря, проблема не с тем, чтобы что-то написать, а с тем, чтобы заставить себя провести исследование зависимости формы сигнала от характеристик удара (силы и места). В принципе, если это кого-то кроме меня интересует, - это тоже стимул.
3. Приближенные оценки показывают, что скорости AVR может хватить максимум на 4 датчика. Поэтому в качестве контроллера предполагаю использовать stm32f103: по таймеру производить циклическое по всем входам АЦ-преобразование, при помощи DMA сбрасывать в массив, а по окончании цикла генерировать прерывание, в кором анализировать введенные данные. Вот как-то так.
Я вот тут подумал: что-то механическая установка, при помощи которой можно было бы провести серии экспериментов с воспроизводимыми результатами, не придумывается. Может, прикрепить к палочке акселерометр и сверять амплитуду сигнала с пьезодатчика с показаниями акселерометра? Только вот нет уверенности, что у акселерометра хватит для этого "шкалы".