From 83eb13206528dbf5f397c845d4ef789a2ac0429c Mon Sep 17 00:00:00 2001
From: Davide Liessi
Date: Thu, 3 Oct 2019 20:45:23 +0200
Subject: [PATCH] Add printed-rhythmic-location grob property
The grob property rhythmic-location contains the internal
bar number and the measure position. However, the printed
bar number can be changed by setting Score.currentBarNumber.
The new grob property allows to retrieve the printed bar
number of the grob, which was not possible previously.
Also, it is clarified that bar numbers in rhythmic-location
are the internal ones.
---
lily/paper-column-engraver.cc | 7 +++++++
lily/paper-column.cc | 1 +
scm/define-grob-properties.scm | 4 +++-
scm/output-lib.scm | 16 ++++++++++++++--
4 files changed, 25 insertions(+), 3 deletions(-)
diff --git a/lily/paper-column-engraver.cc b/lily/paper-column-engraver.cc
index 6c7bd25891..e1296790ee 100644
--- a/lily/paper-column-engraver.cc
+++ b/lily/paper-column-engraver.cc
@@ -232,14 +232,21 @@ Paper_column_engraver::stop_translation_timestep ()
SCM mpos = get_property ("measurePosition");
SCM barnum = get_property ("internalBarNumber");
+ SCM curbarnum = get_property ("currentBarNumber");
if (unsmob (mpos)
&& scm_is_integer (barnum))
{
SCM where = scm_cons (barnum,
mpos);
+ SCM printedwhere = scm_cons (curbarnum,
+ mpos);
command_column_->set_property ("rhythmic-location", where);
musical_column_->set_property ("rhythmic-location", where);
+ command_column_->set_property ("printed-rhythmic-location",
+ printedwhere);
+ musical_column_->set_property ("printed-rhythmic-location",
+ printedwhere);
}
for (vsize i = 0; i < items_.size (); i++)
diff --git a/lily/paper-column.cc b/lily/paper-column.cc
index bff4011a4b..3734fa967a 100644
--- a/lily/paper-column.cc
+++ b/lily/paper-column.cc
@@ -488,6 +488,7 @@ ADD_INTERFACE (Paper_column,
"page-break-permission "
"page-turn-penalty "
"page-turn-permission "
+ "printed-rhythmic-location "
"rhythmic-location "
"shortest-playing-duration "
"shortest-starter-duration "
diff --git a/scm/define-grob-properties.scm b/scm/define-grob-properties.scm
index 6ccac5317c..bdf2f22a12 100644
--- a/scm/define-grob-properties.scm
+++ b/scm/define-grob-properties.scm
@@ -812,6 +812,8 @@ positions are requested, the closest one is taken.")
(prefer-dotted-right ,boolean? "For note collisions, prefer to
shift dotted up-note to the right, rather than shifting just the
dot.")
+ (printed-rhythmic-location ,rhythmic-location? "Where (printed
+bar number, measure position) in the score.")
(protrusion ,number? "In an arpeggio bracket, the length of the
horizontal edges.")
@@ -839,7 +841,7 @@ The key is a string of the pattern to be replaced. The value is a
string of what should be displayed. Useful for ligatures.")
(restore-first ,boolean? "Print a natural before the
accidental.")
- (rhythmic-location ,rhythmic-location? "Where (bar number,
+ (rhythmic-location ,rhythmic-location? "Where (internal bar number,
measure position) in the score.")
(right-bound-info ,list? "An alist of properties for determining
attachments of spanners to edges.")
diff --git a/scm/output-lib.scm b/scm/output-lib.scm
index 45beb7a834..9f22d5aeb8 100644
--- a/scm/output-lib.scm
+++ b/scm/output-lib.scm
@@ -31,8 +31,8 @@
(assq-ref (ly:grob-property grob 'meta) 'name))
(define-public (grob::rhythmic-location grob)
- "Return a pair consisting of the measure number and moment within
- the measure of grob @var{grob}."
+ "Return a pair consisting of the internal measure number and moment
+ within the measure of grob @var{grob}."
(let* (; all grobs support either spanner- or item-interface
(item (if (grob::has-interface grob 'spanner-interface)
(ly:spanner-bound grob LEFT)
@@ -42,6 +42,18 @@
(ly:grob-property col 'rhythmic-location)
'())))
+(define-public (grob::printed-rhythmic-location grob)
+ "Return a pair consisting of the printed measure number and moment
+ within the measure of grob @var{grob}."
+ (let* (; all grobs support either spanner- or item-interface
+ (item (if (grob::has-interface grob 'spanner-interface)
+ (ly:spanner-bound grob LEFT)
+ grob))
+ (col (ly:item-get-column item)))
+ (if (ly:grob? col)
+ (ly:grob-property col 'printed-rhythmic-location)
+ '())))
+
(define-public (grob::when grob)
"Return the global timestep (a moment) of grob @var{grob}."
(let* (; all grobs support either spanner- or item-interface
--
2.11.0