]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/tab-note-heads-engraver.cc
* lily/script-engraver.cc (make_script_from_event): don't crash on
[lilypond.git] / lily / tab-note-heads-engraver.cc
index 28bd4b298b6f453773bf9e2332056ace6b456275..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 ();
     }
@@ -75,6 +74,7 @@ Tab_note_heads_engraver::process_music ()
     {
       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"));
       
@@ -84,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;
       }
       
@@ -125,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());
@@ -179,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 */       "");