A few days ago, this enhancement request
http://code.google.com/p/lilypond/issues/detail?id=824
has been mentioned.
I don't think that the following snippet (see joined file) can be integrated
as a patch for Lilypond, so it is rather a workaround, but it seems to work.
To use it, you need a file "extractMusic.ly" that you can download here :
       http://gillesth.free.fr/Lilypond/     in the extractMusic  directory

Gilles

\include "extractMusic.ly"

#(define (anchor->moment music sym)
(let ((moment moment-null)
      (find? #f))
  (let loop ((evt music)) 
    (let ((e (ly:music-property evt 'element))
          (es (ly:music-property evt 'elements))
          (name (ly:music-property evt 'name)))
      (cond       
        ((eq? name 'EventChord)
              (set! moment (ly:moment-add moment (ly:music-length evt)))
              (if (and (pair? es)
                       (eq? 'SkipEvent (ly:music-property (car es) 'name))
                       (memq sym (ly:music-property evt 'tags)))
                 (set! find? #t)))
         ((ly:duration? (ly:music-property evt 'duration))  ; MultiMeasureRest
             (set! moment (ly:moment-add moment (ly:music-length evt))))         
         ((eq? name 'SimultaneousMusic)
            (let ((save-mom moment)
                  (max-mom moment))
              (while (pair? es)(begin
                  (loop (car es))
                  (if find? (break))
                  (if (ly:moment<? max-mom moment)(set! max-mom moment))
                  (set! moment save-mom)
                  (set! es (cdr es))))
              (set! moment max-mom)))
         (else 
            (if (ly:music? e) 
              (let ((count (ly:music-property evt 'repeat-count)))
                (if (and (integer? count) 
                         (null? es)
                         (not (eq? name 'VoltaRepeatedMusic)))
                  (loop (make-sequential-music (make-list count e)))        
                  (loop e))))
            (while (and (pair? es)(not find?))(begin      ; sequential music
               (loop (car es))     
               (set! es (cdr es))))))))                         
 moment))

addAt = #(define-music-function (parser location sym music insertMusic)
                                          (symbol? ly:music? ly:music?)
(let ((where (make-music 'EventChord 'elements
         (list (make-music 'SkipEvent 'duration 
            (make-duration-of-length (anchor->moment music sym)))))))                                          
#{ 
      \insertMusic $music $where $insertMusic
#}))

anchor = #(define-music-function (parser location sym)(symbol?)
#{ \tag $sym s1*0  #})


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

global = \relative c'
{
 \time 4/4 s4*4*10
 \time 3/4 s4*3*5
 \time 7/4 s4*7
 \time 4/4 \anchor #'coda s4*4*10
 \bar "|."
}

\new Voice \addAt #'coda \global {\tempo \markup "Extremely slow"}




 
_______________________________________________
lilypond-devel mailing list
lilypond-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/lilypond-devel

Reply via email to