]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/note-heads-engraver.cc
(get_indexed_char): scale metrics by
[lilypond.git] / lily / note-heads-engraver.cc
index 12398fc0689f8bdb291543a6c06f8b1031fdd915..23de800ffc9e770e6b47676d753eccb6d884a118 100644 (file)
@@ -3,11 +3,11 @@
 
   (c) 1997--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
 */
-#include <ctype.h>
+
+#include <cctype>
 
 #include "rhythmic-head.hh"
-#include "paper-def.hh"
-#include "event.hh"
+#include "output-def.hh"
 #include "dots.hh"
 #include "dot-column.hh"
 #include "staff-symbol-referencer.hh"
@@ -19,13 +19,13 @@ class Note_heads_engraver : public Engraver
 {
   Link_array<Item> notes_;
   Link_array<Item> dots_;
-  Link_array<Music> note_reqs_;
+  Link_array<Music> note_evs_;
 
 public:
   TRANSLATOR_DECLARATIONS (Note_heads_engraver);
 
 protected:
-  virtual bool try_music (Music *req) ;
+  virtual bool try_music (Music *ev) ;
   virtual void process_music ();
 
   virtual void stop_translation_timestep ();
@@ -40,13 +40,11 @@ Note_heads_engraver::try_music (Music *m)
 {
   if (m->is_mus_type ("note-event"))
     {
-      note_reqs_.push (m);
+      note_evs_.push (m);
       return true;
     }
   else if (m->is_mus_type ("busy-playing-event"))
-    return note_reqs_.size ();
-  else if (m->is_mus_type ("start-playing-event"))
-    return note_reqs_.size ();
+    return note_evs_.size ();
   
   return false;
 }
@@ -55,13 +53,13 @@ Note_heads_engraver::try_music (Music *m)
 void
 Note_heads_engraver::process_music ()
 {
-  for (int i=0; i < note_reqs_.size (); i++)
+  for (int i = 0; i < note_evs_.size (); i++)
     {
 
-      Music * req = note_reqs_[i];
-      Item *note = make_item ("NoteHead", req->self_scm ());
+      Music * ev = note_evs_[i];
+      Item *note = make_item ("NoteHead", ev->self_scm ());
       
-      Duration dur = *unsmob_duration (req->get_property ("duration"));
+      Duration dur = *unsmob_duration (ev->get_property ("duration"));
 
       note->set_property ("duration-log", scm_int2num (dur.duration_log ()));
       if (dur.dot_count ())
@@ -78,14 +76,40 @@ Note_heads_engraver::process_music ()
          dots_.push (d);
        }
 
-      Pitch *pit =unsmob_pitch (req->get_property ("pitch"));
+      Pitch *pit = unsmob_pitch (ev->get_property ("pitch"));
 
       int pos = pit ? pit->steps () : 0;
       SCM c0 = get_property ("middleCPosition");
-      if (ly_c_number_p (c0))
-       pos += ly_scm2int (c0);
+      if (scm_is_number (c0))
+       pos += scm_to_int (c0);
 
       note->set_property ("staff-position",   scm_int2num (pos));
+
+      /*
+       Shaped note heads change on step of the scale.
+       */
+      SCM shape_vector = get_property ("shapeNoteStyles");
+      if (ly_c_vector_p (shape_vector))
+       {
+         SCM scm_tonic = get_property ("tonic");
+         Pitch tonic (0,0,0); 
+         if (unsmob_pitch (scm_tonic))
+           tonic = *unsmob_pitch (scm_tonic);
+      
+         unsigned int delta = (pit->get_notename() - tonic.get_notename() + 7) % 7;
+         
+         SCM style = SCM_EOL;
+         if (SCM_VECTOR_LENGTH (shape_vector) > delta
+             && scm_is_symbol (scm_vector_ref (shape_vector, scm_from_int (delta))))
+           {
+             style = scm_vector_ref (shape_vector, scm_from_int (delta));
+           }
+         if (scm_is_symbol (style))
+           {
+             note->set_property ("style", style);
+           }
+       }
+      
       notes_.push (note);
     }
 }
@@ -93,15 +117,14 @@ Note_heads_engraver::process_music ()
 void
 Note_heads_engraver::stop_translation_timestep ()
 {
-
   notes_.clear ();
   dots_.clear ();
-  note_reqs_.clear ();
+  note_evs_.clear ();
 }
 
 
 
-ENTER_DESCRIPTION (Note_heads_engraver,
+ADD_TRANSLATOR (Note_heads_engraver,
 /* descr */       "Generate noteheads.",
 /* creats*/       "NoteHead Dots",
 /* accepts */     "note-event busy-playing-event",