LilyPond snippets: Editorial annotations

# Editorial annotations

Editorial annotations

## Adding fingerings to a score

Fingering instructions can be entered using a simple syntax.

    \relative c'' {
      c4-1 d-2 f-4 e-3
    }

## Adding links to objects

To add a link to a grob-stencil you could use `add-link` as defined here. Works with `\override` and `\tweak`.

Drawback: `point-and-click` will be disturbed for the linked grobs.

Limitation: Works for PDF only.

The linked objects are colored with a separate command.

    #(define (add-link url-strg)
      (lambda (grob)
        (let* ((stil (ly:grob-property grob 'stencil)))
          (if (ly:stencil? stil)
            (begin
              (let* (
                 (x-ext (ly:stencil-extent stil X))
                 (y-ext (ly:stencil-extent stil Y))
                 (url-expr `(url-link url-strg ,x-ext ,y-ext))
                 (new-stil (ly:stencil-add
                     (ly:make-stencil url-expr x-ext y-ext) stil)))
              (ly:grob-set-property! grob 'stencil new-stil)))
            #f))))

    %%%% test

    urlI =
    "https://lilypond.org/doc/v2.14/Documentation/notation/writing-pitches"

    urlII =
    "https://lilypond.org/doc/v2.14/Documentation/notation/rhythms"

    urlIII =
    "https://lilypond.org/doc/v2.14/Documentation/notation/note-heads"

    urlIV =
    "https://lilypond.org/doc/v2.14/Documentation/notation/beams"

    urlV =
    "https://lilypond.org/doc/v2.14/Documentation/notation/note-head-styles"

    \relative c' {
      \key cis \minor

      \once \override Staff.Clef.color = #green
      \once \override Staff.Clef.after-line-breaking =
        #(add-link urlI)

      \once \override Staff.TimeSignature.color = #green
      \once \override Staff.TimeSignature.after-line-breaking =
        #(add-link urlII)

      \once \override NoteHead.color = #green
      \once \override NoteHead.after-line-breaking =
        #(add-link urlIII)

      cis'1
      \once \override Beam.color = #green
      \once \override Beam.after-line-breaking =
        #(add-link urlIV)
      cis8 dis e fis gis2
      <gis,
       % With 2.17.9 you could use the command below to address the Accidental.
       % \tweak Accidental.before-line-breaking #(add-link url)
       \tweak color #green
       \tweak after-line-breaking #(add-link urlV)
       \tweak style #'harmonic
       bis
       dis
       fis
      >1
      <cis, cis' e>
    }

## Adding markups in a tablature

By default markups does not show in a tablature.

To make them appear, simply use the command `\revert TabStaff.TextScript.stencil`

    %% http://lsr.di.unimi.it/LSR/Item?id=919
    % by P.P.Schneider on June 2014

    high  = { r4 r8 <g c'> q r8 r4 }

    low = { c4 r4 c8 r8 g,8 b, }

    pulse = { s8^"1" s^"&" s^"2" s^"&" s^"3" s^"&" s^"4" s^"&" }

    \score {
     \new TabStaff {
       \repeat unfold 2 << \high \\ \low \\ \pulse >>
      }
      \layout {
        \context {
          \TabStaff
          \clef moderntab
          \revert TextScript.stencil
          \override TextScript.font-series = #'bold
          \override TextScript.font-size = #-2
          \override TextScript.color = #red

        }
        \context {
          \Score
          proportionalNotationDuration = #(ly:make-moment 1/8)
        }
      }
    }

## Allowing fingerings to be printed inside the staff

By default, vertically oriented fingerings are positioned outside the staff; that behavior, however, may be disabled. Attention needs to be paid to situations where fingerings and stems are in the same direction: by default, fingerings will avoid only beamed stems. That setting can be changed to avoid no stems or all stems; the following example demonstrates these two options, as well as how to go back to the default behavior.

    \relative c' {
      <c-1 e-2 g-3 b-5>2
      \override Fingering.staff-padding = #'()
      <c-1 e-2 g-3 b-5>4 g'-0
      a8[-1 b]-2 g-0 r
      \override Fingering.add-stem-support = ##f
      a[-1 b]-2 g-0 r
      \override Fingering.add-stem-support = ##t
      a[-1 b]-2 g-0 r
      \override Fingering.add-stem-support = #only-if-beamed
      a[-1 b]-2 g-0 r
    }

## Alternative bar numbering

Two alternative methods for bar numbering can be set, especially for when using repeated music.

    \relative c'{
      \set Score.alternativeNumberingStyle = #'numbers
      \repeat volta 3 { c4 d e f | }
        \alternative {
          { c4 d e f | c2 d \break }
          { f4 g a b | f4 g a b | f2 a | \break }
          { c4 d e f | c2 d }
        }
      c1 \break
      \set Score.alternativeNumberingStyle = #'numbers-with-letters
      \repeat volta 3 { c,4 d e f | }
        \alternative {
          { c4 d e f | c2 d \break }
          { f4 g a b | f4 g a b | f2 a | \break }
          { c4 d e f | c2 d }
        }
      c1
    }

## Analysis brackets above the staff

Simple horizontal analysis brackets are added below the staff by default. The following example shows a way to place them above the staff instead.

    \layout {
      \context {
        \Voice
        \consists "Horizontal_bracket_engraver"
      }
    }

    \relative c'' {
      \once \override HorizontalBracket.direction = #UP
      c2\startGroup
      d2\stopGroup
    }

## Analysis brackets with labels

Text may be added to analysis brackets through the `text` property of the `HorizontalBracketText` grob. Adding different texts to brackets beginning at the same time requires the `\tweak` command. Bracket text will be parenthesized after a line break.

    \layout {
      \context {
        \Voice
        \consists "Horizontal_bracket_engraver"
        \override HorizontalBracket.direction = #UP
      }
    }

    {
      \once\override HorizontalBracketText.text = "a"
        c''\startGroup d''\stopGroup
        \once\override HorizontalBracketText.text = "a'"
        e''\startGroup d''\stopGroup |
      c''-\tweak HorizontalBracketText.text
            \markup \bold \huge "b" \startGroup
         -\tweak HorizontalBracketText.text "a" \startGroup
        d''\stopGroup
        e''-\tweak HorizontalBracketText.text "a'" \startGroup
        d''\stopGroup\stopGroup |
      c''-\tweak HorizontalBracketText.text foo \startGroup
        d'' e'' f'' | \break
      g'' a'' b'' c'''\stopGroup
    }

## Applying note head styles depending on the step of the scale

The `shapeNoteStyles` property can be used to define various note head styles for each step of the scale (as set by the key signature or the `tonic` property).

This property requires a set of symbols, which can be purely arbitrary (geometrical expressions such as `triangle`, `cross`, and `xcircle` are allowed) or based on old American engraving tradition (some latin note names are also allowed).

That said, to imitate old American song books, there are several predefined note head styles available through shortcut commands such as `\aikenHeads` or `\sacredHarpHeads`.

This example shows different ways to obtain shape note heads, and demonstrates the ability to transpose a melody without losing the correspondence between harmonic functions and note head styles.

    fragment = {
      \key c \major
      c2 d
      e2 f
      g2 a
      b2 c
    }

    \new Staff {
      \transpose c d
      \relative c' {
        \set shapeNoteStyles = ##(do re mi fa
                                   #f la ti)
        \fragment
      }

      \break

      \relative c' {
        \set shapeNoteStyles = ##(cross triangle fa #f
                                   mensural xcircle diamond)
        \fragment
      }
    }

## Blanking staff lines using the \whiteout command

The `\whiteout` command underlays a markup with a white box. Since staff lines are in a lower layer than most other grobs, this white box will not overlap any other grob.

    \layout {
      ragged-right = ##f
    }

    \relative c' {
      \override TextScript.extra-offset = #'(2 . 4)
      c2-\markup { \whiteout \pad-markup #0.5 "middle C" } c
    }

## Changing a single note’s size in a chord

Individual note heads in a chord can be modified with the `\tweak` command inside a chord, by altering the `font-size` property.

Inside the chord (within the brackets `< >`), before the note to be altered, place the `\tweak` command, followed by `font-size` and define the proper size like `#-2` (a tiny note head).

    \relative c' {
      <\tweak font-size #+2 c e g c
       \tweak font-size #-2 e>1
       ^\markup { A tiny e }_\markup { A big c }
    }

## Changing the appearance of a slur from solid to dotted or dashed

The appearance of slurs may be changed from solid to dotted or dashed.

    \relative c' {
      c4( d e c)
      \slurDotted
      c4( d e c)
      \slurSolid
      c4( d e c)
      \slurDashed
      c4( d e c)
      \slurSolid
      c4( d e c)
    }

## Coloring notes depending on their pitch

It is possible to color note heads depending on their pitch and/or their names: the function used in this example even makes it possible to distinguish enharmonics.

    %Association list of pitches to colors.
    #(define color-mapping
       (list
        (cons (ly:make-pitch 0 0 NATURAL) (x11-color 'red))
        (cons (ly:make-pitch 0 0 SHARP) (x11-color 'green))
        (cons (ly:make-pitch 0 1 FLAT) (x11-color 'green))
        (cons (ly:make-pitch 0 2 NATURAL) (x11-color 'red))
        (cons (ly:make-pitch 0 2 SHARP) (x11-color 'green))
        (cons (ly:make-pitch 0 3 FLAT) (x11-color 'red))
        (cons (ly:make-pitch 0 3 NATURAL) (x11-color 'green))
        (cons (ly:make-pitch 0 4 SHARP) (x11-color 'red))
        (cons (ly:make-pitch 0 5 NATURAL) (x11-color 'green))
        (cons (ly:make-pitch 0 5 FLAT) (x11-color 'red))
        (cons (ly:make-pitch 0 6 SHARP) (x11-color 'red))
        (cons (ly:make-pitch 0 1 NATURAL) (x11-color 'blue))
        (cons (ly:make-pitch 0 3 SHARP) (x11-color 'blue))
        (cons (ly:make-pitch 0 4 FLAT) (x11-color 'blue))
        (cons (ly:make-pitch 0 5 SHARP) (x11-color 'blue))
        (cons (ly:make-pitch 0 6 FLAT) (x11-color 'blue))))

    %Compare pitch and alteration (not octave).
    #(define (pitch-equals? p1 p2)
       (and
        (= (ly:pitch-alteration p1) (ly:pitch-alteration p2))
        (= (ly:pitch-notename p1) (ly:pitch-notename p2))))

    #(define (pitch-to-color pitch)
       (let ((color (assoc pitch color-mapping pitch-equals?)))
         (if color
             (cdr color))))

    #(define (color-notehead grob)
       (pitch-to-color
        (ly:event-property (event-cause grob) 'pitch)))

    \score {
      \new Staff \relative c' {
        \override NoteHead.color = #color-notehead
        c8 b d dis ees f g aes
      }
    }

## Controlling the placement of chord fingerings

The placement of fingering numbers can be controlled precisely. For fingering orientation to apply, it must be used within a chord construct <>, even for single notes. Orientation for string numbers and right-hand fingerings may be set in a similar way.

    \relative c' {
      \set fingeringOrientations = #'(left)
      <c-1 e-3 a-5>4
      \set fingeringOrientations = #'(down)
      <c-1 e-3 a-5>4
      \set fingeringOrientations = #'(down right up)
      <c-1 e-3 a-5>4
      \set fingeringOrientations = #'(up)
      <c-1 e-3 a-5>4
      \set fingeringOrientations = #'(left)
      <c-1>2
      \set fingeringOrientations = #'(down)
      <e-3>2
      \set stringNumberOrientations = #'(up left down)
      <f\3 a\2 c\1>1
      \set strokeFingerOrientations = #'(down right up)
      <c\rightHandFinger #1 e\rightHandFinger #2 c'\rightHandFinger #4 >
    }

## Creating a delayed turn

Creating a delayed turn, where the lower note of the turn uses the accidental, requires several overrides. The `outside-staff-priority` property must be set to `#f`, as otherwise this would take precedence over the `avoid-slur property`. Changing the fractions `2/3` and `1/3` adjusts the horizontal position.

    \relative c'' {
      c2*2/3 ( s2*1/3\turn d4) r
      <<
        { c4.( d8) }
        { s4 s\turn }
      >>
      \transpose c d \relative c'' <<
        { c4.( d8) }
        {
          s4
          \once \set suggestAccidentals = ##t
          \once \override AccidentalSuggestion.outside-staff-priority = ##f
          \once \override AccidentalSuggestion.avoid-slur = #'inside
          \once \override AccidentalSuggestion.font-size = -3
          \once \override AccidentalSuggestion.script-priority = -1
          \single \hideNotes
          b8-\turn \noBeam
          s8
        }
      >>
    }

## Creating blank staves

To create blank staves, generate empty measures then remove the `Bar_number_engraver` from the `Score` context, and the `Time_signature_engraver`, `Clef_engraver` and `Bar_engraver` from the `Staff` context.

    #(set-global-staff-size 20)

    \score {
      {
        \repeat unfold 12 { s1 \break }
      }
      \layout {
        indent = 0\in
        \context {
          \Staff
          \remove "Time_signature_engraver"
          \remove "Clef_engraver"
          \remove "Bar_engraver"
        }
        \context {
          \Score
          \remove "Bar_number_engraver"
        }
      }
    }

    % uncomment these lines for "letter" size
    %{
    \paper {
      #(set-paper-size "letter")
      ragged-last-bottom = ##f
      line-width = 7.5\in
      left-margin = 0.5\in
      bottom-margin = 0.25\in
      top-margin = 0.25\in
    }
    %}

    % uncomment these lines for "A4" size
    %{
    \paper {
      #(set-paper-size "a4")
      ragged-last-bottom = ##f
      line-width = 180
      left-margin = 15
      bottom-margin = 10
      top-margin = 10
    }
    %}

## Creating double-digit fingerings

Creating fingerings larger than 5 is possible.

    \relative c' {
      c1-10
      c1-50
      c1-36
      c1-29
    }

## Default direction of stems on the center line of the staff

The default direction of stems on the center line of the staff is set by the `Stem` property `neutral-direction`.

    \relative c'' {
      a4 b c b
      \override Stem.neutral-direction = #up
      a4 b c b
      \override Stem.neutral-direction = #down
      a4 b c b
    }

## Different font size settings for instrumentName and shortInstrumentName

Choose different font sizes for instrumentName and shortInstrumentName as a context override.

    InstrumentNameFontSize =
    #(define-music-function (font-size-pair)(pair?)
    "Sets the @code{font-size} of @code{InstrumentName}.
    The font-size for the initial @code{instrumentName} is taken from the first
    value in @var{font-size-pair}.  @code{shortInstrumentName} will get the second
    value of @var{font-size-pair}.
    "

    ;; This code could be changed/extended to set different values for each
    ;; occurance of `shortInstrumentName'

    #{
      \override InstrumentName.after-line-breaking =
        #(lambda (grob)
           (let* ((orig (ly:grob-original grob))
                  (siblings (if (ly:grob? orig)
                                (ly:spanner-broken-into orig)
                                '())))
             (if (pair? siblings)
                 (begin
                   (ly:grob-set-property!
                     (car siblings)
                     'font-size
                     (car font-size-pair))
                   (for-each
                     (lambda (g)
                       (ly:grob-set-property! g 'font-size (cdr font-size-pair)))
                     (cdr siblings))))))
    #})

    \layout {
      \context {
        \Staff
        \InstrumentNameFontSize #'(6 . -3)
      }
    }

    \new StaffGroup <<
      \new Staff
         \with {
           instrumentName = "Flute"
           shortInstrumentName = "Fl."
         }
         { c''1 \break c'' \break c'' }
      \new Staff
       \with {
         instrumentName = "Violin"
         shortInstrumentName = "Vl."
       }
       { c''1 \break c'' \break c'' }
    >>

## Drawing boxes around grobs

The `print-function` can be overridden to draw a box around an arbitrary grob.

    \relative c'' {
      \override TextScript.stencil =
        #(make-stencil-boxer 0.1 0.3 ly:text-interface::print)
      c'4^"foo"

      \override Stem.stencil =
        #(make-stencil-boxer 0.05 0.25 ly:stem::print)
      \override Score.RehearsalMark.stencil =
        #(make-stencil-boxer 0.15 0.3 ly:text-interface::print)
      b8

      \revert Stem.stencil
      \revert Flag.stencil
      c4. c4
      \mark "F"
      c1
    }

## Drawing circles around note heads

Here is how to circle a note.

    circle =
    \once \override NoteHead.stencil = #(lambda (grob)
        (let* ((note (ly:note-head::print grob))
               (combo-stencil (ly:stencil-add
                   note
                   (circle-stencil note 0.1 0.8))))
              (ly:make-stencil (ly:stencil-expr combo-stencil)
                (ly:stencil-extent note X)
                (ly:stencil-extent note Y))))

    { \circle c'' }

## Drawing circles around various objects

The `\circle` markup command draws circles around various objects, for example fingering indications. For other objects, specific tweaks may be required: this example demonstrates two strategies for rehearsal marks and measure numbers.

    \relative c' {
      c1
      \set Score.markFormatter =
        #(lambda (mark context)
                 (make-circle-markup (format-mark-numbers mark context)))
      \mark \default

      c2 d^\markup {
        \override #'(thickness . 3) {
          \circle \finger 2
        }
      }
      \override Score.BarNumber.break-visibility = #all-visible
      \override Score.BarNumber.stencil =
        #(make-stencil-circler 0.1 0.25 ly:text-interface::print)
    }

## Embedding native PostScript in a \markup block

PostScript code can be directly inserted inside a `\markup` block.

    % PostScript is a registered trademark of Adobe Systems Inc.

    \relative c'' {
      a4-\markup { \postscript "3 4 moveto 5 3 rlineto stroke" }
      -\markup { \postscript "[ 0 1 ] 0 setdash 3 5 moveto 5 -3 rlineto stroke " }

      b4-\markup { \postscript "3 4 moveto 0 0 1 2 8 4 20 3.5 rcurveto stroke" }
      s2
      a'1
    }

## Grid lines: changing their appearance

The appearance of grid lines can be changed by overriding some of their properties.

    \score {
      \new ChoirStaff <<
        \new Staff {
          \relative c'' {
            \stemUp
            c'4. d8 e8 f g4
          }
        }
        \new Staff {
          \relative c {
            % this moves them up one staff space from the default position
            \override Score.GridLine.extra-offset = #'(0.0 . 1.0)
            \stemDown
            \clef bass
            \once \override Score.GridLine.thickness = #5.0
            c4
            \once \override Score.GridLine.thickness = #1.0
            g'4
            \once \override Score.GridLine.thickness = #3.0
            f4
            \once \override Score.GridLine.thickness = #5.0
            e4
          }
        }
      >>
      \layout {
        \context {
          \Staff
          % set up grids
          \consists "Grid_point_engraver"
          % set the grid interval to one quarter note
          gridInterval = #(ly:make-moment 1/4)
        }
        \context {
          \Score
          \consists "Grid_line_span_engraver"
          % this moves them to the right half a staff space
          \override NoteColumn.X-offset = #-0.5
        }
      }
    }

## Grid lines: emphasizing rhythms and notes synchronization

Regular vertical lines can be drawn between staves to show note synchronization; however, in case of monophonic music, you may want to make the second stave invisible, and make the lines shorter like in this snippet.

    \score {
      \new ChoirStaff {
        \relative c'' <<
          \new Staff {
            \time 12/8
            \stemUp
            c4. d8 e8 f g4 f8 e8. d16 c8
          }
          \new Staff {
            % hides staff and notes so that only the grid lines are visible
            \hideNotes
            \hide Staff.BarLine
            \override Staff.StaffSymbol.line-count = #0
            \hide Staff.TimeSignature
            \hide Staff.Clef

            % dummy notes to force regular note spacing
            \once  \override Score.GridLine.thickness = #4.0
            c8 c c
            \once  \override Score.GridLine.thickness = #3.0
            c8 c c
            \once  \override Score.GridLine.thickness = #4.0
            c8 c c
            \once  \override Score.GridLine.thickness = #3.0
            c8 c c
          }
        >>
      }
      \layout {
        \context {
          \Score
          \consists "Grid_line_span_engraver"
          % center grid lines horizontally below note heads
          \override NoteColumn.X-offset = #-0.5
        }
        \context {
          \Staff
          \consists "Grid_point_engraver"
          gridInterval = #(ly:make-moment 1/8)
          % set line length and positioning:
          % two staff spaces above center line on hidden staff
          % to four spaces below center line on visible staff
          \override GridPoint.Y-extent = #'(2 . -4)
        }
        ragged-right = ##t
      }
    }

## Hammer on and pull off using chords

When using hammer-on or pull-off with chorded notes, only a single arc is drawn. However “double arcs” are possible by setting the `doubleSlurs` property to `#t`.

    \new TabStaff {
      \relative c' {
        % chord hammer-on and pull-off
        \set doubleSlurs = ##t
        <g' b>8( <a c> <g b>)
      }
    }

## Hammer on and pull off using voices

The arc of hammer-on and pull-off is upwards in voices one and three and downwards in voices two and four:

    \new TabStaff {
      \relative c' {
        << { \voiceOne g2( a) }
        \\ { \voiceTwo a,( b) }
        >> \oneVoice
      }
    }

## Hammer on and pull off

Hammer-on and pull-off can be obtained using slurs.

    \new TabStaff {
      \relative c' {
        d4( e\2)
        a( g)
      }
    }

## How to print two rehearsal marks above and below the same barline (method 1)

This method prints two ’rehearsal marks’, one on top of the other. It shifts the lower rehearsal mark below the staff and then adds padding above it in order to place the upper rehearsal mark above the staff.

By adjusting the extra-offset and baseline-skip values you can increase or decrease the overall space between the rehearsal mark and the staff.

Because nearly every type of glyph or string can be made to behave like a rehearsal mark it is possible to centre those above and below a bar line.

Adding the appropriate ’break visibility’ as shown in snippet 1 will allow you to position two marks at the end of a line as well.

Note: Method 1 is less complex than Method 2 but does not really allow for fine tuning of placement of one of the rehearsal marks without affecting the other. It may also give some problems with vertical spacing, since using `extra-offset` does not change the bounding box of the mark from its original value.

    \relative c'{
      c d e f |
      \once \override Score.RehearsalMark.extra-offset = #'(0 . -8.5)
      \once \override Score.RehearsalMark.baseline-skip = #9
      \mark \markup \center-column { \circle 1 \box A }
      g f e d |
      \once \override Score.RehearsalMark.extra-offset = #'(0 . -8.5)
      \once \override Score.RehearsalMark.baseline-skip = #9
      \mark \markup \center-column { \flat { \bold \small \italic Fine. } }
      g f e d |
      \once \override Score.RehearsalMark.extra-offset = #'(0 . -8.5)
      \once \override Score.RehearsalMark.baseline-skip = #9
      \override Score.RehearsalMark.break-visibility = #begin-of-line-invisible
      \mark \markup \center-column { \fermata \box z }
    }

## How to print two rehearsal marks above and below the same barline (method 2)

This method prints two ’rehearsal marks’ - one above the stave and one below, by creating two voices, adding the Rehearsal Mark engraver to each voice - without this no rehearsal mark is printed - and then placing each rehearsal mark UP and DOWN in each voice respectively.

This method (as opposed to method 1) is more complex, but allows for more flexibility, should it be needed to tweak each rehearsal mark independently of the other.

    \score {
      \relative c'
      <<
        \new Staff {
          <<
            \new Voice \with {
              \consists Mark_engraver
              \consists "Staff_collecting_engraver"
            }
            { c4 d e f
              \mark \markup { \box A }
              c4 d e f
            }
            \new Voice \with {
              \consists Mark_engraver
              \consists "Staff_collecting_engraver"
              \override RehearsalMark.direction = #DOWN
            }
            { s4 s s s
              \mark \markup { \circle 1 }
              s4 s s s
            }
          >>
        }
      >>
      \layout {
        \context {
          \Score
          \remove "Mark_engraver"
          \remove "Staff_collecting_engraver"
        }
      }
    }

## Making some staff lines thicker than the others

For educational purposes, a staff line can be thickened (e.g., the middle line, or to emphasize the line of the G clef). This can be achieved by adding extra lines very close to the line that should be emphasized, using the `line-positions` property of the `StaffSymbol` object.

    {
      \override Staff.StaffSymbol.line-positions =
        #'(-4 -2 -0.2 0 0.2 2 4)
      d'4 e' f' g'
    }

## Marking notes of spoken parts with a cross on the stem

This example shows how to put crosses on stems. Mark the beginning of a spoken section with the `\speakOn` keyword, and end it with the `\speakOff` keyword.

    speakOn = {
      \override Stem.stencil =
        #(lambda (grob)
           (let* ((x-parent (ly:grob-parent grob X))
                  (is-rest? (ly:grob? (ly:grob-object x-parent 'rest))))
             (if is-rest?
                 empty-stencil
                 (ly:stencil-combine-at-edge
                  (ly:stem::print grob)
                  Y
                  (- (ly:grob-property grob 'direction))
                  (grob-interpret-markup grob
                                         (markup #:center-align #:fontsize -4
                                                 #:musicglyph "noteheads.s2cross"))
                  -2.3))))
    }

    speakOff = {
      \revert Stem.stencil
      \revert Flag.stencil
    }

    \score {
      \new Staff {
        \relative c'' {
          a4 b a c
          \speakOn
          g4 f r g
          b4 r d e
          \speakOff
          c4 a g f
        }
      }
    }

## Measure counter

This snippet provides a workaround for emitting measure counters using transparent percent repeats.

    <<
      \context Voice = "foo" {
        \clef bass
        c4 r g r
        c4 r g r
        c4 r g r
        c4 r g r
      }
      \context Voice = "foo" {
        \set countPercentRepeats = ##t
        \hide PercentRepeat
        \override PercentRepeatCounter.staff-padding = #1
        \repeat percent 4 { s1 }
      }
    >>

## Numbering groups of measures

This snippet demonstrates the use of the `Measure_counter_engraver` to number groups of successive measures. Any stretch of measures may be numbered, whether consisting of repetitions or not.

The engraver must be added to the appropriate context. Here, a `Staff` context is used; another possibility is a `Dynamics` context.

The counter is begun with `\startMeasureCount` and ended with `\stopMeasureCount`. Numbering will start by default with `1`, but this behavior may be modified by overriding the `count-from` property.

When a measure extends across a line break, the number will appear twice, the second time in parentheses.

    \layout {
      \context {
        \Staff
        \consists #Measure_counter_engraver
      }
    }

    \new Staff {
      \startMeasureCount
      \repeat unfold 7 {
        c'4 d' e' f'
      }
      \stopMeasureCount
      \bar "||"
      g'4 f' e' d'
      \override Staff.MeasureCounter.count-from = #2
      \startMeasureCount
      \repeat unfold 5 {
        g'4 f' e' d'
      }
      g'4 f'
      \bar ""
      \break
      e'4 d'
      \repeat unfold 7 {
        g'4 f' e' d'
      }
      \stopMeasureCount
    }

## Positioning fingering indications precisely

Generally the options available for positioning the fingering of chords work well by default, but if one of the indications needs to positioned more precisely the following tweak may be used. This is particularly useful for correcting the positioning when intervals of a second are involved.

    \relative c' {
      \set fingeringOrientations = #'(left)
      <c-1 d-2 a'-5>4
      <c-1 d-\tweak extra-offset #'(0 . 0.2)-2 a'-5>4
      \set fingeringOrientations = #'(down)
      <c-1 d-2 a'-5>4
      <c-\tweak extra-offset #'(0 . -1.1)-1
       d-\tweak extra-offset #'(-1.2 . -1.8)-2 a'-5>4
      \set fingeringOrientations = #'(down right up)
      <c-1 d-\tweak extra-offset #'(-0.3 . 0)-2 a'-5>4
      <c-1 d-\tweak extra-offset #'(-1 . 1.2)-2 a'-5>4
      \set fingeringOrientations = #'(up)
      <c-1 d-\tweak extra-offset #'(0 . 1.1)-2
       a'-\tweak extra-offset #'(0 . 1)-5>4
      <c-1 d-\tweak extra-offset #'(-1.2 . 1.5)-2
       a'-\tweak extra-offset #'(0 . 1.4)-5>4
    }

## Positioning text markups inside slurs

Text markups need to have the `outside-staff-priority` property set to false in order to be printed inside slurs.

    \relative c'' {
      \override TextScript.avoid-slur = #'inside
      \override TextScript.outside-staff-priority = ##f
      c2(^\markup { \halign #-10 \natural } d4.) c8
    }

## Printing text from right to left

It is possible to print text from right to left in a markup object, as demonstrated here.

    {
      b1^\markup {
        \line { i n g i r u m i m u s n o c t e }
      }
      f'_\markup {
        \override #'(text-direction . -1)
        \line { i n g i r u m i m u s n o c t e }
      }
    }

## String number extender lines

Make an extender line for string number indications, showing that a series of notes is supposed to be played all on the same string.

    stringNumberSpanner =
      #(define-music-function (StringNumber) (string?)
        #{
          \override TextSpanner.style = #'solid
          \override TextSpanner.font-size = #-5
          \override TextSpanner.bound-details.left.stencil-align-dir-y = #CENTER
          \override TextSpanner.bound-details.left.text =
            \markup { \circle \number $StringNumber }
        #})

    \relative c {
      \clef "treble_8"
      \stringNumberSpanner "5"
      \textSpannerDown
      a8\startTextSpan
      b c d e f\stopTextSpan
      \stringNumberSpanner "4"
      g\startTextSpan a
      bes4 a g2\stopTextSpan
    }

## Using PostScript to generate special note head shapes

When a note head with a special shape cannot easily be generated with graphic markup, PostScript code can be used to generate the shape. This example shows how a parallelogram-shaped note head is generated.

    parallelogram =
      #(ly:make-stencil (list 'embedded-ps
        "gsave
          currentpoint translate
          newpath
          0 0.25 moveto
          1.3125 0.75 lineto
          1.3125 -0.25 lineto
          0 -0.75 lineto
          closepath
          fill
          grestore" )
        (cons 0 1.3125)
        (cons -.75 .75))

    myNoteHeads = \override NoteHead.stencil = \parallelogram
    normalNoteHeads = \revert NoteHead.stencil

    \relative c'' {
      \myNoteHeads
      g4 d'
      \normalNoteHeads
      <f, \tweak stencil \parallelogram b e>4 d
    }

## Using the whiteout property

Any graphical object can be printed over a white background to mask parts of objects that lie beneath. This can be useful to improve the appearance of collisions in complex situations when repositioning objects is impractical. It is necessary to explicitly set the `layer` property to control which objects are masked by the white background.

In this example the collision of the tie with the time signature is improved by masking out the part of the tie that crosses the time signature by setting the `whiteout` property of `TimeSignature`. To do this `TimeSignature` is moved to a layer above `Tie`, which is left in the default layer of 1, and `StaffSymbol` is moved to a layer above `TimeSignature` so it is not masked.

    {
      \override Score.StaffSymbol.layer = #4
      \override Staff.TimeSignature.layer = #3
      b'2 b'~
      \once \override Staff.TimeSignature.whiteout = ##t
      \time 3/4
      b' r4
    }

#### LilyPond — Snippets v2.22.2 (stable-branch).