2 moment.cc -- implement Moment
4 source file of the GNU LilyPond music typesetter
6 (c) 1999--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
11 #include "lily-guile.hh"
14 #include "ly-smobs.icc"
16 IMPLEMENT_SIMPLE_SMOBS (Moment
);
17 IMPLEMENT_TYPE_P (Moment
, "ly:moment?");
20 Moment::mark_smob (SCM
)
29 Moment::print_smob (SCM s
, SCM port
, scm_print_state
*)
31 Moment
*r
= (Moment
*) ly_cdr (s
);
33 scm_puts ("#<Mom ", port
);
34 String str
= r
->to_string ();
35 scm_puts ((char *)str
.to_str0 (), port
);
42 TODO: add optional factor argument.
44 LY_DEFINE (make_moment
,"ly:make-moment", 2,2,0, (SCM n
, SCM d
, SCM gn
, SCM gd
),
45 "Create the rational number with main timing @var{n}/@var{d}, "
46 "and optional grace timin @var{gn}/@var{gd}.\n"
49 "Moment is a point in musical time. It is consists of a pair of\n"
50 "rationals (@var{m},@var{g}), where @var{m} is the timing for the main\n"
51 "notes, and @var{g} the timing for grace notes. In absence of grace\n"
52 "notes, @var{g} is zero.\n"
55 SCM_ASSERT_TYPE (SCM_INUMP (n
), n
, SCM_ARG1
, __FUNCTION__
, "integer");
56 SCM_ASSERT_TYPE (SCM_INUMP (d
), d
, SCM_ARG2
, __FUNCTION__
, "integer");
59 if (gn
!= SCM_UNDEFINED
)
61 SCM_ASSERT_TYPE (SCM_INUMP (gn
), gn
, SCM_ARG3
, __FUNCTION__
, "integer");
62 grace_num
= gh_scm2int (gn
);
66 if (gd
!= SCM_UNDEFINED
)
68 SCM_ASSERT_TYPE (SCM_INUMP (gd
), gd
, SCM_ARG4
, __FUNCTION__
, "integer");
69 grace_den
= gh_scm2int (gd
);
72 return Moment (Rational (gh_scm2int (n
), gh_scm2int (d
)),
73 Rational (grace_num
, grace_den
)).smobbed_copy ();
76 LY_DEFINE (add_moment
,"ly:add-moment", 2,0,0, (SCM a
, SCM b
),
80 Moment
* ma
= unsmob_moment (a
);
81 Moment
* mb
= unsmob_moment (b
);
82 SCM_ASSERT_TYPE (ma
, a
, SCM_ARG1
, __FUNCTION__
, "moment");
83 SCM_ASSERT_TYPE (mb
, b
, SCM_ARG2
, __FUNCTION__
, "moment");
85 return (*ma
+ *mb
).smobbed_copy ();
89 LY_DEFINE (mul_moment
,"ly:mul-moment", 2,0,0, (SCM a
, SCM b
),
90 "Multiply two moments."
93 Moment
* ma
= unsmob_moment (a
);
94 Moment
* mb
= unsmob_moment (b
);
95 SCM_ASSERT_TYPE (ma
, a
, SCM_ARG1
, __FUNCTION__
, "moment");
96 SCM_ASSERT_TYPE (mb
, b
, SCM_ARG2
, __FUNCTION__
, "moment");
98 return (*ma
* *mb
).smobbed_copy ();
103 LY_DEFINE (div_moment
,"ly:div-moment", 2,0,0, (SCM a
, SCM b
),
104 "Divide two moments."
107 Moment
* ma
= unsmob_moment (a
);
108 Moment
* mb
= unsmob_moment (b
);
109 SCM_ASSERT_TYPE (ma
, a
, SCM_ARG1
, __FUNCTION__
, "moment");
110 SCM_ASSERT_TYPE (mb
, b
, SCM_ARG2
, __FUNCTION__
, "moment");
112 return (*ma
/ *mb
).smobbed_copy ();
115 LY_DEFINE (ly_moment_less_p
,"ly:moment<?", 2,0,0, (SCM a
, SCM b
),
116 "Compare two moments.")
118 Moment
* ma
= unsmob_moment (a
);
119 Moment
* mb
= unsmob_moment (b
);
120 SCM_ASSERT_TYPE (ma
, a
, SCM_ARG1
, __FUNCTION__
, "moment");
121 SCM_ASSERT_TYPE (mb
, b
, SCM_ARG2
, __FUNCTION__
, "moment");
123 return gh_bool2scm (*ma
< *mb
);
129 Moment::equal_p (SCM a
, SCM b
)
131 Moment
*m1
= unsmob_moment (a
);
132 Moment
*m2
= unsmob_moment (b
);
134 return (*m1
== *m2
) ? SCM_BOOL_T
: SCM_BOOL_F
;
137 /****************************************************************/
140 compare (Moment
const &a
, Moment
const &b
)
142 return Moment::compare (a
,b
);
146 Moment::compare (Moment
const &a
, Moment
const &b
)
148 int c
= Rational::compare (a
.main_part_
,b
.main_part_
);
152 return Rational::compare (a
.grace_part_
, b
.grace_part_
);
160 Moment::Moment (int m
)
162 main_part_
= Rational (m
);
163 grace_part_
= Rational ( 0);
166 Moment::Moment (Rational m
, Rational g
)
172 Moment::Moment (Rational m
)
175 grace_part_
= Rational (0);
179 Moment::operator += (Moment
const &src
)
181 main_part_
+=src
.main_part_
;
182 grace_part_
+= src
.grace_part_
;
185 Moment::operator -= (Moment
const &src
)
187 main_part_
-= src
.main_part_
;
188 grace_part_
-= src
.grace_part_
;
192 only take the main part of SRC for multiplication.
195 Moment::operator *= (Moment
const &src
)
197 main_part_
*= src
.main_part_
;
198 grace_part_
*= src
.main_part_
;
202 only take the main part of SRC for multiplication.
205 Moment::operator /= (Moment
const &src
)
207 main_part_
/= src
.main_part_
;
208 grace_part_
/= src
.main_part_
;
214 Moment::den () const { return main_part_
.den (); }
217 Moment::num () const { return main_part_
.num (); }
220 Moment::to_bool () const
222 return main_part_
|| grace_part_
;
226 Moment::set_infinite (int k
)
228 main_part_
.set_infinite (k
);
233 Moment::to_string () const
235 String s
= main_part_
.to_string ();
238 s
+= "G" + grace_part_
.to_string ();
244 Moment::operator - () const
247 m
.grace_part_
= - grace_part_
;
248 m
. main_part_
= - main_part_
;
253 #ifdef STREAM_SUPPORT
255 operator << (std::ostream
&os
, Moment
const &m
)
257 os
<< m
.to_string ();