]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/new-dynamic-engraver.cc
Fix #743: Reinstate warnings for unterminated span dynamics.
[lilypond.git] / lily / new-dynamic-engraver.cc
index 990dba04a0486ea91b844730930545f3f07f6dda..ac652216f7b21880b713c526c999d59b98bab93d 100644 (file)
@@ -3,20 +3,22 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 2008 Han-Wen Nienhuys <hanwen@lilypond.org>
+  (c) 2008--2009 Han-Wen Nienhuys <hanwen@lilypond.org>
   
 */
 
 
 #include "engraver.hh"
 
+#include "hairpin.hh"
+#include "international.hh"
 #include "item.hh"
-#include "pointer-group-interface.hh"
-#include "text-interface.hh"
 #include "note-column.hh"
+#include "pointer-group-interface.hh"
 #include "self-alignment-interface.hh"
 #include "spanner.hh"
 #include "stream-event.hh"
+#include "text-interface.hh"
 
 #include "translator.icc"
 
@@ -30,7 +32,11 @@ class New_dynamic_engraver : public Engraver
 protected:
   virtual void process_music ();
   virtual void stop_translation_timestep ();
+  virtual void finalize ();
+
 private:
+  string get_spanner_type (Stream_event *ev);
+
   Drul_array<Stream_event *> accepted_spanevents_drul_;
   Spanner *current_spanner_;
   Spanner *finished_spanner_;
@@ -73,7 +79,7 @@ New_dynamic_engraver::process_music ()
   if (current_spanner_
       && (accepted_spanevents_drul_[STOP] || script_event_ || accepted_spanevents_drul_[START]))
     {
-      Stream_eventender = accepted_spanevents_drul_[STOP];
+      Stream_event *ender = accepted_spanevents_drul_[STOP];
       if (!ender)
        ender = script_event_;
 
@@ -89,20 +95,8 @@ New_dynamic_engraver::process_music ()
   if (accepted_spanevents_drul_[START])
     {
       current_span_event_ = accepted_spanevents_drul_[START];
-      
-      SCM start_sym = current_span_event_->get_property ("class");
-      string start_type;
-         
-      if (start_sym == ly_symbol2scm ("decrescendo-event"))
-       start_type = "decrescendo";
-      else if (start_sym == ly_symbol2scm ("crescendo-event"))
-       start_type = "crescendo";
-      else
-       {
-         programming_error ("unknown dynamic spanner type");
-         return;
-       }
-      
+
+      string start_type = get_spanner_type (current_span_event_);
       SCM cresc_type = get_property ((start_type + "Spanner").c_str ());
 
       if (cresc_type == ly_symbol2scm ("text"))
@@ -121,10 +115,9 @@ New_dynamic_engraver::process_music ()
        {
          if (cresc_type != ly_symbol2scm ("hairpin"))
            {
-             // Fixme: should put value in error message.
-             ly_display_scm (cresc_type);
+             string as_string = ly_scm_write_string (cresc_type);
              current_span_event_
-               ->origin()->warning ("unknown crescendo style; defaulting to hairpin.");
+               ->origin()->warning (_f ("unknown crescendo style: %s\ndefaulting to hairpin.", as_string.c_str()));
            }
          current_spanner_ = make_spanner ("Hairpin",
                                           current_span_event_->self_scm ());
@@ -152,12 +145,14 @@ New_dynamic_engraver::process_music ()
       if (current_spanner_)
        {
          current_spanner_->set_bound (LEFT, script_);
-         set_nested_property (current_spanner_,
-                              scm_list_3 (ly_symbol2scm ("bound-details"),
-                                          ly_symbol2scm ("left"),
-                                          ly_symbol2scm ("attach-dir")
-                                          ),
-                              scm_from_int (RIGHT));
+
+         if (!Hairpin::has_interface (current_spanner_))
+           set_nested_property (current_spanner_,
+                                scm_list_3 (ly_symbol2scm ("bound-details"),
+                                            ly_symbol2scm ("left"),
+                                            ly_symbol2scm ("attach-dir")
+                                            ),
+                                scm_from_int (RIGHT));
 
        }
     }
@@ -181,6 +176,38 @@ New_dynamic_engraver::stop_translation_timestep ()
   finished_spanner_ = 0;
 }
 
+void
+New_dynamic_engraver::finalize ()
+{
+  if (current_spanner_
+      && !current_spanner_->is_live ())
+    current_spanner_ = 0;
+  if (current_spanner_)
+    {
+      current_span_event_
+       ->origin ()->warning (_f ("unterminated %s",
+                                 get_spanner_type (current_span_event_)
+                                 .c_str ()));
+      current_spanner_->suicide ();
+      current_spanner_ = 0;
+    }
+}
+
+string
+New_dynamic_engraver::get_spanner_type (Stream_event *ev)
+{
+  string type;
+  SCM start_sym = ev->get_property ("class");
+
+  if (start_sym == ly_symbol2scm ("decrescendo-event"))
+    type = "decrescendo";
+  else if (start_sym == ly_symbol2scm ("crescendo-event"))
+    type = "crescendo";
+  else
+    programming_error ("unknown dynamic spanner type");
+  return type;
+}
+
 void
 New_dynamic_engraver::acknowledge_note_column (Grob_info info)
 {
@@ -212,11 +239,14 @@ ADD_TRANSLATOR (New_dynamic_engraver,
                /* create */
                "DynamicTextSpanner "
                "DynamicText "
-               "Hairpin "
-               "TextSpanner ",
+               "Hairpin ",
 
                /* read */
-               "currentMusicalColumn ",
+               "crescendoSpanner "
+               "crescendoText "
+               "currentMusicalColumn "
+               "decrescendoSpanner "
+               "decrescendoText ",
 
                /* write */
                ""