2 lyric-phrasing-engraver.hh -- declare Lyric_phrasing_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 2000 Glen Prideaux <glenprideaux@iname.com>
10 #ifndef LYRIC_PHRASING_ENGRAVER_HH
11 #define LYRIC_PHRASING_ENGRAVER_HH
13 #include "lily-proto.hh"
14 #include "engraver.hh"
22 Align lyrics with noteheads, left aligning beginning of phrases,
23 right aligning end of phrases, centering others under their notes.
27 * Build an engraver that catches noteheads and lyrics.
29 (It needs to be in a context above Staff and Lyrics, eg. in Score
32 * Determine which heads belong to which lyrics
34 (eg. by looking at the names of their originating contexts, or maybe
37 * Attach the lyrics to the appropriate heads
39 (by doing lyric->set_parent (head, X_AXIS), that will fix the current
40 noteheadwidth guessing kludge)
42 * Check if the lyric syllables end or start a phrase.
44 (eg. check if the syllable ends with punctuation, and remember that
45 fact for the next one.)
47 * Adjust their alignment accordingly.
49 (eg. by doing lyric->add_offset_callback (centered_on_parent,X_AXIS)
50 and setting self-alignment-X)
52 * Add a property to switch on/off the engraver (for multi stanza
53 vs. single stanza music)
55 Maybe this engraver could also take care of correct lyric alignment
62 class Lyric_phrasing_engraver : public Engraver
65 virtual void acknowledge_grob (Grob_info);
66 virtual void create_grobs ();
67 virtual void stop_translation_timestep ();
68 virtual void finalize ();
70 void record_notehead (const String &context_id, Grob * notehead);
71 void record_lyric (const String &context_id, Grob * lyric);
72 void record_melisma (const String &context_id);
73 void record_extender (const String &context_id, Grob * extender);
74 Syllable_group * lookup_context_id (const String &context_id);
78 ~Lyric_phrasing_engraver ();
79 TRANSLATOR_DECLARATIONS( Lyric_phrasing_engraver);
82 /** association list of Syllable_group smobs
84 Protected_scm voice_alist_;
85 Grob * any_notehead_l_;
91 bool first_in_phrase_b_;
93 Link_array<Grob> lyric_list_;
94 Grob * longest_lyric_l_;
95 Grob * shortest_lyric_l_;
98 Real group_translation_f_;
100 static SCM make_entry ();
101 void set_first_in_phrase (bool f);
102 void set_notehead (Grob * notehead);
103 void add_lyric (Grob * lyric);
104 void add_extender (Grob * extender);
105 void set_melisma () { melisma_b_ = true; }
106 bool get_melisma () { return melisma_b_; }
107 int lyric_count () { return lyric_list_.size (); }
110 bool set_lyric_align (const char *punc, Grob *default_notehead_l);
111 void adjust_melisma_align ();
112 int appropriate_alignment (const char *punc);
113 Real amount_to_translate ();
115 void copy (Syllable_group *);
118 DECLARE_SIMPLE_SMOBS (Syllable_group,);
121 DECLARE_UNSMOB(Syllable_group,voice_entry);
124 #endif // LYRIC_PHRASING_ENGRAVER_HH