* lily/key-performer.cc (create_audio_elements): cleanup.
+2002-09-23 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+
+ * lily/command-request.cc (transpose_key_alist): new function.
+
+ * lily/key-performer.cc (create_audio_elements): cleanup.
+
2002-09-22 Han-Wen Nienhuys <hanwen@cs.uu.nl>
* lily/parser.yy: remove TYPED_MAKE_MUSIC().
/* --Het lijkt me dat dit in het paarse gedeelte moet. */
-Simultaneous_music *
+Music *
Chord::get_chord (SCM tonic, SCM add, SCM sub, SCM inversion, SCM bass, SCM dur)
{
SCM pitches = tonic_add_sub_to_pitches (tonic, add, sub);
{
/* Then, delete and add as base note, ie: the inversion */
pitches = scm_delete (s, pitches);
- Note_req* n = new Note_req;
+ Music * n = make_music_by_name (ly_symbol2scm ("NoteEvent"));
n->set_mus_property ("pitch", ly_car (add_below_tonic (s, pitches)));
n->set_mus_property ("duration", dur);
n->set_mus_property ("inversion", SCM_BOOL_T);
/* Bass is easy, just add if requested */
if (bass != SCM_EOL)
{
- Note_req* n = new Note_req;
+ Music * n = make_music_by_name (ly_symbol2scm ("NoteEvent"));
n->set_mus_property ("pitch", ly_car (add_below_tonic (bass, pitches)));
n->set_mus_property ("duration", dur);
n->set_mus_property ("bass", SCM_BOOL_T);
for (SCM i = pitches; gh_pair_p (i); i = ly_cdr (i))
{
- Note_req* n = new Note_req;
+ Music * n = make_music_by_name(ly_symbol2scm ("NoteEvent"));
n->set_mus_property ("pitch", ly_car (i));
n->set_mus_property ("duration", dur);
list = gh_cons (n->self_scm (), list);
scm_gc_unprotect_object (n->self_scm ());
}
- Simultaneous_music*v = new Request_chord ();
+ Music * v = make_music_by_name(ly_symbol2scm ("RequestChord"));
v->set_mus_property ("elements", list);
return v;
set_mus_property ("duration", Duration (2,0).smobbed_copy ());
}
-void
-Key_change_req::transpose (Pitch p)
+
+LY_DEFINE(transpose_key_alist,"transpose-key-alist",
+ 2, 0,0, (SCM l, SCM pitch),
+ "Make a new key alist of @var{l} transposed by pitch @var{pitch}")
{
SCM newlist = SCM_EOL;
- SCM pa = get_mus_property ("pitch-alist");
- for (SCM s = pa; gh_pair_p (s); s = ly_cdr (s))
+ Pitch *p = unsmob_pitch (pitch);
+
+ for (SCM s = l; gh_pair_p (s); s = ly_cdr (s))
{
SCM key = ly_caar (s);
SCM alter = ly_cdar (s);
gh_scm2int (ly_cdr (key)),
gh_scm2int (alter));
- orig.transpose (p);
+ orig.transpose (*p);
SCM key = gh_cons (scm_int2num (orig.get_octave ()),
scm_int2num (orig.notename_));
else if (gh_number_p (key))
{
Pitch orig (0, gh_scm2int (key), gh_scm2int (alter));
- orig.transpose (p);
+ orig.transpose (*p);
key =scm_int2num (orig.notename_);
alter = scm_int2num (orig.alteration_);
newlist = gh_cons (gh_cons (key, alter), newlist);
}
}
+ return scm_reverse_x (newlist, SCM_EOL);
+}
+
+void
+Key_change_req::transpose (Pitch p)
+{
+ SCM pa = get_mus_property ("pitch-alist");
- set_mus_property ("pitch-alist", gh_reverse (newlist));
+ set_mus_property ("pitch-alist", transpose_key_alist (pa, p.smobbed_copy()));
}
scratch_note_reqs_.clear();
}
-Tie_req * tie_req = 0;
+Music * tie_req = 0;
void
Completion_heads_engraver::start_translation_timestep ()
if (left_to_do_)
{
if (!tie_req)
- tie_req = new Tie_req;
+ tie_req = make_music_by_name (ly_symbol2scm ("TieEvent"));
bool succ = daddy_trans_->try_music (tie_req);
if (!succ)
static SCM add_above_tonic (SCM pitch, SCM pitches);
static SCM add_below_tonic (SCM pitch, SCM pitches);
static SCM tonic_add_sub_to_pitches (SCM tonic, SCM add, SCM sub);
- static Simultaneous_music *get_chord (SCM tonic, SCM add, SCM sub, SCM inversion, SCM bass, SCM dur);
+ static Music *get_chord (SCM tonic, SCM add, SCM sub, SCM inversion, SCM bass, SCM dur);
};
#endif /* CHORD_HH */
void transpose (Pitch d);
};
+SCM transpose_key_alist (SCM,SCM);
+
#endif // COMMANDREQUEST_HH
DECLARE_UNSMOB(Music,music);
+Music* make_music_by_name (SCM sym);
+
+
#endif // MUSIC_HH
my_do.transpose (to_c);
to_c.alteration_ -= my_do.alteration_;
- Key_change_req *key = new Key_change_req;
- key->set_mus_property ("pitch-alist", scm_list_copy (pitchlist));
- ((Music*)key)->transpose (to_c);
- SCM c_pitchlist = key->get_mus_property ("pitch-alist");
+ SCM c_pitchlist = transpose_key_alist (pitchlist, to_c.smobbed_copy());
SCM major = gh_call1 (proc, c_pitchlist);
audio_ = new Audio_key (gh_scm2int (acc), major == SCM_BOOL_T);
/*
Ugh, why static?
*/
-Busy_playing_req *busy_req;
-Melisma_req *melisma_start_req;
-Melisma_req *melisma_stop_req;
-Melisma_playing_req * melisma_playing_req;
+Music *busy_req;
+Music *melisma_start_req;
+Music *melisma_stop_req;
+Music *melisma_playing_req;
Lyric_combine_music_iterator::Lyric_combine_music_iterator ()
{
if (!busy_req)
{
- busy_req = new Busy_playing_req;
- melisma_playing_req = new Melisma_playing_req;
- melisma_stop_req = new Melisma_req;
- melisma_start_req = new Melisma_req;
- melisma_start_req->set_span_dir (START);
- melisma_stop_req->set_span_dir (STOP);
+ busy_req
+ = make_music_by_name (ly_symbol2scm ("BusyPlayingEvent"));
+ melisma_playing_req
+ = make_music_by_name (ly_symbol2scm ("MelismaPlayingEvent"));
+ melisma_stop_req
+ = make_music_by_name (ly_symbol2scm ("MelismaEvent"));
+ melisma_start_req
+ = make_music_by_name (ly_symbol2scm ("MelismaEvent"));
+
+ melisma_start_req->set_mus_property ("span-direction", gh_int2scm (START));
+ melisma_stop_req->set_mus_property ("span-direction", gh_int2scm (STOP));
}
music_iter_ =0;
}
-// to do property args
-LY_DEFINE(ly_make_music,
- "ly-make-music", 1, 0, 0, (SCM type),
- "
-Make a music object/expression of type @var{name}. Warning: this
-interface will likely change in the near future.
-
-
-
-Music is the data type that music expressions are stored in. The data
-type does not yet offer many manipulations.
-")
-{
- SCM_ASSERT_TYPE(gh_string_p (type), type, SCM_ARG1, __FUNCTION__, "string");
-
- SCM s = make_music (ly_scm2string (type))->self_scm ();
- scm_gc_unprotect_object (s);
-
- return s;
-}
-
LY_DEFINE(ly_music_name, "ly-music-name", 1, 0, 0,
(SCM mus),
"Return the name of @var{music}.")
}
+
// to do property args
LY_DEFINE(ly_extended_make_music,
- "ly-extended-make-music", 2, 0, 0, (SCM type, SCM props),
+ "ly-make-bare-music", 2, 0, 0, (SCM type, SCM props),
"
Make a music object/expression of type @var{type}, init with
@var{props}. Warning: this interface will likely change in the near
}
ADD_MUSIC(Music);
+
+SCM make_music_proc;
+
+
+Music*
+make_music_by_name (SCM sym)
+{
+ if (!make_music_proc)
+ make_music_proc = scm_primitive_eval (ly_symbol2scm ("make-music-by-name"));
+
+ SCM rv = scm_call_1 (make_music_proc, sym);
+
+ /*
+ UGH.
+ */
+ scm_gc_protect_object (rv);
+ return unsmob_music (rv);
+}
}
-SCM make_music_proc;
-Music*
-parser_make_music (SCM sym)
-{
- if (!make_music_proc)
- make_music_proc = scm_primitive_eval (ly_symbol2scm ("make-music-by-name"));
-
- SCM rv = scm_call_1 (make_music_proc, sym);
-
- /*
- UGH.
- */
- scm_gc_protect_object (rv);
- return unsmob_music (rv);
-}
-
-#define MY_MAKE_MUSIC(x) parser_make_music (ly_symbol2scm (x))
+#define MY_MAKE_MUSIC(x) make_music_by_name (ly_symbol2scm (x))
Music*
set_property_music (SCM sym, SCM value)
Scheme_hash_table *scmhash;
Music_output_def * outputdef;
SCM scm;
- Tempo_req *tempo;
int i;
}
%{
%type <score> score_block score_body
%type <scm> translator_spec_block translator_spec_body
-%type <tempo> tempo_request
+%type <music> tempo_request
%type <scm> notenames_body notenames_block chordmodifiers_block
%type <scm> script_abbreviation
Composite_music:
CONTEXT STRING Music {
- Music*csm =TYPED_MAKE_MUSIC("ContextSpeccedMusic");
+ Music*csm =MY_MAKE_MUSIC("ContextSpeccedMusic");
csm->set_mus_property ("element", $3->self_scm ());
scm_gc_unprotect_object ($3->self_scm ());
$$= velt;
}
| chord {
- Input i = THIS->pop_spot ();
+ THIS->pop_spot ();
if (!THIS->lexer_->chord_state_b ())
THIS->parser_error (_ ("Have to be in Chord mode for chords"));
return state;
}
-static Span_req* abort_req = NULL;
+static Music* abort_req = NULL;
void
Part_combine_music_iterator::process (Moment m)
if (!abort_req)
{
- abort_req = new Span_req;
+ abort_req = make_music_by_name (ly_symbol2scm ("SpanEvent"));
abort_req->set_mus_property ("span-type", scm_makfrom0str ("abort"));
}