]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/tie-performer.cc
lilypond-manuals.css: edit color scheme and some spacing
[lilypond.git] / lily / tie-performer.cc
index 77fb9e336df5c90c70f2a30e67379d30ed642b92..1f95023eb6ab0962146dd13b54ce07f08b665717 100644 (file)
@@ -1,7 +1,7 @@
 /*
   This file is part of LilyPond, the GNU music typesetter.
 
-  Copyright (C) 1998--2014 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  Copyright (C) 1998--2015 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
   LilyPond is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -51,17 +51,17 @@ protected:
   void start_translation_timestep ();
   virtual void acknowledge_audio_element (Audio_element_info);
   void process_music ();
-  DECLARE_TRANSLATOR_LISTENER (tie);
+  void listen_tie (Stream_event *);
 public:
   TRANSLATOR_DECLARATIONS (Tie_performer);
 };
 
-Tie_performer::Tie_performer ()
+Tie_performer::Tie_performer (Context *c)
+  : Performer (c)
 {
   event_ = 0;
 }
 
-IMPLEMENT_TRANSLATOR_LISTENER (Tie_performer, tie);
 void
 Tie_performer::listen_tie (Stream_event *ev)
 {
@@ -113,6 +113,31 @@ Tie_performer::acknowledge_audio_element (Audio_element_info inf)
               it = heads_to_tie_.erase (it);
             }
         }
+      if (found)
+        return;
+      for (it = heads_to_tie_.begin ();
+           !found && (it != heads_to_tie_.end ());
+           it++)
+        {
+          Audio_element_info et = (*it).head_;
+          Audio_note *th = dynamic_cast<Audio_note *> (et.elem_);
+          Stream_event *left_mus = et.event_;
+
+          if (!(th && right_mus && left_mus))
+            continue;
+
+          SCM p1 = left_mus->get_property ("pitch");
+          SCM p2 = right_mus->get_property ("pitch");
+          if (unsmob<Pitch> (p1) && unsmob<Pitch> (p2)
+              && unsmob<Pitch> (p1)->tone_pitch () == unsmob<Pitch> (p2)->tone_pitch ())
+            {
+              found = true;
+              // (*it).moment_ already stores the end of the tied note!
+              Moment skip = now_mom () - (*it).end_moment_;
+              an->tie_to (th, skip);
+              it = heads_to_tie_.erase (it);
+            }
+        }
     }
 }
 
@@ -159,6 +184,12 @@ Tie_performer::stop_translation_timestep ()
   now_tied_heads_.clear ();
 }
 
+void
+Tie_performer::boot ()
+{
+  ADD_LISTENER (Tie_performer, tie);
+}
+
 ADD_TRANSLATOR (Tie_performer,
                 /* doc */
                 "Generate ties between note heads of equal pitch.",