2 This file is part of LilyPond, the GNU music typesetter.
4 Copyright (C) 1997--2010 Han-Wen Nienhuys <hanwen@xs4all.nl>
6 LilyPond is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
11 LilyPond is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
24 #include "duration.hh"
25 #include "engraver.hh"
26 #include "note-column.hh"
27 #include "rhythmic-head.hh"
28 #include "side-position-interface.hh"
29 #include "script-interface.hh"
31 #include "stream-event.hh"
34 #include "translator.icc"
36 class Drum_notes_engraver
: public Engraver
39 vector
<Item
*> scripts_
;
40 vector
<Stream_event
*> events_
;
43 TRANSLATOR_DECLARATIONS (Drum_notes_engraver
);
46 void process_music ();
47 DECLARE_ACKNOWLEDGER (stem
);
48 DECLARE_ACKNOWLEDGER (note_column
);
49 DECLARE_TRANSLATOR_LISTENER (note
);
50 void stop_translation_timestep ();
53 Drum_notes_engraver::Drum_notes_engraver ()
57 IMPLEMENT_TRANSLATOR_LISTENER (Drum_notes_engraver
, note
);
59 Drum_notes_engraver::listen_note (Stream_event
*ev
)
61 events_
.push_back (ev
);
65 Drum_notes_engraver::process_music ()
68 for (vsize i
= 0; i
< events_
.size (); i
++)
71 tab
= get_property ("drumStyleTable");
73 Stream_event
*ev
= events_
[i
];
74 Item
*note
= make_item ("NoteHead", ev
->self_scm ());
76 SCM drum_type
= ev
->get_property ("drum-type");
80 if (scm_hash_table_p (tab
) == SCM_BOOL_T
)
81 defn
= scm_hashq_ref (tab
, drum_type
, SCM_EOL
);
83 if (scm_is_pair (defn
))
85 SCM pos
= scm_caddr (defn
);
86 SCM style
= scm_car (defn
);
87 SCM script
= scm_cadr (defn
);
89 if (scm_integer_p (pos
) == SCM_BOOL_T
)
90 note
->set_property ("staff-position", pos
);
91 if (scm_is_symbol (style
))
92 note
->set_property ("style", style
);
94 if (scm_is_string (script
))
96 Item
*p
= make_item ("Script", ev
->self_scm ());
97 make_script_from_event (p
, context (), script
,
100 p
->set_parent (note
, Y_AXIS
);
101 Side_position_interface::add_support (p
, note
);
102 scripts_
.push_back (p
);
106 notes_
.push_back (note
);
111 Drum_notes_engraver::acknowledge_stem (Grob_info inf
)
113 for (vsize i
= 0; i
< scripts_
.size (); i
++)
115 Grob
*e
= scripts_
[i
];
117 if (to_dir (e
->get_property ("side-relative-direction")))
118 e
->set_object ("direction-source", inf
.grob ()->self_scm ());
120 Side_position_interface::add_support (e
, inf
.grob ());
125 Drum_notes_engraver::acknowledge_note_column (Grob_info inf
)
127 for (vsize i
= 0; i
< scripts_
.size (); i
++)
129 Grob
*e
= scripts_
[i
];
131 if (!e
->get_parent (X_AXIS
)
132 && Side_position_interface::get_axis (e
) == Y_AXIS
)
133 e
->set_parent (inf
.grob (), X_AXIS
);
138 Drum_notes_engraver::stop_translation_timestep ()
146 ADD_ACKNOWLEDGER (Drum_notes_engraver
, stem
);
147 ADD_ACKNOWLEDGER (Drum_notes_engraver
, note_column
);
150 ADD_TRANSLATOR (Drum_notes_engraver
,
152 "Generate drum note heads.",