2 This file is part of LilyPond, the GNU music typesetter.
4 Copyright (C) 1998--2010 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"
29 #include "stream-event.hh"
30 #include "text-interface.hh"
32 #include "translator.icc"
34 class Metronome_mark_engraver : public Engraver
37 TRANSLATOR_DECLARATIONS (Metronome_mark_engraver);
48 DECLARE_ACKNOWLEDGER (break_aligned);
49 DECLARE_ACKNOWLEDGER (grob);
52 virtual void derived_mark () const;
53 void stop_translation_timestep ();
54 void process_music ();
57 Metronome_mark_engraver::Metronome_mark_engraver ()
62 last_duration_ = SCM_EOL;
63 last_count_ = SCM_EOL;
68 Metronome_mark_engraver::derived_mark () const
70 scm_gc_mark (last_count_);
71 scm_gc_mark (last_duration_);
72 scm_gc_mark (last_text_);
76 Metronome_mark_engraver::acknowledge_break_aligned (Grob_info info)
78 Grob *g = info.grob ();
81 && g->get_property_data ("break-align-symbol")
82 == ly_symbol2scm ("staff-bar"))
86 && scm_member (g->get_property_data ("break-align-symbol"),
87 text_->get_property_data ("break-align-symbols"))
91 text_->set_parent (g, X_AXIS);
96 grob_name_scm (Grob *g)
98 SCM name_pair = scm_assq (ly_symbol2scm ("name"), g->get_property ("meta"));
99 return scm_is_pair (name_pair) ? scm_cdr (name_pair) : SCM_EOL;
103 Metronome_mark_engraver::acknowledge_grob (Grob_info info)
105 Grob *g = info.grob ();
108 && scm_member (grob_name_scm (g),
109 text_->get_property_data ("non-break-align-symbols"))
111 text_->set_parent (g, X_AXIS);
115 Metronome_mark_engraver::stop_translation_timestep ()
119 if (text_->get_parent (X_AXIS)
120 && text_->get_parent (X_AXIS)->internal_has_interface (ly_symbol2scm ("multi-measure-rest-interface"))
122 text_->set_parent (bar_, X_AXIS);
126 Gardner Read "Music Notation", p.278
128 Align the metronome mark over the time signature (or the
129 first notational element of the measure if no time
130 signature is present in that measure).
132 if (Grob *mc = unsmob_grob (get_property ("currentMusicalColumn")))
133 text_->set_parent (mc, X_AXIS);
134 else if (Grob *cc = unsmob_grob (get_property ("currentCommandColumn")))
135 text_->set_parent (cc, X_AXIS);
137 text_->set_object ("side-support-elements",
138 grob_list_to_grob_array (get_property ("stavesFound")));
146 Metronome_mark_engraver::process_music ()
148 SCM count = get_property ("tempoUnitCount");
149 SCM duration = get_property ("tempoUnitDuration");
150 SCM text = get_property ("tempoText");
152 if ( ( (unsmob_duration (duration) && scm_is_number (count))
153 || Text_interface::is_markup (text) )
154 && !(ly_is_equal (count, last_count_)
155 && ly_is_equal (duration, last_duration_)
156 && ly_is_equal (text, last_text_)))
158 text_ = make_item ("MetronomeMark", SCM_EOL);
160 SCM proc = get_property ("metronomeMarkFormatter");
161 SCM result = scm_call_4 (proc,
165 context ()->self_scm ());
167 text_->set_property ("text", result);
170 last_duration_ = duration;
177 ADD_ACKNOWLEDGER (Metronome_mark_engraver, break_aligned);
178 ADD_ACKNOWLEDGER (Metronome_mark_engraver, grob);
180 ADD_TRANSLATOR (Metronome_mark_engraver,
182 "Engrave metronome marking. This delegates the formatting"
183 " work to the function in the @code{metronomeMarkFormatter}"
184 " property. The mark is put over all staves. The staves are"
185 " taken from the @code{stavesFound} property, which is"
186 " maintained by @ref{Staff_collecting_engraver}.",
193 "metronomeMarkFormatter "