]> git.donarmstrong.com Git - lilypond.git/blobdiff - midi2ly/mudela-staff.cc
patch::: 1.3.20.jcn1
[lilypond.git] / midi2ly / mudela-staff.cc
index edba0e1bc4e586a2f647430038fc8dee4faef5b3..6f561cdb152372bdfe432b9f512d3d7836bc55fd 100644 (file)
@@ -5,7 +5,7 @@
 
 #include <assert.h>
 #include <ctype.h>
-#include "moment.hh"
+#include "rational.hh"
 #include "duration-convert.hh"
 #include "string-convert.hh"
 #include "midi2ly-proto.hh"
@@ -52,15 +52,15 @@ Mudela_staff::eat_voice (Cons_list<Mudela_item>& items)
   Mudela_voice* voice_p = new Mudela_voice (this);
   mudela_voice_p_list_.append (new Killing_cons<Mudela_voice> (voice_p, 0));
 
-  //    Moment mom = items.top ()->at_mom ();
-  Moment mom = 0;
+  //    Rational mom = items.top ()->at_mom ();
+  Rational mom = 0;
 
   for (Cons<Mudela_item>** pp = &items.head_; *pp;)
     {
       Cons<Mudela_item>* i = *pp;
       if (i->car_->at_mom () > mom)
        {
-         Moment dur = i->car_->at_mom () - mom;
+         Rational dur = i->car_->at_mom () - mom;
          // ugh, need score
          Mudela_column* start = mudela_score_l_g->find_column_l (mom);
          voice_p->add_item (new Mudela_skip (start, dur));
@@ -72,22 +72,26 @@ Mudela_staff::eat_voice (Cons_list<Mudela_item>& items)
       for (Cons<Mudela_item> *cp = i; cp && cp->car_->at_mom () == mom; cp = cp->next_)
        now_items.push (i->car_);
 
-      Mudela_item * which = 0;
       Mudela_note * last_note = dynamic_cast<Mudela_note*> (voice_p->last_item_l_);
+      Link_array<Mudela_item> candidates; 
 
-      for (int i=0; !which && last_note && i < now_items.size (); i++)
+      for (int i=0; last_note && i < now_items.size (); i++)
        {
          Mudela_note * now_note = dynamic_cast<Mudela_note*> (now_items[i]);
          if (now_note && last_note->channel_i_ != now_note->channel_i_)
-           which = now_note;
+           candidates.push (now_note);
+       }
+
+      if (candidates.size())
+       {
+         now_items = candidates;
        }
 
-#if 0
-      // use pitch difference for determining which item to pick.
-      if (!which)
+      Mudela_item * which = 0;
+      if (now_items.size () > 1)
        {
          int mindiff = 100000; // ugh
-         for (int i=0; !which && last_note && i < now_items.size (); i++)
+         for (int i=0; last_note && i < now_items.size (); i++)
            {
              Mudela_note *nt = dynamic_cast<Mudela_note*> (now_items[i]);
              if (!nt)
@@ -104,28 +108,25 @@ Mudela_staff::eat_voice (Cons_list<Mudela_item>& items)
            {
              which =0;
            }
-
        }
-#endif
-      
-      if (!which && now_items.size ())
+      else if (now_items.size () == 1)
        which = now_items[0];
-
       
-
-      if (!which)
+      if (which)
+       {
+         while ((*pp)->car_ != which)
+           pp = &(*pp)->next_;
+      
+         mom += (*pp)->car_->duration_mom ();
+         Cons<Mudela_item>* c = items.remove_cons (pp);
+         voice_p->add_item (c->car_);
+         delete c;
+       }
+      else 
        {
          pp = &(*pp)->next_;
          continue;
        }
-      
-      while ((*pp)->car_ != which)
-       pp = &(*pp)->next_;
-      
-      mom += (*pp)->car_->duration_mom ();
-      Cons<Mudela_item>* c = items.remove_cons (pp);
-      voice_p->add_item (c->car_);
-      delete c;
     }
 }
 
@@ -169,7 +170,7 @@ Mudela_staff::output (Mudela_stream& mudela_stream_r)
 
       trackbody += "\\"  + voicename + "\n";
 
-      mudela_stream_r << "\n";
+      mudela_stream_r << '\n';
       i->car_->output (mudela_stream_r);
       c++;      
     }
@@ -183,10 +184,10 @@ Mudela_staff::output (Mudela_stream& mudela_stream_r)
 }
 
 void
-Mudela_staff::output_mudela_begin_bar (Mudela_stream& mudela_stream_r, Moment now_mom, int bar_i)
+Mudela_staff::output_mudela_begin_bar (Mudela_stream& mudela_stream_r, Rational now_mom, int bar_i)
 {
-  Moment bar_mom = mudela_time_signature_l_->bar_mom ();
-  Moment into_bar_mom = now_mom - Moment (bar_i - 1) * bar_mom;
+  Rational bar_mom = mudela_time_signature_l_->bar_mom ();
+  Rational into_bar_mom = now_mom - Rational (bar_i - 1) * bar_mom;
   if (bar_i > 1)
     {
       if (!into_bar_mom)
@@ -201,10 +202,10 @@ Mudela_staff::output_mudela_begin_bar (Mudela_stream& mudela_stream_r, Moment no
 
 #if 0 // not used for now
 void
-Mudela_staff::output_mudela_rest (Mudela_stream& mudela_stream_r, Moment begin_mom, Moment end_mom)
+Mudela_staff::output_mudela_rest (Mudela_stream& mudela_stream_r, Rational begin_mom, Rational end_mom)
 {
-  Moment bar_mom = mudela_time_signature_l_->bar_mom ();
-  Moment now_mom = begin_mom;
+  Rational bar_mom = mudela_time_signature_l_->bar_mom ();
+  Rational now_mom = begin_mom;
 
   int begin_bar_i = (int) (now_mom / bar_mom) + 1;
   int end_bar_i = (int) (end_mom / bar_mom) + 1;
@@ -219,15 +220,15 @@ Mudela_staff::output_mudela_rest (Mudela_stream& mudela_stream_r, Moment begin_m
   int bar_i = (int) (now_mom / bar_mom) + 1;
 
   //fill current bar
-  Moment begin_bar_mom = Moment (begin_bar_i - 1) * bar_mom;
+  Rational begin_bar_mom = Rational (begin_bar_i - 1) * bar_mom;
   if (now_mom > begin_bar_mom)
     {
       int next_bar_i = (int) (now_mom / bar_mom) + 2;
-      Moment next_bar_mom = Moment (next_bar_i - 1) * bar_mom;
+      Rational next_bar_mom = Rational (next_bar_i - 1) * bar_mom;
       assert (next_bar_mom <= end_mom);
 
-      Moment remain_mom = next_bar_mom - now_mom;
-      if (remain_mom > Moment (0))
+      Rational remain_mom = next_bar_mom - now_mom;
+      if (remain_mom > Rational (0))
        {
          output_mudela_rest_remain (mudela_stream_r, remain_mom);
          now_mom += remain_mom;
@@ -258,8 +259,8 @@ Mudela_staff::output_mudela_rest (Mudela_stream& mudela_stream_r, Moment begin_m
 
   //    bar_i = check_end_bar_i (now_mom, bar_i);
 
-  Moment remain_mom = end_mom - Moment (end_bar_i - 1) * bar_mom;
-  if (remain_mom > Moment (0))
+  Rational remain_mom = end_mom - Rational (end_bar_i - 1) * bar_mom;
+  if (remain_mom > Rational (0))
     {
       output_mudela_rest_remain (mudela_stream_r, remain_mom);
       now_mom += remain_mom;
@@ -268,7 +269,7 @@ Mudela_staff::output_mudela_rest (Mudela_stream& mudela_stream_r, Moment begin_m
 }
 
 void
-Mudela_staff::output_mudela_rest_remain (Mudela_stream& mudela_stream_r, Moment mom)
+Mudela_staff::output_mudela_rest_remain (Mudela_stream& mudela_stream_r, Rational mom)
 {
   if (Duration_convert::no_quantify_b_s)
     {