Наклеил магниты и начерно прикинул платы для первичной настройки.
Ну, что я могу сказать? Звучит. Нужно будет ещё какое-то время всё дополнительно попроверять, после чего можно будет монтировать платы на герметик.
Блог обо всём.
Поскольку, как я писал ранее, возможности кода, выполняющегося в контексте программных таймеров, весьма ограничены, я даже не стал пытаться выполнять какие-либо действия «бизнес-логики» в callback-функциях таймеров.
Вместо этого, я сделал обёртку вокруг программных таймеров FreeRTOS, которая делает всего одну простую вещь. Мои таймеры всего лишь в нужные моменты устанавливают нужные биты в указанных прн создании таймеров группах событий. Т.е. таймеры выполняют поручения вида «сделай так, чтобы в этой группе событий через столько-то миллисекунд установился этот бит (или несколько битов, если это зачем-то нужно)».
Интерфейс моего класса-обёртки в результате получился примитивный:
class MyTimers {
public:
enum TimerType {normal, oneOff, autoReload};
/// returns the ID of created timer
int createTimer(EventGroupHandle_t event_group, EventBits_t flags, int period, TimerType timer_type = normal);
/// starts the specified timer
void startTimer(int timer_id);
/// stops the specified timer
void stopTimer(int timer_id);
/// changes period for the specified timer
void changePeriod(int timer_id, int period);
/// stops & deletes the specified timer
void deleteTimer(int timer_id);
А реакция на выставленные флаги происходит в самих задачах.
Такой подход в моём случае себя полностью оправдал. С такими таймерами работать оказалось очень удобно.
Закончена установка плат левой клавиатуры.
Метод монтажа — на тонкий слой автомобильного герметика. Герметик выполняет две функции:
Пользуясь случаем, немного потыкал в конпки и записал на этой видео. Октавы в левых басах выключены, чувствительность к скорости нажатия включена. Можно слышать разницу между сильными и слабыми нажатиями и можно оценить диапазон громкостей.
В целом, я думал, что в левой клавиатуре всё будет хуже. Из-за конструктивных особенностей механики в ней есть люфты, и я ожидал, что в аккордах будет большая разница в громкости разных нот. По факту оказалось, что разница есть, но приемлемая. Гораздо заметнее — неодновременность начала звучания нот аккордов. Но с этим ничего не поделаешь, т.к. левая механика такого баяна не может обеспечить идеальную точность движения всех клапанов (да это и не нужно при штатном использовании инструмента).
В общем, кому не лень — можете повтыкать в видос ниже.
Я тут потихоньку монтирую платы 3-й версии в баян. Временно закрепил платы на деке, проверяю работу электроники и механики, исправляю ошибки.
Только что я дошел до стадии, когда что-то уже можно показать общественности (см. видео ниже).
Промежуточный вывод: левая механика достаточно сильно люфтит и не обеспечивает большую точность движений. Поэтому для левой клавиатуры я буду считать очень хорошим результатом, когда можно будет получать 3 отчётливо различимых на слух градации: «слабо», «нормально», «сильно». Но большего я от левой клавиатуры и не ждал.
Теперь понятно, как это всё хозяйство работает и звучит в реальной жизни. Понятно какие настройки нужны, и понятно, что в данный момент сделано не так, как надо. 🙂
P.S. После доработки звучание приблизилось к тому, что ожидалось изначально:
Я перезалил видео с демонстрацией настройки инструмента «орган Хаммонда».
Изначально видос был залит на «платформу«, но она почила в бозе. В результате я залил на рутуб, и обновил соответствующую запись в блоге.
Подогнал по месту платы правой клавиатуры. Пришлось чуть рассверлить отверстия, в которые продеты шпильки крепления резонаторов. Прилегание плат теперь плотное, расположение магнитов в клапанных окнах — приемлемое.
Следующий шаг — наклейка магнитов в правую и в левую части.
А баян V2, как можете видеть, уже разобран и звучать больше не будет. Следующие звуки будут только из 3-й версии.
Если кому интересно, то вот так платы баяна V3 укладываются на свои штатные места.
Я предварительно распечатывал контуры плат на принтере, вырезал и прикладывал по месту. Но к сожалению, я слишком поздно выяснил, что мой принтер при печати слегка увеличивает. Платы к тому времени уже были заказаны.
Но несмотря на то, что платы оказались примерно на 4 мм короче, чем надо, использовать их вполне можно.
Осталось уточнить размеры «резонатора» для самой левой платы, начертить его, напечатать, и можно будет собирать.
UPD: Вот как-то так (см. рис. 2).
Внутри — широко известный в узких кругах Ketron SD2 + усилитель звука, собранный на TDA8543T. Тот усилитель, который уже имеется на плате Ketron-а, не выдаёт громкость, достаточную для того, чтобы комфортно играть, управляя громкостью с помощью меха. Пришлось прикрутить альтернативный усилитель, который я могу рекомендовать для совместного использования с платой Ketron SD2.
Про сам Ketron SD2 могу сказать, что он хорош. Но недостаточно хорош, для того, чтобы занять место моего основного звукового модуля. Основным модулем у меня пока остаётся ATEMP Pro.DX.
Вот мои наблюдения:
Такие дела.
А вот программные таймеры FreeRTOS-овские меня немножечко разочаровали.
Для реализации таймерных callback-функций есть серьезные ограничения: они должны быть быстрыми и ни в коем случае не должны входить в состояние блокировки (например ожидание мьютекса). То есть там практически такие же ограничения, как и для функций обработчиков прерываний.
С одной стороны, оно понятно, почему так (следствие способа реализации этих самых таймеров). А с другой стороны — доставляет неудобства, т.к. фактически действия «по таймеру» приходится делать не в самой callback-функции таймера, а где-то ещё.
Ну хорошо.
Для моих целей пришлось сделать класс-обертку для реализации моей версии таймеров. У меня единственной задачей таймера является в нужный момент установить нужные флажки в указанной «группе событий» (термин FreeRTOS) — и всё. А уже другая задача будет ждать соответствующего флажка и при его обнаружении делать всё что надо. (На слух всё это звучит «не очень», но реализация получилась довольно удобная и довольно универсальная.)
В результате от «таймеров на millis()» я избавился везде, где это было целесообразно. При этом код, как ни странно, стал более простым и более понятным.
