X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scm%2Fscheme-engravers.scm;h=ccb1fb5b0d1a93b89d08db3e8366d1fee26cbacc;hb=d2762a4f1add2bb04d6fc34d3c7ae03eeb7d500f;hp=c845f21bd3ff6ddb31a96990f009d3ec170537b8;hpb=467c4fe2943890bdcb760303de8107b69135014c;p=lilypond.git diff --git a/scm/scheme-engravers.scm b/scm/scheme-engravers.scm index c845f21bd3..ccb1fb5b0d 100644 --- a/scm/scheme-engravers.scm +++ b/scm/scheme-engravers.scm @@ -21,83 +21,70 @@ 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")))))))