]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/dynamic-engraver.cc
Merge branch 'master' of git://git.sv.gnu.org/lilypond
[lilypond.git] / lily / dynamic-engraver.cc
index 09a7e3930535a52b7a89686c7fde09ad804eb4cb..6882939d883904a7744d81809df69adfef1c9b1a 100644 (file)
@@ -23,6 +23,7 @@
 #include "staff-symbol-referencer.hh"
 #include "stream-event.hh"
 #include "warn.hh"
+#include "spanner.hh"
 
 #include "translator.icc"
 
@@ -63,7 +64,6 @@ class Dynamic_engraver : public Engraver
 
   TRANSLATOR_DECLARATIONS (Dynamic_engraver);
   DECLARE_ACKNOWLEDGER (accidental);
-  DECLARE_ACKNOWLEDGER (script);
   DECLARE_ACKNOWLEDGER (stem_tremolo);
   DECLARE_ACKNOWLEDGER (note_column);
   DECLARE_ACKNOWLEDGER (slur);
@@ -97,7 +97,7 @@ Dynamic_engraver::listen_absolute_dynamic (Stream_event *ev)
   /*
     TODO: probably broken.
   */
-  script_ev_ = ev;
+  ASSIGN_EVENT_ONCE (script_ev_, ev);
 }
 
 IMPLEMENT_TRANSLATOR_LISTENER (Dynamic_engraver, span_dynamic);
@@ -106,9 +106,14 @@ Dynamic_engraver::listen_span_dynamic (Stream_event *ev)
 {
   Direction d = to_dir (ev->get_property ("span-direction"));
 
-  accepted_spanevents_drul_[d] = ev;
-  if (current_cresc_ev_ && d == START)
-    accepted_spanevents_drul_[STOP] = ev;
+  if (d == START)
+    ASSIGN_EVENT_ONCE (accepted_spanevents_drul_[START], ev);
+  
+  /* Cancel any ongoing crescendo, either explicitly by \! or
+     implicitly by a new crescendo. Also avoid warning if cresc is
+     cancelled both implicitly and explicitly. */
+  if ((d == STOP || current_cresc_ev_) && !accepted_spanevents_drul_[STOP])
+    ASSIGN_EVENT_ONCE (accepted_spanevents_drul_[STOP], ev);
 }
 
 void
@@ -178,7 +183,7 @@ Dynamic_engraver::process_music ()
        }
       else if (accepted_spanevents_drul_[STOP])
        {
-         accepted_spanevents_drul_[STOP]->origin ()->warning (_ ("can't find start of (de)crescendo"));
+         accepted_spanevents_drul_[STOP]->origin ()->warning (_ ("cannot find start of (de)crescendo"));
          stop_ev = 0;
        }
     }
@@ -236,9 +241,6 @@ Dynamic_engraver::process_music ()
                                                     ly_symbol2scm ("adjacent-hairpins"),
                                                     finished_cresc_);
                }
-             cresc_->set_property ("grow-direction",
-                                   scm_from_int ((start_type == "crescendo")
-                                                 ? BIGGER : SMALLER));
            }
 
          /*
@@ -451,27 +453,7 @@ Dynamic_engraver::acknowledge_note_column (Grob_info info)
     finished_cresc_->set_bound (RIGHT, info.grob ());
 }
 
-void
-Dynamic_engraver::acknowledge_script (Grob_info info)
-{
-  if (!line_spanner_ || !script_)
-    return;
-
-  SCM p = info.grob ()->get_property ("script-priority");
-
-  /*
-    UGH.
-
-    DynamicText doesn't really have a script-priority field.
-  */
-  if (scm_is_number (p)
-      && scm_to_int (p)
-      < scm_to_int (script_->get_property ("script-priority")))
-    Side_position_interface::add_support (line_spanner_, info.grob ());
-}
-
 ADD_ACKNOWLEDGER (Dynamic_engraver, accidental);
-ADD_ACKNOWLEDGER (Dynamic_engraver, script);
 ADD_ACKNOWLEDGER (Dynamic_engraver, note_column);
 ADD_ACKNOWLEDGER (Dynamic_engraver, slur);
 ADD_ACKNOWLEDGER (Dynamic_engraver, stem_tremolo);
@@ -482,7 +464,11 @@ ADD_TRANSLATOR (Dynamic_engraver,
                "alignments.  The symbols are collected onto a DynamicLineSpanner grob\n"
                "which takes care of vertical positioning.  ",
 
-               /* create */ "DynamicLineSpanner DynamicText Hairpin TextSpanner",
-               /* accept */ "absolute-dynamic-event crescendo-event decrescendo-event",
+               /* create */
+               "DynamicLineSpanner "
+               "DynamicText "
+               "Hairpin "
+               "TextSpanner ",
+
                /* read */ "",
                /* write */ "");