2015-12-12 22:35 GMT+01:00 Thomas Morley <thomasmorle...@gmail.com>: > 2015-12-12 17:46 GMT+01:00 David Sumbler <da...@aeolia.co.uk>: >> Although I quite often find myself needing to use >> >> \override Voice.Hairpin.minimum-length = #2 >> >> or similar, I find that the results are unpredictable (to me!) >> >> Sometimes I have a very short hairpin, perhaps starting on a quaver and >> ending on the next quaver. In the output such a hairpin sometimes >> appears as a short vertical line (i.e. with length=0), and a warning is >> shown in the compiler output. >> >> If I change Hairpin.minimum-length I have to do it by trial and error, >> because the result does not seem necessarily to correspond to the value >> I have specified. (I am assuming that the units are staff spaces.) I'm >> guessing that this may perhaps be something to do with having an actual >> dynamic such as mf attached to one or both notes. > > It's issue 2207 > https://sourceforge.net/p/testlilyissues/issues/2207/ > >> >> The Internals Reference says that use of the minimum-length property >> with a hairpin "requires an appropriate callback for the >> springs-and-rods property". Unfortunately I have no clear idea what >> this means, and I haven't managed to find out yet either by searching or >> by experimentation. The best I have come up with so far is >> >> \override Hairpin.springs-and-rods = #ly:spanner::set-spacing-rods > > This is already the default for Hairpins (but nor for Glissando par example) > No need to set it again in your file. > >> >> This doesn't improve the output at all, but at least it doesn't produce >> any additional error or warning! >> >> How can I guarantee that all hairpins will be printed with a minimum >> length of, say, 1.5 staff spaces, and the notes spaced appropriately, >> regardless of preceding or following dynamics? > > You may find the discussion at the linked issue enlightning. > > For now you may try the following as a workaround. > Though, please be aware it's not tested beyond the example, your turn ;) > Ofcorse I'll try to improve the code, if you notice issues > > \version "2.18.2"
Sorry, this needs a more recent version. > > %% a helper: > #(define (look-up-for-parent name-symbol axis grob) > "Return the parent of @var{grob}, specified by it's @var{name-symbol} in > axis @var{axis} or @var{grob}, if equal to the grob named @var{name-symbol} > already. > If not found, look up for the next parent." > (let* ((parent (ly:grob-parent grob axis))) > (cond > ((not (ly:grob? parent)) > (ly:error > (_"Perhaps typing error for \"~a\" or \"~a\" is not in the > parent-tree.") > name-symbol name-symbol)) > ((equal? name-symbol (grob::name grob)) grob) > ((not (equal? name-symbol (grob::name parent))) > (look-up-for-parent name-symbol axis parent)) > (else parent)))) > > #(define ((hairpin-minimum-length my-minimum) grob) > (let* ((bound-left (ly:spanner-bound grob LEFT)) > (bound-right (ly:spanner-bound grob RIGHT)) > (sys (look-up-for-parent 'System Y grob)) > (left-x-ext (ly:grob-extent bound-left sys X)) > (right-x-ext (ly:grob-extent bound-right sys X))) > (ly:grob-set-property! grob 'minimum-length > ;; keep 'minimum-length user-settable > (max (ly:grob-property-data grob 'minimum-length) > ;; nb, this calculation is only an approximation > ;; should work in most cases, though > (+ my-minimum (abs (cdr left-x-ext)) (abs (cdr right-x-ext))))))) > > myHairpinMinimumLength = > #(define-music-function (parser location minimum)(number?) > #{ > \override Hairpin.before-line-breaking = > #(hairpin-minimum-length minimum) > #}) > > { > \override Hairpin.color = #red > \myHairpinMinimumLength #1.5 > \repeat unfold 8 { c4\ffff\> d\pppp\! c d \noBreak } > \break > %% overriding 'minimum-length is still possible > \override Hairpin.minimum-length = 20 > \repeat unfold 8 { c4\ffff\> d\pppp\! c d \noBreak } > } > > > > HTH, > Harm _______________________________________________ lilypond-user mailing list lilypond-user@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-user