]> git.donarmstrong.com Git - lilypond.git/blob - lily/music.cc
8ce821e0124a6685535ec471a33dcbd6b92bf95b
[lilypond.git] / lily / music.cc
1 /*
2   music.cc -- implement Music
3
4   source file of the GNU LilyPond music typesetter
5
6   (c)  1997--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 */
8
9 #include "input-smob.hh"
10 #include "music.hh"
11 #include "music-list.hh"
12 #include "debug.hh"
13 #include "musical-pitch.hh"
14 #include "ly-smobs.icc"
15
16 SCM
17 ly_deep_mus_copy (SCM m)
18 {
19   if (unsmob_music (m))
20     {
21       SCM ss =  unsmob_music (m)->clone ()->self_scm ();
22       scm_unprotect_object (ss);
23       return ss;
24     }
25   else if (gh_pair_p (m))
26     {
27       return gh_cons (ly_deep_mus_copy (gh_car (m)), ly_deep_mus_copy (gh_cdr (m)));
28     }
29   else
30     return m;
31 }
32
33
34 Music::Music (Music const &m)
35 {
36   immutable_property_alist_ = m.immutable_property_alist_;
37   SCM c =ly_deep_mus_copy (m.mutable_property_alist_);
38   mutable_property_alist_ = c;
39
40   smobify_self ();
41
42   set_spot (*m.origin ());
43 }
44
45
46 Music::Music()
47 {
48   immutable_property_alist_ = SCM_EOL;
49   mutable_property_alist_ = SCM_EOL;
50   smobify_self ();
51 }
52
53 SCM
54 Music::mark_smob (SCM m)
55 {
56   Music * mus = (Music *)SCM_CELL_WORD_1(m);
57   scm_gc_mark (mus->immutable_property_alist_);
58   scm_gc_mark (mus->mutable_property_alist_);
59   return SCM_EOL;
60 }
61
62 void    
63 Music::compress (Moment)
64 {
65 }
66
67 void
68 Music::do_print() const
69 {
70 }
71
72 Moment
73 Music::length_mom () const
74 {
75   return 0;
76 }
77
78 int
79 Music::print_smob(SCM s, SCM p, scm_print_state*)
80 {
81   scm_puts ("#<Music ", p);
82   scm_puts (classname(unsmob_music (s)),p);
83   scm_puts (">",p);
84   return 1;
85 }
86
87 Musical_pitch
88 Music::to_relative_octave (Musical_pitch m)
89 {
90   return m;
91 }
92
93
94 void
95 Music::transpose (Musical_pitch )
96 {
97 }
98
99
100 IMPLEMENT_UNSMOB(Music,music);
101 IMPLEMENT_SMOBS(Music);
102 IMPLEMENT_DEFAULT_EQUAL_P(Music);
103
104 /****************************/
105
106 SCM
107 Music::get_mus_property (const char *nm) const
108 {
109   SCM sym = ly_symbol2scm (nm);
110   return get_mus_property (sym);
111 }
112
113 SCM
114 Music::get_mus_property (SCM sym) const
115 {
116   SCM s = scm_sloppy_assq(sym, mutable_property_alist_);
117   if (s != SCM_BOOL_F)
118     return gh_cdr (s);
119
120   s = scm_sloppy_assq (sym, immutable_property_alist_);
121   return (s == SCM_BOOL_F) ? SCM_EOL : gh_cdr (s); 
122 }
123
124 /*
125   Remove the value associated with KEY, and return it. The result is
126   that a next call will yield SCM_EOL (and not the underlying
127   `basic' property.
128 */
129 SCM
130 Music::remove_mus_property (const char* key)
131 {
132   SCM val = get_mus_property (key);
133   if (val != SCM_EOL)
134     set_mus_property (key, SCM_EOL);
135   return val;
136 }
137
138 void
139 Music::set_mus_property (const char* k, SCM v)
140 {
141   SCM s = ly_symbol2scm (k);
142   set_mus_property (s, v);
143 }
144
145 void
146 Music::set_immutable_mus_property (const char*k, SCM v)
147 {
148   SCM s = ly_symbol2scm (k);
149   set_immutable_mus_property (s, v);
150 }
151
152 void
153 Music::set_immutable_mus_property (SCM s, SCM v)
154 {
155   immutable_property_alist_ = gh_cons (gh_cons (s,v), mutable_property_alist_);
156   mutable_property_alist_ = scm_assq_remove_x (mutable_property_alist_, s);
157 }
158 void
159 Music::set_mus_property (SCM s, SCM v)
160 {
161   mutable_property_alist_ = scm_assq_set_x (mutable_property_alist_, s, v);
162 }
163
164 void
165 Music::set_spot (Input ip)
166 {
167    set_mus_property ("origin", make_input (ip));
168 }
169
170
171
172 Input*
173 Music::origin () const
174 {
175   Input *ip = unsmob_input (get_mus_property ("origin"));
176   return ip ? ip : & dummy_input_global; 
177 }
178
179
180 void
181 Music::print ()const
182 {
183 }
184
185
186
187 Music::~Music ()
188 {
189   
190 }