22 Etudes, Op. 8: An Algorithmic Model of György Ligeti's Désordre
In this Etude we look at a pattern-based description of György Ligeti's first Piano Etude, Désordre. The program examples and most of the commentary were written by Tobias Kunze at CCRMA, Stanford University. Désordre has been analyzed in great depth by Kinzler in György Ligeti: decision and automatism in `Désordre', 1er Étude, Premier Livre (Kinzler) (Interface, Swets & Zeitlinger, 1991) and Jane Piper Clendinning's The Pattern Meccanico Compositions of György Ligeti (Clendinning) (Perspectives of New Music) discusses Ligeti's use of patterns in a number of different compositions.
The intent of this Etude is to consider Ligeti's composition from the perspective of algorithmic control — to arrive at some idea of what specific “algorithmic knobs” could be implemented that might offer a possible analog to the composer's actual decisions. We first present a general analysis of the Etude's essential features, and then model the composition in software using process descriptions. The model makes an honest attempt to be realistic but trades off accuracy against flexibility. After all, there is no point in implementing an algorithm that cannot be manipulated or adjusted so that it can explore different paths through a composition's theoretical parameter space.
A note regarding references to the score: since the left and right hands are essentially independent, each point of interest in the score will be indicated by page, system and measure numbers. Page numbers are prefixed by p, systems by s and measures by m. For example “p3s2m1” stands for page 3, system 2. measure 1. Where necessary, an indication of the part will also be provided. In systems starting with a partial measure, the first complete measure is counted as measure 1. All numbers follow the facsimile edition of Études pour piano: premier livre. published by B. Schott's Söhne, Mainz, 1985.
Structure
The textural make-up of the Etude is rather straightforward. Each hand is assigned its own part and both parts share a common, layered substructure and a continuously pulsating eighth-note motion. Each hand is restricted to a particular set of notes: the right hand plays only the white keys and the left hand plays only black keys. In addition to establishing the essential dramatic opposition in the piece, the partitioning also allows the relatively difficult parts to occupy the same register at certain points in the composition. In keeping with the harmonic partitioning, each part follows its own internal logic and is essentially independent from the other “horizontally” as well. That is, both hands are largely unsynchronized on the metrical level although stretches with semi-synchronized phrase structures do exist. This metrical independence is central to the composition of Désordre and most of the form-defining features of the work stem from this basic independence.
The internal structure of each part is a combination of constantly rising eighth notes in the background and a rhythmically pronounced, slower foreground, all within the constant running motion of the eighth notes. The foreground layer is played forte throughout the piece and heavily accented. The foreground layer in both hands features a phrase structure that is reminiscent of traditional A-A'-B forms, where two closely related shorter phrases are followed by a longer developmental third phrase. In spite of the distortion by the asymmetrical meter employed in each part, the phrasing hints at an underlying simple and song-like two-beat meter. The similarly asymmetric “meter” that is induced in the backgrounds by eighth-note groups of differing lengths is relatively negligible compared to the prominent metric structure in the foreground layers.
On a formal level, the piece is structured by both the temporal behavior and pitch behavior of its two parts. A first section, 404 eighth notes long, (from the beginning of the piece to p3s4m4) is quite static in tempo except for the slight accelerando towards the end. The next section, which extends until p4s4m7 (231 eighth notes in duration) accelerates the foreground parts until they are reduced to eighth notes, at which point a typical “ligetiesque” cut interrupts the lower part (which had by then hit the bottom of the piano range) and resumes in the descant as well as in the original foreground tempo. This third section (429 measures) extends to the end and is characterized by a static tempo in the upper part and a slowing down of the lower part.
The Patterns
The foreground in both the upper and lower parts will consist of cyclic repetitions of a constant, stepwise pattern. Within each cycle the pattern is transposed diatonically by a constant amount. The pattern for the upper part consists of 26 steps, 7 for each of the A phrases and 12 for phrase B:
Table 22-1. Step Pattern for white keys.
| Phrase A | 0 0 1 0 2 1 -1 |
|---|---|
| Phrase A' | -1 -1 2 1 3 2 -2 |
| Phrase B | 2 2 4 3 5 4 -1 0 3 2 6 5 |
The pattern for the lower part has 33 steps, again 7 for each of the A phrases and 19 in the extended phrase B:
Table 22-2. Step Pattern for black keys
| Phrase A | 0 0 1 0 2 2 0 |
|---|---|
| Phrase A' | 1 1 2 1 -2 -2 -1 |
| Phrase B | 1 1 2 2 0 -1 -4 -3 0 -1 3 2 1 -1 0 -3 -2 -3 -5 |
There are a total of 14 cycles in the upper part, each of which is transposed diatonically one step upwards. Due to its greater length, there only 11 cycles in the lower part. The smaller number of cycles — which translates into fewer transpositions — is more than compensated for by (1) a two-step diatonic transposition downwards and (2) the lower part's pentatonic mode having fewer steps per octave than the heptatonic mode of the upper part. The cycles align with the score as shown in Table 22-2
Table 22-3. Cycles and transpositions for both parts.
| Lower Part | Upper Part | |||||
|---|---|---|---|---|---|---|
| # | Transp. | Score | # | Transp. | Score | |
| Section I | ||||||
| 1: | ds3 | p2s1m0 | | 1: | b4 | p2s1m0 |
| 2: | as2 | p2s3m5 | | 2: | c5 | p2s2m7 |
| 3: | fs2 | p3s2m2 | | 3: | d5 | p2s4m7 |
| | | 4: | e5 | p3s2m6 | ||
| Section II | ||||||
| 4: | cs2 | p3s4m4 | | 5: | f5 | p3s4m4 |
| 5: | gs1 | p4s1m3 | | 6: | g5 | p3s4m11 |
| 6: | ds1 | p4s2m3 | | 7: | a5 | p4s1m7 |
| 7: | as0 | p4s3m2 | | 8: | b5 | p4s2m5 |
| 8: | fs0 | p4s4m11 | | 9: | c6 | p4s3m3 |
| | | 10: | d6 | p4s3m10 | ||
| Section III | ||||||
| | (p4s4m7) | | 11: | e6 | p4s4m7 | |
| 9: | cs5 | p5s1m2 | | 12: | f6 | p5s2m4 |
| 10: | gs4 | p5s3m7 | | 13: | g6 | p5s4m4 |
| 11: | ds4 | p6s2m42 | | 14: | a6 | p6s2m4 3 |
- Cycle 8 in the lower part reaches the bottom of the piano range and discontinues after m. 4 in phrase B only to resume immediately in the treble clef (p4s4m7). The first note of this continuation should read fs but for obvious reasons is given as fs5 to the right hand.
- Cycle is cut off after m. 3 in Phrase B.
- Cycle is cut off after m. 2 in Phrase A'.
The rhythmic picture is less clear due to rasterization effects in the acceleration and deceleration of the patterns. The sequence of rhythms in the upper and lower parts read as follows:
Table 22-4. Upper part, foreground rhythms.
| Sect. I: Little Disorder (404 eighths) | |
|---|---|
| 3 5 3 5 5 3 7 3 5 3 5 5 3 7 3 5 3 5 5 3 3 4 5 3 3 5 | cycle 1 |
| 3 5 3 4 5 3 8 3 5 3 4 5 3 8 3 5 3 4 5 3 3 5 5 3 3 4 | cycle 2 |
| 3 5 3 5 5 3 7 3 5 3 5 5 3 7 3 5 3 5 5 3 3 4 5 3 3 5 | cycle 3 |
| 3 5 3 4 5 2 7 2 4 2 4 4 2 5 2 3 2 3 3 1 1 3 3 1 1 3 | cycle 4 (accel.) |
| Sect. II: Rapid accelerando (231 eighths) | |
| 1 2 1 2 2 1 3 1 2 1 2 2 1 3 1 2 1 2 2 1 1 2 2 1 1 2 | cycle 5 |
| 1 2 1 2 2 1 3 1 2 1 2 2 1 3 1 2 1 2 2 1 1 2 2 1 1 2 | cycle 6 |
| 1 2 1 2 2 1 3 1 2 1 2 2 1 2 1 2 1 2 2 1 1 2 2 1 1 2 | cycle 7 |
| 1 2 1 2 2 1 2 1 2 1 2 2 1 2 1 2 1 2 2 1 1 2 2 1 1 2 | cycle 8 |
| 1 2 1 2 2 1 2 1 2 1 2 1 1 2 1 2 1 2 2 1 1 1 2 1 1 1 | cycle 9 |
| 1 2 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 | cycle 10 |
| Sect. III: Static (429 eighths) | |
| 3 5 3 5 5 3 8 3 5 3 5 5 3 8 3 5 3 5 5 3 3 5 5 3 3 5 | cycle 11 |
| 3 5 3 5 5 3 8 3 5 3 5 5 3 8 3 5 3 5 5 3 3 5 5 3 3 5 | cycle 12 (same) |
| 3 5 3 5 5 3 8 3 5 3 5 5 3 8 3 5 3 5 5 3 3 5 5 3 3 5 | cycle 13 (same) |
| 3 5 3 5 5 3 8 3 5 3 5 5 3 8 3 5 3 5 5 8 | cycle 14 (cuts off here) |
Table 22-5. Lower part, foreground rhythms.
| Sect. I: Static (404 eighths) | |
|---|---|
| 3 5 3 5 5 3 8 3 5 3 5 5 3 8 3 5 3 5 5 3 3 5 5 3 3 5 3 5 3 5 5 3 8 | cycle 1 |
| 3 5 3 5 5 3 8 3 5 3 5 5 3 8 3 5 3 5 5 3 3 5 5 3 3 5 3 5 3 5 5 3 8 | cycle 2 |
| 3 5 3 5 5 3 8 3 5 3 5 5 2 7 3 4 3 4 4 2 2 4 4 2 2 3 2 3 1 3 3 1 4 | cycle 3 (accel.) |
| Sect. II: Rapid Accelerando (231 eighths) | |
| 1 3 1 2 2 1 3 1 2 1 2 2 1 3 1 2 1 2 2 1 1 2 2 1 1 2 1 2 1 2 2 1 3 | cycle 4 |
| 1 3 1 2 2 1 3 1 2 1 2 2 1 3 1 2 1 2 2 1 1 2 2 1 1 2 1 2 1 2 2 1 2 | cycle 5 |
| 1 2 1 2 2 1 2 1 2 1 2 2 1 2 1 2 1 2 2 1 1 2 2 1 1 2 1 2 1 2 2 1 2 | cycle 6 |
| 1 2 1 2 2 1 2 1 2 1 2 2 1 2 1 2 1 2 2 1 1 2 1 1 1 2 1 1 1 1 1 1 2 | cycle 7 |
| 1 1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 | cycle 8 |
| Sect. III: Allargando (429 eighths) | |
| 5 3 3 5 3 5 3 5 5 3 8 | |
| 3 5 3 5 5 3 8 3 5 3 5 5 3 8 3 5 3 5 5 3 3 5 6 3 3 5 3 5 3 6 5 3 8 | cycle 9 |
| 3 6 3 5 5 3 9 3 5 3 5 6 3 8 3 5 3 6 5 3 3 5 6 3 3 5 3 5 3 6 5 3 9 | cycle 10 |
| 3 7 3 8 9 3 13 3 11 3 21 | cycle 11 |
The Model
The brief analysis presented in the previous section will allow us to translate the combined foreground structure of Désordre into pattern descriptions. We begin by defining an 8th note pulse for the piece according to the specification in the score. A helper function eighth-time will allow us to convert from duration values expressed as number of 8th notes into time in seconds:
Example 22-1. Global tempo and amplitude.
(define eighth-pulse (rhythm 'e 76.0 'w))
(define (eighth-time number-of-eighths)
;; Convert duration in eighth notes
;; to time in seconds
(* eighth-pulse number-of-eighths))
(define fg-amp .7) ; foreground amp
(define bg-amp .5) ; background amp
The global variable eighth-pulse holds the duration in seconds of an 8th note pulse at tempo 76 with a whole note beat. This value works out to 15/152, or approximately 0.098 seconds per 8th note. The function eighth-time translates a specified number-of-eighths into time in seconds by multiplying that number by the speed of one eighth note. The variables fg-amp and bg-amp define global amplitude levels for the foreground and background processes, respectively. These can be adjusted as needed to increase or decrease the amplitude level of the foreground relative to the background.
Upper Foreground Materials
As suggested by our analysis in the preceding section, the algorithms to implement the upper and lower parts to Désordre will be driven by four sets of data: the part's mode, its step pattern, its transposition pattern, and its rhythmic pattern.
Upper Foreground Melody
We examine the melodic materials first. Example 22-2 contains the definitions of the white key mode and the step pattern for the upper part. A step is an interval that describes relative melodic motion between notes, i.e. the intervallic distances between successive notes in a sequence.
Example 22-2. Upper foreground mode and step patterns.
(define white-mode
(new mode :steps '(c d e f g a b c)))
(define white-fg-steps
'(0 0 1 0 2 1 -1 ; Phrase a
-1 -1 2 1 3 2 -2 ; Phrase a'
2 2 4 3 5 4 -1 0 3 2 6 5)) ; Phrase b
(define (make-white-fg-notes note)
;; convert note in MIDI scale to modal equivalent
(let ((step (keynum note :to white-mode)))
;; pattern of steps is offset
;; from a constantly rising offset
(new transposer
:of (new cycle :of white-fg-steps)
:by (new range :initially step :by 1))))
The white-mode global variable is set to a mode object that implements the white key mode for the upper part. Each octave has only eight tones, and adjacent key numbers in the mode will be either one or two semi-tones apart in the chromatic scale. The white-fg-steps variable contains the sequence of step motion that describes the upper part. Each step in white-fg-steps describes the relative distance from the previous step. For example, if the initial position for the step pattern were c4 then the steps (0 0 1 0 2) would produce the notes (c4 c4 cs cs ds) in the chromatic scale but (c4 c4 d4 d4 e4) in white-mode.
The make-white-fg-note function returns a pattern that implements the melodic foreground of the upper part. The starting point for the melody is the note specified to the function which is converted to its key number equivalent in white-mode. The transposer pattern transposes a cycle pattern of foreground steps (intervals) onto the diatonic degrees of the white mode.
Upper Foreground Rhythmic Pattern
For reasons of clarity the rhythmic pattern for the upper part is presented here in its entirety even though is is fairly long. It would certainly be possible to define this pattern in terms of repeated subpatterns.
Example 22-3. The upper foreground rhythmic pattern.
(define (make-white-fg-rhythms)
(new cycle
:of `(3 5 3 5 5 3 7 ; cycle 1
3 5 3 5 5 3 7
3 5 3 5 5 3 3 4 5 3 3 5
3 5 3 4 5 3 8 ; cycle 2
3 5 3 4 5 3 8
3 5 3 4 5 3 3 5 5 3 3 4
3 5 3 5 5 3 7 ; cycle 3
3 5 3 5 5 3 7
3 5 3 5 5 3 3 4 5 3 3 5
3 5 3 4 5 2 7 ; cycle 4
2 4 2 4 4 2 5
2 3 2 3 3 1 1 3 3 1 1 3
1 2 1 2 2 1 3 ; cycle 5
1 2 1 2 2 1 3
1 2 1 2 2 1 1 2 2 1 1 2
1 2 1 2 2 1 3 ; cycle 6
1 2 1 2 2 1 3
1 2 1 2 2 1 1 2 2 1 1 2
1 2 1 2 2 1 3 ; cycle 7
1 2 1 2 2 1 2
1 2 1 2 2 1 1 2 2 1 1 2
1 2 1 2 2 1 2 ; cycle 8
1 2 1 2 2 1 2
1 2 1 2 2 1 1 2 2 1 1 2
1 2 1 2 2 1 2 ; cycle 9
1 2 1 2 1 1 2
1 2 1 2 2 1 1 1 2 1 1 1
1 2 1 1 1 1 2 ; cycle 10
1 1 1 1 1 1 2
1 1 1 1 1 1 1 1 1 1 1 1
,(new cycle
:of
(new cycle
:of
'(3 5 3 5 5 3 8 ; cycle 11-14
3 5 3 5 5 3 8
3 5 3 5 5 3 3 5 5 3 3 5))
:for 3)
3 5 3 5 5 3 8 ; cycle 14
3 5 3 5 5 3 8
3 5 3 5 5 3))) ; cuts off here
Lower Foreground Materials
The algorithm for the lower foreground part is driven by the same types of data. However, since it is eventually shifted into the treble clef after it hits the bottom of the keyboard (p4s4m7), its transposition pattern adds a “warp” that transposes the whole pattern up five octaves, or 20 black mode steps (see the warp-point variable in Example 22-4).
Lower Foreground Melody
Our lower foreground melody is defined in a manner analogous to the upper foreground, except of course that the pattern and mode are quite different. The implementation is made slightly more complex because the lower pattern “warps”, or shifts, when it reaches the bottom of the keyboard by jumping back up to the middle register of the keyboard.
Example 22-4. Lower foreground mode and step patterns.
(define black-mode
(new mode :steps '(cs ds fs gs as cs)))
(define black-fg-steps
'(0 0 1 0 2 2 0 ; Phrase a
1 1 2 1 -2 -2 -1 ; Phrase a'
1 1 2 2 0 -1 -4 -3 0 ; Phrase b
0 -1 3 2 1 -1 0 -3 -2 -3 -5))
(define (make-black-fg-notes note)
(let* ((cycle-length (length black-fg-steps))
(warp-point (+ (* cycle-length 7)
7 7 8))
(step (keynum note :to black-mode)))
(new transposer
:of
(new transposer
:of (new cycle
:of black-fg-steps)
:stepping (new line
:of
(list (new cycle :of 0
:for warp-point)
20)))
:by (new range :initially step :by -2))))
The warp-point variable specifies the point at which the lower process jumps from the bottom of the keyboard up to the middle register. This is implemented using two transposer patterns. The inner transposer replicates each cycle of the step relative to an offset generated from a lineExample 22-4 generates no offset (returns 0) until warp-point but from that point onward produces the warp transposition 20, thus transposing each value produced from black-fg-steps cycle by 20 from that point onward. The surrounding pattern then applies the descending stepwise transposition (-2) to each period of the inner pattern. pattern. A line produces elements in sequential order but sticks on the last value. Thus the line specified in
Lower Foreground Rhythm
The definition of the lower foreground rhythmic pattern is derived directly from the data in Table 22-4. There is enough inner repetition to make the definition of subpatterns worthwhile.
Example 22-5. The lower foreground rhythmic pattern.
(define (make-black-fg-rhythms)
(new cycle
:of '(3 5 3 5 5 3 8 ; cycle 1
3 5 3 5 5 3 8
3 5 3 5 5 3 3 5 5 3 3 5 3 5 3 5 5 3 8
3 5 3 5 5 3 8 ; cycle 2
3 5 3 5 5 3 8
3 5 3 5 5 3 3 5 5 3 3 5 3 5 3 5 5 3 8
3 5 3 5 5 3 8 ; cycle 3
3 5 3 5 5 2 7
3 4 3 4 4 2 2 4 4 2 2 3 2 3 1 3 3 1 4
1 3 1 2 2 1 3 ; cycle 4
1 2 1 2 2 1 3
1 2 1 2 2 1 1 2 2 1 1 2 1 2 1 2 2 1 3
1 3 1 2 2 1 3 ; cycle 5
1 2 1 2 2 1 3
1 2 1 2 2 1 1 2 2 1 1 2 1 2 1 2 2 1 2
1 2 1 2 2 1 2 ; cycle 6
1 2 1 2 2 1 2
1 2 1 2 2 1 1 2 2 1 1 2 1 2 1 2 2 1 2
1 2 1 2 2 1 2 ; cycle 7
1 2 1 2 2 1 2
1 2 1 2 2 1 1 2 1 1 1 2 1 1 1 1 1 1 2
1 1 1 1 1 1 2 ; cycle 8
1 1 1 1 1 1 2
1 1 1 1 1 1 1 1 5 3 3 5 3 5 3 5 5 3 8
3 5 3 5 5 3 8 ; cycle 9
3 5 3 5 5 3 8
3 5 3 5 5 3 3 5 6 3 3 5 3 5 3 6 5 3 8
3 6 3 5 5 3 9 ; cycle 10
3 5 3 5 6 3 8
3 5 3 6 5 3 3 5 6 3 3 5 3 5 3 6 5 3 9
3 7 3 8 9 3 13 ; cycle 11
3 11 3 21))) ; cuts off here
Foreground Process Description
We are now ready to define a process that will play our foreground material:
Example 22-6. Foreground process.
(define (fg-mono mode keynums rhythms)
(process for key = (keynum (next keynums)
:from mode)
for rhy = (eighth-time (next rhythms))
output (new midi :time (now)
:keynum key
:amplitude fg-amp
:duration rhy)
wait rhy
until (eop? rhythms)))
The fg-mono process takes a mode, a pattern of keynums and a pattern of rhythms. The process generates a melody with every keynum key and rhythm rhy in the patterns for one rhythmic period. Since the pattern keynums that is passed to the function describes relative intervallic motion within a particular mode, the :from keyword argument to keynum is used to convert scaler positions in mode into their equivalent positions in the standard chromatic scale used by MIDI. Since this mode is passed into the process, fg-mono is a completely generic description that can be used to generate both the upper and lower foreground parts. We now listen to each foreground part, first individually and then mixed together.
Interaction 22-1. Play upper foreground.
cm> (events (fg-mono white-mode
(make-white-fg-notes 'b4)
(make-white-fg-rhythms))
"ligeti.midi")
"ligeti-1.midi"
cm> Interaction 22-2. Play lower foreground.
cm> (events (fg-mono black-mode
(make-black-fg-notes 'ds4)
(make-black-fg-rhythms))
"ligeti.midi")
"ligeti-2.midi"
cm> Interaction 22-3. Play both foregrounds together.
cm> (events (list
(fg-mono white-mode
(make-white-fg-notes 'b4)
(make-white-fg-rhythms))
(fg-mono black-mode
(make-black-fg-notes 'ds4)
(make-black-fg-rhythms)))
"ligeti.midi")
"ligeti-3.midi"
cm> Enhancement 1
The first improvement to our model will add octaves to the foreground and simulate a background layer by filling in the 8th note pulse using randomly selected mode notes centered around each of the foreground notes.
Example 22-7. Add octaves and a fake background
(define (Désordre-w/octaves mode ntes rhys)
(let ((fg-time 0)
(fg-eighths 0)
(mode-deg 0))
(list
;; foreground process
(process with dur and key
set fg-time = (now)
set mode-deg = (next ntes)
set key = (keynum mode-deg :from mode)
set fg-eighths = (next rhys)
set dur = (eighth-time fg-eighths)
output (new midi
:time fg-time
:keynum key
:duration (- dur .01)
:amplitude fg-amp)
output (new midi
:time fg-time
:keynum (+ key 12)
:duration (- dur .01)
:amplitude fg-amp)
wait dur
until (eop? rhys))
;; background process fills in 8th note pulses with
;; randomly selected mode notes based on current
;; foreground note.
(let ((pat (new range
:from (pval mode-deg)
:stepping (new random
:of
'((1 :weight 3)
2
(3 :weight .5
:max 1)))
:for (pval fg-eighths))))
(process repeat 1064
for k = (keynum (next pat)
:from mode)
unless (or (= (now) fg-time)
(not (<= 0 k 127))) output (new midi
:time (now)
:keynum k
:duration (- eighth-pulse
.01)
:amplitude bg-amp)
wait eighth-pulse)))))
The Désordre-w/octaves process takes the same arguments as our original play-fg process but its definition is more involved. Notice that Désordre-w/octaves returns a list of two processes, the first produces our foreground materials and the second generates the background. The first process is equivalent to our original play-fg definition except that it outputs two MIDI objects per interaction to create the octave passage work. Our first process description sets two shared variables that the second process will use too. The mode-deg variable holds the current mode degree of the foreground and the variable fg-eighths is set to the duration (in eighth notes) of the note the process is currently playing.
The second process description creates a harmonic background to support the foreground material. It creates a pattern pat that generates random steps from whatever mode-deg the first process is currently playing. The range pattern produces each step using a random pattern that generates three different step sizes: steps to adjacent degrees (1), steps that skip one degree (2) and steps that skip two degrees (3). The actual intervallic distances that theses steps produce will depend on the mode to which it is applied. For example a single step (1) can produce either half steps or whole steps in our white mode but whole steps or minor thirds in our pentatonic black mode. Since the range's initial position as well as its period length depend on whatever the first process is currently generating, the pattern must uses pval to delay the evaluation of fg-eighthsmode-deg until the pattern is actually running. Otherwise, these variables would be evaluated when the pattern is created, not rather then when the pattern was used. and
The rest of the process description is relatively straightforward. Because the foreground material extends to the top and bottom of the keyboard, our random background process could potentially generate random key number above or below the legal range of key numbers specified by MIDI. The unless clause checks to see if the current key number of the background is within the legal limits and, if not, omits that event from the score. We now listen to the octaves and background material:
Interaction 22-4. Listening to enhancement 1.
cm> (events (append
(Désordre-w/octaves white-mode
(make-white-fg-notes 'b3)
(make-white-fg-rhythms))
(Désordre-w/octaves black-mode
(make-black-fg-notes 'ds3)
(make-black-fg-rhythms)))
"ligeti.midi")
"ligeti-4.midi"
cm> Enhancement 2
As our final enhancement we implement processes that add more realism by simulating the foreground chords that occur in section three:
Example 22-8. Process with foreground chords.
(define (Désordre-voices mode ntes rhys chord
voimap fgchan bgchan)
(let ((moct (scale-divisions mode))
(fg-time 0)
(fg-8ths 0)
(mode-deg 0))
(list
;; foreground process
(process with rhy and voi and key
and voices =
(new transposer
:of (new heap :of chord
:for (pval voi))
:on (pval mode-deg))
for count from 0
set fg-time = (now)
set mode-deg = (next ntes)
set key = (keynum mode-deg
:from mode)
set fg-8ths = (next rhys)
set rhy = (eighth-time fg-8ths)
set voi = (lookup count voimap)
output
(new midi :time (now)
:channel fgchan
:keynum key
:duration rhy
:amplitude fg-amp)
wait rhy
if (equal? voi true)
;; add lower octave ...
output
(new midi :time (now)
:channel fgchan
:keynum (- key 12)
:duration rhy
:amplitude fg-amp)
else
;; ... else add cluster
each k in (next voices true)
output
(new midi
:channel fgchan
:time (now)
:keynum (keynum k :from mode)
:duration (- rhy .01))
until (eop? rhys))
;; background process.
(let ((notes
(new range
:from
(pval (- mode-deg
moct))
:stepping
(new random
:of '((1 :weight 3)
2
(3 :weight .5 :max 1)))
:for (pval fg-8ths))))
(process for i below 1064
for k = (keynum (next notes)
:from mode)
unless (or (= (now) fg-time)
(not (<= 0 k 127))) output (new midi
:channel bgchan
:time (now)
:keynum k
:duration (- eighth-pulse
.01)
:amplitude bg-amp)
wait eighth-pulse)))))
As in the first enhancement (Désordre-w/octaves) our second enhancement creates a foreground and background process. The background process is essentially unchanged from the first enhancement and will not be discussed here. However, the foreground process is considerably more complex in our new definition because it now generates both octaves and clusters, or random chords, of notes. The intervallic content of these random clusters is specified to the process by the chord parameter. The value of chords is a list of intervals that the voices random pattern will transpose to the foreground's current mode degree. The density, or number of notes, in each random cluster is controlled by a “voice map” specified in the voimap parameter. The voice map is a list that contains pairs of values. The first value in each pair specifies a beat number in the score (calculated in eighth notes) and the second value specifies the number notes that each cluster should contain from that beat forward until the next pair in the beat map. Since our foreground process will produce both octaves and chords, a boolean true value in the voice map will be interpreted as meaning that octaves instead of random clusters should be output. For example the beat map:
(0 3 10 #t 15 6)
would specify 3-voice clusters starting at beat 0, octaves starting at beat 10 and 6-voice clusters staring at beat 15. The function lookup is used to look up the current voice number voi in voimap. lookup is similar to interpl in that it processes lists of pairs whose x value is monotonically increasing. However lookup does not perform linear interpolation, it simply returns whatever y value is in the list. Since no interpolation is performed the y value does not even have to be numeric.
We now listen to our final version. Foreground and background processes for both parts are given their own MIDI channels so that each individual processes can heard in isolation or in combination with other specific voices.
Interaction 22-5. Listening to enhancement 2.
cm> (events (append
(Désordre-voices white-mode
(make-white-fg-notes 'b4)
(make-white-fg-rhythms)
'(-1 -2 -3 -4 -5 -6)
'(0 #t 261 1 284 2 297 3)
0 1)
(Désordre-voices black-mode
(make-black-fg-notes 'ds4)
(make-black-fg-rhythms)
'(-1 -2 -3 -4)
'(0 #t 254 1 286 2)
2 3))
"ligeti.midi")
"ligeti-5.midi"
cm> - → ligeti-5.midi (four channels)
Chapter Source Code
The source code to all of the examples and interactions in this chapter can be found in the file ligeti.cm located in the same directory as the HTML file for this chapter. The source file can be edited in a text editor or evaluated inside the Common Music application.
References
(NIL). Gyorgy Ligeti: decision and automatism in Desordre 1er Etude, Premier Livre.Interface, 1991, ????.
(????). The Pattern Meccanico Compositions of Gyorgy Ligeti. Perspectives of New Music,????, ????.