2 This file is part of LilyPond, the GNU music typesetter.
4 Copyright (C) 1998--2015 Jan Nieuwenhuizen <janneke@gnu.org>
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/>.
23 #include "engraver.hh"
26 #include "duration.hh"
27 #include "grob-array.hh"
30 #include "stream-event.hh"
31 #include "text-interface.hh"
33 #include "translator.icc"
35 class Metronome_mark_engraver : public Engraver
40 Stream_event *tempo_ev_;
43 TRANSLATOR_DECLARATIONS (Metronome_mark_engraver);
46 void stop_translation_timestep ();
47 void process_music ();
49 DECLARE_ACKNOWLEDGER (break_aligned);
50 DECLARE_ACKNOWLEDGER (break_alignment);
51 DECLARE_ACKNOWLEDGER (grob);
53 DECLARE_TRANSLATOR_LISTENER (tempo_change);
56 Metronome_mark_engraver::Metronome_mark_engraver ()
64 IMPLEMENT_TRANSLATOR_LISTENER (Metronome_mark_engraver, tempo_change);
66 Metronome_mark_engraver::listen_tempo_change (Stream_event *ev)
68 ASSIGN_EVENT_ONCE (tempo_ev_, ev);
72 safe_is_member (SCM scm, SCM lst)
74 return scm_list_p (lst) == SCM_BOOL_T
75 && scm_member (scm, lst) != SCM_BOOL_F;
79 Metronome_mark_engraver::acknowledge_break_aligned (Grob_info info)
81 Grob *g = info.grob ();
84 && g->get_property ("break-align-symbol")
85 == ly_symbol2scm ("staff-bar"))
89 && safe_is_member (g->get_property ("break-align-symbol"),
90 text_->get_property ("break-align-symbols"))
91 && Item::break_visible (g))
94 text_->set_parent (g, X_AXIS);
97 text_->set_property ("non-musical", SCM_BOOL_T);
101 Metronome_mark_engraver::acknowledge_break_alignment (Grob_info info)
103 Grob *g = info.grob ();
107 && dynamic_cast<Item *> (g))
108 text_->set_parent (g, X_AXIS);
112 Metronome_mark_engraver::acknowledge_grob (Grob_info info)
114 Grob *g = info.grob ();
117 for (SCM s = text_->get_property ("non-break-align-symbols");
120 if (g->internal_has_interface (scm_car (s)))
121 text_->set_parent (g, X_AXIS);
125 Metronome_mark_engraver::stop_translation_timestep ()
129 if (text_->get_parent (X_AXIS)
130 && text_->get_parent (X_AXIS)->internal_has_interface (ly_symbol2scm ("multi-measure-rest-interface"))
132 text_->set_parent (bar_, X_AXIS);
136 Gardner Read "Music Notation", p.278
138 Align the metronome mark over the time signature (or the
139 first notational element of the measure if no time
140 signature is present in that measure).
142 if (Grob *mc = Grob::unsmob (get_property ("currentMusicalColumn")))
143 text_->set_parent (mc, X_AXIS);
144 else if (Grob *cc = Grob::unsmob (get_property ("currentCommandColumn")))
145 text_->set_parent (cc, X_AXIS);
147 text_->set_object ("side-support-elements",
148 grob_list_to_grob_array (get_property ("stavesFound")));
157 Metronome_mark_engraver::process_music ()
161 text_ = make_item ("MetronomeMark", tempo_ev_->self_scm ());
163 SCM proc = get_property ("metronomeMarkFormatter");
164 SCM result = scm_call_2 (proc,
165 tempo_ev_->self_scm (),
166 context ()->self_scm ());
168 text_->set_property ("text", result);
172 ADD_ACKNOWLEDGER (Metronome_mark_engraver, break_aligned);
173 ADD_ACKNOWLEDGER (Metronome_mark_engraver, break_alignment);
174 ADD_ACKNOWLEDGER (Metronome_mark_engraver, grob);
176 ADD_TRANSLATOR (Metronome_mark_engraver,
178 "Engrave metronome marking. This delegates the formatting"
179 " work to the function in the @code{metronomeMarkFormatter}"
180 " property. The mark is put over all staves. The staves are"
181 " taken from the @code{stavesFound} property, which is"
182 " maintained by @ref{Staff_collecting_engraver}.",
188 "currentCommandColumn "
189 "currentMusicalColumn "
190 "metronomeMarkFormatter "