X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fspacing-basic.cc;h=ff245aa30fdd438b17efced4c3fa1ebc64eb28d2;hb=5d84bfad4626892bcffd05adcced53c8a2329047;hp=d85cae667997bdee39285349e4aff0aaa056b607;hpb=f93e4199873c91ae32f0e84a610d14853dc379df;p=lilypond.git diff --git a/lily/spacing-basic.cc b/lily/spacing-basic.cc index d85cae6679..ff245aa30f 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--2015 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 @@ -44,7 +44,7 @@ Spacing_spanner::standard_breakable_column_spacing (Grob *me, Item *l, Item *r, if (Paper_column::is_breakable (l) && Paper_column::is_breakable (r)) { - Moment *dt = unsmob_moment (l->get_property ("measure-length")); + Moment *dt = unsmob (l->get_property ("measure-length")); Moment mlen (1); if (dt) mlen = *dt; @@ -91,7 +91,7 @@ get_measure_length (Grob *column) do { - if (Moment *len = unsmob_moment (cols[col_idx]->get_property ("measure-length"))) + if (Moment *len = unsmob (cols[col_idx]->get_property ("measure-length"))) { return len; } @@ -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, @@ -110,8 +111,8 @@ Spacing_spanner::note_spacing (Grob * /* me */, Moment shortest_playing_len = 0; SCM s = lc->get_property ("shortest-playing-duration"); - if (unsmob_moment (s)) - shortest_playing_len = *unsmob_moment (s); + if (unsmob (s)) + shortest_playing_len = *unsmob (s); if (! shortest_playing_len.to_bool ()) { @@ -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.1, (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")); + Grob *grace_spacing = unsmob (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; }