Complex Systems Projects
RTcmix Computer Music with L-Systems (AKA "Musical Plants")
As a final project for my "Music Programming Projects" class, taken as part of my CCM Minor in Music, I created a program that generates music using L-Systems. Within the discipline of music, and analyzing its structure, I observed a great many similarities between the structure of music and the structure of L-Systems, in how they both contain self similar patterns and recursive structures. I decided to explore this connection further by creating a program that generates music using L-Systems (Lindenmayer Systems).
The program was written in WinForms using C#. The program generated a variety of L-Systems based off of an assortment of input parameters. It generated a visual representation of the L-System, and then converted the L-System into music. The program utilized the self similar nature of L-systems to then map each "cluster" of branch endings to a randomly generated musical motif, which was then transformed in various ways, to reflect this inherent self similarity. Transformation could be done by inverting the motif, playing it in its retrograde form, replacing one of the notes, swapping positions of notes, and several others. This output could then be loaded into RTcmix.
It's a very simple program, that generates very simple music. I created it as a proof of concept, to show that it is possible to generate music using L-Systems. I hope to rework the project in the future, to create a more complex and sophisticated program that generates more complex and interesting music, with dynamic harmony and motifs that follow it.
Musical Rhythms with Cellular Automata and Genetic Programming
As a final project for my "Complex Systems & Networks" class, taken as part of my MSIT, we created a program that generates music using Cellular Automata and Genetic Programming.
We used a 1-dimensional cellular automata (CA) as the base of our rhythm generator. All rhythm generation is emergent from the state of the 1-dimensional CA at each time step. We chose celluar automata as the base of our rhythm generator because of its simplicity, while still remaining a complex system. At every time step, a cell updates its state by referencing the rule relevant to its current neighborhood. The local interactions found here can lead to impressive dynamics and patterns, which we exploited in our rhythm generation.
Identifying a specific fitness function was the most difficult part, since music is subjective, but fitness should be qualtitatie, ideally. But, we ultimately we decided on using a detrended fluctuation analysis (DFA), which asserts self-similarity in time series data. Evolutionary programming using two different ontogenties (direct and external) was used to generate and evolve the ruleset for the CA, then we trained for a variety of voices (cells) to assess the robustness of each method.
The direct encoding method (our first ontogeny) is done by starting with a randomly seeded ruleset, and directly mutating/crossing-over the candidate CA rulesets. The external ontogeny on the other hand, starts with a set of randomly seeded "rule-pieces", which are then randomly placed within the rule-space, and create emergent rulesets as a result of those overlaps and interactions. The placements of those rule pieces are what is evolved through each epoch, rather than the resultant rules. These disparate methods of mapping genotype to phenotype were used to assess unique areas of the system-space.
The performance of both ontogenies showed as much more fit than simply random noise, with the external ontogeny converging the quickest, although, not by a significant amount. In order to judge the qualitative elements of the music, such as the ability to generate interesting and structured rhythms, the examples can be found below.