2 scale.cc -- implement Scale
4 source file of the GNU LilyPond music typesetter
6 (c) 2006--2007 Han-Wen Nienhuys <hanwen@lilypond.org>
12 #include "ly-smobs.icc"
15 todo: put string <-> pitch here too.
18 LY_DEFINE (ly_make_scale
, "ly:make-scale",
20 "Create a scale. Takes a vector of integers as argument.")
22 bool type_ok
= scm_is_vector (steps
);
24 vector
<Rational
> semitones
;
27 int len
= scm_c_vector_length (steps
);
28 for (int i
= 0 ; i
< len
; i
++)
30 SCM step
= scm_c_vector_ref (steps
, i
);
31 type_ok
= type_ok
&& scm_is_rational (step
);
34 Rational
from_c (scm_to_int (scm_numerator (step
)),
35 scm_to_int (scm_denominator (step
)));
36 semitones
.push_back (from_c
);
41 SCM_ASSERT_TYPE (type_ok
, steps
, SCM_ARG1
, __FUNCTION__
, "vector of int");
44 s
->step_tones_
= semitones
;
46 SCM retval
= s
->self_scm ();
53 LY_DEFINE (ly_default_scale
, "ly:default-scale",
55 "Get the global default scale.")
57 return default_global_scale
59 : default_global_scale
->self_scm ();
63 Scale
* default_global_scale
= 0;
65 LY_DEFINE (ly_set_default_scale
, "ly:set-default-scale",
67 "Set the global default scale.")
69 LY_ASSERT_SMOB (Scale
, scale
, 1);
71 Scale
*s
= Scale::unsmob (scale
);
72 if (default_global_scale
)
73 default_global_scale
->unprotect ();
74 default_global_scale
= s
;
77 return SCM_UNSPECIFIED
;
82 Scale::print_smob (SCM x
, SCM port
, scm_print_state
*)
86 scm_puts ("#<Scale>", port
);
92 Scale::mark_smob (SCM x
)
95 return SCM_UNSPECIFIED
;
103 Scale::Scale (Scale
const &src
)
105 step_tones_
= src
.step_tones_
;
114 IMPLEMENT_SMOBS (Scale
);
115 IMPLEMENT_DEFAULT_EQUAL_P (Scale
);