]> git.donarmstrong.com Git - lilypond.git/blob - lily/duration.cc
patch::: 1.3.79.jcn2
[lilypond.git] / lily / duration.cc
1 /*
2   duration.cc -- implement Duration, Plet, 
3
4   source file of the LilyPond music typesetter
5
6   (c)  1997--2000 Jan Nieuwenhuizen <janneke@gnu.org>
7            Han-Wen Nienhuys <hanwen@cs.uu.nl>
8
9 */
10
11 #include <assert.h>
12
13 #include "lily-proto.hh"
14 #include "string.hh"
15 #include "moment.hh"
16 #include "duration.hh"
17
18 int
19 compare (Array<Duration>* left, Array<Duration>* right)
20 {
21   assert (left);
22   assert (right);
23   
24   if (left->size () == right->size ())
25     {
26       for (int i = 0; i < left->size (); i++)
27         {
28           int r = Duration::compare ((*left)[i], (*right)[i]);
29           if (r)
30             return r;
31         }
32     }
33   else
34     return 1;
35   return 0;
36 }
37
38 int
39 Duration::compare (Duration const &left, Duration const &right)
40 {
41   return Rational::compare (left.length_mom (), right.length_mom ());
42 }
43
44 Duration::Duration ()
45 {
46   durlog_i_ = 0;
47   dots_i_ = 0;
48   tuplet_iso_i_ = 1;
49   tuplet_type_i_ = 1;
50 }
51
52 void
53 Duration::compress (Rational m)
54 {
55   tuplet_iso_i_  *= m.num_i ();
56   tuplet_type_i_ *= m.den_i (); 
57 }
58
59 Rational
60 Duration::length_mom () const
61 {
62   Rational mom (1 << abs (durlog_i_));
63
64   if (durlog_i_> 0)
65     mom = Moment (1)/mom;
66
67   Rational delta = mom;
68
69   for (int d = dots_i_; d; d--)
70     {
71       delta /= Moment (2);
72       mom += delta;
73     }
74
75   return mom * Moment (tuplet_iso_i_, tuplet_type_i_);
76 }
77
78 void
79 Duration::set_plet (int i, int t)
80 {
81   tuplet_iso_i_ = i; 
82   tuplet_type_i_ = t;
83 }
84
85
86 String
87 Duration::str () const
88 {
89   return to_str (durlog_i_) + to_str ('.', dots_i_);
90 }
91
92
93 bool
94 Duration::plet_b ()
95 {
96   return tuplet_iso_i_ != 1 || tuplet_type_i_ != 1;
97 }
98
99