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
  tagline = ##f
}

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

[image of music]


LilyPond snippets v2.25.22 (development-branch).