LilyPond: espacio horizontal automático para texto dinámico

Me falta algo básico, pasé horas buscando documentos en vano. A veces, LilyPond puede ser realmente frustrante.

Mira esta imagen:

superposición de ppp

Obviamente, ppp se superpone con la barra de compás. De acuerdo con la documentación, intenté usar DynamicText.extra-spacing-width, pero no tiene ningún efecto. Aquí está el código:

\version "2.22.1"
\language "italiano"

common = {
    \key sol \minor
    \time 4/4
    \tempo "Largo [Широко]"
}

right = \relative do'' {
    \key sol \major
    sol8 (fad re mi sol fad re4) |
    sol8 (fad re mib sol fad re4)
}

left = \relative do' {
    \key sol \major
    sol,8 (re' si' re,) sol, (re' do' re,) |
    sol, (re' sib' re,) sol, (re' do' re,) |
}

dynamics = {
    s1 |
    \override DynamicText.extra-spacing-width = #'(-1 . 1)
    s8 \ppp s8 s8 s8 s8 s8 s4
}

\score {
    \new PianoStaff <<
        \new Staff = "right" \right
        \new Dynamics \dynamics
        \new Staff = "left" { \clef bass \left }
    >>
}

Si me muevo \override ...justo al frente de \ppp, no se superpone, pero LilyPond se queja entonces con "AbsoluteDynamicEvent no adjunto".

Respuestas (2)

Me encuentro mucho con esto. Encuentro que usar un X-offset funciona:

dynamics = {
    s1 |
    \override DynamicText.X-offset = 0
    s8 \ppp s8 s8 s8 s8 s8 s4
}
Muy intuitivo :)

Esto me parece un error. Para extra-spacing-widthque funcionen, los dos objetos que deben evitarse deben tener algo de ancho y algo de alto. Puede visualizar los "horizontes" que usa LilyPond para distanciarse usando

#(ly:set-option 'debug-skylines)
\layout {
  \context {
    \Score
    \override PaperColumn.stencil = #ly:separation-item::print
    \override NonMusicalPaperColumn.stencil = #ly:separation-item::print
  }
}

(se espera que los del pentagrama inferior estén ligeramente desviados verticalmente; los horizontes horizontales se construyen antes de romper la línea, cuando solo tenemos una estimación de la distancia entre los dos pentagramas).

Esto da:

horizontes

Puede ver que el problema es que SpanBar no recibe horizontes; esto se debe a que no tiene altura, por lo que se desconoce el intervalo en el que se considera que choca.

Por ahora una solución parece ser

\layout {
  \context {
    \Score
    \override SpanBar.Y-extent = #axis-group-interface::height
    \override SpanBar.meta.object-callbacks.pure-Y-common =
      #ly:axis-group-interface::calc-pure-y-common
    \override SpanBar.meta.object-callbacks.pure-relevant-grobs =
      #ly:axis-group-interface::calc-pure-relevant-grobs
  }
}

(debe haber una razón por la que no está en el código actual, así que tenga en cuenta que podría tener efectos negativos en casos que no he considerado).

¿Este mismo problema de SpanBar explicaría el problema en esta pregunta?: LilyPond: horquilla entre paréntesis .
No completamente. Las llaves inglesas no participan en el espaciado horizontal de la misma manera que los elementos con horizontes, solo a través de la distancia mínima y la distancia mínima después del descanso hasta donde puedo ver. Al menos, mi solicitud de combinación pendiente gitlab.com/lilypond/lilypond/-/merge_requests/842 no resuelve el caso \version "2.23.4" \layout { \context { \Score \override BarLine.bar-extent = #'(-10 . 10) \override Parentheses.font-size = 10 } } \new StaffGroup << { c1\parenthesize\< 1\! } { c1 1 }>>
No entiendo prácticamente nada de este post. No entiendo el código, el término "horizontes", cómo interpretar la imagen y qué es SpanBar.
Ok, - SpanBar es el grob que dibuja la parte de la línea de compás entre pentagramas. Para entenderlo, pruebe \version "2.22.1" \new StaffGroup \with { \override SpanBar.color = red } << { c1 } { c1 } >> - Los horizontes son contornos de objetos. Se utilizan para resolver colisiones. Puede verlos como piezas de metal en la partitura, con espacio entre ellos; LilyPond podría comprimir la partitura hasta que las piezas se toquen entre sí. Esto se aplica al espacio horizontal y vertical. - Se supone que el código no es comprensible. Es un horrible truco de bajo nivel.