]> git.donarmstrong.com Git - lilypond.git/blob - lily/timing-translator.cc
release: 1.3.150
[lilypond.git] / lily / timing-translator.cc
1 /*
2   timing-translator.cc -- implement Timing_translator
3
4
5   source file of the GNU LilyPond music typesetter
6
7   (c)  1997--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
8 */
9
10 #include "debug.hh"
11 #include "timing-translator.hh"
12 #include "command-request.hh"
13 #include "translator-group.hh"
14 #include "global-translator.hh"
15 #include "multi-measure-rest.hh"
16
17 /*
18   TODO: change the rest of lily, so communication with
19   Timing_translator is only done through properties.  This means the
20   class declaration can go here.  */
21
22 bool
23 Timing_translator::try_music (Music*r)
24 {
25   if (dynamic_cast<Barcheck_req*> (r))
26     {
27       check_ = r;
28       return true;
29     }
30   return false;
31 }
32
33 void
34 Timing_translator::process_music ()
35 {
36   if (check_ && measure_position ())
37     {
38       check_->origin ()->warning (_f ("barcheck failed at: %s", 
39                                       measure_position ().str ()));
40       Moment zero; 
41       
42       if (!to_boolean (get_property ("barCheckNoSynchronize")))
43         daddy_trans_l_->set_property ("measurePosition", zero.smobbed_copy ());
44     }
45 }
46
47
48 void
49 Timing_translator::stop_translation_timestep ()
50 {
51   check_ = 0;
52   
53   Translator *t = this;
54   Global_translator *global_l =0;
55   do
56     {
57       t = t->daddy_trans_l_ ;
58       global_l = dynamic_cast<Global_translator*> (t);
59     }
60   while (!global_l);
61
62   /* allbars == ! skipbars */
63   SCM sb = get_property ("skipBars");
64   bool allbars = !to_boolean (sb);
65
66   // urg: multi bar rests: should always process whole of first bar?
67   SCM tim = get_property ("timing");
68   bool timb = to_boolean (tim);
69   if (timb && allbars)
70     {
71       Moment barleft = (measure_length () - measure_position ());
72
73       if (barleft > Moment (0))
74         global_l->add_moment_to_process (now_mom () + barleft);
75     }
76 }
77
78
79 ADD_THIS_TRANSLATOR (Timing_translator);
80
81 void
82 Timing_translator::initialize ()
83 {
84   Moment m;
85   daddy_trans_l_->set_property ("timing" , SCM_BOOL_T);  
86   daddy_trans_l_->set_property ("currentBarNumber" , gh_int2scm (1));
87   daddy_trans_l_->set_property ("measurePosition", m.smobbed_copy ());
88   daddy_trans_l_->set_property ("timeSignatureFraction",
89                                 gh_cons (gh_int2scm (4), gh_int2scm (4)));
90
91   daddy_trans_l_->set_property ("measureLength", Moment (1).smobbed_copy ());
92   daddy_trans_l_->set_property ("beatLength", Moment (1,4).smobbed_copy ());
93 }
94
95 Moment
96 Timing_translator::measure_length () const
97 {
98   SCM l = get_property ("measureLength");
99   if (unsmob_moment (l))
100     return *unsmob_moment (l);
101   else
102     return Moment (1);
103 }
104
105
106
107 Timing_translator::Timing_translator ()
108 {
109
110
111 }
112
113
114 Moment
115 Timing_translator::measure_position () const
116 {
117   SCM sm = get_property ("measurePosition");
118   
119   Moment m   =0;
120   if (unsmob_moment (sm))
121     {
122       m = *unsmob_moment (sm);
123       while (m < Moment (0))
124         m += measure_length ();
125     }
126   
127   return m;
128 }
129
130 void
131 Timing_translator::start_translation_timestep ()
132 {
133         check_ =00;
134   Translator *t = this;
135   Global_translator *global_l =0;
136   do
137     {
138       t = t->daddy_trans_l_ ;
139       global_l = dynamic_cast<Global_translator*> (t);
140     }
141   while (!global_l);
142
143   Moment dt = global_l->now_mom_  - global_l -> prev_mom_;
144   if (dt < Moment (0))
145     {
146       programming_error ("Moving backwards in time");
147       dt = 0;
148     }
149   
150   if (!dt)
151     return;
152
153   Moment measposp;
154
155   SCM s = get_property ("measurePosition");
156   if (unsmob_moment (s))
157     {
158       measposp = *unsmob_moment (s);
159     }
160   else
161     {
162       daddy_trans_l_->set_property ("measurePosition", measposp.smobbed_copy ());
163     }
164   
165   measposp += dt;
166   
167   SCM barn = get_property ("currentBarNumber");
168   int b = 0;
169   if (gh_number_p (barn))
170     {
171       b = gh_scm2int (barn);
172     }
173
174   SCM cad = get_property ("timing");
175   bool c= to_boolean (cad);
176
177   Moment len = measure_length ();
178   while (c && measposp >= len)
179     {
180       measposp -= len;
181       b ++;
182     }
183
184   daddy_trans_l_->set_property ("currentBarNumber", gh_int2scm (b));
185   daddy_trans_l_->set_property ("measurePosition", measposp.smobbed_copy ());
186 }
187