Re: Allows slurs to break at barlines. (issue 7424049)
LGTM. I can't help with the problem you are mentioning, but I have the feeling that the overall code has improved (and probably become simpler also) w.r.t. previous versions of the patch. Congrats! https://codereview.appspot.com/7424049/diff/53001/input/regression/repeat-slur.ly File input/regression/repeat-slur.ly (right): https://codereview.appspot.com/7424049/diff/53001/input/regression/repeat-slur.ly#newcode9 input/regression/repeat-slur.ly:9: broken slur at a bar, use @code{broken} with a closing parenthesis. You don't like the backslash, do you? :-) Please say `@code{\\broken}', etc. https://codereview.appspot.com/7424049/ ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: Add warning about using \relative with tagged music (3253) (issue 7798045)
I'm confused by the new text. I also fail to see the motivation for explaining this; no-one has reported any confusion with the behavior. You might just say "Notice that \keepWithTag can change the pitches used as reference for later pitches written using relative input mode. The d below is interpreted as a fourth below g' or as a third below f'' depending on which tag is kept: music = << \tag #'score a \tag #'part f >> \relative c'' { c \keepWithTag #'score \music d} Applying \relative first, then \keepWithTag is the usual method of input, so that \relative acts on the pitches as-input: \keepWithTag #'score \relative c'' { c \music d} " https://codereview.appspot.com/7798045/diff/1/Documentation/notation/input.itely File Documentation/notation/input.itely (right): https://codereview.appspot.com/7798045/diff/1/Documentation/notation/input.itely#newcode2236 Documentation/notation/input.itely:2236: to notes with pitches expressed in absolute notation. If music is This makes it sound like I cannot do this: music = \relative c' \new Staff{ << \tag#'F {f} \tag#'G {g} >> c } % C in relative notation is a fourth above the G \keepWithTag#'F \music \keepWithTag#'G \music https://codereview.appspot.com/7798045/diff/1/Documentation/notation/input.itely#newcode2239 Documentation/notation/input.itely:2239: absolute notation before being filtered with @code{\keepWithTag} or I would not think that \relative converted pitches to absolute notation. The computer has already read my relative-pitch input notation, and I have no concept of a 'notation' at that point. I suppose \displayLilyMusic does recreate absolute notation. https://codereview.appspot.com/7798045/ ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: Creates more possibilities for vertical and horizontal skyline functions. (issue 7516048)
Mike, i've read the patch 3 times and i don't understand how it solves the problem. I see that you remove some weird c++ code, but why can you do this? Also, why marking some grobs as cross-staff helps with solving issue 3242, which is about manual beams over rests? What figured bass has to do with this at all? Creates more possibilities for vertical and horizontal skyline functions. I think this sentence applied to first version of the patch; it seems unrelated to current patchset. I'm sorry to say this, but i think this issue is unreviewable :/ https://codereview.appspot.com/7516048/ ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: let beam thickness depend on line thickness (fix 3173) (issue 7312091)
Reviewers: lemzwerg, dak, Message: Thanks for reviews. Before i can continue with this patch, i have to investigate a possible new way of specifying property values (inspired by David here http://code.google.com/p/lilypond/issues/detail?id=3173#c5) best, JAnek https://codereview.appspot.com/7312091/diff/1/scm/define-grob-properties.scm File scm/define-grob-properties.scm (right): https://codereview.appspot.com/7312091/diff/1/scm/define-grob-properties.scm#newcode93 scm/define-grob-properties.scm:93: (beam-thickness ,number-pair? "Beam thickness. It is the sum On 2013/02/14 19:43:00, dak wrote: You are confusing "sum" and "pair" in this comment. You're right, sorry. I've copied this from the description of ledger-line-thickness, so that one needs clarifying as well. Description: let beam thickness depend on line thickness (fix 3173) One of LilyPond's design principles is "optical sizing" (described in Essay, section Engraving details), which means that as the font-size gets smaller, all elements get relatively thicker. Before now beam-thickness was defined as a fraction of staffSpace, which meant no optical sizing (the thickness of the beam stayed constant relative to the height of the staff). This patch changes beam-thickness property to be a pair of numbers (a . b). The actual thickness is calculated according to the formula a * lineThickness + b * staffSpace (similarly to ledger line thickness). Please review this at https://codereview.appspot.com/7312091/ Affected files: M lily/beam.cc M scm/define-grob-properties.scm M scm/define-grobs.scm Index: lily/beam.cc diff --git a/lily/beam.cc b/lily/beam.cc index 4a2e752947bcf753815e151e207f1cae6f7b562d..8a50039964ec77936dc6603905e488efbd53c551 100644 --- a/lily/beam.cc +++ b/lily/beam.cc @@ -106,8 +106,11 @@ Beam::add_stem (Grob *me, Grob *s) Real Beam::get_beam_thickness (Grob *me) { - return robust_scm2double (me->get_property ("beam-thickness"), 0) - * Staff_symbol_referencer::staff_space (me); + SCM bmth_pair = me->get_property ("beam-thickness"); + Offset th = robust_scm2offset (bmth_pair, Offset (1, 0.38)); + + return th[X_AXIS] * Staff_symbol_referencer::line_thickness (me) + + th[Y_AXIS] * Staff_symbol_referencer::staff_space (me); } /* Return the translation between 2 adjoining beams. */ Index: scm/define-grob-properties.scm diff --git a/scm/define-grob-properties.scm b/scm/define-grob-properties.scm index c1a3a723cb89a601c2a65dd56719467a38088859..00cf25f276a1037a6257aa7e1006f41d49494d77 100644 --- a/scm/define-grob-properties.scm +++ b/scm/define-grob-properties.scm @@ -90,8 +90,9 @@ shortest notes in a piece. Normally, pieces are spaced as if notes at least as short as this are present.") (baseline-skip ,ly:dimension? "Distance between base lines of multiple lines of text.") - (beam-thickness ,ly:dimension? "Beam thickness, measured in -@code{staff-space} units.") + (beam-thickness ,number-pair? "Beam thickness. It is the sum +of 2@tie{}numbers: The first is the factor for line thickness, +and the second for staff space. Both contributions are added.") (beam-width ,ly:dimension? "Width of the tremolo sign.") (beamed-stem-shorten ,list? "How much to shorten beamed stems, when their direction is forced. It is a list, since the value is Index: scm/define-grobs.scm diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index cc4a9c76e935f7ba965f2904aedcfce460856724..dd04211cb4bf62bf5c82cc3a3ab3aa39c44af068 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -342,7 +342,7 @@ ;; rather long. (auto-knee-gap . 5.5) (beam-segments . ,ly:beam::calc-beam-segments) - (beam-thickness . 0.48) ; in staff-space + (beam-thickness . (1 . 0.38)) ; line-thickness + staff-space ;; We have some unreferenced problems here. ;; ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: Creates more possibilities for vertical and horizontal skyline functions. (issue 7516048)
On 19 mars 2013, at 12:49, janek.lilyp...@gmail.com wrote: > Mike, > > i've read the patch 3 times and i don't understand how it solves the > problem. > > I see that you remove some weird c++ code, but why can you do this? > Also, why marking some grobs as cross-staff helps with solving issue > 3242, which is about manual beams over rests? > What figured bass has to do with this at all? > >> Creates more possibilities for vertical and horizontal skyline > functions. > > I think this sentence applied to first version of the patch; it seems > unrelated to current patchset. > > I'm sorry to say this, but i think this issue is unreviewable :/ Thanks for the feedback! I've changed the message on Rietveld to be more in line with the current patch - you're right that it's bounced around quite a bit. I've also added a couple comments. Cheers, MS ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Let lilymidi display key signatures in a readable manner (issue 7836046)
LGTM https://codereview.appspot.com/7836046/ ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: report a programming error when trying to align on empty parent (issue 7533046)
LGTM https://codereview.appspot.com/7533046/ ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: Allows slurs to break at barlines. (issue 7424049)
https://codereview.appspot.com/7424049/diff/62001/input/regression/repeat-slur.ly File input/regression/repeat-slur.ly (right): https://codereview.appspot.com/7424049/diff/62001/input/regression/repeat-slur.ly#newcode9 input/regression/repeat-slur.ly:9: broken slur at a bar, use @code{\broken} with a closing parenthesis. Sorry to bother you again, but *two* backslashes are needed: @code{\\broken} https://codereview.appspot.com/7424049/ ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: don't abort aligning when grob's parent is a PaperColumn (issue 7564044)
https://codereview.appspot.com/7564044/diff/9001/lily/self-alignment-interface.cc File lily/self-alignment-interface.cc (right): https://codereview.appspot.com/7564044/diff/9001/lily/self-alignment-interface.cc#newcode130 lily/self-alignment-interface.cc:130: // TODO: should this function be defined someplace else, e.g. in note-column.cc? I like where you're going with this. I would recommend creating a function algined_on_grobs that accepts a grob, an vector of grobs to align to, and an axis. Then algined_on_parent becomes a subset of this where the vector is of length one and is the parent. Then, you can create a function Self_alignment_interface::lyrics_algined_on_note_columns that invokes aligned_on_grobs with a vector of note columns returned using the search method in this function. This function could be implemented in paper-column.cc as get_generic_interface_extent such that it recurses through a paper columns' element list, finds all grobs implementing interface X and returns them. https://codereview.appspot.com/7564044/ ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: reorganize self_alignment_interface (issue 7768043)
https://codereview.appspot.com/7768043/diff/19001/lily/self-alignment-interface.cc File lily/self-alignment-interface.cc (right): https://codereview.appspot.com/7768043/diff/19001/lily/self-alignment-interface.cc#newcode128 lily/self-alignment-interface.cc:128: /* LilyPond positions every grob relative to its parent in respective axis. In general, try to avoid using the word LilyPond in comments, as it is in the LilyPond code base. https://codereview.appspot.com/7768043/diff/19001/lily/self-alignment-interface.cc#newcode133 lily/self-alignment-interface.cc:133: I don't see staff space being looked up anywhere in the function. https://codereview.appspot.com/7768043/diff/19001/lily/self-alignment-interface.cc#newcode144 lily/self-alignment-interface.cc:144: With respect to my last review, this function should accept a pointer to a vector of grob pointers: vector &hims so that you can do the note column stuff for lyrics. https://codereview.appspot.com/7768043/diff/19001/lily/self-alignment-interface.cc#newcode144 lily/self-alignment-interface.cc:144: I don't have the energy to trigger another comment flame war, but a comment like this may wind up diverging from what the code is doing (it already does with the staff space thing). Can you write the bare minimum and comment the code below in places? The code is already clear: I can tell what you're doing and why you're doing it, so it speaks for itself. https://codereview.appspot.com/7768043/ ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: don't abort aligning when grob's parent is a PaperColumn (issue 7564044)
Thanks for reviewing, Mike! I'm uploading new patchset. https://codereview.appspot.com/7564044/diff/9001/lily/self-alignment-interface.cc File lily/self-alignment-interface.cc (right): https://codereview.appspot.com/7564044/diff/9001/lily/self-alignment-interface.cc#newcode130 lily/self-alignment-interface.cc:130: // TODO: should this function be defined someplace else, e.g. in note-column.cc? On 2013/03/19 15:21:37, MikeSol wrote: I like where you're going with this. I would recommend creating a function algined_on_grobs that accepts a grob, an vector of grobs to align to, and an axis. Then algined_on_parent becomes a subset of this where the vector is of length one and is the parent. Then, you can create a function Self_alignment_interface::lyrics_algined_on_note_columns that invokes aligned_on_grobs with a vector of note columns returned using the search method in this function. I'll post a detailed answer in https://codereview.appspot.com/7768043/ This function could be implemented in paper-column.cc as get_generic_interface_extent such that it recurses through a paper columns'element list, finds all grobs implementing interface X and returns them. Good idea! Done. https://codereview.appspot.com/7564044/ ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
R shorthand
Hello all, While answering Helge's post about multi-measure rests, I had a couple of R-elated observations/thoughts: 1. We shouldn't be encouraging code like R4*3 in a 4/4 measure, right? So the duration ultimately makes no sense anyway. 2. The most elegant solution would be to use R (i.e., with no duration) to represent a multimeasure rest, and it would "adapt" in duration to whatever time signature was in force at that moment. 3. Then R14 (e.g.) would represent 14 *measures*, not beats/counts — again, simpler, more elegant, and certainly more intuitive than the current situation. Would it be difficult to implement such a scheme (play-on-words intended)? Best regards, Kieren. ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: R shorthand
Kieren MacMillan writes: > Hello all, > > While answering Helge's post about multi-measure rests, I had a couple > of R-elated observations/thoughts: > > 1. We shouldn't be encouraging code like R4*3 in a 4/4 measure, right? > So the duration ultimately makes no sense anyway. > 2. The most elegant solution would be to use R (i.e., with no > duration) to represent a multimeasure rest, and it would "adapt" in > duration to whatever time signature was in force at that moment. > 3. Then R14 (e.g.) would represent 14 *measures*, not beats/counts — > again, simpler, more elegant, and certainly more intuitive than the > current situation. > > Would it be difficult to implement such a scheme (play-on-words > intended)? One idea is that this makes it easy to switch between r and R. Also, R is something that editors treat like note names. We could promote using R1*3/4*14 in the documentation (for 5 measures of 3/4). That's reasonably brainless, but indeed more verbose than desirable. Or we could offer \tacet 14 without any relation to durations. -- David Kastrup ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: R shorthand
Am 19.03.2013 20:41, schrieb David Kastrup: Kieren MacMillan writes: Hello all, While answering Helge's post about multi-measure rests, I had a couple of R-elated observations/thoughts: 1. We shouldn't be encouraging code like R4*3 in a 4/4 measure, right? So the duration ultimately makes no sense anyway. 2. The most elegant solution would be to use R (i.e., with no duration) to represent a multimeasure rest, and it would "adapt" in duration to whatever time signature was in force at that moment. 3. Then R14 (e.g.) would represent 14 *measures*, not beats/counts — again, simpler, more elegant, and certainly more intuitive than the current situation. I am not sure about this. Yes, we are talking about full measure rests any way, but R14 looks wrong to me. If the duration could be omitted for R as you described, then I'd vote for R being *one* measure and for R * 14 to get the desired 14 measures. Would it be difficult to implement such a scheme (play-on-words intended)? One idea is that this makes it easy to switch between r and R. Also, R is something that editors treat like note names. We could promote using R1*3/4*14 in the documentation (for 5 measures of 14 measures? 3/4). That's reasonably brainless, but indeed more verbose than desirable. Or we could offer \tacet 14 without any relation to durations. That sounds like a good thing to have. If this works with \compressFullBarRests then it will be a nice feature. ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: R shorthand
Kieren, What happens when we need an awkward length R like R1*12/8*14? Shane On Tue, Mar 19, 2013 at 3:05 PM, Kieren MacMillan wrote: > Hello all, > > While answering Helge's post about multi-measure rests, I had a couple of > R-elated observations/thoughts: > > 1. We shouldn't be encouraging code like R4*3 in a 4/4 measure, right? So the > duration ultimately makes no sense anyway. > 2. The most elegant solution would be to use R (i.e., with no duration) to > represent a multimeasure rest, and it would "adapt" in duration to whatever > time signature was in force at that moment. > 3. Then R14 (e.g.) would represent 14 *measures*, not beats/counts — again, > simpler, more elegant, and certainly more intuitive than the current > situation. > > Would it be difficult to implement such a scheme (play-on-words intended)? > > Best regards, > Kieren. > ___ > lilypond-user mailing list > lilypond-u...@gnu.org > https://lists.gnu.org/mailman/listinfo/lilypond-user ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: R shorthand
Hi Shane, > What happens when we need an awkward length R like R1*12/8*14? I'm not sure what you mean by "awkward length"… I'm suggesting that R (with no duration given) should give you a one-measure multi-measure rest, regardless of what the measure duration is. And that Rx (where x is an integer) will give you an x-measure multi-measure rest, regardless of the duration(s) of each measure. Let's say you have the following passage: 7 measure of 4/4, 1 measure of 5/8, 2 measures of 7/16, and 3 measures of 3/4. R13 would give you a multi-measure rest which is as long as the whole section. So what would constitute an "awkward length", if R simply gives you the duration of the measure, whatever it is? Are you not asking for a multi-measure rest which has the same duration as the measure it fills? If so, how does that make any sense? What are you doing in the rest of that measure (that can't be better done another way)? Thanks, Kieren. ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: R shorthand
Even while I am a bit sceptical whether the syntax for R should differ from r, I see your point. Rather than R14 for a 14 measure rest, I would suggest to keep the syntax close to the one before: R*14 (This way I would almost be convinced ;) ) Could the duration be optional this way, keeping the current behaviour if given? I mean could this change request be implemented without affecting the recommended way at present? Probably not, because of ambiguities, and because the following notes would take the same duration. Cheers, Joram ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: reorganize self_alignment_interface (issue 7768043)
Hi Mike & all, On 2013/03/19 15:21:37, MikeSol wrote: I like where you're going with this. cool! :) I would recommend creating a function algined_on_grobs that accepts a grob, an vector of grobs to align to, and an axis. Then algined_on_parent becomes a subset of this where the vector is of length one and is the parent. Then, you can create a function Self_alignment_interface::lyrics_algined_on_note_columns that invokes aligned_on_grobs with a vector of note columns returned using the search method in this function. On 2013/03/19 15:28:45, MikeSol wrote: With respect to my last review, this function should accept a pointer to a vector of grob pointers: vector &hims so that you can do the note column stuff for lyrics. I don't think this (defining special lyrics_algined_on_note_columns callback) is optimal approach. With your suggestion, here's how i expect alignment stuff would look like: - there'd be a method Self_alignment_interface::aligned_on_grobs that can align a grob on another grob(s) - we'd have two callbacks: Self_alignment_interface::lyrics_aligned_on_note_columns and Self_alignment_interface::lyrics_aligned_on_parent_notehead - we'd have to decide when which callback should be used. How should LyricText definition in define-grobs.scm look like? We should use lyrics_aligned_on_note_columns when lyrics are unassociated, and lyrics_aligned_on_parent_notehead when there is an associatedVoice - how to write that in define-grobs? And the same thing will be repeated for many other grobs, for example DynamicTexts: we'll have to specify different callback for DynamicTexts attached to NoteHeads, and different one for standalone Dynamics (e.g. in Dynamic Context). How alignment stuff would look like with my approach: - aligned_on_grobs would be more complicated, because it'd have to grab NoteColumn extent if 'him' turns out to be a PaperColumn - we'd have one callback for everything - we won't have to think about anything when defining grobs. We'd just write X-offset = ly:self-alignment-interface::align-grob, and it would be aligned_on_grobs' job to align on appropriate grob if the default one (parent) is inappropriate. The difference is conceptual: aligning on NoteColumn is an exception, an emergency exit needed only when grob doesn't have an ordinary parent. As far as i know, if grob's parent is a NoteHead or some other "normal" grob, we always want to align on that; and when grob's parent is a PaperColumn, we always want to align grob on an appropriate NoteColumn. As for using a vector 'hims' instead of single 'him', maybe it's a good idea, but i don't see any uses for it (besides your above suggestion, which seems to be unnecessary). https://codereview.appspot.com/7768043/diff/19001/lily/self-alignment-interface.cc File lily/self-alignment-interface.cc (right): https://codereview.appspot.com/7768043/diff/19001/lily/self-alignment-interface.cc#newcode128 lily/self-alignment-interface.cc:128: /* LilyPond positions every grob relative to its parent in respective axis. On 2013/03/19 15:28:45, MikeSol wrote: In general, try to avoid using the word LilyPond in comments, as it is in the LilyPond code base. Done. https://codereview.appspot.com/7768043/diff/19001/lily/self-alignment-interface.cc#newcode133 lily/self-alignment-interface.cc:133: On 2013/03/19 15:28:45, MikeSol wrote: I don't see staff space being looked up anywhere in the function. Well, staffspace is the unit in which XY-offsets are measured, so it's implied by LilyPond herself. I've reworded the comment to make it clearer. https://codereview.appspot.com/7768043/diff/19001/lily/self-alignment-interface.cc#newcode144 lily/self-alignment-interface.cc:144: On 2013/03/19 15:28:45, MikeSol wrote: I don't have the energy to trigger another comment flame war, but a comment like this may wind up diverging from what the code is doing (it already does with the staff space thing). Can you write the bare minimum and comment the code below in places? The code is already clear: I can tell what you're doing and why you're doing it, so it speaks for itself. I've trimmed the comments and tried to make them less implementation-specific. However, as a rule, i will continue to write as much comments as is reasonable (of course, let me know whenever i write *too much* comments!), because of two things: - i really want to make reading the code /as easy as possible/ for a newcomer (i know that i'd benefit from these comments if they were written when i was first reading the code) - i want to make review process as easy as possible, to encourage everyone (including non-c++ people) to review my code ;) My rule is "reading commit message should make it clear what the patch does and why, and after first reading of the code&comments it should be clear how it's done, at least at the concept level". https://codereview.appspot.com/7768043/ ___ lilypond-devel mailing list l
Re: R shorthand
I see now, but one would think that might cause more difficult programming necessitating the keeping tracking of various R values through out the piece as defined by a time signature as opposed to us setting the value, which probably would also slow down lilypond having to parse and hang on to that extra undeclared information. Of course maybe i am wrong on that. But I do believe making sure the user is forced to think out the value of R duration is probably more useful than any minimal convenience, especially as Joram points out that would make r and R functionality divergent. Shane On Tue, Mar 19, 2013 at 4:52 PM, Joram Berger wrote: > Even while I am a bit sceptical whether the syntax for R should differ > from r, I see your point. > > Rather than R14 for a 14 measure rest, I would suggest to keep the > syntax close to the one before: R*14 (This way I would almost be > convinced ;) ) > > Could the duration be optional this way, keeping the current behaviour > if given? I mean could this change request be implemented without > affecting the recommended way at present? Probably not, because of > ambiguities, and because the following notes would take the same duration. > > Cheers, > Joram > > ___ > lilypond-user mailing list > lilypond-u...@gnu.org > https://lists.gnu.org/mailman/listinfo/lilypond-user ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: Allows slurs to break at barlines. (issue 7424049)
On 2013/03/19 15:22:41, MikeSol wrote: Two backslashes After some consideration, I consider the name \broken suboptimal since it implies two pieces. Two other possibilities would be \detached and \fake. https://codereview.appspot.com/7424049/ ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: Removes kludges in stencil-based skyline code. (issue 7516048)
LGTM :) https://codereview.appspot.com/7516048/ ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: Allows slurs to break at barlines. (issue 7424049)
On 19 mars 2013, at 22:26, d...@gnu.org wrote: > On 2013/03/19 15:22:41, MikeSol wrote: >> Two backslashes > > After some consideration, I consider the name \broken suboptimal since > it implies two pieces. Two other possibilities would be \detached and > \fake. > > https://codereview.appspot.com/7424049/ I vote for detached. Cheers, MS ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
shall we change self-alignment-interface to alignment-interface?
Hi, I think the name "self alignment interface" is confusing: after all, the class contains not only methods for aligning grobs on themselves, but also for aligning them on their parents or other grobs. What about changing class' (and file) name to alignment-interface, or sth else? Similarly with properties self-alignment-[XY]: i was confused by them for a long time, because they affect not only grob's own alignment, but also to which point of its parent is the grob attached. cheers, Janek ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: Allows slurs to break at barlines. (issue 7424049)
>> After some consideration, I consider the name \broken suboptimal since >> it implies two pieces. Two other possibilities would be \detached and >> \fake. > > I vote for detached. I vote for \broken. For me, it doesn't imply two pieces. This was David's first, quick suggestion, and I think it's good for exactly this reason. Werner ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: reorganize self_alignment_interface (issue 7768043)
On 19 mars 2013, at 22:04, janek.lilyp...@gmail.com wrote: > Hi Mike & all, > > On 2013/03/19 15:21:37, MikeSol wrote: >> I like where you're going with this. > > cool! :) > >> I would recommend creating a function algined_on_grobs that accepts a > grob, an >> vector of grobs to align to, and an axis. Then algined_on_parent > becomes a >> subset of this where the vector is of length one and is the parent. >> Then, you can create a function >> Self_alignment_interface::lyrics_algined_on_note_columns that invokes >> aligned_on_grobs with a vector of note columns returned using the > search method >> in this function. > > On 2013/03/19 15:28:45, MikeSol wrote: >> With respect to my last review, this function should accept a pointer > to a >> vector of grob pointers: > >> vector &hims > >> so that you can do the note column stuff for lyrics. > > I don't think this (defining special lyrics_algined_on_note_columns > callback) is optimal approach. > > With your suggestion, here's how i expect alignment stuff would look > like: > - there'd be a method Self_alignment_interface::aligned_on_grobs that > can align a grob on another grob(s) > - we'd have two callbacks: > Self_alignment_interface::lyrics_aligned_on_note_columns > and > Self_alignment_interface::lyrics_aligned_on_parent_notehead > - we'd have to decide when which callback should be used. How should > LyricText definition in define-grobs.scm look like? We should use > lyrics_aligned_on_note_columns when lyrics are unassociated, and > lyrics_aligned_on_parent_notehead when there is an associatedVoice - how > to write that in define-grobs? > > And the same thing will be repeated for many other grobs, for example > DynamicTexts: we'll have to specify different callback for DynamicTexts > attached to NoteHeads, and different one for standalone Dynamics (e.g. > in Dynamic Context). > > How alignment stuff would look like with my approach: > - aligned_on_grobs would be more complicated, because it'd have to grab > NoteColumn extent if 'him' turns out to be a PaperColumn > - we'd have one callback for everything > - we won't have to think about anything when defining grobs. We'd just > write X-offset = ly:self-alignment-interface::align-grob, and it would > be aligned_on_grobs' job to align on appropriate grob if the default one > (parent) is inappropriate. > > The difference is conceptual: aligning on NoteColumn is an exception, an > emergency exit needed only when grob doesn't have an ordinary parent. > As far as i know, if grob's parent is a NoteHead or some other "normal" > grob, we always want to align on that; and when grob's parent is a > PaperColumn, we always want to align grob on an appropriate NoteColumn. > > As for using a vector 'hims' instead of single 'him', maybe it's a good > idea, but i don't see any uses for it (besides your above suggestion, > which seems to be unnecessary). The main reason that I suggest this is that exceptions in the code base lead to harder maintenance. I am guilty of adding some from time to time (i.e. in stencil integral) but I try to get rid of them as fast as possible. One example in the code base that I don't like: check out line 136. Granted, whoever created it doesn't like it either from the looks of the comment. It makes the code harder to read, maintain and understand. The worst offender by far is the metronome mark - there are so many exceptions concerning who its parent is that it leads to actual problems with layout in certain cases. I definitely like your idea of coming up with a single function, though. Perhaps try the following: -) always decompose axis-groups into elements (recursively if need be) -) create a non_musical flag that, if set, weeds out all grobs where non-musical is set to #t This may achieve the same effect but it is a lot more general, as the distinction is between musical and non-musical rather than between note column and everything else. Cheers, MS ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: Allows slurs to break at barlines. (issue 7424049)
On 19 mars 2013, at 23:37, Werner LEMBERG wrote: >>> After some consideration, I consider the name \broken suboptimal since >>> it implies two pieces. Two other possibilities would be \detached and >>> \fake. >> >> I vote for detached. > > I vote for \broken. For me, it doesn't imply two pieces. This was > David's first, quick suggestion, and I think it's good for exactly > this reason. > > >Werner I amend my statement - I should have said that I don't have a preference. Anything that people like is fine. Cheers, MS ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: reorganize self_alignment_interface (issue 7768043)
Hi, On Tue, Mar 19, 2013 at 11:40 PM, m...@mikesolomon.org wrote: > The main reason that I suggest this is that exceptions in the code base lead > to harder maintenance. > I am guilty of adding some from time to time (i.e. in stencil integral) but I > try to get rid of them as fast as possible. > One example in the code base that I don't like: check out line 136. In which file? line 136 of self-alignment-interface.cc from master is empty. > Granted, whoever created it doesn't like it either from the looks of the > comment. > It makes the code harder to read, maintain and understand. > The worst offender by far is the metronome mark - there are so many exceptions > concerning who its parent is that it leads to actual problems with layout in > certain cases. Sure, that's no good at all. > I definitely like your idea of coming up with a single function, though. > Perhaps try the following: > > -) always decompose axis-groups into elements (recursively if need be) What do you mean by axis-groups? 'hims' (a vector of grobs that me shoulld be aligned to)? > -) create a non_musical flag that, if set, weeds out all grobs where > non-musical is set to #t I'm not quite surehow non-musical grobs are related to alignment code. Do you mean that this flag would be responsible for "getting rid of PaperColumn parent"? cheers, JAenk ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: R shorthand
Hi Shane, > one would think that might cause more difficult > programming necessitating the keeping tracking of various R values > through out the piece as defined by a time signature as opposed to us > setting the value, which probably would also slow down lilypond having > to parse and hang on to that extra undeclared information. Possibly — that's exactly why I posted the question. > But I do believe making sure the user is > forced to think out the value of R duration is probably more useful > than any minimal convenience, especially as Joram points out that > would make r and R functionality divergent. r and R functionality is already divergent (e.g., placement) — so that's hardly an additional concern at this point. Best, Kieren. ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: R shorthand
On Tue, 19 Mar 2013 19:38:10 -0400 Kieren MacMillan wrote: > Hi Shane, > > > one would think that might cause more difficult > > programming necessitating the keeping tracking of various R values > > through out the piece as defined by a time signature as opposed to us > > setting the value, which probably would also slow down lilypond having > > to parse and hang on to that extra undeclared information. > > Possibly — that's exactly why I posted the question. > > > But I do believe making sure the user is > > forced to think out the value of R duration is probably more useful > > than any minimal convenience, especially as Joram points out that > > would make r and R functionality divergent. > > r and R functionality is already divergent (e.g., placement) — so that's > hardly an additional concern at this point. Actually Kieren's suggestion would cause this divergence to reflect more the traditional engraving practice. Actually a full (multi) measure rest is just a symbol representing _one measure_, regardless of its actual length. Urs > > Best, > Kieren. > ___ > lilypond-user mailing list > lilypond-u...@gnu.org > https://lists.gnu.org/mailman/listinfo/lilypond-user ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: R shorthand
Kieren MacMillan writes: > Hi Shane, > >> What happens when we need an awkward length R like R1*12/8*14? > > I'm not sure what you mean by "awkward length"… > > I'm suggesting that R (with no duration given) should give you a > one-measure multi-measure rest, regardless of what the measure > duration is. I just realized that the total musical length of music expressions is established _before_ iteration (and some manipulations require it to be known), while the varying measure length is established by properties set _during_ iteration. So whatever the syntax: no can do. Surprising as that may seem. -- David Kastrup ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: Allows slurs to break at barlines. (issue 7424049)
On 2013/03/19 22:37:14, wl_gnu.org wrote: >> After some consideration, I consider the name \broken suboptimal since >> it implies two pieces. Two other possibilities would be \detached and >> \fake. > > I vote for detached. I vote for \broken. For me, it doesn't imply two pieces. This was David's first, quick suggestion, and I think it's good for exactly this reason. The first suggestion just picked this off the proposed music event name. Here is why I consider \fake or \detached better: when I see \broken\< or \broken\!, this does not really help me figure out where to use them. \broken\! actually looks, uh, broken. How do you break an end spanner? However, \fake\< or \fake\! immediately make clear that we are talking about something still being used in the function of a starting and ending spanner, respectively. I like it somewhat better than \detached, but of course the latter is a bit more dignified. It's also longer. https://codereview.appspot.com/7424049/ ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: Allows slurs to break at barlines. (issue 7424049)
On 20 mars 2013, at 03:24, d...@gnu.org wrote: > On 2013/03/19 22:37:14, wl_gnu.org wrote: >> >> After some consideration, I consider the name \broken suboptimal > since >> >> it implies two pieces. Two other possibilities would be \detached > and >> >> \fake. >> > >> > I vote for detached. > >> I vote for \broken. For me, it doesn't imply two pieces. This was >> David's first, quick suggestion, and I think it's good for exactly >> this reason. > > The first suggestion just picked this off the proposed music event name. > Here is why I consider \fake or \detached better: > > when I see \broken\< or \broken\!, this does not really help me figure > out where to use them. \broken\! actually looks, uh, broken. How do > you break an end spanner? > > However, \fake\< or \fake\! immediately make clear that we are talking > about something still being used in the function of a starting and > ending spanner, respectively. Trying to put myself in the shoes of the average user, \fake would not mean a function that uses a fake post event, but rather a function that produces a \fake something. I would think "this makes a fake slur", which is not the case. I like \detached because it describes accurately what is going on - if I were reading the manual and saw that \detached ( created a slur detached from noteheads, I'd remember the command. \broken slightly less because we are not always breaking something (we are only doing that with \breakSlur). Cheers, MS ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: reorganize self_alignment_interface (issue 7768043)
On 20 mars 2013, at 00:27, Janek Warchoł wrote: > Hi, > > On Tue, Mar 19, 2013 at 11:40 PM, m...@mikesolomon.org > wrote: >> The main reason that I suggest this is that exceptions in the code base lead >> to harder maintenance. >> I am guilty of adding some from time to time (i.e. in stencil integral) but >> I try to get rid of them as fast as possible. >> One example in the code base that I don't like: check out line 136. > > In which file? line 136 of self-alignment-interface.cc from master is empty. separation-item.cc - sorry for the omission. > >> Granted, whoever created it doesn't like it either from the looks of the >> comment. >> It makes the code harder to read, maintain and understand. >> The worst offender by far is the metronome mark - there are so many >> exceptions >> concerning who its parent is that it leads to actual problems with layout in >> certain cases. > > Sure, that's no good at all. > >> I definitely like your idea of coming up with a single function, though. >> Perhaps try the following: >> >> -) always decompose axis-groups into elements (recursively if need be) > > What do you mean by axis-groups? 'hims' (a vector of grobs that me > shoulld be aligned to)? > >> -) create a non_musical flag that, if set, weeds out all grobs where >> non-musical is set to #t > > I'm not quite surehow non-musical grobs are related to alignment code. > Do you mean that this flag would be responsible for "getting rid of > PaperColumn parent"? > I'll try to propose a patch later today - it's easier to do that than explaining with words. Cheers, MS ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: Allows slurs to break at barlines. (issue 7424049)
"m...@mikesolomon.org" writes: > Trying to put myself in the shoes of the average user, \fake would not > mean a function that uses a fake post event, but rather a function > that produces a \fake something. I would think "this makes a fake > slur", which is not the case. It makes a fake slur start or end. When using \unfoldRepeats, the fake slur starts and ends will actually get dropped. If we have something like g f e d( \repeat { c d) e f ( } \alternatives { { g) a b( a \fake) } { \fake( e) d c( d \fake) } { \fake( d) c d( e } } d c) d c Then when doing \unfoldRepeats, all fakes are removed and the remaining non-faked slur end points are actually combined instead of getting their respective slurs stopped short at the discontinuity of a repeat bar line. > I like \detached because it describes accurately what is going on - if > I were reading the manual and saw that \detached ( created a slur > detached from noteheads, I'd remember the command. But it doesn't. It provides a temporary artificially detached start or end point of a slur. It is not the slur that is detached but rather its true anchor elsewhere. > \broken slightly less because we are not always breaking something (we > are only doing that with \breakSlur). Not even then. The name is not accurate. I'll agree that \fake is somewhat cheesy. But it's nicer than \onlyWhenNotUnfolded or \whenFolded or so. -- David Kastrup ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: Allows slurs to break at barlines. (issue 7424049)
On 20 mars 2013, at 06:07, David Kastrup wrote: > "m...@mikesolomon.org" writes: > >> Trying to put myself in the shoes of the average user, \fake would not >> mean a function that uses a fake post event, but rather a function >> that produces a \fake something. I would think "this makes a fake >> slur", which is not the case. > > It makes a fake slur start or end. The word "fake" still doesn't sit right with me... There is nothing fake about the slur: { a \fake ( b c d ) } It is real. The function, to me, should describe an attribute of the slur. The slur looks detached and broken, but not fake. There are commands like slurDashed, slurDotted, etc. that describe what the output will be like. I think it's important to stay in that logic. If we're going to use this for many spanners, my vote would be \broken. The slurs look broken, and things like beams and hairpins will definitely look broken as well if we split them using the same sort of algorithm. To me, something can look "broken" and this designation does not have any bearing on if all the pieces are there or not. It is a quality of the object. Cheers, MS ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: Allows slurs to break at barlines. (issue 7424049)
>> I vote for \broken. For me, it doesn't imply two pieces. This was >> David's first, quick suggestion, and I think it's good for exactly >> this reason. > > when I see \broken\< or \broken\!, this does not really help me > figure out where to use them. \broken\! actually looks, uh, broken. > How do you break an end spanner? > > However, \fake\< or \fake\! immediately make clear that we are > talking about something still being used in the function of a > starting and ending spanner, respectively. I like it somewhat > better than \detached, but of course the latter is a bit more > dignified. It's also longer. Hmm, I don't like \detached. It has no connection to a partial slur whatsoever. Since \partial is already taken, what about \cut? The spanner gets cut a bit, right? Werner ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: Allows slurs to break at barlines. (issue 7424049)
> Since \partial is already taken, what about \cut? The > spanner gets cut a bit, right? I can even imagine to use to commands, \start and \end to get, say, `\start(' or `\end\>'. Who knows, maybe this destinction is advantageous sometime in the future. Werner ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: Allows slurs to break at barlines. (issue 7424049)
> I can even imagine to use to commands, \start and \end to get, say, > `\start(' or `\end\>'. Who knows, maybe this destinction is > advantageous sometime in the future. Maybe even better \startOf and \endOf. Werner ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: Allows slurs to break at barlines. (issue 7424049)
On 20 mars 2013, at 07:25, Werner LEMBERG wrote: > >> I can even imagine to use to commands, \start and \end to get, say, >> `\start(' or `\end\>'. Who knows, maybe this destinction is >> advantageous sometime in the future. > > Maybe even better \startOf and \endOf. > > >Werner The problem with \cut is that it is both a verb and adjective - the thing looks "cut", but people might think that cutting is done. As for start/end, all spanners are started and ended by definition, so this may be confusing. My vote: 1) \broken 2) \detached 3) \cut 4) \alignSpannerToNonMusicalPaperColumn 5) \fake Cheers, MS ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: Allows slurs to break at barlines. (issue 7424049)
"m...@mikesolomon.org" writes: > On 20 mars 2013, at 06:07, David Kastrup wrote: > >> "m...@mikesolomon.org" writes: >> >>> Trying to put myself in the shoes of the average user, \fake would >>> not mean a function that uses a fake post event, but rather a >>> function that produces a \fake something. I would think "this makes >>> a fake slur", which is not the case. >> >> It makes a fake slur start or end. > > The word "fake" still doesn't sit right with me... There is nothing > fake about the slur: > > { a \fake ( b c d ) } Mike, that code does not even make any sense. You would not place a fake slur start or fake slur end anywhere except right after or right before a visual discontinuity from a repeat construct. You probably did not understand what I wrote, probably because "it makes a fake slur start or end" is not grammatically clear. I mean "It makes a fake slur-start or a fake slur-end" by that. > It is real. The slur is real. The end point isn't. > The function, to me, should describe an attribute of the slur. But it doesn't. It describes an attribute of its visual start or end point. > The slur looks detached and broken, but not fake. But the attachment is fake, and the slur will get properly attached to the proper end points when repeats are unfolded. > There are commands like slurDashed, slurDotted, etc. that describe > what the output will be like. And the output will be like that even when repeats are unfolded. > I think it's important to stay in that logic. If we're going to use > this for many spanners, my vote would be \broken. But it is not the slur that is "broken" but rather its visual connection to _one_ or even _two_ of its end points. You can perfectly well and meaningfully have an alternative written as { \fake\( c d e f \fake\) } and when unfolding, the phrasing slur will start at some point preceding this passage and end at some point succeeding it. > The slurs look broken, If you want to, but the whole of ( \broken) \broken( \broken) \broken( ) is just _one_ slur broken into three pieces, not one whole slur and two broken slurs. That logic is more apparent with writing ( \fake) \fake( \fake) \fake( ) The breaking occurs at artificial points not related to the music function of the slur, and it will get dissolved when unfolding repeats. The break of the slur does not occur where \broken is written, but rather it is at a visual discontinuity logically connected with matching pairs of \broken) ... \broken(. Your above example suggests that this relation does not seem clear to you. > and things like beams and hairpins will definitely look broken as well > if we split them using the same sort of algorithm. Sure, and again the split will be between matching pairs of artificial end and start points that are not logical end and start points and will disappear when repeats are unfolded and the broken construct gets joined visually as well as logically. > To me, something can look "broken" and this designation does not have > any bearing on if all the pieces are there or not. It is a quality of > the object. No, it is a quality of the respective visual (but not logical) start and end points. And I would prefer a naming choice that makes it easier for people to understand what they are doing. You are making a strong case for this being hard enough to make it prudent to avoid fallacious naming. -- David Kastrup ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: Allows slurs to break at barlines. (issue 7424049)
On 20 mars 2013, at 07:50, David Kastrup wrote: > "m...@mikesolomon.org" writes: > >> On 20 mars 2013, at 06:07, David Kastrup wrote: >> >>> "m...@mikesolomon.org" writes: >>> Trying to put myself in the shoes of the average user, \fake would not mean a function that uses a fake post event, but rather a function that produces a \fake something. I would think "this makes a fake slur", which is not the case. >>> >>> It makes a fake slur start or end. >> >> The word "fake" still doesn't sit right with me... There is nothing >> fake about the slur: >> >> { a \fake ( b c d ) } > > Mike, that code does not even make any sense. If one is quoting another instrument starting in mid-measure, why wouldn't that make sense? > You would not place a > fake slur start or fake slur end anywhere except right after or right > before a visual discontinuity from a repeat construct. You probably did > not understand what I wrote, probably because "it makes a fake slur > start or end" is not grammatically clear. I mean "It makes a fake > slur-start or a fake slur-end" by that. Ok, I'm getting what you're saying. I still don't like "fake" just because the begin and start are still real. They are just offset. > >> It is real. > > The slur is real. The end point isn't. What is not real about the endpoint? If I jump on a train in between two stations, it is still a real getting-on-board. > >> The function, to me, should describe an attribute of the slur. > > But it doesn't. It describes an attribute of its visual start or end > point. This is a good idea. > >> The slur looks detached and broken, but not fake. > > But the attachment is fake, and the slur will get properly attached to > the proper end points when repeats are unfolded. Perhaps non-musical? > >> There are commands like slurDashed, slurDotted, etc. that describe >> what the output will be like. > > And the output will be like that even when repeats are unfolded. > >> I think it's important to stay in that logic. If we're going to use >> this for many spanners, my vote would be \broken. > > But it is not the slur that is "broken" but rather its visual connection > to _one_ or even _two_ of its end points. You can perfectly well and > meaningfully have an alternative written as > > { \fake\( c d e f \fake\) } > > and when unfolding, the phrasing slur will start at some point preceding > this passage and end at some point succeeding it. > >> The slurs look broken, > > If you want to, but the whole of > ( \broken) \broken( \broken) \broken( ) > is just _one_ slur broken into three pieces, not one whole slur and two > broken slurs. That logic is more apparent with writing > ( \fake) \fake( \fake) \fake( ) > > The breaking occurs at artificial points not related to the music > function of the slur, and it will get dissolved when unfolding repeats. > > The break of the slur does not occur where \broken is written, but > rather it is at a visual discontinuity logically connected with matching > pairs of \broken) ... \broken(. Your above example suggests that this > relation does not seem clear to you. > >> and things like beams and hairpins will definitely look broken as well >> if we split them using the same sort of algorithm. > > Sure, and again the split will be between matching pairs of artificial > end and start points that are not logical end and start points and will > disappear when repeats are unfolded and the broken construct gets joined > visually as well as logically. > >> To me, something can look "broken" and this designation does not have >> any bearing on if all the pieces are there or not. It is a quality of >> the object. > > No, it is a quality of the respective visual (but not logical) start and > end points. And I would prefer a naming choice that makes it easier for > people to understand what they are doing. You are making a strong case > for this being hard enough to make it prudent to avoid fallacious > naming. I completely agree. It's just that "fake" in English means false or counterfeit. It needs another word, just don't know what yet. unchained? free? Cheers, MS ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel