]> git.donarmstrong.com Git - lilypond.git/commitdiff
Count MIDI ticks from the beginning of the score, not each staff independently.
authorDevon Schudy <dschudy@gmail.com>
Mon, 10 Mar 2014 16:20:37 +0000 (12:20 -0400)
committerDavid Kastrup <dak@gnu.org>
Fri, 4 Apr 2014 19:52:11 +0000 (21:52 +0200)
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).

lily/audio-staff.cc
lily/include/audio-staff.hh
lily/include/midi-walker.hh
lily/midi-walker.cc
lily/performance.cc

index a81b2cbbcedefa737e944e274339b294faead0eb..aaab0cf756a3f732bc79ebf1dbbd9a9ba5c2969e 100644 (file)
@@ -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 ();
 
index ca1fdb9b5c368309ea1a5aaeff53afd5de57411f..f7f42003460eae2870a21807bbe60130c5e27b69 100644 (file)
@@ -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 ();
 
index a59e94c0b8c743de285bbfc9d6de52d7f8e73ec3..18df26b3a5c9244d5b117b79fb70dce989b703b3 100644 (file)
@@ -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 ();
index a6b2008851038b0b25b22374264a984db6c3bd96..20d3252aba7d1847b725b5e7183b3ed67e7c1b44 100644 (file)
@@ -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_;
 }
index 136ef95139896067f97935ba16e8f358491d4c3a..4aa03331e8a79f05345c747303459683e14fecc8 100644 (file)
@@ -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);
     }
 }