LilyPond: автоматический горизонтальный пробел для динамического текста

Мне не хватает чего-то простого, я часами искал документы безрезультатно. Иногда LilyPond может сильно разочаровывать.

Посмотри на эту картинку:

перекрытие ppp

Очевидно, что ppp пересекается с тактовой чертой. Согласно документации, я пытался использовать DynamicText.extra-spacing-width, но это не дало никакого эффекта. Вот код:

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

Если я перемещаюсь \override ...прямо перед \ppp, он не перекрывается, но LilyPond жалуется на «Unattached AbsoluteDynamicEvent».

Ответы (2)

Я часто с этим сталкиваюсь. Я считаю, что использование X-смещения работает:

dynamics = {
    s1 |
    \override DynamicText.X-offset = 0
    s8 \ppp s8 s8 s8 s8 s8 s4
}
Очень интуитивно :)

Это похоже на ошибку для меня. Для extra-spacing-widthработы оба объекта, которые должны избегать друг друга, должны иметь некоторую ширину и некоторую высоту. Вы можете визуализировать «линии горизонта», которые LilyPond использует для дистанцирования, используя

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

(ожидается, что нотоносцы нижнего нотоносца сдвинуты по вертикали на некоторую величину; горизонтальные линии горизонта строятся до разрыва строки, когда у нас есть только оценка расстояния между двумя нотоносцами).

Это дает:

горизонты

Вы можете видеть, что проблема в том, что SpanBar не получает линии горизонта; это потому, что у него нет высоты, поэтому интервал, на котором считается, что он сталкивается, неизвестен.

На данный момент обходной путь кажется

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

(должна быть причина, по которой его нет в текущем коде, поэтому имейте в виду, что это может иметь плохие последствия в случаях, которые я не рассматривал).

Объяснит ли этот же вопрос SpanBar проблему этого вопроса?: LilyPond: шпилька в скобках .
Не в полной мере. Насколько я вижу, гаечные ключи не участвуют в горизонтальном интервале так же, как элементы с линиями горизонта, только через минимальное расстояние и минимальное расстояние после разрыва. По крайней мере, мой ожидающий мерж-реквест gitlab.com/lilypond/lilypond/-/merge_requests/842 не решает дело \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 }>>
Я практически ничего не понимаю в этом посте. Я не понимаю код, термин "горизонт", как интерпретировать картинку и что такое SpanBar.
Хорошо, - SpanBar - это гроб, рисующий часть линии такта между нотоносцами. Чтобы понять, попробуйте \версия "2.22.1" \new StaffGroup \with { \override SpanBar.color = red } << { c1 } { c1 } >> - Линии горизонта - это очертания объектов. Они используются для разрешения коллизий. Вы можете рассматривать их как куски металла в партитуре с промежутком между ними; LilyPond может сжимать партитуру до тех пор, пока части не соприкоснутся друг с другом. Это относится к горизонтальным и вертикальным интервалам. - Код не должен быть понятным. Это ужасный низкоуровневый хак.