X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=scm%2Fpart-combiner.scm;h=7deeeeb4815615f4ffb5e9ff48b1dcda321a716a;hb=9def640bf6a0a5feb863c75c8a31e138fbe4043b;hp=0e72ebe2a057eef1f4284e9c4d69fa3c4e20ee94;hpb=1528c75809ebc59d93018dbf59559436f75f082b;p=lilypond.git diff --git a/scm/part-combiner.scm b/scm/part-combiner.scm index 0e72ebe2a0..7deeeeb481 100644 --- a/scm/part-combiner.scm +++ b/scm/part-combiner.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2004--2011 Han-Wen Nienhuys +;;;; Copyright (C) 2004--2012 Han-Wen Nienhuys ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by @@ -41,7 +41,7 @@ (define-method (note-events (vs )) (define (f? x) - (equal? (ly:event-property x 'class) 'note-event)) + (ly:in-event-class? x 'note-event)) (filter f? (events vs))) (define-method (previous-voice-state (vs )) @@ -130,30 +130,30 @@ Voice-state objects "Analyse EVS at INDEX, given state ACTIVE." (define (analyse-tie-start active ev) - (if (equal? (ly:event-property ev 'class) 'tie-event) + (if (ly:in-event-class? ev 'tie-event) (acons 'tie (split-index (vector-ref voice-state-vec index)) active) active)) (define (analyse-tie-end active ev) - (if (equal? (ly:event-property ev 'class) 'note-event) + (if (ly:in-event-class? ev 'note-event) (assoc-remove! active 'tie) active)) (define (analyse-absdyn-end active ev) - (if (or (equal? (ly:event-property ev 'class) 'absolute-dynamic-event) - (and (equal? (ly:event-property ev 'class) 'crescendo-event) + (if (or (ly:in-event-class? ev 'absolute-dynamic-event) + (and (ly:in-event-class? ev 'span-dynamic-event) (equal? STOP (ly:event-property ev 'span-direction)))) (assoc-remove! (assoc-remove! active 'cresc) 'decr) active)) (define (activevector (reverse! (cdar context-list) - '())))))) + (voicename (get-next-unique-voice-name)) + ;; recording-group-emulate returns an assoc list (reversed!), so + ;; hand it a proper unique context name and extract that key: + (ctx-spec (context-spec-music mus 'Voice voicename)) + (listener (ly:parser-lookup parser 'partCombineListener)) + (context-list (reverse (recording-group-emulate ctx-spec listener))) + (raw-voice (assoc voicename context-list)) + (quote-contents (if (pair? raw-voice) (cdr raw-voice) '()))) + + ;; If the context-specced quoted music does not contain anything, try to + ;; use the first child, i.e. the next in context-list after voicename + ;; That's the case e.g. for \addQuote "x" \relative c \new Voice {...} + (if (null? quote-contents) + (let find-non-empty ((current-tail (member raw-voice context-list))) + ;; if voice has contents, use them, otherwise check next ctx + (cond ((null? current-tail) #f) + ((and (pair? (car current-tail)) + (pair? (cdar current-tail))) + (set! quote-contents (cdar current-tail))) + (else (find-non-empty (cdr current-tail)))))) + + (if (not (null? quote-contents)) + (hash-set! tab name (list->vector (reverse! quote-contents '()))) + (ly:music-warning mus (ly:format (_ "quoted music `~a' is empty") name)))))