“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 |
|
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 |
|
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 |
|
Figure 8.24: Slurs using End Marks
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 |
|
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 |
|
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 |
|
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.
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 |
|
Figure 8.28: Continue Marks