]> git.donarmstrong.com Git - lilypond.git/blob - lily/metronome-engraver.cc
Merge commit 'csorensen/fret-diagram-details'
[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 #include "text-interface.hh"
20
21 #include "translator.icc"
22
23 /**
24    put stuff over or next to  bars.  Examples: bar numbers, marginal notes,
25    rehearsal marks.
26 */
27 class Metronome_mark_engraver : public Engraver
28 {
29 public:
30   TRANSLATOR_DECLARATIONS (Metronome_mark_engraver);
31 protected:
32   Item *text_;
33   Grob *bar_line_;
34
35   SCM last_duration_;
36   SCM last_count_;
37   SCM last_text_;
38   
39 protected:
40   virtual void derived_mark () const;
41   void stop_translation_timestep ();
42   void process_music ();
43 };
44
45 Metronome_mark_engraver::Metronome_mark_engraver ()
46 {
47   text_ = 0;
48   last_duration_ = SCM_EOL;
49   last_count_ = SCM_EOL;
50 }
51
52 void
53 Metronome_mark_engraver::derived_mark () const
54 {
55   scm_gc_mark (last_count_);
56   scm_gc_mark (last_duration_);
57   scm_gc_mark (last_text_);
58 }
59
60 void
61 Metronome_mark_engraver::stop_translation_timestep ()
62 {
63   if (text_)
64     {
65       Grob *mc = unsmob_grob (get_property ("currentMusicalColumn"));
66       text_->set_parent (mc, X_AXIS);
67       text_->set_object ("side-support-elements",
68                          grob_list_to_grob_array (get_property ("stavesFound")));
69       text_ = 0;
70     }
71 }
72
73 void
74 Metronome_mark_engraver::process_music ()
75 {
76   SCM count = get_property ("tempoUnitCount");
77   SCM duration = get_property ("tempoUnitDuration");
78   SCM text = get_property ("tempoText");
79
80   if ( ( (unsmob_duration (duration) && scm_is_number (count))
81         || Text_interface::is_markup (text) )
82       && !(ly_is_equal (count, last_count_)
83            && ly_is_equal (duration, last_duration_)
84            && ly_is_equal (text, last_text_)))
85     {
86       text_ = make_item ("MetronomeMark", SCM_EOL);
87
88       SCM proc = get_property ("metronomeMarkFormatter");
89       SCM result = scm_call_4 (proc,
90                                text,
91                                duration,
92                                count,
93                                context ()->self_scm ());
94
95       text_->set_property ("text", result);
96     }
97
98   last_duration_ = duration;
99   last_count_ = count;
100   last_text_ = text;
101 }
102
103 ADD_TRANSLATOR (Metronome_mark_engraver,
104                 /* doc */
105                 "Engrave metronome marking.  This delegates the formatting"
106                 " work to the function in the @code{metronomeMarkFormatter}"
107                 " property.  The mark is put over all staves.  The staves are"
108                 " taken from the @code{stavesFound} property, which is"
109                 " maintained by @ref{Staff_collecting_engraver}.",
110
111                 /* create */
112                 "MetronomeMark ",
113
114                 /* read */
115                 "stavesFound "
116                 "metronomeMarkFormatter "
117                 "tempoUnitDuration "
118                 "tempoUnitCount "
119                 "tempoText "
120                 "tempoHideNote ",
121
122                 /* write */
123                 ""
124                 );