source file of the GNU LilyPond music typesetter
- (c) 1999--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+ (c) 1999--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
*/
-#include "auto-change-music.hh"
+#include "music.hh"
#include "auto-change-iterator.hh"
#include "translator-group.hh"
#include "musical-request.hh"
If \translator Staff = bass, then look for Staff = *
*/
- while (current && current->type_str_ != to_type)
+ while (current && current->type_str_ != to_type)
{
last = current;
current = current->daddy_trans_l_;
}
-Pitch_interrogate_req* spanish_inquisition; // nobody expects it
+/*
+ Look ahead to find first pitches to determine staff position.
+ WARNING: this means that
-void
-Auto_change_iterator::do_process (Moment m)
+ \autochange Staff \notes { .... \context Staff = otherstaff { .. } .. }
+
+ will confuse the autochanger, since it will not notice that the
+ music for OTHERSTAFF is not his.
+
+ PRECONDITION: this->ok () holds.
+*/
+Array<Pitch>
+Auto_change_iterator::pending_pitch (Moment m) const
{
- Music_wrapper_iterator::do_process (m);
+ Music_iterator * iter = child_iter_p_ ->clone ();
+ Array<Pitch> ps;
+ while (1)
+ {
+ SCM muses = iter->get_music (m);
+ for (SCM s = muses; gh_pair_p (s); s=gh_cdr (s))
+ if (Note_req* nr = dynamic_cast<Note_req*> (unsmob_music (gh_car (s))))
+ {
+ ps.push (*unsmob_pitch (nr->get_mus_property ("pitch")));
+ }
+
+ if (ps.size ())
+ break;
+
+ iter->skip (m);
+ if (!iter->ok ())
+ break;
+
+ m = iter->pending_moment ();
+ }
- if (!spanish_inquisition)
- spanish_inquisition = new Pitch_interrogate_req;
+ delete iter;
+ return ps;
+}
- Music_iterator *it = try_music (spanish_inquisition);
+void
+Auto_change_iterator::process (Moment m)
+{
+ /*
+ first we get the pitches, then we do the real work.
+ Music_wrapper_iterator::process () might process (and throw away)
+ pitches we need. */
+ Array<Pitch> ps = pending_pitch (m);
- if (it && spanish_inquisition->pitch_arr_.size ())
+ Music_wrapper_iterator::process (m);
+ if (ps.size ())
{
- Musical_pitch p = spanish_inquisition->pitch_arr_[0];
- Direction s = Direction (sign(p.steps ()));
+ Pitch p = ps[0];
+ Direction s = Direction (sign (p.steps ()));
if (s != where_dir_)
{
where_dir_ = s;
- String to_id = (s >= 0) ? "up" : "down";
- Auto_change_music const * auto_mus = dynamic_cast<Auto_change_music const* > (music_l_);
-
- change_to (it, auto_mus->what_str_, to_id);
+ String to_id = (s >= 0) ? "up" : "down";
+ String wh = ly_scm2string (music_l ()->get_mus_property ("what"));
+ change_to (child_iter_p_, wh, to_id);
}
}
-
- spanish_inquisition->pitch_arr_.clear ();
}
-Auto_change_iterator::Auto_change_iterator( )
+Auto_change_iterator::Auto_change_iterator ()
{
where_dir_ = CENTER;
}
+
+IMPLEMENT_CTOR_CALLBACK (Auto_change_iterator);