[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Moving ClefModifiers vertically
From: |
Jean Abou Samra |
Subject: |
Re: Moving ClefModifiers vertically |
Date: |
Tue, 31 May 2022 12:46:44 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.9.1 |
Le 31/05/2022 à 12:14, Simon Bailey a écrit :
Hi,
Consider the following code:
\version "2.23.9"
\relative c, {
\override Staff.Clef.full-size-change = ##t
% Defaults ClefModifier.clef-alignments = #'((G -0.2 . 0.1) (F -0.3
. -0.2) (C 0 . 0))
\set Staff.forceClef = ##t
\clef "F_8"
c1
\set Staff.forceClef = ##t
\once \override Staff.ClefModifier.clef-alignments = #'((G -0.2 .
0.1) (F 1 . 5) (C 0 . 0))
\clef "F_8"
c1
\clef "G_8"
c'
\set Staff.forceClef = ##t
\once \override Staff.ClefModifier.clef-alignments = #'((G 2 . -17)
(F -0.3 . -0.2) (C 0 . 0))
\clef "G_8"
c
\override Staff.ClefModifier.Y-offset = #-2.5
\override Staff.ClefModifier.X-offset = #-0.3
\clef "F_8"
c,1
}
Which gives the attached output. It seems the clef-alignments silently
ignores the Y parameter in the alist. Is this expected? I'd like the
"F_8" clef to have the 8 attached to the tail rather than floating in
space somewhere below the staff and I can't for the life of me work
out how to do it using the clef-alignments. I can do it using Y-offset
and X-offset, but it doesn't feel like the *right* way to do it. (and
it needs different values for change clefs)
Any thoughts?
The pairs in clef-alignments are not (x . y) but (x-down . x-up),
where x-down and x-up respectively control the horizontal
alignment for clef modifiers that lower or raise the octave.
\version "2.22.2"
\relative c, {
\override Staff.ClefModifier.clef-alignments = #'((G 1 . -1))
\clef "G_8"
c'1
\clef "G^8"
c'''1
}
To get what you want, you need to use a grob callback.
\version "2.22.2"
#(define (clef::is-reduced grob)
(and (ly:grob-property grob 'non-default)
(not (eqv? RIGHT (ly:item-break-dir grob)))
(not (ly:grob-property grob 'full-size-change #f))))
#(define clef-modifier::y-offset-from-alist
(ly:make-unpure-pure-container
(lambda (grob)
(let* ((clef (ly:grob-parent grob X))
(reduced (clef::is-reduced clef))
(details (ly:grob-property grob 'details))
(alist (assoc-get (if reduced 'reduced-clef-Y-alignments
'clef-Y-alignments)
details
'()))
(glyph (ly:grob-property clef 'glyph))
(clef-name (string-drop glyph 6))
(direction (ly:grob-property grob 'direction))
(entry (assoc-get clef-name alist))
(default (ly:side-position-interface::y-aligned-side grob)))
(+ default
((if (eqv? direction DOWN)
car
cdr)
entry))))))
\layout {
\context {
\Staff
\override ClefModifier.Y-offset = #clef-modifier::y-offset-from-alist
\override ClefModifier.details.clef-Y-alignments = #'(("G" -3 . 0)
("F" 0 . 3))
\override ClefModifier.details.reduced-clef-Y-alignments = #'(("G"
-2 . 0) ("F" 0 . 2))
\override ClefModifier.staff-padding = #'()
}
}
{ \clef "G_8" s2 \clef "G^8" s2 }
{ \clef "G^8" s2 \clef "G_8" s2 }
{ \clef "F_8" s2 \clef "F^8" s2 }
{ \clef "F^8" s2 \clef "F_8" s2 }
Cf.
https://lilypond.org/doc/v2.23/Documentation/extending/callback-functions
and
https://extending-lilypond.readthedocs.io/en/latest/backend.html#understanding-callbacks
Best,
Jean