[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
stencil-guides.cropped.png
Description: PNG image