#include <assert.h>
#include <ctype.h>
-#include "moment.hh"
+#include "rational.hh"
#include "duration-convert.hh"
#include "string-convert.hh"
#include "midi2ly-proto.hh"
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));
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)
{
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;
}
}
trackbody += "\\" + voicename + "\n";
- mudela_stream_r << "\n";
+ mudela_stream_r << '\n';
i->car_->output (mudela_stream_r);
c++;
}
}
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)
#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;
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;
// 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;
}
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)
{