X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fcompletion-note-heads-engraver.cc;h=f514f7d37febd3c1e774216c3fa3f93ec9633826;hb=e98bc7bfabf41d75aa1e80f37cec7957065f9396;hp=a76d0cb99dfa793439ea055d459667bc1b78da28;hpb=4b975f3177880e16e759f67be4517f67109c2633;p=lilypond.git diff --git a/lily/completion-note-heads-engraver.cc b/lily/completion-note-heads-engraver.cc index a76d0cb99d..f514f7d37f 100644 --- a/lily/completion-note-heads-engraver.cc +++ b/lily/completion-note-heads-engraver.cc @@ -1,27 +1,28 @@ /* completion-note-heads-engraver.cc -- Completion_heads_engraver - (c) 1997--2005 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include +using namespace std; -#include "rhythmic-head.hh" -#include "output-def.hh" -#include "music.hh" -#include "dots.hh" #include "dot-column.hh" -#include "staff-symbol-referencer.hh" +#include "dots.hh" +#include "duration.hh" +#include "global-context.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 "global-context.hh" -#include "duration.hh" -#include "pitch.hh" - +#include "warn.hh" +#include "translator.icc" /* TODO: make matching rest engraver. @@ -44,13 +45,13 @@ class Completion_heads_engraver : public Engraver { - Link_array notes_; - Link_array prev_notes_; - Link_array ties_; + vector notes_; + vector prev_notes_; + vector ties_; - Link_array dots_; - Link_array note_events_; - Link_array scratch_note_events_; + vector dots_; + vector note_events_; + vector scratch_note_events_; Moment note_end_mom_; bool is_first_; @@ -66,9 +67,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 @@ -77,33 +78,18 @@ Completion_heads_engraver::initialize () is_first_ = false; } -bool -Completion_heads_engraver::try_music (Music *m) +IMPLEMENT_TRANSLATOR_LISTENER (Completion_heads_engraver, note); +void +Completion_heads_engraver::listen_note (Stream_event *ev) { - if (m->is_mus_type ("note-event")) - { - note_events_.push (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_events_.push_back (ev); + + is_first_ = true; + Moment now = now_mom (); + Moment musiclen = get_event_length (ev, now); - return false; + note_end_mom_ = max (note_end_mom_, (now + musiclen)); + do_nothing_until_ = Rational (0, 0); } /* @@ -141,9 +127,7 @@ Completion_heads_engraver::find_nearest_duration (Rational length) continue; } else - { - d = Duration (d.duration_log () + 1, 2); - } + d = Duration (d.duration_log () + 1, 2); } if (d.duration_log () >= log_limit) @@ -173,9 +157,7 @@ Completion_heads_engraver::process_music () Duration note_dur; Duration *orig = 0; if (left_to_do_) - { - note_dur = find_nearest_duration (left_to_do_); - } + note_dur = find_nearest_duration (left_to_do_); else { orig = unsmob_duration (note_events_[0]->get_property ("duration")); @@ -194,24 +176,29 @@ Completion_heads_engraver::process_music () } if (orig) - { - left_to_do_ = orig->get_length (); - } + left_to_do_ = orig->get_length (); if (orig && note_dur.get_length () != orig->get_length ()) { if (!scratch_note_events_.size ()) - for (int i = 0; i < note_events_.size (); i++) + for (vsize i = 0; i < note_events_.size (); i++) { - Music *m = note_events_[i]->clone (); - scratch_note_events_.push (m); + Stream_event *m = note_events_[i]->clone (); + scratch_note_events_.push_back (m); } } - - for (int i = 0; - left_to_do_ && i < note_events_.size (); i++) + else { - Music *event = note_events_[i]; + for (vsize i = 0; i < note_events_.size (); i++) + { + Stream_event *c = note_events_[i]->clone (); + scratch_note_events_.push_back (c); + } + } + + for (vsize i = 0; left_to_do_ && i < note_events_.size (); i++) + { + Stream_event *event = note_events_[i]; if (scratch_note_events_.size ()) { event = scratch_note_events_[i]; @@ -231,14 +218,10 @@ Completion_heads_engraver::process_music () Item *d = make_item ("Dots", SCM_EOL); Rhythmic_head::set_dots (note, d); - /* - 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_property ("dot-count", scm_from_int (dots)); d->set_parent (note, Y_AXIS); - dots_.push (d); + dots_.push_back (d); } Pitch *pit = unsmob_pitch (event->get_property ("pitch")); @@ -249,20 +232,18 @@ Completion_heads_engraver::process_music () pos += scm_to_int (c0); note->set_property ("staff-position", scm_from_int (pos)); - notes_.push (note); + notes_.push_back (note); } if (prev_notes_.size () == notes_.size ()) { - for (int i = 0; i < notes_.size (); i++) + for (vsize i = 0; i < notes_.size (); i++) { Grob *p = make_spanner ("Tie", SCM_EOL); - Tie::set_interface (p); // cannot remove yet! - Tie::set_head (p, LEFT, prev_notes_[i]); Tie::set_head (p, RIGHT, notes_[i]); - ties_.push (p); + ties_.push_back (p); } } @@ -273,9 +254,7 @@ Completion_heads_engraver::process_music () */ if (orig && now_mom ().grace_part_) - { - left_to_do_ = Rational (0, 0); - } + left_to_do_ = Rational (0, 0); } void @@ -289,10 +268,8 @@ Completion_heads_engraver::stop_translation_timestep () dots_.clear (); - for (int i = scratch_note_events_.size (); i--;) - { - scratch_note_events_[i]->unprotect (); - } + for (vsize i = scratch_note_events_.size (); i--;) + scratch_note_events_[i]->unprotect (); scratch_note_events_.clear (); } @@ -312,13 +289,17 @@ Completion_heads_engraver::Completion_heads_engraver () { } -#include "translator.icc" - ADD_TRANSLATOR (Completion_heads_engraver, - /* descr */ "This engraver replaces " + /* doc */ "This engraver replaces " "@code{Note_heads_engraver}. It plays some trickery to " "break long notes and automatically tie them into the next measure.", - /* creats*/ "NoteHead Dots Tie", - /* accepts */ "busy-playing-event note-event", - /* reads */ "middleCPosition measurePosition measureLength", + /* create */ + "NoteHead " + "Dots " + "Tie", + /* read */ + "middleCPosition " + "measurePosition " + "measureLength", + /* write */ "");