]> git.donarmstrong.com Git - lilypond.git/blob - lily/moment-scheme.cc
* scm/music-functions.scm (skip-to-last): new function. Show only
[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 /* TODO: add optional factor argument. */
12 LY_DEFINE (ly_make_moment, "ly:make-moment",
13            2, 2, 0, (SCM n, SCM d, SCM gn, SCM gd),
14            "Create the rational number with main timing @var{n}/@var{d}, "
15            "and optional grace timin @var{gn}/@var{gd}.\n"
16            "\n"
17            "\n"
18            "Moment is a point in musical time.  "
19            "It is consists of a pair of rationals (@var{m}, @var{g}), "
20            "where @var{m} is the timing for the main\n"
21            "notes, and @var{g} the timing for grace notes.  "
22            "In absence of grace notes, @var{g} is zero.\n")
23 {
24   SCM_ASSERT_TYPE (scm_is_integer (n), n, SCM_ARG1, __FUNCTION__, "integer");
25   SCM_ASSERT_TYPE (scm_is_integer (d), d, SCM_ARG2, __FUNCTION__, "integer");
26
27   int grace_num = 0;
28   if (gn != SCM_UNDEFINED)
29     {
30       SCM_ASSERT_TYPE (scm_is_integer (gn), gn, SCM_ARG3, __FUNCTION__, "integer");
31       grace_num = scm_to_int (gn);
32     }
33
34   int grace_den = 1;
35   if (gd != SCM_UNDEFINED)
36     {
37       SCM_ASSERT_TYPE (scm_is_integer (gd), gd, SCM_ARG4, __FUNCTION__, "integer");
38       grace_den = scm_to_int (gd);
39     }
40
41   return Moment (Rational (scm_to_int (n), scm_to_int (d)),
42                  Rational (grace_num, grace_den)).smobbed_copy ();
43 }
44
45
46 LY_DEFINE (ly_sub_moment, "ly:moment-sub",
47            2, 0, 0, (SCM a, SCM b),
48            "Subtract 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_moment_add, "ly:moment-add",
58            2, 0, 0, (SCM a, SCM b),
59            "Add 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_moment_mul, "ly:moment-mul",
69            2, 0, 0, (SCM a, SCM b),
70            "Multiply 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_div, "ly:moment-div",
80            2, 0, 0, (SCM a, SCM b),
81            "Divide two moments.")
82 {
83   Moment *ma = unsmob_moment (a);
84   Moment *mb = unsmob_moment (b);
85   SCM_ASSERT_TYPE (ma, a, SCM_ARG1, __FUNCTION__, "moment");
86   SCM_ASSERT_TYPE (mb, b, SCM_ARG2, __FUNCTION__, "moment");
87   return (*ma / * mb).smobbed_copy ();
88 }
89
90 LY_DEFINE (ly_moment_mod, "ly:moment-mod",
91            2, 0, 0, (SCM a, SCM b),
92            "Modulo of two moments.")
93 {
94   Moment *ma = unsmob_moment (a);
95   Moment *mb = unsmob_moment (b);
96   SCM_ASSERT_TYPE (ma, a, SCM_ARG1, __FUNCTION__, "moment");
97   SCM_ASSERT_TYPE (mb, b, SCM_ARG2, __FUNCTION__, "moment");
98   return (*ma % * mb).smobbed_copy ();
99 }
100
101
102 LY_DEFINE (ly_moment_grace_numerator, "ly:moment-grace-numerator",
103            1, 0, 0, (SCM mom),
104            "Extract numerator from grace timing.")
105 {
106   Moment *ma = unsmob_moment (mom);
107   SCM_ASSERT_TYPE (ma, mom, SCM_ARG1, __FUNCTION__, "moment");
108
109   return scm_from_int (ma->grace_part_.numerator ());
110 }
111
112 LY_DEFINE (ly_moment_grace_denominator, "ly:moment-grace-denominator",
113            1, 0, 0, (SCM mom),
114            "Extract denominator from grace timing.")
115 {
116   Moment *ma = unsmob_moment (mom);
117   SCM_ASSERT_TYPE (ma, mom, SCM_ARG1, __FUNCTION__, "moment");
118
119   return scm_from_int (ma->grace_part_.denominator ());
120 }
121 LY_DEFINE (ly_moment_main_numerator, "ly:moment-main-numerator",
122            1, 0, 0, (SCM mom),
123            "Extract numerator from main timing.")
124 {
125   Moment *ma = unsmob_moment (mom);
126   SCM_ASSERT_TYPE (ma, mom, SCM_ARG1, __FUNCTION__, "moment");
127
128   return scm_from_int (ma->main_part_.numerator ());
129 }
130
131 LY_DEFINE (ly_moment_main_denominator, "ly:moment-main-denominator",
132            1, 0, 0, (SCM mom),
133            "Extract denominator from main timing.")
134 {
135   Moment *ma = unsmob_moment (mom);
136   SCM_ASSERT_TYPE (ma, mom, SCM_ARG1, __FUNCTION__, "moment");
137
138   return scm_from_int (ma->main_part_.denominator ());
139 }
140
141 LY_DEFINE (ly_moment_less_p, "ly:moment<?",
142            2, 0, 0, (SCM a, SCM b),
143            "Compare two moments.")
144 {
145   Moment *ma = unsmob_moment (a);
146   Moment *mb = unsmob_moment (b);
147   SCM_ASSERT_TYPE (ma, a, SCM_ARG1, __FUNCTION__, "moment");
148   SCM_ASSERT_TYPE (mb, b, SCM_ARG2, __FUNCTION__, "moment");
149   return ly_bool2scm (*ma < *mb);
150 }
151