lilypond-user
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]