source file of the GNU LilyPond music typesetter
- (c) 1997--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
*/
#include "music.hh"
void
Music::type_check_assignment (SCM s, SCM v) const
{
- if (!::type_check_assignment (s, v, ly_symbol2scm ("music-type?")))
- abort ();
+ ::type_check_assignment (s, v, ly_symbol2scm ("music-type?"));
}
Music::Music (Music const &m)
Pitch expected_pit (scm_to_int (check),
new_pit.get_notename (),
new_pit.get_alteration ());
- origin ()->warning (_f ("octave check failed; expected \"%s\", found: %s",
+ origin ()->warning (_f ("octave check failed; expected \"%s\", found: \"%s\"",
expected_pit.to_string (),
new_pit.to_string ()));
new_pit = expected_pit;
}
/*
-TODO: make transposition non-destructive
+ This mutates alist. Hence, make sure that it is not shared
*/
-SCM
+void
transpose_mutable (SCM alist, Pitch delta)
{
- SCM retval = SCM_EOL;
-
for (SCM s = alist; scm_is_pair (s); s = scm_cdr (s))
{
SCM entry = scm_car (s);
SCM prop = scm_car (entry);
SCM val = scm_cdr (entry);
-
+ SCM new_val = val;
+
if (Pitch *p = unsmob_pitch (val))
{
Pitch transposed = p->transposed (delta);
- scm_set_cdr_x (entry, transposed.smobbed_copy ());
-
if (transposed.get_alteration ().abs () > Rational (1,1))
{
warning (_f ("transposition by %s makes alteration larger than double",
delta.to_string ()));
}
+
+ new_val = transposed.smobbed_copy ();
}
else if (prop == ly_symbol2scm ("element"))
{
transpose_music_list (val, delta);
else if (prop == ly_symbol2scm ("pitch-alist") &&
scm_is_pair (val))
- entry = scm_cons (prop,
- ly_transpose_key_alist (val, delta.smobbed_copy ()));
- retval = scm_cons (entry, retval);
- }
+ new_val = ly_transpose_key_alist (val, delta.smobbed_copy ());
- return scm_reverse_x (retval, SCM_EOL);
+ if (val != new_val)
+ scm_set_cdr_x (entry , new_val);
+ }
}
void
if (to_boolean (get_property ("untransposable")))
return;
- mutable_property_alist_ = transpose_mutable (mutable_property_alist_, delta);
+ transpose_mutable (mutable_property_alist_, delta);
}
void
Stream_event *
Music::to_event () const
{
- SCM class_name = ly_camel_case_to_lisp_identifier (get_property ("name"));
+ SCM class_name = ly_camel_case_2_lisp_identifier (get_property ("name"));
// catch programming mistakes.
if (!internal_is_music_type (class_name))