]> git.donarmstrong.com Git - lilypond.git/blob - lily/repeat-engraver.cc
release: 1.1.8
[lilypond.git] / lily / repeat-engraver.cc
1 /*
2   repeat-engraver.cc -- implement Repeat_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1998 Jan Nieuwenhuizen <janneke@gnu.org>
7 */
8
9 #include "repeat-engraver.hh"
10 #include "bar.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"
20
21 ADD_THIS_TRANSLATOR (Repeat_engraver);
22
23 Repeat_engraver::Repeat_engraver ()
24 {
25 }
26
27 bool
28 Repeat_engraver::do_try_music (Music* m)
29 {
30   if (Repeated_music* r = dynamic_cast<Repeated_music *> (m))
31     {
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++)
37         {
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);
42         }
43       return true;
44     }
45   return false;
46 }
47
48 void
49 Repeat_engraver::acknowledge_element (Score_element_info i)
50 {
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_))
54     {
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);
58     }
59 }
60
61 void
62 Repeat_engraver::do_removal_processing ()
63 {
64   for (int i = 0; i < bar_p_arr_.size (); i++)
65     if (bar_p_arr_[i])
66       typeset_element (bar_p_arr_[i]);
67   for (int i = 0; i < volta_p_arr_.size (); i++)
68     if (volta_p_arr_[i])
69       typeset_element (volta_p_arr_[i]);
70 }
71
72 void
73 Repeat_engraver::do_process_requests ()
74 {  
75   for (int i = bar_p_arr_.size (); i < repeated_music_arr_.size (); i++)
76     {
77       Bar* bar_p = new Bar;
78       bar_p-> type_str_ = "|:";
79       bar_p_arr_.push (bar_p);
80       announce_element (Score_element_info (bar_p, repeated_music_arr_[i])); 
81     }
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++)
85     {
86       if (!bar_p_arr_[i] && (now >= stop_mom_arr_[i]))
87         {
88           Bar* bar_p = new Bar;
89           bar_p-> type_str_ = ":|";
90           bar_p_arr_[i] = bar_p;
91           announce_element (Score_element_info (bar_p, repeated_music_arr_[i]));
92         }
93     }
94 #endif
95   int bees = volta_p_arr_.size ();
96   for (int i = volta_p_arr_.size (); i < alternative_music_arr_.size (); i++)
97     {
98       Volta_spanner* v = new Volta_spanner;
99       if (i == alternative_music_arr_.size () - 1)
100         v->last_b_ = true;
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]));
106     }
107 }
108
109 void 
110 Repeat_engraver::do_pre_move_processing ()
111 {
112   for (int i = bar_p_arr_.size (); i--; )
113     {
114       if (bar_p_arr_[i])
115         {
116           typeset_element (bar_p_arr_[i]);
117           bar_p_arr_[i] = 0;
118         }
119     }
120   Moment now = now_moment ();
121   for (int i = volta_p_arr_.size (); i--; )
122     {
123       if (now >= alternative_stop_mom_arr_[i])
124         {
125           if (volta_p_arr_[i])
126             {
127               typeset_element (volta_p_arr_[i]);
128               volta_p_arr_[i] = 0;
129             }
130          }
131     }
132 }
133
134 void 
135 Repeat_engraver::do_post_move_processing ()
136 {
137   Moment now = now_moment ();
138   for (int i = bar_p_arr_.size (); i--; )
139     {
140 #if 0 // urg, try with pre-created and annouced :|
141       if (now >= stop_mom_arr_[i])
142         {
143           if (bar_p_arr_[i])
144             {
145               typeset_element (bar_p_arr_[i]);
146               bar_p_arr_.del (i);
147               stop_mom_arr_.del (i);
148               repeated_music_arr_.del (i);
149             }
150           else
151             {
152               bar_p_arr_.del (i);
153             }
154         }
155 #else 
156       if (now >= stop_mom_arr_[i])
157         {
158           Bar* bar_p = new Bar;
159           bar_p-> type_str_ = ":|";
160           typeset_element (bar_p);
161           bar_p_arr_.del (i);
162           stop_mom_arr_.del (i);
163           repeated_music_arr_.del (i);
164         }
165 #endif
166     }
167 }
168