X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Flocal-key-engraver.cc;h=172961dacf264c9164b4ea34fa727eccd4d0fcb3;hb=305fb79f24233b261b5372168f76520f84d2ea87;hp=2641421ccaf5783489e8e1832de4951122e97066;hpb=0cf4bbf50c047647e1542636394480d04485de76;p=lilypond.git diff --git a/lily/local-key-engraver.cc b/lily/local-key-engraver.cc index 2641421cca..172961dacf 100644 --- a/lily/local-key-engraver.cc +++ b/lily/local-key-engraver.cc @@ -3,14 +3,10 @@ (c) 1997--2000 Han-Wen Nienhuys */ -// clean up! #include "musical-request.hh" #include "command-request.hh" -#include "local-key-engraver.hh" #include "local-key-item.hh" -#include "key-engraver.hh" -#include "debug.hh" #include "key-item.hh" #include "tie.hh" #include "note-head.hh" @@ -20,8 +16,6 @@ #include "staff-symbol-referencer.hh" #include "side-position-interface.hh" #include "engraver.hh" -#include "key.hh" -#include "parray.hh" /** @@ -41,64 +35,40 @@ protected: virtual void process_acknowledged (); virtual void do_removal_processing (); public: - - Key local_key_; + + // todo -> property + SCM last_keysig_; Key_engraver *key_grav_l_; - Array mel_l_arr_; - Array support_l_arr_; - Link_array forced_l_arr_; - Link_array tied_l_arr_; + + Link_array mel_l_arr_; + Link_array support_l_arr_; + Link_array forced_l_arr_; + Link_array tied_l_arr_; Local_key_engraver(); - bool self_grace_b_; + Grace_align_item * grace_align_l_; - Timing_translator * time_trans_l_ ; }; - - Local_key_engraver::Local_key_engraver() { key_grav_l_ = 0; key_item_p_ =0; grace_align_l_ =0; - time_trans_l_ = 0; + last_keysig_ = SCM_EOL; } void Local_key_engraver::do_creation_processing () { - /* - UGHGUHGUH. - - Breaks if Key_engraver is removed from under us. - */ - Translator * result = - daddy_grav_l()->get_simple_translator ("Key_engraver"); - - key_grav_l_ = dynamic_cast (result); - - if (!key_grav_l_) - { - warning (_ ("out of tune:")); - warning (_f ("can't find: `%s'", "Key_engraver")); - } - else - { - local_key_ = key_grav_l_->key_; - } - - /* - TODO - (if we are grace) get key info from parent Local_key_engraver - */ - - Translator * tr = daddy_grav_l()->get_simple_translator ("Timing_engraver"); // ugh - time_trans_l_ = dynamic_cast (tr); + last_keysig_ = get_property ("keySignature"); + daddy_trans_l_->set_property ("localKeySignature", last_keysig_); } void Local_key_engraver::process_acknowledged () { + SCM localsig = get_property ("localKeySignature"); + if (!key_item_p_ && mel_l_arr_.size()) { SCM f = get_property ("forgetAccidentals"); @@ -108,39 +78,56 @@ Local_key_engraver::process_acknowledged () Item * support_l = support_l_arr_[i]; Note_req * note_l = mel_l_arr_[i]; + int n = note_l->pitch_.notename_i_; + int o = note_l->pitch_.octave_i_; + int a = note_l->pitch_.accidental_i_; + /* see if there's a tie that "changes" the accidental */ /* works because if there's a tie, the note to the left is of the same pitch as the actual note */ - bool tie_changes = tied_l_arr_.find_l (support_l) - && !local_key_.different_acc (note_l->pitch_); + SCM prev = scm_assoc (gh_cons (gh_int2scm (o), gh_int2scm (n)), localsig); + if (prev == SCM_BOOL_F) + prev = scm_assoc (gh_int2scm (n), localsig); + int prev_acc = (prev == SCM_BOOL_F) ? 0 : gh_scm2int (gh_cdr (prev)); + bool different = prev_acc != a; + + bool tie_changes = tied_l_arr_.find_l (support_l) && different; if (!forget - - && ((note_l->forceacc_b_ - || !local_key_.different_acc (note_l->pitch_) - || local_key_.internal_forceacc (note_l->pitch_))) - + && (note_l->forceacc_b_ || different) && !tie_changes) { if (!key_item_p_) { - key_item_p_ = new Local_key_item; - side_position (key_item_p_).set_axis (X_AXIS); - side_position (key_item_p_).set_direction (LEFT); + key_item_p_ = new Local_key_item (get_property ("basicLocalKeyProperties")); + Side_position_interface (key_item_p_).set_axis (X_AXIS); + Side_position_interface (key_item_p_).set_direction (LEFT); staff_symbol_referencer(key_item_p_).set_interface (); announce_element (Score_element_info (key_item_p_, 0)); } + + bool extra_natural = + sign (prev_acc) * (prev_acc - a) == 1 + && abs(prev_acc) == 2; + key_item_p_->add_pitch (note_l->pitch_, note_l->cautionary_b_, - local_key_.double_to_single_acc(note_l->pitch_)); - side_position (key_item_p_).add_support (support_l); + extra_natural); + Side_position_interface (key_item_p_).add_support (support_l); } if (!forget) { - local_key_.set (note_l->pitch_); + localsig = scm_assoc_set_x (localsig, gh_cons (gh_int2scm (o), + gh_int2scm (n)), + gh_int2scm (a)); + +#if 0 + /* + TESTME! + */ if (!tied_l_arr_.find_l (support_l)) { local_key_.clear_internal_forceacc (note_l->pitch_); @@ -149,12 +136,18 @@ Local_key_engraver::process_acknowledged () { local_key_.set_internal_forceacc (note_l->pitch_); } +#endif } } } + + /* + UGH ! + */ + if (key_item_p_ && grace_align_l_) { - side_position (grace_align_l_).add_support (key_item_p_); + Side_position_interface (grace_align_l_).add_support (key_item_p_); grace_align_l_ =0; } @@ -163,7 +156,7 @@ Local_key_engraver::process_acknowledged () void Local_key_engraver::do_removal_processing () { - // TODO: signal accidentals to Local_key_engraver the + // TODO: if grace ? signal accidentals to Local_key_engraver the } void @@ -172,7 +165,7 @@ Local_key_engraver::do_pre_move_processing() if (key_item_p_) { for (int i=0; i < support_l_arr_.size(); i++) - side_position (key_item_p_).add_support (support_l_arr_[i]); + Side_position_interface (key_item_p_).add_support (support_l_arr_[i]); typeset_element (key_item_p_); key_item_p_ =0; @@ -201,8 +194,6 @@ Local_key_engraver::acknowledge_element (Score_element_info info) Note_req * note_l = dynamic_cast (info.req_l_); Note_head * note_head = dynamic_cast (info.elem_l_); - - if (he_gr != selfgr) return; @@ -220,14 +211,18 @@ Local_key_engraver::acknowledge_element (Score_element_info info) void Local_key_engraver::do_process_music() { - if (time_trans_l_ && !time_trans_l_->measure_position ()) + SCM smp = get_property ("measurePosition"); + Moment mp = (unsmob_moment (smp)) ? *unsmob_moment (smp) : Moment (0); + + SCM sig = get_property ("keySignature"); + if (!mp) { - if (!to_boolean (get_property ("noResetKey")) && key_grav_l_) - local_key_= key_grav_l_->key_; + if (!to_boolean (get_property ("noResetKey"))) + daddy_trans_l_->set_property ("localKeySignature", sig); } - else if (key_grav_l_ && key_grav_l_->key_changed_b ()) + else if (last_keysig_ != sig) { - local_key_ = key_grav_l_->key_; + daddy_trans_l_->set_property ("localKeySignature", sig); } }