X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ffingering-engraver.cc;h=1c4107e686294ffd345fb9c572d2342762f7366f;hb=5b4b0d6e9a197e8f9eb085b7c2ad78b8be3e5cfc;hp=688b3492aed642e5e7b208feb273024abc1d4ad9;hpb=1403a2c3b4a03ee78be253ac4c4f206b7a3b05db;p=lilypond.git diff --git a/lily/fingering-engraver.cc b/lily/fingering-engraver.cc index 688b3492ae..1c4107e686 100644 --- a/lily/fingering-engraver.cc +++ b/lily/fingering-engraver.cc @@ -1,214 +1,131 @@ -/* - fingering-engraver.cc -- implement Fingering_engraver - +/* + fingering-engraver.cc -- implement Fingering_engraver + source file of the GNU LilyPond music typesetter - - (c) 1998--2002 Han-Wen Nienhuys - - */ + (c) 1998--2008 Han-Wen Nienhuys +*/ #include "engraver.hh" +#include "pitch.hh" +#include "rhythmic-head.hh" +#include "self-alignment-interface.hh" #include "side-position-interface.hh" -#include "item.hh" -#include "event.hh" #include "stem.hh" -#include "rhythmic-head.hh" +#include "stream-event.hh" +#include "item.hh" + +#include "translator.icc" class Fingering_engraver : public Engraver { - Link_array reqs_; - Link_array fingerings_; + vector events_; + vector fingerings_; - Link_array up_reqs_; - Link_array hor_reqs_; - Link_array down_reqs_; - public: - TRANSLATOR_DECLARATIONS(Fingering_engraver); + TRANSLATOR_DECLARATIONS (Fingering_engraver); protected: - virtual bool try_music (Music* m); - virtual void stop_translation_timestep (); - virtual void start_translation_timestep (); - virtual void process_music (); - virtual void acknowledge_grob (Grob_info); - - void make_script (Direction, Music*,Axis, int); + void stop_translation_timestep (); + void process_music (); + DECLARE_TRANSLATOR_LISTENER (fingering); + DECLARE_TRANSLATOR_LISTENER (stroke_finger); + DECLARE_ACKNOWLEDGER (rhythmic_head); + DECLARE_ACKNOWLEDGER (stem); + +private: + void make_script (Direction, Stream_event *, int); }; -bool -Fingering_engraver::try_music (Music *m) +IMPLEMENT_TRANSLATOR_LISTENER (Fingering_engraver, fingering); +void +Fingering_engraver::listen_fingering (Stream_event *ev) { - if (m->is_mus_type ("text-script-event")) - { - if (m->get_mus_property ("text-type") != ly_symbol2scm ("finger")) - return false; - - reqs_.push (m); - return true; - } - return false; + events_.push_back (ev); } +IMPLEMENT_TRANSLATOR_LISTENER (Fingering_engraver, stroke_finger); void -Fingering_engraver::acknowledge_grob (Grob_info inf) +Fingering_engraver::listen_stroke_finger (Stream_event *ev) { - if (Stem::has_interface (inf.grob_)) - { - for (int i=0; i < fingerings_.size (); i++) - { - Side_position_interface::add_support (fingerings_[i],inf.grob_); - } - } - else if (Rhythmic_head::has_interface (inf.grob_)) - { - Music * mc =inf.music_cause (); - Pitch * mp = mc? unsmob_pitch (mc->get_mus_property ("pitch")) :0; - for (int i=0; i < fingerings_.size (); i++) - { - Grob*t = fingerings_[i]; - Side_position_interface::add_support (t,inf.grob_); - Pitch *fp = unsmob_pitch (t->get_grob_property ("pitch")); - if (fp) - { - if (!mp) - continue; - - if (*fp == *mp) - { - Axis other = other_axis (Side_position_interface::get_axis (t)); - t->set_parent (inf.grob_, other); - } - } - else - { - if (!t->get_parent (X_AXIS)) - t->set_parent (inf.grob_, X_AXIS); - } - } - } + /* + FIXME: should do something. + + This function is mainly here to shut up a warning + */ + (void)ev; } -static int -req_compare (Music * const &a,Music * const &b) +void +Fingering_engraver::acknowledge_stem (Grob_info inf) { - Pitch *pa = unsmob_pitch (a->get_mus_property ("pitch")); - Pitch *pb = unsmob_pitch (b->get_mus_property ("pitch")); - - if (!pa && !pb) - return 0; - if (pa && !pb) - return 1; - if (!pa && pb) - return -1; - - return Pitch::compare (*pa, *pb); + for (vsize i = 0; i < fingerings_.size (); i++) + Side_position_interface::add_support (fingerings_[i], inf.grob ()); } void -Fingering_engraver::process_music () +Fingering_engraver::acknowledge_rhythmic_head (Grob_info inf) { - if (!reqs_.size()) - return ; - - Link_array pitch_sorted_reqs = reqs_; - for (int i= pitch_sorted_reqs.size(); i--;) + for (vsize i = 0; i < fingerings_.size (); i++) { - SCM dir = pitch_sorted_reqs[i]->get_mus_property ("direction"); - if (ly_dir_p (dir) && to_dir (dir)) { - if (to_dir (dir) == UP) - up_reqs_.push (pitch_sorted_reqs[i]); - else if (to_dir (dir) == DOWN) - down_reqs_ .push (pitch_sorted_reqs[i]); - pitch_sorted_reqs.del(i); - - continue ; - } - else if (!unsmob_pitch (pitch_sorted_reqs[i]->get_mus_property ("pitch"))) - { - /* - chuck out reqs that have no pitch. We put them over the note by default. - */ - up_reqs_.push (pitch_sorted_reqs [i]); - pitch_sorted_reqs.del (i); - } - } - up_reqs_.reverse (); - down_reqs_.reverse (); - - pitch_sorted_reqs.sort (&req_compare); - - if (to_boolean (get_property ("scriptHorizontal"))) - { -#if 1 // -> 0 for testing horizontal fingerings. - - down_reqs_.push ( pitch_sorted_reqs[0]); - pitch_sorted_reqs.del (0); - - if (pitch_sorted_reqs.size()) - { - up_reqs_.push (pitch_sorted_reqs.top ()); - pitch_sorted_reqs.pop(); - } -#endif - hor_reqs_ = pitch_sorted_reqs; + Grob *t = fingerings_[i]; + Side_position_interface::add_support (t, inf.grob ()); + if (!t->get_parent (X_AXIS)) + t->set_parent (inf.grob (), X_AXIS); } - else +} + +void +Fingering_engraver::process_music () +{ + for (vsize i = events_.size (); i--;) { - int sz = pitch_sorted_reqs.size (); - down_reqs_.concat (pitch_sorted_reqs.slice(0, (sz + sz%2)/2 )); - up_reqs_.concat (pitch_sorted_reqs.slice((sz + sz%2)/2, sz)); - hor_reqs_ .clear (); + SCM dir = events_[i]->get_property ("direction"); + make_script (to_dir (dir), events_[i], i); } - - for (int i = 0; i < down_reqs_.size();i++) - make_script (DOWN, down_reqs_[i], Y_AXIS, i); - for (int i = 0; i < up_reqs_.size();i++) - make_script (UP, up_reqs_[i], Y_AXIS, i); - for (int i = 0; i < hor_reqs_.size();i++) - make_script (CENTER, hor_reqs_[i],X_AXIS, i); } void -Fingering_engraver::make_script (Direction d, Music *r,Axis a, int i) +Fingering_engraver::make_script (Direction d, Stream_event *r, int i) { - Item *fingering = new Item (get_property ("Fingering")); + Item *fingering = make_item ("Fingering", r->self_scm ()); - Axis other = other_axis (a); + /* + Huh, what's this for? --hwn. - SCM pitch = r->get_mus_property ("pitch"); + junkme. + */ + SCM pitch = r->get_property ("pitch"); if (unsmob_pitch (pitch)) - fingering->set_grob_property ("pitch", pitch); - - Side_position_interface::set_axis (fingering, a); - - fingering->add_offset_callback (Self_alignment_interface::aligned_on_self_proc, other); - fingering->add_offset_callback (Self_alignment_interface::centered_on_parent_proc, other); + fingering->set_property ("pitch", pitch); + + /* + We can't fold these definitions into define-grobs since + fingerings for chords need different settings. + */ + Side_position_interface::set_axis (fingering, Y_AXIS); + Self_alignment_interface::set_align_self (fingering, X_AXIS); + Self_alignment_interface::set_center_parent (fingering, X_AXIS); // Hmm int priority = 200; - SCM s = fingering->get_grob_property ("script-priority"); - if (gh_number_p (s)) - priority = gh_scm2int (s); - + SCM s = fingering->get_property ("script-priority"); + if (scm_is_number (s)) + priority = scm_to_int (s); + /* See script-engraver.cc */ priority += i; - fingering->set_grob_property ("script-priority", gh_int2scm (priority)); - + fingering->set_property ("script-priority", scm_from_int (priority)); - if (!ly_dir_p (fingering->get_grob_property ("direction"))) + if (!is_direction (fingering->get_property_data ("direction"))) { if (d) - fingering->set_grob_property ("direction", gh_int2scm (d)); + fingering->set_property ("direction", scm_from_int (d)); else - fingering->set_grob_property ("direction", gh_int2scm (RIGHT)); + fingering->set_property ("direction", scm_from_int (RIGHT)); } - - fingering->set_grob_property ("text", r->get_mus_property ("text")); - - announce_grob (fingering, r->self_scm()); - fingerings_.push (fingering); + + fingerings_.push_back (fingering); } void @@ -216,34 +133,28 @@ Fingering_engraver::stop_translation_timestep () { if (!fingerings_.size ()) return; - - for (int i=0; i < fingerings_.size (); i++) - { - Item *ti = fingerings_[i]; - Side_position_interface::add_staff_support (ti); - typeset_grob (ti); - } + fingerings_.clear (); + events_.clear (); } -void -Fingering_engraver::start_translation_timestep () +Fingering_engraver::Fingering_engraver () { - reqs_.clear (); - up_reqs_.clear (); - down_reqs_.clear (); - hor_reqs_.clear (); } -Fingering_engraver::Fingering_engraver() -{ +ADD_ACKNOWLEDGER (Fingering_engraver, rhythmic_head); +ADD_ACKNOWLEDGER (Fingering_engraver, stem); -} +ADD_TRANSLATOR (Fingering_engraver, + /* doc */ + "Create fingering scripts.", + + /* create */ + "Fingering ", + + /* read */ + "", -ENTER_DESCRIPTION(Fingering_engraver, -/* descr */ "Create fingering-scripts", -/* creats*/ "Fingering", -/* accepts */ "text-script-event", -/* acks */ "rhythmic-head-interface stem-interface", -/* reads */ "scriptHorizontal", -/* write */ ""); + /* write */ + "" + );