Gilbert Lister Research : GoldenPond


GoldenPond is research into a music notation / programming language which adds higher level intentions or goals, rather than mere descriptions of notes. So you can say what the music is trying to do, rather than just what it does.

The aim is to help computer based composers and live-coders, including this author, to understand and apply more "advanced" music theory ideas by making them explicit in the language.

Examples from GoldenPond FL Studio Script.

Chords, arpeggiation and bass from GoldenPond. Drums and sometimes extra melodies have been added by human composition in FL Studio

GoldenPond was inspired by my frustration at realising that code offered so much expressivity for composing music, but that so much live-coding seemed stuck in replicating the behaviours of equipment designed for minimal loop-based music. We could describe a chord progression in a few keystrokes, but end up continually fiddling with a number representing the cutoff frequency of a low-pass filter. Text is a wonderfully expressive medium, but we're using it as the world's least ergonomically efficient knob!

Ultimately I'm guided by the question: "could a music programming language be expressive enough that it would be possible to live-code music of the complexity of a Mahler Symphony, on the fly?" What abstractions would such a language need? And would such a practice be viable, either technically or artistically?


Basic chord progressions are represented as a list of numbers for the degree of the scale.

Eg 1,4,6,5 is a classic 1-4-6-5 four chord loop.

It's important to note we always interpret this in the context where the key is set. We tell GoldenPond if we're in C-Major or A-flat Minor etc. And the chords are calculated based on that key signature.

Extended chords can be created by adding the digits 7 or 9 to the front. So 74 is the seventh built on the 4th degree. 92 is the ninth built on the 2nd degree.

Chord Inversions are added with a number of i suffixes. Eg. 6ii is the second inversion of the 6 chord. The extension and inversion notation is composable. 73i is the first inversion of the 7th built on the 3rd degree.

Modal Interchange ie. borrowing from the parallel major / minor is done with the -. So if we are in C-major, then -4 means the 4 chord from C-minor. If we were in D minor, then -4 would be the 4 chord from D-major

Again modal interchange is composable. In C-major -93iii is the third inversion of the ninth built on the 3rd degree of C-minor.

Secondary Chords We can temporarily "tonicize" ie. treat as tonic, one of the other degrees of our scale. And then borrow a chord from that key. (5/3) is the secondary dominant, ie the 5 chord of the key where our current 3 chord is the tonic or 1 chord. This is typically used because the dominant of any key is a great chord to lead to the tonic of that key. So (5/3),3 is a really strong way to get to the 3 chord. But we can also try more exotic combinations. (2/4),4 will give us the 2 chord of the key where our current 4 chord is the tonic.

Again, secondary chord notation composes with everything else : -7(6/3)i is the seventh chord on the 6th degree of the scale where our 3 is tonic, but with the opposite mode and in the first inversion. See how we can get some quite complex chords, expressed in a very concise (but not too obscure) way.

Transposition uses a special notation in place of a chord. We use >n and <n to tell the chord sequence to transpose up or down n semi-tones from here on out.

For example if we interpret the progression 1,4,3,>1,6,4,5 in C-major, we'll play the 1, 4 and 3 chords, then set the default key to 1 semitone higher, ie. C#-major, and play the following 6,4,5 sequence in that key.

Note if you are looping, it's most like that the chord sequence is generated once, and looped by the hosting environment. So when you return to the beginning of the loop you will be back in C-major again. There is (currently) no looping notation within GoldenPond.

Voice Leading is still an experiment at the moment, and not guaranteed to sound particularly nice :-)

By default GoldenPond generates the chords it has been told to in a straightforward manner. Chords start as normal triads, and then extensions and inversions etc follow simple rules. One result of that is that you can create large blocky jumps when moving from one chord to another. I quite like this effect, but not everyone does. Many people find it smoother to rearrange chords so that when moving from one to the next, each "voice" (or line within the chord) makes the smallest move possible.

This is called "voice leading" and can create a very different feel in the music.

We tell GoldenPond when we want voice-leading using an alternative separator. Until now, you've seen chord progressions that use commas as the separator between each chord. This is so obvious that you probably haven't thought much about it. But a comma is a particular kind of separator which means "chord a, then chord b"

But we can have other kinds of separators which convey more information. For voice-leading we've created the & separator. So 1&4 tells GoldenPond, we want chord 1, and then chord 4, but apply voice-leading to chord 4. In other words rearrange the notes of the 4 chord to minimize the movement as we come from chord 1. This may mean bringing some notes down an octave so that there's a smaller jump.

As mentioned, this is still experimental and the rules are pretty complicated. So how good it sounds and how useful it is depends a lot on the situation. It can lead, for example, to clashes between notes a semitone or tone apart. Which might be what you want, or might not.

Get the Code