2 tie-performer.cc -- implement Tie_performer
4 source file of the GNU LilyPond music typesetter
6 (c) 1998--2007 Han-Wen Nienhuys <hanwen@xs4all.nl>
9 #include "performer.hh"
11 #include "audio-item.hh"
13 #include "stream-event.hh"
14 #include "translator.icc"
16 class Tie_performer
: public Performer
19 vector
<Audio_element_info
> now_heads_
;
20 vector
<Audio_element_info
> now_tied_heads_
;
21 vector
<Audio_element_info
> heads_to_tie_
;
26 void stop_translation_timestep ();
27 void start_translation_timestep ();
28 virtual void acknowledge_audio_element (Audio_element_info
);
29 void process_music ();
30 DECLARE_TRANSLATOR_LISTENER (tie
);
32 TRANSLATOR_DECLARATIONS (Tie_performer
);
35 Tie_performer::Tie_performer ()
38 ties_created_
= false;
41 IMPLEMENT_TRANSLATOR_LISTENER (Tie_performer
, tie
);
43 Tie_performer::listen_tie (Stream_event
*ev
)
49 Tie_performer::process_music ()
52 context ()->set_property ("tieMelismaBusy", SCM_BOOL_T
);
56 Tie_performer::acknowledge_audio_element (Audio_element_info inf
)
58 if (Audio_note
*an
= dynamic_cast<Audio_note
*> (inf
.elem_
))
61 now_tied_heads_
.push_back (inf
);
63 now_heads_
.push_back (inf
);
65 for (vsize i
= heads_to_tie_
.size (); i
--;)
67 Stream_event
*right_mus
= inf
.event_
;
69 Audio_note
*th
= dynamic_cast<Audio_note
*> (heads_to_tie_
[i
].elem_
);
70 Stream_event
*left_mus
= heads_to_tie_
[i
].event_
;
72 if (right_mus
&& left_mus
73 && ly_is_equal (right_mus
->get_property ("pitch"),
74 left_mus
->get_property ("pitch")))
84 Tie_performer::start_translation_timestep ()
86 context ()->set_property ("tieMelismaBusy",
87 ly_bool2scm (heads_to_tie_
.size ()));
91 Tie_performer::stop_translation_timestep ()
95 heads_to_tie_
.clear ();
96 ties_created_
= false;
101 heads_to_tie_
= now_heads_
;
104 for (vsize i
= now_tied_heads_
.size (); i
--;)
105 heads_to_tie_
.push_back (now_tied_heads_
[i
]);
109 now_tied_heads_
.clear ();
112 ADD_TRANSLATOR (Tie_performer
,
114 "Generate ties between note heads of equal pitch.",