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 "bar-engraver.hh"
12 #include "musical-request.hh"
13 #include "multi-measure-rest.hh"
14 #include "command-request.hh"
15 #include "time-description.hh"
16 #include "engraver-group.hh"
17 #include "repeated-music.hh"
18 #include "time-description.hh"
19 #include "volta-spanner.hh"
20 #include "note-column.hh"
21 #include "paper-def.hh"
23 ADD_THIS_TRANSLATOR (Repeat_engraver);
25 Repeat_engraver::Repeat_engraver ()
30 Repeat_engraver::do_try_music (Music* m)
32 if (Repeated_music* r = dynamic_cast<Repeated_music *> (m))
34 r->unfold_b_ = get_property ("unfoldRepeats", 0).to_bool ();
38 Music_sequence* alt = r->alternative_p_;
39 Moment repeat_length_mom = r->repeat_p_->length_mom ();
40 Moment stop_mom = now_mom () + repeat_length_mom;
41 Moment alt_mom = now_mom () + repeat_length_mom;
42 if (repeat_length_mom)
44 for (PCursor<Music*> i (alt->music_p_list_p_->top ()); i.ok () && (i != alt->music_p_list_p_->bottom ()); i++)
46 stop_mom += i->length_mom ();
47 if (dynamic_cast<Simultaneous_music *> (alt))
50 repeated_music_arr_.push (r);
51 stop_mom_arr_.push (stop_mom);
54 figure out what we don't want.
56 we don't want to print more than one set of
57 |: :| and volta brackets on one staff.
59 counting nested repeats, it seems safest to forbid
60 two pieces of alternative music to start at the same time.
63 for (int i = 0; i < alternative_start_mom_arr_.size (); i++)
64 if (alternative_start_mom_arr_[i] == alt_mom)
66 // moved stop_mom_arr_.push (stop_mom);
67 for (PCursor<Music*> i (alt->music_p_list_p_->top ()); i.ok (); i++)
69 alternative_music_arr_.push (i.ptr ());
70 alternative_start_mom_arr_.push (alt_mom);
71 alternative_stop_mom_arr_.push (alt_mom + i->length_mom ());
72 if (!dynamic_cast<Simultaneous_music *> (alt))
73 alt_mom += i->length_mom ();
81 Repeat_engraver::acknowledge_element (Score_element_info i)
83 Moment now = now_mom ();
84 if (Note_column *c = dynamic_cast<Note_column *> (i.elem_l_))
86 for (int i = 0; i < volta_p_arr_.size (); i++)
87 if (volta_p_arr_[i] && (now >= alternative_start_mom_arr_[i]))
88 volta_p_arr_[i]->add_column (c);
90 if (Bar *c = dynamic_cast<Bar*> (i.elem_l_))
92 for (int i = 0; i < volta_p_arr_.size (); i++)
93 if (volta_p_arr_[i] && (now >= alternative_start_mom_arr_[i]))
94 volta_p_arr_[i]->add_column (c);
99 Repeat_engraver::do_removal_processing ()
101 for (int i = 0; i < volta_p_arr_.size (); i++)
103 typeset_element (volta_p_arr_[i]);
107 Repeat_engraver::do_process_requests ()
109 Moment now = now_mom ();
110 Bar_engraver* bar_engraver_l = dynamic_cast <Bar_engraver*>
111 (daddy_grav_l ()->get_simple_translator ("Bar_engraver"));
112 for (int i = bar_b_arr_.size (); i < repeated_music_arr_.size (); i++)
115 bar_engraver_l->request_bar ("|:");
116 bar_b_arr_.push (true);
118 for (int i = 0; i < bar_b_arr_.size (); i++)
120 if (!bar_b_arr_[i] && (now >= stop_mom_arr_[i]))
123 bar_engraver_l->request_bar (":|");
126 int bees = volta_p_arr_.size ();
127 for (int i = volta_p_arr_.size (); i < alternative_music_arr_.size (); i++)
129 Volta_spanner* v = new Volta_spanner;
130 Scalar prop = get_property ("voltaVisibility", 0);
131 v->visible_b_ = prop.to_bool ();
132 if (i == alternative_music_arr_.size () - 1)
134 Text_def* t = new Text_def;
135 t->text_str_ = to_str (i - bees + 1) + ".";
136 v->number_p_.set_p (t);
137 volta_p_arr_.push (v);
138 announce_element (Score_element_info (v, alternative_music_arr_[i]));
143 Repeat_engraver::do_pre_move_processing ()
145 Moment now = now_mom ();
146 for (int i = bar_b_arr_.size (); i--; )
149 bar_b_arr_[i] = false;
150 if (now >= stop_mom_arr_[i])
153 stop_mom_arr_.del (i);
154 repeated_music_arr_.del (i);
157 for (int i = volta_p_arr_.size (); i--; )
159 if (volta_p_arr_[i] && (now >= alternative_stop_mom_arr_[i])
160 && (volta_p_arr_[i]->column_arr_.size () >= 1))
162 typeset_element (volta_p_arr_[i]);
164 volta_p_arr_.del (i);
165 alternative_music_arr_[i] = 0;
166 alternative_music_arr_.del (i);
167 alternative_start_mom_arr_.del (i);
168 alternative_stop_mom_arr_.del (i);
174 Repeat_engraver::do_post_move_processing ()