Lilypond: how to add the number of repetitions above a bar
I am working with a score in Lilypond that has a lot of repetitions, where basically every bar has to be repeated a certain number of times. I would like to be able to write above every bar the number of times it should be repeat, similar to the score below (which was not created in Lilypond):
It would be great to be able to have some brackets above the bar and also to have the "3x" centralized, just like in the example above. So far, the only (temporary) solution I was able to come up with in Lilypond was to add repeat bars and then simply write "3x" above the first note of every bar (since I could not have it centralized on the bar either). It does not look very good, but gets the job done. This temporary solution looks like this:
Any suggestions of how to make this example look more similar to the first inn Lilypond would be extremely welcome!
repeat lilypond music-notation
|
show 3 more comments
I am working with a score in Lilypond that has a lot of repetitions, where basically every bar has to be repeated a certain number of times. I would like to be able to write above every bar the number of times it should be repeat, similar to the score below (which was not created in Lilypond):
It would be great to be able to have some brackets above the bar and also to have the "3x" centralized, just like in the example above. So far, the only (temporary) solution I was able to come up with in Lilypond was to add repeat bars and then simply write "3x" above the first note of every bar (since I could not have it centralized on the bar either). It does not look very good, but gets the job done. This temporary solution looks like this:
Any suggestions of how to make this example look more similar to the first inn Lilypond would be extremely welcome!
repeat lilypond music-notation
1
I don't know the answer to this, but just as a comment to any moderators who don't know Lilypond but who might think of this Q as offtopic for StackOverflow: Lilypond is a notation software whose file-format is essentially a set of Scheme subroutines, so q's about usage tend to be on topic.
– Michael Scott Cuthbert
Aug 29 '13 at 3:46
1
Thanks for your comment, Michael. Indeed there is very little about LilyPond here at StackOverflow, and that is one of the reasons I like to post questions (and answers as well, if I discover them). This could be a nice complement to the lilypond-user mailing list, which is certainly the best place to ask questions related to LilyPond.
– gilbertohasnofb
Aug 29 '13 at 13:30
2
@Michael I use LilyPond and think it's fantastic, but I'd still call questions about usage off-topic for Stack Overflow. The fact that its data files are closer to programming than most programs' strikes me as a technicality; you could make a similar argument for any software that consumes PostScript :P This question seems like a good fit for Music: Practice & Theory, though. Edit: there's even a meta question on the subject.
– shambulator
Aug 29 '13 at 14:13
1
It's a bit of a fuzzy one in my mind, and I haven't voted to close :P It's definitely on-topic for Music.SE ("usage of specific music software") - I don't agree that there needs to be some kind of "musical knowledge" bar - and I think LilyPond users there would appreciate having these kinds of questions. But at the same time, how many non-programmers use LilyPond in favour of something not quite so... programming language-like? :)
– shambulator
Aug 29 '13 at 15:58
3
@shambulator -- I agree that in general how to solve problems in music notation software is better for Music.SE (and voted up comment despite disagreeing), but I think a look at the "solution" posted below shows why (1) this seems the most appropriate place for discussing using lilypond (just like a question on "how can I use [C# library] to access [other library]) and (2) why few musicians have taken up lilypond. :-)
– Michael Scott Cuthbert
Aug 30 '13 at 3:44
|
show 3 more comments
I am working with a score in Lilypond that has a lot of repetitions, where basically every bar has to be repeated a certain number of times. I would like to be able to write above every bar the number of times it should be repeat, similar to the score below (which was not created in Lilypond):
It would be great to be able to have some brackets above the bar and also to have the "3x" centralized, just like in the example above. So far, the only (temporary) solution I was able to come up with in Lilypond was to add repeat bars and then simply write "3x" above the first note of every bar (since I could not have it centralized on the bar either). It does not look very good, but gets the job done. This temporary solution looks like this:
Any suggestions of how to make this example look more similar to the first inn Lilypond would be extremely welcome!
repeat lilypond music-notation
I am working with a score in Lilypond that has a lot of repetitions, where basically every bar has to be repeated a certain number of times. I would like to be able to write above every bar the number of times it should be repeat, similar to the score below (which was not created in Lilypond):
It would be great to be able to have some brackets above the bar and also to have the "3x" centralized, just like in the example above. So far, the only (temporary) solution I was able to come up with in Lilypond was to add repeat bars and then simply write "3x" above the first note of every bar (since I could not have it centralized on the bar either). It does not look very good, but gets the job done. This temporary solution looks like this:
Any suggestions of how to make this example look more similar to the first inn Lilypond would be extremely welcome!
repeat lilypond music-notation
repeat lilypond music-notation
edited Jan 4 at 14:29
Matthieu Brucher
14.4k32140
14.4k32140
asked Aug 25 '13 at 13:56
gilbertohasnofbgilbertohasnofb
1,027924
1,027924
1
I don't know the answer to this, but just as a comment to any moderators who don't know Lilypond but who might think of this Q as offtopic for StackOverflow: Lilypond is a notation software whose file-format is essentially a set of Scheme subroutines, so q's about usage tend to be on topic.
– Michael Scott Cuthbert
Aug 29 '13 at 3:46
1
Thanks for your comment, Michael. Indeed there is very little about LilyPond here at StackOverflow, and that is one of the reasons I like to post questions (and answers as well, if I discover them). This could be a nice complement to the lilypond-user mailing list, which is certainly the best place to ask questions related to LilyPond.
– gilbertohasnofb
Aug 29 '13 at 13:30
2
@Michael I use LilyPond and think it's fantastic, but I'd still call questions about usage off-topic for Stack Overflow. The fact that its data files are closer to programming than most programs' strikes me as a technicality; you could make a similar argument for any software that consumes PostScript :P This question seems like a good fit for Music: Practice & Theory, though. Edit: there's even a meta question on the subject.
– shambulator
Aug 29 '13 at 14:13
1
It's a bit of a fuzzy one in my mind, and I haven't voted to close :P It's definitely on-topic for Music.SE ("usage of specific music software") - I don't agree that there needs to be some kind of "musical knowledge" bar - and I think LilyPond users there would appreciate having these kinds of questions. But at the same time, how many non-programmers use LilyPond in favour of something not quite so... programming language-like? :)
– shambulator
Aug 29 '13 at 15:58
3
@shambulator -- I agree that in general how to solve problems in music notation software is better for Music.SE (and voted up comment despite disagreeing), but I think a look at the "solution" posted below shows why (1) this seems the most appropriate place for discussing using lilypond (just like a question on "how can I use [C# library] to access [other library]) and (2) why few musicians have taken up lilypond. :-)
– Michael Scott Cuthbert
Aug 30 '13 at 3:44
|
show 3 more comments
1
I don't know the answer to this, but just as a comment to any moderators who don't know Lilypond but who might think of this Q as offtopic for StackOverflow: Lilypond is a notation software whose file-format is essentially a set of Scheme subroutines, so q's about usage tend to be on topic.
– Michael Scott Cuthbert
Aug 29 '13 at 3:46
1
Thanks for your comment, Michael. Indeed there is very little about LilyPond here at StackOverflow, and that is one of the reasons I like to post questions (and answers as well, if I discover them). This could be a nice complement to the lilypond-user mailing list, which is certainly the best place to ask questions related to LilyPond.
– gilbertohasnofb
Aug 29 '13 at 13:30
2
@Michael I use LilyPond and think it's fantastic, but I'd still call questions about usage off-topic for Stack Overflow. The fact that its data files are closer to programming than most programs' strikes me as a technicality; you could make a similar argument for any software that consumes PostScript :P This question seems like a good fit for Music: Practice & Theory, though. Edit: there's even a meta question on the subject.
– shambulator
Aug 29 '13 at 14:13
1
It's a bit of a fuzzy one in my mind, and I haven't voted to close :P It's definitely on-topic for Music.SE ("usage of specific music software") - I don't agree that there needs to be some kind of "musical knowledge" bar - and I think LilyPond users there would appreciate having these kinds of questions. But at the same time, how many non-programmers use LilyPond in favour of something not quite so... programming language-like? :)
– shambulator
Aug 29 '13 at 15:58
3
@shambulator -- I agree that in general how to solve problems in music notation software is better for Music.SE (and voted up comment despite disagreeing), but I think a look at the "solution" posted below shows why (1) this seems the most appropriate place for discussing using lilypond (just like a question on "how can I use [C# library] to access [other library]) and (2) why few musicians have taken up lilypond. :-)
– Michael Scott Cuthbert
Aug 30 '13 at 3:44
1
1
I don't know the answer to this, but just as a comment to any moderators who don't know Lilypond but who might think of this Q as offtopic for StackOverflow: Lilypond is a notation software whose file-format is essentially a set of Scheme subroutines, so q's about usage tend to be on topic.
– Michael Scott Cuthbert
Aug 29 '13 at 3:46
I don't know the answer to this, but just as a comment to any moderators who don't know Lilypond but who might think of this Q as offtopic for StackOverflow: Lilypond is a notation software whose file-format is essentially a set of Scheme subroutines, so q's about usage tend to be on topic.
– Michael Scott Cuthbert
Aug 29 '13 at 3:46
1
1
Thanks for your comment, Michael. Indeed there is very little about LilyPond here at StackOverflow, and that is one of the reasons I like to post questions (and answers as well, if I discover them). This could be a nice complement to the lilypond-user mailing list, which is certainly the best place to ask questions related to LilyPond.
– gilbertohasnofb
Aug 29 '13 at 13:30
Thanks for your comment, Michael. Indeed there is very little about LilyPond here at StackOverflow, and that is one of the reasons I like to post questions (and answers as well, if I discover them). This could be a nice complement to the lilypond-user mailing list, which is certainly the best place to ask questions related to LilyPond.
– gilbertohasnofb
Aug 29 '13 at 13:30
2
2
@Michael I use LilyPond and think it's fantastic, but I'd still call questions about usage off-topic for Stack Overflow. The fact that its data files are closer to programming than most programs' strikes me as a technicality; you could make a similar argument for any software that consumes PostScript :P This question seems like a good fit for Music: Practice & Theory, though. Edit: there's even a meta question on the subject.
– shambulator
Aug 29 '13 at 14:13
@Michael I use LilyPond and think it's fantastic, but I'd still call questions about usage off-topic for Stack Overflow. The fact that its data files are closer to programming than most programs' strikes me as a technicality; you could make a similar argument for any software that consumes PostScript :P This question seems like a good fit for Music: Practice & Theory, though. Edit: there's even a meta question on the subject.
– shambulator
Aug 29 '13 at 14:13
1
1
It's a bit of a fuzzy one in my mind, and I haven't voted to close :P It's definitely on-topic for Music.SE ("usage of specific music software") - I don't agree that there needs to be some kind of "musical knowledge" bar - and I think LilyPond users there would appreciate having these kinds of questions. But at the same time, how many non-programmers use LilyPond in favour of something not quite so... programming language-like? :)
– shambulator
Aug 29 '13 at 15:58
It's a bit of a fuzzy one in my mind, and I haven't voted to close :P It's definitely on-topic for Music.SE ("usage of specific music software") - I don't agree that there needs to be some kind of "musical knowledge" bar - and I think LilyPond users there would appreciate having these kinds of questions. But at the same time, how many non-programmers use LilyPond in favour of something not quite so... programming language-like? :)
– shambulator
Aug 29 '13 at 15:58
3
3
@shambulator -- I agree that in general how to solve problems in music notation software is better for Music.SE (and voted up comment despite disagreeing), but I think a look at the "solution" posted below shows why (1) this seems the most appropriate place for discussing using lilypond (just like a question on "how can I use [C# library] to access [other library]) and (2) why few musicians have taken up lilypond. :-)
– Michael Scott Cuthbert
Aug 30 '13 at 3:44
@shambulator -- I agree that in general how to solve problems in music notation software is better for Music.SE (and voted up comment despite disagreeing), but I think a look at the "solution" posted below shows why (1) this seems the most appropriate place for discussing using lilypond (just like a question on "how can I use [C# library] to access [other library]) and (2) why few musicians have taken up lilypond. :-)
– Michael Scott Cuthbert
Aug 30 '13 at 3:44
|
show 3 more comments
2 Answers
2
active
oldest
votes
This is a workaround for this problem:
version "2.19.15"
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% COPY ALL THIS BELOW %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% repeatBracket snippet
% will add .----Nx----. above a bar, where N is the number of repetitions
% based on the wonderful spanner by David Nalesnik (see: http://lists.gnu.org/archive/html/lilypond-user/2014-10/msg00446.html )
#(define (test-stencil grob text)
(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))
(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 CENTER))
(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
,(if (or (null? siblings) (eq? grob (car siblings)))
-1.0 0.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
,(if (or (null? siblings) (eq? grob (last siblings)))
-1.0 0.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))
#(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))
(set! (ly:spanner-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 '())))))))
layout {
context {
Staff
consists #Measure_attached_spanner_engraver
override MeasureCounter.font-encoding = #'latin1
override MeasureCounter.font-size = 0
override MeasureCounter.outside-staff-padding = 2
override MeasureCounter.outside-staff-horizontal-padding = #0
}
}
repeatBracket = #(define-music-function
(parser location N note)
(number? ly:music?)
#{
override Staff.MeasureCounter.stencil =
#(lambda (grob) (test-stencil grob #{ #(string-append(number->string N) "×") #} ))
startMeasureCount
repeat volta #N { $note }
stopMeasureCount
#}
)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ...UNTIL HERE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
{
repeatBracket 7 {c'1}
repeatBracket 32 {d' g}
repeatBracket 14 {e' f g}
repeatBracket 29 {f' a bes break cis' e''}
repeatBracket 1048 {g'1}
}
This code above gives the following result:
]
This solution was not created by myself, but sent to me by David Nalesnik, from lilypond-user mailing list. I just would like to share it here in case someone would need it as well. I've made just some very minor adjustments to what David sent me.
add a comment |
I just had a similar problem but preferred the style on your second example, with the 3x above the bar. The solution I found was:
f e d c |
mark markup {"3x"}repeat volta 3 {c d e f}
f e d c |
generating
Maybe someone else has a use for it.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f18429727%2flilypond-how-to-add-the-number-of-repetitions-above-a-bar%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
This is a workaround for this problem:
version "2.19.15"
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% COPY ALL THIS BELOW %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% repeatBracket snippet
% will add .----Nx----. above a bar, where N is the number of repetitions
% based on the wonderful spanner by David Nalesnik (see: http://lists.gnu.org/archive/html/lilypond-user/2014-10/msg00446.html )
#(define (test-stencil grob text)
(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))
(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 CENTER))
(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
,(if (or (null? siblings) (eq? grob (car siblings)))
-1.0 0.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
,(if (or (null? siblings) (eq? grob (last siblings)))
-1.0 0.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))
#(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))
(set! (ly:spanner-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 '())))))))
layout {
context {
Staff
consists #Measure_attached_spanner_engraver
override MeasureCounter.font-encoding = #'latin1
override MeasureCounter.font-size = 0
override MeasureCounter.outside-staff-padding = 2
override MeasureCounter.outside-staff-horizontal-padding = #0
}
}
repeatBracket = #(define-music-function
(parser location N note)
(number? ly:music?)
#{
override Staff.MeasureCounter.stencil =
#(lambda (grob) (test-stencil grob #{ #(string-append(number->string N) "×") #} ))
startMeasureCount
repeat volta #N { $note }
stopMeasureCount
#}
)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ...UNTIL HERE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
{
repeatBracket 7 {c'1}
repeatBracket 32 {d' g}
repeatBracket 14 {e' f g}
repeatBracket 29 {f' a bes break cis' e''}
repeatBracket 1048 {g'1}
}
This code above gives the following result:
]
This solution was not created by myself, but sent to me by David Nalesnik, from lilypond-user mailing list. I just would like to share it here in case someone would need it as well. I've made just some very minor adjustments to what David sent me.
add a comment |
This is a workaround for this problem:
version "2.19.15"
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% COPY ALL THIS BELOW %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% repeatBracket snippet
% will add .----Nx----. above a bar, where N is the number of repetitions
% based on the wonderful spanner by David Nalesnik (see: http://lists.gnu.org/archive/html/lilypond-user/2014-10/msg00446.html )
#(define (test-stencil grob text)
(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))
(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 CENTER))
(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
,(if (or (null? siblings) (eq? grob (car siblings)))
-1.0 0.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
,(if (or (null? siblings) (eq? grob (last siblings)))
-1.0 0.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))
#(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))
(set! (ly:spanner-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 '())))))))
layout {
context {
Staff
consists #Measure_attached_spanner_engraver
override MeasureCounter.font-encoding = #'latin1
override MeasureCounter.font-size = 0
override MeasureCounter.outside-staff-padding = 2
override MeasureCounter.outside-staff-horizontal-padding = #0
}
}
repeatBracket = #(define-music-function
(parser location N note)
(number? ly:music?)
#{
override Staff.MeasureCounter.stencil =
#(lambda (grob) (test-stencil grob #{ #(string-append(number->string N) "×") #} ))
startMeasureCount
repeat volta #N { $note }
stopMeasureCount
#}
)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ...UNTIL HERE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
{
repeatBracket 7 {c'1}
repeatBracket 32 {d' g}
repeatBracket 14 {e' f g}
repeatBracket 29 {f' a bes break cis' e''}
repeatBracket 1048 {g'1}
}
This code above gives the following result:
]
This solution was not created by myself, but sent to me by David Nalesnik, from lilypond-user mailing list. I just would like to share it here in case someone would need it as well. I've made just some very minor adjustments to what David sent me.
add a comment |
This is a workaround for this problem:
version "2.19.15"
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% COPY ALL THIS BELOW %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% repeatBracket snippet
% will add .----Nx----. above a bar, where N is the number of repetitions
% based on the wonderful spanner by David Nalesnik (see: http://lists.gnu.org/archive/html/lilypond-user/2014-10/msg00446.html )
#(define (test-stencil grob text)
(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))
(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 CENTER))
(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
,(if (or (null? siblings) (eq? grob (car siblings)))
-1.0 0.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
,(if (or (null? siblings) (eq? grob (last siblings)))
-1.0 0.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))
#(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))
(set! (ly:spanner-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 '())))))))
layout {
context {
Staff
consists #Measure_attached_spanner_engraver
override MeasureCounter.font-encoding = #'latin1
override MeasureCounter.font-size = 0
override MeasureCounter.outside-staff-padding = 2
override MeasureCounter.outside-staff-horizontal-padding = #0
}
}
repeatBracket = #(define-music-function
(parser location N note)
(number? ly:music?)
#{
override Staff.MeasureCounter.stencil =
#(lambda (grob) (test-stencil grob #{ #(string-append(number->string N) "×") #} ))
startMeasureCount
repeat volta #N { $note }
stopMeasureCount
#}
)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ...UNTIL HERE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
{
repeatBracket 7 {c'1}
repeatBracket 32 {d' g}
repeatBracket 14 {e' f g}
repeatBracket 29 {f' a bes break cis' e''}
repeatBracket 1048 {g'1}
}
This code above gives the following result:
]
This solution was not created by myself, but sent to me by David Nalesnik, from lilypond-user mailing list. I just would like to share it here in case someone would need it as well. I've made just some very minor adjustments to what David sent me.
This is a workaround for this problem:
version "2.19.15"
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% COPY ALL THIS BELOW %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% repeatBracket snippet
% will add .----Nx----. above a bar, where N is the number of repetitions
% based on the wonderful spanner by David Nalesnik (see: http://lists.gnu.org/archive/html/lilypond-user/2014-10/msg00446.html )
#(define (test-stencil grob text)
(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))
(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 CENTER))
(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
,(if (or (null? siblings) (eq? grob (car siblings)))
-1.0 0.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
,(if (or (null? siblings) (eq? grob (last siblings)))
-1.0 0.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))
#(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))
(set! (ly:spanner-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 '())))))))
layout {
context {
Staff
consists #Measure_attached_spanner_engraver
override MeasureCounter.font-encoding = #'latin1
override MeasureCounter.font-size = 0
override MeasureCounter.outside-staff-padding = 2
override MeasureCounter.outside-staff-horizontal-padding = #0
}
}
repeatBracket = #(define-music-function
(parser location N note)
(number? ly:music?)
#{
override Staff.MeasureCounter.stencil =
#(lambda (grob) (test-stencil grob #{ #(string-append(number->string N) "×") #} ))
startMeasureCount
repeat volta #N { $note }
stopMeasureCount
#}
)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ...UNTIL HERE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
{
repeatBracket 7 {c'1}
repeatBracket 32 {d' g}
repeatBracket 14 {e' f g}
repeatBracket 29 {f' a bes break cis' e''}
repeatBracket 1048 {g'1}
}
This code above gives the following result:
]
This solution was not created by myself, but sent to me by David Nalesnik, from lilypond-user mailing list. I just would like to share it here in case someone would need it as well. I've made just some very minor adjustments to what David sent me.
edited Nov 22 '18 at 16:05
answered Aug 29 '13 at 13:28
gilbertohasnofbgilbertohasnofb
1,027924
1,027924
add a comment |
add a comment |
I just had a similar problem but preferred the style on your second example, with the 3x above the bar. The solution I found was:
f e d c |
mark markup {"3x"}repeat volta 3 {c d e f}
f e d c |
generating
Maybe someone else has a use for it.
add a comment |
I just had a similar problem but preferred the style on your second example, with the 3x above the bar. The solution I found was:
f e d c |
mark markup {"3x"}repeat volta 3 {c d e f}
f e d c |
generating
Maybe someone else has a use for it.
add a comment |
I just had a similar problem but preferred the style on your second example, with the 3x above the bar. The solution I found was:
f e d c |
mark markup {"3x"}repeat volta 3 {c d e f}
f e d c |
generating
Maybe someone else has a use for it.
I just had a similar problem but preferred the style on your second example, with the 3x above the bar. The solution I found was:
f e d c |
mark markup {"3x"}repeat volta 3 {c d e f}
f e d c |
generating
Maybe someone else has a use for it.
edited Apr 7 '14 at 10:32
answered Sep 8 '13 at 13:00
MathiasMathias
1,284816
1,284816
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f18429727%2flilypond-how-to-add-the-number-of-repetitions-above-a-bar%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
1
I don't know the answer to this, but just as a comment to any moderators who don't know Lilypond but who might think of this Q as offtopic for StackOverflow: Lilypond is a notation software whose file-format is essentially a set of Scheme subroutines, so q's about usage tend to be on topic.
– Michael Scott Cuthbert
Aug 29 '13 at 3:46
1
Thanks for your comment, Michael. Indeed there is very little about LilyPond here at StackOverflow, and that is one of the reasons I like to post questions (and answers as well, if I discover them). This could be a nice complement to the lilypond-user mailing list, which is certainly the best place to ask questions related to LilyPond.
– gilbertohasnofb
Aug 29 '13 at 13:30
2
@Michael I use LilyPond and think it's fantastic, but I'd still call questions about usage off-topic for Stack Overflow. The fact that its data files are closer to programming than most programs' strikes me as a technicality; you could make a similar argument for any software that consumes PostScript :P This question seems like a good fit for Music: Practice & Theory, though. Edit: there's even a meta question on the subject.
– shambulator
Aug 29 '13 at 14:13
1
It's a bit of a fuzzy one in my mind, and I haven't voted to close :P It's definitely on-topic for Music.SE ("usage of specific music software") - I don't agree that there needs to be some kind of "musical knowledge" bar - and I think LilyPond users there would appreciate having these kinds of questions. But at the same time, how many non-programmers use LilyPond in favour of something not quite so... programming language-like? :)
– shambulator
Aug 29 '13 at 15:58
3
@shambulator -- I agree that in general how to solve problems in music notation software is better for Music.SE (and voted up comment despite disagreeing), but I think a look at the "solution" posted below shows why (1) this seems the most appropriate place for discussing using lilypond (just like a question on "how can I use [C# library] to access [other library]) and (2) why few musicians have taken up lilypond. :-)
– Michael Scott Cuthbert
Aug 30 '13 at 3:44