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:
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))
(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)
Next page Lesson 19. Randomization and Variation
Go back to Reference page.