Generative & Interactive Jazz

Last modified: Jun 23, 2019 @ 11:44 am
(Note: this page is a work in progress and may change over time to feature new work)

Part of my work on the MUSICA project involves modeling jazz and musical communication through improvisation. There are two aspects to this: (1) creating generative algorithms for jazz and (2) modeling communication of motifs and other musical information between musicians in interactive settings. The first situation primarily concerns the computer being able to generate convincing music in real-time, but without interaction from a human. I have primarily used Haskell to explore that direction. In the second situation, modeling musical communication, I have used Python to explore the scenario of Trading Fours: where two musicians (one of them a computer in this case) exchange 4-measure solos. My workflow often involves creating the generative algorithms in Haskell and then porting them to Python for use in human-computer interactive scenarios.

Both my the Haskell and Python implementations I work with assume the following flow of information in a typical 3-part jazz group:

Generative jazz model

where a lead sheet segment is a short fragment of music with no contextual changes. A typical jazz lead sheet can be coarsely broken into segments at the boundaries of chord changes, but it may also be segmented more finely around metrical features.

For more information on this model, see the following preprint on ResearchGate:

A Functional Model of Jazz Improvisation
Donya Quick and Kelland Thomas
Accepted to the upcoming 2019 Workshop on Functional Art, Music, Modeling, and Design at ICFP.

Haskell Implementation:

The Haskell implementation is available as an installable library called Jazzkell.

GitHub: https://github.com/donya/Jazzkell
Hackage: http://hackage.haskell.org/package/Jazzkell

You can install the library from Hackage if you have Haskell Platform by using the “cabal install Jazzkell” command. The package depends on Euterpea, which will be installed automatically. To see how to use the framework, take a look at the various lhs files in the examples folder.

Python Implementation

While the Haskell implementation is purely focused on computer generated music, the Python implementation is intended for human-computer improvisation. The human and computer soloists can trade short melodies over a lead sheet while accompanied by multiple other computer musicians. We have looked at three styles with this framework: slow jazz with a walking bass, bossa nova, and bebop with a walking bass. The computer listens to the human’s solos, analyzes them, and attempt to incorporate features from it into its own response.

The following video shows the Python implementation in action with bossa nova:

The Python implementation is currently private to the MUSICA project and therefore is not yet publicly available.

The Algo-Jazz Series

As part of my work on generative jazz algorithms, I have produced (and am still producing) a series of compositions using my algorithms. This algorithmic jazz, or Algo-Jazz Series, has pieces with varying degrees of algorithmic content. You can hear the entire series and read details about each piece on my Algo-Jazz Series page. Hypnotize, a recent addition to the series, is an example of output from a single, contiguous run of some of my models. The code for producing Hypnotize is included in the examples folder of the Jazzkell library.


(Algorithmic visuals for Hypnotize were created with Processing)

Modeling Interaction in Other Styles

While my research on these models has been jazz-centric to date, I have also been exploring application of the same principles to other styles. HAILO, an interactive Python system build in collaboration with Mario Diaz de Leon in the spring of 2019, is inspired by the metrically free-from phrases of Gregorian chant and the works of Hildegard von Bingen. It uses the same high-level generative model as is presented in previously on this page, treating the parts as functions. However, it differs from my jazz-based implementations in its assumptions of context. Unlike the jazz model, HAILO does not assume a shared harmonic context – rather, harmonic context is inferred purely from the human musician and can be changed over time. It also attempts to match metrical patterns found in the user’s input, not just those in the pitch domain. User input can come from a standard MIDI controller or from other instruments using audio-to-MIDI conversion. HAILO’s implementation is still evolving, and it will gain more features over time.

In the following recording from May 2019, Mario is interacting with the system using electric guitar put through a monophonic audio-to-MIDI converter. The guitar signal is played back through a digital synthesizer similar to the one used for the computer’s responses.