Здесь channel – один из 11 стандартных выходных аудио каналов для воспроизведения.
2.7. Построение сетки. Подсвечивание нот

В интерфейсе приложения предусмотрено изображение гитарного грифа (рис. 2).
Рис.2. Гитарный гриф
Гитарный гриф является интерактивной частью интерфейса приложения. На нем расположены активные кнопки, которые издают звук ноты, которая соответствует ноте на реальной гитаре. На грифе можно выбрать тонику для мелодии, которую мы собираемся сгенерировать. После выбора тоники, от неё прорисовывается аппликатурная сетка, соответствующая выбранной гамме. Подробнее о вводе входных параметров будет сказано в параграфе 3.1.
Построение аппликатурной сетки по заданной гамме требует разработки специального алгоритма. Такой алгоритм нужен для того, чтобы мы могли без труда добавить любое количество гамм, не добавляя никакого кода в алгоритм отображения сетки.
Изначально на грифе находятся невидимые кнопки, которые при наведении на них курсора мыши становятся видимыми. Кнопки расположены на местах, которые соответствуют гитарным ладам. Т. е. это те места на струне, которые гитарист зажимает, когда хочет извлечь какую-либо ноту. Плюс еще кнопки для обозначения открытых струн. Макет дизайна такой структуры представлен на рис.3.
Всё это множество кнопок представлено в памяти машины в виде двумерного массива, т. е. матрицы. Где первый индекс – это номер струны, а второй индекс – это номер лада. Пример кода, объявление массивов, необходимых для работы с сеткой:

Рис.3. Макет дизайна гитарного грифа
public Button[,] buttons;
public Note[,] grifNotes;
Массив grifNotes нужен для хранения соответствующих нот.
При нажатии на кнопку грифа, происходит запоминание соответствующей ноты. Она запоминается как тоника, которая будет использоваться при воспроизведении мелодии. Подробнее о воспроизведении читайте в параграфе 2.6.
От выбранной кнопки должна отобразиться аппликатурная сетка. Алгоритм её прорисовки не зависит ни от какой конкретной гаммы. Шаблон гаммы подается на вход алгоритму во время выполнения программы. Таким образом сетка должна прорисовываться по шаблону гаммы. Ниже приведен фрагмент кода программы для отображения сетки. Это метод DrawGrid(), который вызывается в одном из обработчике событий формы. Здесь не приводится полная реализация метода. Её вы можете найти в параграфе 4.4.
public void DrawGrid(int i, int j, int selectedIndex)
{
int[] scaleIntervals = selectedScale. scaleIntervals;
for (int m = i; m < 6; m++)
{
int index = -1;
//Идем по струне вправо, используя шаблон
for (int k = j; k < 16; k += scaleIntervals[index % scaleIntervals. Length])
{
if (k == j || (k - j) % 12 == 0)
labels[m, k].Visible = true;
buttons[m, k].Visible = true;
index++;
}
index = scaleIntervals. Length;
//Идем по струне влево, используя шаблон
for (int k = j; k >= 0; k -= scaleIntervals[Math. Abs(index % scaleIntervals. Length)])
{ //По аналогии …}
//Смещение ладов при переходе на следующую струну
//Движемся от тонких струн к басовым
switch (m + 1)
{
case 1://следующая струна - вторая
if (j + 5 < 16)
j += 5;
else
j -= 7;
break;
case 2://следующая струна - третья
if (j + 4 < 16)
j += 4;
else
j -= 8;
break; … … … } }
Как мы видим, здесь также используется модульная арифметика. Сначала идет построение сетки вправо, потом влево по струне, на который была выбрана тоника. Далее мы спускаемся вниз к более тонким струнам, потом вверх к толстым. При этом нужно учитывать значения ладовых сдвигов при переходе на другую струну.
Глава 3. Запуск программы
3.1. Ввод параметров, работа с сеткой, генерация
Сейчас мы детально рассмотрим весь функционал приложения, увидим все его возможности, научимся им пользоваться.
Сначала взглянем на основное окно приложения. Оно представлено на рис.4.

Рис.4. Основное окно
Начнем разбирать вводные параметры.
Гамма. Она и будет определять стиль мелодии. После того как вы выберете определенную гамму, вы можете отобразить на грифе её аппликатурную сетку, которая будет «растянута» по всему грифу. Также сгенерированная мелодия будет полностью принадлежать данной гамме. Вот полный список на рис.5.
Рис.5. Список гамм
Количество нот. Это количество нот мелодии, которую мы собираемся сгенерировать. Можно задать любое неотрицательно число. Темп. Внизу этой надписи расположен ползунок темпа. Выбираем нужный темп – и готово. В выбранном темпе будет играться сгенерированная мелодия, а также сохраненная мелодия, если нам захочется сыграть мелодию из вкладки «Сохраненные».

Теперь можно переходить к генерации мелодии. Все параметры заданы. Конечно, для самых нетерпеливых установлены настройки по умолчанию, и вы можете сразу после запуска приложения сгенерировать мелодию. Если не ставить никаких настроек, то количество нот мелодии: 16, ноты будут взяты из Минорной гаммы, тоникой будет нота Ля третьей октавы, темп мелодии: «умеренный».
Нажимаем кнопку «Сгенерировать мелодию», и процесс начинается. С первых секунд мы можем услышать аккорд тоники. Он присутствует только для того, чтобы пользователь лучше запомнил звук тоники. Мелодия также заканчивается этим аккордом. Все проигрываемые ноты и структура ритма записываются в специальные поля. Также все проигрываемые ноты подсвечиваются на грифе красным цветом. Это показано на рис.7.

Рис.7. Процесс генерации
Как видно на рисунке, некоторые объекты формы блокируются при проигрывании и становятся недоступными для взаимодействия. Это нужно для предотвращения ошибок и «падения» программы. Доступными остаются поля выбора стиля, количества нот, ползунок темпа. Таким образом, пока вы слушаете проигрываемую мелодию, вы можете устанавливать настройки для следующей мелодии. Также активной является кнопка «Стоп». В любой момент вы можете прервать воспроизведение мелодии. Это достигается за счет работы в два потока. Приложение имеет основной поток, который находится в режиме ожидания пользовательских действий, и дополнительный, который берет на себя задачу воспроизведения мелодии. О потоках будет сказано в параграфе 4.2.
После того, как мелодия закончилась или была нажата кнопка «Стоп», мы можем проиграть ту же мелодию заново, нажав кнопку «Проиграть заново». Но перед этим вы можете установить другие настройки для темпа и тоники. Очевидно, что стиль мелодии вы уже не поменяете, и количество нот тоже. Таким образом вы в любой момент можете проиграть мелодию с разным темпом и с разной тоникой.
После многочисленных генераций у нас заполняется список сгенерированных мелодий, которые мы можем заново прослушать с разными параметрами, а также мы можем их изменить, сохранить или оставить нетронутыми. После закрытия программы они благополучно удалятся из оперативной памяти.
3.2. Изменение, сохранение, удаление
После того, как мы наткнулись на более или менее благозвучную мелодию, у нас может возникнуть желание сохранить её. Но, возможно, мелодия получилась не совсем идеальной. Осталось добавить только пару штрихов для того, чтобы её можно было благополучно сохранить. Иногда, может быть, вам этого не потребуется, но наша цель рассмотреть возможность изменения мелодии.
На рис.8. изображен выпадающий список, где находятся названия сгенерированных мелодий. По умолчанию мелодии просто нумеруются по порядку, начиная с единицы. В любой момент мы можем выбрать любую мелодию, которую мы сгенерировали в текущем сеансе, проиграть её заново, нажав кнопку «Сыграть» в соответствующей вкладке. Далее мы поговорим про изменение мелодии.

Рис.8. Список сгенерированных мелодий

|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 |


