]> git.donarmstrong.com Git - lilypond.git/blob - lily/metronome-engraver.cc
Merge branch 'master' of git+ssh://jneem@git.sv.gnu.org/srv/git/lilypond
[lilypond.git] / lily / metronome-engraver.cc
1 /*
2   mark-engraver.cc -- implement Metronome_mark_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1998--2007 Jan Nieuwenhuizen <janneke@gnu.org>
7 */
8
9 #include <cctype>
10 using namespace std;
11
12 #include "engraver.hh"
13
14 #include "context.hh"
15 #include "duration.hh"
16 #include "grob-array.hh"
17 #include "item.hh"
18 #include "stream-event.hh"
19
20 #include "translator.icc"
21
22 /**
23    put stuff over or next to  bars.  Examples: bar numbers, marginal notes,
24    rehearsal marks.
25 */
26 class Metronome_mark_engraver : public Engraver
27 {
28 public:
29   TRANSLATOR_DECLARATIONS (Metronome_mark_engraver);
30 protected:
31   Item *text_;
32   Grob *bar_line_;
33
34   SCM last_duration_;
35   SCM last_count_;
36   
37 protected:
38   virtual void derived_mark () const;
39   void stop_translation_timestep ();
40   void process_music ();
41 };
42
43 Metronome_mark_engraver::Metronome_mark_engraver ()
44 {
45   text_ = 0;
46   last_duration_ = SCM_EOL;
47   last_count_ = SCM_EOL;
48 }
49
50 void
51 Metronome_mark_engraver::derived_mark () const
52 {
53   scm_gc_mark (last_count_);
54   scm_gc_mark (last_duration_);
55 }
56
57 void
58 Metronome_mark_engraver::stop_translation_timestep ()
59 {
60   if (text_)
61     {
62       Grob *mc = unsmob_grob (get_property ("currentMusicalColumn"));
63       text_->set_parent (mc, X_AXIS);
64       text_ = 0;
65     }
66 }
67
68 void
69 Metronome_mark_engraver::process_music ()
70 {
71   SCM count = get_property ("tempoUnitCount");
72   SCM duration = get_property ("tempoUnitDuration");
73   
74   if (unsmob_duration (duration)
75       && scm_is_number (count)
76       && !(ly_is_equal (count, last_count_)
77            && ly_is_equal (duration, last_duration_)))
78     {
79       text_ = make_item ("MetronomeMark", SCM_EOL);
80
81       SCM proc = get_property ("metronomeMarkFormatter");
82       SCM result = scm_call_3 (proc,
83                                duration,
84                                count,
85                                context ()->self_scm ());
86
87       text_->set_property ("text", result);
88     }
89
90   last_duration_ = duration;
91   last_count_ = count;
92 }
93
94 ADD_TRANSLATOR (Metronome_mark_engraver,
95                 /* doc */ "Engrave metro nome marking. This delegates the formatting work "
96                 "to the function in the metronomeMarkFormatter property. "
97                 "The mark is put over all staves. "
98                 "The staves are taken from the @code{stavesFound} property, "
99                 "which is maintained by @code{@ref{Staff_collecting_engraver}}. ",
100                 /* create */ "MetronomeMark",
101
102                 /* read */
103                 "stavesFound "
104                 "metronomeMarkFormatter "
105                 "tempoUnitDuration "
106                 "tempoUnitCount "
107                 ,
108
109                 /* write */ "");