Hi,

I've made the suggested modifications to the first patch. In order to proceed, 
I had to do some additional modifications:
- Music_iterator::try_music now autodescends to a bottom context, and the 
method has been renamed to report_music.
- Event_iterator has been introduced. Music events are iterated by 
event_iterator by default (was Simple_music_iterator before). I don't think 
Event_chord_iterator adds anything over Simultaneous_music_iterator (apart 
from speed, possibly), so it can probably be junked.
- I have junked:
 - old-lyric-combine
 - output-property-iterator
 - try_music_in_children everywhere

I'll probably be away from CVS access from Thursday to Monday or so, so it 
would be convenient for me to commit these changes tomorrow (more-or-less all 
remaining work depends on this megapatch).

A new todo element popped up also:
It should be fairly easy to create a Scheme_sequential_iterator, where the 
get_music_list method is customised from Scheme. This can be used to softcode 
Chord_tremolo_iterator, Percent_iterator, Sequential_music_iterator and 
Time_scaled_music_iterator.

Known issue: \lyricsto is slightly broken (fails on morgenlied.ly), I haven't 
had the time to check it up but hope to fix it soon.

> > -     (tremolo-type ,integer? "")
> > +     (tremolo-type ,integer? "speed of tremolo, e.g. 16 for c4:16")
>
> hmm. That sucks, we should store the negative log (-4 for 16) rather
> than 16.

I also haven't made this change yet

-- 
Erik
? lily/On
? lily/busy-playing-listener.cc
? lily/event-iterator.cc
? lily/foo.pdf
? lily/foo.ps
? lily/lilypond
? lily/lilypond.gdt
? lily/lilypond.gpr
? lily/out
? lily/out-scons
? lily/out-www
? lily/include/.sconsign
? lily/include/busy-playing-listener.hh
? lily/include/event-iterator.hh
? lily/include/out
? lily/include/out-www
? ly/out
? ly/out-www
? scm/out
? scm/out-www
Index: lily/chord-tremolo-engraver.cc
===================================================================
RCS file: /sources/lilypond/lilypond/lily/chord-tremolo-engraver.cc,v
retrieving revision 1.99
diff -u -r1.99 chord-tremolo-engraver.cc
--- lily/chord-tremolo-engraver.cc	7 May 2006 19:51:11 -0000	1.99
+++ lily/chord-tremolo-engraver.cc	23 May 2006 06:36:58 -0000
@@ -4,12 +4,12 @@
   source file of the GNU LilyPond music typesetter
 
   (c) 2000--2006 Han-Wen Nienhuys <[EMAIL PROTECTED]>
+  		 Erik Sandberg <[EMAIL PROTECTED]>
 */
 
 #include "math.h" // ceil
 
 #include "beam.hh"
-#include "chord-tremolo-iterator.hh"
 #include "engraver-group.hh"
 #include "international.hh"
 #include "item.hh"
@@ -39,92 +39,72 @@
 */
 class Chord_tremolo_engraver : public Engraver
 {
-  void typeset_beam ();
   TRANSLATOR_DECLARATIONS (Chord_tremolo_engraver);
 protected:
   Music *repeat_;
 
-  /// moment (global time) where beam started.
-  Moment start_mom_;
-  Moment stop_mom_;
   int flags_;
-  int total_duration_flags_;
+  // number of beams for short tremolos
+  int expected_beam_count_;
+  // current direction of beam (first RIGHT, then LEFT)
+  Direction beam_dir_;
 
-  /// location  within measure where beam started.
-  Moment beam_start_location_;
-
-  bool body_is_sequential_;
   Spanner *beam_;
-  Spanner *finished_beam_;
-  Item *stem_tremolo_;
 protected:
   virtual void finalize ();
   virtual bool try_music (Music *);
-  void stop_translation_timestep ();
-  void start_translation_timestep ();
   void process_music ();
   DECLARE_ACKNOWLEDGER (stem);
 };
 
 Chord_tremolo_engraver::Chord_tremolo_engraver ()
 {
-  beam_ = finished_beam_ = 0;
+  beam_ = 0;
   repeat_ = 0;
   flags_ = 0;
-  stem_tremolo_ = 0;
-  body_is_sequential_ = false;
+  expected_beam_count_ = 0;
+  beam_dir_ = CENTER;
 }
 
 bool
 Chord_tremolo_engraver::try_music (Music *m)
 {
-  if (m->is_mus_type ("repeated-music")
-      && m->get_property ("iterator-ctor") == Chord_tremolo_iterator::constructor_proc
-      && !repeat_)
+  if (m->is_mus_type ("tremolo-span-event"))
     {
-      Moment l = m->get_length ();
-      repeat_ = m;
-      start_mom_ = now_mom ();
-      stop_mom_ = start_mom_ + l;
-
-      Music *body = Repeated_music::body (m);
-      body_is_sequential_ = body->is_mus_type ("sequential-music");
-
-      int elt_count = body_is_sequential_ ? scm_ilength (body->get_property ("elements")) : 1;
-
-      if (body_is_sequential_ && elt_count != 2)
-	m->origin ()->warning (_f ("expect 2 elements for chord tremolo, found %d", elt_count));
-
-      if (elt_count <= 0)
-	elt_count = 1;
-
-      Rational total_dur = l.main_part_;
-      Rational note_dur = total_dur / Rational (elt_count * Repeated_music::repeat_count (repeat_));
-
-      total_duration_flags_ = max (0, (intlog2 (total_dur.den ()) - 2));
-
-      flags_ = intlog2 (note_dur.den ()) -2;
-
+      Direction span_dir = to_dir (m->get_property ("span-direction"));
+      if (span_dir == START)
+	{
+	  repeat_ = m;
+	  int type = scm_to_int (m->get_property ("tremolo-type"));
+	  /* e.g. 1 for type 8, 2 for type 16 */
+	  flags_ = intlog2 (type) - 2;
+	  expected_beam_count_ = scm_to_int (m->get_property ("expected-beam-count"));
+	  beam_dir_ = RIGHT;
+	}
+      if (span_dir == STOP)
+	{
+	  repeat_ = 0;
+          beam_ = 0;
+          expected_beam_count_ = 0;
+          beam_dir_ = CENTER;
+	}
       return true;
     }
-
   return false;
 }
 
 void
 Chord_tremolo_engraver::process_music ()
 {
-  if (repeat_ && body_is_sequential_ && !beam_)
+  if (repeat_ && !beam_)
     {
       beam_ = make_spanner ("Beam", repeat_->self_scm ());
-      beam_start_location_ = robust_scm2moment (get_property ("measurePosition"), Moment (0));
     }
 }
 
 void
 Chord_tremolo_engraver::finalize ()
 {
-  typeset_beam ();
   if (beam_)
     {
       repeat_->origin ()->warning (_ ("unterminated chord tremolo"));
@@ -133,25 +113,19 @@
 }
 
 void
-Chord_tremolo_engraver::typeset_beam ()
-{
-  finished_beam_ = 0;
-}
-
-void
 Chord_tremolo_engraver::acknowledge_stem (Grob_info info)
 {
   if (beam_)
     {
       Grob *s = info.grob ();
 
-      if (start_mom_ == now_mom ())
-	Stem::set_beaming (s, flags_, RIGHT);
-      else
-	Stem::set_beaming (s, flags_, LEFT);
+      Stem::set_beaming (s, flags_, beam_dir_);
 
       if (Stem::duration_log (s) != 1)
-	beam_->set_property ("gap-count", scm_from_int (flags_ - total_duration_flags_));
+	beam_->set_property ("gap-count", scm_from_int (flags_ - expected_beam_count_));
+
+      if (beam_dir_ == RIGHT)
+        beam_dir_ = LEFT;
 
       if (info.ultimate_music_cause ()->is_mus_type ("rhythmic-event"))
 	Beam::add_stem (beam_, s);
@@ -164,49 +138,12 @@
 	    ::warning (s);
 	}
     }
-  else if (repeat_
-	   && flags_
-	   && !body_is_sequential_)
-    {
-      stem_tremolo_ = make_item ("StemTremolo", repeat_->self_scm ());
-      stem_tremolo_->set_property ("flag-count",
-				   scm_from_int (flags_));
-      stem_tremolo_->set_object ("stem",
-				 info.grob ()->self_scm ());
-      stem_tremolo_->set_parent (info.grob (), X_AXIS);
-      info.grob ()->set_object ("tremolo-flag", stem_tremolo_->self_scm ());
-    }
-}
-
-void
-Chord_tremolo_engraver::start_translation_timestep ()
-{
-  if (beam_ && stop_mom_ == now_mom ())
-    {
-      finished_beam_ = beam_;
-      repeat_ = 0;
-      beam_ = 0;
-    }
-}
-
-void
-Chord_tremolo_engraver::stop_translation_timestep ()
-{
-  if (stem_tremolo_)
-    {
-      repeat_ = 0;
-      if (beam_)
-	programming_error ("beam and stem tremolo?");
-      stem_tremolo_ = 0;
-    }
-
-  typeset_beam ();
 }
 
 ADD_ACKNOWLEDGER (Chord_tremolo_engraver, stem);
 ADD_TRANSLATOR (Chord_tremolo_engraver,
-		/* doc */ "Generates beams for  tremolo repeats.",
+		/* doc */ "Generates beams for tremolo repeats.",
 		/* create */ "Beam",
-		/* accept */ "repeated-music",
+		/* accept */ "tremolo-span-event",
 		/* read */ "",
 		/* write */ "");
Index: lily/chord-tremolo-iterator.cc
===================================================================
RCS file: /sources/lilypond/lilypond/lily/chord-tremolo-iterator.cc,v
retrieving revision 1.35
diff -u -r1.35 chord-tremolo-iterator.cc
--- lily/chord-tremolo-iterator.cc	26 Jan 2006 11:17:08 -0000	1.35
+++ lily/chord-tremolo-iterator.cc	23 May 2006 06:36:58 -0000
@@ -4,82 +4,66 @@
   source file of the GNU LilyPond music typesetter
 
   (c) 2000--2006 Han-Wen Nienhuys <[EMAIL PROTECTED]>
+  		 Erik Sandberg <[EMAIL PROTECTED]>
 */
 
 #include "chord-tremolo-iterator.hh"
 
 #include "input.hh"
 #include "international.hh"
+#include "misc.hh"
 #include "repeated-music.hh"
 
-void
-Chord_tremolo_iterator::construct_children ()
-{
-  Music *m = get_music ();
-
-  factor_ = Moment (Rational (1, 1));
-  child_iter_ = unsmob_iterator (get_iterator (Repeated_music::body (m)));
-}
-
 Chord_tremolo_iterator::Chord_tremolo_iterator ()
 {
-  factor_ = 1;
-  child_iter_ = 0;
 }
 
-void
-Chord_tremolo_iterator::do_quit ()
+SCM
+Chord_tremolo_iterator::get_music_list () const
 {
-  if (child_iter_)
-    child_iter_->quit ();
-}
+  Music *mus = get_music ();
+  Input *origin = mus->origin ();
+  Moment l = mus->get_length ();
+  Music *body = Repeated_music::body (mus);
+  bool body_is_sequential = body->is_mus_type ("sequential-music");
+
+  int elt_count = body_is_sequential ? scm_ilength (body->get_property ("elements")) : 1;
+
+  if (body_is_sequential && elt_count != 2)
+    mus->origin ()->warning (_f ("expect 2 elements for chord tremolo, found %d", elt_count));
+
+  if (elt_count <= 0)
+    elt_count = 1;
+      
+  Rational total_dur = l.main_part_;
+  Rational note_dur = total_dur / Rational (elt_count * Repeated_music::repeat_count (mus));
 
-void
-Chord_tremolo_iterator::derived_mark () const
-{
-  if (child_iter_)
-    scm_gc_mark (child_iter_->self_scm ());
-}
+  SCM tremolo_type = scm_int2num (note_dur.den ());
+  int expected_beaming_ = max (0, (intlog2 (total_dur.den ()) - 2));
 
-void
-Chord_tremolo_iterator::derived_substitute (Context *f, Context *t)
-{
-  if (child_iter_)
-    child_iter_->substitute_outlet (f, t);
-}
-
-void
-Chord_tremolo_iterator::process (Moment m)
-{
-  if (!m.to_bool ())
+  if (elt_count == 1)
     {
-      Music_iterator *yeah = try_music (get_music ());
-      if (yeah)
-	set_context (yeah->get_outlet ());
-      else
-	get_music ()->origin ()->warning (_ ("no one to print a tremolos"));
+      Music *ev = make_music_by_name (ly_symbol2scm ("TremoloEvent"));
+      ev->set_spot (*origin);
+      ev->set_property ("tremolo-type", tremolo_type);
+      return scm_list_2 (ev->unprotect (), body->self_scm ());
     }
+  else
+    { 
+      SCM tremolo_symbol = ly_symbol2scm ("TremoloSpanEvent");
+      SCM start_event_scm = scm_call_2 (ly_lily_module_constant ("make-span-event"), tremolo_symbol, scm_from_int (START));
+      unsmob_music (start_event_scm)->set_spot (*origin);
+      SCM stop_event_scm = scm_call_2 (ly_lily_module_constant ("make-span-event"), tremolo_symbol, scm_from_int (STOP));
+
+      Music *start_event = unsmob_music (start_event_scm);
+      Music *stop_event = unsmob_music (stop_event_scm);
+      start_event->set_spot (*origin);
+      stop_event->set_spot (*origin);
+      start_event->set_property ("tremolo-type", tremolo_type);
+      start_event->set_property ("expected-beam-count", scm_int2num (expected_beaming_));
 
-  child_iter_->process (factor_ * m);
-}
-
-Moment
-Chord_tremolo_iterator::pending_moment () const
-{
-  return child_iter_->pending_moment () / factor_;
-}
-
-bool
-Chord_tremolo_iterator::ok () const
-{
-  return child_iter_ && child_iter_->ok ();
-}
-
-Music_iterator *
-Chord_tremolo_iterator::try_music_in_children (Music *m) const
-{
-  return child_iter_->try_music (m);
+      return scm_list_3 (start_event_scm, body->self_scm (), stop_event_scm);
+    }
 }
 
 IMPLEMENT_CTOR_CALLBACK (Chord_tremolo_iterator);
-
Index: lily/context-def.cc
===================================================================
RCS file: /sources/lilypond/lilypond/lily/context-def.cc,v
retrieving revision 1.61
diff -u -r1.61 context-def.cc
--- lily/context-def.cc	16 May 2006 11:30:54 -0000	1.61
+++ lily/context-def.cc	23 May 2006 06:36:58 -0000
@@ -344,9 +344,8 @@
   else if (dynamic_cast<Performer_group *> (g))
     g->simple_trans_list_ = filter_engravers (g->simple_trans_list_);
 
-  g->context_ = context;
   context->aliases_ = context_aliases_;
-
+  g->connect_to_context (context);
   g->unprotect ();
 
   context->accepts_list_ = get_accepted (ops);
Index: lily/context.cc
===================================================================
RCS file: /sources/lilypond/lilypond/lily/context.cc,v
retrieving revision 1.82
diff -u -r1.82 context.cc
--- lily/context.cc	16 May 2006 16:13:52 -0000	1.82
+++ lily/context.cc	23 May 2006 06:36:58 -0000
@@ -660,3 +660,16 @@
       set_context_property_on_children (trg, sym, ly_deep_copy (val));
     }
 }
+
+bool
+melisma_busy (Context *tr)
+{
+  SCM melisma_properties = tr->get_property ("melismaBusyProperties");
+  bool busy = false;
+
+  for (; scm_is_pair (melisma_properties);
+       melisma_properties = scm_cdr (melisma_properties))
+    busy = busy || to_boolean (tr->internal_get_property (scm_car (melisma_properties)));
+
+  return busy;
+}
Index: lily/event-chord-iterator.cc
===================================================================
RCS file: /sources/lilypond/lilypond/lily/event-chord-iterator.cc,v
retrieving revision 1.26
diff -u -r1.26 event-chord-iterator.cc
--- lily/event-chord-iterator.cc	26 Jan 2006 11:17:01 -0000	1.26
+++ lily/event-chord-iterator.cc	23 May 2006 06:36:58 -0000
@@ -20,22 +20,11 @@
 {
 }
 
-Context *
-Event_chord_iterator::get_bottom_context ()
-{
-  assert (get_outlet ());
-  if (get_outlet ()->is_bottom_context ())
-    return get_outlet ();
-
-  set_context (get_outlet ()->get_default_interpreter ());
-  return get_outlet ();
-}
-
 void
 Event_chord_iterator::construct_children ()
 {
   Simple_music_iterator::construct_children ();
-  get_bottom_context ();
+  descend_to_bottom_context ();
 }
 
 void
@@ -47,10 +36,7 @@
 	   scm_is_pair (s); s = scm_cdr (s))
 	{
 	  Music *mus = unsmob_music (scm_car (s));
-
-	  bool gotcha = try_music (mus);
-	  if (!gotcha)
-	    mus->origin ()->warning (_f ("junking event: `%s'", mus->name ()));
+	  report_music (mus);
 	}
     }
   Simple_music_iterator::process (m);
Index: lily/folded-repeat-iterator.cc
===================================================================
RCS file: /sources/lilypond/lilypond/lily/folded-repeat-iterator.cc,v
retrieving revision 1.43
diff -u -r1.43 folded-repeat-iterator.cc
--- lily/folded-repeat-iterator.cc	16 May 2006 11:19:50 -0000	1.43
+++ lily/folded-repeat-iterator.cc	23 May 2006 06:36:58 -0000
@@ -107,15 +107,6 @@
     }
 }
 
-Music_iterator *
-Folded_repeat_iterator::try_music_in_children (Music *m) const
-{
-  if (main_iter_)
-    return main_iter_->try_music (m);
-  if (alternative_iter_)
-    return alternative_iter_->try_music (m);
-  return 0;
-}
 void
 Folded_repeat_iterator::derived_mark () const
 {
Index: lily/lyric-combine-music-iterator.cc
===================================================================
RCS file: /sources/lilypond/lilypond/lily/lyric-combine-music-iterator.cc,v
retrieving revision 1.53
diff -u -r1.53 lyric-combine-music-iterator.cc
--- lily/lyric-combine-music-iterator.cc	2 Mar 2006 00:39:54 -0000	1.53
+++ lily/lyric-combine-music-iterator.cc	23 May 2006 06:36:58 -0000
@@ -7,9 +7,12 @@
 */
 
 #include "context.hh"
+#include "dispatcher.hh"
+#include "global-context.hh"
 #include "grob.hh"
 #include "input.hh"
 #include "international.hh"
+#include "listener.hh"
 #include "music-iterator.hh"
 #include "music.hh"
 
@@ -24,14 +27,18 @@
   virtual Moment pending_moment () const;
   virtual void do_quit ();
   virtual void process (Moment);
-  virtual Music_iterator *try_music_in_children (Music *) const;
   virtual bool run_always ()const;
   virtual bool ok () const;
   virtual void derived_mark () const;
   virtual void derived_substitute (Context *, Context *);
+  void set_music_context (Context *to);
 private:
   bool start_new_syllable ();
-  void find_voice ();
+  Context *find_voice ();
+  DECLARE_LISTENER (set_busy);
+  DECLARE_LISTENER (check_new_context);
+  /* true when check_new_context is listening */
+  bool listening_;
 
   bool pending_grace_lyric_;
   bool music_found_;
@@ -40,16 +47,10 @@
   Context *music_context_;
   SCM lyricsto_voice_name_;
 
+  bool busy_;
   Music_iterator *lyric_iter_;
 };
 
-/*
-  Ugh; this is a hack, let's not export this hack, so static.
-*/
-static Music *busy_ev;
-static Music *start_ev;
-static Music *melisma_playing_ev;
-
 Lyric_combine_music_iterator::Lyric_combine_music_iterator ()
 {
   music_found_ = false;
@@ -58,35 +59,52 @@
   lyric_iter_ = 0;
   music_context_ = 0;
   lyrics_context_ = 0;
+  listening_ = false;
+}
 
-  /*
-    Ugh. out of place here.
-  */
-  if (!busy_ev)
+IMPLEMENT_LISTENER (Lyric_combine_music_iterator, set_busy)
+void
+Lyric_combine_music_iterator::set_busy (SCM se)
+{
+  Stream_event *e = unsmob_stream_event (se);
+  SCM mus = e->get_property ("music");
+  Music *m = unsmob_music (mus);
+  assert (m);
+
+  if (m->is_mus_type ("note-event") || m->is_mus_type ("cluster-note-event"))
+    busy_ = true;
+}
+
+void
+Lyric_combine_music_iterator::set_music_context (Context *to)
+{
+  if (music_context_)
+    {
+      music_context_->event_source()->remove_listener (GET_LISTENER (set_busy), ly_symbol2scm ("MusicEvent"));
+      lyrics_context_->unset_property (ly_symbol2scm ("associatedVoiceContext"));
+    }
+  music_context_ = to;
+  if (to)
     {
-      busy_ev
-	= make_music_by_name (ly_symbol2scm ("BusyPlayingEvent"));
-      start_ev
-	= make_music_by_name (ly_symbol2scm ("StartPlayingEvent"));
-      melisma_playing_ev
-	= make_music_by_name (ly_symbol2scm ("MelismaPlayingEvent"));
+      to->event_source()->add_listener (GET_LISTENER (set_busy), ly_symbol2scm ("MusicEvent"));
+      lyrics_context_->set_property ("associatedVoiceContext", to->self_scm ());
     }
 }
 
 bool
 Lyric_combine_music_iterator::start_new_syllable ()
 {
-  bool b = music_context_->try_music (busy_ev);
-
-  if (!b)
+  if (!busy_)
     return false;
 
+  busy_ = false;
+
   if (!lyrics_context_)
     return false;
 
   if (!to_boolean (lyrics_context_->get_property ("ignoreMelismata")))
     {
-      bool m = music_context_->try_music (melisma_playing_ev);
+      bool m = melisma_busy (music_context_);
       if (m)
 	return false;
     }
@@ -135,7 +153,7 @@
   if (lyrics_context_ && lyrics_context_ == f)
     lyrics_context_ = t;
   if (music_context_ && music_context_ == f)
-    music_context_ = t;
+    set_music_context (t);
 }
 
 void
@@ -143,14 +161,25 @@
 {
   Music *m = unsmob_music (get_music ()->get_property ("element"));
   lyric_iter_ = unsmob_iterator (get_iterator (m));
+  if (!lyric_iter_)
+    return;
+  lyrics_context_ = find_context_below (lyric_iter_->get_outlet (),
+					ly_symbol2scm ("Lyrics"), "");
 
   lyricsto_voice_name_ = get_music ()->get_property ("associated-context");
 
-  find_voice ();
-
-  if (lyric_iter_)
-    lyrics_context_ = find_context_below (lyric_iter_->get_outlet (),
-					  ly_symbol2scm ("Lyrics"), "");
+  Context *voice = find_voice ();
+  if (voice)
+    set_music_context (voice);
+  else
+    {
+      /*
+        Wait for a Create_context event. If this isn't done, lyrics can be 
+        delayed when voices are created implicitly.
+      */
+      Global_context *g = lyrics_context_->get_global_context ();
+      g->events_below ()->add_listener (GET_LISTENER (check_new_context), ly_symbol2scm ("CreateContext"));
+    }
 
   /*
     We do not create a Lyrics context, because the user might
@@ -159,7 +188,27 @@
   */
 }
 
+IMPLEMENT_LISTENER (Lyric_combine_music_iterator, check_new_context)
 void
+Lyric_combine_music_iterator::check_new_context (SCM sev)
+{
+  // TODO: Check first if type=Voice and if id matches
+  (void)sev;
+
+  Context *voice = find_voice ();
+  if (voice)
+    {
+      set_music_context (voice);
+
+      Global_context *g = voice->get_global_context ();
+      g->events_below ()->remove_listener (GET_LISTENER (check_new_context), ly_symbol2scm ("CreateContext"));
+    }
+}
+
+/*
+Look for a suitable voice to align lyrics to.
+*/
+Context *
 Lyric_combine_music_iterator::find_voice ()
 {
   SCM voice_name = lyricsto_voice_name_;
@@ -173,40 +222,20 @@
   if (scm_is_string (voice_name)
       && (!music_context_ || ly_scm2string (voice_name) != music_context_->id_string ()))
     {
-      /*
-	(spaghettini).
-
-	Need to set associatedVoiceContext again
-      */
-      if (music_context_)
-	made_association_ = false;
-
       Context *t = get_outlet ();
       while (t && t->get_parent_context ())
 	t = t->get_parent_context ();
 
       string name = ly_scm2string (voice_name);
-      Context *voice = find_context_below (t, ly_symbol2scm ("Voice"), name);
-
-      if (voice)
-	music_context_ = voice;
+      return find_context_below (t, ly_symbol2scm ("Voice"), name);
     }
 
-  if (lyrics_context_ && music_context_)
-    {
-      if (!made_association_)
-	{
-	  made_association_ = true;
-	  lyrics_context_->set_property ("associatedVoiceContext",
-					 music_context_->self_scm ());
-	}
-    }
+  return 0;
 }
 
 void
-Lyric_combine_music_iterator::process (Moment mom)
+Lyric_combine_music_iterator::process (Moment)
 {
-  (void) mom;
   find_voice ();
   if (!music_context_)
     return;
@@ -220,7 +249,7 @@
       if (lyrics_context_)
 	lyrics_context_->unset_property (ly_symbol2scm ("associatedVoiceContext"));
       lyric_iter_ = 0;
-      music_context_ = 0;
+      set_music_context (0);
     }
 
   if (music_context_
@@ -261,10 +290,4 @@
     lyric_iter_->quit ();
 }
 
-Music_iterator *
-Lyric_combine_music_iterator::try_music_in_children (Music *m) const
-{
-  return lyric_iter_->try_music (m);
-}
-
 IMPLEMENT_CTOR_CALLBACK (Lyric_combine_music_iterator);
Index: lily/music-iterator.cc
===================================================================
RCS file: /sources/lilypond/lilypond/lily/music-iterator.cc,v
retrieving revision 1.108
diff -u -r1.108 music-iterator.cc
--- lily/music-iterator.cc	16 May 2006 11:30:54 -0000	1.108
+++ lily/music-iterator.cc	23 May 2006 06:36:58 -0000
@@ -14,6 +14,9 @@
 
 #include "warn.hh"
 #include "context.hh"
+#include "event-iterator.hh"
+#include "input.hh"
+#include "international.hh"
 #include "music-wrapper.hh"
 #include "music-wrapper-iterator.hh"
 #include "simple-music-iterator.hh"
@@ -85,6 +88,8 @@
     {
       if (dynamic_cast<Music_wrapper *> (m))
 	p = new Music_wrapper_iterator;
+      else if (m->is_mus_type ("event"))
+        p = new Event_iterator;
       else
 	p = new Simple_music_iterator;
 
@@ -146,30 +151,24 @@
   return ip;
 }
 
-/*
-  TODO: rename to prevent confusion between Context::try_music and
-  Iterator::try_music
-*/
-Music_iterator *
-Music_iterator::try_music (Music *m) const
+/* Descend to a bottom context; implicitly create a new one if necessary */
+void
+Music_iterator::descend_to_bottom_context ()
 {
-  bool b = get_outlet ()->try_music ((Music *)m); // ugh
-  Music_iterator *it = b ? (Music_iterator *) this : 0;	// ugh
-  if (!it)
-    it = try_music_in_children (m);
-  else
-    /* TODO: try_music should only do the following:
-     - descend iterator to bottom context
-     - send music to a bottom context.
-     The function should also be renamed, and it should not return a value. */
-    m->send_to_context (get_outlet ());
-  return it;
+  assert (get_outlet ());
+  if (!get_outlet ()->is_bottom_context ())
+    set_context (get_outlet ()->get_default_interpreter ());
 }
 
-Music_iterator *
-Music_iterator::try_music_in_children (Music *) const
+void 
+Music_iterator::report_music (Music *m)
 {
-  return 0;
+  descend_to_bottom_context ();
+
+  if (!m->is_mus_type ("event"))
+    m->origin ()->warning (_f ("Sending non-event to context"));
+
+  m->send_to_context (get_outlet ());
 }
 
 IMPLEMENT_CTOR_CALLBACK (Music_iterator);
Index: lily/music-wrapper-iterator.cc
===================================================================
RCS file: /sources/lilypond/lilypond/lily/music-wrapper-iterator.cc,v
retrieving revision 1.43
diff -u -r1.43 music-wrapper-iterator.cc
--- lily/music-wrapper-iterator.cc	6 Jan 2006 09:13:26 -0000	1.43
+++ lily/music-wrapper-iterator.cc	23 May 2006 06:36:58 -0000
@@ -60,12 +60,6 @@
   return child_iter_->pending_moment ();
 }
 
-Music_iterator *
-Music_wrapper_iterator::try_music_in_children (Music *m) const
-{
-  return child_iter_->try_music (m);
-}
-
 IMPLEMENT_CTOR_CALLBACK (Music_wrapper_iterator);
 
 bool
Index: lily/output-property-engraver.cc
===================================================================
RCS file: /sources/lilypond/lilypond/lily/output-property-engraver.cc,v
retrieving revision 1.53
diff -u -r1.53 output-property-engraver.cc
--- lily/output-property-engraver.cc	11 Feb 2006 11:35:17 -0000	1.53
+++ lily/output-property-engraver.cc	23 May 2006 06:36:58 -0000
@@ -31,8 +31,13 @@
 {
   if (m->is_mus_type ("layout-instruction"))
     {
-      props_.push_back (m);
-      return true;
+      // UGH. Only swallow the output property event in the context
+      // it was intended for. This is inelegant but not inefficient.
+      if (context ()->is_alias (m->get_property ("context-type")))
+        {
+          props_.push_back (m);
+          return true;
+        }
     }
   return false;
 }
Index: lily/part-combine-iterator.cc
===================================================================
RCS file: /sources/lilypond/lilypond/lily/part-combine-iterator.cc,v
retrieving revision 1.30
diff -u -r1.30 part-combine-iterator.cc
--- lily/part-combine-iterator.cc	11 Feb 2006 11:35:17 -0000	1.30
+++ lily/part-combine-iterator.cc	23 May 2006 06:36:58 -0000
@@ -7,11 +7,13 @@
 */
 
 #include "context.hh"
+#include "dispatcher.hh"
+#include "lily-guile.hh"
+#include "listener.hh"
 #include "music.hh"
+#include "music-iterator.hh"
 #include "music-sequence.hh"
-#include "lily-guile.hh"
 #include "warn.hh"
-#include "music-iterator.hh"
 
 class Part_combine_iterator : public Music_iterator
 {
@@ -29,11 +31,16 @@
   virtual void do_quit ();
   virtual void process (Moment);
 
-  virtual Music_iterator *try_music_in_children (Music *) const;
-
   virtual bool ok () const;
 
 private:
+  /* used by try_process */
+  DECLARE_LISTENER (set_busy);
+  bool busy_;
+  bool notice_busy_;
+  
+  bool try_process (Music_iterator *i, Moment m);
+  
   Music_iterator *first_iter_;
   Music_iterator *second_iter_;
   Moment start_moment_;
@@ -77,8 +84,6 @@
   void unisono (bool silent);
 };
 
-static Music *busy_playing_event;
-
 void
 Part_combine_iterator::do_quit ()
 {
@@ -101,12 +106,6 @@
   split_list_ = SCM_EOL;
   state_ = APART;
   playing_state_ = APART;
-
-  if (!busy_playing_event)
-    {
-      busy_playing_event
-	= make_music_by_name (ly_symbol2scm ("BusyPlayingEvent"));
-    }
 }
 
 void
@@ -169,7 +168,7 @@
       mmrest->set_property ("duration", SCM_EOL);
     }
 
-  tg->try_music (mmrest);
+  mmrest->send_to_context (tg);
 }
 
 void
@@ -192,7 +191,7 @@
 	  if (!event)
 	    event = make_music_by_name (ly_symbol2scm ("SoloOneEvent"));
 
-	  first_iter_->try_music_in_children (event);
+	  event->send_to_context (first_iter_->get_outlet ());
 	}
       playing_state_ = SOLO1;
     }
@@ -255,8 +254,9 @@
 	  if (!event)
 	    event = make_music_by_name (ly_symbol2scm ("UnisonoEvent"));
 
-	  (last_playing_ == SOLO2 ? second_iter_ : first_iter_)
-	    ->try_music_in_children (event);
+	  Context *out = (last_playing_ == SOLO2 ? second_iter_ : first_iter_)
+	    ->get_outlet ();
+	  event->send_to_context (out);
 	  playing_state_ = UNISONO;
 	}
       state_ = newstate;
@@ -280,7 +280,7 @@
 	  if (!event)
 	    event = make_music_by_name (ly_symbol2scm ("SoloTwoEvent"));
 
-	  second_iter_->try_music_in_children (event);
+	  event->send_to_context (second_iter_->get_outlet ());
 	  playing_state_ = SOLO2;
 	}
     }
@@ -369,6 +369,13 @@
     0
   };
 
+  // Add listeners to all contexts except Devnull.
+  Context *contexts[] = {one, two, solo_tr, tr, 0};
+  for (int i = 0; contexts[i]; i++)
+    {
+      contexts[i]->event_source ()->add_listener (GET_LISTENER (set_busy), ly_symbol2scm ("MusicEvent"));
+    }
+
   for (char const **p = syms; *p; p++)
     {
       SCM sym = ly_symbol2scm (*p);
@@ -380,12 +387,46 @@
     }
 }
 
+IMPLEMENT_LISTENER (Part_combine_iterator, set_busy);
+void
+Part_combine_iterator::set_busy (SCM se)
+{
+  if (!notice_busy_)
+    return;
+
+  Stream_event *e = unsmob_stream_event (se);
+  SCM mus = e->get_property ("music");
+  Music *m = unsmob_music (mus);
+  assert (m);
+
+  if (m->is_mus_type ("note-event") || m->is_mus_type ("cluster-note-event"))
+    busy_ = true;
+}
+
+/*
+* Processes a moment in an iterator, and returns whether any new music was reported.
+*/
+bool
+Part_combine_iterator::try_process (Music_iterator *i, Moment m)
+{
+  busy_ = false;
+  notice_busy_ = true;
+
+  i->process (m);
+  
+  notice_busy_ = false;
+  return busy_;
+}
+
 void
 Part_combine_iterator::process (Moment m)
 {
   Moment now = get_outlet ()->now_mom ();
   Moment *splitm = 0;
 
+  if (start_moment_.main_part_.is_infinity () && start_moment_ < 0)
+    start_moment_ = now;
+
   for (; scm_is_pair (split_list_); split_list_ = scm_cdr (split_list_))
     {
       splitm = unsmob_moment (scm_caar (split_list_));
@@ -418,27 +459,15 @@
 
   if (first_iter_->ok ())
     {
-      first_iter_->process (m);
-      if (first_iter_->try_music_in_children (busy_playing_event))
-	last_playing_ = SOLO1;
+      if (try_process (first_iter_, m))
+        last_playing_ = SOLO1;
     }
 
   if (second_iter_->ok ())
     {
-      second_iter_->process (m);
-      if (second_iter_->try_music_in_children (busy_playing_event))
+      if (try_process (second_iter_, m))
 	last_playing_ = SOLO2;
     }
 }
 
-Music_iterator *
-Part_combine_iterator::try_music_in_children (Music *m) const
-{
-  Music_iterator *i = first_iter_->try_music (m);
-  if (i)
-    return i;
-  else
-    return second_iter_->try_music (m);
-}
-
 IMPLEMENT_CTOR_CALLBACK (Part_combine_iterator);
Index: lily/percent-repeat-iterator.cc
===================================================================
RCS file: /sources/lilypond/lilypond/lily/percent-repeat-iterator.cc,v
retrieving revision 1.27
diff -u -r1.27 percent-repeat-iterator.cc
--- lily/percent-repeat-iterator.cc	16 May 2006 11:19:50 -0000	1.27
+++ lily/percent-repeat-iterator.cc	23 May 2006 06:36:58 -0000
@@ -3,13 +3,12 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2001--2006  Han-Wen Nienhuys <[EMAIL PROTECTED]>, Erik Sandberg <[EMAIL PROTECTED]>
+  (c) 2001--2006  Han-Wen Nienhuys <[EMAIL PROTECTED]>
+                  Erik Sandberg <[EMAIL PROTECTED]>
 */
 
 #include "percent-repeat-iterator.hh"
-
 #include "input.hh"
-#include "international.hh"
 #include "music.hh"
 #include "repeated-music.hh"
 
@@ -17,17 +16,16 @@
 
 Percent_repeat_iterator::Percent_repeat_iterator ()
 {
-  child_list_ = SCM_EOL;
 }
 
-void
-Percent_repeat_iterator::construct_children ()
+SCM
+Percent_repeat_iterator::get_music_list () const
 {
-  /* TODO: Distinction between percent and slash */
+  /* TODO: Distinction between percent, double-percent and slash */
   Music *mus = get_music ();
   Music *child = Repeated_music::body (mus);
   SCM length = child->get_length ().smobbed_copy ();
-  child_list_ = SCM_EOL;
+  SCM child_list = SCM_EOL;
 
   int repeats = scm_to_int (mus->get_property ("repeat-count"));
   for (int i = repeats; i > 1; i--)
@@ -37,27 +35,9 @@
     percent->set_property ("length", length);
     if (repeats > 1)
       percent->set_property ("repeat-count", scm_int2num (i - 1));
-    Music *percent_chord = make_music_by_name (ly_symbol2scm ("EventChord"));
-    percent_chord->set_spot (*mus->origin ());
-    percent_chord->set_property ("elements", scm_list_1 (percent->self_scm ()));
-    child_list_ = scm_cons (percent_chord->self_scm (), child_list_);
-    percent->unprotect ();
-    percent_chord->unprotect ();
+    child_list = scm_cons (percent->unprotect (), child_list);
   }
-  child_list_ = scm_cons (child->self_scm (), child_list_);
-  
-  Sequential_iterator::construct_children ();
-}
-
-SCM
-Percent_repeat_iterator::get_music_list () const
-{
-  return child_list_;
-}
+  child_list = scm_cons (child->self_scm (), child_list);
 
-void
-Percent_repeat_iterator::derived_mark () const
-{
-  scm_gc_mark (child_list_);
-  Sequential_iterator::derived_mark ();
+  return child_list;
 }
Index: lily/quote-iterator.cc
===================================================================
RCS file: /sources/lilypond/lilypond/lily/quote-iterator.cc,v
retrieving revision 1.44
diff -u -r1.44 quote-iterator.cc
--- lily/quote-iterator.cc	17 May 2006 15:21:49 -0000	1.44
+++ lily/quote-iterator.cc	23 May 2006 06:36:58 -0000
@@ -252,10 +252,7 @@
 		  mus->transpose (diff);
 		}
 
-	      bool b = quote_outlet_.get_outlet ()->try_music (mus);
-	      if (!b)
-		mus->origin ()->warning (_f ("in quotation: junking event %s",
-					     mus->name ()));
+	      quote_outlet_.get_outlet ()->try_music (mus);
 	    }
 	}
 
Index: lily/sequential-iterator.cc
===================================================================
RCS file: /sources/lilypond/lilypond/lily/sequential-iterator.cc,v
retrieving revision 1.40
diff -u -r1.40 sequential-iterator.cc
--- lily/sequential-iterator.cc	6 Jan 2006 09:13:25 -0000	1.40
+++ lily/sequential-iterator.cc	23 May 2006 06:36:58 -0000
@@ -244,12 +244,6 @@
   return iter_;
 }
 
-Music_iterator *
-Sequential_iterator::try_music_in_children (Music *m) const
-{
-  return iter_ ? iter_->try_music (m) : 0;
-}
-
 IMPLEMENT_CTOR_CALLBACK (Sequential_iterator);
 
 bool
Index: lily/simple-music-iterator.cc
===================================================================
RCS file: /sources/lilypond/lilypond/lily/simple-music-iterator.cc,v
retrieving revision 1.23
diff -u -r1.23 simple-music-iterator.cc
--- lily/simple-music-iterator.cc	6 Jan 2006 09:13:25 -0000	1.23
+++ lily/simple-music-iterator.cc	23 May 2006 06:36:58 -0000
@@ -43,7 +43,7 @@
 Simple_music_iterator::process (Moment m)
 {
   /*
-    don't do try_music (), since it would make the function useless for
+    don't do report_music (), since it would make the function useless for
     base classes
   */
 
Index: lily/simultaneous-music-iterator.cc
===================================================================
RCS file: /sources/lilypond/lilypond/lily/simultaneous-music-iterator.cc,v
retrieving revision 1.69
diff -u -r1.69 simultaneous-music-iterator.cc
--- lily/simultaneous-music-iterator.cc	24 Jan 2006 01:42:14 -0000	1.69
+++ lily/simultaneous-music-iterator.cc	23 May 2006 06:36:58 -0000
@@ -133,15 +133,6 @@
   return false;
 }
 
-Music_iterator *
-Simultaneous_music_iterator::try_music_in_children (Music *m) const
-{
-  Music_iterator *b = 0;
-  for (SCM s = children_list_; !b && scm_is_pair (s); s = scm_cdr (s))
-    b = unsmob_iterator (scm_car (s))->try_music (m);
-  return b;
-}
-
 void
 Simultaneous_music_iterator::do_quit ()
 {
Index: lily/time-scaled-music-iterator.cc
===================================================================
RCS file: /sources/lilypond/lilypond/lily/time-scaled-music-iterator.cc,v
retrieving revision 1.29
diff -u -r1.29 time-scaled-music-iterator.cc
--- lily/time-scaled-music-iterator.cc	16 May 2006 11:19:50 -0000	1.29
+++ lily/time-scaled-music-iterator.cc	23 May 2006 06:36:58 -0000
@@ -16,11 +16,10 @@
 
 Time_scaled_music_iterator::Time_scaled_music_iterator ()
 {
-  child_list_ = SCM_EOL;
 }
 
-void
-Time_scaled_music_iterator::construct_children ()
+SCM
+Time_scaled_music_iterator::get_music_list () const
 {
   Music *mus = get_music ();
   Input *origin = mus->origin ();
@@ -41,22 +40,7 @@
   stop_event = scm_call_1 (ly_lily_module_constant ("make-event-chord"), scm_list_1 (stop_event));
   unsmob_music (stop_event)->set_spot (*origin);
 
-  child_list_ = scm_list_3 (start_event, child->self_scm (), stop_event);
-
-  Sequential_iterator::construct_children ();
-}
-
-SCM
-Time_scaled_music_iterator::get_music_list () const
-{
-  return child_list_;
-}
-
-void
-Time_scaled_music_iterator::derived_mark () const
-{
-  scm_gc_mark (child_list_);
-  Sequential_iterator::derived_mark ();
+  return scm_list_3 (start_event, child->self_scm (), stop_event);
 }
 
 IMPLEMENT_CTOR_CALLBACK (Time_scaled_music_iterator);
Index: lily/translator-group.cc
===================================================================
RCS file: /sources/lilypond/lilypond/lily/translator-group.cc,v
retrieving revision 1.152
diff -u -r1.152 translator-group.cc
--- lily/translator-group.cc	11 Feb 2006 11:35:17 -0000	1.152
+++ lily/translator-group.cc	23 May 2006 06:36:58 -0000
@@ -3,18 +3,21 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2006 Han-Wen Nienhuys <[EMAIL PROTECTED]>
+  (c) 1997--2006 Han-Wen Nienhuys <[EMAIL PROTECTED]>,
+                 Erik Sandberg <[EMAIL PROTECTED]>
 */
 
 #include "translator-group.hh"
 
-#include "output-def.hh"
-#include "warn.hh"
-#include "scm-hash.hh"
 #include "context-def.hh"
 #include "context.hh"
+#include "dispatcher.hh"
 #include "main.hh"
 #include "music.hh"
+#include "output-def.hh"
+#include "scm-hash.hh"
+#include "stream-event.hh"
+#include "warn.hh"
 
 Translator_group *
 Translator_group::get_daddy_translator () const
@@ -36,6 +39,15 @@
 }
 
 void
+Translator_group::connect_to_context (Context *c)
+{
+  if (context_)
+    programming_error ("already connected to a context");
+  context_ = c;
+  c->event_source ()->add_listener (GET_LISTENER (eat_event), ly_symbol2scm ("MusicEvent"));
+}
+
+void
 Translator_group::finalize ()
 {
 }
@@ -67,6 +79,16 @@
   return l;
 }
 
+IMPLEMENT_LISTENER (Translator_group, eat_event);
+void
+Translator_group::eat_event (SCM sev)
+{
+  Stream_event *ev = unsmob_stream_event (sev);
+  SCM sm = ev->get_property ("music");
+  Music *m = unsmob_music (sm);
+  try_music (m);
+}
+
 bool
 Translator_group::try_music (Music *m)
 {
@@ -235,4 +257,3 @@
   scm_gc_mark (me->accept_hash_table_);
   return me->simple_trans_list_;
 }
-
Index: lily/include/chord-tremolo-iterator.hh
===================================================================
RCS file: /sources/lilypond/lilypond/lily/include/chord-tremolo-iterator.hh,v
retrieving revision 1.20
diff -u -r1.20 chord-tremolo-iterator.hh
--- lily/include/chord-tremolo-iterator.hh	6 Jan 2006 09:13:24 -0000	1.20
+++ lily/include/chord-tremolo-iterator.hh	23 May 2006 06:36:58 -0000
@@ -9,28 +9,18 @@
 #ifndef CHORD_TREMOLO_ITERATOR_HH
 #define CHORD_TREMOLO_ITERATOR_HH
 
-#include "music-iterator.hh"
+#include "sequential-iterator.hh"
 
-class Chord_tremolo_iterator : public Music_iterator
+class Chord_tremolo_iterator : public Sequential_iterator
 {
 public:
-  DECLARE_CLASSNAME(Chord_tremolo_iterator);
   DECLARE_SCHEME_CALLBACK (constructor, ());
+  /* construction */
+  DECLARE_CLASSNAME(Chord_tremolo_iterator);
   Chord_tremolo_iterator ();
-  Chord_tremolo_iterator (Chord_tremolo_iterator const &);
 protected:
-  virtual void derived_substitute (Context *f, Context *t);
-
-  virtual void derived_mark () const;
-  virtual Moment pending_moment () const;
-  virtual void do_quit ();
-  virtual void construct_children ();
-  virtual bool ok () const;
-  virtual void process (Moment);
-  virtual Music_iterator *try_music_in_children (Music *) const;
+  virtual SCM get_music_list () const;
 private:
-  Moment factor_;
-  Music_iterator *child_iter_;
 };
 
 #endif /* CHORD_TREMOLO_ITERATOR_HH */
Index: lily/include/event-chord-iterator.hh
===================================================================
RCS file: /sources/lilypond/lilypond/lily/include/event-chord-iterator.hh,v
retrieving revision 1.13
diff -u -r1.13 event-chord-iterator.hh
--- lily/include/event-chord-iterator.hh	6 Jan 2006 09:13:24 -0000	1.13
+++ lily/include/event-chord-iterator.hh	23 May 2006 06:36:58 -0000
@@ -1,13 +1,13 @@
 /*
-  event-iter.hh -- declare Event_chord_iterator
+  event-chord-iterator.hh -- declare Event_chord_iterator
 
   source file of the GNU LilyPond music typesetter
 
   (c) 1997--2006 Han-Wen Nienhuys <[EMAIL PROTECTED]>
 */
 
-#ifndef EVENT_ITER_HH
-#define EVENT_ITER_HH
+#ifndef EVENT_CHORD_ITERATOR_HH
+#define EVENT_CHORD_ITERATOR_HH
 
 #include "simple-music-iterator.hh"
 
@@ -19,16 +19,8 @@
   /**
      Find a bottom notation context to deliver events to.
   */
-  virtual Context *get_bottom_context ();
   DECLARE_CLASSNAME(Event_chord_iterator);
 
-  /*
-    Since Event_chord_iterator has no list-cursor internally, we
-    must use a status variable to adminstrate where we are */
-
-  enum { NONE_DONE, START_DONE, END_DONE }
-    status_;
-
 public:
   DECLARE_SCHEME_CALLBACK (constructor, ());
   Event_chord_iterator ();
@@ -39,4 +31,4 @@
   virtual void construct_children ();
 };
 
-#endif // EVENT_ITER_HH
+#endif // EVENT_CHORD_ITERATOR_HH
Index: lily/include/folded-repeat-iterator.hh
===================================================================
RCS file: /sources/lilypond/lilypond/lily/include/folded-repeat-iterator.hh,v
retrieving revision 1.21
diff -u -r1.21 folded-repeat-iterator.hh
--- lily/include/folded-repeat-iterator.hh	6 Jan 2006 09:13:24 -0000	1.21
+++ lily/include/folded-repeat-iterator.hh	23 May 2006 06:36:58 -0000
@@ -36,7 +36,6 @@
   void leave_body ();
 
   virtual void process (Moment);
-  virtual Music_iterator *try_music_in_children (Music *) const;
 
 private:
   Music_iterator *main_iter_;
Index: lily/include/lily-proto.hh
===================================================================
RCS file: /sources/lilypond/lilypond/lily/include/lily-proto.hh,v
retrieving revision 1.147
diff -u -r1.147 lily-proto.hh
--- lily/include/lily-proto.hh	22 May 2006 17:45:40 -0000	1.147
+++ lily/include/lily-proto.hh	23 May 2006 06:36:58 -0000
@@ -51,6 +51,7 @@
 class Event;
 class Event_chord;
 class Event_chord_iterator;
+class Event_iterator;
 class Folded_repeat_iterator;
 class Font_metric;
 class Font_size_engraver;
Index: lily/include/music-iterator.hh
===================================================================
RCS file: /sources/lilypond/lilypond/lily/include/music-iterator.hh,v
retrieving revision 1.74
diff -u -r1.74 music-iterator.hh
--- lily/include/music-iterator.hh	11 Feb 2006 11:35:16 -0000	1.74
+++ lily/include/music-iterator.hh	23 May 2006 06:36:58 -0000
@@ -61,13 +61,14 @@
   Moment music_get_length () const;
   Moment music_start_mom () const;
   Music_iterator ();
-  Music_iterator *try_music (Music *) const;
+  void report_music (Music *);
   Context *get_outlet () const;
   void set_context (Context *);
   static SCM get_static_get_iterator (Music *mus);
   void init_translator (Music *, Context *);
   void quit ();
   void substitute_outlet (Context *from, Context *to);
+  void descend_to_bottom_context ();
   virtual void derived_substitute (Context *, Context *);
   virtual Moment pending_moment () const;
   virtual bool ok () const;
@@ -78,8 +79,6 @@
   DECLARE_SCHEME_CALLBACK (constructor, ());
   SCM get_iterator (Music *) const;
 
-  virtual Music_iterator *try_music_in_children (Music *) const;
-
   Music *get_music () const;
 protected:
   virtual void do_quit ();
Index: lily/include/music-wrapper-iterator.hh
===================================================================
RCS file: /sources/lilypond/lilypond/lily/include/music-wrapper-iterator.hh,v
retrieving revision 1.34
diff -u -r1.34 music-wrapper-iterator.hh
--- lily/include/music-wrapper-iterator.hh	6 Jan 2006 09:13:24 -0000	1.34
+++ lily/include/music-wrapper-iterator.hh	23 May 2006 06:36:58 -0000
@@ -33,7 +33,6 @@
   virtual bool run_always () const;
 protected:
   virtual void process (Moment);
-  virtual Music_iterator *try_music_in_children (Music *) const;
 
   Music_iterator *child_iter_;
 };
Index: lily/include/percent-repeat-iterator.hh
===================================================================
RCS file: /sources/lilypond/lilypond/lily/include/percent-repeat-iterator.hh,v
retrieving revision 1.14
diff -u -r1.14 percent-repeat-iterator.hh
--- lily/include/percent-repeat-iterator.hh	16 May 2006 11:19:50 -0000	1.14
+++ lily/include/percent-repeat-iterator.hh	23 May 2006 06:36:58 -0000
@@ -19,10 +19,7 @@
   Percent_repeat_iterator ();
 protected:
   virtual SCM get_music_list () const;
-  virtual void derived_mark () const;
-  virtual void construct_children ();
 private:
-  SCM child_list_;
 };
 
 #endif /* PERCENT_REPEAT_ITERATOR_HH */
Index: lily/include/sequential-iterator.hh
===================================================================
RCS file: /sources/lilypond/lilypond/lily/include/sequential-iterator.hh,v
retrieving revision 1.21
diff -u -r1.21 sequential-iterator.hh
--- lily/include/sequential-iterator.hh	6 Jan 2006 09:13:24 -0000	1.21
+++ lily/include/sequential-iterator.hh	23 May 2006 06:36:58 -0000
@@ -33,7 +33,6 @@
 
 protected:
   virtual void process (Moment);
-  virtual Music_iterator *try_music_in_children (Music *) const;
   virtual bool run_always () const;
   
 protected:
Index: lily/include/simultaneous-music-iterator.hh
===================================================================
RCS file: /sources/lilypond/lilypond/lily/include/simultaneous-music-iterator.hh,v
retrieving revision 1.29
diff -u -r1.29 simultaneous-music-iterator.hh
--- lily/include/simultaneous-music-iterator.hh	6 Jan 2006 09:13:24 -0000	1.29
+++ lily/include/simultaneous-music-iterator.hh	23 May 2006 06:36:58 -0000
@@ -32,7 +32,6 @@
 
 protected:
   virtual void process (Moment);
-  virtual Music_iterator *try_music_in_children (Music *) const;
 
 private:
   SCM children_list_;
Index: lily/include/time-scaled-music-iterator.hh
===================================================================
RCS file: /sources/lilypond/lilypond/lily/include/time-scaled-music-iterator.hh,v
retrieving revision 1.16
diff -u -r1.16 time-scaled-music-iterator.hh
--- lily/include/time-scaled-music-iterator.hh	16 May 2006 11:19:50 -0000	1.16
+++ lily/include/time-scaled-music-iterator.hh	23 May 2006 06:36:58 -0000
@@ -21,10 +21,7 @@
   Time_scaled_music_iterator ();
 protected:
   virtual SCM get_music_list () const;
-  virtual void derived_mark () const;
-  virtual void construct_children ();
 private:
-  SCM child_list_;
 };
 
 #endif /* TIME_SCALED_MUSIC_ITERATOR_HH */
Index: lily/include/translator-group.hh
===================================================================
RCS file: /sources/lilypond/lilypond/lily/include/translator-group.hh,v
retrieving revision 1.81
diff -u -r1.81 translator-group.hh
--- lily/include/translator-group.hh	11 Feb 2006 11:35:16 -0000	1.81
+++ lily/include/translator-group.hh	23 May 2006 06:36:58 -0000
@@ -9,6 +9,7 @@
 #ifndef TRANSLATOR_GROUP_HH
 #define TRANSLATOR_GROUP_HH
 
+#include "listener.hh"
 #include "translator.hh"
 #include "std-vector.hh"
 
@@ -46,11 +47,14 @@
   Translator_group_void_method
   precomputed_self_method_bindings_[TRANSLATOR_METHOD_PRECOMPUTE_COUNT];
 
+  DECLARE_LISTENER (eat_event);
+
 public:
   VIRTUAL_COPY_CONSTRUCTOR (Translator_group, Translator_group);
   DECLARE_SMOBS (Translator_group, dummy);
 
 public:
+  void connect_to_context (Context *c);
   virtual Translator_group *get_daddy_translator ()const;
   virtual SCM get_simple_trans_list ();
   virtual bool try_music (Music *req);
Index: ly/music-functions-init.ly
===================================================================
RCS file: /sources/lilypond/lilypond/ly/music-functions-init.ly,v
retrieving revision 1.58
diff -u -r1.58 music-functions-init.ly
--- ly/music-functions-init.ly	17 May 2006 15:21:49 -0000	1.58
+++ ly/music-functions-init.ly	23 May 2006 06:36:58 -0000
@@ -107,10 +107,11 @@
    music)
 
 applyOutput =
-#(define-music-function (parser location proc) (procedure?)
-                (make-music 'ApplyOutputEvent 
+#(define-music-function (parser location ctx proc) (symbol? procedure?)
+                (make-music 'ApplyOutputEvent
                   'origin location
-                  'procedure proc))
+                  'procedure proc
+                  'context-type ctx))
 
 overrideProperty =
 #(define-music-function (parser location name property value)
@@ -140,8 +141,7 @@
 		    (if (equal?
 			 (cdr (assoc 'name (ly:grob-property grob 'meta)))
 			 grob-name)
-			(set! (ly:grob-property grob property) value)
-			)))
+			(set! (ly:grob-property grob property) value))))
 
       context-name)))
 
Index: scm/define-music-properties.scm
===================================================================
RCS file: /sources/lilypond/lilypond/scm/define-music-properties.scm,v
retrieving revision 1.52
diff -u -r1.52 define-music-properties.scm
--- scm/define-music-properties.scm	17 May 2006 15:21:49 -0000	1.52
+++ scm/define-music-properties.scm	23 May 2006 06:36:58 -0000
@@ -50,6 +50,7 @@
      (error-found ,boolean? "If true, a parsing error was found in this expression")
      (element ,ly:music? "The single child of a Music_wrapper music object, or the body of a repeat.")
      (elements ,ly:music-list? "A list of elements for sequential of simultaneous music, or the alternatives of repeated music. ")
+     (expected-beam-count ,integer? "Expected number of non-tremolo beams in a tremolo repeat")
      (force-accidental ,boolean? "If set, a cautionary accidental should always be printed on this note")
      (grob-property ,symbol? "The symbol of the grob property to set. ")
      (grob-property-path ,list? "A list of symbols, locating a nested grob property, e.g. (beamed-lengths details). ")
@@ -100,7 +101,7 @@
      (text ,markup? "markup expression to be printed")
      (tempo-unit ,ly:duration? "The unit for the metronome count.")
      (tonic ,ly:pitch? "Base of the scale")
-     (tremolo-type ,integer? "")
+     (tremolo-type ,integer? "speed of tremolo, e.g. 16 for c4:16")
      (trill-pitch ,ly:pitch? "Pitch of other note of the trill.")
      (type ,symbol? "The type of this music object. Determines iteration in some cases.")
      (types ,list? "The types of this music object; determines by what
Index: scm/define-music-types.scm
===================================================================
RCS file: /sources/lilypond/lilypond/scm/define-music-types.scm,v
retrieving revision 1.79
diff -u -r1.79 define-music-types.scm
--- scm/define-music-types.scm	16 May 2006 11:19:50 -0000	1.79
+++ scm/define-music-types.scm	23 May 2006 06:36:59 -0000
@@ -30,14 +30,13 @@
 
 Syntax
 
-\\applyoutput FUNC
+\\applyoutput #'Context FUNC
 
 arguments to func are 1. the grob, 2. the originating context,
 3. context where FUNC is called.
 
 ")
-	(iterator-ctor . ,ly:output-property-music-iterator::constructor)
-	(types . (general-music layout-instruction))
+	(types . (general-music event layout-instruction))
 	))
     (ArpeggioEvent 
      . (
@@ -238,17 +237,6 @@
 	(description .  "Allow, forbid or force a line break.")
 	(types . (general-music break-event event))
 	))
-    (OldLyricCombineMusic
-     . (
-	(description .	"Align lyrics to the start of notes.
-
-Syntax @var{\\oldaddlyrics [EMAIL PROTECTED] @var{lyrics}.")
-
-	(types . (general-music lyric-combine-music))
-	(length-callback . ,ly:lyric-combine-music::length-callback)
-	(start-callback . ,ly:music-sequence::first-start-callback)
-	(iterator-ctor . ,ly:old-lyric-combine-music-iterator::constructor)
-	))
     
     (LyricCombineMusic
      . (
@@ -331,18 +319,6 @@
 	(types . (general-music event note-event rhythmic-event melodic-event))
 	))
     
-    (OutputPropertySetMusic
-     . (
-	(description .	"Set grob properties in objects
-individually. 
-
-Syntax @code{\\outputproperty @var{predicate} @var{prop}
-= @var{val}}.")
-
-	(iterator-ctor . ,ly:output-property-music-iterator::constructor)
-	(types . (general-music layout-instruction))
-	))
-    
     (OverrideProperty
      . (
 	(description .	"Extend the definition of a graphical object.
@@ -674,6 +650,12 @@
 	(types . (general-music event tremolo-event))
 	))
     
+    (TremoloSpanEvent
+     . (
+	(description . "Tremolo over two stems")
+	(types . (general-music event span-event tremolo-span-event))
+	))
+
     (VoiceSeparator
      . (
 	(description .	"Separate polyphonic voices in simultaneous music. 
/*
  event-chord-iterator.cc -- implement Event_chord_iterator

  source file of the GNU LilyPond music typesetter

  (c) 1997--2006 Han-Wen Nienhuys <[EMAIL PROTECTED]>
*/

#include "event-iterator.hh"

#include "context.hh"
#include "duration.hh"
#include "input.hh"
#include "international.hh"
#include "music.hh"
#include "pitch.hh"
#include "warn.hh"

Event_iterator::Event_iterator ()
{
}

void
Event_iterator::construct_children ()
{
  descend_to_bottom_context ();
  Simple_music_iterator::construct_children ();
}

void
Event_iterator::process (Moment m)
{
  if (last_processed_mom_ < Moment (0))
    report_music (get_music ());

  Simple_music_iterator::process (m);
}

IMPLEMENT_CTOR_CALLBACK (Event_iterator);
/*
  event-iter.hh -- declare Event_chord_iterator

  source file of the GNU LilyPond music typesetter

  (c) 2006 Han-Wen Nienhuys <[EMAIL PROTECTED]>
  	   Erik Sandberg <[EMAIL PROTECTED]>
*/

#ifndef EVENT_ITERATOR_HH
#define EVENT_ITERATOR_HH

#include "simple-music-iterator.hh"

class Event_iterator : public Simple_music_iterator
{
  DECLARE_CLASSNAME(Event_iterator);

public:
  DECLARE_SCHEME_CALLBACK (constructor, ());
  Event_iterator ();
  Event_iterator (Event_iterator const &);
  virtual void construct_children ();

protected:
  virtual void process (Moment);
};

#endif // EVENT_ITERATOR_HH
_______________________________________________
lilypond-devel mailing list
lilypond-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/lilypond-devel

Reply via email to