From: Devon Schudy <dschudy@gmail.com>
Date: Mon, 10 Mar 2014 16:20:37 +0000 (-0400)
Subject: Count MIDI ticks from the beginning of the score, not each staff independently.
X-Git-Tag: release/2.19.4-1~10
X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=7b58ea045f6b6b7381f777cfcedd47660f9058ea;p=lilypond.git

Count MIDI ticks from the beginning of the score, not each staff independently.

This keeps MIDI output aligned for:
* Lyrics (issue 3878)
* Staves without Dynamic_performer (issue 3871)
* Staves that start late
* Scores that start with grace notes (issue 1412).
---

diff --git a/lily/audio-staff.cc b/lily/audio-staff.cc
index a81b2cbbce..aaab0cf756 100644
--- a/lily/audio-staff.cc
+++ b/lily/audio-staff.cc
@@ -35,11 +35,11 @@ Audio_staff::Audio_staff ()
 }
 
 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 ();
 
diff --git a/lily/include/audio-staff.hh b/lily/include/audio-staff.hh
index ca1fdb9b5c..f7f4200346 100644
--- a/lily/include/audio-staff.hh
+++ b/lily/include/audio-staff.hh
@@ -27,7 +27,7 @@
 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 ();
 
diff --git a/lily/include/midi-walker.hh b/lily/include/midi-walker.hh
index a59e94c0b8..18df26b3a5 100644
--- a/lily/include/midi-walker.hh
+++ b/lily/include/midi-walker.hh
@@ -39,7 +39,7 @@ int compare (Midi_note_event const &left, Midi_note_event const &right);
 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 ();
diff --git a/lily/midi-walker.cc b/lily/midi-walker.cc
index a6b2008851..20d3252aba 100644
--- a/lily/midi-walker.cc
+++ b/lily/midi-walker.cc
@@ -52,13 +52,15 @@ audio_item_less (Audio_item *const a,
   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_;
 }
diff --git a/lily/performance.cc b/lily/performance.cc
index 136ef95139..4aa03331e8 100644
--- a/lily/performance.cc
+++ b/lily/performance.cc
@@ -23,6 +23,7 @@
 using namespace std;
 
 #include "audio-column.hh"
+#include "audio-item.hh"
 #include "audio-staff.hh"
 #include "file-name.hh"
 #include "international.hh"
@@ -53,11 +54,18 @@ Performance::output (Midi_stream &midi_stream) const
   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);
     }
 }