]> git.donarmstrong.com Git - lilypond.git/blob - lily/timing-translator.cc
92db7ee737387df5646a935d5127c23f979eb289
[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 bool
16 Timing_translator::do_try_music (Music*r)
17 {
18   if (Timing_req *t =  dynamic_cast <Timing_req *> (r))
19     {
20       for (int i=0; i < timing_req_l_arr_.size (); i++)
21         {
22           if (timing_req_l_arr_[i]->equal_b(t))
23             return true;
24           if (String (classname (timing_req_l_arr_[i])) == classname (r))
25             {
26               r->warning (_ ("conflicting timing request"));
27               return false;
28             }
29         }
30     
31       timing_req_l_arr_.push(t);
32       return true;
33     }
34   return false;
35 }
36
37 /*ugh.
38  */
39 Time_signature_change_req*
40 Timing_translator::time_signature_req_l() const
41 {
42   Time_signature_change_req *m_l=0;
43   for (int i=0; !m_l && i < timing_req_l_arr_.size (); i++)
44     {
45       m_l=dynamic_cast<Time_signature_change_req*> (timing_req_l_arr_[i]);
46     }
47   return m_l;
48 }
49
50 void
51 Timing_translator::do_process_requests()
52 {
53   for (int i=0; i < timing_req_l_arr_.size (); i++)
54     {
55       Timing_req * tr_l = timing_req_l_arr_[i];
56
57       if (Time_signature_change_req *m_l = dynamic_cast <Time_signature_change_req *> (tr_l))
58         {
59           int b_i= m_l->beats_i_;
60           int o_i = m_l->one_beat_i_;
61           if (! time_.allow_time_signature_change_b())
62             tr_l->warning (_ ("time signature change not allowed here"));
63           else
64             {
65               time_.set_time_signature (b_i, o_i);
66             }
67         }
68       else if (Partial_measure_req *pm = dynamic_cast <Partial_measure_req *> (tr_l))
69         {
70           Moment m = pm->length_mom_;
71           String error = time_.try_set_partial_str (m);
72           if (error.length_i ())
73             {
74               tr_l->warning (error);
75             }
76           else
77             time_.setpartial (m);
78         }
79       else if (dynamic_cast <Barcheck_req *> (tr_l))
80         {
81           if (time_.whole_in_measure_)
82             {
83               tr_l ->warning (_f ("barcheck failed at: %s", 
84                 time_.whole_in_measure_.str ()));
85
86               time_.whole_in_measure_ = 0; // resync
87             }
88         }
89       else if (Cadenza_req *cr = dynamic_cast <Cadenza_req *> (tr_l))
90         {
91           time_.set_cadenza (cr->on_b_);
92         }
93     }
94
95   Translator_group * tr=0;
96
97   Scalar barn = get_property ("currentBarNumber", &tr);
98   if (!barn.empty_b () && barn.isnum_b ())
99     {
100       time_.bars_i_ = int(barn);
101       tr->set_property ("currentBarNumber", "");
102     }
103   
104
105 }
106
107
108 void
109 Timing_translator::do_pre_move_processing()
110 {
111   timing_req_l_arr_.set_size (0);
112   Translator *t = this;
113   Global_translator *global_l =0;
114   do
115     {
116       t = t->daddy_trans_l_ ;
117       global_l = dynamic_cast<Global_translator*> (t);
118     }
119   while (!global_l);
120
121   /* allbars == ! skipbars */
122   bool allbars = ! get_property ("skipBars", 0).to_bool ();
123
124   // urg: multi bar rests: should always process whole of first bar?
125   if (!time_.cadenza_b_ && allbars)
126     global_l->add_moment_to_process (time_.next_bar_moment ());
127 }
128
129
130 ADD_THIS_TRANSLATOR(Timing_translator);
131
132 void
133 Timing_translator::do_creation_processing()
134 {
135   time_.when_ = now_mom ();
136 }
137
138 void
139 Timing_translator::do_post_move_processing()
140 {
141   time_.add (now_mom ()  - time_.when_);
142
143
144 }
145
146 void
147 Timing_translator::do_print () const
148 {
149 #ifndef NPRINT
150   time_.print ();
151 #endif
152 }