Как сделать маркеры положения/барре в lilypond?

Недавно я начал экспериментировать с LilyPond (версия 2.18.2, если это имеет значение). Я довольно успешно создавал базовые партитуры, но не могу понять, как правильно делать маркеры положения/барре для моих гитарных партитур.

Документация предлагает использовать для этой цели текстовые гаечные ключи , и с помощью этого метода я смог получить следующий результат:

Маркеры LilyPond

Хотя в основном они функциональны, я бы предпочел, чтобы они выглядели ближе к этому (сделано в MuseScore):

введите описание изображения здесь

В частности, то, что я хотел бы сделать в LilyPond, это:

1. Сделайте так, чтобы линия была выровнена по середине цифры, а не по ее низу.

2. Наличие возможности добавления «крючка» в конце строки, указывающего на размер стержня.

Я экспериментировал с параметрами Text Spanners, но не смог добиться какого-либо прогресса. Я также нашел это предложенное решение, но я не только не могу понять, что происходит на самом деле, но и изображение на картинке не соответствует тому, чего я надеюсь достичь.

Короче, что я спрашиваю:

1. Можно ли добиться того, чего я достиг после использования Text Spanners, и как мне это сделать?

2. Если нет, есть ли какая-то другая функция/обходной путь, который я мог бы попробовать, чтобы получить желаемый результат?

3. Если ни то, ни другое невозможно, есть ли другой способ передать ту же информацию, используя функцию, которую проще создать в LilyPond?

Ответы (2)

Я использовал пример в документации и переключил текст слева от гаечного ключа, а крючок теперь размещен справа. Вероятно, есть способ включить логическое значение в функцию для перехода с «зацепленного» на «не зацепленного», но я не смог понять, как…

В любом случае, чтобы ответить на ваши вопросы: Да, это можно сделать с помощью текстовых ключей:

hbarre =
#(define-music-function (barre location str music) (string? ly:music?)
   (let ((elts (extract-named-music music '(NoteEvent EventChord))))
     (if (pair? elts)
         (let ((first-element (first elts))
               (last-element (last elts)))
           (set! (ly:music-property first-element 'articulations)
                 (cons (make-music 'TextSpanEvent 'span-direction -1)
                       (ly:music-property first-element 'articulations)))
           (set! (ly:music-property last-element 'articulations)
                 (cons (make-music 'TextSpanEvent 'span-direction 1)
                       (ly:music-property last-element 'articulations))))))
   #{
       \once \override TextSpanner.font-size = #-2
       \once \override TextSpanner.font-shape = #'upright
       \once \override TextSpanner.staff-padding = #3
       \once \override TextSpanner.style = #'line
       \once \override TextSpanner.to-barline = ##f
       \once \override TextSpanner.bound-details =
            #`((left
                (text . ,#{ \markup { \raise #-.5 \concat { #str " " }} #})
                (Y . 0)
                (padding . .25)
                (attach-dir . -2))
               (right
                (text . ,#{ \markup { \draw-line #'( 0 . -.75) } #})
                (Y . 0)
                (padding . 0.25)
                (attach-dir . 2)))
      $music
   #})

dbarre =
#(define-music-function (barre location str music) (string? ly:music?)
   (let ((elts (extract-named-music music '(NoteEvent EventChord))))
     (if (pair? elts)
         (let ((first-element (first elts))
               (last-element (last elts)))
           (set! (ly:music-property first-element 'articulations)
                 (cons (make-music 'TextSpanEvent 'span-direction -1)
                       (ly:music-property first-element 'articulations)))
           (set! (ly:music-property last-element 'articulations)
                 (cons (make-music 'TextSpanEvent 'span-direction 1)
                       (ly:music-property last-element 'articulations))))))
   #{
       \once \override TextSpanner.font-size = #-2
       \once \override TextSpanner.font-shape = #'upright
       \once \override TextSpanner.staff-padding = #3
       \once \override TextSpanner.style = #'dashed-line
       \once \override TextSpanner.dash-fraction = #.5
       \once \override TextSpanner.dash-period = #1
       \once \override TextSpanner.to-barline = ##f
       \once \override TextSpanner.bound-details =
            #`((left
                (text . ,#{ \markup { \raise #-.5 \concat { #str " " }} #})
                (Y . 0)
                (padding . .25)
                (attach-dir . -2))
               (right
                (Y . 0)
                (padding . 0.25)
                (attach-dir . 2)))
      $music
   #})

\relative c' {
  \clef "treble_8"
  \key g \major
  \time 4/4
  \hbarre #"C III" { g4 g g g }  \dbarre #"IV" { g g g g }  g g g g
}

введите описание изображения здесь

Большое спасибо! Это именно то, что я хотел. Если я правильно понимаю, я должен иметь возможность сохранить их в отдельном файле и просто импортировать в другие проекты (чтобы мне не приходилось вводить это каждый раз)?
Правильно, вы можете поместить часть схемы (до \relative) в другой ly-файл и просто включить его с расширением \include.

Используя отличный ответ Джаспера (еще раз спасибо!) Я смог внести небольшие изменения, которые я решил опубликовать здесь для потомков.

Вывод теперь выглядит так:

введите описание изображения здесь

Изменения включают:

  1. Сделал шрифт жирным и немного больше, что, как мне показалось, выглядело лучше в контексте с другими обозначениями.
  2. Добавлена ​​отдельная функция для полуствольной индикации.
  3. Больше не нужно вводить «C» вручную — нужно указать только римскую цифру.

Вот код:

\version "2.18.2"

cWithSlash = \markup {
  \translate #'(0.0 . 0.8) \smaller { \musicglyph #"timesig.C22" }
}

cWithoutSlash = \markup {
  \translate #'(0.0 . 0.8) \smaller { \musicglyph #"timesig.C44" }
}

guithalfbarre =
#(define-music-function (barre location str music) (string? ly:music?)
   (let ((elts (extract-named-music music '(NoteEvent EventChord))))
     (if (pair? elts)
         (let ((first-element (first elts))
               (last-element (last elts)))
           (set! (ly:music-property first-element 'articulations)
                 (cons (make-music 'TextSpanEvent 'span-direction -1)
                       (ly:music-property first-element 'articulations)))
           (set! (ly:music-property last-element 'articulations)
                 (cons (make-music 'TextSpanEvent 'span-direction 1)
                       (ly:music-property last-element 'articulations))))))
   #{
       \once \override TextSpanner.font-shape = #'upright
       \once \override TextSpanner.staff-padding = #3
       \once \override TextSpanner.style = #'line
       \once \override TextSpanner.to-barline = ##f
       \once \override TextSpanner.bound-details =
            #`((left
                (text . ,#{ \markup { \raise #-.5 \concat { \cWithSlash \bold { #str " " }}} #})
                (Y . 0)
                (padding . .25)
                (attach-dir . -2))
               (right
                (text . ,#{ \markup { \draw-line #'( 0 . -.75) } #})
                (Y . 0)
                (padding . 0.25)
                (attach-dir . 2)))
      $music
   #})

guitbarre =
#(define-music-function (barre location str music) (string? ly:music?)
  (let ((elts (extract-named-music music '(NoteEvent EventChord))))
        (if (pair? elts)
            (let ((first-element (first elts))
                  (last-element (last elts)))
              (set! (ly:music-property first-element 'articulations)
                    (cons (make-music 'TextSpanEvent 'span-direction -1)
                          (ly:music-property first-element 'articulations)))
              (set! (ly:music-property last-element 'articulations)
                    (cons (make-music 'TextSpanEvent 'span-direction 1)
                          (ly:music-property last-element 'articulations))))))
      #{
          \once \override TextSpanner.font-shape = #'upright
          \once \override TextSpanner.staff-padding = #3
          \once \override TextSpanner.style = #'line
          \once \override TextSpanner.to-barline = ##f
          \once \override TextSpanner.bound-details =
               #`((left
                   (text . ,#{ \markup { \raise #-.5 \concat { \cWithoutSlash \bold { #str " " }}} #})
                   (Y . 0)
                   (padding . .25)
                   (attach-dir . -2))
                  (right
                   (text . ,#{ \markup { \draw-line #'( 0 . -.75) } #})
                   (Y . 0)
                   (padding . 0.25)
                   (attach-dir . 2)))
         $music
      #})


guitpos =
#(define-music-function (barre location str music) (string? ly:music?)
   (let ((elts (extract-named-music music '(NoteEvent EventChord))))
     (if (pair? elts)
         (let ((first-element (first elts))
               (last-element (last elts)))
           (set! (ly:music-property first-element 'articulations)
                 (cons (make-music 'TextSpanEvent 'span-direction -1)
                       (ly:music-property first-element 'articulations)))
           (set! (ly:music-property last-element 'articulations)
                 (cons (make-music 'TextSpanEvent 'span-direction 1)
                       (ly:music-property last-element 'articulations))))))
   #{
       \once \override TextSpanner.font-shape = #'upright
       \once \override TextSpanner.staff-padding = #3
       \once \override TextSpanner.style = #'dashed-line
       \once \override TextSpanner.dash-fraction = #.5
       \once \override TextSpanner.dash-period = #1
       \once \override TextSpanner.to-barline = ##f
       \once \override TextSpanner.bound-details =
            #`((left
                (text . ,#{ \markup { \raise #-.5 \concat \bold { { #str " " }}} #})
                (Y . 0)
                (padding . .25)
                (attach-dir . -2))
               (right
                (Y . 0)
                (padding . 0.25)
                (attach-dir . 2)))
      $music
   #})

Вот как был сделан приведенный выше пример

\relative c' {
  %1
  \guithalfbarre #"III" {g4 g4 g4 g4} |

  %2
  \guitbarre #"VI" { g4 g4 g4 g4 }

  %3
  \guitpos #"V" {g4 g4 g4 g4} |
}