2 duration-convert.cc -- implement Duration_convert
4 source file of the LilyPond music typesetter
6 (c) 1997--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 Jan Nieuwenhuizen <janneke@gnu.org>
10 #include "duration-convert.hh"
11 #include "duration-iter.hh"
14 // statics Duration_convert
15 bool Duration_convert::no_quantify_b_s = false;
16 bool Duration_convert::no_double_dots_b_s = false;
17 bool Duration_convert::no_tuplets_b_s = false;
18 int Duration_convert::no_smaller_than_i_s = 0;
19 Array<Duration> Duration_convert::dur_array_s;
22 Duration_convert::dur2_str (Duration dur)
25 return String ("[") + to_str (dur.ticks_i_) + "]";
28 if (dur.durlog_i_ >= 0)
29 str = to_str ( type2_i (dur.durlog_i_) );
30 else if (dur.durlog_i_ == -1)
32 else if (dur.durlog_i_ == -2)
34 str += to_str ('.', dur.dots_i_);
36 str += String ("*") + to_str (dur.plet_.iso_i_)
37 + String ("/") + to_str (dur.plet_.type_i_);
42 Duration_convert::dur2ticks_i (Duration dur)
46 return dur2_mom (dur) * Rational (Duration::division_1_i_s);
50 Duration_convert::i2_type (int i)
53 while (i && !(i & 1)) {
61 Duration_convert::type2_i (int type)
70 Duration_convert::dur2_mom (Duration dur)
73 return Rational (dur.ticks_i_, Duration::division_1_i_s);
76 if (dur.durlog_i_<-10)
80 mom = Rational (type2_i (-dur.durlog_i_), 1);
82 mom = Rational (1 , type2_i (dur.durlog_i_));
91 return mom * plet_factor_mom (dur);
95 Duration_convert::mom2_dur (Rational mom)
104 return mom2standardised_dur (mom);
108 Duration_convert::mom2standardised_dur (Rational mom)
110 // if (!dur_array_s.length_i ())
111 if (!dur_array_s.size ())
113 assert (dur_array_s.size ());
114 for (int i = 0; i < dur_array_s.size () - 1; i++)
116 Rational lower_mom = dur2_mom (dur_array_s[ i ]);
117 if (mom <= lower_mom)
119 // all arbitrary, but 3/4 will get rid of the noise...
121 if (i || (mom / lower_mom > Rational (3, 4)))
122 return dur_array_s[ i ];
130 Rational upper_mom = dur2_mom (dur_array_s[ i + 1 ]);
131 if ((mom < upper_mom)
132 && ((mom - lower_mom) / lower_mom
133 < (upper_mom - mom) / upper_mom))
134 return dur_array_s[ i ];
136 return dur_array_s[ dur_array_s.size () - 1 ];
140 Duration_convert::set_array ()
142 dur_array_s.clear ();
145 dur_array_s.push (i.dur ());
147 dur_array_s.push (i.forward_dur ());
152 Duration_convert::plet_factor_mom (Duration dur)
154 return dur.plet_.mom ();
158 Duration_convert::sync_f (Duration dur, Rational mom)
160 return mom / dur2_mom (dur);
164 Duration_convert::ticks2_dur (int ticks_i)
166 Rational mom (ticks_i, Duration::division_1_i_s);
167 return mom2standardised_dur (mom);
171 Duration_convert::ticks2standardised_dur (int ticks_i)
173 Rational mom (ticks_i, Duration::division_1_i_s);
174 Duration dur = mom2standardised_dur (mom);