Hi Harm,

On Sun, Sep 11, 2016 at 4:53 AM, Thomas Morley <[email protected]> wrote:
>
> It's based on our scheme-text-spanner.ly from the reg-test

You may want to incorporate the attached, which corrects an error in
the regtest and adds a warning omitted there.  (In addition, there are
some other changes which make the engraver follow the C++ original
more closely.)

The error fix allows the spanner to end on a spacer.

Best,
David
\version "2.19.46"

schemeTextSpannerEngraver =
#(lambda (context)
   (let ((span '())
         (finished '())
         (current-event '())
         (event-start '())
         (event-stop '()))
     (make-engraver
      (listeners
       ((scheme-text-span-event engraver event)
        (if (= START (ly:event-property event 'span-direction))
            (set! event-start event)
            (set! event-stop event))))
      (acknowledgers
       ((note-column-interface engraver grob source-engraver)
        (if (ly:spanner? span)
            (begin
             (ly:pointer-group-interface::add-grob span 'note-columns grob)
             (if (null? (ly:spanner-bound span LEFT))
                 (add-bound-item span grob)))
            (if (ly:spanner? finished)
                (begin
                 (ly:pointer-group-interface::add-grob finished 'note-columns grob)
                 (if (null? (ly:spanner-bound finished RIGHT))
                     (add-bound-item finished grob)))))))
      ((process-music trans)
       (if (ly:stream-event? event-stop)
           (if (null? span)
               (ly:warning "You're trying to end a scheme text spanner
but you haven't started one.")
               (begin
                (set! finished span)
                (ly:engraver-announce-end-grob trans finished '())
                (set! span '())
                (set! current-event '()))))
       (if (ly:stream-event? event-start)
           (if (ly:stream-event? current-event)
               (ly:warning "Already have a scheme text spanner")
               (begin
                (set! current-event event-start)
                (set! span (ly:engraver-make-grob trans 'SchemeTextSpanner event-start))
                (let ((dir (ly:event-property current-event 'direction)))
                  (if (ly:dir? dir)
                      (set! (ly:grob-property span 'direction) dir)))
                (set-axis! span Y)
                (set! event-start '())))))
      ((stop-translation-timestep trans)
       (if (and (ly:spanner? span)
                (null? (ly:spanner-bound span LEFT)))
           (ly:spanner-set-bound! span LEFT
             (ly:context-property context 'currentMusicalColumn)))
       (typeset-all finished context)
       (set! event-start '())
       (set! event-stop '()))
      ((finalize trans)
       (typeset-all finished context)
       (if (ly:spanner? span)
           (begin
            (ly:warning "I think there's a dangling scheme text spanner :-(")
            (ly:grob-suicide! span)
            (set! span '())))))))

#(define typeset-all
   (lambda (finished ctx)
     (if (ly:spanner? finished)
         (if (null? (ly:spanner-bound finished RIGHT))
             (ly:spanner-set-bound! finished RIGHT
               (ly:context-property ctx 'currentMusicalColumn)))
         (set! finished '()))))
_______________________________________________
lilypond-user mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/lilypond-user

Reply via email to