- "да" - подтверждение действия
- "НОМЕР" - нажать на элемент #НОМЕР
- "НАЗВАНИЕ ТОВАРА" - поиск товара по названию и описанию
- "написать ФРАЗУ" - вводит ФРАЗУ в поле ввода
- "вниз | вверх | в начало | в конец" - прокрутка страницы
- "закрыть" - закрыть меню каталога
- "назад | вперед" - переход на предыдущую/следующую страницу
Приложение "Музыкальные аккорды"
Оглавление "Программирование для игр"
Создание гибридной образовательной игры – это не только отличное занятие, но ещё и возможность разобраться с непонятной темой. Музыкальные аккорды являются прекрасной возможностью окончательно разобраться с ними и не растеряться при виде множества клавиш на синтезаторе или пианино.
Для разогрева возьмём аккорды в основном виде - трезвучия и септаккорды. Эти аккорды состоят из терций – интервалы с тремя ступенями, которые бывают большие и малые. Трезвучия состоят из двух терций, а септаккорды – из трёх. Для получения всех аккордов переберём все варианты расположения терций в аккордах. Два интервала дадут 4 варианта, а три – 8.
Попробуем в приложении случайным образом генерировать терции, а результат озвучивать для дальнейшего взятия аккорда на клавиатуре или перемещения фишек по использующимся в нём клавишам.
У нас есть три позиции для расположений интервалов. При этом возможны такие состояния: большая терция - “b”, малая - “m” и нет ничего - “”. В любой из позиций может отсутствовать интервал, но тогда в двух оставшихся позициях интервалы должны быть. Название аккорда кодируется последовательностью букв.
Трезвучия:
bm – мажорное трезвучие
mb – минорное трезвучие
bb – увеличенное трезвучие
mm – уменьшённое трезвучие
Септаккорды
mmm – уменьшенный
mmb – полууменьшенный
mbm – малый минорный
mbb – большой минорный
bmm – малый мажорный (доминантсептаккорд)
bmb – большой минорный
bbm – увеличенный
bbb –
У bbb нет названия, потому что это не септаккорд. В четырёхголосном изложении это увеличенное трезвучие с удвоенной примой. Отсюда возникает ещё одно условие: если в первых двух позициях стоит ”b”, то в последней должно быть только “m” или ””.
Для хранения данных выберем формат JSON с набором свойств:
{
“bm”:”мажорное трезвучие”,
“mb”:”минорное трезвучие”,
…,
“bbm”:”увеличенный септаккорд”
}
За основу возьмём приложение из предыдущего занятия и составим блоки для получения названия свойства. Для этого можно скопировать экран, а затем вставить его как новый экран в проект. Составим функцию для получения названия аккорда.
Это что это за непонятная куча блоков? После запуска проекта с таким решением выяснится две проблемы: синтезатор речи произносит букву ”е” в слове ”септаккорд” как ”е”, что режет слух, а вместо случайной выборки аккордов чаще всего выпадают трезвучия, как имеющие три, а не один вариант генерации. Например, мажорное трезвучие получится из строк ”nbm“, “bnm“ и “bmn“ после замены символа “n“ на пустую строку.
С этим вариантом можно было бы ещё повозится, но уже сейчас видны проблемы. Хотелось сделать приложение ”крутым” со случайной генерацией терций, а в результате получилась куча блоков, для исправления нюансов работы которой придётся городить ещё одну кучу блоков. Одним словом, зашли в болото и безопаснее выбрать другой путь, а “ломить” через него.
Изначально у нас есть список пар. Его и надо было делать со случайной выборкой элементов по индексу, как на предыдущих занятиях. Для этого исходные данные будем хранить в виде строки с разделителями:
“бм:мажорное трезвучие,мб:минорное трезвучие,бб:увеличенное трезвучие,мм:уменьшённое трезвучие,ммм:уменьшенный сэптаккорд,ммб:полууменьшенный сэптаккорд,мбм:малый минорный сэптаккорд,мбб:большой минорный сэптаккорд,бмм:малый мажорный сэптаккорд,бмб:большой минорный сэптаккорд,ббм:увеличенный сэптаккорд”
Эту строку можно легко превратить в список. Преимущество списка перед набором свойств в объекте заключается в том, что он позволяет однообразным способом обратиться к любому полю в нём, а также использовать кириллицу в строке. Это может пригодиться для расширения функциональности, например, составлять аккорды по интервальному составу.
Блочный код проекта
Пустой блок функции используется в качестве поставщика переменных вместо блоков глобальных переменных, от которых рябит в глазах и с которыми связано ряд нюансов. Переменные из параметров функция - это настоящие переменные, хотя и глобальные в пределах экрана.
Для компактности вида я не стал вводить функции start и getName, но и так понятно, что на этапе инициализации мы создаём список пар с разделителем ":", а при нажатии на полноэкранном холсте происходит генерация случайного индекса, получение по нему элемента, разбиение элемента на список пар и озвучивание последнего значения пары. Воспроизведение слова "сэптаккорд" звучит ещё хуже. Остановимся на "китайском" звучании и произведём обратную замену на "септаккорд".
При необходимости можно озвучивать не название аккорда, а его интервальный состав. В этом случае получить первый элемент пары можно по индексу first или 1.
Для увеличения функциональности приложения добавьте в проект случайную генерацию названия ноты, от которой нужно строить аккорд. Ещё более сложное приложение получится, если дополнить варианты аккордов их обращениями. И для чего так себя напрягать? Об этом мы узнаем на следующем занятии.