LISP primitives in structuring : division – rotation – inversion – appending phrases together : using the function repeat to intensify structure : repeat devices in Statements for piano : palindrome and interpolation as structural mechanisms : Studies in Movement for violoncello – customising the gen-palindrome function : introducing pitch-interpolation : Continuum and Blues after Ligeti : pattern-matching from Symbolic Composer to create rhythmic structures : a pitch interpolation example from Opusmodus.
In the section ‘Being non-linear’ we saw how composers of the 20th century began to change the way music was structured, away from traditional forms towards a rich juxtaposition of episodic and motivic material, leading eventually into collage, open-form and non-linear structuring. Achieving this kind of organisation of material comes into its own in computer-assisted composition.
Before taking this kind of free-form structuring further into areas like live-coding, a programming practice centered upon the use of improvised interactive programming, we’ll examine some of the basic tenets of structuring musical statements in code.
It happens that most CAC systems, whether based on visual-programming or script-based coding, have tended towards using the LISP language. IRCAM’s OpenMusic and PWGL, Tonality Systems Symbolic Composer and the CAC system adopted for this e-book, Opusmodus, are all based on Common Lisp. For the composer new to CAC systems LISP is a very practical and highly efficient language for working with the parameters of music. Even in visual programming environments it’s useful to know just a few of the LISP primitives as many of these primitives are directly concerned with structuring or preparing material to be structured.
To demonstrate the role of primitives, here’s a pitch stream generated by a white-noise algorithm:
If a composer has used a non-musical source to generate a stream it’s common-practice to explore its potential through partitioning. And to find good partitioned material, rotating the stream can be effective, like this:
Our row is now divided into three groups of four pitches and that division is shown in the code by parentheses grouping the pitches in what are termed lists. In fact we’ve gone from a flat list – row, to three sublists – row-1. Because these sublists are separate entities we can process them separately, like this:
With a further rotation we could bring row-1 and row-2 together using the primitive append: It is these very basic manoeuvres that, though common-place when working on small pitch groups with pencil and paper, can assume powerful procedures if translated to larger collections of material. We’ll see in a later section that Opusmodus in particular is rich in functions able to assemble material.
Of all the processes resulting in structural change that a CAC system offers, it is the repeat that can have the most affect on a musical passage over time. Repetition, be it the parameter of pitch or rhythm, like ornamentation, intensifies, and, as composers as diverse as Beethoven (Pastoral Symphony) and Stockhausen (Spiral) have shows us, repetition can also be cadential.
In my Statements for solo piano the role of the repeat is to intensify. This piece is about 4-voice chordal ‘statements’ made out of a stream of chords created from integer generation. This a similar to the little Chorale for piano trio presented at the end of the section ‘Starting with Pitch’. Here’s the code for the generation of the right-hand dyads and the result as notation:
Now to look at the pitch content of the piano right hand, as a stream of dyads. First, the stream without repetition, Second, with elements of repetition created algorithmically to intensify the passage:
It is this kind of intervention of repetition within a pitch stream that can produced effective structural change. It’s just one of the repetition devices found in Stravinsky’s Symphonies of Wind Instruments, a veritable goldmine of ideas about handling repetitions and the structural position of material. Now, here’s the whole passage from Statements, the third ‘statement’ of the composition:
Alongside repeat and rotation there are other primary transformations found in some of the earliest texts on music composition, for example inversion, retrograde and palindrome. All three have taken on a new lease of life within computer manipulation. They’ve been joined by interpolation, interleaving, and brassage-style fragmentation and reordering, all three having a parallel existence in the digital audio tool-kit.
To complete this section we’ll look at two of these transformation tools able to produce effective structural forms in pitch and rhythm composition: palindrome and interpolation.
Palindrome is a mirror-like device that repeats and reverses a pitch collection, making the last pitch of the original the first pitch of the reversed copy. Palindrome as a device has a chequered history in music as its affect seems rarely as powerful as the logic of its concept. It’s only when the palindrome is, in some way or other, inexact or distorted that it seems to assume a more agreeable and convincing form. In the example below one of the patterns from Slonimsky’s Thesaurus is taken as the source of a series of palindrome generations. The mirror portion of the generation is set here to change randomly in size upon each generation.
This version of the gen-palindrome evolved out of a function made for Continuum, a movement from Studies in Movement for solo cello. The conceptual idea of the piece was to explore the palindrome as a legato gesture within a single bow alternating with phrases of staccato-like articulation. Putting the overall length of each palindromic phrase into the speculative hands of a computer function gave a playful and surprising aspect to the moto perpetuo ‘continuum’ of the music.
Let’s see how this function was extended to make this possible:
- Remember to work backwards from the end of the expression
- The variable pat is the source phrase such as (c3 bb2 b2 fs3 e3 f3))
- (gen-retrograde pat) reverses pat : (f3 e3 fs3 b2 bb2 c3)
- (gen-trim (rnd-range 1 (length (butlast pat))) this trims the length of the reversed pat to a random length between 1 and the length of the pat list
- (append joins all but the last (but last) pitch of pat to the reversed (and trimmed) list of pat.
If you can follow all that you’re learning how to think in LISP! Now for a working example:
In the movement Continuum, each palindrome phrase is also part of a pitch-interpolation – from one Slonismky pattern to another. For example, from Sl-85 to 93.
Pitch and Rhythm interpolations are particular features of another composition, and one sharing a similar title: Continuum with Blues for electric guitar with Active Notation System. This piece is also homage to the Hungarian composer Gyorgy Ligeti, a composer already featured in the section ‘On not being obvious’ with his Sonata for solo viola. Continuum was the title Ligeti gave to his highly original work for harpsichord.
Continuum with Blues is a good example of how computer-aided composing can be combined with pencil and paper composing. It has a central movement, a Blues, which was freely composed at the guitar itself. The music that surrounds this blues are computer-aided sections: Continuum A and B, and Continuum B2 and A2. So it is essentially a palindrome structure with the palindrome incorporating an interpolation (B2, B2 > A2, and A2). The palindrome also contains pre-recorded guitar sounds triggered from the music’s Active Notation.
Interpolation with pitch is first encountered between the pitches found on pairs of the guitar’s strings, opening with the low E and A (strings 6 and 5). It is combined with rhythms created from pattern-matching of pitch intervals across different octave ranges. Listen to section A, here:
Pattern matching is explained here and shown in the code below. It has some similarities with the program structure of def-case. Note-lengths of different values are triggered by a list of pitches. Micro patterns of pairs of pitches are sought across a chromatic octave pitch-space, in the first ‘match’ the space is set across 3 octaves (-12 to 24). Whenever adjacent and identical pitches match up across this pitch-space, a 1/8 note length is triggered. The same technique is used to create chords and and set a fortissimo (velocity at 127).
The pattern-matching and interpolation examples featured above are those used by the Symbolic Composer software. In the Opusmodus system the interpolation function works somewhat differently. Here is the function with its source and the target lists:
Interpolation can also be used very tellingly between chords. The output from this function formed the basis of my large-scale composition for voice and orchestra Sounding the Deep.
Here are some expressions taken from the score-script written in the Symbolic Composer music language. The function distort-tonality is used to distort the sequence of chords with a modulated sine-wave.
Above is the visualisation on Symbolic Composer of the inter-deep-11d expression with the function distort-tonality acting on the eleven chords of the interpolation of the part 2 chords (Ascent). Below the notation of the first six chords in the eleven stage interpolation:
In Part 2 there will be an emphasis on looking in detail at specific compositions from the Author’s web archive: Selah for violin and piano; 2nd and 3rd movements from La Serenissima for solo violin and string orchestra; A Selection of Sextets for alto flute, bass clarinet, violin, cello, piano and percussion; Two piano trios including After Hindemith ; String Quintet (2013); Quintet for piano and winds; Origami Letters for tenor voice and string quartet; Study of the Object for voices; Self Portrait for variable ensemble.
Part 2 will end with a section on working out strategies for realisation composition projects and an appendix of terminology and a comprehensive index.