]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/time-signature-engraver.cc
Issue 4127: allow mid-measure \time
[lilypond.git] / lily / time-signature-engraver.cc
index 8c444e57471d86cd13ecfc1ed5d7d1063b789e3e..38989dc882db6d97595fbed75635f83210994efb 100644 (file)
@@ -22,6 +22,7 @@
 #include "item.hh"
 #include "international.hh"
 #include "misc.hh"
+#include "moment.hh"
 #include "stream-event.hh"
 #include "time-signature.hh"
 #include "warn.hh"
@@ -70,11 +71,21 @@ Time_signature_engraver::listen_time_signature (Stream_event *ev)
 void
 Time_signature_engraver::process_music ()
 {
+  if (time_signature_)
+    return;
+
   SCM fr = get_property ("timeSignatureFraction");
-  if (!time_signature_
-      && last_time_fraction_ != fr
+  if (last_time_fraction_ != fr
       && scm_is_pair (fr))
     {
+      time_signature_ = make_item ("TimeSignature", time_cause_);
+      time_signature_->set_property ("fraction", fr);
+
+      // Todo: "implicit" does not seem perfectly accurate (issue 4151)
+      if (last_time_fraction_ == SCM_BOOL_F)
+        time_signature_->set_property ("break-visibility",
+                                       get_property ("implicitTimeSignatureVisibility"));
+
       int den = scm_to_int (scm_cdr (fr));
       if (den != (1 << intlog2 (den)))
         {
@@ -83,18 +94,11 @@ Time_signature_engraver::process_music ()
 
             OTOH, Tristan Keuris writes 8/20 in his Intermezzi.
           */
-          warning (_f ("strange time signature found: %d/%d",
-                       int (scm_to_int (scm_car (fr))),
-                       den));
+          time_signature_->warning (_f ("strange time signature found: %d/%d",
+                                        int (scm_to_int (scm_car (fr))),
+                                        den));
         }
 
-      time_signature_ = make_item ("TimeSignature", time_cause_);
-      time_signature_->set_property ("fraction", fr);
-
-      if (last_time_fraction_ == SCM_BOOL_F)
-        time_signature_->set_property ("break-visibility",
-                                       get_property ("implicitTimeSignatureVisibility"));
-
       last_time_fraction_ = fr;
     }
 }
@@ -102,6 +106,14 @@ Time_signature_engraver::process_music ()
 void
 Time_signature_engraver::stop_translation_timestep ()
 {
+  if (time_signature_ && (time_cause_ != SCM_EOL))
+    {
+      Moment *mp = Moment::unsmob (get_property ("measurePosition"));
+      if (mp && (mp->main_part_ > Rational (0))
+          && !to_boolean (get_property ("partialBusy")))
+        time_signature_->warning ("mid-measure time signature without \\partial");
+    }
+
   time_signature_ = 0;
   time_cause_ = SCM_EOL;
 }
@@ -118,6 +130,7 @@ ADD_TRANSLATOR (Time_signature_engraver,
 
                 /* read */
                 "implicitTimeSignatureVisibility "
+                "partialBusy "
                 "timeSignatureFraction ",
 
                 /* write */