]> git.donarmstrong.com Git - lilypond.git/commitdiff
* lily/include/music-iterator.hh (class Music_iterator): add
authorhanwen <hanwen>
Mon, 19 Jan 2004 14:55:18 +0000 (14:55 +0000)
committerhanwen <hanwen>
Mon, 19 Jan 2004 14:55:18 +0000 (14:55 +0000)
substitute_outlet() to iterator API.

* lily/new-part-combine-iterator.cc (construct_children):
New_pc_iterator: new class, better part combining.

* lily/tie-column.cc (werner_directions): new function

* lily/parser.yy: plug many memory leaks. We're down to 4 for each
parser run.

25 files changed:
ChangeLog
input/regression/pc-new.ly [new file with mode: 0644]
lily/chord-tremolo-iterator.cc
lily/folded-repeat-iterator.cc
lily/include/chord-tremolo-iterator.hh
lily/include/folded-repeat-iterator.hh
lily/include/music-iterator.hh
lily/include/music-wrapper-iterator.hh
lily/include/part-combine-music-iterator.hh
lily/include/percent-repeat-iterator.hh
lily/include/sequential-iterator.hh
lily/include/simultaneous-music-iterator.hh
lily/lyric-combine-music-iterator.cc
lily/music-iterator.cc
lily/music-wrapper-iterator.cc
lily/my-lily-lexer.cc
lily/new-lyric-combine-music-iterator.cc
lily/new-part-combine-iterator.cc [new file with mode: 0644]
lily/parser.yy
lily/part-combine-music-iterator.cc
lily/percent-repeat-iterator.cc
lily/sequential-iterator.cc
lily/simultaneous-music-iterator.cc
lily/tie-column.cc
scm/define-music-types.scm

index 0d6fdd2e16ca5fecc0ac3e3967850f4b630fdb7a..2021565fd6f1ec1be0bdb9f52bb8bc9ae9efbbb6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2004-01-19  Han-Wen Nienhuys   <hanwen@xs4all.nl>
 
+       * lily/include/music-iterator.hh (class Music_iterator): add
+       substitute_outlet() to iterator API.
+
+       * lily/new-part-combine-iterator.cc (construct_children):
+       New_pc_iterator: new class, better part combining.
+
        * lily/tie-column.cc (werner_directions): new function
 
        * lily/tie.cc (set_direction): call Tie_column::set_direction ()
diff --git a/input/regression/pc-new.ly b/input/regression/pc-new.ly
new file mode 100644 (file)
index 0000000..b053636
--- /dev/null
@@ -0,0 +1,24 @@
+\score {
+  \notes \relative c'' {
+
+      \newpartcombine
+      #(list
+       (cons (ly:make-moment 2 4) 'together) 
+       (cons (ly:make-moment 4 4) 'apart) 
+                       
+    ) {
+         g2 g g
+         }
+      { f f f }
+      }
+
+  \paper  {
+      \translator { \VoiceContext
+                   \denies Thread
+                   \consists Note_heads_engraver
+                   \consists Rest_engraver
+                   }
+      
+      
+      }
+}
index a8d6ade08351cb16551daf060bd32c4abbeddee8..ae9a17eb4674ae184c5507b7a92e7c9f73e81855 100644 (file)
@@ -57,6 +57,13 @@ Chord_tremolo_iterator::derived_mark () const
     scm_gc_mark (child_iter_->self_scm());
 }
 
+void
+Chord_tremolo_iterator::derived_substitute (Translator_group*f, Translator_group*t) 
+{
+  if (child_iter_)
+    child_iter_->substitute_outlet (f,t);
+}
+
 void
 Chord_tremolo_iterator::process (Moment m)
 {
index c5dfb5d45da111449ed85da1e26b0104e961967e..40f46803269b5eb9c3b3233a56c9a1b57dbaebb3 100644 (file)
@@ -161,4 +161,14 @@ Folded_repeat_iterator::derived_mark()const
   if (alternative_iter_)
     scm_gc_mark (alternative_iter_->self_scm());
 }
+
+void
+Folded_repeat_iterator::derived_substitute (Translator_group*f, Translator_group*t) 
+{
+  if (main_iter_)
+    main_iter_->substitute_outlet (f,t);
+  if (alternative_iter_)
+    alternative_iter_->substitute_outlet (f,t);
+}
+
 IMPLEMENT_CTOR_CALLBACK (Folded_repeat_iterator);
index b4d18836f15404648d0e8cf91b7979e042c20590..17ebc1be826758d401d44071e022671eec8c72e9 100644 (file)
@@ -20,6 +20,8 @@ public:
   Chord_tremolo_iterator ();
   Chord_tremolo_iterator (Chord_tremolo_iterator const & );
 protected:
+  virtual void derived_substitute (Translator_group*f, Translator_group*t) ;
+
   virtual void derived_mark () const;
   virtual Moment pending_moment () const;
   virtual void do_quit(); 
index 8312a04e381605864b9ceae4f6921e6189eb39e1..662243802bf807480c0d9da9d8129b3229877060 100644 (file)
@@ -25,6 +25,9 @@ public:
   Folded_repeat_iterator (Folded_repeat_iterator const &src);
   Folded_repeat_iterator ();
   virtual void derived_mark () const;
+  virtual void derived_substitute (Translator_group*f, Translator_group*t) ;
+
+
   virtual void construct_children ();
   virtual Moment pending_moment () const;
   virtual void do_quit(); 
index 98010ea9d00f899d9ff6786d6f5a90ad388d3d12..0831317f38ea09b5459672f19b02832846b43d73 100644 (file)
@@ -91,8 +91,8 @@ public:
   static SCM get_static_get_iterator (Music * mus);
   void init_translator (Music  *, Translator_group *); 
   void quit ();
-
-  
+  void substitute_outlet (Translator_group* from, Translator_group *to);
+  virtual void derived_substitute (Translator_group*, Translator_group*);
   virtual Moment pending_moment () const;
   virtual bool ok () const;
 
@@ -100,6 +100,7 @@ public:
   virtual SCM get_pending_events (Moment until)const;
   virtual void process (Moment until);
   virtual void skip (Moment until);
+
   virtual void derived_mark ()const;
   virtual void construct_children ();
   
index 7207cfd38f8402e2dd8c9d3912f789d751bbe803..4bd32a93d1303ad0277f57228c938493a1656467 100644 (file)
@@ -26,6 +26,8 @@ public:
   Music_wrapper_iterator ();
   Music_wrapper_iterator (Music_wrapper_iterator const&);
 
+  virtual void derived_substitute (Translator_group*f, Translator_group*t) ;
+
   virtual void derived_mark () const;
   virtual void construct_children () ;
   virtual Moment pending_moment () const;
index 8d6d6a18d9152d7a2070a826eecd4760d45ccf81..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 (file)
@@ -1,47 +0,0 @@
-/*   
-  part-combine-music-iterator.hh -- declare Part_combine_music_iterator
-  
-  source file of the GNU LilyPond music typesetter
-
-  (c)  2000--2003 Jan Nieuwenhuizen <janneke@gnu.org>
-  
- */
-
-#ifndef PART_COMBINE_MUSIC_ITERATOR_HH
-#define PART_COMBINE_MUSIC_ITERATOR_HH
-
-#include "music-iterator.hh"
-
-class Part_combine_music_iterator : public Music_iterator
-{
-public:
-  VIRTUAL_COPY_CONS (Music_iterator);
-  Part_combine_music_iterator ();
-
-  enum State { UNKNOWN, UNRELATED=1, SOLO1=2, SOLO2=4, UNIRHYTHM=8, UNISON=16, UNISILENCE=32, SPLIT_INTERVAL=64 };
-  DECLARE_SCHEME_CALLBACK(constructor, ()); 
-protected:
-  virtual void derived_mark () const;
-  Part_combine_music_iterator (Part_combine_music_iterator const &);
-  virtual void construct_children ();
-  virtual Moment pending_moment () const;
-  virtual void do_quit(); 
-  virtual void process (Moment);
-  virtual SCM get_pending_events (Moment)const;
-  virtual Music_iterator *try_music_in_children (Music *) const;
-  virtual bool ok () const;
-
-private:
-  void change_to (Music_iterator*, SCM,  String);
-  int get_state (Moment m);
-
-  Music_iterator * first_iter_;
-  Music_iterator * second_iter_;
-  Moment first_until_;
-  Moment second_until_;
-  int state_;
-  String suffix_;
-};
-
-#endif /* PART_COMBINE_MUSIC_ITERATOR_HH */
-
index 325c1ed1b0b60b7471c2e3bf75c50842eb42922a..b7699ec816209b3b0f83eda15549030d96de556b 100644 (file)
@@ -20,6 +20,8 @@ public:
   Percent_repeat_iterator ();
   Percent_repeat_iterator (Percent_repeat_iterator const & );
 protected:
+  virtual void derived_substitute (Translator_group*f, Translator_group*t) ;
+
   virtual void derived_mark () const;
   virtual Moment pending_moment () const;
   virtual void do_quit(); 
index 382a3211fef38d152a78ded71f95cc6dc09565a6..1ab1d00c5da4d816453f8801206b487b1196a000 100644 (file)
@@ -57,6 +57,8 @@ public:
   DECLARE_SCHEME_CALLBACK(constructor, ());
   Sequential_iterator ();
   Sequential_iterator (Sequential_iterator const&);
+  virtual void derived_substitute (Translator_group*f, Translator_group*t) ;
+
   virtual void derived_mark () const;
 
   virtual void construct_children ();
index 3689b1348c3f05b155e0a488f4fae95e4044f729..446e3ae1e54aaf8b51b5e0aa4e42cbed578c8885 100644 (file)
@@ -18,6 +18,7 @@ public:
   VIRTUAL_COPY_CONS (Music_iterator);
   Simultaneous_music_iterator ();
   Simultaneous_music_iterator (Simultaneous_music_iterator const&);
+  virtual void derived_substitute (Translator_group*f, Translator_group*t) ;
   virtual void derived_mark () const;
   DECLARE_SCHEME_CALLBACK(constructor, ());
   
index 138a4ddcf1c181734e182b0c3846e86e98535c82..3b3e19ec7823da33daf0d358231e8d3d8740dec2 100644 (file)
@@ -30,6 +30,7 @@ protected:
 
   virtual bool ok () const;
   virtual void derived_mark () const;
+  virtual void derived_substitute (Translator_group*,Translator_group*) ;
 private:
   bool get_busy_status ()const ;
   bool melisma_busy (); 
@@ -96,6 +97,15 @@ Lyric_combine_music_iterator::derived_mark()const
     scm_gc_mark (lyric_iter_->self_scm());
 }
 
+void
+Lyric_combine_music_iterator::derived_substitute (Translator_group*f,Translator_group* t)
+{
+  if (music_iter_)
+    music_iter_->substitute_outlet (f,t);
+  if (lyric_iter_)
+    lyric_iter_->substitute_outlet (f,t);
+}
+
 void
 Lyric_combine_music_iterator::construct_children ()
 {
index d70fec3d2be655d6b239045c3872f6b6d11bd96c..7d53a9c70269f80ad6e33ca8eba0cfce8ffcee76 100644 (file)
@@ -136,6 +136,18 @@ Music_iterator::init_translator (Music *m, Translator_group *report)
     set_translator (report);
 }
 
+void
+Music_iterator::substitute_outlet (Translator_group*f, Translator_group *t)
+{
+  if (report_to () == f)
+    set_translator (t);
+  derived_substitute (f,t);
+}
+
+void
+Music_iterator::derived_substitute (Translator_group*,Translator_group*)
+{
+}
 
 SCM
 Music_iterator::get_iterator (Music *m) const
index ee19b425e79697232458db4913e7d68058bd6468..be56471ad81ab0760b4be5d933fd6ae1ac8d34bc 100644 (file)
@@ -39,6 +39,13 @@ Music_wrapper_iterator::derived_mark () const
     scm_gc_mark (child_iter_->self_scm());
 }
 
+void
+Music_wrapper_iterator::derived_substitute (Translator_group*f,Translator_group*t) 
+{
+  
+  if (child_iter_)
+    child_iter_->substitute_outlet (f,t);
+}
 
 void
 Music_wrapper_iterator::construct_children ()
index 9608e94ea126f2d5cb9f9ff3b8a3ccf3dfcbf2ef..2a8d3e8cb567aadc936a2f4c7e2090c6a0e2e05e 100644 (file)
@@ -60,6 +60,7 @@ static Keyword_ent the_key_tab[]={
   {"midi", MIDI},
   {"name", NAME},
   {"new", NEWCONTEXT},
+  {"newpartcombine", NEWPARTCOMBINE},
   {"notes", NOTES},
   {"octave", OCTAVE},
   {"once", ONCE},
index 7fcc47401a701ce401d7c1f8213ff0355e769243..f2eff8b6f327bc1c8447c02655b1b52baa279bd9 100644 (file)
@@ -30,6 +30,7 @@ protected:
   virtual bool run_always ()const;
   virtual bool ok () const;
   virtual void derived_mark () const;
+  virtual void derived_substitute (Translator_group*,Translator_group*);
 private:
   bool start_new_syllable () ;
   void find_thread ();
@@ -113,6 +114,17 @@ New_lyric_combine_music_iterator::derived_mark()const
     scm_gc_mark (music_context_->self_scm ());
 }
 
+void
+New_lyric_combine_music_iterator::derived_substitute (Translator_group*f, Translator_group*t)
+{
+  if (lyric_iter_)
+    lyric_iter_->substitute_outlet (f,t);
+  if (lyrics_context_ && lyrics_context_==f)
+    lyrics_context_ = t;
+  if (music_context_ && music_context_ == f)
+    music_context_ = t; 
+}
+
 /*
   ID == "" means accept any ID.
  */
diff --git a/lily/new-part-combine-iterator.cc b/lily/new-part-combine-iterator.cc
new file mode 100644 (file)
index 0000000..7959592
--- /dev/null
@@ -0,0 +1,237 @@
+/*   
+  part-combine-music-iterator.cc -- implement  New_pc_iterator
+
+  source file of the GNU LilyPond music typesetter
+  
+  (c) 2000--2003 Jan Nieuwenhuizen <janneke@gnu.org>
+ */
+
+#include "part-combine-music-iterator.hh"
+#include "translator-group.hh"
+#include "event.hh"
+#include "music-sequence.hh"
+#include "lily-guile.hh"
+#include "warn.hh"
+#include "music-iterator.hh"
+#include "interpretation-context-handle.hh"
+
+class New_pc_iterator : public Music_iterator
+{
+public:
+  VIRTUAL_COPY_CONS (Music_iterator);
+  New_pc_iterator ();
+
+  DECLARE_SCHEME_CALLBACK(constructor, ()); 
+protected:
+  virtual void derived_substitute (Translator_group*f, Translator_group*t) ;
+  virtual void derived_mark () const;
+  New_pc_iterator (New_pc_iterator const &);
+
+  virtual void construct_children ();
+  virtual Moment pending_moment () const;
+  virtual void do_quit(); 
+  virtual void process (Moment);
+
+  virtual SCM get_pending_events (Moment)const;
+  virtual Music_iterator *try_music_in_children (Music *) const;
+
+  virtual bool ok () const;
+
+private:
+  Music_iterator * first_iter_;
+  Music_iterator * second_iter_;
+  bool is_shared_ ;
+  SCM split_list_;
+
+  Interpretation_context_handle one_;
+  Interpretation_context_handle two_;
+  Interpretation_context_handle shared_;
+
+  void together ();
+  void apart ();
+};
+
+
+New_pc_iterator::New_pc_iterator ()
+{
+  is_shared_  =false;
+  first_iter_ = 0;
+  second_iter_ = 0;
+  split_list_ = SCM_EOL;
+}
+
+void
+New_pc_iterator::derived_mark () const
+{
+  if (first_iter_)
+    scm_gc_mark (first_iter_->self_scm());
+  if (second_iter_)
+    scm_gc_mark(second_iter_->self_scm());
+}
+
+void
+New_pc_iterator::derived_substitute (Translator_group*f,
+                                                Translator_group*t)
+{
+  if (first_iter_)
+    first_iter_->substitute_outlet (f,t);
+  if (second_iter_)
+    second_iter_->substitute_outlet (f,t);
+}
+
+void
+New_pc_iterator::do_quit ()
+{
+  if (first_iter_)
+    first_iter_->quit();
+  if (second_iter_)
+    second_iter_->quit();
+
+  one_ .set_translator (0);
+  two_.set_translator (0);
+  shared_.set_translator (0);
+}
+
+New_pc_iterator::New_pc_iterator (New_pc_iterator const &src)
+  : Music_iterator (src)
+{
+  first_iter_ = 0;
+  second_iter_ = 0;
+
+  if(src.first_iter_)
+    first_iter_ = src.first_iter_->clone ();
+  if (src.second_iter_)
+    second_iter_ = src.second_iter_->clone ();
+
+  split_list_ = src.split_list_;
+  
+  if (first_iter_)
+    scm_gc_unprotect_object (first_iter_->self_scm());
+  if (second_iter_)
+    scm_gc_unprotect_object (second_iter_->self_scm());
+}
+
+Moment
+New_pc_iterator::pending_moment () const
+{
+  Moment p;
+  p.set_infinite (1);
+  if (first_iter_->ok ())
+    p = p <? first_iter_->pending_moment ();
+
+  if (second_iter_->ok ())
+    p = p <? second_iter_->pending_moment ();
+  return p;
+}
+
+bool
+New_pc_iterator::ok () const
+{
+  return first_iter_->ok () || second_iter_->ok ();
+}
+
+void
+New_pc_iterator::together ()
+{
+  first_iter_->substitute_outlet (one_.report_to (), shared_.report_to ());
+  second_iter_->substitute_outlet (two_.report_to (), shared_.report_to ());
+}
+
+void
+New_pc_iterator::apart ()
+{
+  first_iter_->substitute_outlet (shared_.report_to (),one_.report_to ());
+  second_iter_->substitute_outlet (shared_.report_to (), two_.report_to ());
+}
+
+
+void
+New_pc_iterator::construct_children ()
+{
+  split_list_ =  get_music ()->get_mus_property ("split-list");
+  SCM lst =  get_music ()->get_mus_property ("elements");
+
+  Translator_group *tr
+    =  report_to ()->find_create_translator (ly_symbol2scm ("Voice"),
+                                            "shared", SCM_EOL);
+
+  tr->execute_pushpop_property (ly_symbol2scm ("NoteHead"),
+                               ly_symbol2scm ("font-size"), gh_int2scm (3));
+
+  
+  shared_ .set_translator (tr); 
+  set_translator (tr);
+
+  Translator_group *one = tr->find_create_translator (ly_symbol2scm ("Voice"),
+                                                     "one", SCM_EOL);
+
+  one_.set_translator (one);
+  one->execute_pushpop_property (ly_symbol2scm ("Stem"),
+                                ly_symbol2scm ("direction"), gh_int2scm (1));
+
+  set_translator (one);
+  first_iter_ = unsmob_iterator (get_iterator (unsmob_music (gh_car (lst))));
+
+
+  Translator_group *two = tr->find_create_translator (ly_symbol2scm ("Voice"),
+                                                     "two", SCM_EOL);
+  two_.set_translator (two);
+  two_.report_to ()->execute_pushpop_property (ly_symbol2scm ("Stem"),
+                                 ly_symbol2scm ("direction"), gh_int2scm (-1));
+  set_translator (two);
+  second_iter_ = unsmob_iterator (get_iterator (unsmob_music (gh_cadr (lst))));
+
+
+  set_translator (tr);
+}
+
+void
+New_pc_iterator::process (Moment m)
+{
+  Moment now = report_to ()->now_mom ();
+  Moment *splitm = 0;
+  
+  for (; gh_pair_p (split_list_); split_list_ = gh_cdr (split_list_))
+    {
+      splitm = unsmob_moment (gh_caar (split_list_));
+      if (*splitm > now)
+       break ;
+
+      if (gh_cdar (split_list_) == ly_symbol2scm ("together"))
+       together ();
+      else if (gh_cdar (split_list_) == ly_symbol2scm ("apart"))
+       apart ();
+      else
+       programming_error ("Unknown split directive.");
+    }
+  
+  if (first_iter_->ok ())
+    first_iter_->process (m);
+  
+  if (second_iter_->ok ())
+    second_iter_->process (m);
+}
+
+Music_iterator*
+New_pc_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);
+}
+
+
+SCM
+New_pc_iterator::get_pending_events (Moment m)const
+{
+  SCM s = SCM_EOL;
+  if (first_iter_)
+    s = gh_append2 (s,first_iter_->get_pending_events (m));
+  if (second_iter_)
+    s = gh_append2 (second_iter_->get_pending_events (m),s);
+  return s;
+}
+
+IMPLEMENT_CTOR_CALLBACK (New_pc_iterator);
index a2da89103c3539fa21c3c7d6ff65b6b4d41997c3..fad5e954b7d7df9ab2c2e418e8ce80add819ef99 100644 (file)
@@ -283,6 +283,7 @@ yylex (YYSTYPE *s,  void * v)
 %token OVERRIDE SET REVERT 
 %token PAPER
 %token PARTCOMBINE
+%token NEWPARTCOMBINE
 %token PARTIAL
 %token PITCHNAMES
 %token PROPERTY
@@ -551,7 +552,6 @@ all objects can be unprotected as soon as they're here.
        ;
 
 
-
 identifier_init:
        score_block {
                $$ = $1->self_scm ();
@@ -1125,6 +1125,15 @@ part_combined_music:
 
                $$ = p;
        }
+       | NEWPARTCOMBINE embedded_scm Music Music {
+               Music * p= MY_MAKE_MUSIC("NewPartCombineMusic");
+               p->set_mus_property ("elements", gh_list ($3->self_scm (),$4->self_scm (), SCM_UNDEFINED));  
+               p->set_mus_property ("split-list", $2);
+               scm_gc_unprotect_object ($3->self_scm ());
+               scm_gc_unprotect_object ($4->self_scm ());  
+
+               $$ = p;
+       }
        ;
 
 context_change:
index 2445ab315d4213d6a7d381d0bdf1b54a5339d50f..6ce902c4c851c1e3836662a37d8be2327e5b5cb6 100644 (file)
 #include "music-sequence.hh"
 #include "lily-guile.hh"
 #include "warn.hh"
+#include "music-iterator.hh"
+
+class Part_combine_music_iterator : public Music_iterator
+{
+public:
+  VIRTUAL_COPY_CONS (Music_iterator);
+  Part_combine_music_iterator ();
+
+  enum State { UNKNOWN, UNRELATED=1, SOLO1=2, SOLO2=4, UNIRHYTHM=8, UNISON=16, UNISILENCE=32, SPLIT_INTERVAL=64 };
+  DECLARE_SCHEME_CALLBACK(constructor, ()); 
+protected:
+  virtual void derived_substitute (Translator_group*f, Translator_group*t) ;
+
+  virtual void derived_mark () const;
+  Part_combine_music_iterator (Part_combine_music_iterator const &);
+  virtual void construct_children ();
+  virtual Moment pending_moment () const;
+  virtual void do_quit(); 
+  virtual void process (Moment);
+  virtual SCM get_pending_events (Moment)const;
+  virtual Music_iterator *try_music_in_children (Music *) const;
+  virtual bool ok () const;
+
+private:
+  void change_to (Music_iterator*, SCM,  String);
+  int get_state (Moment m);
+
+  Music_iterator * first_iter_;
+  Music_iterator * second_iter_;
+  Moment first_until_;
+  Moment second_until_;
+  int state_;
+  String suffix_;
+};
+
 
 Part_combine_music_iterator::Part_combine_music_iterator ()
 {
@@ -31,6 +66,16 @@ Part_combine_music_iterator::derived_mark () const
     scm_gc_mark(second_iter_->self_scm());
 }
 
+void
+Part_combine_music_iterator::derived_substitute (Translator_group*f,
+                                                Translator_group*t)
+{
+  if (first_iter_)
+    first_iter_->substitute_outlet (f,t);
+  if (second_iter_)
+    second_iter_->substitute_outlet (f,t);
+}
+
 void
 Part_combine_music_iterator::do_quit ()
 {
index 0f40fba6d28eed53efdcd420e28e2da7cfad923d..2329daff5a3dbacad95bb1ab9327a6cbc4b3511a 100644 (file)
@@ -96,3 +96,10 @@ Percent_repeat_iterator::derived_mark()const
   if (child_iter_)
     scm_gc_mark (child_iter_->self_scm());
 }
+
+void
+Percent_repeat_iterator::derived_substitute(Translator_group*f,Translator_group*t )
+{
+  if (child_iter_)
+    child_iter_->substitute_outlet (f,t);
+}
index b2c31269771c5aa7097d7c8af44ebe4163a69c11..d60ca429f83461aeb4181cbf3cfcdcedca0ca916 100644 (file)
@@ -85,6 +85,14 @@ Sequential_iterator::derived_mark ()const
 }
 
 
+void
+Sequential_iterator::derived_substitute (Translator_group*f,Translator_group*t)
+{
+  if (iter_)
+    iter_->substitute_outlet (f,t);
+  
+}
+
 Grace_fixup *
 get_grace_fixups (SCM cursor)
 {
index 8e9eea1e94339877c238763b57595c33ae744c01..a222cf08561d162ca7256cb7ec062b07bd4553a1 100644 (file)
@@ -47,6 +47,13 @@ Simultaneous_music_iterator::derived_mark()const
   scm_gc_mark (children_list_);
 }
 
+void
+Simultaneous_music_iterator::derived_substitute(Translator_group*f,Translator_group*t)
+{
+  for (SCM s = children_list_; gh_pair_p (s); s = gh_cdr(s))
+    unsmob_iterator (gh_car (s))-> substitute_outlet (f,t);
+}
+
 SCM
 Simultaneous_music_iterator::get_pending_events (Moment m)const
 {
index 0b76bbb362e4e6cb54b39f689fece523a8e22486..a9eddaebe9c0e25631bd62c1283648669034dbd0 100644 (file)
@@ -22,7 +22,9 @@
 /*
   tie dir depends on what Tie_column does.
 */
-
+/*
+  TODO: this doesn't follow standard pattern. Regularize.
+ */
 void
 Tie_column::add_tie (Grob*me,Grob *s)
 {
@@ -46,8 +48,6 @@ Tie_column::set_directions (Grob*me)
 {
   werner_directions (me);
 }
-  
-
 
 int
 tie_compare (Grob* const & s1,
@@ -74,11 +74,9 @@ Tie_column::old_directions (Grob*me)
   for (int i = ties.size (); i--;)
     if (get_grob_direction (ties[i]))
       ties.del (i);
-  
 
   if (!ties.size ())
     return ;
-  
 
   Direction d = get_grob_direction (me);
   if (d)
index 2a2bd790ddf9f95a855506704b929d6dee723a5a..acdceff21164c5add15a40c9478969e02984dc19 100644 (file)
@@ -311,6 +311,15 @@ as separate voices.")
        (types . (general-music part-combine-music))
        (iterator-ctor . ,Part_combine_music_iterator::constructor)
        ))
+    (NewPartCombineMusic
+     . (
+       (description .  "Combine two parts on a staff, either merged or
+as separate voices.")
+
+       (internal-class-name . "Simultaneous_music")
+       (types . (general-music part-combine-music))
+       (iterator-ctor . ,New_pc_iterator::constructor)
+       ))
     
     (PhrasingSlurEvent
      . (