X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Faccidental-engraver.cc;h=68ea213eb102d66efb30c6aa1c69f7f15571d1ed;hb=d6e3999c729586616d61b97556f3844413697b51;hp=f4c07abbcf3dca28aa802f02e74a3b0337c652c5;hpb=a6ee9dcd388111e842064a8d46ab06c4897a00d2;p=lilypond.git diff --git a/lily/accidental-engraver.cc b/lily/accidental-engraver.cc index f4c07abbcf..68ea213eb1 100644 --- a/lily/accidental-engraver.cc +++ b/lily/accidental-engraver.cc @@ -1,12 +1,12 @@ /* accidental-engraver.cc -- implement accidental_engraver - (c) 1997--2002 Han-Wen Nienhuys - Modified 2001-2002 by Rune Zedeler + (c) 1997--2003 Han-Wen Nienhuys + Modified 2001--2002 by Rune Zedeler */ -#include "musical-request.hh" -#include "command-request.hh" +#include "event.hh" + #include "item.hh" #include "tie.hh" #include "rhythmic-head.hh" @@ -16,7 +16,6 @@ #include "engraver.hh" #include "arpeggio.hh" #include "warn.hh" - #include "translator-group.hh" /** @@ -32,7 +31,7 @@ tweakable. struct Accidental_entry { bool done_; - Note_req * melodic_; + Music * melodic_; Grob * accidental_; Translator_group *origin_; Grob* head_; @@ -71,19 +70,16 @@ public: Urgh. Since the accidentals depend on lots of variables, we have to store all information before we can really create the accidentals. */ - Link_array arpeggios_; + Link_array left_objects_; + Link_array right_objects_; Grob * accidental_placement_; - /* The next */ Array accidentals_; - Link_array ties_; - - }; @@ -125,20 +121,20 @@ calculates the number of accidentals on basis of the current local key sig */ static int -number_accidentals (SCM sig, Note_req * note, Pitch *pitch, SCM curbarnum, SCM lazyness, +number_accidentals (SCM sig, Music * note, Pitch *pitch, SCM curbarnum, SCM lazyness, bool ignore_octave_b) { - int n = pitch->notename_; - int o = pitch->octave_; - int a = pitch->alteration_; + int n = pitch->get_notename (); + int o = pitch->get_octave(); + int a = pitch->get_alteration (); int curbarnum_i = gh_scm2int (curbarnum); int accbarnum_i = 0; SCM prev; if (ignore_octave_b) - prev = ly_assoc_cdr (gh_int2scm (n), sig); + prev = ly_assoc_cdr (scm_int2num (n), sig); else - prev = gh_assoc (gh_cons (gh_int2scm (o), gh_int2scm (n)), sig); + prev = scm_assoc (gh_cons (scm_int2num (o), scm_int2num (n)), sig); /* should really be true unless prev == SCM_BOOL_F */ if (gh_pair_p (prev) && gh_pair_p (ly_cdr (prev))) @@ -150,17 +146,15 @@ number_accidentals (SCM sig, Note_req * note, Pitch *pitch, SCM curbarnum, SCM l /* If an accidental was not found or the accidental was too old */ if (prev == SCM_BOOL_F || (gh_number_p (lazyness) && curbarnum_i > accbarnum_i + gh_scm2int (lazyness))) - prev = gh_assoc (gh_int2scm (n), sig); + prev = scm_assoc (scm_int2num (n), sig); - SCM prev_acc = (prev == SCM_BOOL_F) ? gh_int2scm (0) : ly_cdr (prev); + SCM prev_acc = (prev == SCM_BOOL_F) ? scm_int2num (0) : ly_cdr (prev); int p = gh_number_p (prev_acc) ? gh_scm2int (prev_acc) : 0; int num; - if (a == p - && !to_boolean (note->get_mus_property ("force-accidental")) - && gh_number_p (prev_acc)) + if (a == p && gh_number_p (prev_acc)) num = 0; else if ( (abs (a)get_mus_property ("pitch")); @@ -260,6 +256,9 @@ Accidental_engraver::process_acknowledged_grobs () num = num_caut; cautionary = true; } + + if(num==0 && to_boolean (note->get_mus_property ("force-accidental"))) + num=1; bool different = num < 0; num = abs (num); @@ -301,9 +300,9 @@ Accidental_engraver::process_acknowledged_grobs () announce_grob (a, SCM_EOL); - SCM accs = gh_cons (gh_int2scm (pitch->alteration_), SCM_EOL); + SCM accs = gh_cons (scm_int2num (pitch->get_alteration ()), SCM_EOL); if (num == 2 && extra_natural_b) - accs = gh_cons (gh_int2scm (0), accs); + accs = gh_cons (scm_int2num (0), accs); /* TODO: @@ -331,8 +330,10 @@ Accidental_engraver::process_acknowledged_grobs () accidentals. */ - for (int i = 0; i < arpeggios_.size (); i++) - Side_position_interface::add_support (arpeggios_[i], a); + for (int i = 0; i < left_objects_.size (); i++) + Side_position_interface::add_support (left_objects_[i], a); + for (int i = 0; i < right_objects_.size (); i++) + Side_position_interface::add_support (a, right_objects_[i]); } @@ -345,10 +346,10 @@ Accidental_engraver::process_acknowledged_grobs () */ - int n = pitch->notename_; - int o = pitch->octave_; - int a = pitch->alteration_; - SCM on_s = gh_cons (gh_int2scm (o), gh_int2scm (n)); + int n = pitch->get_notename (); + int o = pitch->get_octave (); + int a = pitch->get_alteration (); + SCM on_s = gh_cons (scm_int2num (o), scm_int2num (n)); /* TODO: Speed this up! @@ -387,7 +388,7 @@ Accidental_engraver::process_acknowledged_grobs () noteheads with the same notename. */ localsig = ly_assoc_front_x - (localsig, on_s, gh_cons (gh_int2scm (a), barnum)); + (localsig, on_s, gh_cons (scm_int2num (a), barnum)); } origin->set_property ("localKeySignature", localsig); origin = origin->daddy_trans_; @@ -419,16 +420,19 @@ Accidental_engraver::stop_translation_timestep () accidental_placement_ = 00; accidentals_.clear(); - arpeggios_.clear (); + left_objects_.clear (); + right_objects_.clear (); ties_.clear (); } void Accidental_engraver::acknowledge_grob (Grob_info info) { - Note_req * note = dynamic_cast (info.music_cause ()); + Music * note = info.music_cause (); - if (note && Rhythmic_head::has_interface (info.grob_)) + if (note + && note->is_mus_type("note-event") + && Rhythmic_head::has_interface (info.grob_)) { Accidental_entry entry ; entry.head_ = info.grob_; @@ -443,9 +447,12 @@ Accidental_engraver::acknowledge_grob (Grob_info info) } else if (Arpeggio::has_interface (info.grob_)) { - arpeggios_.push (info.grob_); + left_objects_.push (info.grob_); + } + else if (info.grob_->internal_has_interface (ly_symbol2scm("finger-interface"))) + { + left_objects_.push (info.grob_); } - } void @@ -475,11 +482,11 @@ Accidental_engraver::process_music () ENTER_DESCRIPTION (Accidental_engraver, -"Make accidentals. Catches note heads, ties and notices key-change -events. Due to interaction with ties (which don't come together -with note heads), this needs to be in a context higher than Tie_engraver.", - +"Make accidentals. Catches note heads, ties and notices key-change " +" events. Due to interaction with ties (which don't come together " +" with note heads), this needs to be in a context higher than Tie_engraver.", "Accidental", - "rhythmic-head-interface tie-interface arpeggio-interface", +/* accepts */ "", + "finger-interface rhythmic-head-interface tie-interface arpeggio-interface", "localKeySignature extraNatural autoAccidentals autoCautionaries", "localKeySignature");