2004-01-24 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ * lily/multi-measure-rest-engraver.cc: use a single
+ MultiMeasureEvent for mm rests. This prevents problems with the
+ new part combiner.
+
* scm/music-functions.scm (determine-split-list): analysis has
global effect: a difference halfway a phrase makes the entire
phrase be typeset as apart.
+ (make-multi-measure-rest): make mmrest as a single rhythmic event.
2004-01-23 Han-Wen Nienhuys <hanwen@xs4all.nl>
virtual void finalize ();
private:
- Music * new_req_;
- Music * busy_span_req_;
- Music * stop_req_;
+ Music * rest_ev_;
Link_array<Music> text_events_;
int start_measure_;
- Moment start_moment_;
Rational last_main_moment_;
-
+ Moment stop_moment_;
+
bool bar_seen_;
+ Spanner *last_rest_;
Spanner *mmrest_;
- Link_array<Spanner> numbers_;
+ Link_array<Spanner> numbers_;
Link_array<Spanner> last_numbers_;
- Spanner *last_rest_;
};
Multi_measure_rest_engraver::Multi_measure_rest_engraver ()
start_measure_ = 0;
mmrest_ = 0;
last_rest_ =0;
- new_req_ = busy_span_req_ = stop_req_ =0;
+ rest_ev_ = 0;
}
bool
{
if (req->is_mus_type ("multi-measure-rest-event"))
{
- Direction d = to_dir (req->get_mus_property ("span-direction"));
- if (d == STOP)
- {
- stop_req_ = req;
- }
- else if (d == START&& !new_req_)
- {
- new_req_ = req;
- }
+ rest_ev_ = req;
+ stop_moment_ = now_mom () + rest_ev_->get_length ();
+
return true;
}
else if (req->is_mus_type ("multi-measure-text-event"))
void
Multi_measure_rest_engraver::process_music ()
{
-
- if (new_req_ && stop_req_)
- stop_req_ = 0;
-
- if (new_req_)
- start_moment_ = now_mom ();
-
- if (stop_req_)
- {
- busy_span_req_ =0;
- stop_req_ = 0;
- }
-
- if (new_req_)
- {
- busy_span_req_ = new_req_;
- new_req_ =0;
- }
-
- if (busy_span_req_ && !mmrest_)
+ if (rest_ev_ && !mmrest_)
{
mmrest_ = new Spanner (get_property ("MultiMeasureRest"));
Spanner *sp
= new Spanner (get_property ("MultiMeasureRestNumber"));
numbers_.push (sp);
- announce_grob (sp, busy_span_req_->self_scm());
+ announce_grob (sp, rest_ev_->self_scm());
}
for (int i =0 ; i < numbers_.size(); i++)
numbers_[i]->set_parent (mmrest_, Y_AXIS);
}
- announce_grob (mmrest_, busy_span_req_->self_scm());
+ announce_grob (mmrest_, rest_ev_->self_scm());
start_measure_
= gh_scm2int (get_property ("currentBarNumber"));
}
SCM smp = get_property ("measurePosition");
Moment mp = (unsmob_moment (smp)) ? *unsmob_moment (smp) : Moment (0);
- if (mmrest_ && (now_mom () >= start_moment_)
+ if (mmrest_
&& !mp.to_bool ()
&& mmrest_->get_bound (LEFT) && mmrest_->get_bound (RIGHT))
{
last_numbers_.clear();
}
- if (new_req_)
- {
- busy_span_req_ = new_req_;
- new_req_ =0;
- }
-
text_events_.clear ();
}
void
Multi_measure_rest_engraver::start_translation_timestep ()
{
+ if (now_mom ().main_part_ >= stop_moment_.main_part_)
+ {
+ rest_ev_ = 0;
+ }
+
bar_seen_ = false;
SCM smp = get_property ("measurePosition");
(let*
(
(start (make-music-by-name 'MultiMeasureRestEvent))
- (stop (make-music-by-name 'MultiMeasureRestEvent))
- (skip ( make-music-by-name 'SkipEvent))
(ch (make-music-by-name 'BarCheck))
(ch2 (make-music-by-name 'BarCheck))
- (seq (make-music-by-name 'MultiMeasureRestMusicGroup))
+ (seq (make-music-by-name 'MultiMeasureRestMusicGroup))
)
(map (lambda (x) (ly:set-mus-property! x 'origin location))
- (list start stop skip ch ch2 seq))
- (ly:set-mus-property! start 'span-direction START)
- (ly:set-mus-property! stop 'span-direction STOP)
- (ly:set-mus-property! skip 'duration duration)
+ (list start ch ch2 seq))
+ (ly:set-mus-property! start 'duration duration)
(ly:set-mus-property! seq 'elements
(list
ch
(make-event-chord (list start))
- (make-event-chord (list skip))
- (make-event-chord (list stop))
ch2
))