X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Fmoment-scheme.cc;h=c0422b43609ed9caff5f88bdab51745b7154c9c9;hb=6f3f8f0fceed3b318c2572337e7dca83e4a11f6c;hp=6b1054140386fcdb141f50e784df23c80f37efe6;hpb=1c846b2c2348b4e0ca4a3c2e8fb267047ba2d203;p=lilypond.git diff --git a/lily/moment-scheme.cc b/lily/moment-scheme.cc index 6b10541403..c0422b4360 100644 --- a/lily/moment-scheme.cc +++ b/lily/moment-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2011 Han-Wen Nienhuys + Copyright (C) 1999--2014 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -21,43 +21,63 @@ /* TODO: add optional factor argument. */ LY_DEFINE (ly_make_moment, "ly:make-moment", - 2, 2, 0, (SCM n, SCM d, SCM gn, SCM gd), - "Create the rational number with main timing @var{n}/@var{d}," - " and optional grace timing @var{gn}/@var{gd}.\n" - "\n" - "A @dfn{moment} is a point in musical time. It consists of" - " a pair of rationals (@var{m},@tie{}@var{g}), where @var{m} is" - " the timing for the main notes, and @var{g} the timing for" - " grace notes. In absence of grace notes, @var{g}@tie{}is zero.") + 1, 3, 0, (SCM m, SCM g, SCM gn, SCM gd), + "Create the moment with rational main timing @var{m}," + " and optional grace timing @var{g}.\n" + "\n" + "A @dfn{moment} is a point in musical time. It consists of" + " a pair of rationals (@var{m},@tie{}@var{g}), where @var{m} is" + " the timing for the main notes, and @var{g} the timing for" + " grace notes. In absence of grace notes, @var{g}@tie{}is zero.\n" + "\n" + "For compatibility reasons, it is possible to write two" + " numbers specifying numerator and denominator instead of" + " the rationals. These forms cannot be mixed, and the two-" + "argument form is disambiguated by the sign of the second" + " argument: if it is positive, it can only be a denominator" + " and not a grace timing." + ) { - LY_ASSERT_TYPE (scm_is_integer, n, 1); - LY_ASSERT_TYPE (scm_is_integer, d, 2); + LY_ASSERT_TYPE (ly_is_rational, m, 1); + if (SCM_UNBNDP (g)) + return Moment (ly_scm2rational (m)).smobbed_copy (); - int grace_num = 0; - if (gn != SCM_UNDEFINED) + if (SCM_UNBNDP (gn)) { - LY_ASSERT_TYPE (scm_is_integer, gn, 3); - grace_num = scm_to_int (gn); + LY_ASSERT_TYPE (ly_is_rational, g, 2); + if (scm_is_true (scm_positive_p (g))) + { + LY_ASSERT_TYPE (scm_is_integer, m, 1); + LY_ASSERT_TYPE (scm_is_integer, g, 2); + return Moment (Rational (scm_to_int64 (m), + scm_to_int64 (g))).smobbed_copy (); + } + return Moment (ly_scm2rational (m), + ly_scm2rational (g)).smobbed_copy (); } - int grace_den = 1; - if (gd != SCM_UNDEFINED) + LY_ASSERT_TYPE (scm_is_integer, m, 1); + LY_ASSERT_TYPE (scm_is_integer, g, 2); + LY_ASSERT_TYPE (scm_is_integer, gn, 3); + I64 grace_num = scm_to_int64 (gn); + I64 grace_den = 1; + if (!SCM_UNBNDP (gd)) { LY_ASSERT_TYPE (scm_is_integer, gd, 4); - grace_den = scm_to_int (gd); + grace_den = scm_to_int64 (gd); } - return Moment (Rational (scm_to_int (n), scm_to_int (d)), - Rational (grace_num, grace_den)).smobbed_copy (); + return Moment (Rational (scm_to_int64 (m), scm_to_int64 (g)), + Rational (grace_num, grace_den)).smobbed_copy (); } LY_DEFINE (ly_moment_sub, "ly:moment-sub", - 2, 0, 0, (SCM a, SCM b), - "Subtract two moments.") + 2, 0, 0, (SCM a, SCM b), + "Subtract two moments.") { - LY_ASSERT_SMOB (Moment, a, 1); + LY_ASSERT_SMOB (Moment, a, 1); LY_ASSERT_SMOB (Moment, b, 2); - + Moment *ma = unsmob_moment (a); Moment *mb = unsmob_moment (b); @@ -65,11 +85,11 @@ LY_DEFINE (ly_moment_sub, "ly:moment-sub", } LY_DEFINE (ly_moment_add, "ly:moment-add", - 2, 0, 0, (SCM a, SCM b), - "Add two moments.") + 2, 0, 0, (SCM a, SCM b), + "Add two moments.") { - LY_ASSERT_SMOB (Moment, a, 1); - LY_ASSERT_SMOB (Moment, b, 2); + LY_ASSERT_SMOB (Moment, a, 1); + LY_ASSERT_SMOB (Moment, b, 2); Moment *ma = unsmob_moment (a); Moment *mb = unsmob_moment (b); @@ -78,11 +98,11 @@ LY_DEFINE (ly_moment_add, "ly:moment-add", } LY_DEFINE (ly_moment_mul, "ly:moment-mul", - 2, 0, 0, (SCM a, SCM b), - "Multiply two moments.") + 2, 0, 0, (SCM a, SCM b), + "Multiply two moments.") { - LY_ASSERT_SMOB (Moment, a, 1); - LY_ASSERT_SMOB (Moment, b, 2); + LY_ASSERT_SMOB (Moment, a, 1); + LY_ASSERT_SMOB (Moment, b, 2); Moment *ma = unsmob_moment (a); Moment *mb = unsmob_moment (b); @@ -90,33 +110,42 @@ LY_DEFINE (ly_moment_mul, "ly:moment-mul", } LY_DEFINE (ly_moment_div, "ly:moment-div", - 2, 0, 0, (SCM a, SCM b), - "Divide two moments.") + 2, 0, 0, (SCM a, SCM b), + "Divide two moments.") { - LY_ASSERT_SMOB (Moment, a, 1); - LY_ASSERT_SMOB (Moment, b, 2); + LY_ASSERT_SMOB (Moment, a, 1); + LY_ASSERT_SMOB (Moment, b, 2); Moment *ma = unsmob_moment (a); Moment *mb = unsmob_moment (b); - + return (*ma / * mb).smobbed_copy (); } LY_DEFINE (ly_moment_mod, "ly:moment-mod", - 2, 0, 0, (SCM a, SCM b), - "Modulo of two moments.") + 2, 0, 0, (SCM a, SCM b), + "Modulo of two moments.") { - LY_ASSERT_SMOB (Moment, a, 1); - LY_ASSERT_SMOB (Moment, b, 2); - + LY_ASSERT_SMOB (Moment, a, 1); + LY_ASSERT_SMOB (Moment, b, 2); + Moment *ma = unsmob_moment (a); Moment *mb = unsmob_moment (b); return (*ma % * mb).smobbed_copy (); } +LY_DEFINE (ly_moment_grace, "ly:moment-grace", + 1, 0, 0, (SCM mom), + "Extract grace timing as a rational number from @var{mom}.") +{ + LY_ASSERT_SMOB (Moment, mom, 1); + + return ly_rational2scm (unsmob_moment (mom)->grace_part_); +} + LY_DEFINE (ly_moment_grace_numerator, "ly:moment-grace-numerator", - 1, 0, 0, (SCM mom), - "Extract numerator from grace timing.") + 1, 0, 0, (SCM mom), + "Extract numerator from grace timing.") { LY_ASSERT_SMOB (Moment, mom, 1); @@ -126,17 +155,27 @@ LY_DEFINE (ly_moment_grace_numerator, "ly:moment-grace-numerator", } LY_DEFINE (ly_moment_grace_denominator, "ly:moment-grace-denominator", - 1, 0, 0, (SCM mom), - "Extract denominator from grace timing.") + 1, 0, 0, (SCM mom), + "Extract denominator from grace timing.") { LY_ASSERT_SMOB (Moment, mom, 1); Moment *ma = unsmob_moment (mom); return scm_from_int64 (ma->grace_part_.denominator ()); } + +LY_DEFINE (ly_moment_main, "ly:moment-main", + 1, 0, 0, (SCM mom), + "Extract main timing as a rational number from @var{mom}.") +{ + LY_ASSERT_SMOB (Moment, mom, 1); + + return ly_rational2scm (unsmob_moment (mom)->main_part_); +} + LY_DEFINE (ly_moment_main_numerator, "ly:moment-main-numerator", - 1, 0, 0, (SCM mom), - "Extract numerator from main timing.") + 1, 0, 0, (SCM mom), + "Extract numerator from main timing.") { LY_ASSERT_SMOB (Moment, mom, 1); Moment *ma = unsmob_moment (mom); @@ -145,8 +184,8 @@ LY_DEFINE (ly_moment_main_numerator, "ly:moment-main-numerator", } LY_DEFINE (ly_moment_main_denominator, "ly:moment-main-denominator", - 1, 0, 0, (SCM mom), - "Extract denominator from main timing.") + 1, 0, 0, (SCM mom), + "Extract denominator from main timing.") { LY_ASSERT_SMOB (Moment, mom, 1); Moment *ma = unsmob_moment (mom); @@ -155,12 +194,12 @@ LY_DEFINE (ly_moment_main_denominator, "ly:moment-main-denominator", } LY_DEFINE (ly_moment_less_p, "ly:moment