LilyPond snippets: Expressive marks

# Expressive marks

Expressive marks

## Coexistence de ligatures et liaisons avec des rythmes comprenant des n-olets

La syntaxe de LilyPond demande parfois un positionnement inhabituel des parenthèses, crochets, etc. qui peuvent s’entrelacer.

Par exemple, le crochet ouvrant une ligature manuelle se place à la suite de la note de départ et sa durée, non pas avant. De même, le crochet fermant se place à la fin de la ligature, y compris lorsque la dernière note se trouve incluse dans un n-olet.

Cet extrait illustre la manière de combiner ligatures manuelles, liaisons d’articulation, de prolongation ou de phrasé, avec des n-olets bornées par des accolades.

    {
      r16[ g16 \tuplet 3/2 { r16 e'8] }
      g16( a \tuplet 3/2 { b d e') }
      g8[( a \tuplet 3/2 { b d') e'] ~ }
      \time 2/4
      \tuplet 5/4 { e'32\( a b d' e' } a'4.\)
    }

## Mise entre parenthèses d’un signe d’interprétation ou d’une note d’un accord

La fonction `\parenthesize`, qui permet de mettre un objet entre parenthèses, a ceci de particulier qu’elle est associée à un objet graphique `Parentheses`.

    \relative c' {
      c2-\parenthesize ->
      \override Parentheses.padding = #0.1
      \override Parentheses.font-size = #-4
      <d \parenthesize f a>2
    }

## 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 du galbe des chutes ou sauts

La propriété `shortest-duration-space` peut devoir être retouchée pour ajuster l’apparence des chutes ou sauts.

    \relative c'' {
      \override Score.SpacingSpanner.shortest-duration-space = #4.0
      c2-\bendAfter #5
      c2-\bendAfter #-4.75
      c2-\bendAfter #8.5
      c2-\bendAfter #-6
    }

## Alignement des bornes de soufflet relativement aux `NoteColumn`s

Les terminaisons des soufflets peuvent s’aligner sur la gauche, au centre ou sur la droite des grobs `NoteColumn` à l’aide d’une dérogation à la propriété `endpoint-alignments` – `LEFT`, `CENTER` ou `RIGHT` – sous forme de paire représentant les extrémités gauche et droite du soufflet. Les `endpoint-alignments` devraient être des directions (soit -1, 0 ou 1), les autres valeurs entraînant l’émission d’un avertissement. L’extrémité droite d’un soufflet se terminant sur un silence ne sera pas affectée et s’alignera toujours sur le bord gauche de ce silence.

    {
      c'2\< <c' d'>\! |
      \override Hairpin.endpoint-alignments = #'(1 . -1)
      c'2\< <c' d'>\! |
      \override Hairpin.endpoint-alignments = #`(,LEFT . ,CENTER)
      c'2\< <c' d'>\! |
    }

## Brève alternative, avec deux barres verticales

Voici comment obtenir une brève – aussi appelée note carée – flanquée de deux barres verticales, au lieu d’une comme habituellement.

    \relative c'' {
      \time 4/2
      c\breve |
      \override Staff.NoteHead.style = #'altdefault
      b\breve
      \override Staff.NoteHead.style = #'baroque
      b\breve
      \revert Staff.NoteHead.style
      a\breve
    }

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

## Signes de respiration

Les indications de respiration sont disponibles sous différentes formes : virgule (par défaut), trait, en V ou en « voie de chemin de fer » (césure).

    \new Staff \relative c'' {
      \key es \major
      \time 3/4
      % this bar contains no \breathe
      << { g4 as g } \\ { es4 bes es } >> |
      % Modern notation:
      % by default, \breathe uses the rcomma, just as if saying:
      % \override BreathingSign.text =
      %   #(make-musicglyph-markup "scripts.rcomma")
      << { g4 as g } \\ { es4 \breathe bes es } >> |

      % rvarcomma and lvarcomma are variations of the default rcomma
      % and lcomma
      % N.B.: must use Staff context here, since we start a Voice below
      \override Staff.BreathingSign.text =
        \markup { \musicglyph "scripts.rvarcomma" }
      << { g4 as g } \\ { es4 \breathe bes es } >> |

      % raltcomma and laltcomma are alternative variations of the
      % default rcomma and lcomma
      \override Staff.BreathingSign.text =
        \markup { \musicglyph "scripts.raltcomma" }
      << { g4 as g } \\ { es4 \breathe bes es } >> |

      % vee
      \override BreathingSign.text =
        \markup { \musicglyph "scripts.upbow" }
      es8[ d es f g] \breathe f |

      % caesura
      \override BreathingSign.text =
        \markup { \musicglyph "scripts.caesura.curved" }
      es8[ d] \breathe es[ f g f] |
      es2 r4 \bar "||"
    }

## Soufflet de crescendo partiellement interrompu

Une portion d’un soufflet de crescendo peut être rendue invisible. Il suffit pour cela de dessiner un rectangle par dessus ce tronçon, ce qui aura pour effet de le rendre invisible. Ce rectangle est défini au sein d’un markup par du code PostScript.

La commande de markup `with-dimensions` indique à LilyPond de ne prendre en considération que l’extrémité inférieure du rectangle lors de son positionnement par rapport au soufflet. L’ajustement de la propriété `staff-padding` permet d’éviter au rectangle de venir s’intercaler entre le soufflet et la portée.

Le soufflet doit se trouver à un niveau inférieur à celui du markup afin que le dessin du rectangle puisse effectivement le recouvrir.

    \relative c' {
      <<
        {
          \dynamicUp
          r2 r16 c'8.\pp r4
        }
        \\
        {
          \override DynamicLineSpanner.layer = #0
          des,2\mf\< ~
          \override TextScript.layer = #2
          \once\override TextScript.staff-padding = #6
          \once\override TextScript.vertical-skylines = #'()
          des16_\markup \with-dimensions #'(2 . 7) #'(0 . 0)
                        \with-color #white
                        \filled-box #'(2 . 7) #'(0 . 2) #0
          r8. des4 ~ des16->\sff r8.
        }
      >>
    }

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

## Texte centré sous un soufflet

La fonction comprise dans l’extrait suivant permet d’ajouter du texte – comme « molto » ou « poco » – en dessous d’un soufflet de (de)crescendo. Cet exemple présente aussi comment, à l’aide de code Scheme, influencer la manière dont un objet est normalement imprimé.

    \paper { tagline = ##f }

    hairpinWithCenteredText =
    #(define-music-function (text) (markup?)
      #{
        \once \override Voice.Hairpin.after-line-breaking =
          #(lambda (grob)
            (let* ((stencil (ly:hairpin::print grob))
                   (par-y (ly:grob-parent grob Y))
                   (dir (ly:grob-property par-y 'direction))
                   (staff-line-thickness
                     (ly:output-def-lookup (ly:grob-layout grob) 'line-thickness))
                   (new-stencil (ly:stencil-aligned-to
                     (ly:stencil-combine-at-edge
                       (ly:stencil-aligned-to stencil X CENTER)
                       Y dir
                       (ly:stencil-aligned-to
                         (grob-interpret-markup
                           grob
                           (make-fontsize-markup
                             (magnification->font-size
                               (+ (ly:staff-symbol-staff-space grob)
                                  (/ staff-line-thickness 2)))
                               text)) X CENTER))
                     X LEFT))
                   (staff-space (ly:output-def-lookup
                     (ly:grob-layout grob) 'staff-space))
                   (par-x (ly:grob-parent grob X))
                   (dyn-text (grob::has-interface par-x 'dynamic-text-interface))
                   (dyn-text-stencil-x-length
                     (if dyn-text
                       (interval-length
                         (ly:stencil-extent (ly:grob-property par-x 'stencil) X))
                       0))
                   (x-shift
                     (if dyn-text
                       (-
                         (+ staff-space dyn-text-stencil-x-length)
                         (* 0.5 staff-line-thickness)) 0)))

            (ly:grob-set-property! grob 'Y-offset 0)
            (ly:grob-set-property! grob 'stencil
               (ly:stencil-translate-axis
                new-stencil
                x-shift X))))
      #})

    hairpinMolto =
    \hairpinWithCenteredText \markup { \italic molto }

    hairpinMore =
    \hairpinWithCenteredText \markup { \larger moltissimo }

    \layout { ragged-right = ##f }

    \relative c' {
      \hairpinMolto
      c2\< c\f
      \hairpinMore
      c2\ppppp\< c\f
      \break
      \hairpinMolto
      c2^\< c\f
      \hairpinMore
      c2\ppppp\< c\f
    }

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

## Modification de l’aspect des liaisons d’articulation

Une liaison d’articulation peut se présenter sous la forme d’un trait continu ou discontinu, voire en pointillé.

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

## Modification de l’indicateur de respiration

On peut choisir le glyphe imprimé par cette commande, en modifiant la propriété `text` de l’objet `BreathingSign`, pour lui affecter n’importe quelle indication textuelle.

    \relative c'' {
      c2
      \override BreathingSign.text =
        \markup { \musicglyph "scripts.rvarcomma" }
      \breathe
      d2
    }

## Spécification du nombre de points d’augmentation d’une note

Le nombre de points d’augmentation affectés à une note en particulier peut se modifier indépendamment des points placés après la note.

    \relative c' {
      c4.. a16 r2 |
      \override Dots.dot-count = #4
      c4.. a16 r2 |
      \override Dots.dot-count = #0
      c4.. a16 r2 |
      \revert Dots.dot-count
      c4.. a16 r2 |
    }

## Combinaison de nuance et de texte

Certaines indications de nuance peuvent requérir un complément textuel, comme « più forte » ou « piano subito ». Elles se réalisent aisément à l’aide d’un bloc `\markup`.

    piuF = \markup { \italic più \dynamic f }

    \layout { ragged-right = ##f }

    \relative c'' {
      c2\f c-\piuF
    }

## Glissando contemporain

De nos jours, il peut arriver que la note d’arrivée d’un glissando soit absente de la partition. Pour ce faire, il vous faudra utiliser une cadence et « masquer » la note d’arrivée.

    \relative c'' {
      \time 3/4
      \override Glissando.style = #'zigzag
      c4 c
      \cadenzaOn
      c4\glissando
      \hideNotes
      c,,4
      \unHideNotes
      \cadenzaOff
      \bar "|"
    }

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

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

## Arpège distribué sur plusieurs voix

Affecter le graveur `Span_arpeggio_engraver` au contexte de la portée (`Staff`) permet de distribuer un arpège sur plusieurs voix.

    \new Staff \with {
      \consists "Span_arpeggio_engraver"
    }
    \relative c' {
      \set Staff.connectArpeggios = ##t
      <<
        { <e' g>4\arpeggio <d f> <d f>2 }
        \\
        { <d, f>2\arpeggio <g b>2 }
      >>
    }

## Arpège distribué sur une partition pour piano

Dans une double portée pour piano (`PianoStaff`), un arpège peut s’étendre sur les deux portées grâce à la propriété `PianoStaff.connectArpeggios`.

    \new PianoStaff \relative c'' <<
      \set PianoStaff.connectArpeggios = ##t
      \new Staff {
        <c e g c>4\arpeggio
        <g c e g>4\arpeggio
        <e g c e>4\arpeggio
        <c e g c>4\arpeggio
      }
      \new Staff {
        \clef bass
        \repeat unfold 4 {
          <c,, e g c>4\arpeggio
        }
      }
    >>

## Arpège distribué pour un autre contexte que le piano

Il est possible de distribuer un arpège sur plusieurs portées d’un système autre que le `PianoStaff` dès lors que vous incluez le `Span_arpeggio_engraver` au contexte `Score`.

    \score {
      \new ChoirStaff {
        \set Score.connectArpeggios = ##t
        <<
          \new Voice \relative c' {
            <c e>2\arpeggio
            <d f>2\arpeggio
            <c e>1\arpeggio
          }
          \new Voice \relative c {
            \clef bass
            <c g'>2\arpeggio
            <b g'>2\arpeggio
            <c g'>1\arpeggio
          }
        >>
      }
      \layout {
        \context {
          \Score
          \consists "Span_arpeggio_engraver"
        }
      }
    }

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

## Indications de nuance vraiment entre parenthèses

Bien que le moyen le plus simple pour ajouter des parenthèses à une indication de nuance consiste à utiliser un bloc `\markup`, cette pratique a un inconvénient : les objets ainsi créés seront considérés comme des annotations textuelles, non comme des nuances.

Il est néanmoins possible de créer des objets particuliers en partant de code Scheme – comme expliqué dans le manuel de notation – avec la fonction `make-dynamic-script`. Les markups ainsi créés seront alors considérés comme étant des indications de nuance, et de ce fait pourront se voir appliquer les effets des commandes `\dynamicUp` et `\dynamicDown`.

    paren =
    #(define-event-function (dyn) (ly:event?)
       (make-dynamic-script
        #{ \markup \concat {
             \normal-text \italic \fontsize #2 (
    	 \pad-x #0.2 #(ly:music-property dyn 'text)
    	 \normal-text \italic \fontsize #2 )
           }
        #}))

    \relative c'' {
      c4\paren\f c c \dynamicUp c\paren\p
    }

## Création d’une liaison entre plusieurs voix

Dans certaines situations, il peut être nécessaire de lier des notes appartenant à des voix différentes. La solution consiste à ajouter une note invisible dans l’une des voix, à l’aide de la commande `\hideNotes`.

Voici par exemple la mesure 235 de la chaconne de la seconde partita pour violon solo, BWV 1004, de Bach.

    \relative c' {
      <<
        {
          d16( a') s a s a[ s a] s a[ s a]
        }
        \\
        {
          \slurUp
          bes,16[ s e](
          \hideNotes a)
          \unHideNotes f[(
          \hideNotes a)
          \unHideNotes fis](
          \hideNotes a)
          \unHideNotes g[(
          \hideNotes a)
          \unHideNotes gis](
          \hideNotes a)
        }
      >>
    }

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

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

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

## Masquage de l’extension des nuances textuelles

Les crescendos et decrescendos indiqués textuellement – tels que cresc. ou dim. – sont suivis de pointillés qui montrent leur étendue. On peut empêcher l’impression de ces pointillés.

    \relative c'' {
      \override DynamicTextSpanner.style = #'none
      \crescTextCresc
      c1\< | d | b | 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 }

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

## Liaison « Laissez vibrer »

Les indications de « laisser vibrer » ont une taille fixe. Leur formatage est accessible au travers de la propriété `tie-configuration`.

    \relative c' {
      <c e g>4\laissezVibrer r <c f g>\laissezVibrer r
      <c d f g>4\laissezVibrer r <c d f g>4.\laissezVibrer r8

      <c d e f>4\laissezVibrer r
      \override LaissezVibrerTieColumn.tie-configuration
         = #`((-7 . ,DOWN)
              (-5 . ,DOWN)
              (-3 . ,UP)
              (-1 . ,UP))
      <c d e f>4\laissezVibrer r
    }

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

## Dessin d’une liaison d’articulation au trait discontinu

Grâce à la propriété `dash-definition`, une liaison d’articulation peut être formée de traits discontinus variables. `dash-definition` se compose d’une liste de `segments-discontinus` (dash-elements). Chaque `segment-discontinu` contient une liste de paramètres qui déterminent le comportement du trait pour une section de la liaison.

Cette liaison se définit selon le paramètre de Bézier `t` qui est compris entre 0 (l’extrémité gauche de la liaison) et 1 (l’extrémité droite de la liaison). Chaque `segment-discontinu` se composera selon la liste `(t-début t-fin segment-style segment-taille)`. La portion de liaison allant de `t-début` à `t-fin` aura un trait `segment-style` de longueur `segment-taille`. `segment-taille` est exprimé en espace de portée ; un `segment-style` à 1 donnera un trait plein.

    \relative c' {
      \once \override
        Slur.dash-definition = #'((0 0.3 0.1 0.75)
                                    (0.3 0.6 1 1)
                                    (0.65 1.0 0.4 0.75))
      c4( d e f)
      \once \override
        Slur.dash-definition = #'((0 0.25 1 1)
                                    (0.3 0.7 0.4 0.75)
                                    (0.75 1.0 1 1))
      c4( d e f)
    }

## Modification de la signification des raccourcis pour les signes d’articulation

Les raccourcis sont répertoriés dans le fichier ‘`ly/script-init.ly`’, dans lequel on retrouve les variables `dashHat`, `dashPlus`, `dashDash`, `dashBang`, `dashLarger`, `dashDot` et `dashUnderscore` ainsi que leur valeur par défaut. Ces valeurs peuvent être modifiées selon vos besoins. Il suffit par exemple, pour affecter au raccourci `-+` (`dashPlus`) le symbole du trille en lieu et place du `+` (caractère plus), d’assigner la valeur `\trill` à la variable `dashPlus` :

    \relative c'' { c1-+ }

    dashPlus = \trill

    \relative c'' { c1-+ }

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

## Déplacer les extrémités de soufflets

Les terminaisons des soufflets peuvent être décalées en jouant sur la propriété `shorten-pair` de l’objet`Hairpin`. Les valeurs positives déplacent vers l’intérieur, les négatives vers l’extérieur. Contrairement à la propriété `minimum-length`, cette propriété n’affecte que l’apparence du soufflet sans ajuster l’espacement horizontal (y compris avec les nuances textuelles). Cette méthode est donc appropriée aux situations dans lesquelles un soufflet requiert un ajustement fin dans l’espace qui lui est alloué.

    {
      c'1~\<
      c'2~ c'\!
      \once \override Hairpin.shorten-pair = #'(2 . 2)
      c'1~\<
      c'2~ c'\!
      \once \override Hairpin.shorten-pair = #'(-2 . -2)
      c'1~\<
      c'2~ c'\!
      c'1~\p-\tweak shorten-pair #'(2 . 0)\<
      c'2~ c'\ffff
    }

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

## Différents styles de soufflet

Les soufflets de nuance peuvent adopter des styles différents.

    \relative c'' {
      \override Hairpin.stencil = #flared-hairpin
      a4\< a a a\f
      a4\p\< a a a\ff
      a4\sfz\< a a a\!
      \override Hairpin.stencil = #constante-hairpin
      a4\< a a a\f
      a4\p\< a a a\ff
      a4\sfz\< a a a\!
      \override Hairpin.stencil = #flared-hairpin
      a4\> a a a\f
      a4\p\> a a a\ff
      a4\sfz\> a a a\!
      \override Hairpin.stencil = #constante-hairpin
      a4\> a a a\f
      a4\p\> a a a\ff
      a4\sfz\> a a a\!
    }

## Impression de soufflets « al niente »

Des crescendos ou decrescendos al niente peuvent être indiqués de manière graphique, en assignant vrai (`#t`) à la propriété `circled-tip`, ce qui affiche un cercle à leur extrémité.

    \relative c'' {
      \override Hairpin.circled-tip = ##t
      c2\< c\!
      c4\> c\< c2\!
    }

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

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

## Ajustement de la longueur d’un soufflet

Si un soufflet est trop court, il suffit d’ajuster la propriété `minimum-length` de l’objet `Hairpin` pour l’allonger.

    <<
      {
        \after 4 \< \after 2 \> \after 2. \! f'1
        \override Hairpin.minimum-length = #8
        \after 4 \< \after 2 \> \after 2. \! f'1
      }
      {
        \repeat unfold 8 c'4
      }
    >>

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

## Slap ou pizzicato Bartok

Un slap, aussi appelé pizzicato à la Bartók, est un pizzicato où, au lieu de tirer la corde de côté comme à l’accoutumée, « on la pince en la soulevant plus fortement, et à la verticale, en la lâchant violemment. Celle-ci frappe alors la touche, et produit à la fois la note et le son percussif » (Wikipedia). Il s’indique par un cercle flanqué d’un trait vertical.

    \relative c' {
      c4\snappizzicato
      <c' e g>4\snappizzicato
      <c' e g>4^\snappizzicato
      <c, e g>4_\snappizzicato
    }

## Remplacement du signe de respiration par une coche

Les musiques vocales ou pour vents utilisent souvent une coche en tant que signe de respiration. Ceci indique une respiration qui enlève une fraction à la note précédente plutôt qu’une véritable pause comme le fait un signe sous forme de virgule. La coche peut être remontée un peu afin de l’isoler de la portée.

    \relative c'' {
      c2
      \breathe
      d2
      \override BreathingSign.Y-offset = #2.6
      \override BreathingSign.text =
        \markup { \musicglyph "scripts.tickmark" }
      c2
      \breathe
      d2
    }

## Utilisation d’un `arpeggioBracket` pour rendre les divisions plus évidentes

Un crochet d’arpège (`arpeggioBracket`) permet de mettre en évidence les divisions d’un pupitre en l’absence de hampe, comme on le voit régulièrement dans les partitions pour chœur.

    \include "english.ly"

    \score {
      \relative c'' {
        \key a \major
        \time 2/2
        <<
          \new Voice = "upper"
          <<
            { \voiceOne \arpeggioBracket
              a2( b2
              <b d>1\arpeggio)
              <cs e>\arpeggio ~
              <cs e>4
            }
            \addlyrics { \lyricmode { A -- men. } }
          >>
          \new Voice = "lower"
          { \voiceTwo
            a1 ~
            a
            a ~
            a4 \bar "|."
          }
        >>
      }
      \layout { ragged-right = ##t }
    }

## Accords et double liaison d’articulation

Certains compositeurs utilisent deux liaisons lorsqu’ils veulent lier des accords. Dans LilyPond, il faut pour cela activer la propriété `doubleSlurs`.

    \relative c' {
      \set doubleSlurs = ##t
      <c e>4( <d f> <c e> <d f>)
    }

## Utilisation de la propriété `whiteout`

Tout objet graphique peut s’imprimer sur un fond blanc afin de masquer une partie des objets qu’il recouvre. Ceci trouve toute son utilité pour améliorer certaines collisions, notamment dans des situations où un repositionnement d’objets est irréaliste. Il faut alors explicitement définir la propriété `layer` afin de contrôler quels objets seront masqués par le fond blanc. Dans l’exemple ci-dessous, la liaison est en collision avec la métrique ; la situation est améliorée dès lors que la portion de liaison qui traverse la métrique est masquée par l’affectation de la propriété `whiteout` à l’objet `TimeSignature`. Pour ce faire, `TimeSignature` est déplacé sur un calque au-dessus de celui de `Tie` – il reste sur le calque par défaut (1) –, puis le `StaffSymbol` est placé sur un calque supérieur à celui de `TimeSignature` pour ne pas être masqué.

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

## Articulation baroque en forme de coche

On trouve régulièrement, en musique baroque, cette courte ligne verticale. Sa signification peut varier, mais elle indique le plus souvent une note plus « appuyée ». Voici comment générer ce signe particulier.

    upline =
    \tweak stencil
      #(lambda (grob)
        (grob-interpret-markup grob #{ \markup \draw-line #'(0 . 1) #}))
      \stopped

    \relative c' {
      a'4^\upline a( c d')_\upline
    }

## Alignement vertical des nuances sur plusieurs notes

Des nuances qui commencent, finissent ou se produisent sur une même note auront le même alignement vertical. L’augmentation de la propriété `staff-padding` de l’objet `DynamicLineSpanner` permet d’aligner différentes nuances affectées à différentes notes.

    \relative c' {
      \override DynamicLineSpanner.staff-padding = #4
      c2\p f\mf
      g2\< b4\> c\!
    }

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