• # Lesson 18. A Chorale with Integers

## Annotation

The aim of this piece is to make a chorale in 4 voices using integers as the building block for pitch and structure.

The opening expressions use two random functions: RND-PICK and RND-SAMPLE. It would be usual to apply the keyword :seed for each occurrence of the random function, but here, at the very opening of the score-script we'll apply a global seed instead:

(init-seed 32)

This covers all the possible seed settings throughout the piece. Try changing this global seed and listen / see the difference in the chord voicings.

(setf row-1 '(12 11 10 9 8)
row-2 '(7 8 9 10 11)
row-3 '(6 7 6 7 6)
row-4 '(1 2 3 4 5))

This is the first occasion a short-cut to naming variables has been used.

The row material is a matrix of integer-derived pitches based on the first 5 patterns from Slonimsky's Thesaurus. The pitch material used so far in the Stages has been just the first pattern in this set.

The INTEGER-TO-PITCH conversion takes place here inside the PITCH-MIX expression.

(setf rh-ab (pitch-mix
(list (integer-to-pitch rh-a)
(integer-to-pitch rh-b))))

Evaluate this expression in sections to see the structure necessary to mix two lists of pitches into diads.

(integer-to-pitch rh-b)

(list (integer-to-pitch rh-a)
(integer-to-pitch rh-b))

(pitch-mix
(list (integer-to-pitch rh-a)
(integer-to-pitch rh-b)))

Remember you can evaluate an expression from inside these guidance notes!

A feature of most chorales is the fermata at the end of each phrase:

(setf ferm (gen-repeat 5 (list '(- - - - fermata2))))

Think of the fermata as part of the articulation. So it has to be placed in the MAKE-OMN parameter list like this:

(setf rh-1
(make-omn
:length rhy-1
:pitch rh-ab
:velocity dyn-1
:articulation ferm))

Here's the resulting first bar of 5/4 in OMN:

=> ((q b4a4 f bb4a4 mp b4g4 mf b4a4 f bb4gs4 ff fermata2)
(q bb4gs4 mf bb4b4 f gs4 mp bb4a4 p gs4g4 pp fermata2)
(q bb4g4 p b4a4 mp c5a4 mf gs4b4 mp gs4a4 mf fermata2)
(q a4gs4 f a4g4 ff bb4g4 f c5gs4 mf gs4b4 mp fermata2)
(q gs4b4 mf bb4b4 p c5gs4 mp bb4g4 p gs4 pp fermata2))

## Score

(init-seed 2)
;; Change the random seed value to create
;; different 'chorale' voicings

(setf row-1 '(12 11 10 9 8)
row-2 '(7 8 9 10 11)
row-3 '(6 7 6 7 6)
row-4 '(1 2 3 4 5))

(setf r-1 (rnd-pick (list row-1 row-1 row-1 row-2 row-3))
r-2 (rnd-pick (list row-2 row-3 row-3 row-4 row-4))
r-3 (rnd-pick (list row-1 row-1 row-2 row-2 row-3))
r-4 (rnd-pick (list row-2 row-3 row-4 row-4 row-4)))

(setq rh-a (rnd-sample 25 r-1)
rh-b (rnd-sample 25 r-2))

(setf lh-a (rnd-sample 25 r-3)
lh-b (rnd-sample 25 r-4))

(setf rh-ab (pitch-mix
(list (integer-to-pitch rh-a)
(integer-to-pitch rh-b))))

(setf lh-ab (pitch-mix
(list (integer-to-pitch lh-a)
(integer-to-pitch lh-b))))

(setf lh-abt (pitch-transpose -12 lh-ab))
(setf rhy-1 (gen-repeat 5 (list '(q q q q q))))
(setf ferm (gen-repeat 5 (list '(- - - - fermata2))))
(setq dyn-1 '((f mp mf f ff) (mf f mp p pp) (p mp mf mp mf)
(f ff f mf mp) (mf p mp p pp)))

(setf rh-1 (make-omn
:length rhy-1
:pitch rh-ab
:velocity dyn-1
:articulation ferm))

(setf lh-1 (make-omn
:length rhy-1
:pitch lh-abt
:velocity dyn-1
:articulation ferm))

(setf timesigs (get-time-signature rh-1))

(def-score lesson-18
(:key-signature 'chromatic
:time-signature timesigs
:tempo '(q 70)
:layout (piano-layout 'piano-rh 'piano-lh))

(piano-rh
:omn rh-1
:channel 1
:sound 'gm
:program 'acoustic-grand-piano)

(piano-lh
:omn lh-1)
)
;; Setting random back to NIL
(init-seed nil)

## Notation

Go back to Reference page.

Edited by opmo

×

• Lessons