2 music.cc -- implement Music
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
9 #include "input-smob.hh"
11 #include "music-list.hh"
13 #include "musical-pitch.hh"
14 #include "ly-smobs.icc"
17 ly_deep_mus_copy (SCM m)
21 SCM ss = unsmob_music (m)->clone ()->self_scm ();
22 scm_unprotect_object (ss);
25 else if (gh_pair_p (m))
27 return gh_cons (ly_deep_mus_copy (gh_car (m)), ly_deep_mus_copy (gh_cdr (m)));
34 Music::Music (Music const &m)
36 immutable_property_alist_ = m.immutable_property_alist_;
37 SCM c =ly_deep_mus_copy (m.mutable_property_alist_);
38 mutable_property_alist_ = c;
42 set_spot (*m.origin ());
48 immutable_property_alist_ = SCM_EOL;
49 mutable_property_alist_ = SCM_EOL;
54 Music::mark_smob (SCM m)
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_);
63 Music::compress (Moment)
68 Music::do_print() const
73 Music::length_mom () const
79 Music::print_smob(SCM s, SCM p, scm_print_state*)
81 scm_puts ("#<Music ", p);
82 scm_puts (classname(unsmob_music (s)),p);
88 Music::to_relative_octave (Musical_pitch m)
95 Music::transpose (Musical_pitch )
100 IMPLEMENT_UNSMOB(Music,music);
101 IMPLEMENT_SMOBS(Music);
102 IMPLEMENT_DEFAULT_EQUAL_P(Music);
104 /****************************/
107 Music::get_mus_property (const char *nm) const
109 SCM sym = ly_symbol2scm (nm);
110 return get_mus_property (sym);
114 Music::get_mus_property (SCM sym) const
116 SCM s = scm_sloppy_assq(sym, mutable_property_alist_);
120 s = scm_sloppy_assq (sym, immutable_property_alist_);
121 return (s == SCM_BOOL_F) ? SCM_EOL : gh_cdr (s);
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
130 Music::remove_mus_property (const char* key)
132 SCM val = get_mus_property (key);
134 set_mus_property (key, SCM_EOL);
139 Music::set_mus_property (const char* k, SCM v)
141 SCM s = ly_symbol2scm (k);
142 set_mus_property (s, v);
146 Music::set_immutable_mus_property (const char*k, SCM v)
148 SCM s = ly_symbol2scm (k);
149 set_immutable_mus_property (s, v);
153 Music::set_immutable_mus_property (SCM s, SCM v)
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);
159 Music::set_mus_property (SCM s, SCM v)
161 mutable_property_alist_ = scm_assq_set_x (mutable_property_alist_, s, v);
165 Music::set_spot (Input ip)
167 set_mus_property ("origin", make_input (ip));
173 Music::origin () const
175 Input *ip = unsmob_input (get_mus_property ("origin"));
176 return ip ? ip : & dummy_input_global;