* Lily/parser.yy (pre_events): remove prefix articulations.
* lily/music-sequence.cc (do_relative_octave): change relative meaning.
2003-08-21 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+ * lily/music.cc (var): add ly:music-transpose function.
+
+ * Lily/parser.yy (pre_events): remove prefix articulations.
+
+ * lily/music-sequence.cc (do_relative_octave): change relative meaning.
+
* VERSION (MY_PATCH_LEVEL): open HEAD/1.9 branch.
* Documentation/user/refman.itely (Text markup): add comment about
#include "music-list.hh"
#include "warn.hh"
#include "pitch.hh"
-
+#include "input.hh"
SCM
Music_sequence::music_list ()const
Pitch
Music_sequence::do_relative_octave (Pitch p, bool ret_first)
{
- Pitch retval;
+ Pitch first;
int count=0;
Pitch last = p;
{
last = m->to_relative_octave (last);
if (!count ++)
- retval = last;
+ first = last;
}
}
- if (!ret_first)
- retval = last;
-
- return retval;
+ if (ret_first && first != last)
+ {
+ String str = _("Changing relative definition causes pitch change.");
+ str += "\nWas: " + first.to_string ()
+ + "Will be: " + last.to_string () + "\n";
+
+ origin()->warning (str);
+ }
+ return last;
}
void
#include "ly-smobs.icc"
-LY_DEFINE(ly_deep_mus_copy,
- "ly:music-deep-copy", 1,0,0, (SCM m),
- "Copy @var{m} and all sub expressions of @var{m}")
-{
- if (unsmob_music (m))
- {
- SCM ss = unsmob_music (m)->clone ()->self_scm ();
- scm_gc_unprotect_object (ss);
- return ss;
- }
- else if (gh_pair_p (m))
- {
- return gh_cons (ly_deep_mus_copy (ly_car (m)), ly_deep_mus_copy (ly_cdr (m)));
- }
- else
- return m;
-}
+SCM ly_deep_mus_copy (SCM);
bool
Music::internal_is_music_type (SCM k)const
ADD_MUSIC(Music);
+
+LY_DEFINE(ly_deep_mus_copy,
+ "ly:music-deep-copy", 1,0,0, (SCM m),
+ "Copy @var{m} and all sub expressions of @var{m}")
+{
+ if (unsmob_music (m))
+ {
+ SCM ss = unsmob_music (m)->clone ()->self_scm ();
+ scm_gc_unprotect_object (ss);
+ return ss;
+ }
+ else if (gh_pair_p (m))
+ {
+ return gh_cons (ly_deep_mus_copy (ly_car (m)), ly_deep_mus_copy (ly_cdr (m)));
+ }
+ else
+ return m;
+}
+
+LY_DEFINE(ly_music_transpose,
+ "ly:music-transpose", 2,0,0, (SCM m, SCM p),
+ "Transpose @var{m} such that central C is mapped to @var{p}. "
+"Return @var{m}.")
+{
+ Music * sc = unsmob_music (m);
+ Pitch * sp = unsmob_pitch (p);
+ SCM_ASSERT_TYPE(sc, m, SCM_ARG1, __FUNCTION__, "music");
+ SCM_ASSERT_TYPE(sp, p, SCM_ARG2, __FUNCTION__, "pitch");
+
+ sc->transpose (*sp);
+ return sc->self_scm(); // SCM_UNDEFINED ?
+}
+
+
SCM make_music_proc;
%type <scm> steno_duration optional_notemode_duration multiplied_duration
%type <scm> verbose_duration
-%type <scm> pre_events post_events
+%type <scm> post_events
%type <music> gen_text_def
%type <scm> steno_pitch pitch absolute_pitch pitch_also_in_chords
%type <scm> explicit_pitch steno_tonic_pitch
;
+
+/*
+This is a trick:
+
+Adding pre_events to the simple_element
+makes the choice between
+
+ string: STRING
+
+and
+
+ simple_element: STRING
+
+a single shift/reduction conflict.
+
+nevertheless, this is not very clean, and we should find a different
+solution.
+
+*/
+pre_events:
+ ;
+
event_chord:
- pre_events {
- THIS->push_spot ();
- } /*cont */ simple_element post_events {
- SCM elts = $3-> get_mus_property ("elements");
+ pre_events simple_element post_events {
+ SCM elts = $2-> get_mus_property ("elements");
- elts = gh_append3 (elts, scm_reverse_x ($1, SCM_EOL),
- scm_reverse_x ($4, SCM_EOL));
+ elts = gh_append2 (elts, scm_reverse_x ($3, SCM_EOL));
- $3-> set_mus_property ("elements", elts);
- $$ = $3;
+ $2->set_mus_property ("elements", elts);
+ $$ = $2;
}
| command_element
| note_chord_element
| '-' { $$ = CENTER; }
;
-pre_events:
- /* empty */ {
- $$ = SCM_EOL;
- }
- | pre_events open_event {
- static int warn_count ;
- if (warn_count < 10)
- {
- $2->origin ()->warning (_("Prefix articulations are deprecated. Use postfix notation instead."));
- warn_count ++;
- }
-
- $$ = gh_cons ($2->self_scm(), $$);
- scm_gc_unprotect_object ($2->self_scm());
- }
- ;
absolute_pitch:
steno_pitch {