X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fduration.cc;h=4a836d5dd81bc530715616a1f8e3ec94b1a8e134;hb=f0968255554403de5d86b7e6efff5e644cba7f7a;hp=2ba674802e5f1f8d7bb389450fbaafd9b2f130fc;hpb=492f3643bd2a86956201c3e0c93bb1b65bcdea4e;p=lilypond.git diff --git a/lily/duration.cc b/lily/duration.cc index 2ba674802e..4a836d5dd8 100644 --- a/lily/duration.cc +++ b/lily/duration.cc @@ -1,41 +1,38 @@ /* - duration.cc -- implement Duration, Plet, + duration.cc -- implement Duration source file of the LilyPond music typesetter - (c) 1997--2002 Jan Nieuwenhuizen - Han-Wen Nienhuys + (c) 1997--2004 Jan Nieuwenhuizen + Han-Wen Nienhuys */ -#include - -#include "lily-proto.hh" -#include "string.hh" -#include "moment.hh" #include "duration.hh" -#include "ly-smobs.icc" +#include "misc.hh" +#include "lily-proto.hh" +#include "ly-smobs.icc" int Duration::compare (Duration const &left, Duration const &right) { - return Rational::compare (left.length_mom (), right.length_mom ()); + return Rational::compare (left.get_length (), right.get_length ()); } Duration::Duration () { - durlog_i_ = 0; - dots_i_ = 0; - factor_ = Rational (1,1); + durlog_ = 0; + dots_ = 0; + factor_ = Rational (1, 1); } -Duration::Duration (int l, int d) +Duration::Duration (int log, int d) { - durlog_i_ = l; - dots_i_ = d; - factor_ = Rational (1,1); + durlog_ = log; + dots_ = d; + factor_ = Rational (1, 1); } Duration @@ -47,16 +44,15 @@ Duration::compressed (Rational m) const } Rational -Duration::length_mom () const +Duration::get_length () const { - Rational mom (1 << abs (durlog_i_)); + Rational mom (1 << abs (durlog_)); - if (durlog_i_> 0) - mom = Rational (1)/mom; + if (durlog_> 0) + mom = Rational (1) / mom; Rational delta = mom; - - for (int d = dots_i_; d; d--) + for (int i = 0; i < dots_; i++) { delta /= Rational (2); mom += delta; @@ -65,21 +61,24 @@ Duration::length_mom () const return mom * factor_; } - - String -Duration::str () const +Duration::to_string () const { - String s = to_str (durlog_i_) + to_str ('.', dots_i_); - if (factor_ != Moment (Rational (1,1))) - { - s += "*" + factor_.str (); - } + String s; + + if (durlog_ < 0 ) + s = "log = " + ::to_string (durlog_); + else + s = ::to_string (1 << durlog_); + + s += ::to_string ('.', dots_); + if (factor_ != Moment (Rational (1, 1))) + s += "*" + factor_.to_string (); return s; } -IMPLEMENT_TYPE_P (Duration, "duration?"); +IMPLEMENT_TYPE_P (Duration, "ly:duration?"); SCM Duration::mark_smob (SCM) @@ -88,33 +87,31 @@ Duration::mark_smob (SCM) } IMPLEMENT_SIMPLE_SMOBS (Duration); - - int Duration::print_smob (SCM s, SCM port, scm_print_state *) { - Duration *r = (Duration *) ly_cdr (s); - + Duration *r = (Duration *) SCM_CELL_WORD_1 (s); + scm_puts ("#str ().ch_C ()), port); + scm_display (scm_makfrom0str (r->to_string ().to_str0 ()), port); scm_puts (" >", port); - + return 1; } SCM Duration::equal_p (SCM a , SCM b) { - Duration *p = (Duration *) ly_cdr (a); - Duration *q = (Duration *) ly_cdr (b); + Duration *p = (Duration *) SCM_CELL_WORD_1 (a); + Duration *q = (Duration *) SCM_CELL_WORD_1 (b); - bool eq = p->dots_i_ == q->dots_i_ - && p->durlog_i_ == q->durlog_i_ + bool eq = p->dots_ == q->dots_ + && p->durlog_ == q->durlog_ && p->factor_ == q->factor_; return eq ? SCM_BOOL_T : SCM_BOOL_F; } - + MAKE_SCHEME_CALLBACK (Duration, less_p, 2); SCM Duration::less_p (SCM p1, SCM p2) @@ -128,45 +125,113 @@ Duration::less_p (SCM p1, SCM p2) return SCM_BOOL_F; } +LY_DEFINE (ly_duration_less_p, "ly:durationduration_log ()); +} + +LY_DEFINE (ly_duration_dot_count, "ly:duration-dot-count", + 1, 0, 0, (SCM dur), + "Extract the dot count from @var{dur}") +{ + SCM_ASSERT_TYPE (unsmob_duration (dur), dur, SCM_ARG1, __FUNCTION__, "duration"); + return scm_int2num (unsmob_duration (dur)->dot_count ()); +} + +LY_DEFINE (ly_intlog2, "ly:intlog2", + 1, 0, 0, (SCM d), + "The 2-logarithm of 1/@var{d}.") +{ + SCM_ASSERT_TYPE (scm_is_number (d), d, SCM_ARG1, __FUNCTION__, "integer"); + int log = intlog2 (scm_to_int (d)); + return scm_int2num (log); +} + +LY_DEFINE (ly_duration_factor, "ly:duration-factor", + 1, 0, 0, (SCM dur), + "Extract the compression factor from @var{dur}. Return as a pair.") { - Duration * p = new Duration (*this); - return p->smobbed_self (); + SCM_ASSERT_TYPE (unsmob_duration (dur), dur, SCM_ARG1, __FUNCTION__, "duration"); + Rational r = unsmob_duration (dur)->factor (); + return scm_cons (scm_int2num (r.num ()), scm_int2num (r.den ())); } int Duration::duration_log () const { - return durlog_i_; + return durlog_; } int Duration::dot_count () const { - return dots_i_; + return dots_; } -