Next: , Previous: Articulation Markings (Lisp), Up: Lisp Examples


7.5 Spanner Marks

“Spanner marks” are marks that span across one or more notes in score. Examples are slurs, crescendo/decrescendo wedges and text marks followed by dashed lines. There are several ways of entering these types of marks, all of which involve the use of either a begin, end, or “continue” mark. A ellipsis with two dots (‘..’) (or single dots in the case of a continue mark) is used to denote which part of the spanner a mark represents—for example, (.., ..) and .(. are the begin, end and continue marks of a slur.

A straightforward method of specifying spanner marks is to indicate where they start and stop. In this example, (.. and ..) marks are used to signify the beginnings and ends of slurs:

(fms:with-score
    (:filename *filename*
     :parts '((:id pno :inst :piano)))
  (loop
     with sluron
     for off from 0 to 10 by 1/2
     do (fms:note :time off
                  :dur (if (< off 10) 1/2 1)
                  :pitch (+ 60 (random 25))
                  :marks (when (< (random 1.0) 0.5)
                           (prog1
                               (if sluron '("..)") '("(.."))
                             (setf sluron (not sluron)))))))

lsp041.png

Figure 7.24: Slurs

Only the begin marks are given in the next example. In this example, each end occurs before the beginning of the next slur or on the very last note if there is no next slur. Slurs spanning only a single note are removed (though they may still affect the placement of other slurs). FOMUS considers each voice separately when calculating spanners (with the exception of a few marks like octave change signs, which need to be calculcated separately for each staff).

(fms:with-score
    (:filename *filename*
     :parts '((:id pno :inst :piano)))
  (loop
     for v from 1 to 2
     do (loop
           for off from 0 to 10 by 1/2
           do (fms:note :time off
                        :dur (if (< off 10) 1/2 1)
                        :pitch (ecase v
                                 (1 (+ 60 (random 25)))
                                 (2 (+ 35 (random 25))))
                        :voice v
                        :marks (if (< (random 1.0) 0.5)
                                   '("(..")
                                   '())))))

lsp004.png

Figure 7.25: Slurs using Begin Marks

End marks may also be used by themselves:

(fms:with-score
    (:filename *filename*
     :parts '((:id pno :inst :piano)))
  (loop
     for v from 1 to 2
     do (loop
           for off from 0 to 10 by 1/2
           do (fms:note :time off
                        :dur (if (< off 10) 1/2 1)
                        :pitch (ecase v
                                 (1 (+ 60 (random 25)))
                                 (2 (+ 35 (random 25))))
                        :voice v
                        :marks (if (< (random 1.0) 0.5)
                                   '("..)")
                                   '())))))

lsp042.png

Figure 7.26: Slurs using End Marks

7.5.1 Modifying Spanner Mark Behavior

By default, spanner marks do not touch, span rests or span across single notes. This behavior can be changed at any level (in a note, measure, part or the entire score) with settings. The settings controlling default slur behavior, for example, are slurs-canspanrests and slurs-cantouch.

(fms:with-score
    (:filename *filename*
     :sets '(:slurs-cantouch t)
     :parts '((:id pno :inst :piano)))
  (loop
     for v from 1 to 2
     do (loop
           for off from 0 to 10 by 1/2
           do (fms:note :time off
                        :dur (if (< off 10) 1/2 1)
                        :pitch (ecase v
                                 (1 (+ 60 (random 25)))
                                 (2 (+ 35 (random 25))))
                        :voice v
                        :marks (if (< (random 1.0) 0.5)
                                   '("(..")
                                   '())))))

lsp043.png

Figure 7.27: Touching Slurs

Individual spanner behavior can also be changed by appending character “flags” to the mark ids. Appending an ‘r’, for example, indicates that the mark can span rests ‘n’ indicates it should span notes only. ‘1’ indicates that the mark can span a single note, while ‘m’ indicates it can only span multiple notes. The example below uses ‘-’ and ‘|’ to indicate whether the slurs can touch or not. Not all of these flags are valid for every spanner mark (you cannot append ‘1’ or ‘m’ to slur marks, for example).

(fms:with-score
    (:filename *filename*
     :parts '((:id pno :inst :piano)))
  (loop
     for v from 1 to 2
     do (loop
           for off from 0 to 10 by 1/2
           do (fms:note :time off
                        :dur (if (< off 10) 1/2 1)
                        :pitch (ecase v
                                 (1 (+ 60 (random 25)))
                                 (2 (+ 35 (random 25))))
                        :voice v
                        :marks (if (< (random 1.0) 0.5)
                                   (ecase v
                        	     (1 '("(-.."))
                        	     (2 '("(|..")))
                                   '())))))

lsp044.png

Figure 7.28: Marks with Flags

The following example shows how crescendo/decrescendo wedges can be made to span single notes. wedges-cantouch is also set to allow the marks to begin and end on the same note.

(fms:with-score
    (:filename *filename*
     :sets '(:transpose-keysigs nil
             :wedges-canspanone t
             :wedges-cantouch t)
     :parts '((:id tpt :inst :bflat-trumpet)))
  (loop
     with cresc = t
     for off from 0 to 10 by 2
     do (fms:note :time off
                  :dur 2
                  :pitch (+ 70 (random 5))
                  :marks (when (< (random 1.0) 0.5)
                           (prog1
                               (if cresc '("<..") '(">.."))
                             (setf cresc (not cresc)))))))

lsp045.png

Figure 7.29: Wedges

The beginnings and ends of these spanner marks are attached to noteheads. A few spanners, like crescendo/decrescendo wedges, can be “detached” or separated from noteheads and appear independently in the score. See Mark Events (Lisp) for examples of how to do this.

7.5.2 Continue Marks

Another way to specify where spanners begin and end is to use “continue” marks. Continue marks simplify specifying spanners in programming environments such as Lisp. To use them, place a continue mark over every note event that falls under a spanner and, if necessary, include begin or end marks to resolve any ambiguities. FOMUS places begin or end marks where they are missing at the beginnings or ends of any contiguous set of continue marks within a single voice.

Continue marks are indicated by surrounding the base spanner mark symbol with two dots, one on either side. For example, .(. signifies a slur continue mark while .<. signifies a crescendo continue mark.

(fms:with-score
    (:filename *filename*
     :parts '((:id pno :inst :piano)))
  (loop
     for off from 0 to 10 by 1/2
     for slurend = (< (random 1.0) 0.333)
     for sluron = (if slurend (< (random 1.0) 0.5) sluron)
     do (fms:note :time off
                  :dur (if (< off 10) 1/2 1)
                  :pitch (+ 60 (random 25))
                  :marks (append
                          (when (and slurend sluron) '(("(..")))
                          (when sluron '((".(.")))))))

lsp049.png

Figure 7.30: Continue Marks