lilypond-devel
[Top][All Lists]
Advanced

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

Handles longa in MultiMeasureRest (issue4543055)


From: bordage . bertrand
Subject: Handles longa in MultiMeasureRest (issue4543055)
Date: Mon, 16 May 2011 17:01:49 +0000

Reviewers: ,

Message:
Longas are now handled in multi-measure rests.

Regards,
Bertrand

Description:
Handles longa in MultiMeasureRest

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

Affected files:
  M lily/multi-measure-rest-engraver.cc
  M lily/multi-measure-rest.cc
  M scm/define-grob-properties.scm


Index: lily/multi-measure-rest-engraver.cc
diff --git a/lily/multi-measure-rest-engraver.cc b/lily/multi-measure-rest-engraver.cc index 3fbcdb612b86b8d14f01a90ea9b18507c42d1be0..a71d18eca146e3d7e5dae54211261dce2c241554 100644
--- a/lily/multi-measure-rest-engraver.cc
+++ b/lily/multi-measure-rest-engraver.cc
@@ -230,7 +230,10 @@ Multi_measure_rest_engraver::start_translation_timestep ()

       SCM sml = get_property ("measureLength");
Rational ml = (unsmob_moment (sml)) ? unsmob_moment (sml)->main_part_ : Rational (1);
-      if (ml >= Rational (2))
+
+      if (ml >= Rational (4))
+       last_rest_->set_property ("use-longa-rest", SCM_BOOL_T);
+      else if (ml >= Rational (2))
        last_rest_->set_property ("use-breve-rest", SCM_BOOL_T);

       mmrest_ = 0;
Index: lily/multi-measure-rest.cc
diff --git a/lily/multi-measure-rest.cc b/lily/multi-measure-rest.cc
index 9628402a5ecec1ce899d4ef1d4ea57002b7529af..8f13e1c2c7926d251fd31046e4a998cdef18b22b 100644
--- a/lily/multi-measure-rest.cc
+++ b/lily/multi-measure-rest.cc
@@ -141,31 +141,29 @@ Multi_measure_rest::symbol_stencil (Grob *me, Real space)

   Font_metric *musfont = Font_interface::get_default_font (me);

-  SCM sml = me->get_property ("use-breve-rest");
+  bool use_longa = to_boolean (me->get_property ("use-longa-rest"));
+  bool use_breve = to_boolean (me->get_property ("use-breve-rest"));
+  int rest_max_value = -1;
+  if (use_longa)
+    rest_max_value = -2;
+
   if (measures == 1)
     {
-      if (to_boolean (sml))
-       {
- Stencil s = musfont->find_by_name (Rest::glyph_name (me, -1, "", false));
-
-         s.translate_axis ((space - s.extent (X_AXIS).length ()) / 2, X_AXIS);
-
-         return s;
-       }
+      Stencil s;
+      if (use_breve || use_longa)
+ s = musfont->find_by_name (Rest::glyph_name (me, rest_max_value, "", false));
       else
        {
-         Stencil s = musfont->find_by_name (Rest::glyph_name (me, 0, "", 
true));
+         s = musfont->find_by_name (Rest::glyph_name (me, 0, "", true));

          /*
            ugh.
          */
          if (Staff_symbol_referencer::get_position (me) == 0.0)
            s.translate_axis (staff_space, Y_AXIS);
-
-         s.translate_axis ((space - s.extent (X_AXIS).length ()) / 2, X_AXIS);
-
-         return s;
        }
+      s.translate_axis ((space - s.extent (X_AXIS).length ()) / 2, X_AXIS);
+      return s;
     }
   else
     return church_rest (me, musfont, measures, space);
@@ -213,13 +211,27 @@ Multi_measure_rest::church_rest (Grob *me, Font_metric *musfont, int measures,
   int count = 0;
   Real symbols_width = 0.0;

+  bool use_longa = to_boolean (me->get_property ("use-longa-rest"));
   bool use_breve = to_boolean (me->get_property ("use-breve-rest"));

   while (l)
     {
-      if (use_breve)
+    int k;
+      if (use_longa)
+       {
+         if (l >= 2)
+           {
+             l -= 2;
+             k = -3;
+           }
+         else
+           {
+             l -= 1;
+             k = -2;
+           }
+       }
+      else if (use_breve)
        {
-         int k;
          if (l >= 2)
            {
              l -= 2;
@@ -230,14 +242,9 @@ Multi_measure_rest::church_rest (Grob *me, Font_metric *musfont, int measures,
              l -= 1;
              k = -1;
            }
-
-         Stencil r (musfont->find_by_name ("rests." + to_string (k)));
-         symbols_width += r.extent (X_AXIS).length ();
-         mols = scm_cons (r.smobbed_copy (), mols);
        }
       else
        {
-         int k;
          if (l >= 4)
            {
              l -= 4;
@@ -253,16 +260,15 @@ Multi_measure_rest::church_rest (Grob *me, Font_metric *musfont, int measures,
              k = 0;
              l--;
            }
-
-         Stencil r (musfont->find_by_name ("rests." + to_string (k)));
-         if (k == 0)
-           {
-             Real staff_space = Staff_symbol_referencer::staff_space (me);
-             r.translate_axis (staff_space, Y_AXIS);
-           }
-         symbols_width += r.extent (X_AXIS).length ();
-         mols = scm_cons (r.smobbed_copy (), mols);
        }
+      Stencil r (musfont->find_by_name ("rests." + to_string (k)));
+      if (k == 0)
+        {
+          Real staff_space = Staff_symbol_referencer::staff_space (me);
+          r.translate_axis (staff_space, Y_AXIS);
+        }
+      symbols_width += r.extent (X_AXIS).length ();
+      mols = scm_cons (r.smobbed_copy (), mols);
       count++;
     }

@@ -369,5 +375,6 @@ ADD_INTERFACE (Multi_measure_rest,
               "minimum-length "
               "spacing-pair "
               "thick-thickness "
+               "use-longa-rest "
               "use-breve-rest "
               );
Index: scm/define-grob-properties.scm
diff --git a/scm/define-grob-properties.scm b/scm/define-grob-properties.scm
index 7fd0b138190bf35f20d9fcec62934c92af86839b..906f303aba4522ac26bb8b04649e8a6694314376 100644
--- a/scm/define-grob-properties.scm
+++ b/scm/define-grob-properties.scm
@@ -1125,6 +1125,8 @@ top-margin of the page) of the system to which this staff belongs.")

      (use-breve-rest ,boolean? "Use breve rests for measures longer
 than a whole rest.")
+     (use-longa-rest ,boolean? "Use longa rests for measures longer
+than a breve rest.")

      ;;;;;;;;;;;;;;;;
      ;; ancient notation





reply via email to

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