This is an earlier piece Lesson 7 transformed by the addition of tempo changes and a percussion part for Latin percussion.
There are two ways to add tempo changes to a score-file. Both are explained here and in detail in the DEF-SCORE documentation.
The first way produces very straightforward changes that are triggered at the start of a particular bar/list. The second is more complex but does allow for ritardando and accelerando and produces a very finely graduated tempo change over any number of bars/lists using the concept of ‘delta time’.
The piece is in an A B A structure and lasts for 15 bars of 5/8. Here's the first approach to tempo change:
(setf tempo-list-1 '(60 70 80 90 100 110 120 60 120 110 100 90 80 70 60)) (setf tempo-1 (make-tempo tempo-list-1 bars)) => ((60 :length 5/8) (70 5/8) (80 5/8) (90 5/8) (100 5/8) (110 5/8) (120 5/8) (60 5/8) (120 5/8) (110 5/8) (100 5/8) (90 5/8) (80 5/8) (70 5/8) (60 5/8))
Each bar in this approach requires a tempo-change value even if many bars might require the same value.
The variable tempo-1 is then placed inside the DEF-SCORE expression:
(def-score lesson-29 (:key-signature '(c maj) :time-signature ts-list :tempo tempo-1)
The second approach is more sophisticated and its results more subtle. The downside is the tempo-change list is a little more complex.
(setf tempo-2 '(("Mixed Tempi" q :accel 60 100 1/32 5) (110 1) (120 1) (60 1) (120 1) (110 1) (:rit 100 60 1/32 5)))
The expression begins with a list that includes a tempo marking and value to be placed at the start of the notation score. There are four slots in all. Here's the document instruction itself:
<tempo-name> is a string for the tempo to be printed by notation, e.g. \"Allegro\".
<beat-note> is an OMN note symbol denoting the note that gets a beat, e.g. q or e.
<:bars/:length>, if included, determines whether <count> is a number of bars or a length (number of quarter notes).
Defaults to :bars.
The first list of tempo changes has an accelerando from 60 to 100 bpm with a delta-time value of 1/32 over a period of 5 bars:
(:accel 60 100 1/32 5)
This is followed by 5 bars each set to a different tempo.
. . . (110 1) (120 1) (60 1) (120 1) (110 1)
Then, to finish there's a gradual ritardando indicated.
(:rit 100 60 1/32 5))
Finally, the tempo-2 variable is placed within the DEF-SCORE expression:
(def-score lesson-29 (:key-signature '(c maj) :time-signature ts-list :tempo tempo-2)
The additional percussion part is an opportunity to see how such a part might be organised and notated. The pitch organisation uses a preliminary mapping, if only because the pitch layout of GM percussion is hardly intuitive! The mapping sonically is low to high (a b c d) even though the pitches that trigger the percussion samples are not the same.
Mapping the percussion kit is made possible by defining new variables with an alphabetical series of variables whose names are suggestive of pitches, but which actually encapsulate the ‘correct’ GM percussion note:
(setf c '(cs4) ;bongo l d '(c4) ;bongo h a '(e4) ;conga l b '(ds4)) ;conga h
The rhythms are notated here directly in OMN. here’s the A section:
(setf rhy-p '((e = = - e) (e - s == = e) (-e e = - s =) (e = s = e e) (-e e - s = = =)))
OMN also has particular shorthand notations for repeats and rests:
= repeats a note-length
- is a rest-length
== doubles up the note-length
=== triples the note-length.
See how the function APPLY-EVAL turns the alphabetical percussion mapping series into pitches:
(setf p-kit-i (apply-eval ' ((a a a b) (a c d c d b) (a b c d) (a b c c b) (a c d c d)))) => ((e4 e4 e4 ds4) (e4 cs4 c4 cs4 c4 ds4) (e4 ds4 cs4 c4) (e4 ds4 cs4 cs4 ds4) (e4 cs4 c4 cs4 c4))
;; Mapping percussion kit (setf c '(cs4)) ; bongo l (setf d '(c4)) ; bongo h (setf a '(e4)) ; conga l (setf b '(ds4)) ; conga h (setf line (gen-repeat 5 '((c4 cs4 fs4 g4 c5)))) (setf line-t (pitch-transpose '(0 1 7 6 0) line)) (setf bass (pitch-transpose -24 line)) (setf bass-r (gen-retrograde bass :section '(0 2 4))) (setf chords '(c4cs4fs4 fs4g4c5)) (setf rhythm (span line '(e))) (setf rhy-c (span rhythm chords)) (setf rhy-w (length-weight rhythm :weight '(2 1) :seed 30)) (setf rhy-wi (length-weight rhythm :weight '(3 1) :seed 23)) (setf rhy-p '((e = = - e) (e - s == = e) (-e e = - s =) (e = s = e e) (-e e - s = = =))) (setf rhy-p1 '((e = = ==) (e = = - =) (e = = = =) (-e = = - =) (e = = - e))) (setf p-kit-i (apply-eval '((a a a b) (a c d c d b) (a b c d) (a b c c b) (a c d c d)))) (setf p-kit-ii (apply-eval '((a b a d a) (a b a c) (c d d c d) (a b a) (d a c d)))) (setf perc-1 (make-omn :length rhy-p :pitch p-kit-i :velocity '(f))) (setf perc-2 (make-omn :length rhy-p1 :pitch p-kit-ii :velocity '((mf) (f) (fff) (f) (mf)))) (setf line-1 (make-omn :length rhy-w :pitch line-t :velocity'(f))) (setf bass-1 (tie-bars (make-omn :length rhythm :pitch bass-r :velocity '(mp)))) (setf line-2 (make-omn :length rhy-w :pitch chords :velocity '((mp) (mf) (fff) (mf) (mp)))) (setf bass-2 (make-omn :length rhy-wi :pitch bass-r :velocity '(f))) (setf part-1-rh (assemble-seq line-1 line-2 line-1)) (setf part-1-lh (assemble-seq bass-1 bass-2 bass-1)) (setf perc-1-2-1 (assemble-seq perc-1 perc-2 perc-1)) ;; Two different forms of tempo change - try each in the tempo slot of def-score. ;; Tempo-change 1 (setf tempo-list-1 '(60 70 80 90 100 110 120 60 120 110 100 90 80 70 60)) (setf tempo-1 (make-tempo tempo-list-1 part-1-rh)) ;; Tempo-change 2 (setf tempo-2 '(("Mixed Tempi" q :accel 60 100 1/32 5) (110 1) (120 1) (60 1) (120 1) (110 1) (:rit 100 60 1/32 5))) (setf ts-list (get-time-signature part-1-rh :group '((5)))) (def-score lesson-29 (:key-signature 'chromatic :time-signature ts-list :tempo tempo-2 :layout (list (piano-layout 'piano-rh 'piano-lh) (percussion-layout 'percussion))) (piano-rh :omn (respell part-1-rh :type :chord) :channel 1 :sound 'gm :program 'acoustic-grand-piano) (piano-lh :omn part-1-lh) (percussion :omn perc-1-2-1 :channel 10 :pan 64) )
Go back to Reference page.
Edited by opmo