]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/metronome-engraver.cc
Break-alignable metronome marks: remove hardcoding of time signature.
[lilypond.git] / lily / metronome-engraver.cc
index 6191407a5a11b03899e9f7fd695f8395dd610e71..a37a9475fb34e5329eb7e109d8ecaf0c13e760d1 100644 (file)
@@ -1,9 +1,20 @@
 /*
-  metronome-engraver.cc -- implement Metronome_mark_engraver
+  This file is part of LilyPond, the GNU music typesetter.
 
-  source file of the GNU LilyPond music typesetter
+  Copyright (C) 1998--2010 Jan Nieuwenhuizen <janneke@gnu.org>
 
-  (c) 1998--2008 Jan Nieuwenhuizen <janneke@gnu.org>
+  LilyPond is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
+
+  LilyPond is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include <cctype>
@@ -24,13 +35,16 @@ class Metronome_mark_engraver : public Engraver
 {
 public:
   TRANSLATOR_DECLARATIONS (Metronome_mark_engraver);
+
 protected:
   Item *text_;
-  Grob *bar_line_;
+  Grob *support_;
 
   SCM last_duration_;
   SCM last_count_;
   SCM last_text_;
+
+  DECLARE_ACKNOWLEDGER (break_aligned);
   
 protected:
   virtual void derived_mark () const;
@@ -41,6 +55,7 @@ protected:
 Metronome_mark_engraver::Metronome_mark_engraver ()
 {
   text_ = 0;
+  support_ = 0;
   last_duration_ = SCM_EOL;
   last_count_ = SCM_EOL;
   last_text_ = SCM_EOL;
@@ -54,16 +69,39 @@ Metronome_mark_engraver::derived_mark () const
   scm_gc_mark (last_text_);
 }
 
+void
+Metronome_mark_engraver::acknowledge_break_aligned (Grob_info inf)
+{
+  Grob *s = inf.grob ();
+  if (text_
+      && (s->get_property_data ("break-align-symbol")
+         == text_->get_property_data ("break-align-symbol")))
+    {
+      support_ = s;
+    }
+}
+
 void
 Metronome_mark_engraver::stop_translation_timestep ()
 {
   if (text_)
     {
-      Grob *mc = unsmob_grob (get_property ("currentMusicalColumn"));
-      text_->set_parent (mc, X_AXIS);
+      if (!support_)
+       {
+         /*
+           Gardner Read "Music Notation", p.278
+
+           Align the metronome mark over the time signature (or the
+           first notational element of the measure if no time
+           signature is present in that measure).
+         */
+         Grob *mc = unsmob_grob (get_property ("currentMusicalColumn"));
+         text_->set_parent (mc, X_AXIS);
+       }
       text_->set_object ("side-support-elements",
                         grob_list_to_grob_array (get_property ("stavesFound")));
       text_ = 0;
+      support_ = 0;
     }
 }
 
@@ -97,6 +135,10 @@ Metronome_mark_engraver::process_music ()
   last_text_ = text;
 }
 
+
+
+ADD_ACKNOWLEDGER (Metronome_mark_engraver, break_aligned);
+
 ADD_TRANSLATOR (Metronome_mark_engraver,
                /* doc */
                "Engrave metronome marking.  This delegates the formatting"