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


8.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:

process myproc ()
  for off from 0 to 10 by 1/2
  for slurend = odds(.5)
  for sluron = not(slurend) then #?(slurend, not(sluron), sluron)
  fms:note(time: off, dur: #?(off < 10, 1/2 , 1),
           pitch: between(60, 85),
           marks: #?(slurend, #?(sluron, {"..)"}, {"(.."}), {}))
end

begin
  with parts = {{:id "apart" :inst "piano"}}
  sprout(myproc(), *filename*, parts: parts)
end

sal040.png

Figure 8.22: 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).

process myproc ()
  for v from 1 to 2
  loop for off from 0 to 10 by 1/2
    fms:note(time: off, dur: #?(off < 10, 1/2 , 1),
             pitch: #?(v = 2, between(35, 60), between(60, 85)),
             voice: v, marks: odds(.5, {"(.."}, {}))
  end
end

begin
  with parts = {{:id "apart" :inst "piano"}}
  sprout(myproc(), *filename*, parts: parts)
end

sal004.png

Figure 8.23: Slurs using Begin Marks

End marks may also be used by themselves:

process myproc ()
  for v from 1 to 2
  loop for off from 0 to 10 by 1/2
    fms:note(time: off, dur: #?(off < 10, 1/2 , 1),
             pitch: #?(v = 2, between(35, 60), between(60, 85)),
             voice: v, marks: odds(.5, {"..)"}, {}))
  end
end

begin
  with parts = {{:id "apart" :inst "piano"}}
  sprout(myproc(), *filename*, parts: parts)
end

sal041.png

Figure 8.24: Slurs using End Marks

8.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.

process myproc ()
  for v from 1 to 2
  loop for off from 0 to 10 by 1/2
    fms:note(time: off, dur: #?(off < 10, 1/2 , 1),
             pitch: #?(v = 2, between(35, 60), between(60, 85)),
             voice: v, marks: odds(.5, {"(.."}, {}))
  end
end

begin
  with sets = {:slurs-cantouch #t},
       parts = {{:id "apart" :inst "piano"}}
  sprout(myproc(), *filename*, sets: sets, parts: parts)
end

sal042.png

Figure 8.25: 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).

process myproc ()
  for v from 1 to 2
  loop for off from 0 to 10 by 1/2
    fms:note(time: off, dur: #?(off < 10, 1/2 , 1),
             pitch: #?(v = 2, between(35, 60), between(60, 85)),
             voice: v, marks: odds(.5, #?(v = 1, {"(-.."}, {"(|.."}), {}))
  end
end

begin
  with parts = {{:id "apart" :inst "piano"}}
  sprout(myproc(), *filename*, parts: parts)
end

sal043.png

Figure 8.26: 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.

process myproc ()
    for off from 0 to 10 by 2
    for switch = odds(.5)
    for cresc = switch then #?(switch, not(cresc), cresc)
    fms:note(time: off, dur: 2,
             pitch: between(70, 75),
             marks: #?(switch, #?(cresc, {"<.."}, {">.."}), {}))
end

begin
  with sets = {:transpose-keysigs #f
               :wedges-canspanone #t
               :wedges-cantouch #t},
       parts = {{:id "tpt" :inst "bflat-trumpet"}}
  sprout(myproc(), *filename*, sets: sets, parts: parts)
end

sal044.png

Figure 8.27: 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 (SAL) for examples of how to do this.

8.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 SAL. 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.

process myproc ()
  for off from 0 to 10 by 1/2
  for slurend = odds(.333)
  for sluron = #?(slurend, odds(.5), sluron)
  fms:note(time: off, dur: #?(off < 10, 1/2 , 1),
           pitch: between(60, 85),
           marks: append(#?(slurend & sluron, {{"(.."}}, {}),
                         #?(sluron, {{".(."}}, {})))
end

begin
  with parts = {{:id "apart" :inst "piano"}}
  sprout(myproc(), *filename*, parts: parts)
end

sal048.png

Figure 8.28: Continue Marks