]> git.donarmstrong.com Git - lilypond.git/blob - lily/scale.cc
b71f43fe207106a5d1a2171127642e9c1ddde937
[lilypond.git] / lily / scale.cc
1 /* 
2   scale.cc -- implement Scale
3   
4   source file of the GNU LilyPond music typesetter
5   
6   (c) 2006 Han-Wen Nienhuys <hanwen@lilypond.org>
7   
8 */
9
10 #include  "pitch.hh"
11
12 #include "ly-smobs.icc"
13
14 LY_DEFINE (ly_make_scale, "ly:make-scale",
15            1, 0, 0, (SCM steps),
16            "Create a scale. Takes a vector of ints as argument")
17 {
18   bool type_ok = scm_is_vector (steps);
19
20   vector<int> semitones; 
21   if (type_ok)
22     {
23       int len = scm_c_vector_length (steps);
24       for (int i = 0 ; i < len; i++)
25         {
26           SCM step = scm_c_vector_ref (steps, i);
27           type_ok = type_ok && scm_is_integer (step);
28           if (type_ok)
29             semitones.push_back (scm_to_int (step));
30         }
31     }
32
33   
34   SCM_ASSERT_TYPE (type_ok, steps, SCM_ARG1, __FUNCTION__, "vector of int");
35
36
37   Scale *s = new Scale;
38   s->step_semitones_ = semitones;
39
40   SCM retval =  s->self_scm ();
41
42   s->unprotect ();
43   
44   return retval;
45 }
46
47 LY_DEFINE (ly_default_scale, "ly:default-scale",
48            0, 0, 0, (),
49            "Get the global default scale.")
50 {
51   return default_global_scale
52     ? SCM_BOOL_F
53     : default_global_scale->self_scm ();
54 }
55
56
57 Scale * default_global_scale = 0;
58
59 LY_DEFINE (ly_set_default_scale, "ly:set-default-scale",
60            1, 0, 0, (SCM scale),
61            "Set the global default scale.")
62 {
63   Scale *s = Scale::unsmob (scale);
64   SCM_ASSERT_TYPE (s, scale, SCM_ARG1, __FUNCTION__, "scale");
65
66   if (default_global_scale)
67     default_global_scale->unprotect ();
68   default_global_scale = s;
69   s->protect ();
70   
71   return SCM_UNSPECIFIED;
72 }
73
74
75 int
76 Scale::print_smob (SCM x, SCM port, scm_print_state *)
77 {
78   (void) x;
79   
80   scm_puts ("#<Scale>", port); 
81   return 1;
82 }
83
84
85 SCM
86 Scale::mark_smob (SCM x)
87 {
88   (void) x;
89   return SCM_UNSPECIFIED;
90 }
91
92 Scale::Scale ()
93 {
94   smobify_self ();
95 }
96
97 Scale::Scale (Scale const &src)
98 {
99   step_semitones_ = src.step_semitones_;
100   smobify_self ();
101 }
102
103
104 Scale::~Scale ()
105 {
106 }
107
108 IMPLEMENT_SMOBS(Scale);
109 IMPLEMENT_DEFAULT_EQUAL_P(Scale);