X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fquote-iterator.cc;h=efb9c132e876b2dad09d6c3d4078d35c447cbb95;hb=0bb3eb14a16a605ca202dacbf657bdbe5dc94ebf;hp=58d4378d2543a9a55cc65cec2d6250dd655e2f41;hpb=0e5d83a9ceb4a143f83d22406d7eb816314ff9f7;p=lilypond.git diff --git a/lily/quote-iterator.cc b/lily/quote-iterator.cc index 58d4378d25..efb9c132e8 100644 --- a/lily/quote-iterator.cc +++ b/lily/quote-iterator.cc @@ -1,9 +1,20 @@ /* - quote-iterator.cc -- implement Quote_iterator + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter + Copyright (C) 2004--2012 Han-Wen Nienhuys - (c) 2004--2009 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 "music-wrapper-iterator.hh" @@ -29,12 +40,12 @@ public: SCM event_vector_; int event_idx_; int end_idx_; - + SCM transposed_musics_; DECLARE_SCHEME_CALLBACK (constructor, ()); bool quote_ok () const; - bool accept_music_type (Stream_event *) const; + bool accept_music_type (Stream_event *, bool is_cue = true) const; protected: virtual void derived_mark () const; @@ -53,13 +64,20 @@ Quote_iterator::do_quit () } bool -Quote_iterator::accept_music_type (Stream_event *ev) const +Quote_iterator::accept_music_type (Stream_event *ev, bool is_cue) const { - for (SCM accept = get_outlet ()->get_property ("quotedEventTypes"); - scm_is_pair (accept); accept = scm_cdr (accept)) + SCM accept = SCM_EOL; + // Cue notes use the quotedCueEventTypes property, otherwise (and as fallback + // for cue notes if quotedCueEventTypes is not set) use quotedEventTypes + if (is_cue) + accept = get_outlet ()->get_property ("quotedCueEventTypes"); + if (accept == SCM_EOL) + accept = get_outlet ()->get_property ("quotedEventTypes"); + + for (; scm_is_pair (accept); accept = scm_cdr (accept)) { if (ev->internal_in_event_class (scm_car (accept))) - return true; + return true; } return false; } @@ -93,9 +111,9 @@ binsearch_scm_vector (SCM vec, SCM key, bool (*is_less) (SCM a, SCM b)) SCM when = scm_caar (scm_c_vector_ref (vec, cmp)); bool result = (*is_less) (key, when); if (result) - hi = cmp; + hi = cmp; else - lo = cmp; + lo = cmp; } while (hi - lo > 1); @@ -106,7 +124,7 @@ void Quote_iterator::construct_children () { Music_wrapper_iterator::construct_children (); - + SCM name = get_music ()->get_property ("quoted-context-type"); SCM id = get_music ()->get_property ("quoted-context-id"); @@ -114,7 +132,7 @@ Quote_iterator::construct_children () && scm_is_symbol (name)) { Context *cue_context = get_outlet ()->find_create_context (name, - ly_scm2string (id), SCM_EOL); + ly_scm2string (id), SCM_EOL); quote_outlet_.set_context (cue_context); } else @@ -142,13 +160,13 @@ bool Quote_iterator::quote_ok () const { return (event_idx_ >= 0 - && scm_is_vector (event_vector_) - && event_idx_ <= end_idx_ + && scm_is_vector (event_vector_) + && event_idx_ <= end_idx_ - /* - Don't quote the grace notes leading to an unquoted note. - */ - && vector_moment (event_idx_).main_part_ < stop_moment_.main_part_); + /* + Don't quote the grace notes leading to an unquoted note. + */ + && vector_moment (event_idx_).main_part_ < stop_moment_.main_part_); } Moment @@ -190,14 +208,14 @@ Quote_iterator::process (Moment m) if (event_idx_ < 0) { event_idx_ = binsearch_scm_vector (event_vector_, - get_outlet ()->now_mom ().smobbed_copy (), - &moment_less); + get_outlet ()->now_mom ().smobbed_copy (), + &moment_less); start_moment_ = get_outlet ()->now_mom () - music_start_mom (); stop_moment_ = start_moment_ + get_music ()->get_length (); end_idx_ = binsearch_scm_vector (event_vector_, - stop_moment_.smobbed_copy (), - &moment_less); + stop_moment_.smobbed_copy (), + &moment_less); } m += start_moment_; @@ -205,10 +223,10 @@ Quote_iterator::process (Moment m) { Moment em = vector_moment (event_idx_); if (em > m) - return; + return; if (em == m) - break; + break; event_idx_++; } @@ -219,39 +237,42 @@ Quote_iterator::process (Moment m) Pitch *quote_pitch = unsmob_pitch (scm_cdar (entry)); /* - The pitch that sounds like central C + The pitch that sounds like central C */ Pitch *me_pitch = unsmob_pitch (get_music ()->get_property ("quoted-transposition")); if (!me_pitch) - me_pitch = unsmob_pitch (get_outlet ()->get_property ("instrumentTransposition")); + me_pitch = unsmob_pitch (get_outlet ()->get_property ("instrumentTransposition")); + SCM cid = get_music ()->get_property ("quoted-context-id"); + bool is_cue = scm_is_string (cid) && (ly_scm2string (cid) == "cue"); for (SCM s = scm_cdr (entry); scm_is_pair (s); s = scm_cdr (s)) - { - SCM ev_acc = scm_car (s); - - Stream_event *ev = unsmob_stream_event (scm_car (ev_acc)); - if (!ev) - programming_error ("no music found in quote"); - else if (accept_music_type (ev)) - { - /* create a transposed copy if necessary */ - if (quote_pitch || me_pitch) - { - Pitch qp, mp; - if (quote_pitch) - qp = *quote_pitch; - if (me_pitch) - mp = *me_pitch; - - Pitch diff = pitch_interval (qp, mp); - ev = ev->clone (); - - transpose_mutable (ev->get_property_alist (true), diff); - transposed_musics_ = scm_cons (ev->unprotect (), transposed_musics_); - } - quote_outlet_.get_outlet ()->event_source ()->broadcast (ev); - } - } + { + SCM ev_acc = scm_car (s); + + Stream_event *ev = unsmob_stream_event (scm_car (ev_acc)); + if (!ev) + programming_error ("no music found in quote"); + else if (accept_music_type (ev, is_cue)) + { + /* create a transposed copy if necessary */ + if (quote_pitch || me_pitch) + { + Pitch qp, mp; + if (quote_pitch) + qp = *quote_pitch; + if (me_pitch) + mp = *me_pitch; + + Pitch diff = pitch_interval (qp, mp); + ev = ev->clone (); + ev->make_transposable (); + + transpose_mutable (ev->get_property_alist (true), diff); + transposed_musics_ = scm_cons (ev->unprotect (), transposed_musics_); + } + quote_outlet_.get_context ()->event_source ()->broadcast (ev); + } + } event_idx_++; }