X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fcompletion-note-heads-engraver.cc;h=6fe80dc30949e0bfb9638141c79bfd93c55ffdd5;hb=9f3572d98bb948c9689cd1f75401a029451fa001;hp=9a72b6d5ed077495addb33a1fa82ea63b4c91676;hpb=04265f11d1f21416ccebd2dcaa1d903dc781b36e;p=lilypond.git diff --git a/lily/completion-note-heads-engraver.cc b/lily/completion-note-heads-engraver.cc index 9a72b6d5ed..6fe80dc309 100644 --- a/lily/completion-note-heads-engraver.cc +++ b/lily/completion-note-heads-engraver.cc @@ -7,22 +7,20 @@ #include using namespace std; -#include "dot-column.hh" +#include "rhythmic-head.hh" +#include "output-def.hh" +#include "music.hh" #include "dots.hh" -#include "duration.hh" -#include "global-context.hh" +#include "dot-column.hh" +#include "staff-symbol-referencer.hh" #include "item.hh" -#include "output-def.hh" -#include "pitch.hh" -#include "rhythmic-head.hh" #include "score-engraver.hh" +#include "warn.hh" #include "spanner.hh" -#include "staff-symbol-referencer.hh" -#include "stream-event.hh" #include "tie.hh" -#include "warn.hh" - -#include "translator.icc" +#include "global-context.hh" +#include "duration.hh" +#include "pitch.hh" /* TODO: make matching rest engraver. @@ -50,8 +48,8 @@ class Completion_heads_engraver : public Engraver vector ties_; vector dots_; - vector note_events_; - vector scratch_note_events_; + vector note_events_; + vector scratch_note_events_; Moment note_end_mom_; bool is_first_; @@ -67,9 +65,9 @@ public: protected: virtual void initialize (); void start_translation_timestep (); + virtual bool try_music (Music *event); void process_music (); void stop_translation_timestep (); - DECLARE_TRANSLATOR_LISTENER (note); }; void @@ -78,24 +76,31 @@ Completion_heads_engraver::initialize () is_first_ = false; } -IMPLEMENT_TRANSLATOR_LISTENER (Completion_heads_engraver, note); -void -Completion_heads_engraver::listen_note (Stream_event *ev) +bool +Completion_heads_engraver::try_music (Music *m) { - note_events_.push_back (ev); - - is_first_ = true; - Moment musiclen = get_event_length (ev); - Moment now = now_mom (); - - if (now_mom ().grace_part_) + if (m->is_mus_type ("note-event")) { - musiclen.grace_part_ = musiclen.main_part_; - musiclen.main_part_ = Rational (0, 1); + note_events_.push_back (m); + + is_first_ = true; + Moment musiclen = m->get_length (); + Moment now = now_mom (); + + if (now_mom ().grace_part_) + { + musiclen.grace_part_ = musiclen.main_part_; + musiclen.main_part_ = Rational (0, 1); + } + note_end_mom_ = max (note_end_mom_, (now + musiclen)); + do_nothing_until_ = Rational (0, 0); + + return true; } + else if (m->is_mus_type ("busy-playing-event")) + return note_events_.size () && is_first_; - note_end_mom_ = max (note_end_mom_, (now + musiclen)); - do_nothing_until_ = Rational (0, 0); + return false; } /* @@ -189,14 +194,14 @@ Completion_heads_engraver::process_music () if (!scratch_note_events_.size ()) for (vsize i = 0; i < note_events_.size (); i++) { - Stream_event *m = note_events_[i]->clone (); + Music *m = note_events_[i]->clone (); scratch_note_events_.push_back (m); } } for (vsize i = 0; left_to_do_ && i < note_events_.size (); i++) { - Stream_event *event = note_events_[i]; + Music *event = note_events_[i]; if (scratch_note_events_.size ()) { event = scratch_note_events_[i]; @@ -216,7 +221,11 @@ Completion_heads_engraver::process_music () Item *d = make_item ("Dots", SCM_EOL); Rhythmic_head::set_dots (note, d); - d->set_property ("dot-count", scm_from_int (dots)); + /* + measly attempt to save an eeny-weenie bit of memory. + */ + if (dots != scm_to_int (d->get_property ("dot-count"))) + d->set_property ("dot-count", scm_from_int (dots)); d->set_parent (note, Y_AXIS); dots_.push_back (d); @@ -287,19 +296,13 @@ Completion_heads_engraver::Completion_heads_engraver () { } +#include "translator.icc" + ADD_TRANSLATOR (Completion_heads_engraver, /* doc */ "This engraver replaces " "@code{Note_heads_engraver}. It plays some trickery to " "break long notes and automatically tie them into the next measure.", - /* create */ - "NoteHead " - "Dots " - "Tie", - - /* accept */ "note-event", - /* read */ - "middleCPosition " - "measurePosition " - "measureLength", - + /* create */ "NoteHead Dots Tie", + /* accept */ "busy-playing-event note-event", + /* read */ "middleCPosition measurePosition measureLength", /* write */ "");