]> git.donarmstrong.com Git - lilypond.git/blob - lily/moment-scheme.cc
*** empty log message ***
[lilypond.git] / lily / moment-scheme.cc
1 /*   
2   moment.cc --  implement Moment bindings
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1999--2005 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 */
8
9 #include "moment.hh"
10
11
12 /* TODO: add optional factor argument. */
13 LY_DEFINE (ly_make_moment, "ly:make-moment",
14            2, 2, 0, (SCM n, SCM d, SCM gn, SCM gd),
15            "Create the rational number with main timing @var{n}/@var{d}, "
16            "and optional grace timin @var{gn}/@var{gd}.\n"
17            "\n"
18            "\n"
19            "Moment is a point in musical time.  "
20            "It is consists of a pair of rationals (@var{m},@var{g}), "
21            "where @var{m} is the timing for the main\n"
22            "notes, and @var{g} the timing for grace notes.  "
23            "In absence of grace notes, @var{g} is zero.\n")
24 {
25   SCM_ASSERT_TYPE (scm_is_integer (n), n, SCM_ARG1, __FUNCTION__, "integer");
26   SCM_ASSERT_TYPE (scm_is_integer (d), d, SCM_ARG2, __FUNCTION__, "integer");
27
28   int grace_num = 0;
29   if (gn != SCM_UNDEFINED)
30     {
31       SCM_ASSERT_TYPE (scm_is_integer (gn), gn, SCM_ARG3, __FUNCTION__, "integer");
32       grace_num = scm_to_int (gn);
33     }
34
35   int grace_den = 1;
36   if (gd != SCM_UNDEFINED)
37     {
38       SCM_ASSERT_TYPE (scm_is_integer (gd), gd, SCM_ARG4, __FUNCTION__, "integer");
39       grace_den = scm_to_int (gd);
40     }
41
42   return Moment (Rational (scm_to_int (n), scm_to_int (d)),
43                  Rational (grace_num, grace_den)).smobbed_copy ();
44 }
45
46 LY_DEFINE (ly_add_moment, "ly:add-moment",
47            2, 0, 0, (SCM a, SCM b),
48            "Add two moments.")
49 {
50   Moment *ma = unsmob_moment (a);
51   Moment *mb = unsmob_moment (b);
52   SCM_ASSERT_TYPE (ma, a, SCM_ARG1, __FUNCTION__, "moment");
53   SCM_ASSERT_TYPE (mb, b, SCM_ARG2, __FUNCTION__, "moment");
54   return (*ma + *mb).smobbed_copy ();
55 }
56
57 LY_DEFINE (ly_mul_moment,"ly:mul-moment",
58            2, 0, 0, (SCM a, SCM b),
59            "Multiply two moments.")
60 {
61   Moment *ma = unsmob_moment (a);
62   Moment *mb = unsmob_moment (b);
63   SCM_ASSERT_TYPE (ma, a, SCM_ARG1, __FUNCTION__, "moment");
64   SCM_ASSERT_TYPE (mb, b, SCM_ARG2, __FUNCTION__, "moment");
65   return (*ma * *mb).smobbed_copy ();
66 }
67
68 LY_DEFINE (ly_div_moment,"ly:div-moment",
69            2, 0, 0, (SCM a, SCM b),
70            "Divide two moments.")
71 {
72   Moment *ma = unsmob_moment (a);
73   Moment *mb = unsmob_moment (b);
74   SCM_ASSERT_TYPE (ma, a, SCM_ARG1, __FUNCTION__, "moment");
75   SCM_ASSERT_TYPE (mb, b, SCM_ARG2, __FUNCTION__, "moment");
76   return (*ma / *mb).smobbed_copy ();
77 }
78
79 LY_DEFINE (ly_moment_main_numerator,"ly:moment-main-numerator",
80            1, 0, 0, (SCM mom),
81            "Extract numerator from main timing.")
82 {
83   Moment *ma = unsmob_moment (mom);
84   SCM_ASSERT_TYPE (ma, mom, SCM_ARG1, __FUNCTION__, "moment");
85
86   return scm_from_int (ma->main_part_.numerator ()); 
87 }
88
89 LY_DEFINE (ly_moment_main_denominator,"ly:moment-main-denominator",
90            1, 0, 0, (SCM mom),
91            "Extract denominator from main timing.")
92 {
93   Moment *ma = unsmob_moment (mom);
94   SCM_ASSERT_TYPE (ma, mom, SCM_ARG1, __FUNCTION__, "moment");
95
96   return scm_from_int (ma->main_part_.denominator ()); 
97 }
98
99 LY_DEFINE (ly_moment_less_p,"ly:moment<?",
100            2, 0, 0, (SCM a, SCM b),
101            "Compare two moments.")
102 {
103   Moment *ma = unsmob_moment (a);
104   Moment *mb = unsmob_moment (b);
105   SCM_ASSERT_TYPE (ma, a, SCM_ARG1, __FUNCTION__, "moment");
106   SCM_ASSERT_TYPE (mb, b, SCM_ARG2, __FUNCTION__, "moment");
107   return ly_bool2scm (*ma <  *mb);
108 }
109