]> git.donarmstrong.com Git - lilypond.git/commitdiff
2002-08-01 Rune Zedeler <rune@zedeler.dk>
authorRune Zedeler <rune@lilypond.org>
Thu, 1 Aug 2002 11:32:32 +0000 (11:32 +0000)
committerRune Zedeler <rune@lilypond.org>
Thu, 1 Aug 2002 11:32:32 +0000 (11:32 +0000)
* lily/tab-note-heads-engraver.cc: add algorithm for automatically
selecting frets when none given by user. Read property
"minimumFret".

* scm/translator-property-description.scm: Add "minimumFret"

ChangeLog
lily/tab-note-heads-engraver.cc
scm/translator-property-description.scm

index c35ceb21bbe18fbfa5f261cb54b5011b694822b4..22422265c6e2f02cf6607a3e3cc9a68cf1c27c95 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2002-08-01 Rune Zedeler <rune@zedeler.dk>
 
+       * lily/tab-note-heads-engraver.cc: add algorithm for automatically
+       selecting frets when none given by user. Read property
+       "minimumFret".
+
+       * scm/translator-property-description.scm: Add "minimumFret"
+       
        * mf/feta-eindelijk.mf: Changed layout of 16th and shorter rests
        to match the 8th rest. slanted 8th rest a bit more.
        WARNING: 8th rest and classical quarter rest exchanged.
index 6c6e9e43d13ec67c0511371272890bb3503d7fd1..6c454a8cb5940d33d3730802e4cb2c60a2a71aee 100644 (file)
@@ -54,9 +54,9 @@ Tab_note_heads_engraver::try_music (Music *m)
     {
       if (m->get_mus_property ("text-type") != ly_symbol2scm ("finger")) return false;
       
-      //if (tabstring_reqs_.size () < note_reqs_.size ()) {
-        tabstring_reqs_.push (ts);
-      //}
+      while(tabstring_reqs_.size () < note_reqs_.size ()-1)
+       tabstring_reqs_.push(0);
+      tabstring_reqs_.push(ts);
       return true;
     }
   else if (dynamic_cast<Busy_playing_req*> (m))
@@ -82,15 +82,29 @@ Tab_note_heads_engraver::process_music ()
   
   for (int i=0; i < note_reqs_.size (); i++)
     {
+      SCM stringTunings = get_property ("stringTunings");
+      int number_of_strings = ((int) gh_length(stringTunings));
+
       Item * note  = new Item (get_property ("TabNoteHead"));
       
       Music * req = note_reqs_[i];
       
-      Music * tabstring_req = tabstring_reqs_[i];
-      
+      Music * tabstring_req = 0;
+      if(tabstring_reqs_.size()>i)
+       tabstring_req = tabstring_reqs_[i];
+      // printf("%d %d\n",tabstring_reqs_.size(),i);
       size_t lenp;
-      char* tab_string_as_string = gh_scm2newstr(tabstring_req->get_mus_property ("text"), &lenp);
-      int tab_string = atoi(tab_string_as_string);
+      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);
+       string_found = true;
+      }
+      else {
+       tab_string = number_of_strings;
+       string_found = false;
+      }
       
       Duration dur = *unsmob_duration (req->get_mus_property ("duration"));
       
@@ -110,22 +124,34 @@ Tab_note_heads_engraver::process_music ()
          dots_.push (d);
        }
       
-      SCM stringTunings = get_property ("stringTunings");
-      int number_of_strings = ((int) gh_length(stringTunings));
       
+      SCM scm_pitch = req->get_mus_property ("pitch");
+      SCM proc      = get_property ("tablatureFormat");
+      SCM min_fret_scm = get_property ("minimumFret");
+      int min_fret = gh_number_p(min_fret_scm) ? gh_scm2int(min_fret_scm) : 0;
+
+      while(!string_found) {
+       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--;
+       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 (((float) (number_of_strings / 2)) != (((float) number_of_strings) / 2.0)) { // even number of string
-        pos = pos + 1;
+      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);
       
-      SCM scm_pitch = req->get_mus_property ("pitch");
-      SCM proc      = get_property ("tablatureFormat");
-      SCM text      = gh_call3 (proc, gh_int2scm (tab_string), stringTunings, scm_pitch);
-      note->set_grob_property ("text", text);
       
       note->set_grob_property ("staff-position", gh_int2scm (pos));
       announce_grob (note, req->self_scm());
@@ -163,6 +189,6 @@ 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",
+/* reads */       "centralCPosition stringTunings minimumFret",
 /* write */       "");
 
index de72887856e6886cc05355738e48e036af09b591..4258266410d691042f8f6a86b12931ff8d646399 100644 (file)
@@ -265,6 +265,9 @@ top of those automatically detected. ")
 MIDI instrument to use ")
 (translator-property-description 'midiMinimumVolume number? "[DOCUMENT-ME]")
 (translator-property-description 'midiMaximumVolume number? "[DOCUMENT-ME]")
+(translator-property-description 'minimumFret number? "The tablature
+auto string-selecting mechanism selects the highest string with a fret
+not less than minimumFret")
 (translator-property-description 'autoBeaming boolean? "If set to true
 then beams are generated automatically.")
 (translator-property-description 'noDirection boolean? "Don't set directions by a2-engraver when part-combining.")