]> git.donarmstrong.com Git - lilypond.git/blob - lily/timing-translator.cc
release: 1.3.0
[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   SCM barn = get_property ("currentBarNumber", &tr);
98   if (SCM_NUMBERP(barn))
99     {
100       time_.bars_i_ = gh_scm2int (barn);
101       tr->set_property ("currentBarNumber", SCM_UNDEFINED);
102     }
103 }
104
105
106 void
107 Timing_translator::do_pre_move_processing()
108 {
109   timing_req_l_arr_.set_size (0);
110   Translator *t = this;
111   Global_translator *global_l =0;
112   do
113     {
114       t = t->daddy_trans_l_ ;
115       global_l = dynamic_cast<Global_translator*> (t);
116     }
117   while (!global_l);
118
119   /* allbars == ! skipbars */
120   SCM sb = get_property ("skipBars", 0);
121   bool allbars = !(gh_boolean_p (sb)&&gh_scm2bool (sb));
122
123   // urg: multi bar rests: should always process whole of first bar?
124   if (!time_.cadenza_b_ && allbars)
125     global_l->add_moment_to_process (time_.next_bar_moment ());
126 }
127
128
129 ADD_THIS_TRANSLATOR(Timing_translator);
130
131 void
132 Timing_translator::do_creation_processing()
133 {
134   time_.when_ = now_mom ();
135 }
136
137 void
138 Timing_translator::do_post_move_processing()
139 {
140   time_.add (now_mom ()  - time_.when_);
141
142
143 }
144
145 void
146 Timing_translator::do_print () const
147 {
148 #ifndef NPRINT
149   time_.print ();
150 #endif
151 }