X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpart-combine-iterator.cc;h=06449fb5dca228c13dd6a9daa0269cbce80c400e;hb=e29263c6686bef25d29d0831de802bf8d524447e;hp=5bd85b05b372fb4c8aad6934f0b5f857dfbd7dfa;hpb=bb8a0a5387af94dd2702877256334b160575a730;p=lilypond.git diff --git a/lily/part-combine-iterator.cc b/lily/part-combine-iterator.cc index 5bd85b05b3..06449fb5dc 100644 --- a/lily/part-combine-iterator.cc +++ b/lily/part-combine-iterator.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2011 Han-Wen Nienhuys + Copyright (C) 2004--2012 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -65,6 +65,11 @@ private: Moment start_moment_; SCM split_list_; + SCM direction_; + SCM directionOne_; + SCM directionTwo_; + SCM horizontalShiftOne_; + SCM horizontalShiftTwo_; Stream_event *unisono_event_; Stream_event *solo_one_event_; @@ -89,7 +94,7 @@ private: Status last_playing_; /* - TODO: this is getting of hand... + TODO: this is getting off hand... */ Context_handle handles_[NUM_OUTLETS]; @@ -116,7 +121,7 @@ Part_combine_iterator::do_quit () // Add listeners to all contexts except Devnull. for (int i = 0; i < NUM_OUTLETS; i++) { - Context *c = handles_[i].get_outlet (); + Context *c = handles_[i].get_context (); if (c->is_alias (ly_symbol2scm ("Voice"))) c->event_source ()->remove_listener (GET_LISTENER (set_busy), ly_symbol2scm ("music-event")); handles_[i].set_context (0); @@ -133,8 +138,14 @@ Part_combine_iterator::Part_combine_iterator () first_iter_ = 0; second_iter_ = 0; split_list_ = SCM_EOL; + direction_ = SCM_BOOL_F; + directionOne_ = scm_from_int (1); + directionTwo_ = scm_from_int (-1); + horizontalShiftOne_ = scm_from_int (0); + horizontalShiftTwo_ = scm_from_int (1); state_ = APART; playing_state_ = APART; + last_playing_ = APART; busy_ = false; notice_busy_ = false; @@ -147,18 +158,14 @@ Part_combine_iterator::derived_mark () const scm_gc_mark (first_iter_->self_scm ()); if (second_iter_) scm_gc_mark (second_iter_->self_scm ()); - - Stream_event *ptrs[] = - { - unisono_event_, - mmrest_event_, - solo_two_event_, - solo_one_event_, - 0 - }; - for (int i = 0; ptrs[i]; i++) - if (ptrs[i]) - scm_gc_mark (ptrs[i]->self_scm ()); + if (unisono_event_) + scm_gc_mark (unisono_event_->self_scm ()); + if (mmrest_event_) + scm_gc_mark (mmrest_event_->self_scm ()); + if (solo_one_event_) + scm_gc_mark (solo_one_event_->self_scm ()); + if (solo_two_event_) + scm_gc_mark (solo_two_event_->self_scm ()); } void @@ -200,7 +207,7 @@ Part_combine_iterator::substitute_both (Outlet_type to1, { for (int j = 0; j < NUM_OUTLETS; j++) if (j != tos[i]) - mis[i]->substitute_outlet (handles_[j].get_outlet (), handles_[tos[i]].get_outlet ()); + mis[i]->substitute_outlet (handles_[j].get_context (), handles_[tos[i]].get_context ()); } for (int j = 0; j < NUM_OUTLETS; j++) @@ -216,12 +223,14 @@ Part_combine_iterator::kill_mmrest (int in) if (!mmrest_event_) { - mmrest_event_ = new Stream_event (ly_symbol2scm ("multi-measure-rest-event")); + mmrest_event_ = new Stream_event + (handles_[in].get_context ()->make_event_class + (ly_symbol2scm ("multi-measure-rest-event"))); mmrest_event_->set_property ("duration", SCM_EOL); mmrest_event_->unprotect (); } - handles_[in].get_outlet ()->event_source ()->broadcast (mmrest_event_); + handles_[in].get_context ()->event_source ()->broadcast (mmrest_event_); } void @@ -241,21 +250,21 @@ Part_combine_iterator::unisono (bool silent) Outlet_type c1 = (last_playing_ == SOLO2) ? CONTEXT_NULL : CONTEXT_SHARED; Outlet_type c2 = (last_playing_ == SOLO2) ? CONTEXT_SHARED : CONTEXT_NULL; substitute_both (c1, c2); - kill_mmrest ((last_playing_ == SOLO2) - ? CONTEXT_ONE : CONTEXT_TWO); + kill_mmrest ((last_playing_ == SOLO2) ? CONTEXT_ONE : CONTEXT_TWO); kill_mmrest (CONTEXT_SHARED); if (playing_state_ != UNISONO && newstate == UNISONO) { + Context *out = (last_playing_ == SOLO2 ? second_iter_ : first_iter_) + ->get_outlet (); if (!unisono_event_) { - unisono_event_ = new Stream_event (ly_symbol2scm ("unisono-event")); + unisono_event_ = new Stream_event + (out->make_event_class (ly_symbol2scm ("unisono-event"))); unisono_event_->unprotect (); } - Context *out = (last_playing_ == SOLO2 ? second_iter_ : first_iter_) - ->get_outlet (); out->event_source ()->broadcast (unisono_event_); playing_state_ = UNISONO; } @@ -280,7 +289,9 @@ Part_combine_iterator::solo1 () { if (!solo_one_event_) { - solo_one_event_ = new Stream_event (ly_symbol2scm ("solo-one-event")); + solo_one_event_ = new Stream_event + (first_iter_->get_outlet ()->make_event_class + (ly_symbol2scm ("solo-one-event"))); solo_one_event_->unprotect (); } @@ -305,7 +316,9 @@ Part_combine_iterator::solo2 () { if (!solo_two_event_) { - solo_two_event_ = new Stream_event (ly_symbol2scm ("solo-two-event")); + solo_two_event_ = new Stream_event + (second_iter_->get_outlet ()->make_event_class + (ly_symbol2scm ("solo-two-event"))); solo_two_event_->unprotect (); } @@ -349,6 +362,17 @@ Part_combine_iterator::construct_children () { start_moment_ = get_outlet ()->now_mom (); split_list_ = get_music ()->get_property ("split-list"); + direction_ = get_music ()->get_property ("direction"); + if (is_direction (direction_)) + { + directionOne_ = direction_; + directionTwo_ = direction_; + if (scm_is_true (scm_negative_p (direction_))) + { + horizontalShiftOne_ = scm_from_int (1); + horizontalShiftTwo_ = scm_from_int (0); + } + } Context *c = get_outlet (); @@ -363,12 +387,14 @@ Part_combine_iterator::construct_children () } SCM lst = get_music ()->get_property ("elements"); - Context *one = handles_[CONTEXT_ONE].get_outlet (); + Context *one = handles_[CONTEXT_ONE].get_context (); set_context (one); first_iter_ = unsmob_iterator (get_iterator (unsmob_music (scm_car (lst)))); - Context *two = handles_[CONTEXT_TWO].get_outlet (); + Context *two = handles_[CONTEXT_TWO].get_context (); set_context (two); second_iter_ = unsmob_iterator (get_iterator (unsmob_music (scm_cadr (lst)))); + Context *shared = handles_[CONTEXT_SHARED].get_context (); + set_context (shared); /* Mimic all settings of voiceOne/voiceTwo for the two separate voices...*/ /* FIXME: Is there any way to use the definition of \voiceOne/\voiceTwo @@ -391,16 +417,20 @@ Part_combine_iterator::construct_children () { SCM sym = ly_symbol2scm (*p); execute_pushpop_property (one, sym, - ly_symbol2scm ("direction"), scm_from_int (1)); + ly_symbol2scm ("direction"), directionOne_); execute_pushpop_property (two, sym, - ly_symbol2scm ("direction"), scm_from_int (-1)); + ly_symbol2scm ("direction"), directionTwo_); + + if (scm_is_number (direction_)) + execute_pushpop_property (shared, sym, + ly_symbol2scm ("direction"), direction_); } /* Handle horizontal shifts for crossing notes */ execute_pushpop_property (one, ly_symbol2scm ("NoteColumn"), - ly_symbol2scm ("horizontal-shift"), scm_from_int (0)); + ly_symbol2scm ("horizontal-shift"), horizontalShiftOne_); execute_pushpop_property (two, ly_symbol2scm ("NoteColumn"), - ly_symbol2scm ("horizontal-shift"), scm_from_int (1)); + ly_symbol2scm ("horizontal-shift"), horizontalShiftTwo_); /* Also handle MultiMeasureRest positions for voice 1/2 */ execute_pushpop_property (one, ly_symbol2scm ("MultiMeasureRest"), ly_symbol2scm ("staff-position"), scm_from_int (4));