lilypond-user
[Top][All Lists]
Advanced

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

Re: Tuplet Bracket and \fermataMarkup


From: Kieren MacMillan
Subject: Re: Tuplet Bracket and \fermataMarkup
Date: Fri, 14 Aug 2015 10:55:59 -0400

Hi Jeremy,

Sounds like you need David N’s amazing “measure-attached spanner”.
I’ve included the most recent version I have (and use regularly!).

Hope this helps!
Kieren.
__________________________

\version "2.19.15"

#(define (add-grob-definition grob-name grob-entry)
   (let* ((meta-entry   (assoc-get 'meta grob-entry))
          (class        (assoc-get 'class meta-entry))
          (ifaces-entry (assoc-get 'interfaces meta-entry)))
     (set-object-property! grob-name 'translation-type? ly:grob-properties?)
     (set-object-property! grob-name 'is-grob? #t)
     (set! ifaces-entry (append (case class
                                  ((Item) '(item-interface))
                                  ((Spanner) '(spanner-interface))
                                  ((Paper_column) '((item-interface
                                                     paper-column-interface)))
                                  ((System) '((system-interface
                                               spanner-interface)))
                                  (else '(unknown-interface)))
                          ifaces-entry))
     (set! ifaces-entry (uniq-list (sort ifaces-entry symbol<?)))
     (set! ifaces-entry (cons 'grob-interface ifaces-entry))
     (set! meta-entry (assoc-set! meta-entry 'name grob-name))
     (set! meta-entry (assoc-set! meta-entry 'interfaces
                        ifaces-entry))
     (set! grob-entry (assoc-set! grob-entry 'meta meta-entry))
     (set! all-grob-descriptions
           (cons (cons grob-name grob-entry)
             all-grob-descriptions))))

#(define (test-stencil grob)
   (let* ((orig (ly:grob-original grob))
          (siblings (ly:spanner-broken-into orig)) ; have we been split?
          (refp (ly:grob-system grob))
          (left-bound (ly:spanner-bound grob LEFT))
          (right-bound (ly:spanner-bound grob RIGHT))
          (elts-L (ly:grob-array->list (ly:grob-object left-bound 'elements)))
          (elts-R (ly:grob-array->list (ly:grob-object right-bound 'elements)))
          (break-alignment-L
           (filter
            (lambda (elt) (grob::has-interface elt 'break-alignment-interface))
            elts-L))
          (break-alignment-R
           (filter
            (lambda (elt) (grob::has-interface elt 'break-alignment-interface))
            elts-R))
          (break-alignment-L-ext (ly:grob-extent (car break-alignment-L) refp 
X))
          (break-alignment-R-ext (ly:grob-extent (car break-alignment-R) refp 
X))
          (available-space
           (- (car break-alignment-R-ext)
             (cdr break-alignment-L-ext)))
          (label
           (ly:grob-property grob 'text))
          (label
           (if (or (null? siblings)
                   (eq? grob (car siblings)))
               label
               (make-parenthesize-markup label)))
          (label (grob-interpret-markup grob label))
          (label-stil-ext-X (ly:stencil-extent label X))
          (label-stil-length (interval-length label-stil-ext-X))
          (label-stil-ext-Y (ly:stencil-extent label Y))
          (label-width (interval-length label-stil-ext-Y))
          (label (ly:stencil-aligned-to label X CENTER))
          (label
           (ly:stencil-translate-axis
            label
            (+ (interval-length break-alignment-L-ext)
              (* 0.5
                (- (car break-alignment-R-ext)
                  (cdr break-alignment-L-ext))))
            X)))
     (if (> (1+ (interval-length label-stil-ext-X)) available-space)
         (begin
          (ly:warning "Label is longer than available space.")
          label)
         (let*
          ((direction (ly:grob-property grob 'direction UP))
           (bracket-L
            (markup
             #:path
             0.1 ; line-thickness
             `((moveto 0.5 ,(* 0.5 label-width))
               (lineto ,(* 0.5
                          (- (car break-alignment-R-ext)
                            (cdr break-alignment-L-ext)
                            label-stil-length))
                 ,(* 0.5 label-width))
               (closepath)
               (rlineto 0.0
                 ,(if (or (null? siblings) (eq? grob (car siblings)))
                      (* direction -1.0) 0.0)))))
           (bracket-R
            (markup
             #:path
             0.1
             `((moveto ,(* 0.5
                          (- (car break-alignment-R-ext)
                            (cdr break-alignment-L-ext)
                            label-stil-length))
                 ,(* 0.5 label-width))
               (lineto 0.5
                 ,(* 0.5 label-width))
               (closepath)
               (rlineto 0.0
                 ,(if (or (null? siblings) (eq? grob (last siblings)))
                      (* direction -1.0) 0.0)))))
           (bracket-L (grob-interpret-markup grob bracket-L))
           (bracket-R (grob-interpret-markup grob bracket-R))
           (label (ly:stencil-combine-at-edge label X LEFT bracket-L 0.4))
           (label (ly:stencil-combine-at-edge label X RIGHT bracket-R 0.4)))
          label))))

#(define (add-bound-item spanner item)
   (if (null? (ly:spanner-bound spanner LEFT))
       (ly:spanner-set-bound! spanner LEFT item)
       (ly:spanner-set-bound! spanner RIGHT item)))

#(define-public (Measure_attached_spanner_engraver context)
   (let ((span '())
         (finished '())
         (event-start '())
         (event-stop '()))
     (make-engraver
      (listeners ((measure-counter-event engraver event)
                  (if (= START (ly:event-property event 'span-direction))
                      (set! event-start event)
                      (set! event-stop event))))
      ((process-music trans)
       (if (ly:stream-event? event-stop)
           (if (null? span)
               (ly:warning "You're trying to end a measure-attached spanner but 
you haven't started one.")
               (begin (set! finished span)
                 (ly:engraver-announce-end-grob trans finished event-start)
                 (set! span '())
                 (set! event-stop '()))))
       (if (ly:stream-event? event-start)
           (begin
            (set! span (ly:engraver-make-grob trans 'MeasureCounter 
event-start))
            (set! event-start '()))))
      ((stop-translation-timestep trans)
       (if (and (ly:spanner? span)
                (null? (ly:spanner-bound span LEFT))
                (moment<=? (ly:context-property context 'measurePosition) 
ZERO-MOMENT))
           (ly:spanner-set-bound! span LEFT
             (ly:context-property context 'currentCommandColumn)))
       (if (and (ly:spanner? finished)
                (moment<=? (ly:context-property context 'measurePosition) 
ZERO-MOMENT))
           (begin
            (if (null? (ly:spanner-bound finished RIGHT))
                (ly:spanner-set-bound! finished RIGHT
                  (ly:context-property context 'currentCommandColumn)))
            (set! finished '())
            (set! event-start '())
            (set! event-stop '()))))
      ((finalize trans)
       (if (ly:spanner? finished)
           (begin
            (if (null? (ly:spanner-bound finished RIGHT))
                (ly:spanner-set-bound! finished RIGHT
                  (ly:context-property context 'currentCommandColumn)))
            (set! finished '())))
       (if (ly:spanner? span)
           (begin
            (ly:warning "I think there's a dangling measure-attached spanner 
:-(")
            (ly:grob-suicide! span)
            (set! span '())))))))

global = {
  s1
  \override Staff.MeasureCounter.text = \markup { "Some really long tempo 
indication" }
  \override MeasureCounter.springs-and-rods = #ly:spanner::set-spacing-rods
  \startMeasureCount s1*4
  \bar "||" \stopMeasureCount s1*6
  \override Staff.MeasureCounter.text = \markup { "Another ridiculously long 
tempo marking" }
  s1
  \startMeasureCount s1*4
  \bar "|."
  \stopMeasureCount
}

\score {
  \new Staff \global
}

\layout {
  ragged-right = ##t
  \context {
    \Staff
    \consists #Measure_attached_spanner_engraver
    \override MeasureCounter.stencil = #test-stencil
    \override MeasureCounter.font-encoding = #'latin1
    \override MeasureCounter.minimum-length = 50
    \override MeasureCounter.springs-and-rods = #ly:spanner::set-spacing-rods
    \override MeasureCounter.font-size = 0
  }
}
________________________________

Kieren MacMillan, composer
‣ website: www.kierenmacmillan.info
‣ email: address@hidden




reply via email to

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