Towards Idiomatic Instrumental Writing: A Constraint Based Approach
Towards Idiomatic Instrumental Writing: A Constraint Based Approach
Towards Idiomatic Instrumental Writing: A Constraint Based Approach
Abstract
Constraint based languages have already been used successfully to produce musical raw
material in compositional work. Often, however, the results cannot be used directly for
instrumental parts but must be modified afterwards in order to make them playable for human
performers. This paper offers some new ideas how idiomatic instrumental writing could be
incorporated more deeply in the computer aided composition process. The programming
environment used in this study is PWConstraints (Laurson, 1996a).
Keywords
instrumental writing, fingerings, computer assisted composition; constraint satisfaction
problems; artificial intelligence.
Background
PWConstraints is a user-library in PatchWork (PW), (Laurson, 1996a). PatchWork, in turn,
is a visual programming language - written in Common Lisp and CLOS - for computer assisted
composition and analysis. Currently PW contains an extensive set of user libraries ranging from
packages dealing with spectral music, stochastic music, rule-based programming, rhythmical
processes, sound synthesis, etc. Detailed information about PW user libraries is available from
IRCAM.
PWConstraints is a rule-based programming language where the user writes rules to describe
the end result from many different points of view. A search-space is defined as a set of search-
variables. Each search-variable has a domain containing a list of values. In a rule a pattern-
matching language is used to extract relevant information from a potential solution. This
information is given to a Lisp test function that either accepts or rejects the current choice made
by the search-engine. As an example a rule disallowing two adjacent equal values in a result is
written as follows (this rule uses a wild card and two variables):
(* ?1 ?2 (?if (/= ?1 ?2)) "no equal adjacent values")
The user can also define preferences by heuristic rules. These are similar to the ordinary
PWConstraints rules except the Lisp-code part of a heuristic rule returns a numerical value
instead of a truth value (heuristic rules never reject candidates). This scheme allows the search to
sort candidates that are accepted by the ordinary rules. The search tends to favour candidates
with high numerical values. For instance a heuristic rule that prefers large intervals can be
written as follows:
(* ?1 ?2 (?if (abs (- ?2 ?1))) "prefer large intervals")
Besides these basic tools PWConstraints contains several extensions. The most important
and complex ones - Score-PMC (Laurson, 1996a) and Texture-PMC (Laurson, 1999) - are used
to solve polyphonic search problems and to create musical textures. Like in a traditional
polyphonic score, the user operates with several layers (parts, voices) of events (notes). The
rhythmic structure of a search problem is prepared in advance in a standard PW rhythm-editor.
1
This input score (which can be arbitrary complex) is given as an argument to the search engine.
The search, in turn, aims at filling the input score with pitch information according to the given
rules. Score-PMC can be seen as a multi-layered search problem where each melodic line
represents one queue structure similar to the one used by a simple search problem.
The multi-layered search idea has been extended to cover other parameters than pitch. A
function called Texture-PMC uses internally the Score-PMC function and is capable of
producing complex rhythms and textures. The input-score consists of a dense train of pulses.
Each input pulse can be interpreted either as an attack, tie, rest or some other texture type. For
more details see Laurson (1996a, 1996b and 1999).
In order to clarify our approach we next discuss two case studies. The first one - the classical
guitar - is a good example of an instrument which is capable of playing a great number of
different texture types: single melodic lines, multivoiced chords and polyphonic textures
consisting typically of 2 or 3 independent parts. One must, however, consider several constraints
that are inherent in the instrument: it has six strings tuned in a specific way; the left hand of the
player can use only four fingers; there is a limit of how much the left hand fingers can be
stretched apart; the player must have enough time when changing from one left hand position to
another, etc. Thus it remains a challenge to write for the guitar using its full potential without
making the result unplayable.
Our second case study is concerned with brass instrument fingerings, the trumpet in
particular, in a virtuosic context. The trumpet is a brass instrument with three valves resulting in
eight different fingerings. With each fingering a different overtone series can be played. When
no valves are pressed the resulting overtone series in a C trumpet starts from C3 (we use here the
convention where ‘middle C’ = C4). The first playable tone is always, however, the second
partial. Thus, the lowest note achieved with an open fingering is C4. When all valves are pressed
down (the maximum pipe length) this results in F#3 which is also the lowest natural tone of the
trumpet. So called pedal tones are playable down to C3 and even lower. These principals can be
applied also to other brass instruments with valves.
In order to demonstrate the effect of instrument specific rules we give first a short texture
example without fingering rules (Figure 1). (We refer in the following to the written pitch.) This
example was produced in Score-PMC using various melodic and harmonic rules (due to space
limitations we give here only some rough ideas about the rules that were used to produce the
result): all five-note chords have the set-class identity 5-28a or 5-28b; one and two-note textures
avoid pitch-class duplicates and belong to a harmonic series starting from F2; a heuristic rule
2
aims to produce a pitch contour that resembles a triangle-shaped wave form, etc. It is obvious
that the musical texture of Figure 1 is not playable with the guitar:
9
4
# # ˙˙˙˙ œœœœ
#œ œ œ
# œ œ #œ #œ #œ #œ nœ #œ
& œ œ
œœ œ œ œ #œ œ # œœœœ ...... ˙˙˙˙˙
˙ œ œ ....
Figure 2, however, gives an example that utilises besides the melodic and harmonic rules
discussed above also instrument specific fingering rules. The search is prepared as any other
Score-PMC search except that for each instrumental part one extra part - this part is
rhythmically an exact duplicate of the instrumental part - is created which will contain
information on how the guitar part will be fingered. The lower part in Figure 2 shows the actual
musical result containing the rhythms and pitches that are intended to be realised by a guitarist.
The upper part, in turn, gives the fingerings. The fingerings are given as pitches of the open
strings of the guitar (therefore this part can only contain six pitches: E3, A3, D4, G4, H4, and
E5). Thus, for instance in the first chord the lowest pitch in part 2, F3, is to be realised with the
sixth string (= E3 in part 1), the highest pitch in the first chord, A3, is using the fifth string (=
A3 in part 1), the second note, C4, is using the fifth string (= A3 in part 1), and so on. (We use
here a somewhat simplified fingering system as we do not give information which left hand
fingers should be used. Our approach - using only open strings - was mainly motivated by the
need to keep the system as simple and manageable as possible).
9
4
œœ œ œ ˙ œ œ œ œ œ œ œœ .... ˙˙
& œ œ œ ˙˙ œœ œ
œœ œ œ œ
œ
˙˙ œœ œ œœœ ...... ˙˙
˙
9
4
œœ # œ #˙ œ œ
# # œœ
#œ œ # ˙˙ œœ œ
œ œ #œ œ .. ˙˙˙
&
œœ œ
œ œ œ
˙˙ œœ #œ # œ # œœœ ...... ˙
œ .. ˙
Figure 2. A guitar texture example with fingering rules. Upper part gives the “phantom” part.
Lower part gives the musical result to played by a guitarist.
The scheme presented in figure 2 has many interesting features. The system knows the
complete history of the found pitch information up to the current point in the search (lower part).
Also there is the complete history available of the fingerings (upper part). Each time a new pitch
value is chosen it must simultaneously also fulfil the fingering rules. The fingering rules can be
time and texture sensitive. Different rules can be applied for musical textures consisting of fast
notes, slow notes, single notes, chords or some other mixed type of textures.
Next we discuss in more detail two of the fingering rules that were used to realise the
example in Figure 2. Note that all fingering rules contain in the pattern-matching part the
expression ":partnum 1" which means that these rules are applied only for part 1 (i.e. the
"phantom" or instrumental part).
Our first fingering rule is very basic and simply guarantees that each pitch in part 2 (i.e. the
"musical" part) must be mapped with a string capable of realising the pitch in question:
(* ?1 :partnum 1
(?if
(let* ((midi (- (map-cc-midi ?1 2) 12)) 12))
(fgrs (get-fingering *guitar* midi)))
(member (map-midi->string *guitar* (m ?1)) fgrs :key #'strg)))
"force each note to have a string")
3
Our second fingering rule is more complex and handles the fingering of chords. First, we check
that each pitch in the chord has a unique string (1). Second, the rule also avoids large left hand
stretches by limiting the distance of the minimum and maximum fret positions within the chord (2).
(* ?1 :partnum 1
(?if
(if (cc ?1)
(let* ((frets (cons (map-midi->fret *guitar* ?1 2)
(mapcar #'(lambda (sv) (map-midi->fret *guitar* sv 2)) (cc ?1))))
(frets-0 (remove 0 frets)))
(if (member (map-midi->string *guitar* (m ?1)) ;; (1)
(mapcar #'(lambda (m) (map-midi->string *guitar* m))
(l->ms (cc ?1))))
()
(if frets-0 ;; (2)
(<= (- (apply #'max frets-0)(apply #'min frets-0)) 2) t)))
t))
"unique string + avoid big stretches within chords")
Another fingering rule used in our example forbids large horizontal movements between
adjacent fret positions. A more strict version is also used where the system avoids fast
horizontal left hand zigzag movements in fast passages. Finally, a heuristic rule is used that
favours open strings whenever possible.
We will demonstrate two different applications on how trumpet fingerings can be used in a
compositional context. First, it is helpful to use "static fingerings" when managing rapid
passages. Static fingerings may allow the player to maintain the same fingering in a sequence
consisting of alternating pitches. Second, fingering patterns can be learned and then repeated
several times within a musical passage. Both approaches allow rapid passages to be executed
with relative ease.
Both examples below use a similar set of melodic rules. Some rules control the pitch-class
contents of the examples: tonal implications are avoided by discarding major and minor triads,
diminished chords and certain subsets of major and minor scales. A heuristic rule is also applied
to control the contour of the second example.
Static fingerings
Static fingerings are especially useful when using higher partials because these partials lie
close to each other. The higher we go in range, the larger will be the amount of different pitches
that can be played with only one fingering.
4
A typical technique for the brass instruments is called “lip trill”. When lip trilling a brass
player does not use different fingerings to produce a trilled note, but uses instead the
embouchure and air pressure (Figure 3). This technique is useful for intervals below minor third
for classical trumpet applications. (Intervals larger than this - “a shake” - can be executed in the
highest register and these are considered to be part of the jazz trumpet vocabulary.)
0
œ #œ
œ> œ œ # œ. œ. b >œ œ œ œ. œ. œ> n œ œ œ. œ. œ>b œ œ œ
12 1 12
&c 6
F
3 3 3
1
Figure 3. The use of lip trilling technique. The fastest rhythms use only one fingering at a time
(the fingerings are shown above the respective notes). The passage is intended to be performed
in a tempo around 144 per quarter note.
Fingering patterns
Fingering patterns, kind of “fingering canons”, can also be utilised. This means that the
player can repeat certain fingering sequences over and over again. The musical texture can reflect
the fact that the fingering patterns remain the same by for instance repeating pitch patterns in the
register space. Another possibility is to do just the opposite, trying to keep the fingering and
pitch patterns as independent of each other as possible, as can be seen in the Figure 4:
0 1 2 12 0 1 2 12 0 1 2 12 0 1 2 12
>œ # >œ >
> > >
œ >
œ > >
œ œ
c œ # œ > œ # œ >
œ >
œ # œ J ‰
& œ
œ> >œ > >
1 6
5
Figure 4. An example of a fingering pattern being repeated through a rapid passage of music.
The fingering rules used in this case study are quite straightforward. These rules can
effectively describe the general behaviour of the trumpet fingering scheme. Three basic fingering
rules are given followed by a special rule - used in the example in Figure 4 - for creating
fingering patterns. The first three rules are quite general and could be applied to any style of
virtuosic brass playing.
First there has to be a rule for checking that a pitch candidate can be played with a particular
fingering. This rule is very basic and makes no other assumptions about the suitability of the
fingering (i.e. being out of tune, etc.). It only checks if it is possible to produce the desired pitch
with the selected valve combination:
(* ?1 :partnum 1
(?if
(member (car (hc-midis ?1))
(cdar (member (m ?1) *trumpet-fingerings* :key 'car))))
"Checks for right fingering!")
5
(* ?1 ?2 :partnum 1
(?if (good-fingering-combination-p (m ?1) (m ?2)))
"avoids awkward fingering combinations")
Next, we define a rule for excluding certain alternative fingerings. This is to ensure that any
pitch, that is known to be out of tune, is not accepted:
(* ?1 :partnum 1
(?if (let ((mistuned (cdar (member (m ?1) *mistuned-partials* :key 'car)))
(pitch (car (hc-midis ?1))))
(not (member pitch mistuned))))
"avoids mistuned fingerings")))
Finally, we give the special fingering pattern rule used to generate the example in Figure 4.
The rule checks that after a given distance - in our case the length of the pattern is four - the
fingering will be repeated. There are no further assumptions about the structure of the pattern.
(* ?1 ?2 ?3 ?4 ?5 :partnum 1
(?if (= (m ?5) (m ?1))))
"fingering pattern")
Conclusions
We have discussed some recent developments in PWConstraints. The focus has been to
develop tools that allow to specify instrumental rules within a constraint based context. We hope
that this paper demonstrates that already a handful of relatively simple rules may improve the
outcome of a computer aided system when it is used to produce instrumental music.
Acknowledgements
This work has been supported by the Academy of Finland in project “Sounding Score -
Modelling of Musical Instruments, Virtual Musical Instruments and their Control”.
References:
Laurson, M. and Duthen J. (1989); PatchWork, a graphical language in PreForm; Proc. Int.
Computer Music Conf., San Francisco (pp. 172-175)
Rueda C., Lindberg M., Laurson M., Bloch G. and Assayag G. (1998); Integrating Constraint
Programming in Visual Musical Composition Languages; in ECAI 98 Workshop on
Constraints for Artistic Applications, Brighton.