lilypond-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Fix #743: reinstate warning for unterminated span dynamics.


From: n . puttock
Subject: Re: Fix #743: reinstate warning for unterminated span dynamics.
Date: Sun, 06 Sep 2009 21:14:52 +0000

Reviewers: Reinhold,

Message:
On 2009/09/01 12:04:52, Reinhold wrote:
I can't really judge the internals of the patch. But at least I don't
see any
obvious problem.

It should be harmless, since it's basically the same code lifted from
dynamic-engraver.cc with a slight refinement for the warning message.

On the other hand, I would really like this to be included, as that
issue has
bitten me quite a few times while preparing ~50 small excerpts of
Dvorak's Cello
concerto for a thesis...

OK, I'll add a regression test and rebase the code.

Regards,
Neil


Description:
Fix #743: reinstate warning for unterminated span dynamics.

Please review this at http://codereview.appspot.com/33055

Affected files:
  M lily/new-dynamic-engraver.cc


Index: lily/new-dynamic-engraver.cc
diff --git a/lily/new-dynamic-engraver.cc b/lily/new-dynamic-engraver.cc
index 525823016668b2e4bd6007c5524b8bd3a5cc1ddc..7ea264a7f34bb8fbf81d300d640d1ec96e597a53 100644
--- a/lily/new-dynamic-engraver.cc
+++ b/lily/new-dynamic-engraver.cc
@@ -32,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 *);
+
   Drul_array<Stream_event *> accepted_spanevents_drul_;
   Spanner *current_spanner_;
   Spanner *finished_spanner_;
@@ -75,7 +79,7 @@ New_dynamic_engraver::process_music ()
   if (current_spanner_
&& (accepted_spanevents_drul_[STOP] || script_event_ || accepted_spanevents_drul_[START]))
     {
-      Stream_event* ender = accepted_spanevents_drul_[STOP];
+      Stream_event *ender = accepted_spanevents_drul_[STOP];
       if (!ender)
        ender = script_event_;

@@ -91,20 +95,7 @@ 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"))
@@ -123,7 +114,6 @@ New_dynamic_engraver::process_music ()
        {
          if (cresc_type != ly_symbol2scm ("hairpin"))
            {
-             // Fixme: should put value in error message.
              string as_string = ly_scm_write_string (cresc_type);
              current_span_event_
->origin()->warning (_f ("unknown crescendo style: %s\ndefaulting to hairpin.", as_string.c_str()));
@@ -186,6 +176,35 @@ New_dynamic_engraver::stop_translation_timestep ()
 }

 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)
 {
   if (script_ && !script_->get_parent (X_AXIS))






reply via email to

[Prev in Thread] Current Thread [Next in Thread]