Hello Kieren, that seems to be correct. One could also try something like this.
Cheers, Valentin Am Samstag, 22. Jänner 2022, 03:22:42 CET schrieb Kenneth Wolcott: > Hi; > > I have a piece of music from which I am engraving that confuses me. > > At bar #13 there is the Segno sign. > > At the end of bar #20 there is a "Fine". > > At the end of the piece (bar #37) there is a "D.S. al Fine". > > I'd like to have Lilypond generate midi output that would match this > intent. > > Does this mean: > Play all the way through; then start at the Segno and continue until the > Fine? > > I think that's what it means. > > So I need to have bar #1 to bar #12 in one macro; > bar #13 through bar #20 in a second macro; > and the third macro would contain bars 21-33. > > Then I need "M_one", "M_two", "M_three", followed by "M_two" to > implement this in the midi score section. > > Is that correct? > > Thanks, > Ken Wolcott
unfoldJumpMarks =
#(define-music-function (music) (ly:music?)
(let ((jump-points '()) (jump-marks '()) (chained-jumps '()) (current-fine #f) (result-music '()))
(define (search-music music)
(let ((this-jump-points (ly:music-property music 'jump-points))
(jump-details (ly:music-property music 'jump-details)))
(for-each (lambda (x)
(set! jump-points
`((,x . ,music) . ,jump-points)))
this-jump-points)
(if (not (null? jump-details))
(set! jump-marks `((,music . ,jump-details))))))
(define (listify-music music-list)
(if (null? music-list) '()
(begin
(ly:music-set-property! (car music-list) 'LIST-next (listify-music (cdr music-list)))
(car music-list))))
(define (walk-search-music music)
(let ((elts (ly:music-property music 'elements)))
(listify-music elts)
(map search-music elts)
(if (not (assoc-get 'BEGIN-OF-PIECE jump-points #f))
(set! jump-points
`((BEGIN-OF-PIECE . ,(car elts)) . ,jump-points)))))
(define (build-music)
(let ((current-pos (assoc-get 'BEGIN-OF-PIECE jump-points)))
(while #t
(set! result-music (cons current-pos result-music))
(let* ((mem-pos current-pos)
(next-el (ly:music-property current-pos 'LIST-next))
(this-j-point (any (lambda (x)
(if
(or (eq? current-pos (assoc-get (car x) jump-points))
(and ;; treat end of music as begin-jump-mark END-OF-PIECE
(equal? (car x) 'END-OF-PIECE)
(null? next-el)))
x
#f))
chained-jumps))
(this-jump-instruction (assq-ref jump-marks current-pos))
(this-jump-instruction (if this-jump-instruction this-jump-instruction '())))
(if this-j-point ;; reached a triggered jump
(begin
(set! current-pos (assoc-get (cdr this-j-point) jump-points))
(set! chained-jumps (delete this-j-point chained-jumps)))
(if (or (null? this-jump-instruction) (not (car this-jump-instruction))) ;; no active jump-mark was found
(if (or (null? next-el) (eq? current-pos (assoc-get current-fine jump-points))) ;; no jump and no more music or at fine
(break)
(set! current-pos next-el)) ;; set to next element
(let* ((now-jump (car this-jump-instruction)) ;; found am active jump mark, perform jump
(first-jump (first now-jump))
(following-jumps (second now-jump))
(this-fine (if (> (length now-jump) 2)
(third now-jump)
#f)))
(set! current-pos (assoc-get first-jump jump-points))
(set! chained-jumps (append following-jumps chained-jumps))
(if this-fine
(set! current-fine this-fine)))))
(if (not (null? this-jump-instruction))
(set! jump-marks (assq-set! jump-marks mem-pos (cdr this-jump-instruction))))))))
(walk-search-music music)
(build-music)
(ly:music-set-property! music 'elements (reverse result-music))
music))
jumpPoint =
#(define-music-function (mark music) (symbol? ly:music?)
(ly:music-set-property! music 'jump-points
(cons mark
(ly:music-property music 'jump-points)))
music)
jumpMark =
#(define-music-function (dets music) (list? ly:music?)
(ly:music-set-property! music 'jump-details dets)
music)
%\unfoldJumpMarks { c' d' e' f' g' a' b' c'' }
%\unfoldJumpMarks { c' d' e' f' \jumpPoint BEGIN-OF-PIECE g' a' b' c'' }
{ \tweak color #red c'^"begin" d' e' \jumpPoint fine \tweak color #green f'^"fine"
\jumpPoint segno \tweak color #blue g'^"segno" a' b'
\jumpMark #'((BEGIN-OF-PIECE ((fine . BEGIN-OF-PIECE)))
(segno ((END-OF-PIECE . BEGIN-OF-PIECE)) fine))
\tweak color #yellow c''^\markup\column{ "(1) D.C.→fine & D.C.→'()" "(2) D.S.→END & D.C.→fine" }
d'' e'' f'' g''
}
{\omit TextScript
\unfoldJumpMarks
{ \tweak color #red c'^"begin" d' e' \jumpPoint fine \tweak color #green f'^"fine"
\jumpPoint segno \tweak color #blue g'^"segno" a' b'
\jumpMark #'((BEGIN-OF-PIECE ((fine . BEGIN-OF-PIECE)))
(segno ((END-OF-PIECE . BEGIN-OF-PIECE)) fine))
\tweak color #yellow c''^\markup\column{ "(1) D.C.→fine & D.C.→'()" "(2) D.S.→END & D.C.→fine" }
d'' e'' f'' g''
}
}
signature.asc
Description: This is a digitally signed message part.
