Недавно я начал экспериментировать с LilyPond (версия 2.18.2, если это имеет значение). Я довольно успешно создавал базовые партитуры, но не могу понять, как правильно делать маркеры положения/барре для моих гитарных партитур.
Документация предлагает использовать для этой цели текстовые гаечные ключи , и с помощью этого метода я смог получить следующий результат:
Хотя в основном они функциональны, я бы предпочел, чтобы они выглядели ближе к этому (сделано в MuseScore):
В частности, то, что я хотел бы сделать в LilyPond, это:
1. Сделайте так, чтобы линия была выровнена по середине цифры, а не по ее низу.
2. Наличие возможности добавления «крючка» в конце строки, указывающего на размер стержня.
Я экспериментировал с параметрами Text Spanners, но не смог добиться какого-либо прогресса. Я также нашел это предложенное решение, но я не только не могу понять, что происходит на самом деле, но и изображение на картинке не соответствует тому, чего я надеюсь достичь.
Короче, что я спрашиваю:
1. Можно ли добиться того, чего я достиг после использования Text Spanners, и как мне это сделать?
2. Если нет, есть ли какая-то другая функция/обходной путь, который я мог бы попробовать, чтобы получить желаемый результат?
3. Если ни то, ни другое невозможно, есть ли другой способ передать ту же информацию, используя функцию, которую проще создать в LilyPond?
Я использовал пример в документации и переключил текст слева от гаечного ключа, а крючок теперь размещен справа. Вероятно, есть способ включить логическое значение в функцию для перехода с «зацепленного» на «не зацепленного», но я не смог понять, как…
В любом случае, чтобы ответить на ваши вопросы: Да, это можно сделать с помощью текстовых ключей:
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
}
Используя отличный ответ Джаспера (еще раз спасибо!) Я смог внести небольшие изменения, которые я решил опубликовать здесь для потомков.
Вывод теперь выглядит так:
Изменения включают:
Вот код:
\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} |
}
пользователь57228
Джаспер Хабихт
\relative
) в другой ly-файл и просто включить его с расширением\include
.