From bac36a28814a85dcf7afdf2cdc6a52280d2779be Mon Sep 17 00:00:00 2001 From: hanwen Date: Fri, 24 Sep 2004 09:20:27 +0000 Subject: [PATCH] * lily/drum-note-engraver.cc (try_music): idem. * lily/note-heads-engraver.cc: remove start-playing-event. * lily/part-combine-iterator.cc (Part_combine_iterator): use BusyPlayingEvent to determine which voice was active last. (unisono): use last active to where to get unisono information from. * scm/part-combiner.scm (determine-split-list): cleanups --- ChangeLog | 13 ++++ input/regression/beam-auto-knee.ly | 2 +- input/regression/chord-changes.ly | 16 ++--- input/regression/stem-direction.ly | 14 ++-- lily/drum-note-engraver.cc | 2 - lily/note-heads-engraver.cc | 2 - lily/part-combine-iterator.cc | 75 ++++++++++++-------- scm/part-combiner.scm | 107 +++++++++++++++-------------- scripts/lilypond-book.py | 4 +- 9 files changed, 135 insertions(+), 100 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9a84116b01..b6f84d3789 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2004-09-24 Han-Wen Nienhuys + + * lily/drum-note-engraver.cc (try_music): idem. + + * lily/note-heads-engraver.cc: remove start-playing-event. + + * lily/part-combine-iterator.cc (Part_combine_iterator): use + BusyPlayingEvent to determine which voice was active last. + (unisono): use last active to where to get unisono information + from. + + * scm/part-combiner.scm (determine-split-list): cleanups + 2004-09-23 Han-Wen Nienhuys * input/regression/lyric-extender.ly: simplify. diff --git a/input/regression/beam-auto-knee.ly b/input/regression/beam-auto-knee.ly index 9f243ab30a..cf052d5076 100644 --- a/input/regression/beam-auto-knee.ly +++ b/input/regression/beam-auto-knee.ly @@ -13,6 +13,6 @@ threshold. c,16[ e g c e g c c,,] } \paper{ - linewidth = 40*\staffspace + raggedright = ##t } } diff --git a/input/regression/chord-changes.ly b/input/regression/chord-changes.ly index 9f8a3dd626..8bff803b2e 100644 --- a/input/regression/chord-changes.ly +++ b/input/regression/chord-changes.ly @@ -13,15 +13,15 @@ scheme = \chordmode { } settings = { - \set chordChanges = ##t } \score { - << - \context ChordNames << \scheme \settings >> - \context Staff \transpose c c' \scheme - >> - \paper{ - linewidth = 40 * \staffspace - } + << + \context ChordNames << + \scheme + \set chordChanges = ##t + >> + \context Staff \transpose c c' \scheme + >> + \paper{ raggedright = ##t } } diff --git a/input/regression/stem-direction.ly b/input/regression/stem-direction.ly index 410856dae5..bbba000f09 100644 --- a/input/regression/stem-direction.ly +++ b/input/regression/stem-direction.ly @@ -13,15 +13,11 @@ notes, and up for low notes. " } - -\score { - \context Voice \relative c { - b''4 ~ b8(b8) e4 e, - - } - \paper { +\paper { raggedright = ##t - } - \midi { } +} +\context Voice \relative c { + b''4 ~ b8(b8) e4 e, + } diff --git a/lily/drum-note-engraver.cc b/lily/drum-note-engraver.cc index d084944ef0..4eb2326f27 100644 --- a/lily/drum-note-engraver.cc +++ b/lily/drum-note-engraver.cc @@ -46,8 +46,6 @@ Drum_notes_engraver::try_music (Music *m) } else if (m->is_mus_type ("busy-playing-event")) return events_.size (); - else if (m->is_mus_type ("start-playing-event")) - return events_.size (); return false; } diff --git a/lily/note-heads-engraver.cc b/lily/note-heads-engraver.cc index 6ab0e99a15..9bd654b3fb 100644 --- a/lily/note-heads-engraver.cc +++ b/lily/note-heads-engraver.cc @@ -45,8 +45,6 @@ Note_heads_engraver::try_music (Music *m) } else if (m->is_mus_type ("busy-playing-event")) return note_reqs_.size (); - else if (m->is_mus_type ("start-playing-event")) - return note_reqs_.size (); return false; } diff --git a/lily/part-combine-iterator.cc b/lily/part-combine-iterator.cc index 0b17fd3f48..092beed8b7 100644 --- a/lily/part-combine-iterator.cc +++ b/lily/part-combine-iterator.cc @@ -42,13 +42,21 @@ private: SCM split_list_; enum Status { - APART, TOGETHER, - SOLO1, SOLO2, - UNISONO, UNISILENCE, + APART, + TOGETHER, + SOLO1, + SOLO2, + UNISONO, + UNISILENCE, }; Status state_; Status playing_state_; + /* + Should be SOLO1 or SOLO2 + */ + Status last_playing_; + /* TODO: this is getting of hand... */ @@ -70,6 +78,24 @@ private: }; +static Music *busy_playing_event; + +void +Part_combine_iterator::do_quit () +{ + if (first_iter_) + first_iter_->quit (); + if (second_iter_) + second_iter_->quit (); + + null_.set_translator (0); + one_ .set_translator (0); + two_.set_translator (0); + shared_.set_translator (0); + solo_.set_translator (0); + +} + Part_combine_iterator::Part_combine_iterator () { first_iter_ = 0; @@ -77,6 +103,12 @@ Part_combine_iterator::Part_combine_iterator () split_list_ = SCM_EOL; state_ = APART; playing_state_ = APART; + + if (!busy_playing_event) + { + busy_playing_event + = make_music_by_name (ly_symbol2scm ("BusyPlayingEvent")); + } } void @@ -94,23 +126,7 @@ Part_combine_iterator::derived_substitute (Context *f, { if (first_iter_) first_iter_->substitute_outlet (f,t); - if (second_iter_) - second_iter_->substitute_outlet (f,t); -} -void -Part_combine_iterator::do_quit () -{ - if (first_iter_) - first_iter_->quit (); - if (second_iter_) - second_iter_->quit (); - - null_.set_translator (0); - one_ .set_translator (0); - two_.set_translator (0); - shared_.set_translator (0); - solo_.set_translator (0); } Moment @@ -229,13 +245,10 @@ Part_combine_iterator::unisono (bool silent) in the 1st voice, so in that case, we use the second voice as a basis for events. */ - Context *c1 = (state_ == SOLO2) ? null_.get_outlet() : shared_.get_outlet(); - Context *c2 = (state_ == SOLO2) ? shared_.get_outlet() : null_.get_outlet(); - + Context *c1 = (last_playing_ == SOLO2) ? null_.get_outlet() : shared_.get_outlet(); + Context *c2 = (last_playing_ == SOLO2) ? shared_.get_outlet() : null_.get_outlet(); substitute_both (c1, c2); - - - kill_mmrest ((state_ == SOLO2) + kill_mmrest ((last_playing_ == SOLO2) ? one_.get_outlet () : two_.get_outlet ()); kill_mmrest (shared_.get_outlet ()); @@ -412,10 +425,18 @@ Part_combine_iterator::process (Moment m) } if (first_iter_->ok ()) - first_iter_->process (m); + { + first_iter_->process (m); + if (first_iter_->try_music_in_children (busy_playing_event)) + last_playing_ = SOLO1; + } if (second_iter_->ok ()) - second_iter_->process (m); + { + second_iter_->process (m); + if (first_iter_->try_music_in_children (busy_playing_event)) + last_playing_ = SOLO2; + } } Music_iterator* diff --git a/scm/part-combiner.scm b/scm/part-combiner.scm index 40039f7d5c..5cc2cfb8d2 100644 --- a/scm/part-combiner.scm +++ b/scm/part-combiner.scm @@ -84,24 +84,24 @@ of Split-state objects, crosslinking the Split-state vector and Voice-state objects " (define (helper ss-idx ss-list idx1 idx2) - (let* ((s1 (if (< idx1 (vector-length vs1)) (vector-ref vs1 idx1) #f)) - (s2 (if (< idx2 (vector-length vs2)) (vector-ref vs2 idx2) #f)) - (min (cond ((and s1 s2) (moment-min (when s1) (when s2))) - (s1 (when s1)) - (s2 (when s2)) + (let* ((state1 (if (< idx1 (vector-length vs1)) (vector-ref vs1 idx1) #f)) + (state2 (if (< idx2 (vector-length vs2)) (vector-ref vs2 idx2) #f)) + (min (cond ((and state1 state2) (moment-min (when state1) (when state2))) + (state1 (when state1)) + (state2 (when state2)) (else #f))) - (inc1 (if (and s1 (equal? min (when s1))) 1 0)) - (inc2 (if (and s2 (equal? min (when s2))) 1 0)) + (inc1 (if (and state1 (equal? min (when state1))) 1 0)) + (inc2 (if (and state2 (equal? min (when state2))) 1 0)) (ss-object (if min (make #:when min - #:voice-states (cons s1 s2) + #:voice-states (cons state1 state2) #:synced (= inc1 inc2)) #f))) - (if s1 - (set! (split-index s1) ss-idx)) - (if s2 - (set! (split-index s2) ss-idx)) + (if state1 + (set! (split-index state1) ss-idx)) + (if state2 + (set! (split-index state2) ss-idx)) (if min (helper (1+ ss-idx) (cons ss-object ss-list) @@ -216,13 +216,13 @@ Voice-state objects (voice-state-vec2 (make-voice-states evl2)) (result (make-split-state voice-state-vec1 voice-state-vec2))) - (define (analyse-time-step ri) + (define (analyse-time-step result-idx) (define (put x . index) "Put the result to X, starting from INDEX backwards. Only set if not set previously. " - (let ((i (if (pair? index) (car index) ri))) + (let ((i (if (pair? index) (car index) result-idx))) (if (and (<= 0 i) (not (symbol? (configuration (vector-ref result i))))) (begin @@ -238,7 +238,7 @@ Only set if not set previously. (put prev)))) (map copy-one-state (span-state vs))) - (define (analyse-notes now-state) + (define (analyse-notes now-state) (let* ((vs1 (car (voice-states now-state))) (vs2 (cdr (voice-states now-state))) (notes1 (note-events vs1)) @@ -257,8 +257,14 @@ Only set if not set previously. ly:pitch (length notes1) 1) (put 'apart)) ((> (length notes2) 1) (put 'apart)) - ((not (= (length notes1) (length notes2))) - (put 'apart)) + ;; + ((and (= (length notes2) 1) + (= (length notes1) 0)) + (put 'playing2)) + ((and (= (length notes1) 1) + (= (length notes2) 0)) + (put 'playing1)) + ;; ((and (= (length durs1) 1) (= (length durs2) 1) (not (equal? (car durs1) (car durs2)))) @@ -288,11 +294,10 @@ Only set if not set previously. (if (and (null? (span-state vs1)) (null? (span-state vs2))) (put 'chords))))))))) - (if (< ri (vector-length result)) - (let* ((now-state (vector-ref result ri)) + (if (< result-idx (vector-length result)) + (let* ((now-state (vector-ref result result-idx)) (vs1 (car (voice-states now-state))) (vs2 (cdr (voice-states now-state)))) - (cond ((not vs1) (put 'apart)) ((not vs2) (put 'apart)) @@ -301,23 +306,25 @@ Only set if not set previously. (active2 (previous-span-state vs2)) (new-active1 (span-state vs1)) (new-active2 (span-state vs2))) - (if pc-debug - (display (list (when now-state) ri + (if #f ; debug + (display (list (when now-state) result-idx active1 "->" new-active1 active2 "->" new-active2 "\n"))) (if (and (synced? now-state) (equal? active1 active2) (equal? new-active1 new-active2)) - (analyse-notes now-state) - ;; active states different: - (put 'apart))) + (analyse-notes now-state) + + ;; active states different: + (put 'apart))) + ;; go to the next one, if it exists. - (analyse-time-step (1+ ri))))))) + (analyse-time-step (1+ result-idx))))))) - (define (analyse-a2 ri) - (if (< ri (vector-length result)) - (let* ((now-state (vector-ref result ri)) + (define (analyse-a2 result-idx) + (if (< result-idx (vector-length result)) + (let* ((now-state (vector-ref result result-idx)) (vs1 (car (voice-states now-state))) (vs2 (cdr (voice-states now-state)))) (if (and (equal? (configuration now-state) 'chords) @@ -332,9 +339,9 @@ Only set if not set previously. ((and (= 0 (length notes1)) (= 0 (length notes2))) (set! (configuration now-state) 'unisilence))))) - (analyse-a2 (1+ ri))))) + (analyse-a2 (1+ result-idx))))) - (define (analyse-solo12 ri) + (define (analyse-solo12 result-idx) (define (previous-config vs) (let* ((pvs (previous-voice-state vs)) @@ -352,7 +359,7 @@ Only set if not set previously. (define (put x) ;; (display (list "putting " x "\n")) - (set! (configuration (vector-ref result ri)) x)) + (set! (configuration (vector-ref result result-idx)) x)) (define (current-voice-state now-state voice-num) (define vs ((if (= 1 voice-num) car cdr) @@ -369,13 +376,11 @@ the mark when there are no spanners active." (solo-state (current-voice-state now-state (if (equal? type 'solo1) 1 2))) (silent-state (current-voice-state now-state (if (equal? type 'solo1) 2 1))) (silent-notes (if silent-state (note-events silent-state) '())) - (solo-notes (if solo-state (note-events solo-state) '())) - (soln (length solo-notes)) - (siln (length silent-notes))) + (solo-notes (if solo-state (note-events solo-state) '()))) ;; (display (list "trying " type " at " (when now-state) solo-state silent-state "\n")) (cond ((not (equal? (configuration now-state) 'apart)) current-idx) - ((> siln 0) start-idx) + ((> (length silent-notes) 0) start-idx) ((not solo-state) (put-range type start-idx current-idx) current-idx) @@ -393,9 +398,9 @@ the mark when there are no spanners active." (try-solo type start-idx (1+ current-idx))))) start-idx)) ; try-solo - (define (analyse-moment ri) - "Analyse 'apart starting at RI. Return next index. " - (let* ((now-state (vector-ref result ri)) + (define (analyse-moment result-idx) + "Analyse 'apart starting at RESULT-IDX. Return next index. " + (let* ((now-state (vector-ref result result-idx)) (vs1 (current-voice-state now-state 1)) (vs2 (current-voice-state now-state 2)) ;; (vs1 (car (voice-states now-state))) @@ -404,26 +409,28 @@ the mark when there are no spanners active." (notes2 (if vs2 (note-events vs2) '())) (n1 (length notes1)) (n2 (length notes2))) - ;; (display (list "analyzing step " ri " moment " (when now-state) vs1 vs2 "\n")) + ;; (display (list "analyzing step " result-idx " moment " (when now-state) vs1 vs2 "\n")) (max ; we should always increase. + (cond ((and (= n1 0) (= n2 0)) (put 'apart-silence) - (1+ ri)) + (1+ result-idx)) ((and (= n2 0) (equal? (when vs1) (when now-state)) (null? (previous-span-state vs1))) - (try-solo 'solo1 ri ri)) + (try-solo 'solo1 result-idx result-idx)) ((and (= n1 0) (equal? (when vs2) (when now-state)) (null? (previous-span-state vs2))) - (try-solo 'solo2 ri ri)) - (else (1+ ri))) - (1+ ri)))) ; analyse-moment + (try-solo 'solo2 result-idx result-idx)) + + (else (1+ result-idx))) + (1+ result-idx)))) ; analyse-moment - (if (< ri (vector-length result)) - (if (equal? (configuration (vector-ref result ri)) 'apart) - (analyse-solo12 (analyse-moment ri)) - (analyse-solo12 (1+ ri))))) ; analyse-solo12 + (if (< result-idx (vector-length result)) + (if (equal? (configuration (vector-ref result result-idx)) 'apart) + (analyse-solo12 (analyse-moment result-idx)) + (analyse-solo12 (1+ result-idx))))) ; analyse-solo12 (analyse-spanner-states voice-state-vec1) (analyse-spanner-states voice-state-vec2) @@ -438,7 +445,7 @@ the mark when there are no spanners active." (analyse-time-step 0) ;; (display result) (analyse-a2 0) - ;; (display result) + ;;(display result) (analyse-solo12 0) ;; (display result) (set! result (map diff --git a/scripts/lilypond-book.py b/scripts/lilypond-book.py index 44ba8e60ff..fce5bb106d 100644 --- a/scripts/lilypond-book.py +++ b/scripts/lilypond-book.py @@ -835,9 +835,11 @@ def is_derived_class (cl, baseclass): def process_snippets (cmd, ly_snippets, png_snippets): ly_names = filter (lambda x: x, map (Lilypond_snippet.basename, ly_snippets)) png_names = filter (lambda x: x, map (Lilypond_snippet.basename, png_snippets)) + + status = 0 if ly_names: - ly.system (string.join ([cmd] + ly_names), progress_p = 1) + status = ly.system (string.join ([cmd] + ly_names), progress_p = 1) if format == HTML or format == TEXINFO: for i in png_names: -- 2.39.5