}
void
-Audio_staff::output (Midi_stream &midi_stream, int track, bool port)
+Audio_staff::output (Midi_stream &midi_stream, int track, bool port, int start_tick)
{
Midi_track midi_track (track, port);
- Midi_walker i (this, &midi_track);
+ Midi_walker i (this, &midi_track, start_tick);
for (; i.ok (); i++)
i.process ();
struct Audio_staff : public Audio_element
{
void add_audio_item (Audio_item *ai);
- void output (Midi_stream &midi_stream_r, int track, bool port);
+ void output (Midi_stream &midi_stream_r, int track, bool port, int start_tick);
Audio_staff ();
class Midi_walker
{
public:
- Midi_walker (Audio_staff *audio_staff, Midi_track *midi_track);
+ Midi_walker (Audio_staff *audio_staff, Midi_track *midi_track, int start_tick);
~Midi_walker ();
void process ();
return a->get_column ()->when_ < b->get_column ()->when_;
}
-Midi_walker::Midi_walker (Audio_staff *audio_staff, Midi_track *track)
+Midi_walker::Midi_walker (Audio_staff *audio_staff, Midi_track *track, int start_tick)
{
track_ = track;
index_ = 0;
items_ = audio_staff->audio_items_;
vector_sort (items_, audio_item_less);
- last_tick_ = 0;
+ //Scores that begin with grace notes start at negative times. This
+ //is OK - MIDI output doesn't use absolute ticks, only differences.
+ last_tick_ = start_tick;
percussion_ = audio_staff->percussion_;
merge_unisons_ = audio_staff->merge_unisons_;
}
using namespace std;
#include "audio-column.hh"
+#include "audio-item.hh"
#include "audio-staff.hh"
#include "file-name.hh"
#include "international.hh"
midi_stream.write (Midi_header (1, tracks_, 384));
debug_output (_ ("Track...") + " ", false);
+ //Find the first Audio_item in the performance, so all staves start
+ //at the same tick.
+ Moment start_mom = 0;
+ for (vsize i = 0; i < audio_elements_.size (); i++)
+ if (Audio_item *item = dynamic_cast<Audio_item *>(audio_elements_[i]))
+ start_mom = min (start_mom, item->audio_column_->when ());
+
for (vsize i = 0; i < audio_staffs_.size (); i++)
{
Audio_staff *s = audio_staffs_[i];
debug_output ("[" + ::to_string (i), true);
- s->output (midi_stream, i, ports_);
+ s->output (midi_stream, i, ports_, moment_to_ticks (start_mom));
debug_output ("]", false);
}
}