2 event.cc -- implement Event
4 source file of the GNU LilyPond music typesetter
6 (c) 1996--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
14 Event::get_length () const
16 Duration *d = unsmob_duration (get_property ("duration"));
22 return d->get_length ();
26 Event::compress (Moment m)
28 Duration *d = unsmob_duration (get_property ("duration"));
30 set_property ("duration", d ->compressed (m.main_part_).smobbed_copy ());
34 Event::transpose (Pitch delta)
37 TODO: should change music representation such that
38 _all_ pitch values are transposed automatically.
41 Pitch *p = unsmob_pitch (get_property ("pitch"));
45 Pitch np = p->transposed (delta);
47 if (abs (np.get_alteration ()) > DOUBLE_SHARP)
49 warning (_f ("Transposition by %s makes alteration larger than two",
53 set_property ("pitch", np.smobbed_copy ());
57 Event::to_relative_octave (Pitch last)
59 Pitch *old_pit = unsmob_pitch (get_property ("pitch"));
62 Pitch new_pit = *old_pit;
63 new_pit = new_pit.to_relative_octave (last);
65 SCM check = get_property ("absolute-octave");
66 if (gh_number_p (check) &&
67 new_pit.get_octave () != gh_scm2int (check))
69 Pitch expected_pit (gh_scm2int (check),
70 new_pit.get_notename (),
71 new_pit.get_alteration ());
72 origin ()->warning (_f ("octave check failed; expected %s, found: %s",
73 expected_pit.to_string (),
74 new_pit.to_string ()));
75 new_pit = expected_pit;
78 set_property ("pitch", new_pit.smobbed_copy ());
92 LY_DEFINE (ly_music_duration_length, "ly:music-duration-length", 1, 0,0,
94 "Extract the duration field from @var{mus}, and return the length.")
96 Music* m = unsmob_music (mus);
97 SCM_ASSERT_TYPE (m, mus, SCM_ARG1, __FUNCTION__, "Music");
99 Duration *d = unsmob_duration (m->get_property ("duration"));
105 l = d->get_length ();
108 programming_error ("Music has no duration");
109 return l.smobbed_copy ();
114 LY_DEFINE (ly_music_duration_compress, "ly:music-duration-compress", 2, 0,0,
116 "Compress @var{mus} by factor @var{fact}, which is a @code{Moment}.")
118 Music* m = unsmob_music (mus);
119 Moment * f = unsmob_moment (fact);
120 SCM_ASSERT_TYPE (m, mus, SCM_ARG1, __FUNCTION__, "Music");
121 SCM_ASSERT_TYPE (f, fact, SCM_ARG2, __FUNCTION__, "Moment");
123 Duration *d = unsmob_duration (m->get_property ("duration"));
125 m->set_property ("duration", d->compressed (f->main_part_).smobbed_copy ());
126 return SCM_UNSPECIFIED;
132 This is hairy, since the scale in a key-change event may contain
136 TODO: this should use ly:pitch.
138 LY_DEFINE (ly_transpose_key_alist, "ly:transpose-key-alist",
139 2, 0, 0, (SCM l, SCM pit),
140 "Make a new key alist of @var{l} transposed by pitch @var{pit}")
142 SCM newlist = SCM_EOL;
143 Pitch *p = unsmob_pitch (pit);
145 for (SCM s = l; gh_pair_p (s); s = ly_cdr (s))
147 SCM key = ly_caar (s);
148 SCM alter = ly_cdar (s);
151 Pitch orig (gh_scm2int (ly_car (key)),
152 gh_scm2int (ly_cdr (key)),
155 orig =orig.transposed (*p);
157 SCM key = gh_cons (scm_int2num (orig.get_octave ()),
158 scm_int2num (orig.get_notename ()));
160 newlist = gh_cons (gh_cons (key, scm_int2num (orig.get_alteration ())),
163 else if (gh_number_p (key))
165 Pitch orig (0, gh_scm2int (key), gh_scm2int (alter));
166 orig = orig.transposed (*p);
168 key =scm_int2num (orig.get_notename ());
169 alter = scm_int2num (orig.get_alteration ());
170 newlist = gh_cons (gh_cons (key, alter), newlist);
173 return scm_reverse_x (newlist, SCM_EOL);
177 Key_change_ev::transpose (Pitch p)
179 SCM pa = get_property ("pitch-alist");
181 set_property ("pitch-alist", ly_transpose_key_alist (pa, p.smobbed_copy ()));
182 Pitch tonic = *unsmob_pitch (get_property ("tonic"));
183 set_property ("tonic",
184 tonic.smobbed_copy ());
188 alist_equal_p (SCM a, SCM b)
191 gh_pair_p (s); s = ly_cdr (s))
193 SCM key = ly_caar (s);
194 SCM val = ly_cdar (s);
195 SCM l = scm_assoc (key, b);
198 || !gh_equal_p ( ly_cdr (l), val))
204 ADD_MUSIC (Key_change_ev);