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"
14 LY_DEFINE (ly_make_scale, "ly:make-scale",
16 "Create a scale. Takes a vector of ints as argument")
18 bool type_ok = scm_is_vector (steps);
20 vector<int> semitones;
23 int len = scm_c_vector_length (steps);
24 for (int i = 0 ; i < len; i++)
26 SCM step = scm_c_vector_ref (steps, i);
27 type_ok = type_ok && scm_is_integer (step);
29 semitones.push_back (scm_to_int (step));
34 SCM_ASSERT_TYPE (type_ok, steps, SCM_ARG1, __FUNCTION__, "vector of int");
38 s->step_semitones_ = semitones;
40 SCM retval = s->self_scm ();
47 LY_DEFINE (ly_default_scale, "ly:default-scale",
49 "Get the global default scale.")
51 return default_global_scale
53 : default_global_scale->self_scm ();
57 Scale * default_global_scale = 0;
59 LY_DEFINE (ly_set_default_scale, "ly:set-default-scale",
61 "Set the global default scale.")
63 Scale *s = Scale::unsmob (scale);
64 SCM_ASSERT_TYPE (s, scale, SCM_ARG1, __FUNCTION__, "scale");
66 if (default_global_scale)
67 default_global_scale->unprotect ();
68 default_global_scale = s;
71 return SCM_UNSPECIFIED;
76 Scale::print_smob (SCM x, SCM port, scm_print_state *)
80 scm_puts ("#<Scale>", port);
86 Scale::mark_smob (SCM x)
89 return SCM_UNSPECIFIED;
97 Scale::Scale (Scale const &src)
99 step_semitones_ = src.step_semitones_;
108 IMPLEMENT_SMOBS(Scale);
109 IMPLEMENT_DEFAULT_EQUAL_P(Scale);