2 fingering-engraver.cc -- implement Fingering_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 1998--2005 Han-Wen Nienhuys <hanwen@cs.uu.nl>
10 #include "side-position-interface.hh"
12 #include "rhythmic-head.hh"
13 #include "self-alignment-interface.hh"
15 class Fingering_engraver
: public Engraver
17 Link_array
<Music
> reqs_
;
18 Link_array
<Item
> fingerings_
;
21 TRANSLATOR_DECLARATIONS (Fingering_engraver
);
23 virtual bool try_music (Music
*m
);
24 virtual void stop_translation_timestep ();
25 virtual void start_translation_timestep ();
26 virtual void process_music ();
27 virtual void acknowledge_grob (Grob_info
);
30 void make_script (Direction
, Music
*, int);
34 Fingering_engraver::try_music (Music
*m
)
36 if (m
->is_mus_type ("fingering-event"))
45 Fingering_engraver::acknowledge_grob (Grob_info inf
)
47 if (Stem::has_interface (inf
.grob ()))
49 for (int i
= 0; i
< fingerings_
.size (); i
++)
51 Side_position_interface::add_support (fingerings_
[i
], inf
.grob ());
54 else if (Rhythmic_head::has_interface (inf
.grob ()))
56 for (int i
= 0; i
< fingerings_
.size (); i
++)
58 Grob
*t
= fingerings_
[i
];
59 Side_position_interface::add_support (t
, inf
.grob ());
60 if (!t
->get_parent (X_AXIS
))
61 t
->set_parent (inf
.grob (), X_AXIS
);
67 Fingering_engraver::process_music ()
69 for (int i
= reqs_
.size (); i
--;)
71 SCM dir
= reqs_
[i
]->get_property ("direction");
72 make_script (to_dir (dir
), reqs_
[i
], i
);
77 Fingering_engraver::make_script (Direction d
, Music
*r
, int i
)
79 Item
*fingering
= make_item ("Fingering", r
->self_scm ());
81 Axis other
= other_axis (a
);
84 Huh, what's this for? --hwn.
88 SCM pitch
= r
->get_property ("pitch");
89 if (unsmob_pitch (pitch
))
90 fingering
->set_property ("pitch", pitch
);
93 We can't fold these definitions into define-grobs since
94 fingerings for chords need different settings.
96 Side_position_interface::set_axis (fingering
, a
);
97 fingering
->add_offset_callback (Self_alignment_interface::aligned_on_self_proc
, other
);
98 fingering
->add_offset_callback (Self_alignment_interface::centered_on_parent_proc
, other
);
102 SCM s
= fingering
->get_property ("script-priority");
103 if (scm_is_number (s
))
104 priority
= scm_to_int (s
);
106 /* See script-engraver.cc */
109 fingering
->set_property ("script-priority", scm_int2num (priority
));
111 if (!is_direction (fingering
->get_property ("direction")))
114 fingering
->set_property ("direction", scm_int2num (d
));
116 fingering
->set_property ("direction", scm_int2num (RIGHT
));
119 SCM dig
= r
->get_property ("digit");
120 fingering
->set_property ("text", scm_number_to_string (dig
, scm_int2num (10)));
122 fingerings_
.push (fingering
);
126 Fingering_engraver::stop_translation_timestep ()
128 if (!fingerings_
.size ())
131 fingerings_
.clear ();
135 Fingering_engraver::start_translation_timestep ()
140 Fingering_engraver::Fingering_engraver ()
144 ADD_TRANSLATOR (Fingering_engraver
,
145 /* descr */ "Create fingering-scripts",
146 /* creats*/ "Fingering",
147 /* accepts */ "fingering-event",
148 /* acks */ "rhythmic-head-interface stem-interface",