LilyPond snippets: Editorial annotations

# Editorial annotations

These snippets illustrate the Notation Reference, section 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
    }

## Allowing fingerings to be printed inside the staff

By default, vertically oriented fingerings are positioned outside the staff. However, this behavior can be canceled.

    \relative c' {
      <c-1 e-2 g-3 b-5>2
      \once \override Fingering #'staff-padding = #'()
      <c-1 e-2 g-3 b-5>2
    }

## 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
    }

## 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
    }

    \score {
      \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
        }
      }
      \layout { ragged-right = ##t }
    }

## Avoiding collisions with chord fingerings

Fingerings and string numbers applied to individual notes will automatically avoid beams and stems, but this is not true by default for fingerings and string numbers applied to the individual notes of chords. The following example shows how this default behavior can be overridden.

    \relative c' {
      \set fingeringOrientations = #'(up)
      \set stringNumberOrientations = #'(up)
      \set strokeFingerOrientations = #'(up)

      % Default behavior
      r8
      <f c'-5>8
      <f c'\5>8
      <f c'-\rightHandFinger #2 >8

      % Corrected to avoid collisions
      r8
      \override Fingering #'add-stem-support = ##t
      <f c'-5>8
      \override StringNumber #'add-stem-support = ##t
      <f c'\5>8
      \override StrokeFinger #'add-stem-support = ##t
      <f c'-\rightHandFinger #2 >8
    }

## 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 notehead).

    \relative {
      <\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 0) (x11-color 'red))
        (cons (ly:make-pitch 0 0 1/2) (x11-color 'green))
        (cons (ly:make-pitch 0 1 -1/2) (x11-color 'green))
        (cons (ly:make-pitch 0 2 0) (x11-color 'red))
        (cons (ly:make-pitch 0 2 1/2) (x11-color 'green))
        (cons (ly:make-pitch 0 3 -1/2) (x11-color 'red))
        (cons (ly:make-pitch 0 3 0) (x11-color 'green))
        (cons (ly:make-pitch 0 4 1/2) (x11-color 'red))
        (cons (ly:make-pitch 0 5 0) (x11-color 'green))
        (cons (ly:make-pitch 0 5 -1/2) (x11-color 'red))
        (cons (ly:make-pitch 0 6 1/2) (x11-color 'red))
        (cons (ly:make-pitch 0 1 0) (x11-color 'blue))
        (cons (ly:make-pitch 0 3 1/2) (x11-color 'blue))
        (cons (ly:make-pitch 0 4 -1/2) (x11-color 'blue))
        (cons (ly:make-pitch 0 5 1/2) (x11-color 'blue))
        (cons (ly:make-pitch 0 6 -1/2) (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.

    \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
    }

## 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`. The value of `halign` is used to position the turn horizontally.

    \relative c'' {
      \once \override TextScript #'avoid-slur = #'inside
      \once \override TextScript #'outside-staff-priority = ##f
      c2(^\markup \tiny \override #'(baseline-skip . 1) {
        \halign #-4
        \center-column {
          \sharp
          \musicglyph #"scripts.turn"
        }
      }
      d4.) c8
    }

## 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"
        }
      }
    }

    \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
    }

## 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
    }

## 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
      c4. c4
      \mark "F"
      c1
    }

## 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
            \override Staff.BarLine #'transparent = ##t
            \override Staff.StaffSymbol #'line-count = #0
            \override Staff.TimeSignature #'transparent = ##t
            \override Staff.Clef #'transparent = ##t

            % 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
      }
    }

## Making some staff lines thicker than the others

For pedagogical 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 #:hspace -1.025 #:fontsize -4
                  #:musicglyph "noteheads.s2cross"))
              -2.3 0))))
    }

    speakOff = {
      \revert Stem #'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
        \override PercentRepeat #'transparent = ##t
        \override PercentRepeatCounter #'staff-padding = #1
        \repeat percent 4 { s1 }
      }
    >>

## 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.7)-2 a'-5>4
      \set fingeringOrientations = #'(down)
      <c-1 d-2 a'-5>4
      <c-1 d-\tweak #'extra-offset #'(-1.2 . 0)-2 a'-5>4
      \set fingeringOrientations = #'(down right up)
      <c-1 d-2 a'-5>4
      <c-1 d-\tweak #'extra-offset #'(-1 . 1.2)-2 a'-5>4
      \set fingeringOrientations = #'(up)
      <c-1 d-2 a'-5>4
      <c-1 d-\tweak #'extra-offset #'(-1.2 . 0)-2 a'-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 }
      }
    }

## 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 0 0))

    myNoteHeads = \override NoteHead #'stencil = \parallelogram
    normalNoteHeads = \revert NoteHead #'stencil

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

#### Snippets List