LilyPond snippets: Tweaks and overrides

# Tweaks and overrides

Changing defaults

Tweaking output

## Ajout d’une indication d’octave pour une seule voix

Lorsque plusieurs voix cohabitent sur une même portée, déterminer l’octaviation d’une voix affecte la position des notes de toutes les voix, jusqu’à la fin du crochet d’octaviation. Si l’octaviation ne doit s’appliquer qu’à une seule voix, le `Ottava_spanner_engraver` devrait être déplacé dans le contexte `Voice`.

    \layout {
      \context {
        \Staff
        \remove Ottava_spanner_engraver
      }
      \context {
        \Voice
        \consists Ottava_spanner_engraver
      }
    }

    {
      \clef bass
      << { <g d'>1~ q2 <c' e'> }
      \\
        {
          r2.
          \ottava -1
          <b,,, b,,>4 ~ |
          q2
          \ottava 0
          <c e>2
        }
      >>
    }

## Ajout de liens à des objets

La fonction `add-link`, telle que définie ci-dessous, permet d’ajouter un lien au stencil d’un objet graphique. Elle s’emploie au sein d’un `\override` ou d’un `\tweak`.

À noter que le fonctionnemment du `point-and-click` est perturbé sur les objets ainsi liés.

Cette fonction n’est opérationnelle que pour une sortie PDF.

La coloration des objets liés s’obtient par une commande séparée.

    #(define (add-link url-strg)
      (lambda (grob)
        (let* ((stil (ly:grob-property grob 'stencil)))
          (if (ly:stencil? stil)
              (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))))))

    %%%% test

    %% For easier maintenance of this snippet the URL is formatted to use the
    %% actually used LilyPond version.
    %% Of course a literal URL would work as well.

    #(define major.minor-version
      (string-join (take (string-split (lilypond-version) #\.) 2) "."))

    urlI =
    #(format #f
      "http://lilypond.org/doc/v~a/Documentation/notation/writing-pitches"
      major.minor-version)

    urlII =
    #(format #f
      "http://lilypond.org/doc/v~a/Documentation/notation/rhythms"
      major.minor-version)

    urlIII =
    #(format #f
      "http://lilypond.org/doc/v~a/Documentation/notation/note-heads"
      major.minor-version)

    urlIV =
    #(format #f
      "http://lilypond.org/doc/v~a/Documentation/notation/beams"
      major.minor-version)

    urlV =
    #(format #f
      "http://lilypond.org/doc/v~a/Documentation/notation/note-head-styles"
      major.minor-version)

    urlVI =
    #(format #f
      "http://lilypond.org/doc/v~a/Documentation/notation/writing-pitches"
      major.minor-version)

    \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,
        \tweak Accidental.color #green
        \tweak Accidental.after-line-breaking #(add-link urlVI)
        \tweak color #green
        \tweak after-line-breaking #(add-link urlV)
        \tweak style #'harmonic
        bis
        dis
        fis
       >1
       <cis, cis' e>
    }

## Ajout de markups à une tablature

Par défaut, les markups n’apparaissent pas dans une tablature.

Il suffit, pour les voir apparaître, d’une simple commande `\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)
        }
      }
    }

## Ajout de marques temporelles à un long glissando

Lorsqu’un glissando s’étend dans la durée, on trouve parfois des indications temporelles, matérialisées par des hampes sans tête de note. De telles hampes permettent aussi d’indiquer des éléments intermédiaires.

L’alignement des hampes avec la ligne de glissando peut requérir quelques aménagements.

    glissandoSkipOn = {
      \override NoteColumn.glissando-skip = ##t
      \hide NoteHead
      \override NoteHead.no-ledgers = ##t
    }

    glissandoSkipOff = {
      \revert NoteColumn.glissando-skip
      \undo \hide NoteHead
      \revert NoteHead.no-ledgers
    }

    \relative c'' {
      r8 f8\glissando
      \glissandoSkipOn
      f4 g a a8\noBeam
      \glissandoSkipOff
      a8

      r8 f8\glissando
      \glissandoSkipOn
      g4 a8
      \glissandoSkipOff
      a8 |

      r4 f\glissando \<
      \glissandoSkipOn
      a4\f \>
      \glissandoSkipOff
      b8\! r |
    }

## Ajustement de l’espacement des notes d’ornement

La propriété `spacing-increment` de `Score.GraceSpacing` permet d’ajuster l’espacement d’un groupe de notes d’ornement.

    graceNotes = {
      \grace { c4 c8 c16 c32 }
      c8
    }

    \relative c'' {
      c8
      \graceNotes
      \override Score.GraceSpacing.spacing-increment = #2.0
      \graceNotes
      \revert Score.GraceSpacing.spacing-increment
      \graceNotes
    }

## Ajustement de l’espacement vertical des paroles

Cet extrait illustre la manière de réduire l’espace entre la ligne de paroles et la portée.

    % Default layout:
    <<
      \new Staff \new Voice = melody \relative c' {
        c4 d e f
        g4 f e d
        c1
      }
      \new Lyrics \lyricsto melody { aa aa aa aa aa aa aa aa aa }

      \new Staff {
        \new Voice = melody \relative c' {
          c4 d e f
          g4 f e d
          c1
        }
      }
      % Reducing the minimum space below the staff and above the lyrics:
      \new Lyrics \with {
        \override VerticalAxisGroup.nonstaff-relatedstaff-spacing =
          #'((basic-distance . 1))
      }
      \lyricsto melody { aa aa aa aa aa aa aa aa aa }
    >>

## Modification de la hauteur de hampes ligaturées

La hauteur de hampe des notes ligaturées est gérée par la sous-propriété `beamed-lengths` des `details` de l’objet `Stem`. Lorsqu’elle ne comporte qu’une seule valeur, cette hauteur s’appliquera à toutes les hampes. En présence de plusieurs arguments, le premier affectera les croches, le second les doubles croches, et ainsi de suite. Le dernier argument s’appliquera aussi aux notes de plus courte durée. Les arguments peuvent être des valeurs décimales.

    \relative c'' {
      \override Stem.details.beamed-lengths = #'(2)
      a8[ a] a16[ a] a32[ a]
      \override Stem.details.beamed-lengths = #'(8 10 12)
      a8[ a] a16[ a] a32[ a] r8
      \override Stem.details.beamed-lengths = #'(8)
      a8[ a]
      \override Stem.details.beamed-lengths = #'(8.5)
      a8[ a]
      \revert Stem.details.beamed-lengths
      a8[ a] a16[ a] a32[ a] r16
    }

## Numérotation des mesures et alternatives

Deux méthodes alternatives vous permettent de gérer la numérotation des mesures en cas de reprises.

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

## Crochets d’analyse au-dessus de la portée

Les crochets d’analyse viennent par défaut se positionner au-dessous de la portée. L’exemple suivant vous indique comment les faire apparaître en surplomb de la portée.

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

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

## Crochet d’analyse avec texte

Un markup textuel peut venir s’ajouter aux crochets d’analyse grâce à la propriété `text` de l’objet graphique `HorizontalBracketText`. Plusieurs crochets présents en un même moment requièrent d’utiliser la commande `\tweak`.

Le texte ajouté sera répété, entre parenthèse, après un saut de ligne.

    \paper { tagline = ##f }

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

## Liaison asymétrique

Une liaison peut adopter une courbe asymétrique afin de s’adapter au mieux à la ligne mélodique.

    slurNotes = { d,8( a' d f a f' d, a) }

    \relative c' {
      \stemDown
      \slurUp
      \slurNotes
      \once \override Slur.eccentricity = #3.0
      \slurNotes
    }

## Césure en forme de « voie de chemin de fer » avec point d’orgue

Une césure peut parfois s’indiquer par une double respiration surmontée d’un point d’orgue. Le code ci-dessous permet d’obtenir la combinaison répondant à cette esthétique.

    \relative c'' {
      c2.
      % construct the symbol
      \override BreathingSign.text = \markup {
        \override #'(direction . 1)
        \override #'(baseline-skip . 1.8)
        \dir-column {
          \translate #'(0.155 . 0)
            \center-align \musicglyph "scripts.caesura.curved"
          \center-align \musicglyph "scripts.ufermata"
        }
      }
      \breathe c4
      % set the breathe mark back to normal
      \revert BreathingSign.text
      c2. \breathe c4
      \bar "|."
    }

## Modification de la taille d’une note particulière d’un accord

La commande `\tweak` permet de modifier la propriété `font-size` d’une note particulière d’un accord.

Il s’agit de placer, à l’intérieur même de l’accord (dans la construction `< >`) et avant la note considérée, l’instruction `\tweak` suivie de `font-size` et de définir la taille voulue – comme `#-2` pour une petite tête.

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

## Modification de l’épaisseur et de l’écartement des ligatures

L’épaisseur des ligatures se gère au niveau de la propriété `Beam.beam-thickness`. L’ajustement de l’espace entre les ligatures est géré par la propriété `Beam.length-fraction`.

    \relative f' {
      \time 1/8
      \override Beam.beam-thickness = #0.4
      \override Beam.length-fraction = #0.8
      c32 c c c
      \revert Beam.beam-thickness  % 0.48 is default thickness
      \revert Beam.length-fraction  % 1.0 is default spacing
      c32 c c c
      \override Beam.beam-thickness = #0.6
      \override Beam.length-fraction = #1.3
      c32 c c c
    }

## Modifier l’apparence d’un silence multimesure

Dans le cas où ce silence dure moins de dix mesures, LilyPond imprime sur la portée des « silences d’église » – Kirchenpause en allemand – et qui sont une simple suite de rectangles. La propriété `expand-limit` permet d’obtenir un silence unique :

    \relative c'' {
      \compressMMRests {
        R1*2 | R1*5 | R1*9
        \override MultiMeasureRest.expand-limit = #3
        R1*2 | R1*5 | R1*9
      }
    }

## Modification des propriétés d’objets particuliers

La commande `\applyOutput` permet de personnaliser n’importe quel objet de rendu. Elle requiert une fonction Scheme à trois arguments.

    #(define (mc-squared grob grob-origin context)
       (let ((sp (ly:grob-property grob 'staff-position)))
         (ly:grob-set-property!
          grob 'stencil
          (grob-interpret-markup grob
    			     #{ \markup \lower #0.5
    				#(case sp
    				   ((-5) "m")
    				   ((-3) "c ")
    				   ((-2) #{ \markup \teeny \bold 2 #})
    				   (else "bla")) #}))))

    \relative c' {
      <d f g b>2
      \applyOutput Voice.NoteHead #mc-squared
      <d f g b>2
    }

## Modification du texte et de l’extension de nuances textuelles

Le texte par défaut des crescendos et decrescendos se change en modifiant les propriétés de contexte `crescendoText` et `decrescendoText`.

L’aspect de la ligne d’extension est fonction de la propriété `'style` du `DynamicTextSpanner`. Sa valeur par défaut est `'dashed-line`, mais d’autres valeurs sont disponibles, comme `'line`, `'dotted-line` et `'none`.

    \relative c'' {
      \set crescendoText = \markup { \italic { cresc. poco } }
      \set crescendoSpanner = #'text
      \override DynamicTextSpanner.style = #'dotted-line
      a2\< a
      a2 a
      a2 a
      a2 a\mf
    }

## Changement des fontes textuelles par défaut

Les familles de fontes par défaut pour le texte peuvent être changées à l’aide de la fonction `make-pango-font-tree`.

    %{
    You may have to install additional fonts.

    Red Hat Fedora

      dejavu-fonts-all

    Debian GNU/Linux, Ubuntu

      fonts-dejavu-core
      fonts-dejavu-extra
    %}

    \paper {
      % change for other default global staff size.
      myStaffSize = #20
      %{
         run
             lilypond -dshow-available-fonts
         to show all fonts available in the process log.
      %}

      #(define fonts
        (make-pango-font-tree "DejaVu Serif"
                              "DejaVu Sans"
                              "DejaVu Sans Mono"
         (/ myStaffSize 20)))
    }

    {
      g'''4^\markup {
        DejaVu Serif: \bold bold
                      \italic italic
                      \italic \bold { bold italic }
      }
      g4_\markup {
        \override #'(font-family . sans) {
          DejaVu Sans: \bold bold
                       \italic italic
                       \italic \bold { bold italic }
        }
      }
      g''2^\markup {
        \override #'(font-family . typewriter) {
          DejaVu Sans Mono: \bold bold
                            \italic italic
                            \italic \bold { bold italic }
        }
      }
    }

## Modification de la taille d’une portée

Bien que le meilleur moyen de définir la taille des portées consiste à utiliser `#(set-global-staff-size xx)`, une portée en particulier peut se redimensionner en affectant d’un coefficient ses propriétés `staff-space` et `fontSize`.

    <<
      \new Staff {
        \relative c'' {
          \dynamicDown
          c8\ff c c c c c c c
        }
      }
      \new Staff \with {
        fontSize = #-3
        \override StaffSymbol.staff-space = #(magstep -3)
      } {
        \clef bass
        c8 c c c c\f c c c
      }
    >>

## Changement de tempo sans indication sur la partition

Vous pouvez indiquer un changement de tempo pour le fichier MIDI sans pour autant l’imprimer. Il suffit alors de le rendre invisible aux musiciens.

    \score {
      \new Staff \relative c' {
        \tempo 4 = 160
        c4 e g b
        c4 b d c
        \set Score.tempoHideNote = ##t
        \tempo 4 = 96
        d,4 fis a cis
        d4 cis e d
      }
      \layout { }
      \midi { }
    }

## Modification du texte des indications de pédale

`Staff.pedalSustainStrings` permet de définir le texte affiché pour les instructions de pédale. Les seuls caractères autorisés sont les glyphes particuliers de pédale, comme vous pouvez le constater ici.

    sustainNotes = { c4\sustainOn d e\sustainOff\sustainOn f\sustainOff }

    \relative c' {
      \sustainNotes
      \set Staff.pedalSustainStrings = #'("P" "P-" "-")
      \sustainNotes
      \set Staff.pedalSustainStrings = #'("d" "de" "e")
      \sustainNotes
      \set Staff.pedalSustainStrings = #'("M" "M-" "-")
      \sustainNotes
      \set Staff.pedalSustainStrings = #'("Ped" "*Ped" "*")
      \sustainNotes
    }

## Contrôle de la visibilité des extensions d’objet après saut de ligne

La visibilité des extensions qui se terminent sur la première note après un saut de ligne est contrôlée par un appel de `after-line-breaking` à la fonction `ly:spanner::kill-zero-spanned-time`.

Pour des objets tels qu’un glissando ou un soufflet, le comportement par défaut est de ne pas être reportés après un saut de ligne. L’extension sera donc reprise dès lors que l’appel aura été désactivé.

Il en va inversement pour les extensions qui, par défaut pour les textes notamment, sont reportées après un saut de ligne ; il faudra alors activer l’appel pour empêcher leur report.

    \paper { ragged-right = ##t }

    \relative c'' {
      \override Hairpin.to-barline = ##f
      \override Glissando.breakable = ##t
      % show hairpin
      \override Hairpin.after-line-breaking = ##t
      % hide text span
      \override TextSpanner.after-line-breaking =
        #ly:spanner::kill-zero-spanned-time
      e2\<\startTextSpan
      % show glissando
      \override Glissando.after-line-breaking = ##t
      f2\glissando
      \break
      f,1\!\stopTextSpan
    }

## Contrôle de l’ordre vertical des articulations et ornements

Les symboles s’ordonnent verticalement suivant la propriété `script-priority`. Plus sa valeur numérique est faible, plus le symbole sera proche de la note. Dans l’exemple suivant, l’objet `TextScript` – le dièse – a d’abord la propriété la plus basse et se voit donc placé au plus près de la note ; ensuite, c’est l’objet `Script` – le mordant – qui a la propriété la plus basse, et se place alors sous le dièse. Lorsque deux objets ont la même priorité, c’est l’ordre dans lequel ils sont indiqués qui détermine lequel sera placé en premier.

    \relative c''' {
      \once \override TextScript.script-priority = #-100
      a2^\prall^\markup { \sharp }

      \once \override Script.script-priority = #-100
      a2^\prall^\markup { \sharp }
    }

## Contrôle de l’impression des crochets de n-olet

Selon la tradition, les crochets indicateurs de n-olet sont toujours imprimés, sauf dans le cas où ils seraient de la même longueur qu’une ligature.

LilyPond permet, au travers de la propriété `bracket-visibility`, de contôler précisément leur affichage : déterminée à `#t`, ils seront toujours imprimés ; `#f` permet de ne jamais les imprimer – donc omettre l’objet `TupletBracket` –, et `#'if-no-beam` les imprimera en l’absence de ligature (comportement par défaut).

    music = \relative c'' {
      \tuplet 3/2 { c16[ d e } f8]
      \tuplet 3/2 { c8 d e }
      \tuplet 3/2 { c4 d e }
    }

    \new Voice {
      \relative c' {
        \override Score.TextMark.non-musical = ##f
        \textMark "default" \music
        \override TupletBracket.bracket-visibility = #'if-no-beam
        \textMark \markup \typewriter "'if-no-beam" \music
        \override TupletBracket.bracket-visibility = ##t
        \textMark \markup \typewriter "#t" \music
        \override TupletBracket.bracket-visibility = ##f
        \textMark \markup \typewriter "#f" \music
        \omit TupletBracket
        \textMark \markup \typewriter "omit" \music
      }
    }

## Création d’un groupetto retardé

Obtenir un groupetto retardé et dans lequel la note la plus basse est altérée requiert quelques surcharges. La propriété `outside-staff-priority` doit être désactivée (`#f`) pour éviter qu’elle prenne le pas sur la propriété `avoid-slur`. L’ajustement du positionnement horizontal s’effectue en jouant sur la fraction `2/3`.

    \relative c'' {
      \after 2*2/3 \turn c2( d4) r |
      \after 4 \turn c4.( d8)
      \after 4
      {
        \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
        \once \hideNotes
        cis8\turn \noBeam
      }
      d4.( e8)
    }

## Création d’armures personnalisées

LilyPond accepte les armures personnalisées. Dans cet exemple, il s’agit d’une tonalité de ré mineur à laquelle on rajoute des bémols.

    \new Staff \with {
      \override StaffSymbol.line-count = #8
      \override KeySignature.flat-positions = #'((-7 . 6))
      \override KeyCancellation.flat-positions = #'((-7 . 6))
      % presumably sharps are also printed in both octaves
      \override KeySignature.sharp-positions = #'((-6 . 7))
      \override KeyCancellation.sharp-positions = #'((-6 . 7))

      \override Clef.stencil = #
      (lambda (grob)(grob-interpret-markup grob
      #{ \markup\combine
        \musicglyph "clefs.C"
        \translate #'(-3 . -2)
        \musicglyph "clefs.F"
       #}))
        clefPosition = #3
        middleCPosition = #3
        middleCClefPosition = #3
    }

    {
      \key d\minor
      f bes, f bes,
    }

## Création de doigtés sur deux caractères

Il est tout à fait possible de noter un doigté supérieur à 5.

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

## Création d’extensions de texte

Les commandes `\startTextSpan` et `\stopTextSpan` permettent d’ajouter une ligne de prolongation aux indications textuelles, à l’instar des indications de pédale ou d’octaviation. Jouer sur les propriétés de l’objet `TextSpanner` permet d’en modifier le rendu.

    \paper { ragged-right = ##f }

    \relative c'' {
      \override TextSpanner.bound-details.left.text = #"bla"
      \override TextSpanner.bound-details.right.text = #"blu"
      a4 \startTextSpan
      b4 c
      a4 \stopTextSpan

      \override TextSpanner.style = #'line
      \once \override TextSpanner.bound-details.left.stencil-align-dir-y = #CENTER
      a4 \startTextSpan
      b4 c
      a4 \stopTextSpan

      \override TextSpanner.style = #'dashed-line
      \override TextSpanner.bound-details.left.text =
        \markup { \draw-line #'(0 . 1) }
      \override TextSpanner.bound-details.right.text =
        \markup { \draw-line #'(0 . -2) }
      \once \override TextSpanner.bound-details.right.padding = #-2

      a4 \startTextSpan
      b4 c
      a4 \stopTextSpan

      \set Staff.middleCPosition = #-13
      \override TextSpanner.dash-period = #10
      \override TextSpanner.dash-fraction = #0.5
      \override TextSpanner.thickness = #10
      a4 \startTextSpan
      b4 c
      a4 \stopTextSpan
    }

## Accord distribué et problème de hampe – solution

Il est parfois préférable d’utiliser les hampes de la portée supérieure pour créer des accords distribués, afin d’éviter tout risque de collision au niveau des ligatures automatiques. Dans l’exemple suivant, le fait de partir des hampes de la portée inférieure aurait rendu nécessaire l’adaptation du détecteur de collision des ligatures, par une clause `\override Staff.Beam.collision-voice-only = ##t`, afin qu’il ne tienne pas compte des collisions entre portées.

    \new PianoStaff <<
      \new Staff = up
        \relative c' {
          <<
            { r4
              \override Stem.cross-staff = ##t
              \override Stem.length = #19 % this is in half-spaces,
                  % so it makes stems 9.5 staffspaces long
              \override Stem.Y-offset = #-6 % stems are normally lengthened
                  % upwards, so here we must lower the stem by the amount
                  % equal to the lengthening - in this case (19 - 7) / 2
                  % (7 is default stem length)
              e e e }
            { s4
              \change Staff = "bottom"
              \override NoteColumn.ignore-collision = ##t
              c, c c
            }
          >>
        }
      \new Staff = bottom
        \relative c' {
          \clef bass
          \voiceOne
          g8 a g a g a g a
        }
    >>

## Hampes interportées

L’exemple ci-dessous illustre l’utilisation du `Span_stem_engraver` et de la commande `\crossStaff` afin de connecter des hampes entre les portées.

Nul n’est besoin de spécifier la taille des hampes ; le graveur calcule automatiquement la distance relative des têtes de note avec les portées.

    \layout {
      \context {
        \PianoStaff
        \consists "Span_stem_engraver"
      }
    }

    {
      \new PianoStaff <<
        \new Staff {
          <b d'>4 r d'16\> e'8. g8 r\!
          e'8 f' g'4 e'2
        }
        \new Staff {
          \clef bass
          \voiceOne
          \autoBeamOff
          \crossStaff { <e g>4 e, g16 a8. c8} d
          \autoBeamOn
          g8 f g4 c2
        }
      >>
    }

## Guidons

Les guidons peuvent adopter différents styles.

    \layout { ragged-right = ##t }

    \new Staff \with { \consists "Custos_engraver" } \relative c' {
      \override Staff.Custos.neutral-position = #4

      \override Staff.Custos.style = #'hufnagel
      c1^"hufnagel" \break
      <d a' f'>1

      \override Staff.Custos.style = #'medicaea
      c1^"medicaea" \break
      <d a' f'>1

      \override Staff.Custos.style = #'vaticana
      c1^"vaticana" \break
      <d a' f'>1

      \override Staff.Custos.style = #'mensural
      c1^"mensural" \break
      <d a' f'>1
    }

## Personnalisation de diagrammes de fret

Les propriétés d’un diagramme de fret sont définies par les `fret-diagram-details`. En matière de diagramme de fret, les adaptations s’appliquent à l’objet `FretBoards.FretBoard`. Un `FretBoards` est comparable à un `Voice` : il s’agit d’un contexte du plus bas niveau, et il n’est donc pas primordial de l’instancier de manière explicite pour adapter ses propriétés.

    \include "predefined-guitar-fretboards.ly"
    \storePredefinedDiagram #default-fret-table \chordmode { c' }
                            #guitar-tuning
                            #"x;1-1-(;3-2;3-3;3-4;1-1-);"

    % shorthand
    oo = #(define-music-function
           (grob-path value)
           (list? scheme?)
           #{ \once \override $grob-path = #value #})

    <<
      \new ChordNames {
        \chordmode { c1 | c | c | d }
      }
      \new FretBoards {
        % Set global properties of fret diagram
        \override FretBoards.FretBoard.size = #'1.2
        \override FretBoard.fret-diagram-details.finger-code = #'in-dot
        \override FretBoard.fret-diagram-details.dot-color = #'white
        \chordmode {
          c
          \oo FretBoard.size #'1.0
          \oo FretBoard.fret-diagram-details.barre-type #'straight
          \oo FretBoard.fret-diagram-details.dot-color #'black
          \oo FretBoard.fret-diagram-details.finger-code #'below-string
          c'
          \oo FretBoard.fret-diagram-details.barre-type #'none
          \oo FretBoard.fret-diagram-details.number-type #'arabic
          \oo FretBoard.fret-diagram-details.orientation #'landscape
          \oo FretBoard.fret-diagram-details.mute-string #"M"
          \oo FretBoard.fret-diagram-details.label-dir #LEFT
          \oo FretBoard.fret-diagram-details.dot-color #'black
          c'
          \oo FretBoard.fret-diagram-details.finger-code #'below-string
          \oo FretBoard.fret-diagram-details.dot-radius #0.35
          \oo FretBoard.fret-diagram-details.dot-position #0.5
          \oo FretBoard.fret-diagram-details.fret-count #3
          d
        }
      }
      \new Voice {
        c'1 | c' | c' | d'
      }
    >>

## Personnalisation des diagrammes de fret

Les propriétés d’un diagramme de fret sont modifiables grâce au `fret-diagram-details`. Lorsqu’ils sont générés sous forme de `\markup`, rien n’empêche de modifier les diagrammes en jouant sur les réglages de l’objet `Voice.TextScript` ou bien directement sur le markup.

    <<
      \chords { c1 | c | c | d }

      \new Voice = "mel" {
        \textLengthOn
        % Set global properties of fret diagram
        \override TextScript.size = #'1.2
        \override TextScript.fret-diagram-details.finger-code = #'in-dot
        \override TextScript.fret-diagram-details.dot-color = #'white

        %% C major for guitar, no barre, using defaults
           % terse style
        c'1^\markup { \fret-diagram-terse "x;3-3;2-2;o;1-1;o;" }

        %% C major for guitar, barred on third fret
           % verbose style
           % size 1.0
           % roman fret label, finger labels below string, straight barre
        c'1^\markup {
          % standard size
          \override #'(size . 1.0) {
            \override #'(fret-diagram-details . (
                         (number-type . roman-lower)
                         (finger-code . in-dot)
                         (barre-type . straight))) {
              \fret-diagram-verbose #'((mute 6)
                                       (place-fret 5 3 1)
                                       (place-fret 4 5 2)
                                       (place-fret 3 5 3)
                                       (place-fret 2 5 4)
                                       (place-fret 1 3 1)
                                       (barre 5 1 3))
            }
          }
        }

        %% C major for guitar, barred on third fret
           % verbose style
           % landscape orientation, arabic numbers, M for mute string
           % no barre, fret label down or left, small mute label font
        c'1^\markup {
          \override #'(fret-diagram-details . (
                       (finger-code . below-string)
                       (number-type . arabic)
                       (label-dir . -1)
                       (mute-string . "M")
                       (orientation . landscape)
                       (barre-type . none)
                       (xo-font-magnification . 0.4)
                       (xo-padding . 0.3))) {
            \fret-diagram-verbose #'((mute 6)
                                     (place-fret 5 3 1)
                                     (place-fret 4 5 2)
                                     (place-fret 3 5 3)
                                     (place-fret 2 5 4)
                                     (place-fret 1 3 1)
                                     (barre 5 1 3))
          }
        }

        %% simple D chord
           % terse style
           % larger dots, centered dots, fewer frets
           % label below string
        d'1^\markup {
          \override #'(fret-diagram-details . (
                       (finger-code . below-string)
                       (dot-radius . 0.35)
                       (dot-position . 0.5)
                       (fret-count . 3))) {
            \fret-diagram-terse "x;x;o;2-1;3-2;2-3;"
          }
        }
      }
    >>

## Indicateur de regroupement et portée unique

Lorsque, dans des regroupements de type `ChoirStaff` ou `StaffGroup`, une seule portée est active, aucune indication n’est donnée en début de ligne. Affecter à la propriété `collapse-height` un nombre de lignes inférieur à celui de la portée permet de modifier ce comportement par défaut.

Notez bien que dans le cas des `PianoStaff` et `GrandStaff`, pour lesquels le délimiteur de système est une accolade et non un crochet, il ne s’agit pas de la même propriété – voir le deuxième système de l’exemple.

    \score {
      \new StaffGroup <<
        % Must be lower than the actual number of staff lines
        \override StaffGroup.SystemStartBracket.collapse-height = #4
        \override Score.SystemStartBar.collapse-height = #4
        \new Staff {
          c'1
        }
      >>
    }
    \score {
      \new PianoStaff <<
        \override PianoStaff.SystemStartBrace.collapse-height = #4
        \override Score.SystemStartBar.collapse-height = #4
        \new Staff {
          c'1
        }
      >>
    }

## Affichage de la généalogie d’un objet

Lorsque l’on manipule des rappels d’objet (grob callbacks), il peut être intéressant d’en maîtriser les ascendants. La plupart des objets graphiques ont des parents, lesquels auront une influence sur le positionnement de l’objet en question. Ainsi, les parents des côtés X et Y influenceront respectivement les positions horizontale et verticale de l’objet. De plus, chacun des parents peut avoir ses propres parents.

Certains aspects de la lignée d’un objet peuvent toutefois porter à confusion :

- Les types de parents d’un grob peuvent dépendre du contexte.
- Dans le cas de certains grobs, les parents X et Y peuvent être le même.
- Un « ascendant » particulier peut dépendre d’un grob de différentes manières.
- Le concept de « générations » est trompeur.

Par exemple, l’objet `System` peut, vis à vis d’un objet `VerticalAlignment`, être à la fois parent (par son côté Y) et grand parent (par deux fois du côté X).

La macro ci-dessous affiche à l’écran une représentation textuelle de l’ascendance d’un grob.

Elle se lance ainsi :

    { \once \override NoteHead.before-line-breaking = #display-ancestry c }

et génère la sortie suivante :

    NoteHead
    X,Y: NoteColumn
         X: PaperColumn
            X,Y: System
         Y: VerticalAxisGroup
            X: NonMusicalPaperColumn
               X,Y: System
            Y: VerticalAlignment
               X: NonMusicalPaperColumn
                  X,Y: System
               Y: System

    %% http://lsr.di.unimi.it/LSR/Item?id=622
    %% see also http://www.lilypond.org/doc/v2.18/Documentation/snippets/tweaks-and-overrides#tweaks-and-overrides-displaying-grob-ancestry

    %% Remark:
    %% grob::name is in the source since 2.19.x could be deleted during next LSR-upgrade
    #(define (grob::name grob)
      (assq-ref (ly:grob-property grob 'meta) 'name))

    #(define (get-ancestry grob)
      (if (not (null? (ly:grob-parent grob X)))
          (list (grob::name grob)
                (get-ancestry (ly:grob-parent grob X))
                (get-ancestry (ly:grob-parent grob Y)))
          (grob::name grob)))

    #(define (format-ancestry lst padding)
       (string-append
        (symbol->string (car lst))
        "\n"
        (let ((X-ancestry
               (if (list? (cadr lst))
                   (format-ancestry (cadr lst) (+ padding 3))
                   (symbol->string (cadr lst))))
              (Y-ancestry
               (if (list? (caddr lst))
                   (format-ancestry (caddr lst) (+ padding 3))
                   (symbol->string (caddr lst)))))
          (if (equal? X-ancestry Y-ancestry)
              (string-append
               (format #f "~&")
               (make-string padding #\space)
               "X,Y: "
               (if (list? (cadr lst))
                   (format-ancestry (cadr lst) (+ padding 5))
                   (symbol->string (cadr lst))))
              (string-append
               (format #f "~&")
               (make-string padding #\space)
               "X: " X-ancestry
               "\n"
               (make-string padding #\space)
               "Y: " Y-ancestry
               (format #f "~&"))))
        (format #f "~&")))

    #(define (display-ancestry grob)
       (format (current-error-port)
          "~3&~a~2%~a~&"
          (make-string 36 #\-)
          (if (ly:grob? grob)
              (format-ancestry (get-ancestry grob) 0)
              (format #f "~a is not a grob" grob))))

    \relative c' {
      \once \override NoteHead.before-line-breaking = #display-ancestry
      f4
      \once \override Accidental.before-line-breaking = #display-ancestry
      \once \override Arpeggio.before-line-breaking = #display-ancestry
      <f as c>4\arpeggio
    }

## Harmoniques pointées

Les notes harmoniques artificielles, obtenues grâce à `\harmonic`, ne sont pas pointées. Ce comportement peut être modifié en activant la propriété de contexte `harmonicDots`.

    \relative c''' {
      \time 3/4
      \key f \major
      \set harmonicDots = ##t
      <bes f'\harmonic>2. ~
      <bes f'\harmonic>4. <a e'\harmonic>8( <gis dis'\harmonic> <g d'\harmonic>)
      <fis cis'\harmonic>2.
      <bes f'\harmonic>2.
    }

## Encadrement d’objets

La fonction `print` peut se modifier pour obtenir l’encadrement de n’importe quel objet.

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

## Encercler divers objets

La commande de markup `\circle` permet de dessiner un cercle autour de différents objets comme des indications de doigté. D’autres objets nécessitent de faire appel à des techniques spécifiques. Cet exemple illustre deux manières de procéder : pour les repères, et pour les numéros de mesure.

    \relative c' {
      c1
      \set Score.rehearsalMarkFormatter =
        #(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)
    }

## Personnalisation des extenseurs de nuance postfix

Il s’agit de fonctions postfix pour personnaliser l’extension des crescendos textuels. L’extension devrait débuter sur la première note de la mesure. Il faut utiliser `-\mycresc` – comme une articulation – sous peine que le départ de l’extension n’apparaisse qu’à la note suivante.

    % Two functions for (de)crescendo spanners where you can explicitly
    % give the spanner text.
    mycresc =
    #(define-music-function (mymarkup) (markup?)
       (make-music 'CrescendoEvent
                   'span-direction START
                   'span-type 'text
                   'span-text mymarkup))
    mydecresc =
    #(define-music-function (mymarkup) (markup?)
       (make-music 'DecrescendoEvent
                   'span-direction START
                   'span-type 'text
                   'span-text mymarkup))

    \relative c' {
      c4-\mycresc "custom cresc" c4 c4 c4 |
      c4 c4 c4 c4 |
      c4-\mydecresc "custom decresc" c4 c4 c4 |
      c4 c4\! c4 c4
    }

## Extensions de nuance postfix

Les lignes d’extension des commandes `\cresc`, `\dim` et `\decresc` peuvent désormais être personnalisées facilement sous forme d’opérateurs postfix. Soufflets et (de)crescendos peuvent cohabiter. `\<` et `\>` produiront par défaut des soufflets, alors que `\cresc`, etc. produiront une indication textuelle avec extension.

    % Some sample text dynamic spanners, to be used as postfix operators
    crpoco =
    #(make-music 'CrescendoEvent
                 'span-direction START
                 'span-type 'text
                 'span-text "cresc. poco a poco")

    \relative c' {
      c4\cresc d4 e4 f4 |
      g4 a4\! b4\crpoco c4 |
      c4 d4 e4 f4 |
      g4 a4\! b4\< c4 |
      g4\dim a4 b4\decresc c4\!
    }

## Allongement d’une marque de trille (`TrillSpanner`)

La propriété `minimum-length` d’une extension de trille – objet `TrillSpanner` – n’est effective qu’après un appel explicite à la procédure `set-spacing-rods`.

Pour ce faire, la propriété `set-spacing-rods` doit être définie à `ly:spanner::set-spacing-rods`.

    \relative c' {
    \key c\minor
      \time 2/4
      c16( as') c,-. des-.
      \once\override TrillSpanner.minimum-length = #15
      \once\override TrillSpanner.springs-and-rods = #ly:spanner::set-spacing-rods
      \afterGrace es4
      \startTrillSpan { d16[( \stopTrillSpan es)] }
      c( c' g es c g' es d
      \hideNotes
      c8)
    }

## Rappel du glissando à l’occasion d’une alternative

Un glissando qui se prolonge sur plusieurs sections `\alternative` peut se rappeler à l’aide d’une note d’ornement supplémentaire et masquée, à laquelle sera attaché le départ du glissando, ce dans chaque bloc `\alternative`. Cette note d’ornement devrait avoir la même hauteur que la note où commençait le glissando originel. Ceci est géré par une fonction musicale qui prendra en argument la hauteur de la note d’ornement.

Dans le cadre d’une musique polyphonique, il ne faudra pas oublier d’ajouter une note d’ornement dans toutes les autres voix afin de préserver la synchronisation.

    repeatGliss = #(define-music-function (grace)
      (ly:pitch?)
      #{
        % the next two lines ensure the glissando is long enough
        % to be visible
        \once \override Glissando.springs-and-rods
          = #ly:spanner::set-spacing-rods
        \once \override Glissando.minimum-length = #3.5
        \once \hideNotes
        \grace $grace \glissando
      #})

    \score {
      \relative c'' {
        \repeat volta 3 { c4 d e f\glissando }
        \alternative {
          { g2 d }
          { \repeatGliss f g2 e }
          { \repeatGliss f e2 d }
        }
      }
    }

    music =  \relative c' {
      \voiceOne
      \repeat volta 2 {
        g a b c\glissando
      }
      \alternative {
        { d1 }
        { \repeatGliss c \once \omit StringNumber e1\2 }
      }
    }

    \score {
      \new StaffGroup <<
        \new Staff <<
          \new Voice { \clef "G_8" \music }
        >>
        \new TabStaff  <<
          \new TabVoice { \clef "moderntab" \music }
        >>
      >>
    }

## Affinage des indications de pédale

Les crochets d’indication de pédale peuvent se modifier de différentes manières.

    \paper { ragged-right = ##f }
    \relative c'' {
      c2\sostenutoOn c
      c2\sostenutoOff c
      \once \override Staff.PianoPedalBracket.shorten-pair = #'(-7 . -2)
      c2\sostenutoOn c
      c2\sostenutoOff c
      \once \override Staff.PianoPedalBracket.edge-height = #'(0 . 3)
      c2\sostenutoOn c
      c2\sostenutoOff c
    }

## Liaison de prolongation aplatie

La fonction ici présentée prend en argument le `Tie.stencil` par défaut et en recalcule le résultat d’après les étendues de cette valeur par défaut.

Des ajustements plus poussés sont possibles, en apportant des dérogations à `Tie.details.height-limit` ou à l’aide de la fonction `\shape`. La définition personnalisée peut aussi se modifier à la volée.

    %% http://lsr.di.unimi.it/LSR/Item?id=1031

    #(define ((flared-tie coords) grob)

      (define (pair-to-list pair)
         (list (car pair) (cdr pair)))

      (define (normalize-coords goods x y dir)
        (map
          (lambda (coord)
            ;(coord-scale coord (cons x (* y dir)))
            (cons (* x (car coord)) (* y dir (cdr coord))))
          goods))

      (define (my-c-p-s points thick)
        (make-connected-path-stencil
          points
          thick
          1.0
          1.0
          #f
          #f))

      ;; outer let to trigger suicide
      (let ((sten (ly:tie::print grob)))
        (if (grob::is-live? grob)
            (let* ((layout (ly:grob-layout grob))
                   (line-thickness (ly:output-def-lookup layout 'line-thickness))
                   (thickness (ly:grob-property grob 'thickness 0.1))
                   (used-thick (* line-thickness thickness))
                   (dir (ly:grob-property grob 'direction))
                   (xex (ly:stencil-extent sten X))
                   (yex (ly:stencil-extent sten Y))
                   (lenx (interval-length xex))
                   (leny (interval-length yex))
                   (xtrans (car xex))
                   (ytrans (if (> dir 0)(car yex) (cdr yex)))
                   (uplist
                     (map pair-to-list
                          (normalize-coords coords lenx (* leny 2) dir))))

       (ly:stencil-translate
           (my-c-p-s uplist used-thick)
         (cons xtrans ytrans)))
       '())))

    #(define flare-tie
      (flared-tie '((0 . 0)(0.1 . 0.2) (0.9 . 0.2) (1.0 . 0.0))))

    \layout {
      \context {
        \Voice
        \override Tie.stencil = #flare-tie
      }
    }

    \paper { ragged-right = ##f }

    \relative c' {
      a4~a
      \override Tie.height-limit = 4
      a'4~a
      a'4~a
      <a,, c e a c e a c e>~ q

      \break

      a'4~a
      \once \override Tie.details.height-limit = 14
      a4~a

      \break

      a4~a
      \once \override Tie.details.height-limit = 0.5
      a4~a

      \break

      a4~a
      \shape #'((0 . 0) (0 . 0.4) (0 . 0.4) (0 . 0)) Tie
      a4~a

      \break

      a4~a
      \once \override Tie.stencil =
        #(flared-tie '((0 . 0)(0.1 . 0.4) (0.9 . 0.4) (1.0 . 0.0)))
      a4~a

      a4~a
      \once \override Tie.stencil =
        #(flared-tie '((0 . 0)(0.06 . 0.1) (0.94 . 0.1) (1.0 . 0.0)))
      a4~a
    }

## Impression forcée d’un bécarre avant une accidentelle

L’exemple suivant indique comment forcer l’impression d’un bécarre avant un changement d’altération.

    \relative c' {
      \key es \major
      bes c des
      \tweak Accidental.restore-first ##t
      eis
    }

## Décalage horizontal forcé

Quand LilyPond est dépassé, la propriété `force-hshift` de l’objet `NoteColumn` et des silences à hauteur déterminée peuvent s’avérer utiles pour dicter au programme les choix de placement. On travaille ici en espace de portée.

    \relative c' <<
      {
        <d g>2 <d g>
      }
      \\
      {
        <b f'>2
        \once \override NoteColumn.force-hshift = #1.7
        <b f'>2
      }
    >>

## Construction et développement de diagrammes de fret

Voici différentes manières d’obtenir et de personnaliser des diagrammes de fret :

    <<
      \chords {
        a2 a
        \repeat unfold 3 {
          c c c d d
        }
      }

      \new Voice = "mel" {
        \textLengthOn
        % Set global properties of fret diagram
        \override TextScript.size = #1.2
        \override TextScript.fret-diagram-details.finger-code = #'below-string
        \override TextScript.fret-diagram-details.dot-color = #'black

        %% A chord for ukulele
        a'2^\markup {
          \override #'(fret-diagram-details . (
                       (string-count . 4)
                       (dot-color . white)
                       (finger-code . in-dot))) {
            \fret-diagram "4-2-2;3-1-1;2-o;1-o;"
          }
        }

        %% A chord for ukulele, with formatting defined in definition string
        %  1.2 * size, 4 strings, 4 frets, fingerings below string
        %  dot radius .35 of fret spacing, dot position 0.55 of fret spacing
        a'2^\markup {
          \override #'(fret-diagram-details . (
                       (dot-color . white)
                       (open-string . "o"))) {
            \fret-diagram "s:1.2;w:4;h:3;f:2;d:0.35;p:0.55;4-2-2;3-1-1;2-o;1-o;"
          }
        }

          %% These chords will be in normal orientation

        %% C major for guitar, barred on third fret
        %  verbose style
        %  roman fret label, finger labels below string, straight barre
        c'2^\markup {
          % 110% of default size
          \override #'(size . 1.1) {
            \override #'(fret-diagram-details . (
                         (number-type . roman-lower)
                         (finger-code . below-string)
                         (barre-type . straight))) {
              \fret-diagram-verbose #'((mute 6)
                                       (place-fret 5 3 1)
                                       (place-fret 4 5 2)
                                       (place-fret 3 5 3)
                                       (place-fret 2 5 4)
                                       (place-fret 1 3 1)
                                       (barre 5 1 3))
            }
          }
        }

        %% C major for guitar, barred on third fret
        %% Double barre used to test barre function
        %  verbose style
        c'2^\markup {
          % 110% of default size
          \override #'(size . 1.1) {
            \override #'(fret-diagram-details . (
                         (number-type . arabic)
                         (dot-label-font-mag . 0.9)
                         (finger-code . in-dot)
                         (fret-label-font-mag . 0.6)
                         (fret-label-vertical-offset . 0)
                         (label-dir . -1)
                         (mute-string . "M")
                         (xo-font-magnification . 0.4)
                         (xo-padding . 0.3))) {
              \fret-diagram-verbose #'((mute 6)
                                       (place-fret 5 3 1)
                                       (place-fret 4 5 2)
                                       (place-fret 3 5 3)
                                       (place-fret 2 5 4)
                                       (place-fret 1 3 1)
                                       (barre 4 2 5)
                                       (barre 5 1 3))
            }
          }
        }

        %% C major for guitar, with capo on third fret
        %  verbose style
        c'2^\markup {
          % 110% of default size
          \override #'(size . 1.1) {
            \override #'(fret-diagram-details . (
                         (number-type . roman-upper)
                         (dot-label-font-mag . 0.9)
                         (finger-code . none)
                         (fret-label-vertical-offset . 0.5)
                         (xo-font-magnification . 0.4)
                         (xo-padding . 0.3))) {
              \fret-diagram-verbose #'((mute 6)
                                       (capo 3)
                                       (open 5)
                                       (place-fret 4 5 1)
                                       (place-fret 3 5 2)
                                       (place-fret 2 5 3)
                                       (open 1))
            }
          }
        }

        %% simple D chord
        d'2^\markup {
          \override #'(fret-diagram-details . (
                       (finger-code . below-string)
                       (dot-radius . 0.35)
                       (string-thickness-factor . 0.3)
                       (dot-position . 0.5)
                       (fret-count . 3))) {
            \fret-diagram-terse "x;x;o;2-1;3-2;2-3;"
          }
        }

        %% simple D chord, large top fret thickness
        d'2^\markup  {
          \override #'(fret-diagram-details . (
                       (finger-code . below-string)
                       (dot-radius . 0.35)
                       (dot-position . 0.5)
                       (top-fret-thickness . 7)
                       (fret-count . 3))) {
            \fret-diagram-terse "x;x;o;2-1;3-2;2-3;"
          }
        }

          % These chords will be in landscape orientation
        \override TextScript.fret-diagram-details.orientation = #'landscape

        %% C major for guitar, barred on third fret
        %  verbose style
        %  roman fret label, finger labels below string, straight barre
        c'2^\markup {
          % 110% of default size
          \override #'(size . 1.1) {
            \override #'(fret-diagram-details . (
                         (number-type . roman-lower)
                         (finger-code . below-string)
                         (barre-type . straight))) {
              \fret-diagram-verbose #'((mute 6)
                                       (place-fret 5 3 1)
                                       (place-fret 4 5 2)
                                       (place-fret 3 5 3)
                                       (place-fret 2 5 4)
                                       (place-fret 1 3 1)
                                       (barre 5 1 3))
            }
          }
        }

        %% C major for guitar, barred on third fret
        %% Double barre used to test barre function
        %  verbose style
        c'2^\markup {
          % 110% of default size
          \override #'(size . 1.1) {
            \override #'(fret-diagram-details . (
                         (number-type . arabic)
                         (dot-label-font-mag . 0.9)
                         (finger-code . in-dot)
                         (fret-label-font-mag . 0.6)
                         (fret-label-vertical-offset . 0)
                         (label-dir . -1)
                         (mute-string . "M")
                         (xo-font-magnification . 0.4)
                         (xo-padding . 0.3))) {
              \fret-diagram-verbose #'((mute 6)
                                       (place-fret 5 3 1)
                                       (place-fret 4 5 2)
                                       (place-fret 3 5 3)
                                       (place-fret 2 5 4)
                                       (place-fret 1 3 1)
                                       (barre 4 2 5)
                                       (barre 5 1 3))
            }
          }
        }

        %% C major for guitar, with capo on third fret
        %  verbose style
        c'2^\markup {
          % 110% of default size
          \override #'(size . 1.1) {
            \override #'(fret-diagram-details . (
                         (number-type . roman-upper)
                         (dot-label-font-mag . 0.9)
                         (finger-code . none)
                         (fret-label-vertical-offset . 0.5)
                         (xo-font-magnification . 0.4)
                         (xo-padding . 0.3))) {
              \fret-diagram-verbose #'((mute 6)
                                       (capo 3)
                                       (open 5)
                                       (place-fret 4 5 1)
                                       (place-fret 3 5 2)
                                       (place-fret 2 5 3)
                                       (open 1))
            }
          }
        }

        %% simple D chord
        d'2^\markup {
          \override #'(fret-diagram-details . (
                       (finger-code . below-string)
                       (dot-radius . 0.35)
                       (dot-position . 0.5)
                       (fret-count . 3))) {
            \fret-diagram-terse "x;x;o;2-1;3-2;2-3;"
          }
        }

        %% simple D chord, large top fret thickness
        d'2^\markup {
          \override #'(fret-diagram-details . (
                       (finger-code . below-string)
                       (dot-radius . 0.35)
                       (dot-position . 0.5)
                       (top-fret-thickness . 7)
                       (fret-count . 3))) {
            \fret-diagram-terse "x;x;o;2-1;3-2;2-3;"
          }
        }

          % These chords will be in opposing-landscape orientation
        \override TextScript.fret-diagram-details.orientation = #'opposing-landscape

        %% C major for guitar, barred on third fret
        %  verbose style
        %  roman fret label, finger labels below string, straight barre
        c'2^\markup {
          % 110% of default size
          \override #'(size . 1.1) {
            \override #'(fret-diagram-details . (
                         (number-type . roman-lower)
                         (finger-code . below-string)
                         (barre-type . straight))) {
              \fret-diagram-verbose #'((mute 6)
                                       (place-fret 5 3 1)
                                       (place-fret 4 5 2)
                                       (place-fret 3 5 3)
                                       (place-fret 2 5 4)
                                       (place-fret 1 3 1)
                                       (barre 5 1 3))
            }
          }
        }

        %% C major for guitar, barred on third fret
        %% Double barre used to test barre function
        %  verbose style
        c'2^\markup {
          % 110% of default size
          \override #'(size . 1.1) {
            \override #'(fret-diagram-details . (
                         (number-type . arabic)
                         (dot-label-font-mag . 0.9)
                         (finger-code . in-dot)
                         (fret-label-font-mag . 0.6)
                         (fret-label-vertical-offset . 0)
                         (label-dir . -1)
                         (mute-string . "M")
                         (xo-font-magnification . 0.4)
                         (xo-padding . 0.3))) {
              \fret-diagram-verbose #'((mute 6)
                                       (place-fret 5 3 1)
                                       (place-fret 4 5 2)
                                       (place-fret 3 5 3)
                                       (place-fret 2 5 4)
                                       (place-fret 1 3 1)
                                       (barre 4 2 5)
                                       (barre 5 1 3))
            }
          }
        }

        %% C major for guitar, with capo on third fret
        %  verbose style
        c'2^\markup {
          % 110% of default size
          \override #'(size . 1.1) {
            \override #'(fret-diagram-details . (
                         (number-type . roman-upper)
                         (dot-label-font-mag . 0.9)
                         (finger-code . none)
                         (fret-label-vertical-offset . 0.5)
                         (xo-font-magnification . 0.4)
                         (xo-padding . 0.3))) {
              \fret-diagram-verbose #'((mute 6)
                                       (capo 3)
                                       (open 5)
                                       (place-fret 4 5 1)
                                       (place-fret 3 5 2)
                                       (place-fret 2 5 3)
                                       (open 1))
            }
          }
        }

        %% simple D chord
        d'2^\markup {
          \override #'(fret-diagram-details . (
                       (finger-code . below-string)
                       (dot-radius . 0.35)
                       (dot-position . 0.5)
                       (fret-count . 3))) {
            \fret-diagram-terse "x;x;o;2-1;3-2;2-3;"
          }
        }

        %% simple D chord, large top fret thickness
        d'2^\markup {
          \override #'(fret-diagram-details . (
                       (finger-code . below-string)
                       (dot-radius . 0.35)
                       (dot-position . 0.5)
                       (top-fret-thickness . 7)
                       (fret-count . 3))) {
            \fret-diagram-terse "x;x;o;2-1;3-2;2-3;"
          }
        }
      }
    >>

## Génération de crochets personnalisés

Une fonction Scheme personnalisée permet de redéfinir la propriété `stencil` de l’objet `Flag`, de sorte à modifier le glyphe utilisé pour les crochets de croche.

    #(define-public (weight-flag grob)
       (let* ((stem-grob (ly:grob-parent grob X))
              (log (- (ly:grob-property stem-grob 'duration-log) 2))
              (is-up? (eqv? (ly:grob-property stem-grob 'direction) UP))
              (yext (if is-up? (cons (* log -0.8) 0) (cons 0 (* log 0.8))))
              (flag-stencil (make-filled-box-stencil '(-0.4 . 0.4) yext))
              (stroke-style (ly:grob-property grob 'stroke-style))
              (stroke-stencil (if (equal? stroke-style "grace")
                                  (make-line-stencil 0.2 -0.9 -0.4 0.9 -0.4)
                                  empty-stencil)))
         (ly:stencil-add flag-stencil stroke-stencil)))

    % Create a flag stencil by looking up the glyph from the font
    #(define (inverted-flag grob)
       (let* ((stem-grob (ly:grob-parent grob X))
              (dir (if (eqv? (ly:grob-property stem-grob 'direction) UP) "d" "u"))
              (flag (retrieve-glyph-flag "" dir "" grob))
              (line-thickness (ly:staff-symbol-line-thickness grob))
              (stem-thickness (ly:grob-property stem-grob 'thickness))
              (stem-width (* line-thickness stem-thickness))
              (stroke-style (ly:grob-property grob 'stroke-style))
              (stencil (if (null? stroke-style)
                           flag
                           (add-stroke-glyph flag stem-grob dir stroke-style "")))
              (rotated-flag (ly:stencil-rotate-absolute stencil 180 0 0)))
         (ly:stencil-translate rotated-flag (cons (- (/ stem-width 2)) 0))))

    snippetexamplenotes =
    {
      \autoBeamOff c'8 d'16 c'32 d'64 \acciaccatura {c'8} d'64
    }

    {
      \time 1/4
      \textMark "Normal flags"
      \snippetexamplenotes

      \textMark "Custom flag: inverted"
      \override Flag.stencil = #inverted-flag
      \snippetexamplenotes

      \textMark "Custom flag: weight"
      \override Flag.stencil = #weight-flag
      \snippetexamplenotes

      \textMark "Revert to normal"
      \revert Flag.stencil
      \snippetexamplenotes
    }

## Glissando par dessus un objet graphique

Un glissando peut sauter un objet `NoteColumn`.

    \relative c' {
      a2 \glissando
      \once \override NoteColumn.glissando-skip = ##t
      f''4 d,
    }

## Stylisation des lignes de soufflet

Les lignes d’un soufflet peuvent adopter tous les styles permis par la `line-interface` : discontinu, pointillé, continu, ondulé ou en zigzag.

    \relative c' {
      c2\< c\!
      \override Hairpin.style = #'dashed-line
      c2\< c\!
      \override Hairpin.style = #'dotted-line
      c2\< c\!
      \override Hairpin.style = #'line
      c2\< c\!
      \override Hairpin.style = #'trill
      c2\< c\!
      \override Hairpin.style = #'zigzag
      c2\< c\!
      \revert Hairpin.style
      c2\< c\!
    }

## Alignement de nuances personnalisées comme « sempre pp », « più f » ou « subito p »

Certaines indications de nuance requièrent un complément textuel, comme « sempre pp ». Dans la mesure où les nuances sont habituellement centrées sous la note, le pp se trouvera repoussé loin après la note à laquelle il s’applique.

Différentes approches permettent de correctement aligner horizontalement ce « sempre pp » :

- Un simple `\once \override DynamicText.X-offset = #-9.2` avant la note considérée de telle sorte que la nuance soit décalée manuellement à la bonne place. Inconvénient : il faut le faire manuellement à chaque fois qu’intervient ce markup.
- L’intégration d’un rembourrage (`#:hspace 7.1`) à la définition de cette nuance personnalisée afin qu’une fois centrée par LilyPond elle soit correctement alignée. Inconvénient : le rembourrage occupera exactement cet espace et ne permettra à aucun autre markup ou nuance d’apparaître à cet endroit.
- L’application d’un décalage au script de nuance `\once \override … X-offset = …`. Inconvénient : là aussi il faut le faire à chaque fois.
- L’attribution arbitraire d’une dimension à 0 du texte additionnel à l’aide d’un `#:with-dimensions '(0 . 0) '(0 . 0)`. Inconvénient : LilyPond considère que « sempre » n’occupe pas d’espace, et donc pourra mettre à cet endroit d’autres éléments, ce qui pourrait générer des collisions qui ne seront pas détectées par les routines ad hoc. D’autre part, il semble persister un espacement, ce qui laisse l’impression d’un alignement différent en l’absence de texte additionnel.
- L’ajout, explicite, du décalage directement dans la fonction Scheme du script de nuance.
- La définition d’un alignement explicite au sein du script de nuance. Ceci ne sera suivi d’effet, par défaut, qu’en jouant sur `X-offset`. Inconvénient : il faut définir `DynamicText.X-offset`, ce qui s’appliquera à toutes les nuances textuelles. Par ailleurs, l’alignement sera réalisé sur le bord droit du texte additionnel, non sur le milieu de pp.

    \paper {
      ragged-right = ##f
      indent = 2.5\cm
    }

    % Solution 1: Using a simple markup with a particular halign value
    % Drawback: It's a markup, not a dynamic command, so \dynamicDown
    %           etc. will have no effect
    semppMarkup = \markup { \halign #1.4 \italic "sempre" \dynamic "pp" }

    % Solution 2: Using a dynamic script & shifting with
    %             \once \override ...X-offset = ..
    % Drawback: \once \override needed for every invocation
    semppK =
    #(make-dynamic-script
      (markup #:line
              (#:normal-text
               #:italic "sempre"
               #:dynamic "pp")))

    % Solution 3: Padding the dynamic script so the center-alignment
    %             puts it at the correct position
    % Drawback: the padding really reserves the space, nothing else can be there
    semppT =
    #(make-dynamic-script
      (markup #:line
              (#:normal-text
               #:italic "sempre"
               #:dynamic "pp"
               #:hspace 7.1)))

    % Solution 4: Dynamic, setting the dimensions of the additional text to 0
    % Drawback: To lilypond "sempre" has no extent, so it might put
    %           other stuff there => collisions
    % Drawback: Also, there seems to be some spacing, so it's not exactly the
    %           same alignment as without the additional text
    semppM =
    #(make-dynamic-script
      (markup #:line
              (#:with-dimensions '(0 . 0) '(0 . 0)
                                 #:right-align
                                 #:normal-text
                                 #:italic "sempre"
                                 #:dynamic "pp")))

    % Solution 5: Dynamic with explicit shifting inside the scheme function
    semppG =
    #(make-dynamic-script
      (markup #:hspace 0
              #:translate '(-18.85 . 0)
              #:line (#:normal-text
                      #:italic "sempre"
                      #:dynamic "pp")))

    % Solution 6: Dynamic with explicit alignment. This has only effect
    %             if one sets X-offset!
    % Drawback: One needs to set DynamicText.X-offset!
    % Drawback: Aligned at the right edge of the additional text,
    %           not at the center of pp
    semppMII =
    #(make-dynamic-script
      (markup #:line (#:right-align
                      #:normal-text
                      #:italic "sempre"
                      #:dynamic "pp")))

    \new StaffGroup <<
      \new Staff = "s" \with { instrumentName = \markup \column { Normal } }
      <<
        \relative c'' {
          \key es \major
          c4\pp c\p c c | c\ff c c\pp c
        }
      >>
      \new Staff = "sMarkup" \with {
        instrumentName = \markup \column { Normal markup }
      }
      <<
        \relative c'' {
          \key es \major
          c4-\semppMarkup c\p c c | c\ff c c-\semppMarkup c
        }
      >>
      \new Staff = "sK" \with {
        instrumentName = \markup \column { Explicit shifting }
      }
      <<
        \relative c'' {
          \key es \major
          \once \override DynamicText.X-offset = #-9.2
          c4\semppK c\p c c
          c4\ff c
          \once \override DynamicText.X-offset = #-9.2
          c4\semppK c
        }
      >>
      \new Staff = "sT" \with {
        instrumentName = \markup \column { Right padding }
      }
      <<
        \relative c'' {
          \key es \major
          c4\semppT c\p c c | c\ff c c\semppT c
        }
      >>
      \new Staff = "sM" \with {
        instrumentName = \markup \column { Set dimension "to zero" }
      }
      <<
        \relative c'' {
          \key es \major
          c4\semppM c\p c c | c\ff c c\semppM c
        }
      >>
      \new Staff = "sG" \with {
        instrumentName = \markup \column { Shift inside dynamics}
      }
      <<
        \relative c'' {
          \key es \major
          c4\semppG c\p c c | c\ff c c\semppG c
        }
      >>
      \new Staff = "sMII" \with {
        instrumentName = \markup \column { Alignment inside dynamics }
      }
      <<
        \relative c'' {
          \key es \major
          % Setting to ##f (false) gives the same result
          \override DynamicText.X-offset = #0
          c4\semppMII c\p c c | c\ff c c\semppMII c
        }
      >>
    >>

    \layout { \override Staff.InstrumentName.self-alignment-X = #LEFT }

## Repositionnement d’un diagramme de fret

Différents moyens permettent de repositionner un diagramme de fret pour éviter des collisions ou le placer entre deux notes :

- La modification des valeurs de `padding` ou de `extra-offset` comme pour le second diagramme ;
- L’adjonction d’une voix invisible dans laquelle les diagrammes sont attachés à des notes invisibles comme pour le troisième diagramme.

Lorsque le diagramme doit correspondre à une position rythmique dans la mesure, comme au troisième temps de la deuxième mesure, la seconde méthode est plus appropriée puisque le diagramme sera aligné sur le temps.

    harmonies = \chordmode
    {
      a8:13
    % THE FOLLOWING IS THE COMMAND TO MOVE THE CHORD NAME
      \once \override ChordNames.ChordName.extra-offset = #'(10 . 0)
      b8:13 s2.
    % THIS LINE IS THE SECOND METHOD
        s4 s4  b4:13
    }

    \score
    {
      <<
        \new ChordNames \harmonies
        \new Staff
        {a8^\markup { \fret-diagram  "6-x;5-0;4-2;3-0;2-0;1-2;"  }
    % THE FOLLOWING IS THE COMMAND TO MOVE THE FRET DIAGRAM
         \once \override TextScript.extra-offset = #'(10 . 0)
         b4.~^\markup { \fret-diagram  "6-x;5-2;4-4;3-2;2-2;1-4;"  } b4. a8\break
    % HERE IS THE SECOND METHOD
         <<
           { a8 b4.~ b4. a8}
           { s4 s4 s4^\markup { \fret-diagram  "6-x;5-2;4-4;3-2;2-2;1-4;"  }
           }
         >>
       }
      >>
    }

## Insertion d’une césure

Une surcharge de la propriété `text` de l’objet `BreathingSign` permet de créer une marque de césure.

LilyPond dispose également d’une variante courbée.

    \relative c'' {
      \override BreathingSign.text = \markup {
        \musicglyph "scripts.caesura.straight"
      }
      c8 e4. \breathe g8. e16 c4

      \override BreathingSign.text = \markup {
        \musicglyph "scripts.caesura.curved"
      }
      g8 e'4. \breathe g8. e16 c4
    }

## Conservation de la taille lors d’un changement de clef

Lorsqu’un changement de clef intervient, le nouveau signe s’imprime dans une taille inférieure. On peut y déroger avec `full-size-change`.

    \relative c' {
      \clef "treble"
      c1
      \clef "bass"
      c1
      \clef "treble"
      c1
      \override Staff.Clef.full-size-change = ##t
      \clef "bass"
      c1
      \clef "treble"
      c1
      \revert Staff.Clef.full-size-change
      \clef "bass"
      c1
      \clef "treble"
      c1
    }

## Terminaison de ligne en flèche

Les extensions de texte, tout comme les indications sous forme de ligne tel un glissando, peuvent se voir pourvues d’une extrémité en flèche.

    \relative c'' {
      \override TextSpanner.bound-padding = #1.0
      \override TextSpanner.style = #'line
      \override TextSpanner.bound-details.right.arrow = ##t
      \override TextSpanner.bound-details.left.text = #"fof"
      \override TextSpanner.bound-details.right.text = #"gag"
      \override TextSpanner.bound-details.right.padding = #0.6

      \override TextSpanner.bound-details.right.stencil-align-dir-y = #CENTER
      \override TextSpanner.bound-details.left.stencil-align-dir-y = #CENTER

      \override Glissando.bound-details.right.arrow = ##t
      \override Glissando.arrow-length = #0.5
      \override Glissando.arrow-width = #0.25

      a8\startTextSpan gis a4 b\glissando b,
      g'4 c\stopTextSpan c2
    }

## Recours à la propriété `transparent` pour rendre des objets invisibles

Une modification de la propriété `transparent` permet d’imprimer un objet « à l’encre sympathique » : l’objet n’est pas affiché bien que tous ses attributs soient préservés. L’objet en question occupe donc sa place, est pris en compte lors de collisions, et peut se voir attaché liaisons ou ligatures.

Cet exemple illustre la manière de connecter deux voix par une liaison de prolongation. Les liaisons de prolongation ne peuvent normalement intervenir que dans la même voix. Dès lors que la liaison est entamée dans une autre voix et que la première hampe ascendante est rendue transparente dans cette même voix, la liaison semble passer d’une voix à l’autre.

    \relative {
      \time 2/4
      <<
        {
          \once \hide Stem
          \once \override Stem.length = #8
          b'8 ~ 8\noBeam
          \once \hide Stem
          \once \override Stem.length = #8
          g8 ~ 8\noBeam
        }
        \\
        {
          b8 g g e
        }
      >>
    }

## Saut de ligne et glissando

L’affectation de la valeur `#t` à la propriété `breakable`, combinée à `after-line-breaking`, permet la rupture d’une indication de glissando lors d’un saut de ligne.

    glissandoSkipOn = {
      \override NoteColumn.glissando-skip = ##t
      \hide NoteHead
      \override NoteHead.no-ledgers = ##t
    }

    \relative c'' {
      \override Glissando.breakable = ##t
      \override Glissando.after-line-breaking = ##t
      f1\glissando |
      \break
      a4 r2. |
      f1\glissando
      \once \glissandoSkipOn
      \break
      a2 a4 r4 |
    }

## Contrôle manuel du positionnement des ligatures

Le positionnement et la pente des ligatures peuvent être contrôlés manuellement à l’aide d’une adaptation de la propriété `positions` de l’objet `Beam`.

    \relative c' {
      \time 2/4
      % from upper staff-line (position 2) to center (position 0)
      \override Beam.positions = #'(2 . 0)
      c8 c
      % from center to one above center (position 1)
      \override Beam.positions = #'(0 . 1)
      c8 c
    }

## Centrage des numéros de mesure

Il est d’usage, dans les partitions de musique de film, de trouver les numéros de mesure centrés sur leur mesure. Ceci s’obtient en activant la propriété de contexte `centerBarNumbers`. Lorsque cette propriété est utilisée, le type de grob (objet graphique) `BarNumber` est remplacé par `CenteredBarNumber` .

L’exemple ci-dessous illustre plusieurs réglages : les numéros de mesure sont à la fois centrés, encadrés, et disposés sous les portées.

    \layout {
      \context {
        \Score
        centerBarNumbers = ##t
        barNumberVisibility = #all-bar-numbers-visible
        \override CenteredBarNumber.stencil
          = #(make-stencil-boxer 0.1 0.25 ly:text-interface::print)
        \override CenteredBarNumberLineSpanner.direction = #DOWN
      }
    }

    \new StaffGroup <<
      \new Staff \relative c' {
        d4-. f8( e d4) bes'-> |
        d,-. f8( e d4) cis'-> |
        g-. f8( d e4) g-> |
        a,1-> |
      }
      \new Staff \relative c {
        \clef bass
        d4 f8 e d2~ |
        4 f8 e d2~ |
        4 4 2 |
        a1 |
      }
    >>

## Présentation à l’ancienne (barres de mesure entre les portées)

En musique mensurale, les barres de mesure ne traversent pas les portées. Pour obtenir ce résultat il faudra définir `measureBarType` à `"-span|"` et utiliser un regroupement de portées permettant l’extension des barres entre les portées, tel un `StaffGroup`.

    \layout {
      \context {
        \Staff
        measureBarType = "-span|"
      }
    }

    music = \fixed c'' {
      c1
      d2 \section e2
      f1 \fine
    }

    \new StaffGroup <<
      \new Staff \music
      \new Staff \music
    >>

## Modification de la pente de l’extension d’octaviation

Il est possible d’adapter la pente d’une indication d’octaviation.

    \relative c'' {
      \override Staff.OttavaBracket.stencil = #ly:line-spanner::print
      \override Staff.OttavaBracket.bound-details =
        #`((left . ((Y . 0)
                    (attach-dir . ,LEFT)
                    (padding . 0)
                    (stencil-align-dir-y . ,CENTER)))
           (right . ((Y . 5.0) ; Change the number here
                     (padding . 0)
                     (attach-dir . ,RIGHT)
                     (text . ,(make-draw-dashed-line-markup
                               (cons 0 -1.2))))))
      \override Staff.OttavaBracket.left-bound-info =
         #ly:horizontal-line-spanner::calc-left-bound-info-and-text
      \override Staff.OttavaBracket.right-bound-info =
         #ly:horizontal-line-spanner::calc-right-bound-info
      \ottava #1
      c1
      c'''1
    }

## Déplacement des notes pointées dans une polyphonie

Une note pointée appartenant à la voix supérieure d’une portée polyphonique sera par défaut décalée vers la droite afin d’éviter les collisions avec les autres voix. Ce comportement peut être outrepassé à l’aide de la propriété `prefer-dotted-right` de `NoteCollision`.

    \new Staff \relative c' <<
      {
        f2. f4
        \override Staff.NoteCollision.prefer-dotted-right = ##f
        f2. f4
        \override Staff.NoteCollision.prefer-dotted-right = ##t
        f2. f4
      }
      \\
      { e4 e e e e e e e e e e e }
    >>

## Déplacement vertical des liaisons d’articulation

Le positionnement vertical d’une liaison se contrôle par la propriété `positions` de l’objet `Slur`. Cette propriété dispose de deux paramètres : le premier affecte l’extrémité gauche de la liaison, le second son extrémité droite. La valeur des paramètres n’aura aucune influence sur le galbe de la liaison. LilyPond ne s’en servira que pour adapter le positionnement de la courbe. Des valeurs positives décalent la liaison vers le haut et s’utilisent pour des hampes descendantes. Des valeurs négatives entraînent un décalage vers le bas.

    \relative c' {
      \stemDown
      e4( a)
      \override Slur.positions = #'(1 . 1)
      e4( a)
      \override Slur.positions = #'(2 . 2)
      e4( a)
      \override Slur.positions = #'(3 . 3)
      e4( a)
      \override Slur.positions = #'(4 . 4)
      e4( a)
      \override Slur.positions = #'(5 . 5)
      e4( a)
      \override Slur.positions = #'(0 . 5)
      e4( a)
      \override Slur.positions = #'(5 . 0)
      e4( a)
      \stemUp
      \override Slur.positions = #'(-5 . -5)
      e4( a)
      \stemDown
      \revert Slur.positions
      e4( a)
    }

## Imbrications de regroupements de portées

La propriété `systemStartDelimiterHierarchy` permet de créer des regroupements imbriqués complexes. La commande `\set StaffGroup.systemStartDelimiterHierarchy` prend en argument la liste alphabétique des sous-groupes à hiérarchiser. Chaque sous-groupe peut être affublé d’un délimiteur particulier. Chacun des regroupements intermédiaires doit être borné par des parenthèses. Bien que des éléments de la liste puissent être omis, le premier délimiteur embrassera toujours l’intégralité des portées. Vous disposez des quatre délimiteurs `SystemStartBar`, `SystemStartBracket`, `SystemStartBrace` et `SystemStartSquare`.

    \new StaffGroup
    \relative c'' <<
      \override StaffGroup.SystemStartSquare.collapse-height = #4
      \set StaffGroup.systemStartDelimiterHierarchy
        = #'(SystemStartSquare (SystemStartBrace (SystemStartBracket a
                                 (SystemStartSquare b)  ) c ) d)
      \new Staff { c1 }
      \new Staff { c1 }
      \new Staff { c1 }
      \new Staff { c1 }
      \new Staff { c1 }
    >>

## Personnalisation de certains types d’articulation

On peut parfois vouloir modifier un seul type d’articulation. Bien que ce soit tout à fait faisable avec un `\tweak`, cela devient vite fastidieux d’affiner chaque occurrence d’un même signe dans toute une partition. Le code ci-dessous illustre la manière de modifier des articulations grâce à une liste de réglages personnalisés. Ceci peut servir à créer des feuilles de style.

La fonction `\customScripts` ici proposée peut se placer, depuis la version 2.16.2, dans un bloc `\layout`.

    % Code by David Nalesnik and Thomas Morley

    #(define (custom-script-tweaks ls)
      (lambda (grob)
        (let* ((type (ly:event-property
                        (ly:grob-property grob 'cause)
                        'articulation-type))
               (tweaks (assoc-ref ls type)))
          (if tweaks
              (for-each
                (lambda (x) (ly:grob-set-property! grob (car x) (cdr x)))
                tweaks)))))

    customScripts =
    #(define-music-function (settings) (list?)
    #{
      \override Script.before-line-breaking =
        #(custom-script-tweaks settings)
    #})

    revertCustomScripts = \revert Script.before-line-breaking

    %%%%%%%%%%%%%
    % Example:
    %%%%%%%%%%%%%

    % Predefine a list of desired tweaks.
    #(define my-settings-1
      '(
        (staccato . ((color . (1 0 0))
                     (padding . 0.5)))
        (accent . ((font-size . 0)
                   (color . (1 0 0))))
        (tenuto . ((rotation . (45 0 0))
                   (padding . 2)
                   (font-size . 10)))
        (staccatissimo . ((padding . 1)
                          (color . (1 0 0))))
        (segno . ((font-size . 0)
                  (color . (1 0 0))))
        ))

    #(define my-settings-2
      '(
        (staccato . ((color . (0 1 0))))
        (accent . ((font-size . 4)
                   (color . (0 1 0))
                   (padding . 1.5)))
        (tenuto . ((font-size . 10)))
        (staccatissimo . ((padding . 2)
                          (color . (0 1 0))))
        (coda . ((color . (0 1 0))
                 (padding . 1)))
        ))

    one =
    \relative c'' {
      f1--
      \customScripts #my-settings-1
      f-. f-! f-> f-- f-!\segno
      \revertCustomScripts
      f-> f-.
    }

    two =
    \relative c' {
      f1--
      \customScripts #my-settings-2
      f-. f-! f-> f---> f-!
      f-> f-.\coda
    }

    \new Staff <<
       \new Voice { \voiceOne \one }
       \new Voice { \voiceTwo \two }
       >>

## Overriding articulations of distinct type

Sometimes you may want to affect a single articulation type. Although it is always possible to use `\tweak`, it might become tedious to do so for every single sign of a whole score. The following shows how to tweak articulations with a list of custom settings. One use case might be to create a style sheet.

With 2.16.2 it is possible to put the proposed function, `\customScripts`, into a `\layout` block.

    % Code by David Nalesnik and Thomas Morley

    #(define (custom-script-tweaks ls)
      (lambda (grob)
        (let* ((type (ly:prob-property
                        (ly:grob-property grob 'cause)
                        'articulation-type))
               (tweaks (assoc-ref ls type)))
          (if tweaks
              (for-each
                (lambda (x) (ly:grob-set-property! grob (car x) (cdr x)))
                tweaks)))))

    customScripts =
    #(define-music-function (settings)(list?)
    #{
      \override Script.before-line-breaking =
        #(custom-script-tweaks settings)
    #})

    revertCustomScripts = { \revert Script.before-line-breaking }

    %%%%%%%%%%%%%
    % Example:
    %%%%%%%%%%%%%

    % Predefine a list of desired tweaks.
    #(define my-settings-1
      '(
        ("staccato" . ((color . (1 0 0))(padding . 0.5)))
        ("accent" . ((font-size . 0)(color . (1 0 0))))
        ("tenuto" . ((rotation . (45 0 0)) (padding . 2)(font-size . 10)))
        ("staccatissimo" . ((padding . 1) (color . (1 0 0))))
        ("segno" . ((font-size . 0)(color . (1 0 0))))
        ))

    #(define my-settings-2
      '(
        ("staccato" . ((color . (0 1 0))))
        ("accent" . ((font-size . 4)(color . (0 1 0))(padding . 1.5)))
        ("tenuto" . ((font-size . 10)))
        ("staccatissimo" . ((padding . 2) (color . (0 1 0))))
        ("coda" . ((color . (0 1 0)) (padding . 1)))
        ))

    one =
    \relative c'' {
      f1--
      \customScripts #my-settings-1
      f-. f-! f-> f-- f-!\segno
      \revertCustomScripts
      f-> f-.
    }

    two =
    \relative c' {
      f1--
      \customScripts #my-settings-2
      f-. f-! f-> f---> f-!
      f-> f-.\coda
    }

    \new Staff <<
       \new Voice { \voiceOne \one }
       \new Voice { \voiceTwo \two }
       >>

## Affichage du numéro de répétition en pourcent

Le numéro de mesure répétée sera imprimé à intervalle régulier si vous déterminez la propriété de contexte `repeatCountVisibility`.

    \relative c'' {
      \set countPercentRepeats = ##t
      \set repeatCountVisibility = #(every-nth-repeat-count-visible 5)
      \repeat percent 10 { c1 } \break
      \set repeatCountVisibility = #(every-nth-repeat-count-visible 2)
      \repeat percent 6 { c1 d1 }
    }

## Positionnement des arpeggios

L’ajustement de la taille d’une indication d’arpeggio s’effectue au travers du positionnement de ses extrémités haute ou basse.

    \relative c' {
      <c e g b>1\arpeggio
      \once \override Arpeggio.positions = #'(-5 . 0)
      <c e g b>1\arpeggio
      \once \override Arpeggio.positions = #'(0 . 5)
      <c e g b>1\arpeggio
      \once \override Arpeggio.positions = #'(-5 . 5)
      <c e g b>1\arpeggio
    }

## Positionnement des silences multimesures

Si l’on peut positionner verticalement un silence simple en le rattachant à une note, il n’en va pas de même pour un silence multimesure. Néanmoins, et uniquement dans le cadre de musique polyphonique, les silences multimesures sont positionnés différemment selon qu’ils appartiennent à une voix au numéro pair ou impair.

Le positionnement des silences multimesures peut se contrôler ainsi :

    \relative c'' {
      % Multi-measure rests by default are set under the fourth line
      R1
      % They can be moved using an override
      \override MultiMeasureRest.staff-position = #-2
      R1
      \override MultiMeasureRest.staff-position = #0
      R1
      \override MultiMeasureRest.staff-position = #2
      R1
      \override MultiMeasureRest.staff-position = #3
      R1
      \override MultiMeasureRest.staff-position = #6
      R1
      \revert MultiMeasureRest.staff-position
      \break

      % In two Voices, odd-numbered voices are under the top line
      << { R1 } \\ { a1 } >>
      % Even-numbered voices are under the bottom line
      << { a1 } \\ { R1 } >>
      % Multi-measure rests in both voices remain separate
      << { R1 } \\ { R1 } >>

      % Separating multi-measure rests in more than two voices
      % requires an override
      << { R1 } \\ { R1 } \\
         \once \override MultiMeasureRest.staff-position = #0
         { R1 }
      >>

      % Using compressed bars in multiple voices requires another override
      % in all voices to avoid multiple instances being printed
      \compressMMRests
      <<
       \revert MultiMeasureRest.direction
        { R1*3 }
        \\
       \revert MultiMeasureRest.direction
        { R1*3 }
      >>
    }

## Positionnement d’une annotation à l’intérieur d’une liaison

Lorsqu’une annotation doit s’incrire à l’intérieur d’une liaison, la propriété `outside-staff-priority` doit être désactivée.

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

## Inscrire le numéro de mesure dans un cadre ou un cercle

Les numéros de mesure peuvent être encadrés ou entourés d’un cercle.

    \relative c' {
      % Prevent bar numbers at the end of a line and permit them elsewhere
      \override Score.BarNumber.break-visibility = #end-of-line-invisible
      \set Score.barNumberVisibility = #(every-nth-bar-number-visible 4)

      % Increase the size of the bar number by 2
      \override Score.BarNumber.font-size = #2

      % Draw a box round the following bar number(s)
      \override Score.BarNumber.stencil
        = #(make-stencil-boxer 0.1 0.25 ly:text-interface::print)
      \repeat unfold 5 { c1 }

      % Draw a circle round the following bar number(s)
      \override Score.BarNumber.stencil
        = #(make-stencil-circler 0.1 0.25 ly:text-interface::print)
      \repeat unfold 4 { c1 } \bar "|."
    }

## Impression du métronome et des repères sous la portée

Les indications de tempo et les marques de repère s’impriment par défaut au-dessus de la portée. Le fait de régler en conséquence la propriété `direction` des objets `MetronomeMark` et `RehearsalMark` les placera au-dessous de la portée.

    \layout {
      indent = 0
      ragged-right = ##f
    }

    {
      % Metronome marks below the staff
      \override Score.MetronomeMark.direction = #DOWN
      \tempo 8. = 120
      c''1

      % Rehearsal marks below the staff
      \override Score.RehearsalMark.direction = #DOWN
      \mark \default
      c''1
    }

## Impression du nom des notes avec ou sans indication d’octave

Le contexte `NoteNames` permet d’imprimer le nom des notes. La propriété `printOctaveNames`, une fois activée, leur adjoindra une indication d’octave.

    scale = \relative c' {
      a4 b c d
      e4 f g a
    }

    \new Staff {
      <<
        \scale
        \context NoteNames {
          \set printOctaveNames = ##f
          \scale
        }
      >>
      R1
      <<
        \scale
        \context NoteNames {
          \set printOctaveNames = ##t
          \scale
        }
      >>
    }

## Affichage du crochet de n-olet du côté des têtes de note

Quelle que soit l’option choisie pour contrôler la visibilité d’une indication de n-olet, elle s’affichera ou sera masquée indépendamment de son positionnement (côté hampe ou tête de note). Toutefois, lorsqu’elle se place du côté des têtes de note, certains auteurs recommandent de toujours afficher un crochet. L’option `visible-over-note-heads` permet d’y parvenir.

    music = \relative c'' {
      \tupletNeutral \tuplet 3/2 { c16[ d e } f8]
      \tupletUp \tuplet 3/2 { c8 d e }
    }

    \new Voice {
      \relative c' {
        \time 2/4
        \override TupletBracket.visible-over-note-heads = ##t
        \override Score.TextMark.non-musical = ##f
        { \textMark \markup "default" \music }
        \override TupletBracket.bracket-visibility = #'if-no-beam
        { \textMark \markup \typewriter "'if-no-beam" \music }
      }
    }

## Espacement strictement proportionnel des notes

Lorsque la propriété `strict-note-spacing` est activée, l’espacement des notes dans un système ne tient compte ni des barres de mesure ni des clefs, qui se retrouvent placées juste avant la note qui tombe au même moment. Ceci peut entraîner certaines collisions.

    \relative c'' <<
      \override Score.SpacingSpanner.strict-note-spacing = ##t
      \set Score.proportionalNotationDuration = #(ly:make-moment 1/16)
      \new Staff {
        c8[ c \clef alto c c \grace { d16 } c8 c] c4
        c2 \grace { c16[ c16] } c2
      }
      \new Staff {
        c2 \tuplet 3/2 { c8 \clef bass cis,, c } c4
        c1
      }
    >>

## Retrait de l’accolade à la première ligne d’une pièce pour piano

Dans cet extrait est supprimée la première accolade d’un `PianoStaff` ou d’un `GrandStaff`.

Ceci peut s’avérer utile pour couper et coller l’image générée dans de la musique préexistante.

Est utilisée la fonction `\alterBroken`.

    someMusic =  {
      \once \override Staff.Clef.stencil = ##f
      \once \override Staff.TimeSignature.stencil = ##f
      \repeat unfold 3 c1 \break
      \repeat unfold 5 c1 \break
      \repeat unfold 5 c1
    }

    \score {
      \new PianoStaff
      <<
        \new Staff = "right" \relative c'' \someMusic
        \new Staff = "left" \relative c' { \clef F \someMusic }
      >>
      \layout {
        indent=75
        \context {
          \PianoStaff
          \alterBroken transparent #'(#t) SystemStartBrace
        }
      }
    }

## Suppression de la partie interportée des barres de mesure d’un regroupement autre que `ChoirStaff`

Les barres de mesure des regroupements `StaffGroup`, `PianoStaff` et `GrandStaff` sont par défaut d’un seul tenant. La portion entre les portées – l’objet `SpanBar` – peut néanmoins être supprimée, portée par portée.

    \relative c' {
      \new StaffGroup <<
        \new Staff {
          e1 | e
          \once \override Staff.BarLine.allow-span-bar = ##f
          e1 | e | e
        }
        \new Staff {
          c1 | c | c
          \once \override Staff.BarLine.allow-span-bar = ##f
          c1 | c
        }
        \new Staff {
          a1 | a | a | a | a
        }
      >>
    }

## Masquage de la première ligne si elle est vide

Par défaut, le premier système comportera absolument toutes les portées. Si vous préférez masquer les portées vides y compris pour le premier système, vous devrez activer la propriété `remove-first` du `VerticalAxisGroup`. Mentionnée dans un bloc `\layout`, cette commande agira de manière globale. Pour qu’elle ne soit effective que pour une portée particulière, vous devrez également spécifier le contexte (`Staff` pour qu’il ne concerne que la portée en cours) en préfixe de la propriété.

La première ligne inférieure du deuxième `StaffGroup` est bien présente, pour la simple raison que le réglage en question ne s’applique qu’à la portée dans laquelle il a été inscrit.

    \layout {
      \context {
        \Staff \RemoveEmptyStaves
        % To use the setting globally, uncomment the following line:
        % \override VerticalAxisGroup.remove-first = ##t
      }
    }
    \new StaffGroup <<
      \new Staff \relative c' {
        e4 f g a \break
        c1
      }
      \new Staff {
        % To use the setting globally, comment this line,
        % uncomment the line in the \layout block above
        \override Staff.VerticalAxisGroup.remove-first = ##t
        R1 \break
        R
      }
    >>
    \new StaffGroup <<
      \new Staff \relative c' {
        e4 f g a \break
        c1
      }
      \new Staff {
        R1 \break
        R
      }
    >>

## Styles de silences

Les silences peuvent être gravés selon différents styles.

    \new Staff \relative c {
      \omit Score.TimeSignature
      \cadenzaOn

      \override Staff.Rest.style = #'mensural
      r\maxima^\markup \typewriter { mensural }
      r\longa r\breve r1 r2 r4 r8 r16 s32 s64 s128 s128
      \bar ""
      \break

      \override Staff.Rest.style = #'neomensural
      r\maxima^\markup \typewriter { neomensural }
      r\longa r\breve r1 r2 r4 r8 r16 s32 s64 s128 s128
      \bar ""
      \break

      \override Staff.Rest.style = #'classical
      r\maxima^\markup \typewriter { classical }
      r\longa r\breve r1 r2 r4 r8 r16 r32 r64 r128 s128
      \bar ""
      \break

      \override Staff.Rest.style = #'z
      r\maxima^\markup \typewriter { z-style }
      r\longa r\breve r1 r2 r4 r8 r16 r32 r64 r128 s128
      \bar ""
      \break

      \override Staff.Rest.style = #'default
      r\maxima^\markup \typewriter { default }
      r\longa r\breve r1 r2 r4 r8 r16 r32 r64 r128 s128
    }

## Barres rythmiques

Il arrive, dans une feuille de chant « simple », que les notes soient remplacées par une « pulsation » et que la structure de la chanson soit indiquée par les accords au-dessus des mesures. Ceci peut être utile lorsque l’on crée ou retranscrit la structure d’une chanson, ainsi que pour donner au guitariste et musiciens de jazz une pseudo partition.

Le fonctionnement standard d’un `\repeat percent` n’est pas ici applicable puisque le premier temps doit être une note ou un silence.

Le code ci-dessous propose deux alternatives à ce problème en redéfinissant l’aspect d’un silence. Si la durée d’un temps ne correspond pas à la noire, le `r4` inclus dans la définition devra être remplacé par un silence de durée appropriée.

    % Macro to print single slash
    rs = {
      \once \override Rest.stencil = #ly:percent-repeat-interface::beat-slash
      \once \override Rest.thickness = #0.48
      \once \override Rest.slope = #1.7
      r4
    }

    % Function to print a specified number of slashes
    comp = #(define-music-function (count) (integer?)
      #{
        \override Rest.stencil = #ly:percent-repeat-interface::beat-slash
        \override Rest.thickness = #0.48
        \override Rest.slope = #1.7
        \repeat unfold $count { r4 }
        \revert Rest.stencil
      #}
    )

    \score {
      \relative c' {
        c4 d e f |
        \rs \rs \rs \rs |
        \comp #4 |
      }
    }

## Séparation entre altérations annulées et nouvelle armure

Les altérations supprimées lors d’un changement de tonalité sont par défaut accolées à la nouvelle armure. Ce comportement peut s’adapter grâce à la propriété `break-align-orders` de l’objet `BreakAlignment`.

La valeur de `break-align-orders` est constituée d’un vecteur à trois composantes listant l’ordre des éléments à l’occasion d’une rupture. Seule la deuxième liste est ici modifiée, `key-cancellation` étant déplacé avant `staff-bar`. En ne modifiant que la deuxième liste, cette modification dans l’ordre d’apparition des éléments sera effective seulement en cours de système, et non en début ou fin de ligne.

    \new Staff {
      \override Score.BreakAlignment.break-align-orders =
        ##((left-edge ambitus breathing-sign clef staff-bar
                       key-cancellation key-signature time-signature custos)

            (left-edge ambitus breathing-sign clef key-cancellation
                       staff-bar key-signature time-signature custos)

            (left-edge ambitus breathing-sign clef key-cancellation
                       key-signature staff-bar time-signature custos))

      \key des \major
      c'1
      \bar "||"
      \key bes \major
      c'1
    }

## Soufflets et barres de mesure

En principe, un soufflet – (de)crescendo imprimé sous forme graphique – commence au bord gauche de la note de départ, et se termine au bord droit de la note d’arrivée. Cependant, si la note d’arrivée est sur un premier temps, le soufflet s’arrêtera au niveau de la barre de mesure qui la précède. Ce comportement peut être annulé en assignant faux (`#f`) à la propriété `to-barline`.

    \relative c'' {
      e4\< e2.
      e1\!
      \override Hairpin.to-barline = ##f
      e4\< e2.
      e1\!
    }

## Séparation visuelle entre les systèmes

La séparation entre deux systèmes consécutifs peut être mise en évidence par n’importe quel markup. LilyPond dispose à cet effet d’une double oblique inversée : `\slashSeparator`.

    \paper {
      system-separator-markup = \slashSeparator
      line-width = 120
    }

    notes = \relative c' {
      c1 | c \break
      c1 | c \break
      c1 | c
    }

    \book {
      \score {
        \new GrandStaff <<
          \new Staff \notes
          \new Staff \notes
        >>
      }
    }

## Impression d’une même articulation des deux côtés d’une note ou d’un accord

LilyPond ne permet pas, par défaut, qu’une même articulation (accent, flageolet, point d’orgue, etc.) se retrouve à la fois au-dessus et au-dessous d’une note. Par exemple, `c4_\fermata^\fermata` ne donnera qu’un seul point d’orgue en dessous du do ; celui du dessus sera tout bonnement ignoré.

On peut néanmoins accoler des scripts, tels des doigtés, à l’intérieur d’un accord ; il peut donc y avoir autant d’articulations que de besoin, ce qui, par voie de conséquence, permet de s’affranchir de la présence des hampes et de positionner l’articulation relativement à la tête de note comme dans le cas du flageolet ci-dessous. L’imitation du traitement d’un script externe à un accord requérant un `'add-stem-support` demande de libeller la note comme étant un accord et d’ajouter les articulations au sein de la construction `<…>`.

Un simple amendement permettra de rectifier le positionnement habituel en surplomb : `<c-\tweak direction #DOWN-\fermata^\fermata>`

    \relative c' {
      <>^"Wrong"
      c2_\fermata^\fermata % The second fermata is ignored!
      <e d'>2^\flageolet_\flageolet

      \stopStaff s1 \startStaff

      <>^"Works if written inside a chord"
      <e_\flageolet d'^\flageolet>2
      <e_\flageolet d'^\flageolet>2
      <e_\flageolet^\flageolet>2
      <e_\fermata^\fermata>2
    }

## Ligne de prolongation pour numéro de corde

Voici comment ajouter une ligne de prolongation à une indication de numéro de corde, afin de stipuler que les notes qui suivent doivent être jouées sur la corde en question.

    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
    }

## Suppression des avertissements de chevauchement

If notes from two voices with stems in the same direction are placed at the same position, and both voices have no shift or the same shift specified, the error message ‘`warning: ignoring too many clashing note columns`’ will appear when compiling the LilyPond file. This message can be suppressed by setting the `'ignore-collision` property of the `NoteColumn` object to `#t`. Please note that this does not just suppress warnings but stops LilyPond trying to resolve collisions at all and so may have unintended results unless used with care.

    ignore = \override NoteColumn.ignore-collision = ##t

    \relative c' {
      \new Staff <<
        \new Voice { \ignore \stemDown f2 g }
        \new Voice { c2 \stemDown c, }
      >>
    }

## Métrique entre parenthèses

Une métrique peut être mise entre parenthèses.

    \relative c'' {
      \override Staff.TimeSignature.stencil = #(lambda (grob)
        (bracketify-stencil (ly:time-signature::print grob) Y 0.1 0.2 0.1))
      \time 2/4
      a4 b8 c
    }

## Métrique entre parenthèses – méthode 3

Autre manière de mettre la métrique entre parenthèses.

    \relative c'' {
      \override Staff.TimeSignature.stencil = #(lambda (grob)
        (parenthesize-stencil (ly:time-signature::print grob) 0.1 0.4 0.4 0.1 ))
      \time 2/4
      a4 b8 c
    }

## Affichage seulement du numérateur d’une métrique (au lieu d’une fraction)

La métrique est parfois indiquée non pas par une fraction (par ex. 7/4) mais simplement par son numérateur (le chiffre 7 dans ce cas). L’instruction `\override Staff.TimeSignature.style = #'single-digit` permet de déroger au style par défaut de manière permanente – un `\revert Staff.TimeSignature.style` annulera ces modifications. Lorsque cette métrique sous la forme d’un seul chiffre ne se présente qu’une seule fois, il suffit de faire précéder l’instruction `\override` d’un simple `\once`.

    \relative c'' {
      \time 3/4
      c4 c c
      % Change the style permanently
      \override Staff.TimeSignature.style = #'single-digit
      \time 2/4
      c4 c
      \time 3/4
      c4 c c
      % Revert to default style:
      \revert Staff.TimeSignature.style
      \time 2/4
      c4 c
      % single-digit style only for the next time signature
      \once \override Staff.TimeSignature.style = #'single-digit
      \time 5/4
      c4 c c c c
      \time 2/4
      c4 c
    }

## Crochet de n-olet et changement de portée

Voici comment obtenir un crochet de n-olet qui débute sur une portée et se termine dans l’autre.

    aigues = \relative c' {
      \time 6/8
      s4.
      \stemDown
      c16[ bes' e]
      \stemUp
      g c e
      \stemDown
      g8
    }

    basses = \relative c {
      \time 3/4
      \clef F
      \tweak positions #'(4.5 . 9.5)
      \tweak edge-height #'(1 . -1)
      \tuplet 7/6 {
        c16[ bes' e]
        \change Staff = md
        \stemUp
        g[ c e g]
      }
      s4.s8
    }

    \new PianoStaff
    \with { \omit TimeSignature }
    <<
      \new Staff = md \aigues
      \new Staff = mg \basses
    >>

## Affinage des propriétés d’une clef

Modifier le glyphe, la position de la clef ou son octaviation ne changeront pas la position des notes ; il faut pour y parvenir modifier aussi la position du do médium. La redéfinition préalable de `middleCClefPosition` permet de placer l’armure sur les bonnes lignes. Le positionnement est relatif à la ligne médiane, un nombre positif faisant monter, un nombre négatif abaissant.

Par exemple, la commande `\clef "treble_8"` équivaut à définir `clefGlyph`, `clefPosition` – qui contrôle la position verticale de la clef – `middleCPosition` et `clefOctavation`. Une nouvelle clef apparaîtra dès lors que l’une de ces propriétés, à l’exception de `middleCPosition`, aura été modifiée.

Les exemples qui suivent illustrent les différentes possibilités de définir ces propriétés manuellement. Sur la première ligne, la position relative des notes par rapport aux clefs est préservée, ce qui n’est pas le cas pour la deuxième ligne.

    {
      % The default treble clef
      \key f \major
      c'1
      % The standard bass clef
      \set Staff.clefGlyph = #"clefs.F"
      \set Staff.clefPosition = #2
      \set Staff.middleCPosition = #6
      \set Staff.middleCClefPosition = #6
      \key g \major
      c'1
      % The baritone clef
      \set Staff.clefGlyph = #"clefs.C"
      \set Staff.clefPosition = #4
      \set Staff.middleCPosition = #4
      \set Staff.middleCClefPosition = #4
      \key f \major
      c'1
      % The standard choral tenor clef
      \set Staff.clefGlyph = #"clefs.G"
      \set Staff.clefPosition = #-2
      \set Staff.clefTransposition = #-7
      \set Staff.middleCPosition = #1
      \set Staff.middleCClefPosition = #1
      \key f \major
      c'1
      % A non-standard clef
      \set Staff.clefPosition = #0
      \set Staff.clefTransposition = #0
      \set Staff.middleCPosition = #-4
      \set Staff.middleCClefPosition = #-4
      \key g \major
      c'1 \break

      % The following clef changes do not preserve
      % the normal relationship between notes, key signatures
      % and clefs:

      \set Staff.clefGlyph = #"clefs.F"
      \set Staff.clefPosition = #2
      c'1
      \set Staff.clefGlyph = #"clefs.G"
      c'1
      \set Staff.clefGlyph = #"clefs.C"
      c'1
      \set Staff.clefTransposition = #7
      c'1
      \set Staff.clefTransposition = #0
      \set Staff.clefPosition = #0
      c'1

      % Return to the normal clef:

      \set Staff.middleCPosition = #0
      c'1
    }

## Mise en forme des notes d’ornement

Il est possible de changer globalement la mise en forme des notes d’ornement dans un morceau, au moyen des fonctions `add-grace-property` et `remove-grace-property`.

Ici, par exemple, on ôte la définition de l’orientation des objets `Stem` pour toutes les petites notes, afin que les hampes ne soient pas toujours orientées vers le haut, et on leur préfère des têtes en forme de croix.

    \relative c'' {
      \new Staff {
        $(remove-grace-property 'Voice 'Stem 'direction)
        $(add-grace-property 'Voice 'NoteHead 'style 'cross)
        \new Voice {
           \acciaccatura { f16 } g4
           \grace { d16 e } f4
           \appoggiatura { f,32 g a } e2
        }
      }
    }

## Crochets de style alternatif

Une dérogation à la propriété `stencil` de l’objet `Flag` permet aux croches et notes de durée inférieure d’adopter une autre forme de crochet. Sont disponibles les variantes `modern-straight-flag`, `old-straight-flag` et `flat-flag`.

    testnotes = {
      \autoBeamOff
      c8 d16 c32 d64 \acciaccatura { c8 } d64 r4
    }

    \score {
      \relative c' {
        \time 2/4
        \testnotes

        \override Flag.stencil = #modern-straight-flag
        \testnotes

        \override Flag.stencil = #old-straight-flag
        \testnotes

        \override Flag.stencil = #flat-flag
        \testnotes

        \revert Flag.stencil
        \testnotes
      }
      \layout {
        indent = 0
        \context {
          \Score
          \override NonMusicalPaperColumn.line-break-permission = ##f
        }
      }
    }

## Utilisation de `ly:grob-object` pour accéder aux grobs avec `\tweak`

Certains objets graphiques ne sont accessibles que par le biais d’un callback à partir d’un autre `grob`. Ils sont normalement listés dans les « layout objects » au sein de la section « Propriétés internes » d’une grob-interface. La fonction `ly:grob-object` permet d’accéder à ces objets.

Voici plusieurs moyens d’accéder aux objets par un callback sur `NoteHead`. D’autres biais sont naturellement possibles ; `NoteHead` a cependant l’avantage incontestable d’être utilisé implicitement par la commande `\tweak`.

La fonction `display-grobs` définie ci-dessous n’est probablement pas très utile. Elle indique toutefois qu’il est tout à fait possible d’accéder aux objets.

Voici par exemple ce qui sera émis dans la console :

>     --------------------
>     #<Grob Accidental >
>     #<Grob Arpeggio >
>     #<Grob Stem >

    #(define (notehead-get-accidental notehead)
       ;; notehead is grob
       (ly:grob-object notehead 'accidental-grob))

    #(define (notehead-get-arpeggio notehead)
       ;; notehead is grob
       (let ((notecolumn (notehead-get-notecolumn notehead)))
         (ly:grob-object notecolumn 'arpeggio)))

    #(define (notehead-get-notecolumn notehead)
       ;; notehead is grob
       (ly:grob-parent notehead X))

    #(define (notehead-get-stem notehead)
       ;; notehead is grob
       (let ((notecolumn (notehead-get-notecolumn notehead)))
         (ly:grob-object notecolumn 'stem)))

    #(define (display-grobs notehead)
       ;; notehead is grob
       (let ((accidental (notehead-get-accidental notehead))
             (arpeggio (notehead-get-arpeggio notehead))
             (stem (notehead-get-stem notehead)))
         (format (current-error-port) "~2&~a\n" (make-string 20 #\-))
         (for-each
          (lambda (x) (format (current-error-port) "~a\n" x))
          (list accidental arpeggio stem))))

    \relative c' {
      %% display grobs for each note head:
      %\override NoteHead.before-line-breaking = #display-grobs
      <c
      %% or just for one:
      \tweak before-line-breaking #display-grobs
      es
      g>1\arpeggio
    }

## Utilisation de PostScript pour générer des têtes de note à l’allure particulière

Lorsqu’il est impossible d’obtenir facilement une allure particulière pour les têtes de note en recourant à la technique du `\markup`, un code PostScript peut vous tirer d’embarras. Voici comment générer des têtes ressemblant à des parallélogrammes.

    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
    }

## Utilisation de `\tweak` pour retoucher des objets particuliers

La commande `\tweak` permet de retoucher directement n’importe quel objet graphique. En voici quelques exemples :

    \relative c' {
      \time 2/4
      \set fingeringOrientations = #'(right)
      <
        \tweak font-size #3 c
        \tweak color #red d-\tweak font-size #8 -4
        \tweak style #'cross g
        \tweak duration-log #2 a
      >2
    }

## Alignement vertical des nuances et indications textuelles

Tous les objets `DynamicLineSpanner` (soufflets ou nuances textuelles) viennent s’aligner sur une ligne de référence placée, par rapport à la portée, à au moins la valeur de `'staff-padding` sauf lorsque d’autres éléments de notation les en éloignent plus. Les nuances seront centrés sur une même ligne dès lors que `'staff-padding` aura été défini à une valeur suffisante.

C’est le même principe – en combinaison avec `\textLengthOn` – qui sert à aligner les indications textuelles sur une ligne de référence.

    music = \relative c' {
      a'2\p b\f
      e4\p f\f\> g, b\p
      c2^\markup { \huge gorgeous } c^\markup { \huge fantastic }
    }

    {
      \music
      \break
      \override DynamicLineSpanner.staff-padding = #3
      \textLengthOn
      \override TextScript.staff-padding = #1
      \music
    }

## Positionnement d’une ossia et des paroles

Cet exemple illustre la manière de positionner une portée d’ossia et des paroles à l’aide des propriétés de contexte `alignBelowContext` et `alignAboveContext`.

    \paper {
      ragged-right = ##t
    }

    \relative c' <<
      \new Staff = "1" { c4 c s2 }
      \new Staff = "2" { c4 c s2 }
      \new Staff = "3" { c4 c s2 }
      { \skip 2
        <<
          \lyrics {
            \set alignBelowContext = #"1"
            lyrics4 below
          }
          \new Staff \with {
            alignAboveContext = #"3"
            fontSize = #-2
            \override StaffSymbol.staff-space = #(magstep -2)
            \remove "Time_signature_engraver"
          } {
            \tuplet 6/4 {
              \override TextScript.padding = #3
              c8[^"ossia above" d e d e f]
            }
          }
        >>
      }
    >>

## Prolongateur commun de basse figurée

L’activation de la propriété `useBassFigureExtenders` permet d’afficher des lignes de prolongation pour les chiffres qui se répètent. Deux chiffres prolongés sur la même durée se verront affublés d’un unique prolongateur, verticalement centré entre eux, dès lors que la propriété `figuredBassCenterContinuations` aura elle aussi été activée.

    <<
      \relative c' {
        c8 c b b a a c16 c b b
        c8 c b b a a c16 c b b
        c8 c b b a a c c b b
      }
      \figures {
        \set useBassFigureExtenders = ##t
        <6+ 4 3>4 <6 4 3>8 r
        <6+ 4 3>4 <6 4 3>8 <4 3+>16 r
        \set figuredBassCenterContinuations = ##t
        <6+ 4 3>4 <6 4 3>8 r
        <6+ 4 3>4 <6 4 3>8 <4 3+>16 r
        \set figuredBassCenterContinuations = ##f
        <6+ 4 3>4 <6 4 3>8 r
        <6+ 4 3>4 <6 4 3>8 <4 3+>8
      }
    >>

#### LilyPond — Morceaux choisis v2.24.4 (branche stable).