Как компьютер подбирает аппликатуры гитарных аккордов
Аппликатуры гитарных аккордов отвечают на простой вопрос: как сыграть этот аккорд? Введите Am7, D/F# или C7#9 — и получите играбельные формы на первых двенадцати ладах, сначала самые полезные, с пальцами, нотами на нотном стане, звуком и рукой в 3D. Работает и наоборот: поставьте форму на гриф, и сайт назовёт аккорд.
Сборники аккордов отвечают на тот же вопрос страницей отобранных вручную диаграмм. Программе ещё предстоит научиться такому отбору. Вот как она это делает, шаг за шагом.
1. Читаем название аккорда
Обозначение аккорда — маленький язык. Cmaj7, CM7 и CΔ7 — один аккорд; C7#9 — не C7b9; в D/F# часть после косой черты — басовая нота, а не часть названия. Разбор превращает текст в три факта:
- тоника:
C,F#,Bb; - интервалы над ней: мажор — 0, 4, 7 полутонов;
m7— 0, 3, 7, 10;9добавляет 14; - бас, если его просит косая черта.
Заодно решается, как называть ноты. В си мажоре терция — D#, а не Eb; в фа миноре — Ab, а не G#. Сайт называет ноты и рисует нотный стан по ступеням аккорда, поэтому у B будут B D# F# и диезы на стане.
2. Какие ноты обязаны звучать
У гитары шесть струн, а в аккорде с терцдецимой семь нот, значит, чем-то придётся пожертвовать. Ноты не равноценны. Тоника, терция (или задержание), септима или секста, альтерированная квинта, самая верхняя ступень и все альтерированные ступени определяют звучание. Чистая квинта и нижние натуральные ступени необязательны: гитаристы постоянно их опускают, и аккорд всё равно звучит собой. Форма без обязательной ноты не предлагается, форма без необязательной — предлагается с небольшим штрафом.
3. Все играбельные формы
Дальше программа делает то, чего не может ни один сборник: перебирает всё. Для каждой струны — «заглушена», «открыта» или лад из первых двенадцати, и остаются сочетания, которые:
- звучат только нотами аккорда, с нужным басом внизу;
- задействуют не меньше трёх струн;
- укладываются в растяжку четырёх ладов;
- глушат не больше одной струны в середине формы: глушить внутренние струны при бое трудно.
Большинство сочетаний отсекается рано: после выбора нескольких струн часто ясно, что никакая рука форму не закончит, и перебор глубже не идёт.
4. Подбираем пальцы
Список ладов — ещё не аппликатура. Для каждой оставшейся формы программа ищет, какой палец какую струну прижимает: кладёт ли указательный баррэ, нужно ли малое баррэ другим пальцем, хватает ли вообще четырёх пальцев. Некоторые формы, хорошие на бумаге, требуют пяти пальцев и отсеиваются здесь. Для остальных модель руки оценивает, насколько хват тяжёлый: растяжка, перекрещивание пальцев, баррэ.
5. Ранжируем как сборник
Самое трудное — порядок. «Сначала самые лёгкие» — не совсем то, чего ждёт гитарист; он ждёт сначала привычную. Для C это x32010, а не какая-нибудь удобная, но странная форма выше по грифу.
Ранжирование складывает два вида стоимости. Физическая: усилие хвата и позиция на грифе. Музыкальная: бас, превращающий аккорд в обращение, которого никто не просил, пропущенные или удвоенные ноты, открытые струны в неудобных местах, ступени, набитые в басовые струны. Знакомые формы — CAGED, которые знает каждый гитарист, — получают бонус, поэтому переносные баррэ-аккорды оказываются на привычных местах.
Есть и библиотека отобранных форм из открытого проекта chords-db (лицензия MIT), и её первая форма для аккорда тоже получает бонус. Я пробовал убрать библиотеку и оставить только генератор. На наборе из 204 сборниковых форм один генератор ставит форму из сборника первой в 190 случаях, с библиотекой — в 204 из 204. Промахи показательны: без библиотеки C7 начинается с x35353 вместо x32310, которую печатает любой сборник, а Fmaj7 — с 132211 вместо xx3210. Так что библиотека остаётся, пока генератор не научится обходиться без неё.
Веб-версия — порт того же движка, что работает в моём Android-песеннике MySongbook. Чтобы они не разошлись, тест сравнивает веб-версию с данными, выгруженными из Kotlin-кода: 79 названий аккордов, 3256 библиотечных форм и 232 аккорда с их сгенерированными формами и итоговым порядком.
6. Называем аккорд по форме
Вкладка «Форма → аккорд» запускает идею в обратную сторону. Поставьте на гриф x02010 — и получите Am7. Каждая звучащая нота пробуется как тоника в сочетании со словарём качеств аккорда; бас становится басом через косую черту, если он не тоника. Гипотеза выживает, если все звучащие ноты принадлежат аккорду и пропущено не больше одной определяющей ноты. Затем выжившие проверяются прямым ходом: если генератор сам предлагает именно эту форму для аккорда, да ещё высоко, это сильный довод в пользу названия. Самопроверка держит его честным: первые формы, которые сайт предлагает для набора аккордов, должны определяться обратно в те же аккорды.
7. Рука в 3D
В 3D видна рука, которая держит форму. Поза считается на сервере: положение кисти и пять углов на каждый палец находятся методом наименьших квадратов при физических условиях. Подушечка прижимает свою струну в своём ладу и не давит соседнюю, ничего не уходит в гриф, звучащие струны не задеты, пальцы не пересекаются. Там, где форма оставляет свободу, решатель тянется к тому, как сидят настоящие руки, — по статистике (только средние и регрессии) из записей захвата движений (motion capture) гитаристов.
«Похоже на правду» трудно проверить, поэтому есть нижняя планка качества. Корпус примерно из 400 форм — три самые частые формы для двенадцати тоник и одиннадцати качеств плюс все формы, о которых присылали отзывы, — после каждой правки пересчитывается и проверяется на физические проблемы. Правка не может добавить новый вид проблемы, сделать какую-то проблему чаще или сдвинуть пальцы у чистых форм. Отзыв из 3D-диалога («палец неестественно согнут») считается баг-репортом: его воспроизводят, исправляют и добавляют форму в корпус.
Что я вынес
- Сначала порождать, потом судить. Перебрать все формы дёшево; знание — в ранжировании.
- Музыкальные правила важнее хитрой математики. Обязательные и необязательные ноты, бас, удвоения — правила, которым гитаристы и так следуют, дали больше любой подгонки весов.
- Не выбрасывайте данные, отобранные людьми, пока алгоритм не докажет, что обходится без них, на тесте, написанном заранее.
- Превращайте вкус в тесты. «Сначала привычная форма» стала 204 формами из сборников, «рука как настоящая» — планкой качества, которую можно только поднимать.