2 staff-switching-translator.cc -- implement Staff_switching_translator
4 source file of the GNU LilyPond music typesetter
6 (c) 1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
10 #include "interpretation-context-handle.hh"
11 #include "drul-array.hh"
12 #include "engraver-group-engraver.hh"
13 #include "musical-request.hh"
15 class Staff_switching_translator
: public Engraver
17 Interpretation_context_handle my_voice_
;
18 Drul_array
<Interpretation_context_handle
> staff_handle_drul_
;
22 virtual bool do_try_music (Music
* m
);
23 virtual void do_creation_processing ();
25 void default_voice (Direction
);
27 Staff_switching_translator ();
28 VIRTUAL_COPY_CONS(Translator
);
31 Staff_switching_translator::Staff_switching_translator ()
37 Staff_switching_translator::do_creation_processing ()
39 Translator_group
* daddy
=daddy_grav_l (); // staff switching context
42 Scalar pit
= get_property ("switchPitch", 0);
44 switch_pitch_i_
= int (pit
);
45 Scalar s
= get_property("staffContextName", 0);
46 Scalar up
= get_property ("upStaffName",0);
47 Scalar down
= get_property ("downStaffName",0);
48 if (!up
.length_i()) up
= "upper";
49 if (!down
.length_i()) up
= "lower";
51 staff_handle_drul_
[UP
].set_translator (daddy
->daddy_trans_l_
-> find_create_translator_l (s
, up
));
52 staff_handle_drul_
[DOWN
].set_translator (daddy
->daddy_trans_l_
-> find_create_translator_l (s
, down
));
55 staff_handle_drul_
[DOWN
].report_to_l ()->set_property ("defaultClef", "bass");
62 Staff_switching_translator::default_voice (Direction d
)
64 Scalar s
= get_property ("acceptorName",0);
65 my_voice_
.set_translator (staff_handle_drul_
[d
].report_to_l ()->find_create_translator_l ("Thread", daddy_trans_l_
->id_str_
));
69 Staff_switching_translator::do_try_music (Music
*m
)
71 if (Note_req
*nr
= dynamic_cast<Note_req
*> (m
))
73 Direction staff
= (nr
->pitch_
.semitone_pitch () >= switch_pitch_i_
)
78 Translator_group
* mv
= my_voice_
.report_to_l ();
79 Translator_group
*dest_staff
=staff_handle_drul_
[staff
].report_to_l ();
80 Scalar s
= get_property ("switcherName", 0);
82 while (mv
&& mv
->type_str_
!= s
)
84 mv
= mv
-> daddy_trans_l_
;
88 default_voice (staff
);
90 if (mv
->daddy_trans_l_
!= dest_staff
)
92 mv
->daddy_trans_l_
->remove_translator_p (mv
);
93 dest_staff
->add_translator (mv
);
97 return my_voice_
.try_music (m
);
100 ADD_THIS_TRANSLATOR(Staff_switching_translator
);