]> git.donarmstrong.com Git - lilypond.git/blob - src/timedescription.cc
275a47f0d9b57b1554b1f805435ed5012235b404
[lilypond.git] / src / timedescription.cc
1 #include "timedescription.hh"
2 #include "debug.hh"
3 String
4 Time_description::str()const
5 {
6     String s( "Time_description { ");
7     s+=String( " cadenza: ") + cadenza_b_ + " at ";
8     s+=when;
9     s+="\nmeter " + String(whole_per_measure/one_beat) +":" +(1/one_beat);
10     s+= "\nposition "+String( bars) + ":"+ whole_in_measure +"\n}\n";
11     return s;
12 }
13
14 void
15 Time_description::print() const
16 {    
17     mtor << str();
18 }
19 void
20 Time_description::OK() const
21 {
22 #ifdef NDEBUG
23     if (!cadenza_b_)
24         assert(whole_in_measure < whole_per_measure);
25     assert(0 <= whole_in_measure);
26     assert(one_beat);
27 #endif
28 }
29
30 void
31 Time_description::set_cadenza(bool b)
32 {
33     if (cadenza_b_ && !b) {
34         if (whole_in_measure) {
35             bars ++;
36             whole_in_measure = 0;
37         }
38     }
39     cadenza_b_ = b ;
40 }
41
42 Time_description::Time_description(Moment dt, Time_description const *prev)
43 {
44     if (prev) {
45         assert(dt >= 0);
46         *this = *prev;
47         when +=  dt;
48         whole_in_measure += dt;
49         
50         while ( !cadenza_b_ && whole_in_measure >= whole_per_measure ) {
51             whole_in_measure -= whole_per_measure;
52             bars ++;
53         }
54     } else {                            // default 4/4
55         whole_per_measure = 1;
56         whole_in_measure =0;
57         one_beat = 0.25;
58         when = 0.0;
59         bars = 0;
60         cadenza_b_ = false;
61     }
62 }
63
64 void
65 Time_description::set_meter(int l, int o)
66 {
67     assert(o);
68     one_beat = 1/Moment(o);
69     whole_per_measure = Moment(l) * one_beat;
70     if(whole_in_measure)
71         error_t("Meterchange should be at start of measure", *this);
72 }
73
74 void
75 Time_description::setpartial(Moment p)
76 {
77     if (when)
78         error_t ("Partial measure only allowed at beginning.", *this);
79     if (p<0||p > whole_per_measure)
80         error_t ("Partial measure has incorrect size", *this);
81     whole_in_measure = whole_per_measure - p;
82 }
83
84 Moment
85 Time_description::barleft()
86 {
87     assert(!cadenza_b_);
88     return whole_per_measure-whole_in_measure;
89 }
90
91 int
92 Time_description::compare(Time_description &t1, Time_description&t2)
93 {
94     int i = sign(t1.when-t2.when);
95
96     if (!i) {
97         assert(t1.bars==t2.bars);
98         assert(t1.one_beat == t2.one_beat);
99         assert(t1.whole_in_measure == t2.whole_in_measure);
100         assert(t1.whole_per_measure == t2.whole_per_measure);
101     }
102
103     return i;
104 }