--- /dev/null
+/*
+ duration.cc -- implement Duration, Plet,
+
+ source file of the LilyPond music typesetter
+
+ (c) 1997--1999 Jan Nieuwenhuizen <janneke@gnu.org>
+ Han-Wen Nienhuys <hanwen@cs.uu.nl>
+
+*/
+
+#include <assert.h>
+
+#include "lily-proto.hh"
+#include "string.hh"
+#include "moment.hh"
+#include "duration.hh"
+
+Duration::Duration ()
+{
+ durlog_i_ = 0;
+ dots_i_ = 0;
+ tuplet_iso_i_ = 1;
+ tuplet_type_i_ = 1;
+}
+
+void
+Duration::compress (Rational m)
+{
+ tuplet_iso_i_ *= m.num_i ();
+ tuplet_type_i_ *= m.den_i ();
+}
+
+Rational
+Duration::length_mom () const
+{
+ Rational mom (1 << abs (durlog_i_));
+
+ if (durlog_i_> 0)
+ mom = Moment (1)/mom;
+
+ Rational delta = mom;
+
+ for (int d = dots_i_; d; d--)
+ {
+ delta /= 2.0;
+ mom += delta;
+ }
+
+ return mom * Moment (tuplet_iso_i_, tuplet_type_i_);
+}
+
+void
+Duration::set_plet (int i, int t)
+{
+ tuplet_iso_i_ = i;
+ tuplet_type_i_ = t;
+}
+
+
+String
+Duration::str () const
+{
+ return to_str (durlog_i_) + to_str ('.', dots_i_);
+}
+
+
+bool
+Duration::plet_b ()
+{
+ return tuplet_iso_i_ != 1 || tuplet_type_i_ != 1;
+}
+
+
#include "translator-group.hh"
#include "score.hh"
#include "music-list.hh"
-#include "duration-convert.hh"
#include "change-translator.hh"
#include "file-results.hh"
#include "scope.hh"
// mmm
Mudela_version oldest_version ("1.3.4");
+bool
+is_duration_b (int t)
+{
+ return t == 1 << intlog2(t);
+}
+
+
void
$$ =b;
}
| '[' ':' unsigned {
- if (!Duration::duration_type_b ($3))
+ if (!is_duration_b ($3))
THIS->parser_error (_f ("not a duration: %d", $3));
else if ($3 < 8)
THIS->parser_error (_ ("Can't abbreviate"));
$$ = $1;
}
| duration_length '*' unsigned {
- $$->plet_.iso_i_ *= $3;
+ $$->tuplet_iso_i_ *= $3;
}
| duration_length '/' unsigned {
- $$->plet_.type_i_ *= $3;
+ $$->tuplet_type_i_ *= $3;
}
;
steno_duration:
unsigned {
$$ = new Duration;
- if (!Duration::duration_type_b ($1))
+ if (!is_duration_b ($1))
THIS->parser_error (_f ("not a duration: %d", $1));
else {
- $$->durlog_i_ = Duration_convert::i2_type ($1);
+ $$->durlog_i_ = intlog2 ($1);
}
}
| DURATION_IDENTIFIER {
$$ =0;
}
| ':' unsigned {
- if (!Duration::duration_type_b ($2))
+ if (!is_duration_b ($2))
THIS->parser_error (_f ("not a duration: %d", $2));
else if ($2 < 8)
THIS->parser_error (_ ("Can't abbreviate"));