X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpart-combine-iterator.cc;h=f2e0a34e931df3229e67c3bf28af82ead5133a74;hb=efcd1a4aa72cf635cd570623f59395f5224d78c0;hp=03da0d4f5714fcd67dbc9257cccdef9b81c02f2a;hpb=7785ac382ed511ed535adf77adc3c07649fbc9b5;p=lilypond.git diff --git a/lily/part-combine-iterator.cc b/lily/part-combine-iterator.cc index 03da0d4f57..f2e0a34e93 100644 --- a/lily/part-combine-iterator.cc +++ b/lily/part-combine-iterator.cc @@ -1,15 +1,25 @@ /* - new-part-combine-music-iterator.cc -- implement Part_combine_iterator + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter + Copyright (C) 2004--2010 Han-Wen Nienhuys - (c) 2004--2006 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 + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . */ #include "context.hh" #include "dispatcher.hh" #include "lily-guile.hh" -#include "listener.hh" #include "music.hh" #include "music-iterator.hh" #include "music-sequence.hh" @@ -22,7 +32,7 @@ typedef enum Outlet_type CONTEXT_NULL, NUM_OUTLETS }; -static const char *outlet_names_[NUM_OUTLETS] = +static const char *outlet_names_[NUM_OUTLETS] = {"one", "two", "shared", "solo", "null"}; class Part_combine_iterator : public Music_iterator @@ -47,20 +57,20 @@ private: DECLARE_LISTENER (set_busy); bool busy_; bool notice_busy_; - + bool try_process (Music_iterator *i, Moment m); - + Music_iterator *first_iter_; Music_iterator *second_iter_; Moment start_moment_; SCM split_list_; - Stream_event *unisono_event_; + Stream_event *unisono_event_; Stream_event *solo_one_event_; Stream_event *solo_two_event_; - Stream_event *mmrest_event_; - + Stream_event *mmrest_event_; + enum Status { APART, @@ -191,7 +201,7 @@ Part_combine_iterator::chords_together () void Part_combine_iterator::kill_mmrest (int in) { - + if (!mmrest_event_) { mmrest_event_ = new Stream_event (ly_symbol2scm ("multi-measure-rest-event")); @@ -280,7 +290,7 @@ Part_combine_iterator::unisono (bool silent) unisono_event_ = new Stream_event (ly_symbol2scm ("unisono-event")); unisono_event_->unprotect (); } - + Context *out = (last_playing_ == SOLO2 ? second_iter_ : first_iter_) ->get_outlet (); @@ -309,7 +319,7 @@ Part_combine_iterator::solo2 () solo_two_event_ = new Stream_event (ly_symbol2scm ("solo-two-event")); solo_two_event_->unprotect (); } - + second_iter_->get_outlet ()->event_source ()->broadcast (solo_two_event_); playing_state_ = SOLO2; } @@ -357,6 +367,10 @@ Part_combine_iterator::construct_children () set_context (two); second_iter_ = unsmob_iterator (get_iterator (unsmob_music (scm_cadr (lst)))); + + /* Mimic all settings of voiceOne/voiceTwo for the two separate voices...*/ + /* FIXME: Is there any way to use the definition of \voiceOne/\voiceTwo + directly??? */ char const *syms[] = { "Stem", @@ -379,6 +393,17 @@ Part_combine_iterator::construct_children () execute_pushpop_property (two, sym, ly_symbol2scm ("direction"), scm_from_int (-1)); } + /* Handle horizontal shifts for crossing notes */ + execute_pushpop_property (one, ly_symbol2scm ("NoteColumn"), + ly_symbol2scm ("horizontal-shift"), scm_from_int (0)); + execute_pushpop_property (two, ly_symbol2scm ("NoteColumn"), + ly_symbol2scm ("horizontal-shift"), scm_from_int (1)); + /* Also handle MultiMeasureRest positions for voice 1/2 */ + execute_pushpop_property (one, ly_symbol2scm ("MultiMeasureRest"), + ly_symbol2scm ("staff-position"), scm_from_int (4)); + execute_pushpop_property (two, ly_symbol2scm ("MultiMeasureRest"), + ly_symbol2scm ("staff-position"), scm_from_int (-4)); + } IMPLEMENT_LISTENER (Part_combine_iterator, set_busy); @@ -405,7 +430,7 @@ Part_combine_iterator::try_process (Music_iterator *i, Moment m) notice_busy_ = true; i->process (m); - + notice_busy_ = false; return busy_; }