4 (c) 1997--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
8 #include "rhythmic-head.hh"
11 #include "engraver.hh"
13 #include "side-position-interface.hh"
16 #include "note-column.hh"
18 class Drum_notes_engraver
: public Engraver
20 Link_array
<Item
> notes_
;
21 Link_array
<Item
> dots_
;
22 Link_array
<Item
> scripts_
;
23 Link_array
<Music
> events_
;
26 TRANSLATOR_DECLARATIONS (Drum_notes_engraver
);
29 virtual bool try_music (Music
*ev
) ;
30 virtual void process_music ();
31 virtual void acknowledge_grob (Grob_info
);
32 virtual void stop_translation_timestep ();
35 Drum_notes_engraver::Drum_notes_engraver ()
40 Drum_notes_engraver::try_music (Music
*m
)
42 if (m
->is_mus_type ("note-event"))
47 else if (m
->is_mus_type ("busy-playing-event"))
48 return events_
.size ();
49 else if (m
->is_mus_type ("start-playing-event"))
50 return events_
.size ();
57 Drum_notes_engraver::process_music ()
60 for (int i
=0; i
< events_
.size (); i
++)
63 tab
= get_property ("drumStyleTable");
65 Item
*note
= make_item ("NoteHead");
66 Music
* ev
= events_
[i
];
68 Duration dur
= *unsmob_duration (ev
->get_property ("duration"));
70 note
->set_property ("duration-log", scm_int2num (dur
.duration_log ()));
74 Item
* d
= make_item ("Dots");
75 Rhythmic_head::set_dots (note
, d
);
78 != robust_scm2int (d
->get_property ("dot-count"), 0))
79 d
->set_property ("dot-count", scm_int2num (dur
.dot_count ()));
81 d
->set_parent (note
, Y_AXIS
);
82 announce_grob (d
, SCM_EOL
);
86 SCM drum_type
= ev
->get_property ("drum-type");
90 if (scm_hash_table_p (tab
) == SCM_BOOL_T
)
91 defn
= scm_hashq_ref (tab
, drum_type
, SCM_EOL
);
95 SCM pos
= ly_caddr (defn
);
96 SCM style
=ly_car (defn
);
97 SCM script
= ly_cadr (defn
);
99 if (scm_integer_p (pos
) == SCM_BOOL_T
)
100 note
->set_property ("staff-position", pos
);
101 if (ly_symbol_p (style
))
102 note
->set_property ("style", style
);
104 if (ly_string_p (script
))
106 Item
*p
= make_item ("Script");
108 make_script_from_event (p
, &desc
,
109 daddy_context_
, script
,
112 if (p
->get_property ("follow-into-staff"))
113 p
->set_property ("staff-padding", SCM_EOL
);
115 announce_grob (p
, ev
->self_scm ());
117 p
->set_parent (note
, Y_AXIS
);
118 Side_position_interface::add_support (p
, note
);
125 announce_grob (note
,ev
->self_scm ());
131 Drum_notes_engraver::acknowledge_grob (Grob_info inf
)
133 if (Stem::has_interface (inf
.grob_
))
135 for (int i
=0; i
< scripts_
.size (); i
++)
137 Grob
*e
= scripts_
[i
];
139 if (to_dir (e
->get_property ("side-relative-direction")))
140 e
->set_property ("direction-source", inf
.grob_
->self_scm ());
145 e
->add_dependency (inf
.grob_
);
146 Side_position_interface::add_support (e
, inf
.grob_
);
149 else if (Note_column::has_interface (inf
.grob_
))
151 for (int i
=0; i
< scripts_
.size (); i
++)
153 Grob
*e
= scripts_
[i
];
155 if (!e
->get_parent (X_AXIS
) &&
156 Side_position_interface::get_axis (e
) == Y_AXIS
)
158 e
->set_parent (inf
.grob_
, X_AXIS
);
167 Drum_notes_engraver::stop_translation_timestep ()
169 for (int i
=0; i
< notes_
.size (); i
++)
171 typeset_grob (notes_
[i
]);
174 for (int i
=0; i
< dots_
.size (); i
++)
176 typeset_grob (dots_
[i
]);
179 for (int i
=0; i
< scripts_
.size (); i
++)
181 typeset_grob (scripts_
[i
]);
190 ENTER_DESCRIPTION (Drum_notes_engraver
,
191 /* descr */ "Generate noteheads.",
192 /* creats*/ "NoteHead Dots Script",
193 /* accepts */ "note-event busy-playing-event",
194 /* acks */ "stem-interface note-column-interface",
195 /* reads */ "drumStyleTable",