Всё, что мог сделать, — сделал

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

Написана заготовка класса MIDI-контроллера. Оно уже умеет обрабатывать нажатия и отпускания «музыкальных» кнопок. Каждой музыкальной кнопке поставлена в соответствие MIDI-нота; при нажатии/отпускании посылаются MIDI соообщения начать/закончить звучание. (В финальном варианте музыкальные кнопки обрастут доп. функциями, но пока — вот так.)

Добавил 3 сенсорных кнопки (см. рис. 1). Сенсорных — потому что простых кнопок у меня только 3, а их я уже задействовал под музыкальные кнопки (настроены на До-Ми-Соль 1-й октавы).

Эти сенсорные кнопки будут изображать управляющие кнопки. Две ближних кнопки сейчас переключают т.н. «номер программы» для текущего MIDI канала. Т.е. перебирают различные музыкальные инструменты, которые будут звучать в канале. Ну как перебирают… Должны перебирать. 🙂

Это всё надо проверять на настоящем MIDI синтезаторе. Вот приедут ко мне гнёзда DIN-5, я запаяю MIDI-выход для этой макетки, и можно будет через уже имеющийся MIDI-USB переходник подключиться к компу и «поиграть» на программном синтезаторе. Это у меня будет «праздник первого MIDI звука».

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

Рис. 1

Единственная проблема

Написание прошивки продвигается отлично. Но есть проблема. Пока единственная.

И проблема эта — эстетического свойства.

Не могу определиться со стилем наименования типов и переменных. 🙁 В разные моменты времени я давал имена разным сущностям, руководствуясь сиюминутным пониманием о правильности. В какой-то момент мн казалось правильным одно, а потом — уже другое. Потому что некоторые имена «нормально» выглядят в одном стиле, а другие в том же стиле выглядят «некрасиво». В результате получился разнобой. 🙁

В аду для перфекционистов
Ни серы нету, ни огня,
И лишь слегка несимметрично
Стоят щербатые котлы.

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

Рис. 1

Следующий модуль прошивки — MIDI-контроллер

Пожалуй, я понял, какой модуль писать следующим: MIDI-контроллер.

Получать нажатия практически любого количества кнопок прошивка уже умеет. По-разному моргать практически любым количеством светодиодов — тоже. А всё, что нужно миди-контроллеру для счастья — это получить событие от кнопки, сопоставить эту кнопку с конкретной нотой, и отправить соответствующую команду в MIDI-OUT порт и однократно мигнуть светодиодом (один светодиод будет индикатором активности MIDI-OUT порта).

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

Я сегодня пересобрал макетку. Избавился от ненужных светодиодов, убрал один 165-й регистр за ненадобностью в данный момент, и перетащил всё на более длинную макетную плату, чтобы там было место закрепить DIN разъем, когда он приедет. (Пока разъема нет — буду слать отладочные строчки в Serial, чтобы видеть их на компе.)

Заодно разобрался с MIDI протоколом. Он оказался довольно простым — всего 7 сообщений (см. рис. 1) и незамысловатый алгоритм их отправки. Из них я буду использовать три: 0x9, 0xB, 0xC и, может быть когда-нибудь, 0xE.

В общем, вперёд и с песней.

Рис. 1

СДЭКу — незачёт

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

Судя по следам на футляре (см. рис. 1 справа), его со значительной высоты уронили на угол. В результате — трещина в левом полукорпусе и порванный (или лучше сказать «треснутый»?) целлулоид. (Баяны не красят, их обтягивают целлулоидом.) 5 ярко-жёлтых наклеек с надписью «ХРУПКОЕ!» не помогли. Посылаю всем причастным к этому инциденту луч кровавого поноса с личинками.

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

Рис. 1

P.S. А работа уже в самом разгаре:

Рис. 1

Поторопился я или нет?

Как я недавно докладывал, развёл я себе gitlab.

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

Мнда.

Ну, зато мой гитлаб крутится на моём собственном сервере, обеспечивая какую-никакую гарантию приватности (что редкость в наши дни). И самое главное: он не введет против меня санкции и не запретит мне доступ к моим проектам (как происходило в 2022 году).

И, раз уж пошла такая пьянка, поделюсь радостью: я немного оптимизировал потребление оперативной памяти моими классами для работы с кнопками и светодиодами. Теперь они потребляют на 72 байта меньше. 🙂 Для Ардуино это актуально, там доступной оперативной памяти имеется всего 2 килобайта. Каждая сотня байт на счету.

Рис. 1 КДПВ

Изучение вопроса

В разработке элементов прошивки баяна возник перерыв. Полученные железки освоены. Но есть ещё куча материалов для изучения.

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

Рис. 1
Читать далее «Изучение вопроса»

Это хорошо, что детали приезжают не одновременно

Вот, к примеру, приехали ко мне регистры 74HC165, и стало возможным собрать отладочный вариант каскада кнопок (см. рис. 1) и написать обработчик клавиатуры.

У меня в наборе, правда, есть только 3 кнопки, но для отладки этого вполне хватило. Уверен, что переписывать работу с кнопками уже не придётся; разве только добавлять разные возможности. Ну и, конечно, придётся кое-где подправить после того, как станет понятно, как именно будут у меня организованы каскады кнопочных регистров. Сейчас пока не понимаю.

То, что пока получается, мне нравится. Оно читает значения из регистров и в случае обнаружения нажатий/отпусканий кнопки создаёт соответствующее событие и помещает его в очередь. Кнопки бывают «музыкальные» (для которых не нужно ловить ничего кроме нажатий и отпусканий) и управляющие, для которых надо будет ловить ещё удержания. Это для сценариев, когда простое нажатие, например, включает предварительно настроенный тембр синтезатора, а нажатие с удержанием больше 2 секунд переводит кнопку в режим программирования нового тембра. Очень, очень мне нравится концепция очереди событий в приложении.

Правда, когда я смотрю на размер получившегося кода, то возникают смешанные чувства. Например, в исходной прошивке «с форума» 1052 строки. А у меня сделано:

  • работа со светодиодами через регистры 47HC595
  • работа с кнопками через регистры 47HC165
  • очередь событий
  • и немного кода для того, чтобы всё вышеупомянутое можно было отладить.

И уже 589 строк. 🙂

Заодно не удержался и измерил скорость чтения каскада из 2-х регистров. Одно чтение занимает 0.2655 мс (я делал цикл на сколько-то-там тысяч чтений и измерял общее время в миллисекундах). Экстраполируя, можно предположить, что 17 регистров (если их склеить в один длинный каскад) будут читаться 2.26 мс. Это на 0.26 мс больше, чем в оригинальной прошивке задержка на включение одной строки датчиков Холла (а всего там 10 строк). Т.е. полное чтение клавиатуры там занимает не меньше 20 мс (это я только задержку посчитал). У меня же, повторюсь, все входы (и музыкальные клавиши, и управляющие кнопки) будут читаться за 2.26 мс. На порядок быстрее.

Кстати, дребезга механических контактов не замечено. Видимо, он не проходит дальше входных ног регистров. Зато «висящие в воздухе» ноги регистров читаются то нулями то единицами случайным образом (так и должно быть). На время отладки пришлось замаскировать соответствующую часть входящего буфера.

Дальнейшие действия зависят от того, что приедет следующим. По идее, это будут OLED дисплейчики 128*64 (2 шт.) и датчик давления (1 шт., дорогой оказался, сцк. Будет 1 датчик и для отладки, и для финального изделия. Надеюсь, не сожгу). Ну и в любом случае надо уже хорошенько разбираться с MIDI сообщениями. Причём не столько с ними, сколько с тем, как этими сообщениями управлять синтезатором. А здесь — задержка. В наличии только синтезаторы без корпуса, для встраивания куда-нибудь. А мне же нужен в корпусе; баян у меня будет не более чем MIDI клавой.

Рис. 1

Изголовье для кровати — 4

Сегодня я закончил, собственно изголовье. Вторая обивка у меня заняла существенно меньше времени, чем первая. Опыт, однако.

Следующий этап — длинная настенная панель.

Рис. 1

Что-то мне подсказывает…

…, что я буду не перерабатывать прошивку, взятую с форума, а писать свою, подсматривая нужные функции в форумной.

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

Не нравится. Напишу по-своему.

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

Рис. 1 КДПВ

P.S. Алик только что порадовал: ко мне уже приехали входные регистры 74HC165. Завтра (т.е. уже сегодня) заберу, и можно будет писать и отлаживать чтение клавиш и управляющих кнопок (в моей архитектуре они будут читаться одинаковым образом); не как в оригинальной прошивке.

Накропал какой-то интерфейс к линейке светодиодов через сдвиговый регистр

Сейчас класс поддерживает 2 режима работы каждого светодиода: непрерывный и мигающий. На видео одна кнопка перебирает светодиоды с одного конца линейки (сначала включает непрерывный режим, а потом выключает), а вторая кнопка перебирает светодиоды с другого конца, включая и выключая мигающий режим.

Думаю, что пользоваться будет удобно.

Подумаю, может ещё что-нибудь можно накорябать, пока детали едут. Интересно же.