Дело продвигается

В прошедшие выходные было сделано два дела:

  • Изготовлено дно из стеклотекстолита для панели управления.
  • Установлена на место декоративная решётка правой половинки.
Рис. 1 КДПВ
Читать далее «Дело продвигается»

Панель управления в сборе

Сегодня я начерно собрал панель управления (см. рис. 1). Вставил плату в корпус, и установил дно. В финале панель управления будет выглядеть именно так, только я с экранчика ещё защитную плёнку сниму.

Я поражаюсь, насколько просто в наше время делать плотную компоновку всех деталей. Это всё исключительно из-за того, что есть возможность делать трёхмерные модели и заниматься подгонкой не вживую, а на компьютере. Ну и, само собой, объёмная печать даёт такие возможности, о которых в период моего активного радиолюбительства в студенческие годы я и мечтать не смел.

Рис. 1

К сожалению, проверочная сборка показала, что материал для дна я выбрал неудачно. Дно я сделал из стенки вентиляционного короба (см. рис. 2).

Рис. 2

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

Ну и прикинул, как панель управления будет выглядеть на декоративной решетке:

Рис. 3

Вполне приемлемо.

Дурацкий баг

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

Крепление сделал, воткнул разъём и решил на всякий случай проверить, работает ли оно после перепайки разъёма.

И внезапно обнаружил, что переключение «пресетов» отлично работает при отключенном левом полукорпусе, но глючит при подключенном.

На поиск бага ушло 5 часов. Баг оказался дурацкий: я забыл, что один из членов структуры — это 2-битовое поле. И в одном месте я самым беспечным образом обращался с ним, как с обычным целым. И не мог понять, почему не срабатывает проверка на index == number_of_elements. А элементов там 4. А поле — 2-битовое. Ага.

Я про это вспомнил только тогда, когда психанул и напихал в прошивку «отладочную печать» через светодиоды панели управления. И очень удивился когда после 3 стало 0. А потом ка-а-ак понял!

Рис. 1

Готов корпус панели управления

Готов нарисованный ранее корпус для панели управления.

Кнопки вставлены «просто так», платы внутри корпуса пока нет, и вместо зкранчика пока синий скотч.

Выглядит, вполне ожидаемо, как «корпус, напечатанный на 3D принтере». Пока пусть будет так, как есть. В будущем, может быть, я сподоблюсь как-то отшлифовать наружную поверхность, чтобы было гладко и блестяще (или хотя бы матово).

Рис. 1

Печать заказывал здесь.

Нарисовал корпус панели управления

Поскольку прошивка готова, и датчики настроены, нужно продвигаться к следующему этапу: 3D печать корпуса панели управления и кнопок. Эскиз расположения кнопок и светодиодов на плате у меня был, на его основе и разрабатывал модель корпуса.

Сначала сделал модель самой печатной платы, чтобы по ней проверять правильность расположения отверстий в корпусе и правильность размеров кнопок. Потом нарисовал корпус, кнопки, и объединил всё в сборку. Очень удобно всё это делать в Компас 3D: делаешь сам корпус временно невидимым, и можешь проверять, как кнопки располагаются относительно микровыключателей, запаянных на плату. Как раньше без таких программ жили — решительно непонятно.

Рис. 1

Вроде норм. Единственное место, которое мне не нравится — это расположение левой «стрелки» вплотную к экрану. Надо было разнести ещё миллиметра на 3. Но уже поздно; расположение элементов определяется платой, а её я переделывать совершенно точно не буду.

Теперь надо прицениться к печати этого корпуса и 22-х кнопок (16 на Ø10 мм, и 6 на Ø15 мм).

Взрыв-схема сборки панели управления выглядит так:

Рис. 2

Прошивка для MIDI-баяна готова

Сегодня вечером после работы я закончил работу над прошивкой MIDI-баяна. Даже не верится. Реализовал все функции, которые хотел:

  • Полная поддержка готово-выборной левой клавиатуры. На механизм переключателя установлен свой собственный датчик, и контроллер при включении сам определяет текущий режим. Само собой, переключение режимов тоже определяется. В готовом режиме басы и аккорды играют в разные MIDI каналы, которые можно настраивать совершенно независимо. Т.е. на бас можно настроить звук контрабаса, а на аккорды — гитару или, например, фортепиано. В режиме выборной клавиатуры вся левая рука играет в один канал (что логично). Само собой, канал для выборки настраивается независимо от каналов баса и аккордов.
  • Особенность конструкции левой клавиатуры моего баяна в том, что басы там играют октавами. Т.е. при нажатии одной клавиши баса механизм открывает два клапана: одна нота в контроктаве и одновременно с ней та же нота в большой октаве. Для баяна это хорошо, т.к. добавляет красок в басовый звук. А вот для MIDI инструмента — это уже недостаток, т.к. далеко не каждый инструмент будет хорошо звучать с октавами в басах. Поэтому я сделал спец-режим «запрет октав в басах». Если он включен, то контроллер игнорирует нажатия более высоких басовых нот, если уже нажата соответствующая низкая нота. Само собой, датчики должны быть настроены так, чтобы датчик низкой ноты срабатывал чуть-чуть раньше, чем датчик высокой ноты.
  • Работа меха регистрируется дифференциальным датчиком давления, который измеряет разницу между давлением внутри герметичного корпуса и давлением снаружи. Также есть режим игры с выключенным датчиком давления; в этом случае громкость звука настраивается через меню настроек.
  • Имеется возможность сохранения 6 вариантов настроек всех MIDI-каналов (правая рука, бас, аккорд и выборка) — т.н. «пресетов». Каждый пресет включается своей кнопкой; текущий пресет обозначается соответствующим горящим светодиодом. (См. заметку про дизайн панели управления.) Запоминание настроек происходит интуитивно просто: как только все звуки настроены как надо, достаточно нажать и удерживать кнопку соответствующего пресета. После обнаружения длительного нажатия, соответствующий светодиод сначала быстро заморгает, обозначая, что «сейчас будет записан выбранный пресет». Если в течение 3-х секунд после начала моргания кнопку не отпустить, то пресет запишется в энергонезависимую память (EEPROM). По похожему алгоритму запоминаются радиостанции в некоторых автомагнитолах.
  • Поскольку настроек у MIDI каналов много, и перебирать их через меню не всегда удобно, реализованы 4 настраиваемых кнопки быстрого доступа к настройкам. Если в момент редактирования нужного параметра нажать и удерживать кнопку быстрого доступа, то эта кнопка станет связана с этим самым параметром. И для повторного изменения данного параметра достаточно будет один раз коротко нажать эту кнопку быстрого доступа (и сразу можно будет менять параметр «стрелочками»). Очень удобно.
  • Если контроллер обнаруживает, что настройки звука изменились, то светодиод текущего пресета начинает медленно мигать, показывая, что имеются несохранённые изменения. Эти изменения можно сохранить либо в текущем пресете, либо в любом другом. А можно и не сохранять.
  • Имеется встроенная ритм-машина, которая может работать в двух режимах:
    • ручной — когда при каждом нажатии басовых клавиш проигрывается один звук ударных инструментов (например барабан «бочка»), а при нажатии аккордов — другой звук (например «тарелка»).
    • автоматический — когда проигрываются заранее запрограммированные мелодии (в данный момент у меня сделаны 5 штук: 2 метронома (3/4 и 4/4) и 3 простых ритма). Автоматический режим может стартовать либо по кнопке на панели управления, либо при первом нажатии любой басовой клавиши.
  • Имеется «упрощенный» режим выбора некоторых настроек, адаптированный специально для синтезатора ATEMP MIDI HW Synth. В этом режиме значения параметров, не реализованные в синтезаторе, просто пропускаются; выбрать можно только то, что поддерживается синтезатором. В основном это касается выбора дополнительных банков инструментов.
  • Все настройки сохраняются с энергонезависимой памяти, и при следующем включении инструмент восстанавливает то состояние, в котором он был выключен.

Когда закончу работу над механической частью (герметизация технических отверстий в корпусе и крепление декоративной решетки правой клавиатуры), запишу видеоролик с демонстрацией этого всего.

Рис. 1

Продолжая тему джазовой гармонии на баяне

По следам предыдущих публикаций.

Сделал сводку по основным «джазовым» аккордам — см. рис. 1. Это для «До». Для остальных нот — всё по аналогии (у баянистов здесь не должно возникать вопросов).

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

Рис. 1

Эта информация будет полезна, например, для игры т.н. «turnaround progression» которая используется в очень многих джазовых произведениях:

Dm7 - G7 - Cmaj7 - A7

Вести с MIDI-полей

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

А пока докладываю о том, что было сделано за всё это время:

  • В библиотеку работы со светодиодами я добавил режим медленного мигания светодиода. Пригодится для того, чтобы показывать, что данные текущего пресета (настроек тембров и прочих звуковых параметров) были изменены, но еще не сохранены в EEPROM.
  • Добавил глобальную настройку «Общая громкость» — чтобы можно было вручную настраивать громкость одновременно для всех активных MIDI-каналов.
  • Добавлено обновление значений громкости при включении/выключении датчика давления (значение общей громкости берется либо из датчика давления, либо из глобальной настройки соответственно).
  • Сделано обновление значений громкости в каналах левой руки при переключении режима готовой/выборной клавиатуры.
  • Сделано сохранение и восстановление глобальных настроек и пресетов в/из EEPROM (сохранение пресетов производится длительным нажатием кнопки соответствующего пресета, а глобальные настройки всегда автоматически сохраняются спустя 8 секунд с момента последнего изменения). В результате при включении баян приходит в то же состоянии, в каком он находился в момент выключения. Мне очень нравится, как всё получилось.
  • Сделал функцию отправки всех настроек в синтезатор. Настройки отправляются либо при смене пресета, либо по нажатию спец-кнопки на панели управления.
  • Добавил удобное переключения банков инструментов для синтезатора ATEMP. Для некоторых инструментов могут быть, а могут и не быть дополнительные варианты звучания; эти дополнительные варианты расположены в дополнительных т.н. «банках». В каких именно — описано в документации на синтезатор. Я сделал так, чтобы банки инструментов можно было менять только на те, в которых есть доп. инструменты; т.е. если для какого-то инструмента есть всего 3 варианта звучания, то для такого инструмента можно выбрать только один из этих 3-х вариантов (вместо того, чтобы перебирать все 127 возможных значений). Это на порядки упрощает поиск нужного тембра.
  • Сделан экран редактирования глобальных настроек (общая громкость, режим «running sttatus» и проч.)
  • Небольшой рефакторинг старого кода.

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

В исходниках уже 3910 строк; продолжаю работу над прошивкой.

Рис. 1

Мысли про скорость

Пока я нахожусь вдали от компьютера, приходят в голову разные мысли. Одна из них — это вопрос: способен ли будет мой баян перегрузить MIDI out порт командами в том случае, когда будут меняться настройки всех трёх активных midi каналов при нажатии кнопки «смена пресета». Для каждого канала надо будет установить примерно 15 параметров. Один параметр — это одна midi команда из 3-х байтов. Т.е. при смене пресета нужно будет отправить порядка 50 байт, и мне было интересно, сколько времени это может занять; будет ли эта задержка заметна во время игры.

А тут выдалось время на то, чтобы посчитать.

Скорость обмена данными у MIDI интерфейса — 31250 бод. То есть порядка 2900 байт в секунду. То есть порядка 1000 midi-команд в секунду. То есть мои несчастные 15 команд пролетят за 15 миллисекунд.

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

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

Рис. 1 (КДПВ)

Баян впервые собран

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

Можно играть обеими руками.

По механике — осталось герметизировать все отверстия и придумать, как крепить жгут проводов, идущий из одного полукорпуса в другой.

Черновая проверка датчика давления показала, что отработка нештатных ситуаций прошивкой работает отлично. 🙂 При одновременной работе датчика давления и большого количества музыкальных клавиш переполнялась внутренняя очередь MIDI-сообщений и прошивка вылетала в индикацию внутренней ошибки (баян перестаёт реагировать на внешние раздражители и высвечивает на светодиодах код ошибки). Видимо, очередь на 4 MIDI-сообщения была слишком маленькой; увеличил до 7. И слегка поменял внутреннюю логику разгребания этой очереди и отправки команд в синтезатор через MIDI-out порт.

Сейчас всё работает чётенько. 🙂

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

Рис. 1