2 shape-note-heads-engraver.cc -- part of GNU LilyPond
4 (c) 1997--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
9 #include "rhythmic-head.hh"
10 #include "output-def.hh"
12 #include "dot-column.hh"
13 #include "staff-symbol-referencer.hh"
15 #include "engraver.hh"
18 class Shape_note_heads_engraver : public Engraver
20 Link_array<Item> notes_;
21 Link_array<Item> dots_;
22 Link_array<Music> note_evs_;
25 TRANSLATOR_DECLARATIONS (Shape_note_heads_engraver);
28 virtual bool try_music (Music *ev) ;
29 virtual void process_music ();
30 virtual void stop_translation_timestep ();
33 Shape_note_heads_engraver::Shape_note_heads_engraver ()
38 Shape_note_heads_engraver::try_music (Music *m)
40 if (m->is_mus_type ("note-event"))
45 else if (m->is_mus_type ("busy-playing-event"))
46 return note_evs_.size ();
53 Shape_note_heads_engraver::process_music ()
55 if (!note_evs_.size())
58 for (int i=0; i < note_evs_.size (); i++)
61 Music * ev = note_evs_[i];
62 Item *note = make_item ("NoteHead", ev->self_scm ());
64 Duration dur = *unsmob_duration (ev->get_property ("duration"));
66 note->set_property ("duration-log", scm_int2num (dur.duration_log ()));
69 Item * d = make_item ("Dots", note->self_scm ());
70 Rhythmic_head::set_dots (note, d);
73 != robust_scm2int (d->get_property ("dot-count"), 0))
74 d->set_property ("dot-count", scm_int2num (dur.dot_count ()));
76 d->set_parent (note, Y_AXIS);
81 Pitch *pit = unsmob_pitch (ev->get_property ("pitch"));
83 SCM scm_tonic = get_property ("tonic");
85 if (unsmob_pitch (scm_tonic))
86 tonic = *unsmob_pitch (scm_tonic);
88 unsigned int delta = (pit->get_notename() - tonic.get_notename() + 7) % 7;
89 SCM shape_vector = get_property ("shapeNoteStyles");
92 if (ly_c_vector_p (shape_vector)
93 && SCM_VECTOR_LENGTH (shape_vector) > delta
94 && scm_is_symbol (scm_vector_ref (shape_vector, scm_from_int (delta))))
96 style = scm_vector_ref (shape_vector, scm_from_int (delta));
98 if (scm_is_symbol (style))
100 note->set_property ("style", style);
103 int pos = pit ? pit->steps () : 0;
104 SCM c0 = get_property ("middleCPosition");
105 if (scm_is_number (c0))
106 pos += scm_to_int (c0);
108 note->set_property ("staff-position", scm_int2num (pos));
119 Shape_note_heads_engraver::stop_translation_timestep ()
128 ENTER_DESCRIPTION (Shape_note_heads_engraver,
129 /* descr */ "Generate noteheads.",
130 /* creats*/ "NoteHead Dots",
131 /* accepts */ "note-event busy-playing-event",
133 /* reads */ "middleCPosition shapeNoteStyles",