]> git.donarmstrong.com Git - lilypond.git/blobdiff - scm/part-combiner.scm
* lily/multi-measure-rest-engraver.cc (process_music): extra check
[lilypond.git] / scm / part-combiner.scm
index 2fa2d51d76d3a13676cb9c98d9b2ff4ec06801d4..5730a7e005fed8912a6d3a306bcb05fd6d12fd10 100644 (file)
 (define-class <Voice-state> ()
   (event-list #:init-value '() #:accessor events #:init-keyword #:events)
   (when-moment #:accessor when #:init-keyword #:when)
-  (split-idx #:accessor split-idx)
+  (split-index #:accessor split-index)
   (vector-index)
   (state-vector)
+
+
+  ;;;
+  ; spanner-state is an alist
+  ; of (SYMBOL . RESULT-INDEX), which indicates where
+  ; said spanner was started.
   (spanner-state #:init-value '() #:accessor span-state)
   )
   
+(define-method (write (x <Voice-state> ) file)
+  (display (when x) file)
+  (display " evs = " file)
+  (display (events x) file)
+  (display " active = " file)
+  (display (span-state x) file)
+  (display "\n" file)
+  )
 
 (define-method (note-events (vs <Voice-state>))
   (define (f? x)
@@ -29,6 +43,8 @@
   (synced  #:init-keyword #:synced #:init-value  #f #:getter synced?)
   )
 
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
 (define-method (previous-voice-state (vs <Voice-state>))
   (let* ((i (slot-ref vs 'vector-index))
         (v (slot-ref vs 'state-vector))
               '())
         ))
 
-(define-method (write (x <Voice-state> ) file)
-  (display (when x) file)
-  (display " evs = " file)
-  (display (events x) file)
-  (display " active = " file)
-  (display (span-state x) file)
-  (display "\n" file)
-  )
 
 (define-method (write (x <Split-state> ) f)
   (display (when x) f)
@@ -115,9 +123,9 @@ Voice-state objects
                ) #f))
         )
       (if s1
-         (set! (split-idx s1) ss-idx))
+         (set! (split-index s1) ss-idx))
       (if s2
-         (set! (split-idx s2) ss-idx))
+         (set! (split-index s2) ss-idx))
       
       (if min
          (helper (1+ ss-idx)
@@ -150,6 +158,13 @@ Voice-state objects
       (if (equal? (ly:get-mus-property ev 'name) 'NoteEvent)
          (assoc-remove! active 'tie)
          active) )
+
+    (define (analyse-absdyn-end active ev)
+      (if (equal? (ly:get-mus-property ev 'name) 'AbsoluteDynamicEvent)
+         (assoc-remove!
+          (assoc-remove! active 'cresc)
+          'decr)
+         active) )
     
     (define (active<? a b)
       (cond
@@ -175,7 +190,9 @@ Voice-state objects
        (if (and (symbol? key) (ly:dir? sp))
            (if (= sp STOP)
                (assoc-remove! active key)
-               (acons key index active))
+               (acons key
+                      (split-index (vector-ref voice-state-vec index))
+                      active))
            active)
        ))
 
@@ -187,15 +204,29 @@ Voice-state objects
            (run-analyzer analyzer (analyzer active (car evs)) (cdr evs))
            active
            ))
+      (define (run-analyzers analyzers active evs)
+       (if (pair? analyzers)
+           (run-analyzers
+            (cdr analyzers)
+            (run-analyzer (car analyzers) active evs)
+            evs)
+           active
+       ))
+
+      
 
       (sort
 
        ;; todo: use fold or somesuch.
-       (run-analyzer
-       analyse-span-event
-       (run-analyzer
-        analyse-tie-start
-        (run-analyzer analyse-tie-end active evs) evs) evs)
+       (run-analyzers
+       (list
+        analyse-absdyn-end
+        analyse-span-event
+             
+        ;; note: tie-start/span comes after tie-end/absdyn.
+        analyse-tie-end analyse-tie-start)
+
+        active evs)
        
        active<?))
 
@@ -289,8 +320,7 @@ Only set if not set previously.
       (define (copy-one-state key-idx)
        (let*
            ((idx (cdr key-idx))
-            (start-vs (vector-ref state-vec idx))
-            (prev-ss (vector-ref result (split-idx start-vs)))
+            (prev-ss (vector-ref result idx))
             (prev (configuration prev-ss))
             )
          (if (symbol? prev)
@@ -430,7 +460,7 @@ Only set if not set previously.
     
      (define (previous-config vs)
        (let*  ((pvs (previous-voice-state vs))
-              (spi (if pvs (split-idx pvs) #f))
+              (spi (if pvs (split-index pvs) #f))
               (prev-split (if spi (vector-ref result spi) #f))
               )
         
@@ -481,9 +511,8 @@ Only set if not set previously.
           ((now-state (vector-ref result ri))
            (vs1 (car (voice-states now-state)))
            (vs2 (cdr (voice-states now-state)))
-           
-           (notes1 (note-events vs1))
-           (notes2 (note-events vs2))
+           (notes1 (if vs1 (note-events vs1) '()))
+           (notes2 (if vs2 (note-events vs2) '()))
            (n1 (length notes1))
            (n2 (length notes2))
            )