X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fnew-fingering-engraver.cc;h=e1a71795b373c9beba568a1a77c589f357cc3531;hb=332da9f4d25f9f63a3222efc87fae06b0c7abbdd;hp=1018d465a82fa42c61ba7f081dc3de07cc58b011;hpb=7ea5c74058200ace4b405de82e1088560aeaacb2;p=lilypond.git diff --git a/lily/new-fingering-engraver.cc b/lily/new-fingering-engraver.cc index 1018d465a8..e1a71795b3 100644 --- a/lily/new-fingering-engraver.cc +++ b/lily/new-fingering-engraver.cc @@ -3,19 +3,17 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2003 Han-Wen Nienhuys + (c) 1998--2004 Han-Wen Nienhuys */ #include "warn.hh" #include "engraver.hh" #include "side-position-interface.hh" -#include "item.hh" -#include "event.hh" #include "stem.hh" #include "rhythmic-head.hh" #include "self-alignment-interface.hh" -#include "script.hh" +#include "script-interface.hh" #include "stem.hh" struct Finger_tuple @@ -24,7 +22,7 @@ struct Finger_tuple Grob *script_; Music *note_event_; Music *finger_event_; - SCM description_; + bool follow_into_staff_; int position_; Finger_tuple () @@ -32,7 +30,7 @@ struct Finger_tuple position_ = 0; head_ = script_ = 0; note_event_ = finger_event_ = 0; - description_ = SCM_EOL; + follow_into_staff_ = false; } static int compare (Finger_tuple const & c1, Finger_tuple const & c2) { @@ -49,13 +47,13 @@ class New_fingering_engraver : public Engraver Grob *stem_; public: - TRANSLATOR_DECLARATIONS(New_fingering_engraver); + TRANSLATOR_DECLARATIONS (New_fingering_engraver); protected: virtual void stop_translation_timestep (); virtual void acknowledge_grob (Grob_info); void add_fingering (Grob*, Music*,Music*); void add_script (Grob*, Music*,Music*); - void position_scripts(); + void position_scripts (); }; void @@ -63,13 +61,15 @@ New_fingering_engraver::acknowledge_grob (Grob_info inf) { if (Rhythmic_head::has_interface (inf.grob_)) { - Music * note_ev =inf.music_cause (); - - SCM arts = note_ev->get_mus_property ("articulations"); + Music * note_ev = inf.music_cause (); + if (!note_ev) + return; + + SCM arts = note_ev->get_property ("articulations"); - for (SCM s = arts; gh_pair_p (s); s = gh_cdr (s)) + for (SCM s = arts; scm_is_pair (s); s = scm_cdr (s)) { - Music * m = unsmob_music (gh_car (s)); + Music * m = unsmob_music (scm_car (s)); if (!m) continue; @@ -79,10 +79,21 @@ New_fingering_engraver::acknowledge_grob (Grob_info inf) { add_fingering (inf.grob_ , m, note_ev); } + else if (m->is_mus_type ("text-script-event")) + { + m->origin ()->warning ("Can not add text scripts to individual note heads"); + } else if (m->is_mus_type ("script-event")) { add_script (inf.grob_, m, note_ev); } + else if (m->is_mus_type ("harmonic-event")) + { + inf.grob_->set_property ("style", ly_symbol2scm ("harmonic")); + Grob * d = unsmob_grob (inf.grob_->get_property ("dot")); + if (d) + d->suicide (); + } } heads_.push (inf.grob_); @@ -93,24 +104,25 @@ New_fingering_engraver::acknowledge_grob (Grob_info inf) } } -extern Grob *make_script_from_event (SCM * descr, Translator_group*tg, Music * event, - int index); void New_fingering_engraver::add_script (Grob * head, Music * event, - Music * head_event) + Music * ) { Finger_tuple ft ; - ft.script_ =make_script_from_event (&ft.description_, daddy_trans_, event, 0); - - articulations_.push (ft); - announce_grob (ft.script_, event->self_scm ()); - + Grob * g = make_item ("Script", event->self_scm () ); + make_script_from_event (g, &ft.follow_into_staff_, context (), + event->get_property ("articulation-type"), 0); + if (g) + { + ft.script_ = g ; + + articulations_.push (ft); - ft.script_->set_parent (head, X_AXIS); -} - + ft.script_->set_parent (head, X_AXIS); + } +} void @@ -120,12 +132,11 @@ New_fingering_engraver::add_fingering (Grob * head, { Finger_tuple ft; - ft.script_ = new Item (get_property ("Fingering")); - announce_grob (ft.script_, event->self_scm()); + ft.script_ = make_item ("Fingering", event->self_scm () ); Side_position_interface::add_support (ft.script_, head); - int d = gh_scm2int ( event->get_mus_property ("digit")); + int d = scm_to_int (event->get_property ("digit")); /* TODO: @@ -134,16 +145,15 @@ New_fingering_engraver::add_fingering (Grob * head, the thumb lives in a different font. Maybe it should be moved? */ - if (d > 5) { /* music for the softenon children? */ - event->origin()->warning (_("music for the martians.")); + event->origin ()->warning (_("music for the martians.")); } - SCM sstr = scm_number_to_string (gh_int2scm (d), gh_int2scm (10)) ; - ft.script_->set_grob_property ("text", sstr); + SCM sstr = scm_number_to_string (scm_int2num (d), scm_int2num (10)) ; + ft.script_->set_property ("text", sstr); ft.finger_event_ = event; ft.note_event_ = hevent; @@ -165,51 +175,67 @@ New_fingering_engraver::position_scripts () to the note head, and write a more flexible function for positioning the fingerings, setting both X and Y coordinates. */ - for (int i = 0; i < fingerings_.size(); i++) + for (int i = 0; i < fingerings_.size (); i++) { - fingerings_[i].position_ = gh_scm2int (fingerings_[i].head_ -> get_grob_property( "staff-position")); + fingerings_[i].position_ = scm_to_int (fingerings_[i].head_ -> get_property ( "staff-position")); } - SCM fhd = get_property ("fingerHorizontalDirection"); - + for (int i = fingerings_.size (); i--;) + for (int j = heads_.size () ; j--;) + Side_position_interface::add_support (fingerings_[i].script_, heads_[j]); + Array up, down, horiz; - for (int i = fingerings_.size(); i--;) + for (int i = fingerings_.size (); i--;) { - SCM d = fingerings_[i].finger_event_->get_mus_property ("direction"); + SCM d = fingerings_[i].finger_event_->get_property ("direction"); if (to_dir (d)) { - if (to_dir (d) == UP) - { - up.push (fingerings_[i]); - } - else - down.push (fingerings_[i]); + ((to_dir (d) == UP) ? up : down ).push (fingerings_[i]); fingerings_.del (i); } } fingerings_.sort (&Finger_tuple::compare); - - if (ly_dir_p (fhd)) + SCM orientations = get_property ("fingeringOrientations"); + + bool up_p = scm_c_memq (ly_symbol2scm ("up"), orientations) != SCM_BOOL_F; + bool down_p = scm_c_memq (ly_symbol2scm ("down"), orientations) != SCM_BOOL_F; + bool left_p = scm_c_memq (ly_symbol2scm ("left"), orientations) != SCM_BOOL_F; + bool right_p = scm_c_memq (ly_symbol2scm ("right"), orientations) != SCM_BOOL_F; + Direction hordir = (right_p) ? RIGHT : LEFT; + if (left_p || right_p) { - if (!up.size()) - up.push (fingerings_.pop()); - if (!down.size()) + if (up_p && !up.size () && fingerings_.size ()) + up.push (fingerings_.pop ()); + + if (down_p && !down.size () && fingerings_.size ()) { down.push (fingerings_[0]); - fingerings_.del(0); + fingerings_.del (0); } horiz.concat (fingerings_); } - else + else if (up_p && down_p) { - int center = fingerings_.size() / 2; + int center = fingerings_.size () / 2; down.concat (fingerings_.slice (0,center)); - up.concat (fingerings_.slice (center, fingerings_.size())); + up.concat (fingerings_.slice (center, fingerings_.size ())); } - - for (int i = 0; i < horiz.size(); i++) + else if (up_p) + { + up.concat (fingerings_); + fingerings_ .clear (); + } + else + { + if (!down_p) + warning (_ ("Fingerings are also not down?! Putting them down anyway.")); + down.concat (fingerings_); + fingerings_.clear (); + } + + for (int i = 0; i < horiz.size (); i++) { Finger_tuple ft = horiz[i]; Grob* f = ft.script_; @@ -219,42 +245,37 @@ New_fingering_engraver::position_scripts () f->add_offset_callback (Self_alignment_interface::aligned_on_self_proc, Y_AXIS); f->add_offset_callback (Side_position_interface::aligned_side_proc, X_AXIS); - f->set_grob_property( "direction", fhd); - typeset_grob (f); + f->set_property ("direction", scm_int2num (hordir)); } int finger_prio = 200; - for (int i = 0; i < up.size(); i++) + for (int i = 0; i < up.size (); i++) { Finger_tuple ft = up[i]; Grob* f = ft.script_; f->set_parent (ft.head_, X_AXIS); - f->set_grob_property ("script-priority", - gh_int2scm (finger_prio + i)); + f->set_property ("script-priority", + scm_int2num (finger_prio + i)); f->add_offset_callback (Side_position_interface::aligned_side_proc, Y_AXIS); f->add_offset_callback (Self_alignment_interface::centered_on_parent_proc, X_AXIS); f->add_offset_callback (Self_alignment_interface::aligned_on_self_proc, X_AXIS); - f->set_grob_property ("direction", gh_int2scm (UP)); + f->set_property ("direction", scm_int2num (UP)); - Side_position_interface::add_staff_support (f); - typeset_grob (f); } - for (int i = 0; i < down.size(); i++) + for (int i = 0; i < down.size (); i++) { Finger_tuple ft = down[i]; Grob* f = ft.script_; f->set_parent (ft.head_, X_AXIS); - f->set_grob_property ("script-priority", - gh_int2scm (finger_prio + down.size() - i)); + f->set_property ("script-priority", + scm_int2num (finger_prio + down.size () - i)); f->add_offset_callback (Self_alignment_interface::centered_on_parent_proc, X_AXIS); f->add_offset_callback (Self_alignment_interface::aligned_on_self_proc, X_AXIS); f->add_offset_callback (Side_position_interface::aligned_side_proc, Y_AXIS); - f->set_grob_property ("direction", gh_int2scm (DOWN)); - Side_position_interface::add_staff_support (f); - typeset_grob (f); + f->set_property ("direction", scm_int2num (DOWN)); } } @@ -263,43 +284,51 @@ New_fingering_engraver::stop_translation_timestep () { if (fingerings_.size ()) { - position_scripts(); + for (int i = 0; i < fingerings_.size(); i++) + if (stem_ && to_boolean (fingerings_[i].script_->get_property ("add-stem-support"))) + Side_position_interface::add_support (fingerings_[i].script_, stem_); + position_scripts (); fingerings_.clear (); } - for (int i = articulations_.size(); i--;) + for (int i = articulations_.size (); i--;) { - Grob *sc = articulations_[i].script_; + Grob *script = articulations_[i].script_; - for (int j = heads_.size() ; j--;) - Side_position_interface::add_support (sc, heads_[j]); + for (int j = heads_.size () ; j--;) + Side_position_interface::add_support (script, heads_[j]); - if (stem_ && to_dir (sc->get_grob_property ("side-relative-direction"))) - sc->set_grob_property ("direction-source", stem_->self_scm ()); + if (stem_ && to_dir (script->get_property ("side-relative-direction"))) + script->set_property ("direction-source", stem_->self_scm ()); + + + if (stem_ && to_boolean (script->get_property ("add-stem-support"))) + Side_position_interface::add_support (script, stem_); - SCM follow = scm_assoc (ly_symbol2scm ("follow-into-staff"), articulations_[i].description_); - if (gh_pair_p (follow) && to_boolean (gh_cdr (follow))) - sc->add_offset_callback (Side_position_interface::quantised_position_proc, Y_AXIS); - else - Side_position_interface::add_staff_support (sc); - typeset_grob (sc); + if (articulations_[i].follow_into_staff_) + { + script->add_offset_callback (Side_position_interface::quantised_position_proc, Y_AXIS); + script->set_property ("staff-padding" , SCM_EOL); + } } stem_ = 0; heads_.clear (); - articulations_.clear(); + articulations_.clear (); } -New_fingering_engraver::New_fingering_engraver() +New_fingering_engraver::New_fingering_engraver () { stem_ = 0; } -ENTER_DESCRIPTION(New_fingering_engraver, -/* descr */ "Create fingering-scripts for notes in a New Chord.", +ENTER_DESCRIPTION (New_fingering_engraver, +/* descr */ "Create fingering-scripts for notes in a new chord. " + "This engraver is ill-named, since it " + "also takes care of articulations and harmonic note heads", /* creats*/ "Fingering", -/* accepts */ "text-script-event", +/* accepts */ "", /* acks */ "rhythmic-head-interface stem-interface", -/* reads */ "fingerHorizontalDirection", +/* reads */ "fingeringOrientations", /* write */ "");