]> git.donarmstrong.com Git - lilypond.git/blobdiff - src/note.cc
release: 0.0.24
[lilypond.git] / src / note.cc
index f5911c0edad611c963299d78135bbfc9798b6fe8..0cd2c478a60980d1367d5744988fe717a5b723bc 100644 (file)
@@ -1,38 +1,42 @@
 #include <ctype.h>
-
+#include "lexer.hh"
 #include "string.hh"
 #include "real.hh"
 #include "debug.hh"
 #include "request.hh"
 #include "voice.hh"
 #include "notename.hh"
-#include "vray.hh"
+#include "identparent.hh"
+#include "varray.hh"
+#include "textdef.hh"
 
-int default_duration = 4, default_dots=0, default_octave=0;
 
-void
-parse_duration(const char *a, int &j, int &intdur, int &dots)
-{    
-    String durstr;    
-    while (isdigit(a[j])) 
-       {
-       durstr += a[j++];
-       }
+int default_duration = 4, default_dots=0, default_octave=0;
+int default_plet_type = 1, default_plet_dur = 1;
+String textstyle="roman";              // in lexer?
 
-    dots=default_dots;
-    
-    while (a[j] == '.') 
-       {
-       j++;
-       dots++;
-       }
-    
-    intdur = (durstr.len()) ?
-       durstr.value():default_duration;
+/* triplet is '2/3' */
+void set_plet(int num,int den)
+{
+    assert(num >0&& den>0);
+    default_plet_dur = num;
+    default_plet_type = den;
+}
 
-    mtor << "dur " << intdur << "dots " << dots<<eol;
+Text_def*
+get_text(String s) return t;
+{
+    t= new Text_def;
+    t->text_str_= s;
+    t->style_str_ = textstyle;
+    return t;
 }
 
+void
+set_text_style(String s)
+{
+    textstyle = s;
+}
 
 void
 parse_octave (const char *a, int &j, int &oct)
@@ -50,14 +54,11 @@ parse_octave (const char *a, int &j, int &oct)
 }
 
 void 
-parse_pitch( const char *a, int &j, int &oct, bool & overide_acc,
-            int & large, int & small)
+parse_pitchmod( const char *a, int &j, int &oct, bool & overide_acc)
 {
     // octave
     oct =default_octave;
     parse_octave(a,j,oct);
-
-    mtor << "oct " << oct;
        
     // accidental
     overide_acc = false;
@@ -68,36 +69,20 @@ parse_pitch( const char *a, int &j, int &oct, bool & overide_acc,
        j++;
        }
 
-    
-    // notename.
-    String nm;
-    while (isalpha(a[j])) 
-       {
-       nm += a[j++];
-       }
-    if (isupper(nm[0]))
-       {
-       oct--;  
-       nm.lower();
-       }
-        
-
-    lookup_notename(large,small,nm);
-    mtor << "override: " << overide_acc;    
-    mtor << "pitch "<< large <<", "<<small<<"\n";    
+    mtor << "oct " << oct;
+    mtor << "override: " << overide_acc<<'\n';
 }
 
 
 Voice_element *
-get_note_element(String pitch, String durstr)
+get_note_element(String pitch, int * notename, int * duration )
 {
     Voice_element*v = new Voice_element;
     int i=0;
     
-    int dur, dots;
-    parse_duration(durstr, i, dur, dots);
-    i=0;
-
+    int dur = duration[0];
+    int dots=duration[1];
+    
     Note_req * rq = new Note_req;
 
     if (dur >= 2) {
@@ -105,17 +90,16 @@ get_note_element(String pitch, String durstr)
        v->add(st);
     }
     
-    int oct, pit, acc;
+    int oct;
     bool forceacc;
-    parse_pitch(pitch, i, oct, forceacc, pit, acc);
-    rq->name =pit;
-    
+    parse_pitchmod(pitch, i, oct, forceacc);
+    rq->name =notename[0];
+    rq->accidental = notename[1];
     rq->octave = oct;
-    rq->accidental = acc;
     rq->forceacc = forceacc;
     rq->balltype = dur;
     rq->dots = dots;
-    
+    rq->plet_factor = Moment(default_plet_dur, default_plet_type);
     rq->print();
 
     v->add(rq);
@@ -123,20 +107,36 @@ get_note_element(String pitch, String durstr)
     return v;
 }
 
+Voice_element*
+get_word_element(Text_def* tdef_p, int* duration)
+{
+    Voice_element* velt_p = new Voice_element;
+
+    
+    int dur = duration[0];
+    int dots=duration[1];
+    
+    Lyric_req* lreq_p = new Lyric_req(tdef_p);
+
+    lreq_p->balltype = dur;
+    lreq_p->dots = dots;
+    lreq_p->plet_factor = Moment(default_plet_dur, default_plet_type);
+    lreq_p->print();
+
+    velt_p->add(lreq_p);
+
+    return velt_p;
+}
+
 Voice_element *
-get_rest_element(String, String durstr)
+get_rest_element(String,  int * duration )
 {    
     Voice_element*v = new Voice_element;
-    int i=0;
-    
-    int dur, dots;
-    parse_duration(durstr, i, dur, dots);
-    i=0;
 
     Rest_req * rq = new Rest_req;
-  
-    rq->balltype = dur;
-    rq->dots = dots;    
+    rq->plet_factor = Moment(default_plet_dur, default_plet_type);
+    rq->balltype = duration[0];
+    rq->dots = duration[1];    
     rq->print();
     v->add(rq);
 
@@ -144,15 +144,22 @@ get_rest_element(String, String durstr)
 }
 
 void
-set_default_duration(String d)
+get_default_duration(int *p)
 {
-    int i=0;
-    parse_duration(d, i, default_duration, default_dots);
+   *p++ = default_duration;
+    *p = default_dots;
+}
+
+void
+set_default_duration(int *p)
+{
+     default_duration = *p++;
+     default_dots = *p++;
 }
 
 
 void
-set_default_pitch(String d)
+set_default_octave(String d)
 {
     int i=0;
     default_octave=0;
@@ -164,9 +171,17 @@ get_request(char c)
 {
     Request* ret=0;
     switch (c) {
+    case '|':
+       ret = new Barcheck_req;
+       break;
     case '[':
     case ']':
-       ret = new Beam_req;
+    {
+       Beam_req*b = new Beam_req;
+       if (default_plet_type != 1)
+           b->nplet = default_plet_type;
+       ret = b;
+    }
        break;
 
     case ')':
@@ -187,8 +202,9 @@ get_request(char c)
     case ']':
        ret->span()->spantype = Span_req::STOP;
        break;
+       
     default:
-       assert(false);
+
        break;
     }
 
@@ -196,10 +212,71 @@ get_request(char c)
 }
 
 void
-add_requests(Voice_element *v, svec<Request*> &req)
+add_requests(Voice_element *v, Array<Request*> &req)
 {
-    for (int i = 0; i < req.sz(); i++) {
+    for (int i = 0; i < req.size(); i++) {
        v->add(req[i]);
     }
     req.set_size(0);
 }
+
+Script_def*
+get_scriptdef(char c)
+{
+    String s;
+    switch (c) {
+    case '^' : s = "marcato";
+       break;
+    case  '+' : s = "stopped";
+       break;
+    case '-' : s = "tenuto";
+       break;
+    case  '|':  s = "staccatissimo";
+       break;
+    case  'o' : s = "";
+       break;
+    case '>' : s = "accent";
+       break;
+    case  'v' : s = ""; 
+       break;
+    case  '.' : s = "staccato";
+       break;
+    }
+    return lexer->lookup_identifier(s)->script(1);
+}
+
+Request*
+get_script_req(int d , Script_def*def)
+{
+    return new Script_req(d, def);
+}
+
+Request*
+get_text_req(int d , Text_def*def)
+{
+    return new Text_req(d, def);
+}
+
+Voice_element*
+get_mark_element(String s)
+{
+    Voice_element*v_p = new Voice_element;
+    v_p->add( new Mark_req(s));
+    
+    return v_p;
+}
+Voice_element*
+get_command_element(Input_command*com_p)
+{
+    Voice_element *v_p = new Voice_element;
+    v_p->add(new Staff_command_req(com_p));
+    return v_p;
+}
+Voice_element*
+get_barcheck_element()
+{
+    Voice_element*v_p = new Voice_element;
+    v_p->add( new Barcheck_req);
+    
+    return v_p;
+}