]> git.donarmstrong.com Git - lilypond.git/blobdiff - scm/scheme-engravers.scm
Merge remote branch 'origin/master' into release/unstable
[lilypond.git] / scm / scheme-engravers.scm
index c845f21bd3ff6ddb31a96990f009d3ec170537b8..ccb1fb5b0d1a93b89d08db3e8366d1fee26cbacc 100644 (file)
 aid for counting repeated measures.  There is no requirement that the
 affected measures be repeated, however.  The user delimits the area to
 receive a count with @code{\\startMeasureCount} and
-@code{\\stopMeasureCount}.
-
-Each element of a count is a spanner, and a count is thus a series of
-spanners.  Each spanner is bounded by the first @code{CommandColumn} of
-successive measures, and boundaries are shared by adjoining spanners."
+@code{\\stopMeasureCount}."
   (let ((count-spanner '()) ; a single element of the count
         (go? #f) ; is the count in progress?
         (stop? #f) ; do we end the count?
         (last-measure-seen 0)
-        (new-measure? #f)
         (elapsed 0))
 
     (make-engraver
-      (listeners ((measure-counter-event engraver event)
-        (set! last-measure-seen (ly:context-property context 'currentBarNumber))
-        (set! new-measure? #t)
+     (listeners
+       ((measure-counter-event engraver event)
         (cond
           ((and (= START (ly:event-property event 'span-direction))
                 go?)
-           (begin
-             (set! stop? #t)
-             (ly:input-warning
-               (ly:event-property event 'origin)
-               "count not ended before another begun")))
+           (set! stop? #t)
+           (ly:input-warning
+             (ly:event-property event 'origin)
+             "count not ended before another begun"))
           ((= START (ly:event-property event 'span-direction))
-           (set! go? #t))
+           (set! go? #t)
+           ;; initialize one less so first measure receives a count spanner
+           (set! last-measure-seen
+                 (1- (ly:context-property context 'currentBarNumber))))
           ((= STOP (ly:event-property event 'span-direction))
-           (begin
-             (set! stop? #t)
-             (set! go? #f))))))
+           (set! stop? #t)
+           (set! go? #f)))))
 
-      ((process-music trans)
-        (let ((col (ly:context-property context 'currentCommandColumn))
-              (now (ly:context-property context 'measurePosition))
-              (current-bar (ly:context-property context 'currentBarNumber)))
-          ;; If the counter has been started, make sure we're in a new bar
-          ;; before finishing a count-spanner and starting a new one.
-          ;; Since we consider all CommandColumns encountered, we need this
-          ;; check so that a count-spanner is not created for each pair.
-          (if (and (ly:grob? count-spanner)
-                   (> current-bar last-measure-seen))
-              (set! new-measure? #t))
-          (if new-measure?
-              (begin
-                ;; Check if we have the first column of the measure.
-                ;; The possibility of initial grace notes is considered.
-                (if (moment<=? now ZERO-MOMENT)
-                    (begin
-                      ;; If we have the first column, finish the previous
-                      ;; counter-spanner (if there is one).
-                      (if (ly:grob? count-spanner)
-                          (begin
-                            (ly:spanner-set-bound! count-spanner RIGHT col)
-                            (ly:pointer-group-interface::add-grob count-spanner 'columns col)
-                            (ly:engraver-announce-end-grob trans count-spanner col)
-                            (set! count-spanner '())))
-                      ;; if count is over, reset variables
-                      (if stop?
-                          (begin
-                            (set! elapsed 0)
-                            (set! stop? #f)))
-                      ;; if count is in progress, begin a counter object
-                      (if go?
-                          (let* ((c (ly:engraver-make-grob trans 'MeasureCounter col))
-                                 (counter (ly:grob-property c 'count-from)))
-                            (ly:spanner-set-bound! c LEFT col)
-                            (ly:pointer-group-interface::add-grob c 'columns col)
-                            (set! (ly:grob-property c 'count-from) (+ counter elapsed))
-                            (set! count-spanner c)
-                            (set! elapsed (1+ elapsed))))
-              (set! new-measure? #f)))))
-          (set! last-measure-seen current-bar)))
+     ((process-music trans)
+      (let ((col (ly:context-property context 'currentCommandColumn))
+            (now (ly:context-property context 'measurePosition))
+            (current-bar (ly:context-property context 'currentBarNumber)))
+        ;; Each measure of a count receives a new spanner, which is bounded
+        ;; by the first "command column" of that measure and the following one.
+        ;; The possibility of initial grace notes (negative measure position)
+        ;; is considered.
+        (if (and (> current-bar last-measure-seen)
+                 (moment<=? now ZERO-MOMENT))
+            (begin
+              ;; Finish the previous count-spanner if there is one.
+              (if (ly:grob? count-spanner)
+                  (begin
+                    (ly:spanner-set-bound! count-spanner RIGHT col)
+                    (ly:pointer-group-interface::add-grob count-spanner 'columns col)
+                    (ly:engraver-announce-end-grob trans count-spanner col)
+                    (set! count-spanner '())))
+              ;; If count is over, reset variables.
+              (if stop?
+                  (begin
+                    (set! elapsed 0)
+                    (set! stop? #f)))
+              ;; If count is in progress, begin a count-spanner.
+              (if go?
+                  (let* ((c (ly:engraver-make-grob trans 'MeasureCounter col))
+                         (counter (ly:grob-property c 'count-from)))
+                    (ly:spanner-set-bound! c LEFT col)
+                    (ly:pointer-group-interface::add-grob c 'columns col)
+                    (set! (ly:grob-property c 'count-from) (+ counter elapsed))
+                    (set! count-spanner c)
+                    (set! elapsed (1+ elapsed))))))
+                    (set! last-measure-seen current-bar)))
 
-      ((finalize trans)
-       (if go?
-           (begin
-             (set! go? #f)
-             (ly:grob-suicide! count-spanner)
-             (set! count-spanner '())
-             (ly:warning "measure count left unfinished")))))))
+     ((finalize trans)
+      (if go?
+          (begin
+            (set! go? #f)
+            (ly:grob-suicide! count-spanner)
+            (set! count-spanner '())
+            (ly:warning "measure count left unfinished")))))))