]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/chord-name-engraver.cc
Release: bump Welcome versions.
[lilypond.git] / lily / chord-name-engraver.cc
index 0ca322716fde1e8153034b99028feb95bd7d6257..3d989ccfb14de07ee33cf981f0e5e67ed338a3cb 100644 (file)
@@ -1,7 +1,7 @@
 /*
   This file is part of LilyPond, the GNU music typesetter.
 
-  Copyright (C) 1998--2014 Jan Nieuwenhuizen <janneke@gnu.org>
+  Copyright (C) 1998--2015 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
@@ -39,8 +39,8 @@ protected:
   void stop_translation_timestep ();
   void process_music ();
   virtual void finalize ();
-  DECLARE_TRANSLATOR_LISTENER (note);
-  DECLARE_TRANSLATOR_LISTENER (rest);
+  void listen_note (Stream_event *);
+  void listen_rest (Stream_event *);
 private:
   vector<Stream_event *> notes_;
 
@@ -52,7 +52,8 @@ Chord_name_engraver::finalize ()
 {
 }
 
-Chord_name_engraver::Chord_name_engraver ()
+Chord_name_engraver::Chord_name_engraver (Context *c)
+  : Engraver (c)
 {
   rest_event_ = 0;
 }
@@ -92,38 +93,32 @@ Chord_name_engraver::process_music ()
       markup = chord_name->get_property ("text");
       if (!Text_interface::is_markup (markup))
         {
-          Stream_event *inversion_event = 0;
           for (vsize i = 0; i < notes_.size (); i++)
             {
               Stream_event *n = notes_[i];
               SCM p = n->get_property ("pitch");
-              if (!unsmob_pitch (p))
+              if (!unsmob<Pitch> (p))
                 continue;
 
-              if (n->get_property ("inversion") == SCM_BOOL_T)
-                {
-                  inversion_event = n;
-                  inversion = p;
-                }
-              else if (n->get_property ("bass") == SCM_BOOL_T)
+              if (to_boolean (n->get_property ("bass")))
                 bass = p;
               else
-                pitches = scm_cons (p, pitches);
-            }
-
-          if (inversion_event)
-            {
-              SCM oct = inversion_event->get_property ("octavation");
-              if (scm_is_number (oct))
                 {
-                  Pitch *p = unsmob_pitch (inversion_event->get_property ("pitch"));
-                  int octavation = scm_to_int (oct);
-                  Pitch orig = p->transposed (Pitch (-octavation, 0, 0));
-
-                  pitches = scm_cons (orig.smobbed_copy (), pitches);
+                  SCM oct = n->get_property ("octavation");
+                  if (scm_is_number (oct))
+                    {
+                      Pitch orig = unsmob<Pitch> (p)->transposed (Pitch (-scm_to_int (oct), 0));
+                      pitches = scm_cons (orig.smobbed_copy (), pitches);
+                    }
+                  else
+                    pitches = scm_cons (p, pitches);
+                  if (to_boolean (n->get_property ("inversion")))
+                    {
+                      inversion = p;
+                      if (!scm_is_number (oct))
+                        programming_error ("inversion does not have original pitch");
+                    }
                 }
-              else
-                programming_error ("inversion does not have original pitch");
             }
 
           pitches = scm_sort_list (pitches, Pitch::less_p_proc);
@@ -149,14 +144,12 @@ Chord_name_engraver::process_music ()
   context ()->set_property ("lastChord", markup);
 }
 
-IMPLEMENT_TRANSLATOR_LISTENER (Chord_name_engraver, note);
 void
 Chord_name_engraver::listen_note (Stream_event *ev)
 {
   notes_.push_back (ev);
 }
 
-IMPLEMENT_TRANSLATOR_LISTENER (Chord_name_engraver, rest);
 void
 Chord_name_engraver::listen_rest (Stream_event *ev)
 {
@@ -174,6 +167,13 @@ Chord_name_engraver::stop_translation_timestep ()
   The READs description is not strictly accurate:
   which properties are read depend on the chord naming function active.
 */
+void
+Chord_name_engraver::boot ()
+{
+  ADD_LISTENER (Chord_name_engraver, note);
+  ADD_LISTENER (Chord_name_engraver, rest);
+}
+
 ADD_TRANSLATOR (Chord_name_engraver,
                 /* doc */
                 "Catch note and rest events and generate the appropriate chordname.",