Changing the tempo
slippery chicken provides two initial options for managing
tempo and tempo changes over the course of a piece. The
first, tempo-map
, allows the user to set static changes at
the beginning of specified sequences within a composition. The
second, tempo-curve
, allows for gradual changes in tempo
over an x-axis as specified through a list of breakpoint pairs. These
two approaches cannot be used in combination.
+ tempo-map
The tempo-map
takes bar numbers as the x-axis element
of its breakpoint pairs. These can be given either as simple bar
numbers (integers) or as references to a bar in the form
(section-number sequence-number bar-number) (see below). The tempo
indications themselves are indicated as a beat indication paired with
a beats-per-minute indication, such as (q 84), (as also described in
the core usage guide). Text
descriptions for the given tempo can also be included, as is
described in the source code documentation for the
tempo
class.
Thus, to produce a piece whose tempo starts at quarter=60, then changes to eighth=72 at bar 15, and changes again to dotted-quarter=176 with the text description "prestissimo" at bar 84, the user would enter the following:
:tempo-map '((1 (q 60)) (15 (e 72)) (84 (q. 176 "prestissimo")))
In the context of a call to the make-slippery-chicken
function, that may, for example, be incorporated like this:
(let ((mini (make-slippery-chicken '+mini+ :title "mini" :instrument-palette +slippery-chicken-standard-instrument-palette+ :ensemble '(((vn (violin :midi-channel 1)))) :tempo-map '((1 (q 60)) (15 (e 72)) (84 (q. 176 "prestissimo"))) :set-palette '((1 ((c4 d4 e4 f4 g4 a4 b4 c5)))) :set-map (list (list 1 (loop repeat 100 collect 1))) :rthm-seq-palette '((1 ((((2 4) (s) (s) e e e)) :pitch-seq-palette ((1 2 3))))) :rthm-seq-map (list (list 1 (list (list 'vn (loop repeat 100 collect 1)))))))) (midi-play mini :midi-file "/tmp/mini.mid") (cmn-display mini :file "/tmp/mini.eps"))
Using the references approach, to indicate a tempo map that starts with quarter=60, then changes to eighth=72 at the first bar of the first sequence of the second section, then again to dotted-quarter=176 with the text description "prestissimo" at the first bar of the third sequence of the third section, the user would enter:
:tempo-map '((1 (q 60)) ((2 1 1) (e 72)) ((3 3 1) (q. 176 "prestissimo")))
+ tempo-curve
Instead of using references to static bar numbers, changes to the tempo over the course of a given piece can be indicated using a list of breakpoint pairs, as seen in this example here:
:tempo-curve '(10 q (0 60 30 144 75 52 100 120))
The first argument, the 10
in this example, is the
frequency at which the current tempo is printed in the score. In this
instance, the current tempo will be printed every 10 bars. The second
argument is the beat on which the tempo is to be based, in this
example a quarter-note, or q
. The last argument is a
list of breakpoint pairs, the first of each pair being a number
representing the x-axis, and the second being the
beats-per-minute. The x-axis scale is arbitrary; any scale chosen by
the user will be fitted to the number of sequences in the
compositions, though the curve should start at 0. Because x-axis
values will be interpolated
As with other x-axis curves (or "envelopes") in
slippery chicken, the x-axis of tempo-curve
is
scaled to the number of sequences in the given composition,
not, for example, time, notes, or bars.
In the context of a call to the make-slippery-chicken
function, this feature may, for example, be incorporated like
this:
(let ((mini (make-slippery-chicken '+mini+ :title "mini" :instrument-palette +slippery-chicken-standard-instrument-palette+ :ensemble '(((vn (violin :midi-channel 1)))) :tempo-curve '(10 q (0 60 30 144 75 52 100 120)) :set-palette '((1 ((c4 d4 e4 f4 g4 a4 b4 c5)))) :set-map (list (list 1 (loop repeat 100 collect 1))) :rthm-seq-palette '((1 ((((2 4) (s) (s) e e e)) :pitch-seq-palette ((1 2 3))))) :rthm-seq-map (list (list 1 (list (list 'vn (loop repeat 100 collect 1)))))))) (midi-play mini :midi-file "/tmp/mini.mid") (cmn-display mini :file "/tmp/mini.eps"))
+ A note on tempo changes in combination with the chop method
As described in the documentation
on Intra-Phrasal Looping,
the chop
method, when applied to
a rthm-seq-palette
object, produces a series of
new rthm-seq
objects that are each one bar long, with
durations that are each a fragment of the original, and whose time
signatures correspond to the duration of the fragment created. Thus,
the example in the Intra-Phrasal Looping documentation initially
produces material that consists of only 1/8 and 1/4 bars, as these
are the only time signatures that can result from the
specified chop points.
Any list passed to the tempo-map
of such a piece would
require bar numbers that refer to these original, very short bars,
and any integer passed as the first argument
to tempo-curve
would also refer to these very short
bars. This means that if the material is re-barred using
the re-bar
method, as in the Intra-Phrasal Looping
example, the tempo indications still remain attached to their
original locations, rather than being re-adjusted to the new
bars.
slippery chicken allows for various indications, including
tempo marks, to be applied to a piece after the creation of
the slippery-chicken
object. This makes it possible to
place tempo indications according to new bar numbers after
the re-bar
method has been applied. For more information
on this, see the documentation
on post-generation data
editing.