2 This file is part of LilyPond, the GNU music typesetter.
4 Copyright (C) 1997--2011 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
38 vector
<Item
*> scripts_
;
39 vector
<Stream_event
*> events_
;
42 TRANSLATOR_DECLARATIONS (Drum_notes_engraver
);
45 void process_music ();
46 DECLARE_ACKNOWLEDGER (stem
);
47 DECLARE_ACKNOWLEDGER (note_column
);
48 DECLARE_TRANSLATOR_LISTENER (note
);
49 void stop_translation_timestep ();
52 Drum_notes_engraver::Drum_notes_engraver ()
56 IMPLEMENT_TRANSLATOR_LISTENER (Drum_notes_engraver
, note
);
58 Drum_notes_engraver::listen_note (Stream_event
*ev
)
60 events_
.push_back (ev
);
64 Drum_notes_engraver::process_music ()
67 for (vsize i
= 0; i
< events_
.size (); i
++)
70 tab
= get_property ("drumStyleTable");
72 Stream_event
*ev
= events_
[i
];
73 Item
*note
= make_item ("NoteHead", ev
->self_scm ());
75 SCM drum_type
= ev
->get_property ("drum-type");
79 if (scm_hash_table_p (tab
) == SCM_BOOL_T
)
80 defn
= scm_hashq_ref (tab
, drum_type
, SCM_EOL
);
82 if (scm_is_pair (defn
))
84 SCM pos
= scm_caddr (defn
);
85 SCM style
= scm_car (defn
);
86 SCM script
= scm_cadr (defn
);
88 if (scm_integer_p (pos
) == SCM_BOOL_T
)
89 note
->set_property ("staff-position", pos
);
90 if (scm_is_symbol (style
))
91 note
->set_property ("style", style
);
93 if (scm_is_string (script
))
95 Item
*p
= make_item ("Script", ev
->self_scm ());
96 make_script_from_event (p
, context (), script
,
99 p
->set_parent (note
, Y_AXIS
);
100 Side_position_interface::add_support (p
, note
);
101 scripts_
.push_back (p
);
108 Drum_notes_engraver::acknowledge_stem (Grob_info inf
)
110 for (vsize i
= 0; i
< scripts_
.size (); i
++)
112 Grob
*e
= scripts_
[i
];
114 if (to_dir (e
->get_property ("side-relative-direction")))
115 e
->set_object ("direction-source", inf
.grob ()->self_scm ());
117 Side_position_interface::add_support (e
, inf
.grob ());
122 Drum_notes_engraver::acknowledge_note_column (Grob_info inf
)
124 for (vsize i
= 0; i
< scripts_
.size (); i
++)
126 Grob
*e
= scripts_
[i
];
128 if (!e
->get_parent (X_AXIS
)
129 && Side_position_interface::get_axis (e
) == Y_AXIS
)
130 e
->set_parent (inf
.grob (), X_AXIS
);
135 Drum_notes_engraver::stop_translation_timestep ()
141 ADD_ACKNOWLEDGER (Drum_notes_engraver
, stem
);
142 ADD_ACKNOWLEDGER (Drum_notes_engraver
, note_column
);
144 ADD_TRANSLATOR (Drum_notes_engraver
,
146 "Generate drum note heads.",