X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fnew-fingering-engraver.cc;h=843cae76d21693a586078d3ec78e7d1d4774e0eb;hb=e2f58ec825991f245bae430875f9d78f96625069;hp=f653a0ab62e9454142ec6e82e6c4e15bb50c85be;hpb=525a051b0b0bebc0983afc1fad3e6710e9f30c72;p=lilypond.git diff --git a/lily/new-fingering-engraver.cc b/lily/new-fingering-engraver.cc index f653a0ab62..843cae76d2 100644 --- a/lily/new-fingering-engraver.cc +++ b/lily/new-fingering-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2002 Han-Wen Nienhuys + (c) 1998--2004 Han-Wen Nienhuys */ @@ -15,7 +15,7 @@ #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 +24,7 @@ struct Finger_tuple Grob *script_; Music *note_event_; Music *finger_event_; - SCM description_; + bool follow_into_staff_; int position_; Finger_tuple () @@ -32,7 +32,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 +49,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 @@ -64,12 +64,14 @@ New_fingering_engraver::acknowledge_grob (Grob_info inf) if (Rhythmic_head::has_interface (inf.grob_)) { Music * note_ev =inf.music_cause (); + if (!note_ev) + return; + + SCM arts = note_ev->get_property ("articulations"); - SCM arts = note_ev->get_mus_property ("articulations"); - - for (SCM s = arts; gh_pair_p (s); s = gh_cdr (s)) + for (SCM s = arts; ly_c_pair_p (s); s = ly_cdr (s)) { - Music * m = unsmob_music (gh_car (s)); + Music * m = unsmob_music (ly_car (s)); if (!m) continue; @@ -79,10 +81,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 +106,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 +134,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 +147,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,46 +177,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")); } - + + 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); - SCM fhd = get_property ("fingerHorizontalDirection"); - - 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) { - up.push (fingerings_.pop()); - down.push (fingerings_[0]); - fingerings_.del(0); + 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); + } - horiz = fingerings_; + 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_; @@ -214,42 +247,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)); } } @@ -258,43 +286,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 */ "");