]> git.donarmstrong.com Git - lilypond.git/blob - lily/repeat-engraver.cc
partial: 1.1.7.jcn
[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->duration ());
34       // urg, something broken with alternative time...
35       //Moment alt_mom = now_moment () + r->repeat_p_->duration ();
36       Moment alt_mom = now_moment ();
37       for (PCursor<Music*> i (r->alternative_p_->music_p_list_p_->top ()); i.ok (); i++)
38         {
39           alternative_music_arr_.push (i.ptr ());
40           alternative_start_mom_arr_.push (alt_mom);
41           // urg, something broken with alternative time...
42           // alt_mom += i->duration ();
43           alt_mom += Moment (1);
44           alternative_stop_mom_arr_.push (alt_mom);
45         }
46       return true;
47     }
48   return false;
49 }
50
51 void
52 Repeat_engraver::acknowledge_element (Score_element_info i)
53 {
54   Moment now = now_moment ();
55   if (Note_column *nc = dynamic_cast<Note_column *> (i.elem_l_))
56     {
57       for (int i = 0; i < volta_p_arr_.size (); i++)
58         if ((now >= alternative_start_mom_arr_[i]) && volta_p_arr_[i])
59           volta_p_arr_[i]->add_column (nc);
60     }
61 }
62
63 void
64 Repeat_engraver::do_removal_processing ()
65 {
66   for (int i = 0; i < bar_p_arr_.size (); i++)
67     if (bar_p_arr_[i])
68       typeset_element (bar_p_arr_[i]);
69   for (int i = 0; i < volta_p_arr_.size (); i++)
70     if (volta_p_arr_[i])
71       typeset_element (volta_p_arr_[i]);
72 }
73
74 void
75 Repeat_engraver::do_process_requests ()
76 {  
77   for (int i = bar_p_arr_.size (); i < repeated_music_arr_.size (); i++)
78     {
79       Bar* bar_p = new Bar;
80       bar_p-> type_str_ = "|:";
81       bar_p_arr_.push (bar_p);
82       announce_element (Score_element_info (bar_p, repeated_music_arr_[i])); 
83     }
84   int bees = volta_p_arr_.size ();
85   for (int i = volta_p_arr_.size (); i < alternative_music_arr_.size (); i++)
86     {
87       Volta_spanner* v = new Volta_spanner;
88       if (i == alternative_music_arr_.size () - 1)
89         v->last_b_ = true;
90       Text_def* t = new Text_def;
91       t->text_str_ = to_str (i - bees + 1);
92       v->tdef_p_.set_p (t);
93       volta_p_arr_.push (v);
94       announce_element (Score_element_info (v, alternative_music_arr_[i]));
95     }
96 }
97
98 void 
99 Repeat_engraver::do_pre_move_processing ()
100 {
101   for (int i = bar_p_arr_.size (); i--; )
102     {
103       if (bar_p_arr_[i])
104         {
105           typeset_element (bar_p_arr_[i]);
106           bar_p_arr_[i] = 0;
107         }
108     }
109 }
110
111 void 
112 Repeat_engraver::do_post_move_processing ()
113 {
114   Moment now = now_moment ();
115   for (int i = bar_p_arr_.size (); i--; )
116     {
117       if (now >= stop_mom_arr_[i])
118         {
119           Bar* bar_p = new Bar;
120           bar_p-> type_str_ = ":|";
121           typeset_element (bar_p);
122           bar_p_arr_.del (i);
123           stop_mom_arr_.del (i);
124           repeated_music_arr_.del (i);
125         }
126     }
127   for (int i = volta_p_arr_.size (); i--; )
128     {
129       //if (now >= alternative_start_mom_arr_[i])
130       if (now >= alternative_stop_mom_arr_[i])
131         {
132           if (volta_p_arr_[i])
133             {
134               typeset_element (volta_p_arr_[i]);
135               volta_p_arr_[i] = 0;
136             }
137          }
138     }
139 }
140