[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