Всего получилось 15 задач.
И все эти задачи раньше приходилось реализовывать вручную, на стандартных костылях Arduino-style (функции tick(), «таймеры на millis()» и всё остальное, в результате чего код становился трудно читаемым).
С переходом на нормальные задачи код стал заметно проще. Всем ардуинщикам очень рекомендую по возможности перебираться на FreeRTOS. Благо, она есть для всего уже.

А почему вообще было принято решение переписать на rtos (threads + queue)?
Потому что параллельное чтение миди-файлов и нажатых кнопок выглядела некрасиво в `loop()`?
Или там набегали погрешности времени например и ритм плавал?
Потому что «самодельная многозадачность в Arduino-style» вынуждает код быть сложным для понимания.
Изолированные задачи и реализуются проще, и читаются лучше.
Ну и лично мне хотелось хорошенько разобраться в FreeRTOS.
P.S. А за чтение кнопок и за проигрывание файлов сейчас отвечают разные контроллеры. Кнопки читает RP2040 расположенный на плате клавиатуры. И докладывает о клавиатурных событиях в центральный модуль, где работает другой RP2040.
Вот они все 3:

Ну да, в баяне самое дорогое — время разработчика! Затем печатные платы 😉
И чтобы изолировать код, чтобы он был простой расширяемый, проще купить платки по 500р и перекидываться сообщениями.
А вообще, я не собирался именно переписывать.
Мне надо было с нуля написать прошивку для клавиатурного контроллера — и я это сделал под FreeRTOS.
И после этого понял, что теперь уже не смогу мириться с «уродством» основной прошивки.