2 This file is part of LilyPond, the GNU music typesetter.
4 Copyright (C) 1998--2011 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
38 TRANSLATOR_DECLARATIONS (Metronome_mark_engraver);
49 DECLARE_ACKNOWLEDGER (break_aligned);
50 DECLARE_ACKNOWLEDGER (break_alignment);
51 DECLARE_ACKNOWLEDGER (grob);
54 virtual void derived_mark () const;
55 void stop_translation_timestep ();
56 void process_music ();
59 Metronome_mark_engraver::Metronome_mark_engraver ()
64 last_duration_ = SCM_EOL;
65 last_count_ = SCM_EOL;
70 Metronome_mark_engraver::derived_mark () const
72 scm_gc_mark (last_count_);
73 scm_gc_mark (last_duration_);
74 scm_gc_mark (last_text_);
78 safe_is_member (SCM scm, SCM lst)
80 return scm_list_p (lst) == SCM_BOOL_T
81 && scm_member (scm, lst) != SCM_BOOL_F;
85 Metronome_mark_engraver::acknowledge_break_aligned (Grob_info info)
87 Grob *g = info.grob ();
90 && g->get_property ("break-align-symbol")
91 == ly_symbol2scm ("staff-bar"))
95 && safe_is_member (g->get_property ("break-align-symbol"),
96 text_->get_property ("break-align-symbols"))
97 && Item::break_visible (g))
100 text_->set_parent (g, X_AXIS);
105 Metronome_mark_engraver::acknowledge_break_alignment (Grob_info info)
107 Grob *g = info.grob ();
111 && dynamic_cast<Item *> (g))
112 text_->set_parent (g, X_AXIS);
116 Metronome_mark_engraver::acknowledge_grob (Grob_info info)
118 Grob *g = info.grob ();
121 for (SCM s = text_->get_property ("non-break-align-symbols");
124 if (g->internal_has_interface (scm_car (s)))
125 text_->set_parent (g, X_AXIS);
129 Metronome_mark_engraver::stop_translation_timestep ()
133 if (text_->get_parent (X_AXIS)
134 && text_->get_parent (X_AXIS)->internal_has_interface (ly_symbol2scm ("multi-measure-rest-interface"))
136 text_->set_parent (bar_, X_AXIS);
140 Gardner Read "Music Notation", p.278
142 Align the metronome mark over the time signature (or the
143 first notational element of the measure if no time
144 signature is present in that measure).
146 if (Grob *mc = unsmob_grob (get_property ("currentMusicalColumn")))
147 text_->set_parent (mc, X_AXIS);
148 else if (Grob *cc = unsmob_grob (get_property ("currentCommandColumn")))
149 text_->set_parent (cc, X_AXIS);
151 text_->set_object ("side-support-elements",
152 grob_list_to_grob_array (get_property ("stavesFound")));
160 Metronome_mark_engraver::process_music ()
162 SCM count = get_property ("tempoUnitCount");
163 SCM duration = get_property ("tempoUnitDuration");
164 SCM text = get_property ("tempoText");
166 if ( ( (unsmob_duration (duration) && scm_is_true (count))
167 || Text_interface::is_markup (text) )
168 && !(ly_is_equal (count, last_count_)
169 && ly_is_equal (duration, last_duration_)
170 && ly_is_equal (text, last_text_)))
172 text_ = make_item ("MetronomeMark", SCM_EOL);
174 SCM proc = get_property ("metronomeMarkFormatter");
175 SCM result = scm_call_4 (proc,
179 context ()->self_scm ());
181 text_->set_property ("text", result);
184 last_duration_ = duration;
191 ADD_ACKNOWLEDGER (Metronome_mark_engraver, break_aligned);
192 ADD_ACKNOWLEDGER (Metronome_mark_engraver, break_alignment);
193 ADD_ACKNOWLEDGER (Metronome_mark_engraver, grob);
195 ADD_TRANSLATOR (Metronome_mark_engraver,
197 "Engrave metronome marking. This delegates the formatting"
198 " work to the function in the @code{metronomeMarkFormatter}"
199 " property. The mark is put over all staves. The staves are"
200 " taken from the @code{stavesFound} property, which is"
201 " maintained by @ref{Staff_collecting_engraver}.",
208 "metronomeMarkFormatter "