From f83b523846b349a1b86d30fe52486ba55a06e464 Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Sun, 22 Sep 2002 23:11:18 +0000 Subject: [PATCH] * lily/command-request.cc (transpose_key_alist): new function. * lily/key-performer.cc (create_audio_elements): cleanup. --- ChangeLog | 6 ++++ lily/chord.cc | 10 +++--- lily/command-request.cc | 24 ++++++++++----- lily/completion-note-heads-engraver.cc | 4 +-- lily/include/chord.hh | 2 +- lily/include/command-request.hh | 2 ++ lily/include/music.hh | 3 ++ lily/key-performer.cc | 5 +-- lily/lyric-combine-music-iterator.cc | 25 +++++++++------ lily/music.cc | 42 ++++++++++++-------------- lily/parser.yy | 25 +++------------ lily/part-combine-music-iterator.cc | 4 +-- 12 files changed, 78 insertions(+), 74 deletions(-) diff --git a/ChangeLog b/ChangeLog index 78ae6829a6..165e0273f7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2002-09-23 Han-Wen Nienhuys + + * lily/command-request.cc (transpose_key_alist): new function. + + * lily/key-performer.cc (create_audio_elements): cleanup. + 2002-09-22 Han-Wen Nienhuys * lily/parser.yy: remove TYPED_MAKE_MUSIC(). diff --git a/lily/chord.cc b/lily/chord.cc index 3e26dc8474..196cf0e0f4 100644 --- a/lily/chord.cc +++ b/lily/chord.cc @@ -318,7 +318,7 @@ Chord::tonic_add_sub_to_pitches (SCM tonic, SCM add, SCM sub) /* --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); @@ -331,7 +331,7 @@ Chord::get_chord (SCM tonic, SCM add, SCM sub, SCM inversion, SCM bass, SCM dur) { /* 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); @@ -346,7 +346,7 @@ Chord::get_chord (SCM tonic, SCM add, SCM sub, SCM inversion, SCM bass, SCM dur) /* 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); @@ -356,14 +356,14 @@ Chord::get_chord (SCM tonic, SCM add, SCM sub, SCM inversion, SCM bass, SCM dur) 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; diff --git a/lily/command-request.cc b/lily/command-request.cc index 9e2e0970ca..06d31d1f8a 100644 --- a/lily/command-request.cc +++ b/lily/command-request.cc @@ -15,12 +15,15 @@ Tempo_req::Tempo_req () 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); @@ -30,7 +33,7 @@ Key_change_req::transpose (Pitch p) 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_)); @@ -41,15 +44,22 @@ Key_change_req::transpose (Pitch p) 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())); } diff --git a/lily/completion-note-heads-engraver.cc b/lily/completion-note-heads-engraver.cc index 2188dedb81..ebae8d888c 100644 --- a/lily/completion-note-heads-engraver.cc +++ b/lily/completion-note-heads-engraver.cc @@ -280,7 +280,7 @@ Completion_heads_engraver::stop_translation_timestep () scratch_note_reqs_.clear(); } -Tie_req * tie_req = 0; +Music * tie_req = 0; void Completion_heads_engraver::start_translation_timestep () @@ -294,7 +294,7 @@ 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) diff --git a/lily/include/chord.hh b/lily/include/chord.hh index f9bee640a1..3386d69d2c 100644 --- a/lily/include/chord.hh +++ b/lily/include/chord.hh @@ -33,7 +33,7 @@ public: 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 */ diff --git a/lily/include/command-request.hh b/lily/include/command-request.hh index 434222fdc3..db1f5500f5 100644 --- a/lily/include/command-request.hh +++ b/lily/include/command-request.hh @@ -62,5 +62,7 @@ protected: void transpose (Pitch d); }; +SCM transpose_key_alist (SCM,SCM); + #endif // COMMANDREQUEST_HH diff --git a/lily/include/music.hh b/lily/include/music.hh index 84c40cc42f..13e79e65b3 100644 --- a/lily/include/music.hh +++ b/lily/include/music.hh @@ -69,4 +69,7 @@ protected: DECLARE_UNSMOB(Music,music); +Music* make_music_by_name (SCM sym); + + #endif // MUSIC_HH diff --git a/lily/key-performer.cc b/lily/key-performer.cc index d52d563e6d..66ca419f1e 100644 --- a/lily/key-performer.cc +++ b/lily/key-performer.cc @@ -64,10 +64,7 @@ Key_performer::create_audio_elements () 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); diff --git a/lily/lyric-combine-music-iterator.cc b/lily/lyric-combine-music-iterator.cc index e1c72a5e9d..702ed023fb 100644 --- a/lily/lyric-combine-music-iterator.cc +++ b/lily/lyric-combine-music-iterator.cc @@ -18,21 +18,26 @@ /* 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; diff --git a/lily/music.cc b/lily/music.cc index df0b9c11eb..d2c0105d80 100644 --- a/lily/music.cc +++ b/lily/music.cc @@ -262,27 +262,6 @@ LY_DEFINE(ly_set_mus_property, } -// 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}.") @@ -295,9 +274,10 @@ LY_DEFINE(ly_music_name, "ly-music-name", 1, 0, 0, } + // 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 @@ -331,3 +311,21 @@ LY_DEFINE(ly_music_list_p,"music-list?", 1, 0, 0, } 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); +} diff --git a/lily/parser.yy b/lily/parser.yy index 4032b5ad8d..1808045c87 100644 --- a/lily/parser.yy +++ b/lily/parser.yy @@ -94,24 +94,8 @@ set_music_properties (Music *p, SCM a) } -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) @@ -156,7 +140,6 @@ of the parse stack onto the heap. */ Scheme_hash_table *scmhash; Music_output_def * outputdef; SCM scm; - Tempo_req *tempo; int i; } %{ @@ -325,7 +308,7 @@ yylex (YYSTYPE *s, void * v) %type score_block score_body %type translator_spec_block translator_spec_body -%type tempo_request +%type tempo_request %type notenames_body notenames_block chordmodifiers_block %type script_abbreviation @@ -830,7 +813,7 @@ Simple_music: 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 ()); @@ -1994,7 +1977,7 @@ simple_element: $$= 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")); diff --git a/lily/part-combine-music-iterator.cc b/lily/part-combine-music-iterator.cc index 276e2f4271..8f38b48205 100644 --- a/lily/part-combine-music-iterator.cc +++ b/lily/part-combine-music-iterator.cc @@ -343,7 +343,7 @@ Part_combine_music_iterator::get_state (Moment) return state; } -static Span_req* abort_req = NULL; +static Music* abort_req = NULL; void Part_combine_music_iterator::process (Moment m) @@ -394,7 +394,7 @@ s Consider thread switching: threads "one", "two" and "both". 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")); } -- 2.39.2