slippery chicken documentation - changing the tempo

## 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")))

close

### + 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"))

close

### + 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.

close