]> git.donarmstrong.com Git - lilypond.git/blob - lily/timing-translator.cc
release: 1.1.43
[lilypond.git] / lily / timing-translator.cc
1 /*
2   timing-translator.cc -- implement Timing_translator
3
4   source file of the GNU LilyPond music typesetter
5
6   (c)  1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 */
8
9 #include "timing-translator.hh"
10 #include "command-request.hh"
11 #include "translator-group.hh"
12 #include "global-translator.hh"
13 #include "multi-measure-rest.hh"
14
15 Timing_translator::Timing_translator ()
16 {
17   default_grouping_ = Rhythmic_grouping (MInterval (0, 1), 4); // ugh
18 }
19
20 bool
21 Timing_translator::do_try_music (Music*r)
22 {
23   if (Timing_req *t =  dynamic_cast <Timing_req *> (r))
24     {
25       for (int i=0; i < timing_req_l_arr_.size (); i++)
26         {
27           if (timing_req_l_arr_[i]->equal_b(t))
28             return true;
29           if (String (classname (timing_req_l_arr_[i])) == classname (r))
30             {
31               r->warning (_ ("conflicting timing request"));
32               return false;
33             }
34         }
35     
36       timing_req_l_arr_.push(t);
37       return true;
38     }
39   return false;
40 }
41
42 /*ugh.
43  */
44 Time_signature_change_req*
45 Timing_translator::time_signature_req_l() const
46 {
47   Time_signature_change_req *m_l=0;
48   for (int i=0; !m_l && i < timing_req_l_arr_.size (); i++)
49     {
50       m_l=dynamic_cast<Time_signature_change_req*> (timing_req_l_arr_[i]);
51     }
52   return m_l;
53 }
54
55 void
56 Timing_translator::do_process_requests()
57 {
58   for (int i=0; i < timing_req_l_arr_.size (); i++)
59     {
60       Timing_req * tr_l = timing_req_l_arr_[i];
61
62       if (Time_signature_change_req *m_l = dynamic_cast <Time_signature_change_req *> (tr_l))
63         {
64           int b_i= m_l->beats_i_;
65           int o_i = m_l->one_beat_i_;
66           if (! time_.allow_time_signature_change_b())
67             tr_l->warning (_ ("time signature change not allowed here"));
68           else
69             {
70               time_.set_time_signature (b_i, o_i);
71
72               default_grouping_ =
73                 Rhythmic_grouping (MInterval (0,Moment (b_i, o_i)),
74                                    b_i == 1 ? 2 : b_i);
75             }
76         }
77       else if (Partial_measure_req *pm = dynamic_cast <Partial_measure_req *> (tr_l))
78         {
79           Moment m = pm->length_mom_;
80           String error = time_.try_set_partial_str (m);
81           if (error.length_i ())
82             {
83               tr_l->warning (error);
84             }
85           else
86             time_.setpartial (m);
87         }
88       else if (dynamic_cast <Barcheck_req *> (tr_l))
89         {
90           if (time_.whole_in_measure_)
91             {
92               tr_l ->warning (_f ("barcheck failed by: %s", 
93                 time_.whole_in_measure_.str ()));
94
95               time_.whole_in_measure_ = 0; // resync
96               time_.error_b_ = true;
97             }
98         }
99       else if (Cadenza_req *cr = dynamic_cast <Cadenza_req *> (tr_l))
100         {
101           time_.set_cadenza (cr->on_b_);
102         }
103       else if (Measure_grouping_req *mg=dynamic_cast <Measure_grouping_req *> (tr_l))
104         {
105           default_grouping_ =
106             parse_grouping (mg->beat_i_arr_,
107                             mg->elt_length_arr_);
108
109         }
110     }
111
112   Translator_group * tr=0;
113
114   Scalar barn = get_property ("currentBarNumber", &tr);
115   if (!barn.empty_b () && barn.isnum_b ())
116     {
117       time_.bars_i_ = int(barn);
118       tr->set_property ("currentBarNumber", "");
119     }
120   
121
122 }
123
124
125 void
126 Timing_translator::do_pre_move_processing()
127 {
128   timing_req_l_arr_.set_size (0);
129   Global_translator *global_l =
130     dynamic_cast<Global_translator*> (daddy_trans_l_->ancestor_l (100)); // ugh 100.
131
132
133   /* allbars == ! skipbars */
134   bool allbars = ! get_property ("skipBars", 0).to_bool ();
135
136   // urg: multi bar rests: should always must process whole of first bar?
137   if (!time_.cadenza_b_ && allbars)
138     global_l->add_moment_to_process (time_.next_bar_moment ());
139 }
140
141
142 ADD_THIS_TRANSLATOR(Timing_translator);
143
144 void
145 Timing_translator::do_creation_processing()
146 {
147   time_.when_ = now_mom ();
148 }
149
150 void
151 Timing_translator::do_post_move_processing()
152 {
153   time_.add (now_mom ()  - time_.when_);
154
155
156 }
157
158 void
159 Timing_translator::do_print () const
160 {
161 #ifndef NPRINT
162   time_.print ();
163   default_grouping_.print ();
164 #endif
165 }