LilyPond snippets: Expressive marks

# Expressive marks

Expressive marks

## Añadir barras, ligaduras de expresión y de unión, etc. cuando se usan ritmos con y sin grupos de valoración especial.

La sintaxis de LilyPond puede implicar muchas colocaciones poco comunes para los paréntesis, corchetes, etc, que a veces se tienen que intercalar. Por ejemplo, al introducir una barra manual, el corchete izquierdo de apertura se debe escribir después de la nota inicial y de su duración, no antes. De forma similar, el corchete derecho de cierre debe seguir inmediatamente a la nota que se quiere situar al final del barrado, incluso si esta nota resulta estar dentro de un grupo de valoración especial. Este fragmento de código muestra cómo combinar el barrado manual, las ligaduras de expresión y de unión y las ligaduras de fraseo, con secciones de valoración especial (encerradas entre llaves).

    {
      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.\)
    }

## Encerrar entre paréntesis una marca expresiva o una nota de un acorde

La función `\parenthesize` es un truco especial que encierra objetos entre paréntesis. El grob asociado es `Parentheses`.

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

## Añadir marcas de tiempo a glissandos largos

Los pulsos que se saltan en glissandos muy largos se indican a veces mediante marcas de tiempo, que a menudo consisten en figuras sin cabeza. Estas plicas se pueden usar también para albergar indicaciones expresivas intermedias.

Si las plicas no quedan bien alineadas con el glissando, podría ser necesario recolocarlas ligeramente.

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

## Ajustar la forma de las subidas y caídas de tono

Puede ser necesario trucar la propiedad `shortest-duration-space` para poder ajustar el tamaño de las caídas y subidas de tono («falls» y «doits»).

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

## Aligning the ends of hairpins to NoteColumn directions

The ends of hairpins may be aligned to the `LEFT`, `CENTER` or `RIGHT` of `NoteColumn` grobs by overriding the property `endpoint-alignments`, which is a pair of numbers representing the left and right ends of the hairpin. `endpoint-alignments` are expected to be directions (either -1, 0 or 1). Other values will be transformed with a warning. The right end of a hairpin terminating at a rest is not affected, always ending at the left edge of the rest.

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

## Formas alternativas de la figura breve

Las figuras de breve también están disponibles con dos líneas verticales a los lados de la cabeza en lugar de una sola línea y la forma en estilo barroco.

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

## Ligaduras asimétricas

Se puede hacer que una ligadura de expresión sea asimétrica para adaptarse mejor a un patrón asimétrico de notas.

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

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

## Marcas de respiración

Las marcas de respiración están disponibles para varios gustos: coma (la predeterminada), raya corta, uve y “vías del tren” (cesura).

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

## Regulador interrumpido

Para hacer invisibles partes de un regulador de crescendo, se usa el método de dibujar un rectángulo blanco encima de la parte respectiva del regulador, tapándola. El rectángulo se define como código de postscript dentro de un elemento de marcado de texto.

La instrucción de marcado `with-dimensions` indica a LilyPond que considere solamente el extremo inferior del rectángulo cuando realice el espaciado de éste frente al regulador. La propiedad `staff-padding` evita que el rectángulo quepa entre el regulador y el pentagrama.

Asegúrse de que el regulador está en una capa más baja que el elemento de marcado de texto para trazar el rectángulo encima del regulador.

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

## Cesura tipo "vías del tren"con calderón

A veces se denota una «cesura» mediante una doble marca de respiración parecida a las vías del tren, con un calderón encima. Este fragmento de código presenta una combinación visualmente satisfactoria de estas dos marcas.

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

## Centrar texto debajo de un regulador

Este ejemplo proporciona una función para tipografiar un regulador con texto por debajo, como “molto” o “poco”. El texto añadido cambia la dirección de acuerdo con la del regulador. El objeto Hairpin está alineado con DynamicText.

El ejemplo ilustra también cómo modificar la manera en que se imprime normalmente un objeto, utilizando código de Scheme.

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

## Cambiar el texto y los estilos de objeto de extensión para las indicaciones dinámicas textuales

Se puede modificar el texto empleado para los crescendos y decrescendos modificando las propiedades de contexto `crescendoText` y `decrescendoText`.

El estilo de la línea de extensión se puede cambiar modificando la propiedad `'style` de `DynamicTextSpanner`. El valor predeterminado es `'dashed-line` (línea discontinua), y entre otros valores posibles se encuentran `'line` (línea), `'dotted-line` (línea de puntos) y `'none` (nada):

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

## Modificar el aspecto continuo de una ligadura de expresión a punteado o intermitente

Se puede cambiar el aspecto de las ligaduras de expresión de continuas a punteadas o intermitentes.

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

## Cambiar el símbolo de la marca de respiración

El glifo de la marca de respiración se puede ajustar sobreescribiendo la propiedad de texto del objeto de presentación `BreathingSign`, con cualquier otro texto de marcado.

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

## Modificar el número de puntillos de una nota

La cantidad de puntillos de una nota se puede modificar independientemente de los puntillos que se escriben después de la nota.

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

## Combinar indicaciones dinámicas con marcados textuales

Ciertas indicaciones dinámicas pueden llevar textos (como “più forte” o “piano subito”). Se pueden producir usando un bloque `\markup`.

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

    \layout { ragged-right = ##f }

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

## Glissando contemporáneo

Se puede tipografiar un gissando contemporáneo sin nota final utilizando una nota oculta y temporalización de cadenza.

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

## Controlar la visibilidad de los objetos de

extensión después de un salto de línea

La visibilidad de los objetos de extensión que acaban en la primera nota después de un salto de línea está controlada por la función de callback de `after-line-breaking` `ly:spanner::kill-zero-spanned-time`.

Para los objetos como los glissandos y los reguladores, el comportamiento predeterminado es ocultar el objeto de extensión después del salto; la inhabilitación de la función de callback hace que el objeto de extensión roto por la izquierda pueda mostrarse.

De forma inversa, los objetos de extensión que son visibles normalmente, como los objetos de extensión de texto, se pueden ocultar habilitando la función de callback.

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

## Controlar la ordenación vertical de las inscripciones

El orden vertical que ocupan las inscripciones gráficas está controlado con la propiedad `'script-priority`. Cuanto más bajo es este número, más cerca de la nota se colocará. En este ejemplo, el `TextScript` (el sostenido) tiene primero la prioridad más baja, por lo que se sitúa en la posición más baja en el primer ejemplo. En el segundo, el `Script` (el semitrino) es el que la tiene más baja, por lo que se sitúa en la parte interior. Cuando dos objetos tienen la misma prioridad, el orden en que se introducen determina cuál será el que aparece en primer lugar.

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

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

## Crear un grupeto de anticipación

La creación de un grupeto circular de anticipación entre dos notas, donde la nota inferior del grupeto utiliza una alteración, requiere varias sobreescrituras de propiedades. La propiedad `outside-staff-priority` se debe establecer al valor `#f`, pues en caso contrario tendría prioridad sobre la propiedad `avoid-slur property`. Cambiando las fracciones `2/3` y `1/3` puede ajustarse la posición horizontal.

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

## Crear arpegios entre notas de voces distintas

Se puede trazar un símbolo de arpegio entre notas de distintas voces que están sobre el mismo pentagrama si el grabador `Span_arpeggio_engraver` se traslada al contexto de `Staff`:

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

## Crear arpegios que se cruzan entre pentagramas dentro de un sistema de piano

Dentro de un `PianoStaff`, es posible hacer que un arpegio cruce entre los pentagramas ajustando la propiedad `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
        }
      }
    >>

## Creación de arpegios que se cruzan entre pentagramas dentro de otros contextos

Se pueden crear arpegios que se cruzan entre pentagramas dentro de contextos distintos a `GrandStaff`, `PianoStaff` y `StaffGroup` si se incluye el grabador `Span_arpeggio_engraver` en el contexto de `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"
        }
      }
    }

## Crear digitaciones de dos cifras

Es posible crear digitaciones con un número mayor de 5.

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

## Crear indicaciones dinámicas "verdaderas"entre paréntesis

Aunque la manera más fácil de añadir paréntesis a una indicación de dinámica es utilizar un bloque `\markup`, este método tiene un inconveniente: los objetos que se crean se comportarán como elementos de marcado de texto y no como indicaciones dinámicas.

Sin embargo, es posible crear un objeto similar utilizando el código de Scheme equivalente (como se explica en la Referencia de la notación), en combinación con la función `make-dynamic-script`. De esta forma, el elemento de marcado se tratará como una indicación dinámica, y por tanto seguirá siendo compatible con instrucciones como `\dynamicUp` o `\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
    }

## Hacer ligaduras entre voces distintas

En determinadas situaciones es necesario crear ligaduras de expresión entre notas que están en voces distintas.

La solución es añadir notas invisibles a una de las voces utilizando `\hideNotes`.

Este ejemplo es el compás 235 de la Chacona de la segunda Partita para violín 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)
        }
      >>
    }

## Crear elementos de extensión textuales

Las instrucciones `\startTextSpan` y `\stopTextSpan` permiten la creación de elementos de extensión textuales tan fácilmente como indicaciones de pedal u octavaciones. Sobreescribimos ciertas propiedades del objeto `TextSpanner` para modificar su salida.

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

## Objeto personalizado de extensión de texto de matices dinámicos, postfijo

Funciones postfijas para la creación de objetos de extensión de texto personalizados. Los objetos de extensión deben comenzar en la primera nota del compás. Hay que utilizar -\mycresc, en caso contrario el comienzo del eobjeto de extensión se asignará a la nota siguiente.

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

## Objetos extensores de texto postfijos para dinámica

Los objetos de extensión \cresc, \dim y \decresc ahora se pueden redefinir como operadores postfijos y producir un solo objeto de extensión de texto. La definición de extensores personalizados también es fácil. Se pueden mezclar con facilidad los crescendi textuales y en forma de reguladores. \< y \> producen reguladores gráficos de forma predeterminada, \cresc etc. producen elementos extensores de texto de forma predeterminada.

    % 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 por debajo de un objeto gráfico

Los objetos gráficos de columna de nota (los grobs `NoteColumn`) pueden ser sobrepasados por los glissandos.

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

## Reguladores con distintos estilos de línea

Los reguladores pueden imprimirse en uno cualquiera de los estilos de `line-interface`: discontinuo, punteado, línea, trino o zig-zag.

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

## Ocultar la línea de extensión de las expresiones textuales de dinámica

Los cambios de dinámica con estilo de texto (como cresc. y dim.) se imprimen con una línea intermitente que muestra su alcance. Esta línea se puede suprimir de la siguiente manera:

    \relative c'' {
      \override DynamicTextSpanner.style = #'none
      \crescTextCresc
      c1\< | d | b | c\!
    }

## Alinear horizontalmente indicaciones dinámicas personalizadas (p.ej. "sempre pp""piu f""subito p")

Algunas expresiones de matiz dinámico llevan texto adicional, como "sempre pp". Dado que los matices suelen ir centrados bajo la nota, el \pp se imprimiría mucho después de la nota a la que se aplica el matiz.

Para alinear correctamente el "sempre pp" en sentido horizontal, de manera que se alinee como si estuviese solamente el \pp, hay varios enfoques:

* Sencillamente usar `\once\override DynamicText.X-offset = #-9.2` antes de la nota que lleva el matiz, para desplazarlo manualmente a la posicion correcta. Inconveniente: hay que hacerlo manualmente cada vez que usamos esa indicación dinámica.

* Añadir algo de relleno (`#:hspace 7.1`) dentro de la definición de nuestra indicación dinámica personalizada, de forma que despues de que lilypond la ha centrado, ya esté alineada correctamente. Inconveniente: el relleno realmente ocupa ese espacio y no permite que se imprima ningún otro elemento de marcado o matiz dinámico en esa posición.

* Desplazar la inscripción dinámica `\once\override ... .X-offset = ..`. Inconveniente: ¡se necesita `\once\override` para cada una de las invocaciones!

* Fijar las dimensiones del texto adicional a cero (usando `#:with-dimensions '(0 . 0) '(0 . 0)`). Inconveniente: para LilyPond "sempre" no tiene dimensiones, por lo que podría imprimir otros elementos en su mismo lugar y producir colisiones (que no serían advertidas por el mecanismo de detección de colisiones). Asimismo, aparentemente hay algún espacio, y por tanto no es exactamente la misma alineación que sin el texto adicional.

* Añadir un desplazamiento explícito directamente dentro de la función de Scheme que produce el elemento dynamic-script.

* Fijar una alineación explícita dentro del dynamic-script. De forma predeterminada, esto no tendría ningún efecto, a no ser que fijásemos un valor para X-offset. Inconveniente: tenemos que dar un valor a `DynamicText.X-offset` ¡que se aplicaría a todos los textos de dinámica!. Asimismo, se alinea con el extremo derecho del texto adicional, no con el centro del 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 }

## Insertar una cesura

Las marcas de cesura se pueden crear sobreescribiendo la propiedad `'text` del objeto `BreathingSign`. También está disponible una marca de cesura curva.

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

## Ligaduras “Laissez vibrer”

Las ligaduras “Laissez vibrer” (dejar vibrar) tienen un tamaño fijo. Se puede ajustar su formato usando `'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
    }

## Puntas de flecha para las líneas

Se pueden aplicar puntas de flecha a los elementos de extensión de texto y de línea (como el Glissando).

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

## Hacer ligaduras de expresión con estructura compleja de discontinuidad

Las ligaduras de expresión se pueden construir con patrones de discontinuidad complejos mediante la definición de la propiedad `dash-definition`. `dash-definition` es una lista de `elementos de discontinuidad`. Un `elemento de discontinuidad` es una lista de parámetros que definen el comportamiento de discontinuidad de un segmento de la ligadura de expresión.

La ligadura se define en términos del parámetro de bezier t cuyo rango va de 0 a la izquierda de la ligadura hasta 1 en el extremo derecho de la ligadura. Cada `elemento de discontinuidad` es una lista `(t-inicio t-final fracción-discontinuidad período-discontinuidad)`. La región de la ligadura desde `t-inicio` hasta `t-final` tendrá una fracción `fracción-discontinuidad` de cada `período-discontinuidad` de color negro. `período-discontinuidad` se define en términos de espacios de pentagrama. `fracción-discontinuidad` se establece al valor de 1 para una ligadura continua.

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

## Modificar los valores predeterminados para la notación abreviada de las articulaciones

Las abreviaturas se encuentran definidas dentro del archivo ‘`ly/script-init.ly`’, donde las variables `dashHat`, `dashPlus`, `dashDash`, `dashBang`, `dashLarger`, `dashDot` y `dashUnderscore` reciben valores predeterminados. Se pueden modificar estos valores predeterminados para las abreviaturas. Por ejemplo, para asociar la abreviatura `-+` (`dashPlus`) con el símbolo del semitrino en lugar del símbolo predeterminado +, asigne el valor `trill` a la variable `dashPlus`:

    \relative c'' { c1-+ }

    dashPlus = \trill

    \relative c'' { c1-+ }

## Desplazar ligaduras de expresión verticalmente

Se puede ajustar la posición vertical de una ligadura de expresión utilizando la propiedad `positions` del objeto `Slur`. La propiedad tiene dos parámetros, refiriéndose el primero al extremo izquierdo de la ligadura y el segundo al derecho. Los valores de los parámetros no se utilizan por parte de LilyPond para producir un desplazamiento exacto de la ligadura: más bien selecciona la colocación que mejor aspecto tiene, teniendo en cuenta los valores de los parámetros. Los valores positivos desplazan la ligadura hacia arriba, y son adecuados a notas que tienen las plicas hacia abajo. Los valores negativos desplazan las ligaduras bajas aún más hacia abajo.

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

## Moving the ends of hairpins

The ends of hairpins may be offset by setting the `shorten-pair` property of the `Hairpin` object. Positive values move endpoints to the right, negative to the left. Unlike the `minimum-length` property, this property only affects the appearance of the hairpin; it does not adjust horizontal spacing (including the position of bounding dynamics). This method is thus suitable for fine-tuning a hairpin within its allotted space.

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

## Posicionar símbolos de arpegio

Si necesitamos alargar o acortar un símbolo de arpegio, podemos modificar independientemente los extremos superior e inferior.

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

## Situar los elementos de marcado de texto por dentro de las ligaduras

Los elementos de marcado de texto deben tener la propiedad `outside-staff-priority` establecida al valor falso para que se impriman por dentro de las ligaduras de expresión.

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

## Imprimir reguladores en diversos estilos

Los reguladores se pueden crear en una amplia variedad de estilos.

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

## Impresión de reguladores utilizando la notación «al niente»

Se pueden imprimir reguladores con un círculo en la punta (notación «al niente») estableciendo la propiedad `circled-tip` del objeto `Hairpin` al valor `#t`.

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

## Impresión de indicaciones metronómicas y letras de ensayo debajo del pentagrama

De forma predeterminada, las indicaciones metronómicas y las letras de ensayo se imprimen encima del pentagrama. Para colocarlas debajo del pentagrama, simplemente ajustamos adecuadamente la propiedad `direction` de `MetronomeMark` o de `RehearsalMark`.

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

## Establecer el comportamiento de los reguladores en las barras de compás

Si la nota que da fin a un regulador cae sobre la primera parte de un compás, el regulador se detiene en la línea divisoria inmediatamente precedente. Se puede controlar este comportamiento sobreescribiendo la propiedad `'to-barline`.

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

## Ajustar la longitud mínima de los reguladores

Si los reguladores son demasiado cortos, se pueden alargar modificando la propiedad `minimum-length` del objeto `Hairpin`.

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

## Imprimir la misma articulación encima y debajo de la misma nota o acorde

De forma predeterminada, LilyPond no permite poner la misma articulación (p.ej., un acento, un calderón, un círculo de armónico, etc.) encima y debajo de la nota. Por ejemplo, c4_\fermata^\fermata imprime solamente el calderón inferior. El calderón superior sencillamente se ignora. Sin embargo, se pueden adosar inscripciones (de igual forma que las digitaciones) dentro de un acorde, lo que significa que es posible tener tantas articulaciones como se desee. Este enfoque tiene la ventaja de que ignora la plica y posiciona la articulación de forma relativa a la cabeza de la nota. Puede verse esto en el caso de los flageolets (indicaciones de armónico) que aparecen en el fragmento de código. Para recrear el comportamiento de las inscripciones fuera del acorde, se requiere ’add-stem-support. Así, la solución consiste en escribir la nota como un acorde y añadir las articulaciones dentro de los paréntesis en ángulo <...>. La dirección siempre será hacia arriba, pero podemos retocar esto por medio de una instrucción \tweak: `<c-\tweak dirección #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
    }

## Pizzicato “snap” o pizzicato de Bartók

El “snap-pizzicato” (pizzicato de pellizco, conocido también como “pizzicato de Bartók”) es un “pizzicato fuerte en el que la cuerda se pulsa verticalmente pellizcándola y rebota contra el diapasón del instrumento” (Wikipedia). Se denota mediante un círculo con una línea vertical que parte del centro del círculo hacia arriba.

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

## Usar una raya corta como símbolo de respiración

La música vocal y de viento usa con frecuencia una raya corta como signo de respiración. Esto indica una repiración que quita un poco de tiempo a la nota anterior en lugar de producir una corta pausa, lo que se indica con la marca de respiración en forma de coma. La marca se puede mover ligeramente hacia arriba para alejarla del pentagrama.

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

## Uso de arpeggioBracket para hacer más visible un divisi

El corchete de arpegios `arpeggioBracket` se puede usar para indicar la división de voces cuando no hay plicas que puedan ofrecer esta información. Se suele encontrar en la música coral.

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

## Utilizar ligaduras dobles para acordes legato

Algunos compositores escriben dos ligaduras cuando quieren acordes legato. Esto se puede conseguir estableciendo `doubleSlurs`.

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

## Uso de la propiedad whiteout

Se puede imprimir cualquier objeto gráfico sobre un fondo blanco para enmascarar parte de los objetos que están por debajo. Esto puede ser útil para mejorar el aspecto de las colisiones en situaciones complejas cuando no es práctico reposicionar los objetos. Es necesario establecer explícitamente la propiedad de capa (`layer`) para controlar qué objetos resultan enmascarados por el fondo blanco.

En este ejemplo, la colisión de la ligadura de unión con la indicación de compás resulta mejorada enmascarando la parte de la ligadura que cruza a la indicación de compás mediante el establecimiento de la propiedad `whiteout` de `TimeSignature`. Para hacer esto, se mueve `TimeSignature` a una capa por encima de `Tie`, que se deja en la capa predeterminada de 1, y `StaffSymbol` se mueve a una capa por encima de `TimeSignature` de manera que no resulte enmascarada.

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

## Línea vertical como una articulación barroca

Esta línea corta vertical situada encima de la nota es de uso común en música barroca. Su significado varía, pero en general indica notas que se deben tocar con más “peso”. El ejemplo siguiente muestra cómo conseguir dicha notación.

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

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

## Alinear verticalmente expresiones dinámicas que abarcan varias notas

Las expresiones dinámicas que se comienzan, terminan o se producen en la misma nota se alinean verticalmente. Para asegurar que las expresiones dinámicas se alinean cuando no se producen sobre la misma nota, incremente la propiedad `staff-padding` del objeto `DynamicLineSpanner`.

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

#### LilyPond — Snippets v2.24.4 (rama estable).