1\header {
2
3  texidoc = "A multi measure rest reminder is a reminder printed at
4  the top of the page, to remember how many measures you were counting.
5
6  This is a demo of user-defined engravers, and defining grobs using
7  @code{ly:make-grob-properties}."
8}
9
10\version "2.21.0"
11
12% On seeing the end of a multi measure rest, create a MultiMeasureRestReminder item.
13multiMeasureReminderEngraver =
14#(make-engraver
15  (end-acknowledgers
16    ((multi-measure-rest-interface engraver grob source-engraver)
17     (let*
18      ((reminder (ly:engraver-make-grob engraver 'MultiMeasureRestReminder grob)))
19      (set!
20       ;; copy over the 'measure-count property.
21       (ly:grob-property reminder 'measure-count)
22       (ly:grob-property grob 'measure-count))))))
23
24
25% Set the type of MultiMeasureRestReminder so we can assign to it.
26#(set-object-property!  'MultiMeasureRestReminder 'translation-type? ly:grob-properties?)
27% Confirm MultiMeasureRestReminder is a grob syntactically.
28#(set-object-property! 'MultiMeasureRestReminder 'is-grob? #t)
29
30\layout {
31  \context {
32    \Voice
33    \consists \multiMeasureReminderEngraver
34
35    % Define the grobs. The layout is crude, and should be refined for
36    % "production" scores.
37    MultiMeasureRestReminder = #(ly:make-grob-properties `(
38      (break-align-symbols . (left-edge staff-bar))
39      (break-visibility . ,begin-of-line-visible)
40      (direction . ,UP)
41      (extra-spacing-width . (+inf.0 . -inf.0))
42      (font-family . roman)
43      (font-series . bold)
44      (font-size . -2)
45
46      ;; only print the reminder at the top of the page (ie rank-on-page == 0)
47      (text . ,(lambda (grob)
48		(let*
49		 ((r (ly:grob-property (ly:grob-system grob) 'rank-on-page)))
50		 (if (< 0 r)
51		  (begin
52		   (ly:grob-suicide! grob)
53		   "")
54		  (ly:format "(~a)"  (ly:grob-property grob 'measure-count))))))
55      (non-musical . #t)
56      (horizon-padding . 0.05)
57      (outside-staff-priority . 100)
58      (padding . 1.0)
59      (self-alignment-X . ,RIGHT)
60      (side-axis . ,Y)
61      (stencil . ,ly:text-interface::print)
62      (X-offset . 4)
63      (Y-offset . ,side-position-interface::y-aligned-side)
64      (Y-extent . (0 . 0))
65      (X-extent . (0 . 0))
66      (meta .
67       ((class . Item)
68	;; This is clumsy, but we have to repeat the name
69	(name . MultiMeasureRestReminder)
70	(interfaces . (break-alignable-interface
71		       font-interface
72		       outside-staff-interface
73		       self-alignment-interface
74		       side-position-interface
75		       text-interface))))))
76
77  }
78}
79
80\book {
81  \score {
82    {
83      \set Score.skipBars = ##t
84      \time 3/4
85      R2.*4 \break
86      R2.*5 \pageBreak
87      R2.*6 \break
88      R2.*7 \pageBreak
89      R2.*8 \break
90    }
91
92  }
93  \paper {
94    #(set-paper-size "a7")
95  }
96}
97