]> git.donarmstrong.com Git - lilypond.git/blob - lily/moment-scheme.cc
fix brown paper bag design: calling conventions are platform dependent.
[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--2007 Han-Wen Nienhuys <hanwen@xs4all.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   LY_ASSERT_TYPE (scm_is_integer, n, 1);
25   LY_ASSERT_TYPE(scm_is_integer,d, 2);
26
27   int grace_num = 0;
28   if (gn != SCM_UNDEFINED)
29     {
30       LY_ASSERT_TYPE(scm_is_integer,gn, 3);
31       grace_num = scm_to_int (gn);
32     }
33
34   int grace_den = 1;
35   if (gd != SCM_UNDEFINED)
36     {
37       LY_ASSERT_TYPE(scm_is_integer,gd, 4);
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 LY_DEFINE (ly_moment_sub, "ly:moment-sub",
46            2, 0, 0, (SCM a, SCM b),
47            "Subtract two moments.")
48 {
49   LY_ASSERT_SMOB (Moment, a, 1); 
50   LY_ASSERT_SMOB (Moment,b, 2);
51   
52   Moment *ma = unsmob_moment (a);
53   Moment *mb = unsmob_moment (b);
54
55   return (*ma - *mb).smobbed_copy ();
56 }
57
58 LY_DEFINE (ly_moment_add, "ly:moment-add",
59            2, 0, 0, (SCM a, SCM b),
60            "Add two moments.")
61 {
62   LY_ASSERT_SMOB (Moment, a, 1); 
63   LY_ASSERT_SMOB(Moment,b, 2); 
64
65   Moment *ma = unsmob_moment (a);
66   Moment *mb = unsmob_moment (b);
67
68   return (*ma + *mb).smobbed_copy ();
69 }
70
71 LY_DEFINE (ly_moment_mul, "ly:moment-mul",
72            2, 0, 0, (SCM a, SCM b),
73            "Multiply two moments.")
74 {
75   LY_ASSERT_SMOB (Moment, a, 1); 
76   LY_ASSERT_SMOB(Moment, b, 2); 
77
78   Moment *ma = unsmob_moment (a);
79   Moment *mb = unsmob_moment (b);
80   return (*ma * * mb).smobbed_copy ();
81 }
82
83 LY_DEFINE (ly_moment_div, "ly:moment-div",
84            2, 0, 0, (SCM a, SCM b),
85            "Divide two moments.")
86 {
87   LY_ASSERT_SMOB (Moment, a, 1); 
88   LY_ASSERT_SMOB(Moment, b, 2); 
89
90   Moment *ma = unsmob_moment (a);
91   Moment *mb = unsmob_moment (b);
92   
93   return (*ma / * mb).smobbed_copy ();
94 }
95
96 LY_DEFINE (ly_moment_mod, "ly:moment-mod",
97            2, 0, 0, (SCM a, SCM b),
98            "Modulo of two moments.")
99 {
100   LY_ASSERT_SMOB (Moment, a, 1); 
101   LY_ASSERT_SMOB(Moment, b, 2); 
102   
103   Moment *ma = unsmob_moment (a);
104   Moment *mb = unsmob_moment (b);
105   return (*ma % * mb).smobbed_copy ();
106 }
107
108 LY_DEFINE (ly_moment_grace_numerator, "ly:moment-grace-numerator",
109            1, 0, 0, (SCM mom),
110            "Extract numerator from grace timing.")
111 {
112   LY_ASSERT_SMOB (Moment, mom, 1);
113
114   Moment *ma = unsmob_moment (mom);
115
116   return scm_from_int (ma->grace_part_.numerator ());
117 }
118
119 LY_DEFINE (ly_moment_grace_denominator, "ly:moment-grace-denominator",
120            1, 0, 0, (SCM mom),
121            "Extract denominator from grace timing.")
122 {
123   LY_ASSERT_SMOB (Moment, mom, 1);
124   Moment *ma = unsmob_moment (mom);
125
126   return scm_from_int (ma->grace_part_.denominator ());
127 }
128 LY_DEFINE (ly_moment_main_numerator, "ly:moment-main-numerator",
129            1, 0, 0, (SCM mom),
130            "Extract numerator from main timing.")
131 {
132   LY_ASSERT_SMOB (Moment, mom, 1);
133   Moment *ma = unsmob_moment (mom);
134
135   return scm_from_int (ma->main_part_.numerator ());
136 }
137
138 LY_DEFINE (ly_moment_main_denominator, "ly:moment-main-denominator",
139            1, 0, 0, (SCM mom),
140            "Extract denominator from main timing.")
141 {
142   LY_ASSERT_SMOB (Moment, mom, 1);
143   Moment *ma = unsmob_moment (mom);
144
145   return scm_from_int (ma->main_part_.denominator ());
146 }
147
148 LY_DEFINE (ly_moment_less_p, "ly:moment<?",
149            2, 0, 0, (SCM a, SCM b),
150            "Compare two moments.")
151 {
152   LY_ASSERT_SMOB (Moment, a, 1); 
153   LY_ASSERT_SMOB (Moment, b, 2); 
154   
155   Moment *ma = unsmob_moment (a);
156   Moment *mb = unsmob_moment (b);
157
158   return ly_bool2scm (*ma < *mb);
159 }
160