идея
Некоторое время назад я писал о том, что погружаюсь в нотную грамотность, чтобы начать играть на гитаре хоть как-то осознанно. Я изучал теорию (в том числе, теорию музыки для нёрдов), регулярно выполнял упражнения, чтобы освоиться в мире нот.
Но вот найденных упражнений - опознания нот на стане и опознания нот на грифе - было мало. Мне хотелось соединить опознание нот на стане с опознанием нот на гитарном грифе. А лучше - на физическом гитарном грифе.
И, конечно, сел писать код. До чего ещё мог додуматься разработчик?
поиск стройматериалов
Вооружившись лупой поиском, я отправился на гитхаб1 за примерами кода.
По запросу guitar tuner
мне выпал такой код.
Потыкал в демо по ссылке, потыкал в код - показалось, что всё должно быть ок. Так что я вернулся к поиску других деталей.
Второй и последний кусочек пазла - библиотека для отрисовки самих нот. Каким-то макаром я нагуглил vexflow, и она мне вполне подошла.
С vexflow я достаточно быстро накидал отрисовку случайной ноты (хотя и пришлось немного поизучать чужие примеры - но в этом же вся разработка) - всё было готово к сборке.
первая попытка и паразитные обертоны
Окей, время тестить всё вместе.
Генератор нот работает, ноту генерирует. Тюнер тоже выдаёт какие-то ноты, их даже можно сравнивать со сгенерированной. После успешного попадания в ноту успешно генерируется новая. И вроде даже работает. Казалось бы, вот оно счастье.
Но нет.
Хардкожу себе ноту E второй октавы (это открытая шестая струна в классическом строе гитары). Бренькаю. Тюнер говорит, мол, нота B, и хоть ты тресни. 🤯
Почему так происходит - для меня было загадкой. Я стал разбираться и обратил внимание на письменное дополнение кода.
Now, detection of low frequencies is passable but still not great (the tuner often picks up the first overtone instead: on the low E string, this is a B. On the A string, this is an E).
Ну ёлы палы. В общем, для определения нот, этот тюнер берёт пробы по 50мс. Нота E второй октавы - это ±82Гц. Т.е. в период 50мс можно захватить, в лучшем случае, штуки 3 периода. Но зато можно получить достаточно периодов, к примеру, первого обертона.
Мне было лень хотелось поскорее закончить этот небольшой проект, поэтому я не стал дорабатывать напильником код тюнера.
вторая попытка и неожиданные приколы
Вернувшись на разборку гитхаб, я пошёл искать дальше. И нашёл другой тюнер. На сей раз я был умнее, и решил сперва проверить его работоспособность. Спойлер: всё сработало отлично.
Окей, всё работало - и генератор, и определитель нот. Последний я проверил, подменяя ноты от генератора на заведомо известные.
Но вот засада. Снова прошу ноту E второй октавы. Vexflow её рисует. Тюнер её правильно распознаёт. Но, чёрт побери, почему vexflow рисует её аж на 6 линеечках снизу (скрипичного ключа), когда гугл, по запросу guitar notes to tabs
показывает, что открытая шестая струна - это нота E под тремя чёрточками.
Неужели багос, думаю я. Даже захожу на issues гитхаба, где мне всё доходчиво поясняют.
Оказывается, все ноты, написанные под гитару, записываются на октаву выше. Даже википедия об этом знает:
Примечание: Гитара является транспонирующим инструментом, поэтому ноты произведений для гитары всегда записываются на октаву выше, чем звучат. Так делается для того, чтобы избежать большого количества добавочных линий снизу.
Напридумывают эти музыканты себе головняка. А потом мучайся…
вместо заключения
В итоге, у меня есть вот такое поделие. Оно живое работает. Если что, данные никуда не гоняются. Всё, что было в браузере, остаётся в браузере.
Что важно - описанное приключение наглядно демонстрирует, насколько важно разобраться в предметной области, прежде чем что-то кодить. Приколы с обертонами и сдвигом гитарных нот на октаву - тому подтверждение.
-
Гитхаб - хранилище кода всея интернета ↩︎