X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ftuplet-engraver.cc;h=c3529de747dde4747f223550595dd84514e81fad;hb=9e781b7dc83b60a543ce218aa1a5f139f74c760f;hp=82acc4e57063e25c48986647e945f85dd8aa6ed9;hpb=bc95f4434f760d41191341ab4508b2064eb19025;p=lilypond.git diff --git a/lily/tuplet-engraver.cc b/lily/tuplet-engraver.cc index 82acc4e570..c3529de747 100644 --- a/lily/tuplet-engraver.cc +++ b/lily/tuplet-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2010 Han-Wen Nienhuys + Copyright (C) 1998--2014 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 @@ -41,7 +41,7 @@ struct Tuplet_description Moment stop_moment_; Moment start_moment_; Moment length_; - + Tuplet_description () { event_ = 0; @@ -61,9 +61,12 @@ protected: vector tuplets_; vector new_tuplets_; vector stopped_tuplets_; - vector last_tuplets_; - + vector last_tuplets_; + DECLARE_ACKNOWLEDGER (note_column); + DECLARE_ACKNOWLEDGER (script); + DECLARE_ACKNOWLEDGER (finger); + DECLARE_ACKNOWLEDGER (string_number); DECLARE_TRANSLATOR_LISTENER (tuplet_span); virtual void finalize (); void start_translation_timestep (); @@ -81,32 +84,32 @@ Tuplet_engraver::listen_tuplet_span (Stream_event *ev) d.event_ = ev; d.length_ = robust_scm2moment (d.event_->get_property ("length"), - Moment (0)); + Moment (0)); d.start_moment_ = now_mom (); d.stop_moment_ = now_mom () + d.length_; - for (vsize i=0; i < new_tuplets_.size (); i++) - { - /* - discard duplicates. - */ - if (new_tuplets_[i].stop_moment_ == d.stop_moment_) - return; - } - + for (vsize i = 0; i < new_tuplets_.size (); i++) + { + /* + discard duplicates. + */ + if (new_tuplets_[i].stop_moment_ == d.stop_moment_) + return; + } + new_tuplets_.push_back (d); } else if (dir == STOP) { if (tuplets_.size ()) - { - stopped_tuplets_.push_back (tuplets_.back ()); - tuplets_.pop_back (); - } - else if (!to_boolean (get_property ("skipTypesetting"))) - ev->origin ()->warning (_ ("No tuplet to end")); + { + stopped_tuplets_.push_back (tuplets_.back ()); + tuplets_.pop_back (); + } + else if (!to_boolean (get_property ("skipTypesetting"))) + ev->origin ()->debug_output (_ ("No tuplet to end")); } - else + else ev->origin ()->programming_error ("direction tuplet-span-event_ invalid."); } @@ -117,48 +120,51 @@ Tuplet_engraver::process_music () This may happen if the end of a tuplet is part of a quoted voice. */ Moment now = now_mom (); - for (vsize i = tuplets_.size (); i --; ) + for (vsize i = tuplets_.size (); i--;) { if (tuplets_[i].stop_moment_ == now) - { - stopped_tuplets_.push_back (tuplets_[i]); - tuplets_.erase (tuplets_.begin () + i); - } + { + stopped_tuplets_.push_back (tuplets_[i]); + tuplets_.erase (tuplets_.begin () + i); + } } - + for (vsize i = 0; i < stopped_tuplets_.size (); i++) { Spanner *bracket = stopped_tuplets_[i].bracket_; Spanner *number = stopped_tuplets_[i].number_; if (bracket) - { - if (stopped_tuplets_[i].full_length_) - { - Item *col = - unsmob_item (stopped_tuplets_[i].full_length_note_ - ? get_property ("currentMusicalColumn") - : get_property ("currentCommandColumn")); - - bracket->set_bound (RIGHT, col); - number->set_bound (RIGHT, col); - } - else if (!bracket->get_bound (RIGHT)) - { - if (bracket->get_bound (LEFT)) - { - bracket->set_bound (RIGHT, - bracket->get_bound (LEFT)); - number->set_bound (RIGHT, - stopped_tuplets_[i].bracket_->get_bound (LEFT)); - } - else - programming_error ("stopped tuplet bracket has left nor right bound."); - } - // todo: scrap last_tuplets_, use stopped_tuplets_ only. - // clear stopped_tuplets_ at start_translation_timestep - last_tuplets_.push_back (bracket); - last_tuplets_.push_back (number); - } + { + if (stopped_tuplets_[i].full_length_) + { + Item *col + = unsmob_item (stopped_tuplets_[i].full_length_note_ + ? get_property ("currentMusicalColumn") + : get_property ("currentCommandColumn")); + + bracket->set_bound (RIGHT, col); + number->set_bound (RIGHT, col); + } + else if (!bracket->get_bound (RIGHT)) + { + if (bracket->get_bound (LEFT)) + { + bracket->set_bound (RIGHT, + bracket->get_bound (LEFT)); + number->set_bound (RIGHT, + stopped_tuplets_[i].bracket_->get_bound (LEFT)); + } + else + { + warning ("omitting tuplet bracket with neither left nor right bound"); + continue; + } + } + // todo: scrap last_tuplets_, use stopped_tuplets_ only. + // clear stopped_tuplets_ at start_translation_timestep + last_tuplets_.push_back (bracket); + last_tuplets_.push_back (number); + } } stopped_tuplets_.clear (); @@ -169,28 +175,28 @@ Tuplet_engraver::process_music () /* i goes from size-1 downto 0, inclusively */ vsize i = j - 1; - if (tuplets_[i].bracket_) - continue; + continue; tuplets_[i].full_length_ = to_boolean (get_property ("tupletFullLength")); tuplets_[i].full_length_note_ - = to_boolean (get_property ("tupletFullLengthNote")); - + = to_boolean (get_property ("tupletFullLengthNote")); + tuplets_[i].bracket_ = make_spanner ("TupletBracket", - tuplets_[i].event_->self_scm ()); + tuplets_[i].event_->self_scm ()); tuplets_[i].number_ = make_spanner ("TupletNumber", - tuplets_[i].event_->self_scm ()); + tuplets_[i].event_->self_scm ()); tuplets_[i].number_->set_object ("bracket", tuplets_[i].bracket_->self_scm ()); + tuplets_[i].number_->set_parent (tuplets_[i].bracket_, X_AXIS); + tuplets_[i].number_->set_parent (tuplets_[i].bracket_, Y_AXIS); tuplets_[i].bracket_->set_object ("tuplet-number", tuplets_[i].number_->self_scm ()); tuplets_[i].stop_moment_.grace_part_ = 0; - - + if (i + 1 < tuplets_.size () && tuplets_[i + 1].bracket_) - Tuplet_bracket::add_tuplet_bracket (tuplets_[i].bracket_, tuplets_[i + 1].bracket_); - + Tuplet_bracket::add_tuplet_bracket (tuplets_[i].bracket_, tuplets_[i + 1].bracket_); + if (i > 0 && tuplets_[i - 1].bracket_) - Tuplet_bracket::add_tuplet_bracket (tuplets_[i - 1].bracket_, tuplets_[i].bracket_); + Tuplet_bracket::add_tuplet_bracket (tuplets_[i - 1].bracket_, tuplets_[i].bracket_); } } @@ -201,9 +207,43 @@ Tuplet_engraver::acknowledge_note_column (Grob_info inf) for (vsize j = 0; j < tuplets_.size (); j++) if (tuplets_[j].bracket_) { - Item *i = dynamic_cast (inf.grob ()); - Tuplet_bracket::add_column (tuplets_[j].bracket_, i); - add_bound_item (tuplets_[j].number_, i); + Item *i = dynamic_cast (inf.grob ()); + Tuplet_bracket::add_column (tuplets_[j].bracket_, i); + add_bound_item (tuplets_[j].number_, i); + } +} + +void +Tuplet_engraver::acknowledge_script (Grob_info inf) +{ + for (vsize j = 0; j < tuplets_.size (); j++) + if (tuplets_[j].bracket_) + { + Item *i = dynamic_cast (inf.grob ()); + if (!i->internal_has_interface (ly_symbol2scm ("dynamic-interface"))) + Tuplet_bracket::add_script (tuplets_[j].bracket_, i); + } +} + +void +Tuplet_engraver::acknowledge_finger (Grob_info inf) +{ + for (vsize j = 0; j < tuplets_.size (); j++) + if (tuplets_[j].bracket_) + { + Item *i = dynamic_cast (inf.grob ()); + Tuplet_bracket::add_script (tuplets_[j].bracket_, i); + } +} + +void +Tuplet_engraver::acknowledge_string_number (Grob_info inf) +{ + for (vsize j = 0; j < tuplets_.size (); j++) + if (tuplets_[j].bracket_) + { + Item *i = dynamic_cast (inf.grob ()); + Tuplet_bracket::add_script (tuplets_[j].bracket_, i); } } @@ -214,7 +254,7 @@ Tuplet_engraver::start_translation_timestep () /* May seem superfluous, but necessary for skipTypesetting. */ - new_tuplets_.clear (); + new_tuplets_.clear (); } void @@ -223,8 +263,8 @@ Tuplet_engraver::finalize () if (to_boolean (get_property ("tupletFullLength"))) for (vsize i = 0; i < last_tuplets_.size (); i++) { - Item *col = unsmob_item (get_property ("currentCommandColumn")); - last_tuplets_[i]->set_bound (RIGHT, col); + Item *col = unsmob_item (get_property ("currentCommandColumn")); + last_tuplets_[i]->set_bound (RIGHT, col); } } @@ -233,18 +273,21 @@ Tuplet_engraver::Tuplet_engraver () } ADD_ACKNOWLEDGER (Tuplet_engraver, note_column); +ADD_ACKNOWLEDGER (Tuplet_engraver, script); +ADD_ACKNOWLEDGER (Tuplet_engraver, finger); +ADD_ACKNOWLEDGER (Tuplet_engraver, string_number); ADD_TRANSLATOR (Tuplet_engraver, - /* doc */ - "Catch tuplet events and generate appropriate bracket.", - - /* create */ - "TupletBracket " - "TupletNumber ", - - /* read */ - "tupletFullLength " - "tupletFullLengthNote ", - - /* write */ - "" - ); + /* doc */ + "Catch tuplet events and generate appropriate bracket.", + + /* create */ + "TupletBracket " + "TupletNumber ", + + /* read */ + "tupletFullLength " + "tupletFullLengthNote ", + + /* write */ + "" + );