Тоника – главная нота в мелодии. Она является самой устойчивой. С неё чаще всего начинается и на ней чаще всего заканчивается мелодия. В мелодии, построенной нашим генератором, она всегда будет стоять на первом месте, т. е. мелодия всегда будет начинаться с тоники. В предыдущей версии программы, тоника стояла и на последнем месте мелодии, но от такого решения пришлось отказаться для того, чтобы мелодии казались менее шаблонными.
Устойчивая нота – нота, которая звучит в мелодии «наиболее комфортно». На ней можно оставаться сколь угодно долго. Тоника является самой устойчивой нотой в мелодии. Такие ноты являются сильными, опорными. Они противопоставляются другим, неустойчивым нотам. С них хочется поскорее уйти на другую, устойчивую ноту. Неустойчивые ноты имеют тяготение и требуют разрешения в более устойчивую ноту.
Тяготение – явление, возникающее, когда вы играете неустойчивую ноту, и вам хочется уйти с этой ноты, сыграв более устойчивую.
Разрешение – переход с неустойчивой ноты на более устойчивую.
Определим наиболее важную для нас сущность.
Ритм – совокупность нот и пауз. Здесь нота – знак, определяющий, с какой
длительностью в долях играется нота. Пауза – период, за который ничего не
звучит. Для нас важным будет определить, как этот ритм кодировать и генерировать.
Темп – количество ударов метронома в единицу времени. Проще говоря, скорость воспроизведения мелодии.
Мелодия считается благозвучной, если она хоть как-то претендует на звание музыкальной мелодии. Определение очень субъективное, но чего-то лучшего ждать нельзя, так как даже мелодия, созданная человеком, может нравиться одному человеку и не нравиться другому. «…Единственное мерило, из-за чего вся музыка, собственно, и существует – восприятие человеком последовательности разновысотных звуков – тоже относительно»2. Благозвучность мелодий, сгенерированных нашим приложением, будет достигаться за счет нот из определенной гамма и за счет специальных алгоритмов генерации ритма и последовательности нот.
1.2. Правила создания мелодии
В предыдущем параграфе уже были упомянуты некоторые правила, которыми мы будем пользоваться при построении алгоритма генерации. Здесь мы постараемся собрать всё воедино и обобщить.
1. Наша мелодия должна начинаться с тоники.
Таким образом после выбора гаммы, тоники, темпа мы можем смело приписать тонику на первую позицию в последовательности нот. Это наше правило, которое нечасто применяется на практике. Часто бывает, что первой нотой мелодии оказывается тоника. Но первой нотой может быть квинта и любая другая даже неустойчивая нота. Мы же приходим к такому решению для того, чтобы избежать чрезмерного хаоса. В нашем случае машина не способна определить, когда и с какой ноты лучше начать нашу мелодию. Хотя можно было бы сделать набор вероятностей для начальной ноты. И всё же тоника на первом месте – это пока наиболее простой и понятный выбор, и он приводит к хорошим результатам.
2. Мелодия должна иметь стиль.
Как достичь того, чтобы генератор выдавал мелодии с выбранным стилем, пока неясно. Но об этом будет идти речь в параграфе, посвященном стилю мелодии.
3. Ноты мелодии должны принадлежать исключительно выбранной гамме.
Это правило говорит о том, что в мелодии не будет присутствовать никаких хроматизмов, не имеющихся в гамме. Таким образом у генератора не будет возможности выдать какую-нибудь лишнюю ноту. Все ноты принадлежат гамме. Такая оговорка важна только потому, что в реальности музыкант может сыграть хроматическую гамму в любой части мелодии. Также музыкант может взять ноты из какой-либо другой гаммы. Возможно, этого будет требовать сама мелодия или душа музыканта. В нашем же случае разумно будет принять некоторые упрощения. Хотя можно было бы использовать хроматическую гамму в качестве приема игры и случайным образом вставлять её в какое-либо место в мелодии.
4. Алгоритм генерации не должен зависеть от гаммы, тоники и темпа.
Сам алгоритм не зависит от выбранного гаммы, но результат выполнения алгоритма обязательно зависит от него. Шаблон гаммы подается на вход алгоритму генерации.
5. Ритм и последовательность нот генерируются отдельно и независимо.
Хотя алгоритм выдачи нот может принимать на входе структуру ритма. Таким образом алгоритм может анализировать ритм и подбирать ноты под этот ритм. Но это необязательное условие.
6. Алгоритм выдачи нот должен различать октавы.
В предыдущей версии программы ноты выдавались только в одной октаве. Это являлось существенным ограничением. В данной работе это ограничение снимается. Теперь ноты могут браться и из других октав. Однако по-прежнему ноты, различающиеся на октаву, является тождественными.
1.3. Стиль мелодии. Гаммы
Мелодия, сгенерированная приложением, должна иметь какой-то заданный стиль, иметь что-либо характерное для него. Первая и главная задача для нас – понять, чем будет определяться стиль мелодии. В музыке стиль определяется в первую очередь гаммой, т. е. набором интервалов. Далее идут характерный ритм, характерные аккордовые последовательности, приемы, музыкальные инструменты, особенности звукоизвлечения. Множество вещей может определять стиль музыки, но нам нужно извлечь только самое главное. Извлечь то, что нам под силу будет понять, проанализировать и впоследствии запрограммировать.
Теперь давайте примем соглашение относительно стиля нашей мелодии. Стиль мелодии будет определяться выбранной гаммой. Тогда давайте разберемся, что же такое гамма.
На рис.1. представлена струна гитары, разделенная на 13 частей. По-другому – это 13 ладов гитарного грифа. Гамма – это шаблон, который показывает нам, какие лады струны можно зажимать. Для нашего генератора этот шаблон будет говорить, какие ноты можно выдавать.

Рис.1. Минорная гамма
Таких шаблонов у нас должно быть несколько. Наш выбор: Минор, Мажор, Блюзовая гамма, Фламенко и еще одна немного измененная гамма Фламенко с названием Фламенко2.
Расстояние между соседними ладами – полутон. Это минимальный различимый интервал между нотами. Через 12 полутонов нота повторяется. Таким образом структура гаммы является цикличной. Это очень важное свойство, которое мы будем использовать в алгоритме генерации нот и в алгоритме отображения аппликатурной сетки.
Рассмотрим рис.1. Если нотой под цифрой 1 является нота Ля, то 3 – Си, 4 – До, 6 – Ре, 8 – Ми, 9 – Фа, 11 – Соль, 13 – Ля. Получается гамма Ля минор,
1 3 4 6 8 9 11 13
Нота под цифрой 1 – это тоника. Под цифрой 13 тоже тоника. Получается циклическая структура. Это шаблон для генерации нот от любой тоники.
Для гаммы Мажора:
1 3 5 6 8 10 12 13
Фламенко:
1 2 5 6 8 9 12 13
Фламенко2:
1 2 5 6 8 9 11 13
Блюз:
1 4 6 7 8 11 13
1.4. Темп
Вообще темп – это количество ударов метронома в единицу времени. Но для нас темп – это какая-то константа, которая характеризует скорость воспроизведения. И уже эта константа будет использоваться при вычислении других величин, например, продолжительности звучания мелодии. Чем выше темп, тем меньше продолжительность звучания мелодии. Получается обратная зависимость. Напишем формулу для вычисления продолжительности звучания по известному значению темпа и количества нот:
duration = tempo * notesCount
tempo ∈ [0.5; 6]
Такие значения отрезка получаются экспериментальным путем. Выбираем случайное количество нот, подбираем нужный коэффициент и проверяем, какой
темп получается на выходе. Если он кажется нам быстрым, значит это крайнее правое значение коэффициента, если темп кажется нам медленным (но не слишком медленным), то это крайнее левое значение коэффициента.
Но из-за особенности реализации в программе коэффициент должен принадлежать такому отрезку:
tempo ∈ [-5; -60]
Поэтому нам нужно его нормализовать. Отсюда получаем формулу:
duration = 

Глава 2. Разработка программы
2.1. Инструменты разработки
В ходе данной работы была использована платформа. NET Framework версии 4.0, язык программирования – C#, интегрированная среда разработки Visual Studio 2012, проект Windows Forms. Система контроля версий Git, удаленный репозиторий на сайте по адресу https:////Robertorob/GuitarMaster. Клиентская программа для работы с git – SmartGit версия 7.1. Широко используемые парадигмы: ООП, процедурное программирование.
Для создания приложения была выбрана платформа. NET Framework, так как она является очень удобной для написания приложения любой сложности, включая настольные приложения. Также она хорошо подходит для операционных систем семейства Windows. Имеется множество удобных встроенных средств контроля версий, конструкторов дизайна приложения. Также имеется удобная утилита IntelliSense для быстрого написания кода.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 |


