Изготовление синтезаторов

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

Детям так понравилось играться с моим тестовым прототипом, что мы решили с ними сделать простенькую клаву на 25 кнопок на основе копеечной pico - пусть поиграются с паяльником, поучатся фрикаду и поиграют на результате.

Чипсет ардуино, упомянутый ранее, и правда очень слабый, а вот у пико мощность 133Mhz, и пишут, что ее можно без проблем разогнать до 270. Конечно, не Teensy 4.1 - феррари микроконтроллеров - но для клавы сойдет.

Проблема пико в малом количестве пинов - 26, или 27, если отпаять с платы светодиодик.
https://www.hackster.io/news/this-raspberry-pi-pico-hack-unlocks-two-extra-hidden-gpio-pins-and-potentially-a-couple-more-aee23753281b
Как минимум, один нужен на сенсор, что дает нам максимальную кнопочную матрицу 13х13, или 169 кнопок. Вполне сойдет для любой, даже самой навороченной, цифровой гармошки, клавишного аккордеона 41x120, или миниатюрного кнопочного аккордеончика, например 34x80 нот с пятирядной кнопочной в правой. В общем, если кто-то хочет попробовать сделать цифровой аккордеон особо не вкладываясь в эксперимент - это вариант. Возможно, есть и более подходящие платы.

Вот фото зародыша цифрового аккордеона, на котором тестируется код ;)
 

Вложения

PXL_20230324_172720134.jpg
Так расширитель портов можно на SPI повесить. И не один. В общем зависит от компоновки и что удобнее. Один широкий шлейф или маленькая шина.
 
расширитель портов
Да, но цена голой Пико $4. Если начинать на нее что-то докупать и вешать, то лучше сразу тинси купить за $50-60.

В роланде уже напряглись...
А вы "Гадкий Утенок" читали?
Если такому зародышу дать подрости, то получится что-то вот такое: ;)
 

Вложения

joel-louveau.jpg
Что-то песня вспомнилась.
"... на инженерный факультет!" и " ... инженеру много дела есть и тут!" :ROFLMAO:
 
А если синтезатор делает не профессиональный программист, особо не державший паяльник со школьных времен, без вообще какого-либо опыта с Ардуино, микроконтроллерами, или даже миди, то приходится ползти наощупь ;)
Да я вообще в этом дилетант и просто "мимокрокодил..."
 
В общем надо вываливать в миди порт только то, что должно звучать. Придётся проверять, что если звук уже звучит, то его включение пропускается. И так же на выключение надо проверять, чтоб не было разрывов в звучании.
 
девичья фамилия Stradella
Да, да баг и нашел, пока страделлу тестировал. Я опечатался - проблемы будут и в левой и в правой.

Плохие новости - весь фортепьянно-подобный код надо переписывать, менять логику отправки миди команд, а заодно и произвести логическое деление клавиатуры на левую и правую.
Было: Проверить кнопки - если кнопка изменилась - послать соответствующий миди сигнал.
Стало: Проверить кнопки - если кнопка изменилась, записать это в промежуточные массивы, отвечающие за ноты (по сути, виртуальные "резонаторы", отдельные для левой и правой) - "резонаторный" массив держит инфу о том, сколько кнопок "поднимают" виртуальные клапаны - если состояние изменилось с нуля на что угодно или с чего угодно на ноль, только тогда послать миди команду.

Надеялся Майкловский код использовать с небольшими изменениями, а получилось, что от оригинального кода сейчас вообще почти ничего не осталось. :geek:

Хорошие новости - 60-70% переписал вчера вечером. Потом сел этюды на роланде гонять - на выходных допишу. Этот код уже можно будет очень легко перенастроить на полноразмерную клавиатуру, когда приедут запчасти.

Дал сыну протестировать - он умудрился-таки повесить клаву дважды, нажимая в диком темпе все кнопки подряд.
 
Надеялся Майкловский код использовать с небольшими изменениями, а получилось, что от оригинального кода сейчас вообще почти ничего не осталось.
Да это почти всегда так. Часто проще написать самому, чем разбирать почему не работает чужое. Ну это на мой дилетантский взгляд.
 
Надо игнорить команду если одновременно нажато более чем примерно 6 кнопок, считая её невозможной для пяти пальцевого гомо сапиенса.Чтоб буфер команд не переполнялся.
 
  • Мне нравится
Реакции: tetris
Как вариант Б - такая логика сойдет.
На 15 летнем роланде можно жать сколько угодно кнопок и он не виснет... Мне кажется, я видел примеры нажатия нескольких кнопок сразу, либо одним пальцем, либо ладонью у проф исполнителей - не то, чтобы мне такая техника когда-либо была нужна, но если делать, так надо стараться делать сразу как можно лучше, имхо.
Не знаю, проблема в нажатых кнопках, количестве отправленных нот, или в старой логике, которая удваивала громкость повторяемых нот - в таком случае, стукнув по страделле, можно легко отправить громкость, превышающую допустимый максимум в протоколе миди.
Тестировать надо будет уже новую логику и желательно на полноразмерной клавиатуре, а не на 4х4 в картонной коробке.
 
Вот еще совсем дурная мысль пришла: подключить к аккордеону дыхательный сенсор для управления бендами - дунул в трубку, бенднул вниз. Вдохнул - бенднул вверх. Вдох-выдох = вибрато, как на духовых. Сделать сенсор в виде сигары, чтоб совсем как чудик не смотреться (y).
Даже имя этому новому инструменту придумал: "Сософон" 🎷 ;)

Переписал код - теперь правая и левая логические клавиатуры разделены, разные кнопки могут отвечать за одни и те же ноты, есть готовый и выборный режимы для левой (готовый пока простенький и звучит очень пластмассово). Но теперь виртуальные клавиатуры уже самые аккордеонные. :cool:

Подтвердил первый серьезный баг, обнаруженный моим юным тестером: если [очень] быстро лупить по кнопкам, отвечающим за одну и ту же ноту, то нота может залипнуть (как на вкл, так и на выкл). Как на старой логике, так и на новой.
Диагностика показывает, что в таких случаях контроллер в какой-то момент не успевает сообразить, что кнопка была включена или выключена, и регистрирует только перемену состояния кнопки в одну сторону. На практике, играя музыку, мне кажется, такая проблема в правой не возникнет, и в левой она маловероятна, но все равно нехорошо. Надо потом будет разбираться Сейчас не пойму, как такая дрянь происходит.
Играть большое количество разных нот можно без проблем - ничего не залипает. Проблема именно в регистрации кнопок, "поднимающих" один и тот же виртуальный клапан.
 
Последнее редактирование:
Защита от дребезга есть в коде?
Надеюсь функций (delay) нет в цикле?
 
Последнее редактирование:
Надо игнорить команду если одновременно нажато более чем примерно 6 кнопок, считая её невозможной для пяти пальцевого гомо сапиенса.Чтоб буфер команд не переполнялся.
Как раз 6-7 легко нажать даже на клавишах - соседние одним пальцем.
 
Ну это от умения (неумения) играющего больше зависит. В нотах более 5 одновременно звучащих нот обычно не пишут.
Обычно подавление дребезга делается через отсутствие изменений сигнала с кнопки более примерно 5 мс для кнопок управления. То есть засекается системное время каждого изменения состояния if ( stateButton && !stateButtonPrevious) и реальным считается значение через контрольное время после последнего измененения. Может слишком большое время стоит, что не успевает обрабатывать?
 
Защита от дребезга есть в коде?
Надеюсь функций (delay) нет в цикле?
Распознование кнопок - последняя часть Майкловского кода.
Защита есть, но я пока в этот вопрос особо глубоко не вникал - работает, и работает. Сейчас приоритеты другие.
Задержка всего-лишь 1мс. Может, наоборот слишком мало? Я бегло читал ардуино библиотеку для управления миди клавой - там 5мс.

Если я печатаю диагностику через серийный порт, то там я задержку выставил намного выше, и "зависает", мне кажется, чаще.

Не совсем понимаю, как может распознаваться только пол нажатия. Если бы весь факт вкл-выкл пропадал, то ОК, логично. А только половинка - непонятно, как. Надо код перечитывать и вникать в него.

Количество нот или кнопок на проблему, как мне кажется, не влияет (12 нажимаются без проблем). Баг вылезает только при очень высокой скорости [повторного] нажатия нескольких кнопок.

Так что вам надо не только этот клейстер нажимать (а зачем?), но еще и лупить по нему быстро-быстро. Вряд ли такое в музыке встречается. :unsure: