- (let*
- ((dur (ly:music-property
- (car (ly:music-property music 'elements)) 'duration))
- (factor (ly:duration-factor dur))
- (newdur (ly:make-duration (+ (ly:duration-log dur) 2)
- (ly:duration-dot-count dur) (car factor)(cdr factor))))
- (begin
- (map (lambda (y) (ac:setduration y newdur))
- (ly:music-property music 'elements))
- (let* ((above (ly:music-deep-copy music))
- (below (ly:music-deep-copy music))
- (newmusic (make-sequential-music (list above music below music))))
- (begin
- (map (lambda (y) (ac:down y))
- (filter
- (lambda (z) (eq? 'NoteEvent (ly:music-property z 'name)))
- (ly:music-property below 'elements)))
- (map (lambda (y) (ac:up y))
- (filter
- (lambda (z) (eq? 'NoteEvent (ly:music-property z 'name)))
- (ly:music-property above 'elements)))
- newmusic)))))
- ))))
-
- ((eq? 'KeyChangeEvent (ly:music-property music 'name))
- (set! ac:current-key music)
- music
- )
-
- ((eq? 'PropertySet (ly:music-property music 'name))
- (ac:adjust-props (ly:music-property music 'symbol) music)
- music)
-
- (else music))
- ))
-
-
-
-% At last ... here's the music function that aplies all the above to a
+ (let*
+ ((dur (ly:music-property
+ (car (ly:music-property music 'elements)) 'duration))
+ (factor (ly:duration-factor dur))
+ (newdur (ly:make-duration (+ (ly:duration-log dur) 2)
+ (ly:duration-dot-count dur) (car factor)(cdr factor))))
+ (begin
+ (map (lambda (y) (ac:setduration y newdur))
+ (ly:music-property music 'elements))
+ (let* ((above (ly:music-deep-copy music))
+ (below (ly:music-deep-copy music))
+ (newmusic (make-sequential-music (list above music below music))))
+ (begin
+ (map (lambda (y) (ac:down y))
+ (filter
+ (lambda (z) (eq? 'NoteEvent (ly:music-property z 'name)))
+ (ly:music-property below 'elements)))
+ (map (lambda (y) (ac:up y))
+ (filter
+ (lambda (z) (eq? 'NoteEvent (ly:music-property z 'name)))
+ (ly:music-property above 'elements)))
+ newmusic)))))
+ ((steal)
+ (let
+ ((totallen (ly:moment-main (ly:music-length music)))
+ (steallen (cadr actions)))
+ (if (>= steallen totallen)
+ (begin
+ (if (any (lambda (z) (eq? 'NoteEvent (ly:music-property z 'name)))
+ (ly:music-property music 'elements))
+ (ly:warning (_ "stealing the entirety of a note's time")))
+ (set! ac:stealForward (- steallen totallen))
+ (make-sequential-music '()))
+ (begin
+ (ly:music-compress music (ly:make-moment (/ (- totallen steallen) totallen)))
+ (loop (cddr actions))))))
+ )))))
+
+ ((eq? 'GraceMusic (ly:music-property music 'name))
+ (let
+ ((first-ev
+ (call-with-current-continuation
+ (lambda (yield-fev)
+ (music-map
+ (lambda (m)
+ (if (eq? 'EventChord (ly:music-property m 'name))
+ (yield-fev m)
+ m))
+ music)
+ #f))))
+ (if first-ev
+ (let ((fev-pos (find-tail (lambda (m) (eq? m first-ev)) ac:eventsBackward)))
+ (if fev-pos
+ (set! ac:eventsBackward (cdr fev-pos))
+ (ly:warning (_ "articulation of grace notes has gone awry"))))))
+ (let*
+ ((gmus (ly:music-compress (ly:music-property music 'element)
+ (ly:make-moment ac:defaultGraceFactor)))
+ (glen (ly:moment-main (ly:music-length gmus))))
+ (ac:stealTimeBackward (* glen ac:defaultGraceBackwardness))
+ (set! ac:stealForward (+ ac:stealForward (* glen (- 1 ac:defaultGraceBackwardness))))
+ gmus))
+
+ ((memq (ly:music-property music 'name) '(BarCheck SkipMusic))
+ (let ((totallen (ly:moment-main (ly:music-length music)))
+ (steallen ac:stealForward))
+ (cond
+ ((= steallen 0)
+ (ac:logEventsBackward music))
+ ((< steallen totallen)
+ (set! ac:stealForward 0)
+ (ac:logEventsBackward
+ (ly:music-compress music (ly:make-moment (/ (- totallen steallen) totallen)))))
+ (else
+ (set! ac:stealForward (- steallen totallen))
+ (make-sequential-music '())))))
+
+ ((eq? 'KeyChangeEvent (ly:music-property music 'name))
+ (set! ac:current-key music)
+ music)
+
+ ((eq? 'PropertySet (ly:music-property music 'name))
+ (ac:adjust-props (ly:music-property music 'symbol) music)
+ music)
+
+ (else music)))
+
+
+
+% At last ... here's the music function that applies all the above to a