2 scale.cc -- implement Scale
4 source file of the GNU LilyPond music typesetter
6 (c) 2006 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 ints 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 Scale *s = Scale::unsmob (scale);
70 SCM_ASSERT_TYPE (s, scale, SCM_ARG1, __FUNCTION__, "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);