Dear Thomas,

sorry for not having provided examples myself of what doesn’t scale. I haven’t 
had the time for that yet. However, your explanation seems to be right. I 
definitely have to use smaller values for smaller font sizes. I was planning to 
collect a few examples from the viola concerto I’m working on. But your example 
shows what I meant! Curves can look substantially different with the same 
values with different font sizes.

Thank you for that code!!! I can see now that values seem to scale with it. 
I’ll have to try it myself. Perhaps that could be the fix for the recently 
opened issue a couple of messages above in this thread?

Regards,
Martín.

www.martinrinconbotero.com
On 11. Oct 2020, 10:04 +0200, Thomas Morley <thomasmorle...@gmail.com>, wrote:
> Am Mi., 7. Okt. 2020 um 10:35 Uhr schrieb Martín Rincón Botero
> <martinrinconbot...@gmail.com>:
> >
> > Now that we’ve been talking about \shape and \shapeII, I would like to ask 
> > if it’s possible that values put for \shape(II) could scale according to 
> > staff size. Whenever I have a smaller staff, whatever values work for a 20 
> > points staff are too much for smaller staves (either with a smaller font 
> > size or with \magnify). It would be great, from a user perspective, that a 
> > (0 . 1) value would produce a similar/proportional result no matter the 
> > size of the staff, instead of being always in a different “scale” every 
> > time you have different staff sizes (so that you have to put smaller values 
> > for smaller staves). That would also be useful if you decide later to 
> > increase or decrease the font size used.
>
> Hi Martín,
>
> \shape adds your settings to the calculated control-points of the curve.
> Though, those control-points are calculated differently depending on
> staff-space.
> Look at the example below, you will notice the default control-points
> are always different.
> In the attached image I let print the second and third control-point.
>
> \layout {
> \context {
> \Voice
> \override NoteHead.stencil = #point-stencil
> }
> }
>
> mus = { b'1_~ b'1 }
>
> \new Staff \with { \magnifyStaff #4 } \mus
> \new Staff \with { \magnifyStaff #1 } \mus
> \new Staff \with { \magnifyStaff #1/4 } \mus
>
> This means \shape always gets different control-points to work with,
> thus the result will never be consistent even for scaled
> offset-values.
>
> Nevertheless, it's not too hard to code a shape-version, which will
> scale it's offset-values according to current staff-space:
>
> \version "2.20.0"
>
> shape-h =
> #(define-music-function (offsets item)
> (list? key-list-or-music?)
> (_i "Offset control-points of @var{item} by @var{offsets}. The
> argument is a list of number pairs or list of such lists. Each
> element of a pair represents an offset to one of the coordinates of a
> control-point. If @var{item} is a string, the result is
> @code{\\once\\override} for the specified grob type. If @var{item} is
> a music expression, the result is the same music expression with an
> appropriate tweak applied.")
> (define (shape-curve grob coords)
> (let* ((orig (ly:grob-original grob))
> (siblings (if (ly:spanner? grob)
> (ly:spanner-broken-into orig) '()))
> (total-found (length siblings))
> (staff-space (ly:staff-symbol-staff-space grob))
> (offsets
> (map
> (lambda (offset)
> (if (number-pair? offset)
> (cons (car offset) (* (cdr offset) staff-space))
> offset))
> offsets)))
> (define (offset-control-points offsets)
> (if (null? offsets)
> coords
> (map coord-translate coords offsets)))
>
> (define (helper sibs offs)
> (if (pair? offs)
> (if (eq? (car sibs) grob)
> (offset-control-points (car offs))
> (helper (cdr sibs) (cdr offs)))
> coords))
>
> ;; we work with lists of lists
> (if (or (null? offsets)
> (not (list? (car offsets))))
> (set! offsets (list offsets)))
>
> (if (>= total-found 2)
> (helper siblings offsets)
> (offset-control-points (car offsets)))))
>
> (once (propertyTweak 'control-points
> (grob-transformer 'control-points shape-curve)
> item)))
>
> \layout {
> \context {
> \Voice
> \override NoteHead.stencil = #point-stencil
> }
> }
>
> mus = { b'1 \shape-h #'((0 . 1) (0 . 0) (0 . 0) (0 . 0)) _~ b'1 }
>
> \new Staff \with { \magnifyStaff #4 } \mus
> \new Staff \with { \magnifyStaff #1 } \mus
> \new Staff \with { \magnifyStaff #1/4 } \mus
>
> See second image.
>
> Cheers,
> Harm

Reply via email to