/*
- 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 <hanwen@xs4all.nl>
- (c) 2004--2007 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ 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 <http://www.gnu.org/licenses/>.
*/
#include "music-wrapper-iterator.hh"
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;
}
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;
}
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);
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");
&& 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
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
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_;
{
Moment em = vector_moment (event_idx_);
if (em > m)
- return;
+ return;
if (em == m)
- break;
+ break;
event_idx_++;
}
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_++;
}