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