(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)
(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)
) #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)
(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
(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)
))
(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<?))
(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)
(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))
)
((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))
)