lilypond-user
[Top][All Lists]
Advanced

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

Re: Request for a stencil alignment helper


From: Aaron Hill
Subject: Re: Request for a stencil alignment helper
Date: Sat, 27 Feb 2021 19:21:14 -0800
User-agent: Roundcube Webmail/1.4.9

On 2021-02-27 3:55 pm, Dimitris Marinakis wrote:
Is it possible to make a "stencil-wrapper" that will show the vertical
centre of a stencil and have an extending line of variable length (which of
course won't distort the spacing of the actual score)?

Yes, though much of the particular work depends on how you wish to use (and reuse) the functionality. It is pretty easy to hack any stencil, especially with the use of grob-transformer. There are many examples on the mailing list [1] as well as the LSR [2].

[1]: https://lists.gnu.org/archive/html/lilypond-user/
[2]: http://lsr.di.unimi.it/LSR/Search

While a little overengineered in places and certainly in need of refactoring, here is one way of doing things:

%%%%
\version "2.22.0"

#(define ruler-thickness 0.075)

horizontal-ruler =
#(define-scheme-function
  (color alignment extension)
  ((color? red) number? number-pair?)
  (lambda (sten)
   (let* ((xext (ly:stencil-extent sten X))
          (yext (ly:stencil-extent sten Y))
          (y (interval-index yext alignment)))
    (apply ly:stencil-in-color
     (ly:make-stencil
      (list 'draw-line ruler-thickness
            (+ (car xext) (car extension)) y
            (+ (cdr xext) (cdr extension)) y)
      empty-interval empty-interval)
     color))))

vertical-ruler =
#(define-scheme-function
  (color alignment extension)
  ((color? red) number? number-pair?)
  (lambda (sten)
   (let* ((xext (ly:stencil-extent sten X))
          (yext (ly:stencil-extent sten Y))
          (x (interval-index xext alignment)))
    (apply ly:stencil-in-color
     (ly:make-stencil
      (list 'draw-line ruler-thickness
            x (+ (car yext) (car extension))
            x (+ (cdr yext) (cdr extension)))
      empty-interval empty-interval)
     color))))

combine-guides =
#(define-scheme-function
  (first-proc second-proc)
  (procedure? procedure?)
  (lambda (sten)
   (ly:stencil-add (first-proc sten) (second-proc sten))))

stencil-guide =
#(define-music-function
  (guide-proc grob-path)
  (procedure? key-list?)
  (define stencil-proc
   (grob-transformer 'stencil
    (lambda (grob orig)
     (ly:stencil-outline
      (ly:stencil-add orig (guide-proc orig))
      orig))))
  #{ \override $grob-path . stencil = #stencil-proc #})

\fixed c' {
  \stencil-guide \combine-guides
    \horizontal-ruler #cyan #DOWN #'(-1 . 1)
    \vertical-ruler #'(0.9 0.6 0.3) #CENTER #'(-1 . 1)
    Staff.TimeSignature
  \stencil-guide \horizontal-ruler #CENTER #'(-1 . 1) NoteHead
  \stencil-guide \vertical-ruler #green #LEFT #'(-1 . 1) Accidental
  bes4 a8 g <fis c'>2
}
%%%%


-- Aaron Hill

Attachment: stencil-guides.cropped.png
Description: PNG image


reply via email to

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