| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Let us now put what we have learned into practice with a few examples which show how tweaks may be used to change the appearance of the printed music.
| 4.3.1 Visibility and color of objects | ||
| 4.3.2 Size of objects | ||
| 4.3.3 Length and thickness of objects |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
In the educational use of music we might wish to print a score with certain elements omitted as an exercise for the student, who is required to supply them. As a simple example, let us suppose the exercise is to supply the missing bar lines in a piece of music. But the bar lines are normally inserted automatically. How do we prevent them printing?
Before we tackle this, let us remember that object properties are grouped in what are called interfaces – see Properties found in interfaces. This is simply to group together those properties that may be used together to tweak a graphical object – if one of them is allowed for an object, so are the others. Some objects then use the properties in some interfaces, others use them from other interfaces. The interfaces which contain the properties used by a particular grob are listed in the IR at the bottom of the page describing that grob, and those properties may be viewed by looking at those interfaces.
We explained how to find information about grobs in Properties of layout objects. Using the same approach, we go to the IR to find the
layout object which prints bar lines. Going via Backend and
All layout objects we find there is a layout object called
BarLine. Its properties include two that control its
visibility: break-visibility and stencil. Barline also
supports a number of interfaces, including the grob-interface,
where we find the transparent and the color properties.
All of these can affect the visibility of bar lines (and, of course,
by extension, many other layout objects too.) Let’s consider each of
these in turn.
The stencil property | ||
The break-visibility property | ||
The transparent property | ||
The color property |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
stencil propertyThis property controls the appearance of the bar lines by specifying
the symbol (glyph) which should be printed. In common
with many other properties, it can be set to print nothing by
setting its value to #f. Let’s try it, as before, omitting
the implied Context, Voice:
\relative { \time 12/16 \override BarLine.stencil = ##f c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 }
The bar lines are still printed. What is wrong? Go back to the IR
and look again at the page giving the properties of BarLine. At the
top of the page it says “Barline objects are created by:
Bar_engraver”. Go to the Bar_engraver page. At the bottom it
gives a list of Contexts in which the bar engraver operates. All of
them are of the type Staff, so the reason the \override
command failed to work as expected is because Barline is not in
the default Voice context. If the context is specified
incorrectly, the command simply does not work. No error message is
produced, and nothing is logged in the log file. Let’s try correcting
it by adding the correct context:
\relative { \time 12/16 \override Staff.BarLine.stencil = ##f c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 }
Now the bar lines have vanished. Setting the stencil
property to #f is such a frequent operation that there is a
shorthand for it called \omit:
\relative { \time 12/16 \omit Staff.BarLine c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 }
Note, though, that setting the stencil property to #f
will cause errors when the dimensions of the object are required for
correct processing. For example, errors will be generated if the
stencil property of the NoteHead object is set to
#f. If this is the case, you can instead use the
point-stencil function, which sets the stencil to an object
with zero size:
\relative { c''4 c \once \override NoteHead.stencil = #point-stencil c4 c }
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
break-visibility propertyWe see from the BarLine properties in the IR that the
break-visibility property requires a vector of three booleans.
These control respectively whether bar lines are printed at the end of
a line, in the middle of lines, and at the beginning of lines. For
our example we want all bar lines to be suppressed, so the value we
need is #(#f #f #f) (also available
under the name all-invisible). Let’s try that, remembering to include
the Staff context. Note also that in writing this value we
have ## before the opening parenthesis. One # is required
as part of vector constant syntax, and the first # is
required, as always, to precede the value itself in the
\override command.
\relative { \time 12/16 \override Staff.BarLine.break-visibility = ##(#f #f #f) c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 }
And we see this too removes all the bar lines.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
transparent propertyWe see from the properties specified in the grob-interface page
in the IR that the transparent property is a boolean. This
should be set to #t to make the grob transparent. In this next
example let us make the time signature invisible rather than the bar
lines. To do this we need to find the grob name for the time
signature. Back to the ‘All layout objects’ page in the IR to find
the properties of the TimeSignature layout object. This is
produced by the Time_signature_engraver which you can check
also lives in the Staff context and also supports the
grob-interface. So the command to make the time signature
transparent is:
\relative { \time 12/16 \override Staff.TimeSignature.transparent = ##t c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 }
Again, setting the transparent property is a rather
frequent operation, so we have a shorthand for it called
\hide:
\relative { \time 12/16 \hide Staff.TimeSignature c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 }
In either case, the time signature is gone, but this command
leaves a gap where
the time signature should be. Maybe this is what is wanted for
an exercise for the student to fill it in, but in other
circumstances a gap might be undesirable. To remove it, the
stencil for the time signature should be set to #f
instead:
\relative { \time 12/16 \omit Staff.TimeSignature c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 }
and the difference is obvious: setting the stencil to #f
(possibly via \omit)
removes the object entirely; making the object transparent
(which can be done using \hide)
leaves it where it is, but makes it invisible.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
color propertyFinally let us try making the bar lines invisible by coloring them white. (There is a difficulty with this in that the white bar line may or may not blank out the staff lines where they cross. You may see in some of the examples below that this happens unpredictably. The details of why this is so and how to control it are covered in (notation)Painting objects white section ‘Painting objects white’ in Notation Reference. But at the moment we are learning about color, so please just accept this limitation for now.)
The grob-interface specifies that the
color property value is a list, but there is no
explanation of what that list should be. The list it
requires is actually a list of values in internal units,
but, to avoid having to know what these are, several ways
are provided to specify colors. The first way is to use one
of the predefined ‘CSS’ colors listed in
(notation)List of colors section ‘List of colors’ in Notation Reference. To set the bar lines to white
we write:
\relative { \time 12/16 \override Staff.BarLine.color = "white" c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 }
and again, we see the bar lines are not visible. Note that white is not preceded by an apostrophe – it is not a symbol, but a character string, mapped to a predefined list of internal values. In that regard, LilyPond’s syntax mimics the CSS language commonly used in webpages; in addition to predefined names, we can specify a hexadecimal color code:
\relative { \time 12/16 \override Staff.BarLine.color = "#FFFFFF" c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 }
We could even define that color as a variable, and then use that variable as a property definition. Since it is both a LilyPond variable and a Scheme object, it can be prefixed with a backslash or with a hash character without any difference:
whiteVar = "#FFFFFF" \relative { \time 12/16 \override Staff.BarLine.color = \whiteVar c''4 b8 c d16 c d8 | \override Staff.BarLine.color = #whiteVar g,8 a16 b8 c d4 e16 | e8 }
Another way of adding colors to your score is by using a function.
There are two useful functions in this regard; one is the
x11-color function, which we’ll get to use shortly.
The other one, the rgb-color function, closely
demonstrates LilyPond’s internal logic: it takes
three arguments giving the intensities of the red, green and
blue colors. These take values in the range 0 to 1. So to
set the color to red the value should be (rgb-color 1 0 0)
and to white it should be (rgb-color 1 1 1):
\relative { \time 12/16 \override Staff.BarLine.color = #(rgb-color 1 1 1) c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 }
Note that in this case the whole function call has to be
enclosed in parentheses. The same can be said of the
x11-color function which we just skipped over.
x11-color, again, maps predefined color names
to internal values – but offers many more choices
than CSS names, as you can see in
(notation)List of colors section ‘List of colors’ in Notation Reference).
For example, the X11 set of colors includes an extensive
grey scale, whose names range from black, 'grey0,
to white, 'grey100, in steps of 1. Let’s illustrate
this by setting all the layout objects in our example to
various shades of grey:
\relative { \time 12/16 \override Staff.StaffSymbol.color = #(x11-color 'grey30) \override Staff.TimeSignature.color = #(x11-color 'grey60) \override Staff.Clef.color = #(x11-color 'grey60) \override Voice.NoteHead.color = #(x11-color 'grey85) \override Voice.Stem.color = #(x11-color 'grey85) \override Staff.BarLine.color = #(x11-color 'grey10) c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 }
Note the contexts associated with each of the layout objects. It is important to get these right, or the commands will not work! Remember, the context is the one in which the appropriate engraver is placed. The default context for engravers can be found by starting from the layout object, going from there to the engraver which produces it, and on the engraver page in the IR it tells you in which context the engraver will normally be found.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Let us begin by looking again at the earlier example (see Nesting music expressions) which showed how to introduce a new temporary staff, as in an (music-glossary)ossia section ‘ossia’ in Music Glossary.
\new Staff ="main" { \relative { r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } \new Staff \with { alignAboveContext = "main" } { f8 f c } >> r4 | } }
Ossia are normally written without clef and time signature, and
are usually printed slightly smaller than the main staff. We
already know now how to remove the clef and time signature –
we simply set the stencil of each to #f, as follows:
\new Staff ="main" { \relative { r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } \new Staff \with { alignAboveContext = "main" } { \omit Staff.Clef \omit Staff.TimeSignature { f8 f c } } >> r4 | } }
where the extra pair of braces after the \with clause are
required to ensure the enclosed overrides and music are applied
to the ossia staff.
But what is the difference between modifying the staff context by
using \with and modifying the stencils of the clef and the
time signature with \override, or in this case
\omit?
The main difference is that
changes made in a \with clause are made at the time the
context is created, and remain in force as the default
values for the duration of that context, whereas
\set or \override commands embedded in the
music are dynamic – they make changes synchronized with
a particular point in the music. If changes are unset or
reverted using \unset or \revert they return to
their default values, which will be the ones set in the
\with clause, or if none have been set there, the normal
default values.
Some context properties can be modified only in \with clauses.
These are those properties which cannot sensibly be changed after the
context has been created. alignAboveContext and its partner,
alignBelowContext, are two such properties – once the staff
has been created its alignment is decided and it would make no sense
to try to change it later.
The default values of layout object properties can also be set
in \with clauses. Simply use the normal \override
command leaving out the context name, since this is unambiguously
defined as the context which the \with clause is modifying.
If fact, an error will be generated if a context is specified
in this location.
So we could replace the example above with
\new Staff ="main" { \relative { r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } \new Staff \with { alignAboveContext = "main" % Don't print clefs in this staff \override Clef.stencil = ##f % Don't print time signatures in this staff \override TimeSignature.stencil = ##f } { f8 f c } >> r4 | } }
It turns out that we can also employ the shorthands \hide
and \omit for setting the transparent property and
clearing the stencil here, leading to the result
\new Staff ="main" { \relative { r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } \new Staff \with { alignAboveContext = "main" % Don't print clefs in this staff \omit Clef % Don't print time signatures in this staff \omit TimeSignature } { f8 f c } >> r4 | } }
Finally we come to changing the size of layout objects.
Some layout objects are created as glyphs selected from a typeface
font. These include note heads, accidentals, markup, clefs, time
signatures, dynamics and lyrics. Their size is changed by modifying
the font-size property, as we shall shortly see. Other layout
objects such as slurs and ties – in general, spanner objects – are
drawn individually, so there is no font-size associated with
them. These objects generally derive their size from the objects to
which they are attached, so usually there is no need to change their
size manually. Still other properties such as the length of stems and
bar lines, thickness of beams and other lines, and the separation of
staff lines all need to be modified in special ways.
Returning to the ossia example, let us first change the font-size.
We can do this in two ways. We can either change the size of the
fonts of each object type, like NoteHeads with commands
like
\override NoteHead.font-size = #-2 |
or we can change the size of all fonts by setting a special
property, fontSize, using \set, or by including
it in a \with clause (but without the \set).
\set fontSize = #-2 |
Both of these statements would cause the font size to be reduced by 2 steps from its previous value, where each step reduces or increases the size by approximately 12%.
Let’s try it in our ossia example:
\new Staff ="main" { \relative { r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } \new Staff \with { alignAboveContext = "main" \omit Clef \omit TimeSignature % Reduce all font sizes by ~24% fontSize = #-2 } { f8 f c } >> r4 | } }
This is still not quite right. The note heads and flags are smaller, but the stems are too long in proportion and the staff lines are spaced too widely apart. These need to be scaled down in proportion to the font reduction. The next sub-section discusses how this is done.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Distances and lengths in LilyPond are generally measured in
staff-spaces, the distance between adjacent lines in the staff,
(or occasionally half staff spaces) while most thickness
properties are measured in units of an internal property called
line-thickness. For example, by default, the lines of
hairpins are given a thickness of 1 unit of line-thickness,
while the thickness of a note stem is 1.3. Note, though,
that some thickness properties are different; for example, the
thickness of beams is controlled by the value of the
beam-thickness property, which is measured in staff-spaces.
So how are lengths to be scaled in proportion to the font size?
This can be done with the help of a special function called
magstep provided for exactly this purpose. It takes
one argument, the change in font size (#-2 in the example above)
and returns a scaling factor suitable for reducing other
objects in proportion. It is used like this:
\new Staff ="main" { \relative { r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } \new Staff \with { alignAboveContext = "main" \omit Clef \omit TimeSignature fontSize = #-2 % Reduce stem length and line spacing to match \override StaffSymbol.staff-space = #(magstep -2) } { f8 f c } >> r4 | } }
Since the length of stems and many other length-related properties are
always calculated relative to the value of the staff-space
property these are automatically scaled down in length too. Note that
this affects only the vertical scale of the ossia – the horizontal
scale is determined by the layout of the main music in order to remain
synchronized with it, so it is not affected by any of these changes in
size. Of course, if the scale of all the main music were changed in
this way then the horizontal spacing would be affected. This is
discussed later in the layout section.
This, then, completes the creation of an ossia. The sizes and lengths of all other objects may be modified in analogous ways.
For small changes in scale, as in the example above, the
thickness of the various drawn lines such as bar lines,
beams, hairpins, slurs, etc does not usually require global
adjustment. If the thickness of any particular layout object
needs to be adjusted this can be best achieved by overriding its
thickness property. An example of changing the thickness
of slurs was shown above in Properties of layout objects.
The thickness of all drawn objects (i.e., those not produced
from a font) may be changed in the same way.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] |
This document was generated by gub on July 13, 2020 using texi2html 1.82.
Other languages: català, česky, deutsch, español, français, italiano, 日本語, nederlands.
About automatic language selection.