Hi Kieren,
On Sat, Dec 21, 2013 at 5:06 PM, Kieren MacMillan < [email protected]> wrote: > Hi David, > > > I don't have time to work this out at the moment > > Fair enough! > I do have time for a simple demo, which just involves changing a variable definition and adding a argument for text. Awful, but you see it's doable. > > > but possibly you could adapt an analysis bracket. Or for another hacky > solution, you could mess with a MeasureCounter stencil, like I did here > > Thanks — I’ll make an attempt. > > > Maybe what you're wanting should get its own grob? > > Maybe! As it turns out, there are other issues involved, e.g., one > [likely] only wants this to appear on the top staff of a system (or, > perhaps, on whatever staves other “score-level” markings appear, e.g., > MetronomeMark, etc.). A separate grob might allow for more flexibility in > that regard. > Yes, and you wouldn't kill the MeasureCounter for use with a separate grob. And there ought to be the option of stretching it over multiple measures. Possibly I can work something up over my break between semesters. I'm thoroughly embarrassed by the raggedy undigested code attached. > I’m playing around with a test case, to see if I can get it close to the > goal line — I’ll repost when I’m within sight of it. OK! --David
\version "2.17.25"
\header {
snippet-title = "Bracket repeats"
snippet-author = "David Nalesnik"
snippet-description = \markup {
\wordwrap {
This snippet is a workaround which creates a representation
for repeats which consists of a bracket above a measure. The
number of repeats is expressed by a number centered within
the bracket and formatted as "2x". This is not a true
solution as it creates an arbitrary stencil which does not
convey a repeat structure understood by LilyPond. Currently,
the workaround will not accomodate repeats lasting more than
a single bar and measures split across lines.
}
}
tags = "repeats, scheme"
status = "unfinished"
}
%%%%%%%%%%%%%%%%%%%
% THE SNIPPET %
%%%%%%%%%%%%%%%%%%%
% The following procedure is a modification of the function
% `measure-counter-stencil' found in the file
% `scm/music-functions.scm' in the LilyPond distribution.
#(define (test-stencil grob text)
(let* ((orig (ly:grob-original grob))
(siblings (ly:spanner-broken-into orig)) ; have we been split?
(bounds (ly:grob-array->list (ly:grob-object grob 'columns)))
(refp (ly:grob-system grob))
;; we use the first and/or last NonMusicalPaperColumn grob(s) of
;; a system in the event that a MeasureCounter spanner is broken
(all-cols (ly:grob-array->list (ly:grob-object refp 'columns)))
(all-cols
(filter
(lambda (col) (eq? #t (ly:grob-property col 'non-musical)))
all-cols))
(left-bound
(if (or (null? siblings) ; spanner is unbroken
(eq? grob (car siblings))) ; or the first piece
(car bounds)
(car all-cols)))
(right-bound
(if (or (null? siblings)
(eq? grob (car (reverse siblings))))
(car (reverse bounds))
(car (reverse all-cols))))
(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))
(num
(markup text))
(num
(if (or (null? siblings)
(eq? grob (car siblings)))
num
(make-parenthesize-markup num)))
(num (grob-interpret-markup grob num))
(num-stil-ext-X (ly:stencil-extent num X))
(num-stil-ext-Y (ly:stencil-extent num Y))
(num (ly:stencil-aligned-to num X (ly:grob-property grob 'self-alignment-X)))
(num
(ly:stencil-translate-axis
num
(+ (interval-length break-alignment-L-ext)
(* 0.5
(- (car break-alignment-R-ext)
(cdr break-alignment-L-ext))))
X))
(bracket-L
(markup
#:path
0.1 ; line-thickness
`((moveto 0.5 ,(* 0.5 (interval-length num-stil-ext-Y)))
(lineto ,(* 0.5
(- (car break-alignment-R-ext)
(cdr break-alignment-L-ext)
(interval-length num-stil-ext-X)))
,(* 0.5 (interval-length num-stil-ext-Y)))
(closepath)
(rlineto 0.0 -1.0))))
(bracket-R
(markup
#:path
0.1
`((moveto ,(* 0.5
(- (car break-alignment-R-ext)
(cdr break-alignment-L-ext)
(interval-length num-stil-ext-X)))
,(* 0.5 (interval-length num-stil-ext-Y)))
(lineto 0.5
,(* 0.5 (interval-length num-stil-ext-Y)))
(closepath)
(rlineto 0.0 -1.0))))
(bracket-L (grob-interpret-markup grob bracket-L))
(bracket-R (grob-interpret-markup grob bracket-R))
(num (ly:stencil-combine-at-edge num X LEFT bracket-L 0.4))
(num (ly:stencil-combine-at-edge num X RIGHT bracket-R 0.4)))
num))
%%%%%%%%%%%%%%%%%%%%%
% USAGE EXAMPLE %
%%%%%%%%%%%%%%%%%%%%%
<<
\new Voice = "notes" {
\relative c'' {
\time 3/4
s2.
\override Staff.MeasureCounter.font-encoding = #'latin1
\override Staff.MeasureCounter.font-size = 0
\override Staff.MeasureCounter.stencil =
#(lambda (grob) (test-stencil grob #{ \markup \italic "Safety" #} ))
\once \override Staff.MeasureCounter.count-from = 3
\override Staff.DynamicLineSpanner.padding = 2
\repeat volta 1 {
\startMeasureCount
a4 g f
\stopMeasureCount
}
}
}
\new Lyrics \lyricsto "notes" {
He had this
}
>>
\layout {
\context {
\Staff
\consists #Measure_counter_engraver
}
}<<attachment: centered_text_bracket.png>>
_______________________________________________ lilypond-user mailing list [email protected] https://lists.gnu.org/mailman/listinfo/lilypond-user
