]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/tab-note-heads-engraver.cc
* lily/include/scm-hash.hh (class Scheme_hash_table): idem.
[lilypond.git] / lily / tab-note-heads-engraver.cc
index 6c454a8cb5940d33d3730802e4cb2c60a2a71aee..91513e4485373f350ed523711bc3fee427d36a34 100644 (file)
@@ -1,14 +1,14 @@
 /*
   head-grav.cc -- part of GNU LilyPond
 
-  (c)  1997--2002 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  (c)  1997--2003 Han-Wen Nienhuys <hanwen@cs.uu.nl>
 */
 #include <ctype.h>
 #include <stdio.h>
 
 #include "rhythmic-head.hh"
 #include "paper-def.hh"
-#include "musical-request.hh"
+#include "event.hh"
 #include "dots.hh"
 #include "dot-column.hh"
 #include "staff-symbol-referencer.hh"
@@ -24,8 +24,8 @@ class Tab_note_heads_engraver : public Engraver
   Link_array<Item> notes_;
   
   Link_array<Item> dots_;
-  Link_array<Note_req> note_reqs_;
-  Link_array<Text_script_req> tabstring_reqs_;
+  Link_array<Music> note_reqs_;
+  Link_array<Music> tabstring_reqs_;
 public:
   TRANSLATOR_DECLARATIONS(Tab_note_heads_engraver);
 
@@ -45,21 +45,20 @@ Tab_note_heads_engraver::Tab_note_heads_engraver()
 bool
 Tab_note_heads_engraver::try_music (Music *m) 
 {
-  if (Note_req * n =dynamic_cast <Note_req *> (m))
+  if (m->is_mus_type ("note-event"))
     {
-      note_reqs_.push (n);
+      note_reqs_.push (m);
       return true;
     }
-  else if (Text_script_req * ts = dynamic_cast<Text_script_req*> (m))
+  else if (m->is_mus_type ("string-number-event"))
     {
-      if (m->get_mus_property ("text-type") != ly_symbol2scm ("finger")) return false;
-      
       while(tabstring_reqs_.size () < note_reqs_.size ()-1)
        tabstring_reqs_.push(0);
-      tabstring_reqs_.push(ts);
+      
+      tabstring_reqs_.push (m);
       return true;
     }
-  else if (dynamic_cast<Busy_playing_req*> (m))
+  else if (m->is_mus_type ("busy-playing-event"))
     {
       return note_reqs_.size ();
     }
@@ -71,19 +70,11 @@ Tab_note_heads_engraver::try_music (Music *m)
 void
 Tab_note_heads_engraver::process_music ()
 {
-  /*
-  for (int i=0; i < tabstring_reqs_.size (); i++) {
-      Music * tabstring_req = tabstring_reqs_[i];
-      
-      size_t lenp;
-      char* tab_string_as_string = gh_scm2newstr(tabstring_req->get_mus_property ("text"), &lenp);
-  }
-  */
-  
   for (int i=0; i < note_reqs_.size (); i++)
     {
       SCM stringTunings = get_property ("stringTunings");
       int number_of_strings = ((int) gh_length(stringTunings));
+      bool high_string_one = to_boolean(get_property ("highStringOne"));
 
       Item * note  = new Item (get_property ("TabNoteHead"));
       
@@ -93,16 +84,17 @@ Tab_note_heads_engraver::process_music ()
       if(tabstring_reqs_.size()>i)
        tabstring_req = tabstring_reqs_[i];
       // printf("%d %d\n",tabstring_reqs_.size(),i);
-      size_t lenp;
+      // size_t lenp;
       int tab_string;
       bool string_found;
       if (tabstring_req) {
-       char* tab_string_as_string = gh_scm2newstr(tabstring_req->get_mus_property ("text"), &lenp);
-       tab_string = atoi(tab_string_as_string);
+       //char* tab_string_as_string = gh_scm2newstr(tabstring_req->get_mus_property ("text"), &lenp);
+       //tab_string = atoi(tab_string_as_string);
+       tab_string = gh_scm2int(tabstring_req->get_mus_property ("string-number"));
        string_found = true;
       }
       else {
-       tab_string = number_of_strings;
+       tab_string = high_string_one ? 1 : number_of_strings;
        string_found = false;
       }
       
@@ -134,24 +126,18 @@ Tab_note_heads_engraver::process_music ()
        int fret = unsmob_pitch(scm_pitch)->semitone_pitch()
          - gh_scm2int(gh_list_ref(stringTunings,gh_int2scm(tab_string-1)));
        if(fret<min_fret)
-         tab_string--;
+         tab_string += high_string_one ? 1 : -1;
        else
          string_found = true;
       }
 
       SCM text = gh_call3 (proc, gh_int2scm (tab_string), stringTunings, scm_pitch);
 
-      int pos = 2 * tab_string - 2; // No tab-note between the string !!!
-      
-      if (number_of_strings % 2) { // odd number of string
-       pos++;
-      }
-
-      
-      note->set_grob_property ("text", text);
-      SCM c0 = get_property ("centralCPosition");
-      if (gh_number_p (c0)) pos += gh_scm2int (c0);
+      int pos = 2 * tab_string - number_of_strings - 1; // No tab-note between the string !!!
+      if(to_boolean(get_property("stringOneTopmost")))
+       pos = -pos;
       
+      note->set_grob_property ("text", text);      
       
       note->set_grob_property ("staff-position", gh_int2scm (pos));
       announce_grob (note, req->self_scm());
@@ -188,7 +174,8 @@ Tab_note_heads_engraver::start_translation_timestep ()
 ENTER_DESCRIPTION(Tab_note_heads_engraver,
 /* descr */       "Generate one or more tablature noteheads from Music of type Note_req.",
 /* creats*/       "TabNoteHead Dots",
-/* acks  */       "",
-/* reads */       "centralCPosition stringTunings minimumFret",
+/* accepts */     "note-event string-number-event busy-playing-event",
+/* acks  */      "",
+/* reads */       "centralCPosition stringTunings minimumFret tablatureFormat highStringOne stringOneTopmost",
 /* write */       "");