Краткий обзор того, как Геном отображает концепции от генетики до музыкальной композиции и звукового дизайна.

В этой статье я расскажу, как устроена модель данных для Genome Music Sequencer. Я думаю, что это будет относительно быстрое объяснение, которое заложит основу для более глубокого изучения стратегии мутации между двумя последовательностями (в следующей статье).

Прежде чем мы углубимся в это, обратите внимание: этот проект вдохновлен только генетикой и эволюцией. Он не обязательно должен быть биологически точным. Для получения дополнительной информации об оригинальной концепции инструмента см. мою вступительную статью здесь.

Модель

Естественно, модель данных Genome является иерархической. Вид сверху вниз выглядит примерно так:

                          Genome
                            ||
                       |----  ----|             
                 GeneSequence GeneSequence
                       |          |
             |----|----|          |----|----|
           Gene Gene Gene       Gene Gene Gene
           |    |    |          |    |    |
 |----|----|   ...  ...        ...  ...   |----|----|
Nuc  ...  Nuc                            Nuc  ...  Nuc 

Нуклеотиды
Мы начнем с рассмотрения наиболее атомарных структур в модели данных, нуклеотидов, каждый из которых представляет один звуковой параметр, способный к мутации. Высота тона, амплитуда, форма волны, атака и затухание — все это примеры таких параметров. Общее их количество пока не установлено.

Одним из важных аспектов каждого из параметров является то, что они внутренне представлены в виде дискретных значений. В то время как амплитуда в обычной программе может рассматриваться как непрерывное значение от нуля до единицы, в этом проекте такие диапазоны на самом деле дискретизированы.

В типичной аудиопрограмме значение амплитуды может быть реальным значением на интервале [0, 1]. В нуклеотиде интервал преобразуется в определенное количество дискретных значений. Если бы это количество равнялось пяти, то возможные значения были бы [0, 0,25, 0,5, 0,75, 1,0]. Таким образом, это целочисленный индекс, указывающий на значение, которое можно изменить. Это делает процесс мутации намного проще, потому что вместо случайной мутации до любого значения от нуля до единицы нам нужно только мутировать целыми количествами.

Гены
Каждый ген представляет собой отдельную музыкальную ноту, звуковые параметры которой определяются ее нуклеотидами. На скетче ниже десять генов. Второй редактирует свой питч Nucleotide.

Гены — это довольно простые объекты, чье «состояние» может быть изменено на одно из четырех возможных значений: Off, On, Null и Offset. Я предоставлю больше контекста для этих состояний в более поздней статье, подробно описывающей стратегию мутации.

Gene Sequences
Серия Genes неожиданно создает GeneSequence и представляет собой несколько музыкальных нот, воспроизводимых одна за другой. Единственная возможная мутация в последовательности гена — это длина последовательности. Это возможно, когда два генома имеют разный размер.

Геном
Геном представляет собой набор последовательностей генов, и его можно рассматривать как завершенную музыкальную «композицию». Весь геном легко представить в виде сетки квадратов, где каждая строка представляет собой последовательность нот. Когда геном «проигрывается», каждый столбец нот воспроизводится на каждом такте или такте. Этот вид сетки типичен для большинства программ для создания музыки, таких как Ableton Live или Logic.

Несколько уникальной особенностью генома является то, что пробелы могут быть вставлены до начала последовательности. Я добавил эту функцию, чтобы сделать последовательности более сложными. В сочетании с функцией «сокращать и расширять», где общее количество шагов может быть увеличено или уменьшено, заставляя последовательности зацикливаться или обрезаться там, где это необходимо, должно добавить инструменту большую выразительность. Это сделает возможным создание полиритмических последовательностей и нетипичных тактовых размеров. Это немного увеличивает сложность кода, но, на мой взгляд, оно того стоит.

Общая тема: mutate(omega):delta

Все обсуждаемые здесь модели имеют одну общую черту — функцию под названием mutate. Эта функция принимает единственный аргумент omega, целевой объект того же типа, и возвращает числовое значение delta, расстояние от себя до цели. Когда эта функция вызывается для генома, она затем вызывает одну и ту же функцию для каждой из своих последовательностей генов, которые вызывают ее для всех своих генов, а гены вызывают ее для каждого из своих нуклеотидов. На каждом уровне вычисляется и возвращается значение дельты. В конце концов, после многих поколений, иногда до миллиона в зависимости от различных параметров, дельта равна 0, и Геном полностью эволюционировал!

Можно еще многое обсудить в отношении того, как происходят мутации. Как упоминалось ранее, мы углубимся в эту тему в следующей статье!