]> git.donarmstrong.com Git - lilypond.git/blob - lily/tab-note-heads-engraver.cc
jiba tab
[lilypond.git] / lily / tab-note-heads-engraver.cc
1 /*
2   head-grav.cc -- part of GNU LilyPond
3
4   (c)  1997--2002 Han-Wen Nienhuys <hanwen@cs.uu.nl>
5 */
6 #include <ctype.h>
7 #include <stdio.h>
8
9 #include "rhythmic-head.hh"
10 #include "paper-def.hh"
11 #include "musical-request.hh"
12 #include "dots.hh"
13 #include "dot-column.hh"
14 #include "staff-symbol-referencer.hh"
15 #include "item.hh"
16 #include "score-engraver.hh"
17 #include "warn.hh"
18
19 /**
20   make (guitar-like) tablature note
21  */
22 class Tab_note_heads_engraver : public Engraver
23 {
24   Link_array<Item> note_p_arr_;
25   
26   Link_array<Item> dot_p_arr_;
27   Link_array<Note_req> note_req_l_arr_;
28   
29   Link_array<Text_script_req> tabstring_req_arr_;
30
31 public:
32   TRANSLATOR_DECLARATIONS(Tab_note_heads_engraver);
33
34 protected:
35   virtual void start_translation_timestep ();
36   virtual bool try_music (Music *req_l) ;
37   virtual void process_music ();
38
39   virtual void stop_translation_timestep ();
40 };
41
42
43 Tab_note_heads_engraver::Tab_note_heads_engraver()
44 {
45 }
46
47 bool
48 Tab_note_heads_engraver::try_music (Music *m) 
49 {
50   if (Note_req * n =dynamic_cast <Note_req *> (m))
51     {
52       note_req_l_arr_.push (n);
53       return true;
54     }
55   else if (Text_script_req * ts = dynamic_cast<Text_script_req*> (m))
56     {
57       if (m->get_mus_property ("text-type") != ly_symbol2scm ("finger")) return false;
58       
59       //if (tabstring_req_arr_.size () < note_req_l_arr_.size ()) {
60         tabstring_req_arr_.push (ts);
61       //}
62       return true;
63     }
64   else if (dynamic_cast<Busy_playing_req*> (m))
65     {
66       return note_req_l_arr_.size ();
67     }
68   
69   return false;
70 }
71
72
73 void
74 Tab_note_heads_engraver::process_music ()
75 {
76   /*
77   for (int i=0; i < tabstring_req_arr_.size (); i++) {
78       Music * tabstring_req = tabstring_req_arr_[i];
79       
80       size_t lenp;
81       char* tab_string_as_str = gh_scm2newstr(tabstring_req->get_mus_property ("text"), &lenp);
82   }
83   */
84   
85   for (int i=0; i < note_req_l_arr_.size (); i++)
86     {
87       Item * note_p  = new Item (get_property ("TabNoteHead"));
88       
89       Music * req = note_req_l_arr_[i];
90       
91       Music * tabstring_req = tabstring_req_arr_[i];
92       
93       size_t lenp;
94       char* tab_string_as_str = gh_scm2newstr(tabstring_req->get_mus_property ("text"), &lenp);
95       int tab_string = atoi(tab_string_as_str);
96       
97       Duration dur = *unsmob_duration (req->get_mus_property ("duration"));
98       
99       note_p->set_grob_property ("duration-log", gh_int2scm (dur.duration_log ()));
100
101       if (dur.dot_count ())
102         {
103           Item * d = new Item (get_property ("Dots"));
104           Rhythmic_head::set_dots (note_p, d);
105           
106           if (dur.dot_count ()
107               != gh_scm2int (d->get_grob_property ("dot-count")))
108             d->set_grob_property ("dot-count", gh_int2scm (dur.dot_count ()));
109
110           d->set_parent (note_p, Y_AXIS);
111           announce_grob (d, SCM_EOL);
112           dot_p_arr_.push (d);
113         }
114       
115       int pos = 2 * tab_string - 2; // No tab-note between the string !!!
116       SCM c0 = get_property ("centralCPosition");
117       if (gh_number_p (c0)) pos += gh_scm2int (c0);
118       
119       note_p->set_grob_property ("tab-string", gh_int2scm (tab_string));
120       
121       note_p->set_grob_property ("staff-position", gh_int2scm (pos));
122       announce_grob (note_p, req->self_scm());
123       note_p_arr_.push (note_p);
124     }
125 }
126
127 void
128 Tab_note_heads_engraver::stop_translation_timestep ()
129 {
130   for (int i=0; i < note_p_arr_.size (); i++)
131     {
132       typeset_grob (note_p_arr_[i]);
133     }
134
135   note_p_arr_.clear ();
136   for (int i=0; i < dot_p_arr_.size (); i++)
137     {
138       typeset_grob (dot_p_arr_[i]);
139     }
140   dot_p_arr_.clear ();
141   
142   note_req_l_arr_.clear ();
143   
144   tabstring_req_arr_.clear ();
145 }
146
147 void
148 Tab_note_heads_engraver::start_translation_timestep ()
149 {
150 }
151
152
153 ENTER_DESCRIPTION(Tab_note_heads_engraver,
154 /* descr */       "Generate one or more tablature noteheads from Music of type Note_req.",
155 /* creats*/       "TabNoteHead Dots",
156 /* acks  */       "",
157 /* reads */       "centralCPosition",
158 /* write */       "");