- PVSM.RU - https://www.pvsm.ru -
Задался я как-то целью слепить свою собственную вебовую табличку аккордов с целью рассказать человеку, с чем эти самые аккорды едят.
Да не простую мне хотелось табличку, а фичастую, чтобы она умела:
И вот как я это сделал…
В силу последнего пункта плана задуманных возможностей я решил, что всё целиком буду делать с помощью JavaScript.
Для вывода звука я использовал HTML5 audio как наиболее перспективную технологию. Проще говоря, мне совсем не улыбалось возиться с интеграцией Flash, к которому я, будучи любителем OpenSource, всегда относился с некоторым подозрением.
Для отрисовки аппликатур аккордов прекрасно подошёл HTML5 canvas, т.к. мне нужна была свободно масштабируемая аккордовая сетка.
Первым делом была слеплена простая виртуальная клавиатура. Клавиши представляют из себя множество div-ов с событиями onClick, слайдер сделан средствами jQuery-UI.

Затем была добавлена, собственно, таблица аккордов, проигрыватель простых мелодий (мелодии пишутся как множество нот и задержек между ними в миллисекундах), просмотрщик гитарных аппликатур.
Как это всегда бывает, с первыми успехами в работе над проектом появились и первые проблемы. Изначально проигрывание аккордов было сделано очень просто: при загрузке страницы JS генерировал 49 элементов audio — по одному на каждую клавишу синтезатора, каждой привязывался соответствующий звуковой фрагмент. И всё бы хорошо, вот только, как выяснилось, ни Chrome, ни Opera не смогли переварить 49 открытых аудиопотоков, некоторые ноты просто съедались. Проблему я решил очень просто: ограничил число элементов audio до 8, причём нагрузку на них распределил по round-robin. Очевидный недостаток такой схемы — необходимость смены источников(source) у элементов audio. Да, на локальной машине это не проблема, но вот подгрузка звуковых файлов с сервера совсем не мгновенна. Дабы свести подобного рода задержки к минимуму я использовал предзагрузку аудиофайлов в кэш браузера. Сделано это очень просто. Создаётся дополнительный элемент audio, которому последовательно передаются все звуковые файлы, которые будут использоваться клавиатурой. Задержки, конечно, остались, но они уже вполне терпимы.
Другой значительной проблемой для меня стали гитарные аппликатуры. И здесь дело даже не в красивой отрисовке сетки аккорда, которая скорее нудна, нежели сложна. Дело в подборе удобной аппликатуры.
Выделенные мной критерии удобства:
Всё это было доблестно вписано в одну формулу, которая и выбирает для моей таблицы самые подходящие аппликатуры гитарных аккордов. Сгенерированные скриптом аппликатуры аккорда C:
Подбор аппликатур до сих пор может немного замедлять работу приложения, т.к. происходит полный перебор нот аккорда по струнам. Проблема стоит не очень остро по той причине, что подбор происходит в отдельном потоке посредством Web Workers.
В результате я получил удобное средство нахождения и построения аккордов, поиска подходящих аппликатур, которое не стыдно показать вышеобозначенному человеку. Код проекта доступен на github.com [1] под лицензией CC BY-NC-SA 3.0 [2]. Буду благодарен за любую помощь с проектом, будь то ценный совет или готовый патч.
Попробовать код в работе можно прямо на github: демо [3].
Автор: Sadler
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/11963
Ссылки в тексте:
[1] github.com: https://github.com/Sadler2/Ovation
[2] CC BY-NC-SA 3.0: http://creativecommons.org/licenses/by-nc-sa/3.0/deed.ru
[3] демо: http://sadler2.github.com/Ovation/
Нажмите здесь для печати.