lilypond-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Vertical Text alignment problem


From: Thomas Morley
Subject: Re: Vertical Text alignment problem
Date: Sat, 21 Jul 2012 21:15:18 +0200

2012/7/21  <address@hidden>:
> Hi,
>
> I have some problems with the vertical alignment of text. I tried both the
> \halign, \lower inside a \markup and explicit offset commands with an
> \override, but I couldn't get it right. This sample shows the problem in
> detail. I do want to move the two "gliss." text-strings nearly on top or
> directly below the glissando itself.

Hi,

perhaps you may want to try the following:

\version "2.14.1"

#(define (radians->degree radians)
  (/ (* radians 180) PI))

#(define ((gliss-plus-text text) grob)
  (let* ((text-stencil (grob-interpret-markup grob text))
         (spanner-stencil (ly:line-spanner::print grob))
         (left-bound-info (ly:grob-property grob 'left-bound-info))
         (y-left (cdar left-bound-info))
         (right-bound-info (ly:grob-property grob 'right-bound-info))
         (y-right (cdar right-bound-info))
         (slant (if (> y-right y-left) 1 -1))
         (spanner-stencil-x-length (interval-length (ly:stencil-extent
spanner-stencil X)))
         (spanner-stencil-y-length (interval-length (ly:stencil-extent
spanner-stencil Y)))
         (alpha (radians->degree (atan (/ spanner-stencil-y-length
spanner-stencil-x-length))))
         (spanner-center-X (interval-center (ly:stencil-extent
spanner-stencil X)))
         (label-center-X (interval-center (ly:stencil-extent text-stencil X))))

  (ly:stencil-combine-at-edge
    spanner-stencil
    Y UP
    (ly:stencil-translate
      (ly:stencil-rotate text-stencil (* slant alpha) 0 0)
      (cons (- spanner-center-X label-center-X) 0))
    (* -0.5 spanner-stencil-y-length))))

glissandoTextOn = \override Score.Glissando #'stencil =
#(gliss-plus-text (markup #:italic #:tiny "gliss"))
glissandoTextOff = \revert Score.Glissando #'stencil

noteHeadsOff = {
        \override NoteHead #'transparent = ##t
        \override NoteHead #'no-ledgers = ##t
}
noteHeadsOn = {
        \revert NoteHead #'transparent
        \revert NoteHead #'no-ledgers
}

\score {
    \new Staff {
        \cadenzaOn
        \set Score.timing = ##f
        \glissandoTextOn
        \override Score.Glissando #'style = #'trill

        g'''4\ff\(
        <<
        {    \stemDown
            f'''32[ s256 c'''32 s256 ces'''32 s256
            \noteHeadsOff
            e''32 s256 d''32 s256 c''32 s256 a'32 s256 g'32 s256 f'32 s256
            \noteHeadsOn
            d'32 s256 des'32 s256 c'32]
            \stemNeutral
        } \\
        {
            \noteHeadsOff
            \override Stem #'transparent = ##t
            \once \override Glissando #'extra-offset = #'(-0.5 . 0.0)
            s16. g''4\glissando
            g'8
            \revert Glissando #'style
            \noteHeadsOn
            \revert Stem #'transparent
        }
        >>
        \times 2/3 { bes4-.\) d-^\> e-^ }
        \once \override Glissando #'minimum-length = #9
        \once \override Glissando #'springs-and-rods =
#ly:spanner::set-spacing-rods
        e->\(\!\glissando f'8[ g'--]\)
        \breathe
        \bar "|"
        a'8.[ a'16] ~ a'16[ g' f'( g'])
    }
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

With one of the newer devel-version you can write it more straight-forward:


\version "2.15.39"

#(define (radians->degree radians)
  (/ (* radians 180) PI))

#(define ((gliss-plus-text text) grob)
  (let* ((text-stencil (grob-interpret-markup grob text))
         (spanner-stencil (ly:line-spanner::print grob))
         (left-bound-info (ly:grob-property grob 'left-bound-info))
         (y-left (cdar left-bound-info))
         (right-bound-info (ly:grob-property grob 'right-bound-info))
         (y-right (cdar right-bound-info))
         (slant (if (> y-right y-left) 1 -1))
         (spanner-stencil-x-length (interval-length (ly:stencil-extent
spanner-stencil X)))
         (spanner-stencil-y-length (interval-length (ly:stencil-extent
spanner-stencil Y)))
         (alpha (radians->degree (atan (/ spanner-stencil-y-length
spanner-stencil-x-length))))
         (spanner-center-X (interval-center (ly:stencil-extent
spanner-stencil X)))
         (label-center-X (interval-center (ly:stencil-extent text-stencil X))))

  (ly:stencil-combine-at-edge
    spanner-stencil
    Y UP
    (ly:stencil-translate
      (ly:stencil-rotate text-stencil (* slant alpha) 0 0)
      (cons (- spanner-center-X label-center-X) 0))
    (* -0.5 spanner-stencil-y-length))))

glissandoTextOn = \override Score.Glissando #'stencil =
#(gliss-plus-text (markup #:italic #:tiny "gliss"))
glissandoTextOff = \revert Score.Glissando #'stencil

noteHeadsOff = {
        \override NoteHead #'transparent = ##t
        \override NoteHead #'no-ledgers = ##t
}
noteHeadsOn = {
        \revert NoteHead #'transparent
        \revert NoteHead #'no-ledgers
}

customGlissandoTweaksOn = {
        \glissandoTextOn
        \override Score.Glissando #'style = #'trill
        \override Score.Glissando #'bound-details #'left #'padding = #1
        \override Score.Glissando #'bound-details #'right #'padding = #0.2
        \override Score.Glissando #'minimum-length = #22
        \override Score.Glissando #'springs-and-rods =
#ly:spanner::set-spacing-rods
}

customGlissandoTweaksOff = {
        \glissandoTextOff
        \revert Score.Glissando #'style
        \revert Score.Glissando #'bound-details #'left #'padding
        \revert Score.Glissando #'bound-details #'right #'padding
        \revert Score.Glissando #'minimum-length
        \revert Score.Glissando #'springs-and-rods
}

\score {
    \new Staff {
        \cadenzaOn
        \set Score.timing = ##f
        \customGlissandoTweaksOn

        g'''4\ff\(
        f'''32[  c'''32
        \override Glissando #'rotation = #'(2 -1 0) ces'''32\glissando
        \override NoteColumn #'glissando-skip = ##t
        \noteHeadsOff
        a''32  f''32  d''32  b'32  g'32  f'32
        \noteHeadsOn
        \revert NoteColumn #'glissando-skip
        d'32  des'32  c'32]

        \times 2/3 { bes4-.\) d-^\> e-^ }
        \override Glissando #'minimum-length = #8
        e->\(\!\glissando f'8[ g'--]\)
        \customGlissandoTweaksOff
        \breathe
        \bar "|"
        a'8.[ a'16] ~ a'16[ g' f'( g'])
    }
}

HTH,
  Harm



reply via email to

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