[Top][All Lists]
[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
- Handles longa in MultiMeasureRest (issue4543055),
bordage . bertrand <=