Doctoral Thesis at Yale University
Kulitta is a Haskell-based, modular framework for automated composition and machine learning. A central idea to Kulitta’s approach is the notion of abstraction: the idea that something can be described at many different levels of detail. Music has many levels of abstraction, ranging from the sound we hear to a paper score and large-scale structural patterns. Music is also very multidimensional and prone to tractability problems. Kulitta works at many of levels of abstraction in stages as a way to mitigate these inherent complexity problems.
Abstract musical structure is generated by using a new category of grammars called probabilistic temporal graph grammars(PTGGs), which are a type of parameterized, context-free grammar that includes variable instantiation, a feature usually only found in grammars for programming languages. This abstract structure can be turned into full music through the use of constraint satisfaction algorithms and equivalence relations based on music theoretic concepts. An extension to an existing algorithm for learning PCFGs provides a way to learn production probabilities for these grammars using corpora of existing music. Kulitta’s modules for these features are able to be combined in different ways to support multiple styles of music.
Kulitta’s important contributions include (1) algorithms and a generalized Haskell implementation to support PTGGs, (2) additional formalization of existing musical equivalence relations along with a new equivalence relation for modeling jazz harmony, (3) an empirical evaluation strategy for measuring the performance of automated composition algorithms, and (4) the extension of a machine-learning algorithm for PCFGs to support a much broader category of grammars (inclusive of PTGGs) via the use of an oracle. Kulitta’s musical performance is also promising, demonstrating both stylistic versatility and aesthetically pleasing results.
Most Recent Version of Kulitta – a page describing Kulitta with example compositions and the most recent implementation.
Kulitta 1.1 – This version of the code is nearly as it appears in the dissertation, with minor corrections to library imports to make it compatible with Euterpea 1.0 (the first version released on Hackage). Some libraries that Kulitta depends on have changed since then, requiring updates to Kulitta. For the most recent version of Kulitta’s code, please see the page linked to below.
Kulitta 1.0 – code exactly as it appears in the dissertation. This will not compile with more recent versions of Euterpea and predates the first Hackage release of Euterpea.