X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpart-combine-music-iterator.cc;h=3e0fccef6e5e559ac7d274ba85ff1ee8931c3938;hb=38655bc28e73a0b218ba1582bdb84bab0fdfec4b;hp=754b1023bbf74d8e7affd0ec0a61bf64284f55af;hpb=45bae7c4e36d595cf545c85a53ff14c95bf4cf9c;p=lilypond.git diff --git a/lily/part-combine-music-iterator.cc b/lily/part-combine-music-iterator.cc index 754b1023bb..3e0fccef6e 100644 --- a/lily/part-combine-music-iterator.cc +++ b/lily/part-combine-music-iterator.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000 Jan Nieuwenhuizen + (c) 2000--2002 Jan Nieuwenhuizen */ #include "part-combine-music.hh" @@ -11,6 +11,7 @@ #include "translator-group.hh" #include "musical-request.hh" #include "music-sequence.hh" +#include "lily-guile.hh" #include "warn.hh" Part_combine_music_iterator::Part_combine_music_iterator () @@ -27,6 +28,18 @@ Part_combine_music_iterator::~Part_combine_music_iterator () delete first_iter_p_; } +Part_combine_music_iterator::Part_combine_music_iterator (Part_combine_music_iterator const &src) + : Music_iterator (src) +{ + second_iter_p_ = src.second_iter_p_ ? src.second_iter_p_->clone () : 0; + first_iter_p_ = src.first_iter_p_ ? src.first_iter_p_->clone () : 0; + + first_until_ = src.first_until_; + second_until_ = src.second_until_; + state_ = src.state_; + suffix_ = src.suffix_; +} + Moment Part_combine_music_iterator::pending_moment () const { @@ -49,7 +62,7 @@ Part_combine_music_iterator::ok () const void Part_combine_music_iterator::construct_children () { - Part_combine_music const * m = dynamic_cast (music_l_); + Part_combine_music const * m = dynamic_cast (music_l ()); first_iter_p_ = get_iterator_p (m->first_l ()); second_iter_p_ = get_iterator_p (m->second_l ()); @@ -72,7 +85,7 @@ Part_combine_music_iterator::change_to (Music_iterator *it, String to_type, If \translator Staff = bass, then look for Staff = * */ - while (current && current->type_str_ != to_type) + while (current && current->type_str_ != to_type) { last = current; current = current->daddy_trans_l_; @@ -90,7 +103,7 @@ Part_combine_music_iterator::change_to (Music_iterator *it, String to_type, Translator_group * dest = it->report_to_l ()->find_create_translator_l (to_type, to_id); current->remove_translator_p (last); - dest->add_group_translator (last); + dest->add_used_group_translator (last); } else { @@ -107,18 +120,26 @@ Part_combine_music_iterator::change_to (Music_iterator *it, String to_type, } +// SCM*, moet / kan dat niet met set_x ofzo? static void -get_music_info (Moment m, Music_iterator* iter, Array *pitches, Array *durations) +get_music_info (Moment m, Music_iterator* iter, SCM *pitches, SCM *durations) { if (iter->ok ()) { - for (SCM i = iter->get_music (m); gh_pair_p (i); i = gh_cdr (i)) + for (SCM i = iter->get_music (m); gh_pair_p (i); i = ly_cdr (i)) { - Music *m = unsmob_music (gh_car (i)); + Music *m = unsmob_music (ly_car (i)); if (Melodic_req *r = dynamic_cast (m)) - pitches->push (r->pitch_); + *pitches = gh_cons (r->get_mus_property ("pitch"), *pitches); if (Rhythmic_req *r = dynamic_cast (m)) - durations->push (r->duration_); + { + SCM d = r->get_mus_property ("duration"); + if (d == SCM_EOL) + r->origin ()->warning ("Rhythmic_req has no duration\n"); + else + // *durations = gh_cons (r->get_mus_property ("duration"), *durations); + *durations = gh_cons (d, *durations); + } } } } @@ -127,19 +148,23 @@ int Part_combine_music_iterator::get_state (Moment) { int state = UNKNOWN; - Part_combine_music const *p = dynamic_cast (music_l_); - Translator_group *first_translator = first_iter_p_->report_to_l ()->find_create_translator_l (p->what_str_, "one" + suffix_); + Part_combine_music const *p = dynamic_cast (music_l ()); + + String w = ly_scm2string (p->get_mus_property ("what")); + + + Translator_group *first_translator = first_iter_p_->report_to_l ()->find_create_translator_l (w, "one" + suffix_); - SCM s = first_translator->get_property (ly_symbol2scm ("changeMoment")); + SCM s = first_translator->get_property ("changeMoment"); if (!gh_pair_p (s)) return state; - Moment change_mom = *unsmob_moment (gh_car (s)); - Moment diff_mom = *unsmob_moment (gh_cdr (s)); + Moment change_mom = *unsmob_moment (ly_car (s)); + Moment diff_mom = *unsmob_moment (ly_cdr (s)); Moment now = pending_moment (); - if (!now.mod_rat (change_mom)) + if (!now.main_part_.mod_rat (change_mom.main_part_)) { SCM interval = SCM_BOOL_F; if (first_until_ < now) @@ -171,104 +196,112 @@ Part_combine_music_iterator::get_state (Moment) pending = first_iter->pending_moment () pending_moment (); last_pending = pending; - Array first_pitches; - Array first_durations; - get_music_info (pending, first_iter, &first_pitches, &first_durations); + SCM first_pitches = SCM_EOL; + SCM first_durations = SCM_EOL; + get_music_info (pending, first_iter, + &first_pitches, &first_durations); - Array second_pitches; - Array second_durations; - get_music_info (pending, second_iter, &second_pitches, &second_durations); + SCM second_pitches = SCM_EOL; + SCM second_durations = SCM_EOL; + get_music_info (pending, second_iter, + &second_pitches, &second_durations); - if (first_pitches.size () && second_pitches.size ()) + if (first_pitches != SCM_EOL && second_pitches != SCM_EOL) { - first_pitches.sort (Musical_pitch::compare); - second_pitches.sort (Musical_pitch::compare); - interval = gh_int2scm (first_pitches.top ().steps () - - second_pitches[0].steps ()); + scm_sort_list_x (first_pitches, + scm_primitive_eval (ly_symbol2scm ("Pitch::less_p"))); + scm_sort_list_x (second_pitches, + scm_primitive_eval (ly_symbol2scm ("Pitch::less_p"))); + + interval = gh_int2scm (unsmob_pitch (ly_car (first_pitches))->steps () + - unsmob_pitch (ly_car (scm_last_pair (second_pitches)))->steps ()); } - if (first_durations.size ()) + + if (first_durations != SCM_EOL) { - first_durations.sort (Duration::compare); - first_mom += first_durations.top ().length_mom (); + scm_sort_list_x (first_durations, + scm_primitive_eval (ly_symbol2scm ("Duration::less_p"))); + first_mom += unsmob_duration (ly_car (first_durations))->length_mom (); } - - if (second_durations.size ()) + + if (second_durations != SCM_EOL) { - second_durations.sort (Duration::compare); - second_mom += second_durations.top ().length_mom (); + scm_sort_list_x (second_durations, + scm_primitive_eval (ly_symbol2scm ("Duration::less_p"))); + second_mom += unsmob_duration (ly_car (second_durations))->length_mom (); } - - if (!first_pitches.empty () && second_pitches.empty () - && !(second_until_ > now)) + + if (first_pitches != SCM_EOL && second_pitches == SCM_EOL + && ! (second_until_ > now)) { state |= UNRELATED; state &= ~UNISILENCE; - if (!(state & ~(UNRELATED | SOLO1 | UNISILENCE))) + if (! (state & ~ (UNRELATED | SOLO1 | UNISILENCE))) state |= SOLO1; } else state &= ~SOLO1; - if (first_pitches.empty () && !second_pitches.empty () - && !(first_until_ > now)) + if (first_pitches == SCM_EOL && second_pitches != SCM_EOL + && ! (first_until_ > now)) { state |= UNRELATED; state &= ~UNISILENCE; - if (!(state & ~(UNRELATED | SOLO2 | UNISILENCE))) + if (! (state & ~ (UNRELATED | SOLO2 | UNISILENCE))) state |= SOLO2; } else state &= ~SOLO2; - if (!compare (&first_durations, &second_durations)) + if (gh_equal_p (first_durations, second_durations)) { state &= ~UNISILENCE; - if (!(state & ~(UNIRHYTHM | UNISON))) + if (! (state & ~ (UNIRHYTHM | UNISON))) state |= UNIRHYTHM; } else - state &= ~(UNIRHYTHM | UNISILENCE); + state &= ~ (UNIRHYTHM | UNISILENCE); - if (!first_pitches.empty () - &&!compare (&first_pitches, &second_pitches)) + if (first_pitches != SCM_EOL + && gh_equal_p (first_pitches, second_pitches)) { state &= ~UNISILENCE; - if (!(state & ~(UNIRHYTHM | UNISON))) + if (! (state & ~ (UNIRHYTHM | UNISON))) state |= UNISON; } else - state &= ~(UNISON); + state &= ~ (UNISON); - if (first_pitches.empty () && second_pitches.empty ()) + if (first_pitches == SCM_EOL && second_pitches == SCM_EOL) { - if (!(state & ~(UNIRHYTHM | UNISILENCE))) + if (! (state & ~ (UNIRHYTHM | UNISILENCE))) state |= UNISILENCE; } else if (!state) state |= UNRELATED; else - state &= ~(UNISILENCE); + state &= ~ (UNISILENCE); if (gh_number_p (interval)) { - SCM s = first_translator->get_property (ly_symbol2scm ("splitInterval")); + SCM s = first_translator->get_property ("splitInterval"); int i = gh_scm2int (interval); if (gh_pair_p (s) - && gh_number_p (gh_car (s)) - && gh_number_p (gh_cdr (s)) - && i >= gh_scm2int (gh_car (s)) - && i <= gh_scm2int (gh_cdr (s))) + && gh_number_p (ly_car (s)) + && gh_number_p (ly_cdr (s)) + && i >= gh_scm2int (ly_car (s)) + && i <= gh_scm2int (ly_cdr (s))) { - if (!(state & ~(SPLIT_INTERVAL | UNIRHYTHM | UNISON))) + if (! (state & ~ (SPLIT_INTERVAL | UNIRHYTHM | UNISON))) state |= SPLIT_INTERVAL; } else - state &= ~(SPLIT_INTERVAL); + state &= ~ (SPLIT_INTERVAL); } - if (first && !first_pitches.empty ()) + if (first && first_pitches != SCM_EOL) first_until_ = first_mom; - if (first && !second_pitches.empty ()) + if (first && second_pitches != SCM_EOL) second_until_ = second_mom; first = false; @@ -284,6 +317,8 @@ Part_combine_music_iterator::get_state (Moment) return state; } +static Span_req* abort_req = NULL; + void Part_combine_music_iterator::process (Moment m) { @@ -310,7 +345,7 @@ Part_combine_music_iterator::process (Moment m) else state = state_; - Part_combine_music const *p = dynamic_cast (music_l_); + Part_combine_music const *p = dynamic_cast (music_l ()); bool previously_combined_b = first_iter_p_->report_to_l ()->daddy_trans_l_ @@ -318,23 +353,43 @@ Part_combine_music_iterator::process (Moment m) bool combine_b = previously_combined_b; - if (!(state & UNIRHYTHM) + if (! (state & UNIRHYTHM) || (state & SPLIT_INTERVAL) || (state & (SOLO1 | SOLO2))) combine_b = false; else if (state & (UNIRHYTHM | UNISILENCE)) combine_b = true; + /* + When combining, abort all running spanners + */ + + if (!abort_req) + { + abort_req = new Span_req; + abort_req->set_mus_property ("span-type", ly_str02scm ("abort")); + } + + if (combine_b && combine_b != previously_combined_b) + { + if (second_iter_p_ && second_iter_p_->ok ()) + second_iter_p_->try_music (abort_req); + } + String w = ly_scm2string (p->get_mus_property ("what")); if (combine_b != previously_combined_b) - change_to (second_iter_p_, p->what_str_, (combine_b ? "one" : "two") + change_to (second_iter_p_, w, (combine_b ? "one" : "two") + suffix_); + + Translator_group *first_translator = first_iter_p_->report_to_l ()->find_create_translator_l (w, "one" + suffix_); + Translator_group *second_translator = second_iter_p_->report_to_l ()->find_create_translator_l (w, "two" + suffix_); + - Translator_group *first_translator = first_iter_p_->report_to_l ()->find_create_translator_l (p->what_str_, "one" + suffix_); - Translator_group *second_translator = second_iter_p_->report_to_l ()->find_create_translator_l (p->what_str_, "two" + suffix_); - - /* - hmm - */ + /* Hmm */ + first_translator->set_property ("combineParts", SCM_BOOL_T); + second_translator ->set_property ("combineParts", SCM_BOOL_T); + + + /* hmm */ SCM b = (state & UNIRHYTHM) ? SCM_BOOL_T : SCM_BOOL_F; first_translator->set_property ("unirhythm", b); second_translator->set_property ("unirhythm", b); @@ -386,3 +441,5 @@ Part_combine_music_iterator::get_music (Moment m)const s = gh_append2 (second_iter_p_->get_music (m),s); return s; } + +IMPLEMENT_CTOR_CALLBACK (Part_combine_music_iterator);