X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fspacing-basic.cc;h=c6b0199eb3ca047559727ef1c199f7c782a5d867;hb=f8416b959b1eb78740a329681d4d58ac6c090854;hp=d85cae667997bdee39285349e4aff0aaa056b607;hpb=f93e4199873c91ae32f0e84a610d14853dc379df;p=lilypond.git diff --git a/lily/spacing-basic.cc b/lily/spacing-basic.cc index d85cae6679..c6b0199eb3 100644 --- a/lily/spacing-basic.cc +++ b/lily/spacing-basic.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2011 Han-Wen Nienhuys + Copyright (C) 2005--2012 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -101,7 +101,8 @@ get_measure_length (Grob *column) return 0; } -Real +/* Basic spring based on duration alone */ +Spring Spacing_spanner::note_spacing (Grob * /* me */, Grob *lc, Grob *rc, @@ -144,30 +145,39 @@ Spacing_spanner::note_spacing (Grob * /* me */, shortest_playing_len = min (shortest_playing_len, *measure_len); } - Real dist = 0.0; + Spring ret; if (delta_t.main_part_ && !lwhen.grace_part_) { - dist = options->get_duration_space (shortest_playing_len.main_part_); - dist *= double (delta_t.main_part_ / shortest_playing_len.main_part_); + // A spring of length and stiffness based on the controlling duration + Real len = options->get_duration_space (shortest_playing_len.main_part_); + Real min = options->increment_; // canonical notehead width + + // The portion of that spring proportional to the time between lc and rc + Real fraction = (delta_t.main_part_ / shortest_playing_len.main_part_); + ret = Spring (fraction * len, fraction * min); + + // Stretch proportional to the space between canonical bare noteheads + ret.set_inverse_stretch_strength (fraction * max (0.0, (len - min))); } else if (delta_t.grace_part_) { - /* - Crude hack for spacing graces: we take the shortest space - available (namely the space for the global shortest note), and - multiply that by grace-space-factor - */ - dist = options->get_duration_space (options->global_shortest_) / 2.0; Grob *grace_spacing = unsmob_grob (lc->get_object ("grace-spacing")); if (grace_spacing) { Spacing_options grace_opts; grace_opts.init_from_grob (grace_spacing); - dist = grace_opts.get_duration_space (delta_t.grace_part_); + Real len = grace_opts.get_duration_space (delta_t.grace_part_); + Real min = grace_opts.increment_; + ret = Spring (len, min); + // Grace notes should not stretch very much + ret.set_inverse_stretch_strength (grace_opts.increment_ / 2.0); } - + else // Fallback to the old grace spacing: half that of the shortest note + ret = Spring (options-> + get_duration_space (options->global_shortest_) / 2.0, + options->increment_ / 2.0); } - return dist; + return ret; }