2 repeat-engraver.cc -- implement Repeat_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 1998 Jan Nieuwenhuizen <janneke@gnu.org>
9 #include "repeat-engraver.hh"
11 #include "musical-request.hh"
12 #include "multi-measure-rest.hh"
13 #include "command-request.hh"
14 #include "time-description.hh"
15 #include "engraver-group.hh"
16 #include "repeated-music.hh"
17 #include "time-description.hh"
18 #include "volta-spanner.hh"
19 //#include "note-column.hh"
21 ADD_THIS_TRANSLATOR (Repeat_engraver);
23 Repeat_engraver::Repeat_engraver ()
28 Repeat_engraver::do_try_music (Music* m)
30 if (Repeated_music* r = dynamic_cast<Repeated_music *> (m))
32 repeated_music_arr_.push (r);
33 stop_mom_arr_.push (now_moment () + r->repeat_p_->duration ()
34 + r->alternative_p_->music_p_list_p_->top ()->duration ());
35 Moment alt_mom = now_moment () + r->repeat_p_->duration ();
36 for (PCursor<Music*> i (r->alternative_p_->music_p_list_p_->top ()); i.ok (); i++)
38 alternative_music_arr_.push (i.ptr ());
39 alternative_start_mom_arr_.push (alt_mom);
40 alt_mom += i->duration ();
41 alternative_stop_mom_arr_.push (alt_mom);
49 Repeat_engraver::acknowledge_element (Score_element_info i)
51 Moment now = now_moment ();
52 // if (Note_column *c = dynamic_cast<Note_column *> (i.elem_l_))
53 if (Bar *c = dynamic_cast<Bar*> (i.elem_l_))
55 for (int i = 0; i < volta_p_arr_.size (); i++)
56 if ((now >= alternative_start_mom_arr_[i]) && volta_p_arr_[i])
57 volta_p_arr_[i]->add_column (c);
62 Repeat_engraver::do_removal_processing ()
64 for (int i = 0; i < bar_p_arr_.size (); i++)
66 typeset_element (bar_p_arr_[i]);
67 for (int i = 0; i < volta_p_arr_.size (); i++)
69 typeset_element (volta_p_arr_[i]);
73 Repeat_engraver::do_process_requests ()
75 for (int i = bar_p_arr_.size (); i < repeated_music_arr_.size (); i++)
78 bar_p-> type_str_ = "|:";
79 bar_p_arr_.push (bar_p);
80 announce_element (Score_element_info (bar_p, repeated_music_arr_[i]));
82 #if 0 //urg, try pre-ceating and announcing
83 Moment now = now_moment ();
84 for (int i = 0; i < bar_p_arr_.size (); i++)
86 if (!bar_p_arr_[i] && (now >= stop_mom_arr_[i]))
89 bar_p-> type_str_ = ":|";
90 bar_p_arr_[i] = bar_p;
91 announce_element (Score_element_info (bar_p, repeated_music_arr_[i]));
95 int bees = volta_p_arr_.size ();
96 for (int i = volta_p_arr_.size (); i < alternative_music_arr_.size (); i++)
98 Volta_spanner* v = new Volta_spanner;
99 if (i == alternative_music_arr_.size () - 1)
101 Text_def* t = new Text_def;
102 t->text_str_ = to_str (i - bees + 1);
103 v->number_p_.set_p (t);
104 volta_p_arr_.push (v);
105 announce_element (Score_element_info (v, alternative_music_arr_[i]));
110 Repeat_engraver::do_pre_move_processing ()
112 for (int i = bar_p_arr_.size (); i--; )
116 typeset_element (bar_p_arr_[i]);
120 Moment now = now_moment ();
121 for (int i = volta_p_arr_.size (); i--; )
123 if (now >= alternative_stop_mom_arr_[i])
127 typeset_element (volta_p_arr_[i]);
135 Repeat_engraver::do_post_move_processing ()
137 Moment now = now_moment ();
138 for (int i = bar_p_arr_.size (); i--; )
140 #if 0 // urg, try with pre-created and annouced :|
141 if (now >= stop_mom_arr_[i])
145 typeset_element (bar_p_arr_[i]);
147 stop_mom_arr_.del (i);
148 repeated_music_arr_.del (i);
156 if (now >= stop_mom_arr_[i])
158 Bar* bar_p = new Bar;
159 bar_p-> type_str_ = ":|";
160 typeset_element (bar_p);
162 stop_mom_arr_.del (i);
163 repeated_music_arr_.del (i);