X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ftie-engraver.cc;h=7d2b83d82c4ef5aab50359e6a1c2269981c29951;hb=14d0e70efc16bfb71c1a235e22b43262942f1674;hp=bc3da26174418ab5ad98c010a31b7122fb6c97ce;hpb=321cc8ec6586cadfda33dc650198f83906008d36;p=lilypond.git diff --git a/lily/tie-engraver.cc b/lily/tie-engraver.cc index bc3da26174..7d2b83d82c 100644 --- a/lily/tie-engraver.cc +++ b/lily/tie-engraver.cc @@ -3,13 +3,15 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2003 Han-Wen Nienhuys + (c) 1998--2004 Han-Wen Nienhuys */ #include "event.hh" #include "tie.hh" -#include "translator-group.hh" +#include "context.hh" + +#include "protected-scm.hh" #include "spanner.hh" #include "tie-column.hh" #include "engraver.hh" @@ -26,16 +28,6 @@ TODO: Remove the dependency on musical info. We should tie on the basis of position and duration-log of the heads (not of the events). - - TODO: support sparseTies. - - TODO: melismata will fuck up now: - - < { c8 ~ c8 } - { c16 c c c } > - - melisma is after the 2nd 8th note, but will now be signaled as - lasting till the 3rd 16th. */ class Tie_engraver : public Engraver { @@ -44,6 +36,7 @@ class Tie_engraver : public Engraver Link_array now_heads_; Link_array heads_to_tie_; Link_array ties_; + Protected_scm tie_start_definition_; Spanner * tie_column_; @@ -53,10 +46,9 @@ protected: virtual void acknowledge_grob (Grob_info); virtual bool try_music (Music*); virtual void process_music (); - virtual void process_acknowledged_grobs (); void typeset_tie (Grob*); public: - TRANSLATOR_DECLARATIONS(Tie_engraver); + TRANSLATOR_DECLARATIONS (Tie_engraver); }; @@ -84,7 +76,9 @@ void Tie_engraver::process_music () { if (event_) - daddy_trans_->set_property ("tieMelismaBusy", SCM_BOOL_T); + { + context ()->set_property ("tieMelismaBusy", SCM_BOOL_T); + } } void @@ -97,48 +91,44 @@ Tie_engraver::acknowledge_grob (Grob_info i) for (int i = heads_to_tie_.size (); i--;) { Grob *th = heads_to_tie_[i]; - Music * right_mus = unsmob_music (h->get_grob_property ("cause")); - Music * left_mus = unsmob_music (th->get_grob_property ("cause")); + Music * right_mus = unsmob_music (h->get_property ("cause")); + Music * left_mus = unsmob_music (th->get_property ("cause")); /* maybe should check positions too. */ if (right_mus && left_mus - && gh_equal_p (right_mus->get_mus_property ("pitch"), - left_mus->get_mus_property ("pitch"))) + && ly_c_equal_p (right_mus->get_property ("pitch"), + left_mus->get_property ("pitch"))) { - Grob * p = new Spanner (get_property ("Tie")); + Grob * p = new Spanner (tie_start_definition_); + announce_grob (p, last_event_->self_scm ()); Tie::set_interface (p); // cannot remove yet! Tie::set_head (p, LEFT, th); Tie::set_head (p, RIGHT, h); ties_.push (p); - announce_grob(p, last_event_->self_scm()); } } - } -} -void -Tie_engraver::process_acknowledged_grobs () -{ - if (ties_.size () > 1 && !tie_column_) - { - tie_column_ = new Spanner (get_property ("TieColumn")); - - for (int i = ties_.size (); i--;) - Tie_column::add_tie (tie_column_,ties_ [i]); + if (ties_.size () && ! tie_column_) + { + tie_column_ = make_spanner ("TieColumn", SCM_EOL); + + } - announce_grob(tie_column_, SCM_EOL); + if (tie_column_) + for (int i = ties_.size (); i--;) + Tie_column::add_tie (tie_column_,ties_ [i]); } } void Tie_engraver::start_translation_timestep () { - daddy_trans_->set_property ("tieMelismaBusy", - gh_bool2scm (heads_to_tie_.size ())); + context ()->set_property ("tieMelismaBusy", + ly_bool2scm (heads_to_tie_.size ())); } @@ -153,17 +143,14 @@ Tie_engraver::stop_translation_timestep () typeset_tie (ties_[i]); } - ties_.clear(); + ties_.clear (); last_event_ = 0; - if (tie_column_) - { - typeset_grob (tie_column_); - tie_column_ =0; - } + tie_column_ =0; } if (event_) { + tie_start_definition_ = updated_grob_properties (context (), ly_symbol2scm ("Tie")); heads_to_tie_ = now_heads_; last_event_ = event_; } @@ -186,14 +173,13 @@ Tie_engraver::typeset_tie (Grob *her) new_head_drul[d] = Tie::head (her, (Direction)-d); } while (flip (&d) != LEFT); - index_set_cell (her->get_grob_property ("heads"), LEFT, new_head_drul[LEFT]->self_scm ()); - index_set_cell (her->get_grob_property ("heads"), RIGHT, new_head_drul[RIGHT]->self_scm ()); + index_set_cell (her->get_property ("head-pair"), LEFT, new_head_drul[LEFT]->self_scm ()); + index_set_cell (her->get_property ("head-pair"), RIGHT, new_head_drul[RIGHT]->self_scm ()); - typeset_grob (her); } -ENTER_DESCRIPTION(Tie_engraver, +ENTER_DESCRIPTION (Tie_engraver, /* descr */ "Generate ties between noteheads of equal pitch.", /* creats*/ "Tie TieColumn", /* accepts */ "tie-event",