lilypond-user
[Top][All Lists]
Advanced

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

Re: bend before, increase disctance to accidental


From: Thomas Morley
Subject: Re: bend before, increase disctance to accidental
Date: Thu, 3 Dec 2020 23:12:50 +0100

Am Mi., 2. Dez. 2020 um 17:10 Uhr schrieb Stefan Thomas
<kontrapunktstefan@gmail.com>:
>
> Dear community,
> I found a  working code for a bend-before command. I would like to know, how 
> I could increase the distance between the bending-sign and the accidental.
> Thanks for your help.
> Stefan
> %%%%%%%%%% SNIPPPET %%%%%%%%%%%%%%%%%
>   #(define (scp-stencil grob)
>     (ly:stencil-combine-at-edge
>      (ly:note-head::print grob) 0 -1
>      (grob-interpret-markup grob
>       #{
>          \markup
>          \with-dimensions-from \null
>          \path #0.2 #'((moveto -2 -1.8)(curveto -1.2 -1.8 -.5 -1.28 -.3 -.3))
>        #} ) 0 ))
>
>   scp = \once \override NoteHead.stencil = #scp-stencil
>
>   {
>     \clef F
>     \key g\major
>     bes4 \scp a g fis
>     \repeat unfold 4 { r8 \scp gis' }
>     \repeat unfold 3 { \scp g'!4 }
>     \scp  g' fis'!
>   }
>   %%% END %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
> (copied from  
> https://lists.gnu.org/archive/html/lilypond-user/2020-06/msg00000.html )

How about below?
It uses the logic of BendAfter.stencil in a modified way.
The argument of \bendBefore is the vertical start relative to the NoteHead.
The width is determined by left and right bound.
Both like for \bendAfter.
Here the _left_ bound is the previous (NonMusical)PaperColumn, _right_
bound the NoteHead.
This causes 'minimum-length to be useless, to lengthen the bend-curve
move the NoteColumn of the target NoteHead.

%% DISCLAIMER
%% This is a very fast first sketch, don't use it for serious work before
%% having tested it thoroughly

%% c/p from output-lib.scm and modified
#(define-public (bend::print-harm spanner)
  (define (close  a b)
    (< (abs (- a b)) 0.01))

  (let* ((lb (ly:spanner-bound spanner LEFT))
         (left-col (ly:item-get-column lb))
         (left-neighbor (ly:grob-object left-col 'left-neighbor)))
    (ly:spanner-set-bound! spanner LEFT left-neighbor)
    (ly:spanner-set-bound! spanner RIGHT lb)

    (let* ((delta-y (* 0.5 (ly:grob-property spanner 'delta-position)))
           (left-span left-neighbor)
           (right-span lb)
           (thickness (* (ly:grob-property spanner 'thickness)
                         (ly:output-def-lookup (ly:grob-layout spanner)
                                               'line-thickness)))
           (padding (ly:grob-property spanner 'padding 0.5))
           (common
             (ly:grob-common-refpoint
               right-span
               (ly:grob-common-refpoint spanner left-span X)
               X))
           (common-y (ly:grob-common-refpoint spanner left-span Y))
           (minimum-length (ly:grob-property spanner 'minimum-length 0.5))
           (left-x
             (+ padding
                (interval-end
                  (ly:generic-bound-extent left-span common))))
           (acc (ly:grob-object right-span 'accidental-grob))
           (right-x
             (max (- (interval-start
                       (if (ly:grob? acc)
                           (ly:generic-bound-extent acc common)
                           (ly:generic-bound-extent right-span common)))
                     padding)
                  (+ left-x minimum-length)))
           (self-x (ly:grob-relative-coordinate spanner common X))
           (dx (- right-x left-x))
           (exp (list 'path thickness
                      `(rmoveto
                        ,(- left-x self-x) ,(- delta-y)
                        rcurveto
                        ,(/ dx 3) 0
                        ,dx ,(* 0.66 delta-y)
                        ,dx ,delta-y))))

      (ly:make-stencil
       exp
       (cons (- left-x self-x) (- right-x self-x))
       (ordered-cons 0 (- delta-y))))))

bendBefore =
  -\tweak stencil #bend::print-harm
  -\bendAfter \etc

%%%%%%%%%%%%%%%%%%%%%%%%
%% EXAMPLES
%%%%%%%%%%%%%%%%%%%%%%%%

%% DISADVANTAGE
%% Using minimum-length will lead to undesired results
%% Instead, move the NoteColumn


\relative c'' {
  \omit Staff.TimeSignature
  \key cis \major
  \override Score.SpacingSpanner.shortest-duration-space = #4.0
  %\override BendAfter.padding = 1
  cis2-\bendBefore #5
  c2-\bendBefore #4
  |
  %\break
  \once \override NoteColumn.X-offset = 3
  ees2-\bendBefore #-4.75
  c2-\bendBefore #8.5
  |
  \once \override NoteColumn.X-offset = 3
  fis1-\bendBefore #-6
}

HTH a bit,
  Harm



reply via email to

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