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 ly_is_list (lst) && scm_is_true (scm_member (scm, lst));
78 Metronome_mark_engraver::acknowledge_break_aligned (Grob_info info)
80 Grob *g = info.grob ();
83 && scm_is_eq (g->get_property ("break-align-symbol"),
84 ly_symbol2scm ("staff-bar")))
88 && safe_is_member (g->get_property ("break-align-symbol"),
89 text_->get_property ("break-align-symbols"))
90 && Item::break_visible (g))
93 text_->set_parent (g, X_AXIS);
96 text_->set_property ("non-musical", SCM_BOOL_T);
100 Metronome_mark_engraver::acknowledge_break_alignment (Grob_info info)
102 Grob *g = info.grob ();
106 && dynamic_cast<Item *> (g))
107 text_->set_parent (g, X_AXIS);
111 Metronome_mark_engraver::acknowledge_grob (Grob_info info)
113 Grob *g = info.grob ();
116 for (SCM s = text_->get_property ("non-break-align-symbols");
119 if (g->internal_has_interface (scm_car (s)))
120 text_->set_parent (g, X_AXIS);
124 Metronome_mark_engraver::stop_translation_timestep ()
128 if (text_->get_parent (X_AXIS)
129 && text_->get_parent (X_AXIS)->internal_has_interface (ly_symbol2scm ("multi-measure-rest-interface"))
131 text_->set_parent (bar_, X_AXIS);
135 Gardner Read "Music Notation", p.278
137 Align the metronome mark over the time signature (or the
138 first notational element of the measure if no time
139 signature is present in that measure).
141 if (Grob *mc = Grob::unsmob (get_property ("currentMusicalColumn")))
142 text_->set_parent (mc, X_AXIS);
143 else if (Grob *cc = Grob::unsmob (get_property ("currentCommandColumn")))
144 text_->set_parent (cc, X_AXIS);
146 text_->set_object ("side-support-elements",
147 grob_list_to_grob_array (get_property ("stavesFound")));
156 Metronome_mark_engraver::process_music ()
160 text_ = make_item ("MetronomeMark", tempo_ev_->self_scm ());
162 SCM proc = get_property ("metronomeMarkFormatter");
163 SCM result = scm_call_2 (proc,
164 tempo_ev_->self_scm (),
165 context ()->self_scm ());
167 text_->set_property ("text", result);
171 ADD_ACKNOWLEDGER (Metronome_mark_engraver, break_aligned);
172 ADD_ACKNOWLEDGER (Metronome_mark_engraver, break_alignment);
173 ADD_ACKNOWLEDGER (Metronome_mark_engraver, grob);
175 ADD_TRANSLATOR (Metronome_mark_engraver,
177 "Engrave metronome marking. This delegates the formatting"
178 " work to the function in the @code{metronomeMarkFormatter}"
179 " property. The mark is put over all staves. The staves are"
180 " taken from the @code{stavesFound} property, which is"
181 " maintained by @ref{Staff_collecting_engraver}.",
187 "currentCommandColumn "
188 "currentMusicalColumn "
189 "metronomeMarkFormatter "