X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fquote-iterator.cc;h=35ecbca4c8cd244c3d5a55300fb662d72cbef3cd;hb=a8d54f44df1fe4f89823f6b78364870ce51174dc;hp=849472c329a34a52ca1e594740231e6281cb34a9;hpb=9e69cb84d6ee5b0a861cd97869b10e3bdf0c833c;p=lilypond.git diff --git a/lily/quote-iterator.cc b/lily/quote-iterator.cc index 849472c329..35ecbca4c8 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--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 "music-wrapper-iterator.hh" @@ -34,7 +45,7 @@ public: 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,10 +64,17 @@ 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; @@ -224,6 +242,8 @@ Quote_iterator::process (Moment m) Pitch *me_pitch = unsmob_pitch (get_music ()->get_property ("quoted-transposition")); if (!me_pitch) 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)) { @@ -232,7 +252,7 @@ Quote_iterator::process (Moment m) 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)) + else if (accept_music_type (ev, is_cue)) { /* create a transposed copy if necessary */ if (quote_pitch || me_pitch) @@ -244,9 +264,9 @@ Quote_iterator::process (Moment m) mp = *me_pitch; Pitch diff = pitch_interval (qp, mp); - - SCM props = transpose_mutable (ev->get_property_alist (true), diff); - ev = new Stream_event (ev->get_property ("class"), props); + 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);