2 trill-spanner-engraver.cc -- implement Trill_spanner_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 2000--2005 Jan Nieuwenhuizen <janneke@gnu.org>
10 C&P from text-spanner.cc
12 - todo: ending should be detected automatically? a new note
13 automatically is the end of the trill?
16 #include "note-column.hh"
17 #include "side-position-interface.hh"
18 #include "engraver.hh"
20 #include "translator.icc"
22 class Trill_spanner_engraver
: public Engraver
25 TRANSLATOR_DECLARATIONS (Trill_spanner_engraver
);
27 virtual void finalize ();
28 DECLARE_ACKNOWLEDGER (note_column
);
29 virtual bool try_music (Music
*);
30 void stop_translation_timestep ();
31 void process_music ();
36 Music
*current_event_
;
37 Drul_array
<Music
*> event_drul_
;
41 Trill_spanner_engraver::Trill_spanner_engraver ()
46 event_drul_
[START
] = 0;
47 event_drul_
[STOP
] = 0;
51 Trill_spanner_engraver::try_music (Music
*m
)
53 if (m
->is_mus_type ("trill-span-event"))
55 Direction d
= to_dir (m
->get_property ("span-direction"));
64 Trill_spanner_engraver::process_music ()
66 if (event_drul_
[STOP
])
69 event_drul_
[STOP
]->origin ()->warning (_ ("can't find start of trill spanner"));
78 if (event_drul_
[START
])
81 event_drul_
[START
]->origin ()->warning (_ ("already have a trill spanner"));
84 current_event_
= event_drul_
[START
];
85 span_
= make_spanner ("TrillSpanner", event_drul_
[START
]->self_scm ());
86 Side_position_interface::set_axis (span_
, Y_AXIS
);
87 event_drul_
[START
] = 0;
93 Trill_spanner_engraver::acknowledge_note_column (Grob_info info
)
95 Spanner
*spans
[2] ={span_
, finished_
};
96 for (int i
= 0; i
< 2; i
++)
100 Side_position_interface::add_support (spans
[i
], info
.grob ());
101 add_bound_item (spans
[i
], dynamic_cast<Item
*> (info
.grob ()));
107 Trill_spanner_engraver::typeset_all ()
111 if (!finished_
->get_bound (RIGHT
))
113 Grob
*e
= unsmob_grob (get_property ("currentMusicalColumn"));
114 finished_
->set_bound (RIGHT
, e
);
121 Trill_spanner_engraver::stop_translation_timestep ()
123 if (span_
&& !span_
->get_bound (LEFT
))
125 Grob
*e
= unsmob_grob (get_property ("currentMusicalColumn"));
126 span_
->set_bound (LEFT
, e
);
130 event_drul_
[START
] = 0;
131 event_drul_
[STOP
] = 0;
135 Trill_spanner_engraver::finalize ()
140 current_event_
->origin ()->warning (_ ("unterminated trill spanner"));
145 ADD_ACKNOWLEDGER (Trill_spanner_engraver
, note_column
);
146 ADD_TRANSLATOR (Trill_spanner_engraver
,
147 /* doc */ "Create trill spanner from a Music.",
148 /* create */ "TrillSpanner",
149 /* accept */ "trill-span-event",