# Re: Tweaking Hairpin shape

```Hi David,

I was going to post something similiar.
You're code is much more elegant with respect to linebreaks, great stuff.
Though, it will not work as desired if the beam/hairpin is distributed
over _three_ lines.
I've no clue how to make it work, admittedly it's a real rare case.```
```
Some inline remarks to your code.

2018-02-05 0:25 GMT+01:00 David Nalesnik <david.nales...@gmail.com>:
> Hi Stefano,
>
> On Sun, Feb 4, 2018 at 4:09 PM, Stefano Troncaro
> <stefanotronc...@gmail.com> wrote:
>> following can be achieved.
>>
>> A consequence of explicitly stating the degree in which the stencil has to
>> be rotated is that if anything changes the spacing of that system it's very
>> likely that the degree of rotation will have to be manually tweaked. I was
>> thinking on how to achieve an "automatic" solution. I imagine that this
>> could be done by establishing two points of reference. In this example any
>> two points running along the Beam would serve, although the ending points of
>> two of the Stems would work just as well.
>>
>> But all this assumes that every object has a distinct name/ID/whatever, like
>> a pointer to it which allows to recover information on it, or at least that
>> one can be given. Do you know if this is possible?
>>
>
> Within a callback for Hairpin.stencil, you can get to the Beam grob by
> following pointers from the spanner bounds of the Hairpin.  You can
> then calculate the Beam's slope and use that information to rotate the
> Hairpin stencil.
>
> \version "2.19.65"
>
> #(define test
>    (lambda (grob)
>      (let* ((lb (ly:spanner-bound grob LEFT))
>             (rb (ly:spanner-bound grob RIGHT))
>             (stil (ly:hairpin::print grob))

Great:

>             (bound
>              (find (lambda (b)
>                      (grob::has-interface b 'note-column-interface))
>                (list lb rb))))
>        (if (ly:grob? bound)
>            (let* ((stem (ly:grob-object bound 'stem))
>                   (beam (ly:grob-object stem 'beam)))
>              (if (ly:grob? beam)
>                  (let* ((X-pos (ly:grob-property beam 'X-positions))
>                         (Y-pos (ly:grob-property beam 'positions))
Using atan may return unexact values if the angle is close to zero, iirc.
I suggest to use ly:angle:
(ang
(ly:angle
(- (cdr X-pos) (car X-pos))
(- (cdr Y-pos) (car Y-pos))))

>                         (ang (atan (- (cdr Y-pos) (car Y-pos))
>                                (- (cdr X-pos) (car X-pos)))))
>                    (ly:stencil-rotate

No need use PI then:
stil ang CENTER CENTER)

>                     stil (* ang (/ 180 PI)) CENTER CENTER))
>                  stil))
>            stil))))
>
> {
>   \override Hairpin.stencil = #test
>   c'16\< e' g' b'\!
>   b'16\< g' e' c'\!
>   \once \offset positions #'(0 . 3) Beam
>   c'16^\< e' g' b'\!
>   \override Beam.breakable = ##t
>   c'8[\< e' \break g' b']\!
> }
>
> Hope this gets you started...
>
> David

All the best,
Harm

_______________________________________________
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user
```