2 duration.cc -- implement Duration
4 source file of the LilyPond music typesetter
6 (c) 1997--2007 Jan Nieuwenhuizen <janneke@gnu.org>
7 Han-Wen Nienhuys <hanwen@xs4all.nl>
10 #include "duration.hh"
13 MAKE_SCHEME_CALLBACK (Duration
, less_p
, 2);
15 Duration::less_p (SCM p1
, SCM p2
)
17 Duration
*a
= unsmob_duration (p1
);
18 Duration
*b
= unsmob_duration (p2
);
20 if (compare (*a
, *b
) < 0)
26 LY_DEFINE (ly_duration_less_p
, "ly:duration<?",
27 2, 0, 0, (SCM p1
, SCM p2
),
28 "Is @var{p1} shorter than @var{p2}?")
30 LY_ASSERT_SMOB (Duration
, p1
, 1);
31 LY_ASSERT_SMOB (Duration
, p2
, 2);
33 Duration
*a
= unsmob_duration (p1
);
34 Duration
*b
= unsmob_duration (p2
);
36 if (Duration::compare (*a
, *b
) < 0)
42 LY_DEFINE (ly_make_duration
, "ly:make-duration",
43 1, 3, 0, (SCM length
, SCM dotcount
, SCM num
, SCM den
),
44 "@var{length} is the negative logarithm (base 2) of the duration:"
45 " 1@tie{}is a half note, 2@tie{}is a quarter note, 3@tie{}is an"
46 " eighth note, etc. The number of dots after the note is given by"
47 " the optional argument @var{dotcount}.\n"
49 "The duration factor is optionally given by @var{num} and"
52 "A duration is a musical duration, i.e., a length of time"
53 " described by a power of two (whole, half, quarter, etc.) and a"
54 " number of augmentation dots.")
56 LY_ASSERT_TYPE (scm_is_integer
, length
, 1);
59 if (dotcount
!= SCM_UNDEFINED
)
61 LY_ASSERT_TYPE (scm_is_integer
, dotcount
,2);
62 dots
= scm_to_int (dotcount
);
65 bool compress
= false;
66 if (num
!= SCM_UNDEFINED
)
68 LY_ASSERT_TYPE (scm_is_number
, num
, 3);
72 num
= scm_from_int (1);
74 if (den
!= SCM_UNDEFINED
)
76 LY_ASSERT_TYPE (scm_is_number
, den
, 4);
80 den
= scm_from_int (1);
82 Duration
p (scm_to_int (length
), dots
);
84 p
= p
.compressed (Rational (scm_to_int (num
), scm_to_int (den
)));
86 return p
.smobbed_copy ();
89 LY_DEFINE (ly_duration_log
, "ly:duration-log",
91 "Extract the duration log from @var{dur}.")
93 LY_ASSERT_SMOB (Duration
, dur
, 1);
94 return scm_from_int (unsmob_duration (dur
)->duration_log ());
97 LY_DEFINE (ly_duration_dot_count
, "ly:duration-dot-count",
99 "Extract the dot count from @var{dur}.")
101 LY_ASSERT_SMOB (Duration
, dur
, 1);
102 return scm_from_int (unsmob_duration (dur
)->dot_count ());
105 LY_DEFINE (ly_intlog2
, "ly:intlog2",
107 "The 2-logarithm of 1/@var{d}.")
109 LY_ASSERT_TYPE (scm_is_number
, d
, 1);
110 int log
= intlog2 (scm_to_int (d
));
111 return scm_from_int (log
);
114 LY_DEFINE (ly_duration_length
, "ly:duration-length",
116 "The length of the duration as a @code{moment}.")
118 LY_ASSERT_SMOB (Duration
, dur
, 1);
119 return Moment (unsmob_duration (dur
)->get_length ()).smobbed_copy ();
122 LY_DEFINE (ly_duration_2_string
, "ly:duration->string",
124 "Convert @var{dur} to a string.")
126 LY_ASSERT_SMOB (Duration
, dur
, 1);
127 return ly_string2scm (unsmob_duration (dur
)->to_string ());
130 LY_DEFINE (ly_duration_factor
, "ly:duration-factor",
132 "Extract the compression factor from @var{dur}."
133 " Return it as a pair.")
135 LY_ASSERT_SMOB (Duration
, dur
, 1);
136 Rational r
= unsmob_duration (dur
)->factor ();
137 return scm_cons (scm_from_int (r
.num ()), scm_from_int (r
.den ()));