X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fauto-beam-engraver.cc;h=fe9c94ae542ea1bf502f7272eb25aa06c97c01af;hb=53da8b7d3773da804e79fd455d168efd9475d2f9;hp=8d8a4b6c56674348d472b9e786788917e290ad40;hpb=4bb29573149a0ffa1f881c5e38a0fe68e9e76b67;p=lilypond.git diff --git a/lily/auto-beam-engraver.cc b/lily/auto-beam-engraver.cc index 8d8a4b6c56..fe9c94ae54 100644 --- a/lily/auto-beam-engraver.cc +++ b/lily/auto-beam-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2011 Jan Nieuwenhuizen + Copyright (C) 1999--2012 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,10 +17,10 @@ along with LilyPond. If not, see . */ -#include "bar-line.hh" #include "beaming-pattern.hh" #include "beam.hh" #include "context.hh" +#include "context-handle.hh" #include "duration.hh" #include "engraver.hh" #include "item.hh" @@ -80,7 +80,10 @@ private: Moment extend_mom_; Moment beam_start_moment_; Moment beam_start_location_; - Context *beam_start_context_; + /* + Handle on the starting staff keeps it alive until beam is comlete + */ + Context_handle beam_start_context_; // We act as if beam were created, and start a grouping anyway. Beaming_pattern *grouping_; @@ -219,7 +222,7 @@ Auto_beam_engraver::create_beam () Beam::add_stem (beam, (*stems_)[i]); Grob_info i = make_grob_info (beam, (*stems_)[0]->self_scm ()); - i.rerouting_daddy_context_ = beam_start_context_; + i.rerouting_daddy_context_ = beam_start_context_.get_context (); announce_grob (i); return beam; @@ -239,7 +242,7 @@ Auto_beam_engraver::begin_beam () beaming_options_.from_context (context ()); beam_settings_ = updated_grob_properties (context (), ly_symbol2scm ("Beam")); - beam_start_context_ = context ()->get_parent_context (); + beam_start_context_.set_context (context ()->get_parent_context ()); beam_start_moment_ = now_mom (); beam_start_location_ = robust_scm2moment (get_property ("measurePosition"), Moment (0)); @@ -272,7 +275,7 @@ Auto_beam_engraver::end_beam () if (finished_beam_) { Grob_info i = make_grob_info (finished_beam_, SCM_EOL); - i.rerouting_daddy_context_ = beam_start_context_; + i.rerouting_daddy_context_ = beam_start_context_.get_context (); announce_end_grob (i); finished_grouping_ = grouping_; @@ -284,6 +287,7 @@ Auto_beam_engraver::end_beam () beam_settings_ = SCM_EOL; } + beam_start_context_.set_context (NULL); shortest_mom_ = Moment (Rational (1, 4)); } @@ -399,7 +403,10 @@ Auto_beam_engraver::acknowledge_stem (Grob_info info) if (bool (beam_start_location_.grace_part_) != bool (now.grace_part_)) return; - Moment dur = unsmob_duration (ev->get_property ("duration"))->get_length (); + Duration *stem_duration = unsmob_duration (ev->get_property ("duration")); + Moment dur = stem_duration->get_length (); + + //Moment dur = unsmob_duration (ev->get_property ("duration"))->get_length (); Moment measure_now = measure_position (context ()); bool recheck_needed = false; @@ -420,7 +427,9 @@ Auto_beam_engraver::acknowledge_stem (Grob_info info) grouping_->add_stem (now - beam_start_moment_ + beam_start_location_, durlog - 2, - Stem::is_invisible (stem)); + Stem::is_invisible (stem), + stem_duration->factor (), + (stem->get_property ("tuplet-start") == SCM_BOOL_T)); stems_->push_back (stem); last_add_mom_ = now; extend_mom_ = max (extend_mom_, now) + get_event_length (ev, now); @@ -548,6 +557,7 @@ ADD_TRANSLATOR (Auto_beam_engraver, "autoBeaming " "baseMoment " "beamExceptions " + "beamHalfMeasure " "beatStructure " "subdivideBeams ",