Hi Urs,

On Thu, May 17, 2012 at 5:08 AM, Urs Liska <li...@ursliska.de> wrote:

> Hi,
>
> I am very much enjoying now to tweak slurs and other curves using offsets
> instead of hardcoded control-points.
>
> I wonder if it would be interesting to have a similar approach to grobs
> with a positions property (e.g. beams).
> While it is comparably easy to find usable #'positions for a beam this is
> then of course hard-coded and won't work if either the system-system
> spacing changes for whatever reason, or the music is transposed.
>
> Of course it must be quite straightforward to read out lilypond's decision
> and apply offsets to that in a music function?
>

One issue here is that 'positions of Slur are calculated differently from
Beam.  You can find a function which offsets 'positions of Slur here:

http://lsr.dsi.unimi.it/LSR/Snippet?id=748

Basically, this function offsets the Y-coordinate of the first and last
control-points.

For something like Beam, you can do something like this:
\version "2.15.38"

offsetBeamPositions =
  #(define-music-function (parser location offsets) (pair?)
    #{
       \once \override Beam #'positions = #(lambda (grob)
         (let* ((func (assoc-get 'positions (cdr (ly:grob-basic-properties
grob))))
                (pos (func grob)))
                ; both of above assignments may be replaced by:
                ; (pos (beam::place-broken-parts-individually grob))

            (coord-translate pos offsets)))
    #})

\relative c'' {
  \offsetBeamPositions #'(-1 . -2)
  c8[ d e f]
}

I imagine that this could be generalized to cover other grobs using the
'positions property.  With that in mind, I've had it look up the callback
which calculates 'positions (the commented-out lines give you a variant
which uses that specific callback for Beam).  (Thank you Harm for showing
me this method.)


> And if that works one could even enhance the \shape function?
> The wrapper function could check against a list of grob names and call the
> appropriate helper function (i.e. if its a Slur then call shape-curve).
> Maybe it's even possible to make that still more generic. Is it possible
> to check if a given grob has a given property? (i.e. if the grob has a
> control-points property then call shape-curve, else if it has positions
> then call shape-positions [elseif used so that a slurs control-points take
> precedence over its positions]).
>
> So it could be possible to write
> shape Slur #'((1 . 0) (3 . -2) (0 . 0) (0 . 1))
> or
> shape Beam #'(2 . -1)
> or
> shape Arpeggio #'(-1 . 2)
>
> Would be awesome I think.
>
> Maybe one could even have more ideas to make this offset approach even
> more general/generic.
>
> Instead of ready-made functions, I would also appreciate hints on how to
> achieve this (as said, I'm quite interested in getting used to write Scheme
> functions myself, without always having to ask here).
>


Though it is entirely too much fun to work out these puzzles, I'll leave it
at that!  I hope what I've given you will give you a place to start with
this.

Best,
David


> Best
> Urs
>
> ______________________________**_________________
> lilypond-user mailing list
> lilypond-user@gnu.org
> https://lists.gnu.org/mailman/**listinfo/lilypond-user<https://lists.gnu.org/mailman/listinfo/lilypond-user>
>
_______________________________________________
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user

Reply via email to