Compile fix.
[lilypond.git] / lily / scale.cc
blob5d8ccc9a38f9edb7467a9f53f9dc78c7705c6b77
1 /*
2 scale.cc -- implement Scale
4 source file of the GNU LilyPond music typesetter
6 (c) 2006--2007 Han-Wen Nienhuys <hanwen@lilypond.org>
8 */
10 #include "scale.hh"
12 #include "ly-smobs.icc"
15 todo: put string <-> pitch here too.
18 LY_DEFINE (ly_make_scale, "ly:make-scale",
19 1, 0, 0, (SCM steps),
20 "Create a scale. Takes a vector of integers as argument.")
22 bool type_ok = scm_is_vector (steps);
24 vector<Rational> semitones;
25 if (type_ok)
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);
32 if (type_ok)
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");
43 Scale *s = new Scale;
44 s->step_tones_ = semitones;
46 SCM retval = s->self_scm ();
48 s->unprotect ();
50 return retval;
53 LY_DEFINE (ly_default_scale, "ly:default-scale",
54 0, 0, 0, (),
55 "Get the global default scale.")
57 return default_global_scale
58 ? SCM_BOOL_F
59 : default_global_scale->self_scm ();
63 Scale * default_global_scale = 0;
65 LY_DEFINE (ly_set_default_scale, "ly:set-default-scale",
66 1, 0, 0, (SCM 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;
75 s->protect ();
77 return SCM_UNSPECIFIED;
81 int
82 Scale::print_smob (SCM x, SCM port, scm_print_state *)
84 (void) x;
86 scm_puts ("#<Scale>", port);
87 return 1;
91 SCM
92 Scale::mark_smob (SCM x)
94 (void) x;
95 return SCM_UNSPECIFIED;
98 Scale::Scale ()
100 smobify_self ();
103 Scale::Scale (Scale const &src)
105 step_tones_ = src.step_tones_;
106 smobify_self ();
110 Scale::~Scale ()
114 IMPLEMENT_SMOBS (Scale);
115 IMPLEMENT_DEFAULT_EQUAL_P (Scale);