From: Dan Eble Date: Sun, 28 Jun 2015 12:40:58 +0000 (-0400) Subject: Auto_change_iterator: move some state from C++ to Scheme X-Git-Tag: release/2.19.23-1~20 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=2609364accddd6b7b396932e91ce8f432b46a407;p=lilypond.git Auto_change_iterator: move some state from C++ to Scheme This simplifies the iterator and prepares it for future combination with partcombine code. --- diff --git a/lily/auto-change-iterator.cc b/lily/auto-change-iterator.cc index 33ca53a8cc..95784ec03b 100644 --- a/lily/auto-change-iterator.cc +++ b/lily/auto-change-iterator.cc @@ -36,15 +36,11 @@ protected: virtual void process (Moment); private: SCM split_list_; - Direction where_dir_; }; void Auto_change_iterator::process (Moment m) { - // TODO: It seems strange that this occurs before consulting the split list. - Music_wrapper_iterator::process (m); - Moment *splitm = 0; for (; scm_is_pair (split_list_); split_list_ = scm_cdr (split_list_)) @@ -53,28 +49,18 @@ Auto_change_iterator::process (Moment m) if (*splitm > m) break; - SCM tag = scm_cdar (split_list_); - Direction d = to_dir (tag); - - if (d && d != where_dir_) - { - // TODO: The function of where_dir_ in choosing the direction should - // be built into split-list generation so that this iterator merely - // effects a sequence of context changes. - where_dir_ = d; - string to_id = (d >= 0) ? "up" : "down"; - // N.B. change_to() returns an error message. Silence is the legacy - // behavior here, but maybe that should be changed. - Change_iterator::change_to (*child_iter_, - ly_symbol2scm ("Staff"), - to_id); - } + // N.B. change_to() returns an error message. Silence is the legacy + // behavior here, but maybe that should be changed. + Change_iterator::change_to (*child_iter_, + ly_symbol2scm ("Staff"), + ly_scm2string (scm_cdar (split_list_))); } + + Music_wrapper_iterator::process (m); } Auto_change_iterator::Auto_change_iterator () { - where_dir_ = CENTER; split_list_ = SCM_EOL; } diff --git a/scm/autochange.scm b/scm/autochange.scm index a6c78f7bbc..17358aebe0 100644 --- a/scm/autochange.scm +++ b/scm/autochange.scm @@ -4,7 +4,7 @@ ;; autochange.scm - fairly related to part combining. (define-public (make-autochange-music music) - (define (generate-split-list change-moment event-list acc) + (define (generate-split-list change-moment prev-dir event-list acc) (if (null? event-list) acc (let* ((now-tun (caar event-list)) @@ -15,19 +15,23 @@ evs)) (pitch (if (pair? notes) (ly:event-property (car notes) 'pitch) - #f))) + #f)) + (dir (if pitch (sign (ly:pitch-steps pitch)) 0))) ;; tail recursive. - (if (and pitch (not (= (ly:pitch-steps pitch) 0))) + (if (and (not (= dir 0)) + (not (= dir prev-dir))) (generate-split-list #f + dir (cdr event-list) (cons (cons (if change-moment change-moment now) - (sign (ly:pitch-steps pitch))) acc)) + (if (< dir 0) "down" "up")) acc)) (generate-split-list (if pitch #f now) + dir (cdr event-list) acc))))) (let* ((m (make-music 'AutoChangeMusic)) @@ -38,6 +42,7 @@ (rev (reverse! (cdar context-list))) (split (reverse! (generate-split-list #f + 0 rev '()) '())))