lilypond-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Issue 5299: Place the MIDI end-of-track event (issue 340980043 by addres


From: nine . fierce . ballads
Subject: Issue 5299: Place the MIDI end-of-track event (issue 340980043 by address@hidden)
Date: Thu, 29 Mar 2018 15:34:04 -0700

Reviewers: ,

Description:
https://sourceforge.net/p/testlilyissues/issues/5299/

Place the MIDI end-of-track event at the moment the responsible
performer is finalized rather than always making it simultaneous with
the penultimate event of the track.

Before this change, the MIDI output for a muscal part ending in a rest
was marked as ending at the beginning of the rest.  Perhaps few people
care, but it bothered me.

Also, use Moments rather than ticks in the Audio_staff interface because
ticks are a detail of MIDI.

Please review this at https://codereview.appspot.com/340980043/

Affected files (+46, -10 lines):
  M lily/audio-staff.cc
  M lily/control-track-performer.cc
  M lily/include/audio-staff.hh
  M lily/include/midi-chunk.hh
  M lily/include/midi-item.hh
  M lily/include/midi-walker.hh
  M lily/midi-chunk.cc
  M lily/midi-walker.cc
  M lily/performance.cc
  M lily/staff-performer.cc


Index: lily/audio-staff.cc
diff --git a/lily/audio-staff.cc b/lily/audio-staff.cc
index 0e2c8205ba5766845aa66908cd9667575afc8328..2ed1c57731813a164b5e5177e7394d05eb0968de 100644
--- a/lily/audio-staff.cc
+++ b/lily/audio-staff.cc
@@ -20,6 +20,7 @@
 #include "audio-staff.hh"

 #include "midi-chunk.hh"
+#include "midi-item.hh"
 #include "midi-stream.hh"
 #include "midi-walker.hh"

@@ -35,15 +36,16 @@ Audio_staff::Audio_staff ()
 }

 void
-Audio_staff::output (Midi_stream &midi_stream, int track, bool port, int start_tick)
+Audio_staff::output (Midi_stream &midi_stream, int track, bool port,
+                     Moment start_mom)
 {
   Midi_track midi_track (track, port);

-  Midi_walker i (this, &midi_track, start_tick);
+  Midi_walker i (this, &midi_track, moment_to_ticks (start_mom));
   for (; i.ok (); i++)
     i.process ();

-  i.finalize ();
+  i.finalize (moment_to_ticks (end_mom_));

   midi_stream.write (midi_track);
 }
Index: lily/control-track-performer.cc
diff --git a/lily/control-track-performer.cc b/lily/control-track-performer.cc index 3846e3102da6c8c0ce2572480ee49d878b70efd9..8ca59ebed5c12b472292205f64b1cdc701bfbdad 100644
--- a/lily/control-track-performer.cc
+++ b/lily/control-track-performer.cc
@@ -19,6 +19,7 @@ protected:

   virtual void initialize ();
   virtual void acknowledge_audio_element (Audio_element_info info);
+  virtual void finalize ();
 };

 Control_track_performer::Control_track_performer (Context *c)
@@ -67,6 +68,12 @@ Control_track_performer::initialize ()
   add_text (Audio_text::TEXT, id_string);
 }

+void
+Control_track_performer::finalize ()
+{
+  control_track_->end_mom_ = now_mom ();
+}
+
 void
 Control_track_performer::boot ()
 {
Index: lily/include/audio-staff.hh
diff --git a/lily/include/audio-staff.hh b/lily/include/audio-staff.hh
index a4a9d8a0d1386a9fc87e2446ba107fecefb2f54a..8a591f5dc6928dd6428021ada43757a205d1e4aa 100644
--- a/lily/include/audio-staff.hh
+++ b/lily/include/audio-staff.hh
@@ -22,15 +22,18 @@

 #include "std-vector.hh"
 #include "lily-proto.hh"
+#include "moment.hh"
 #include "audio-element.hh"

 struct Audio_staff : public Audio_element
 {
   void add_audio_item (Audio_item *ai);
- void output (Midi_stream &midi_stream_r, int track, bool port, int start_tick);
+  void output (Midi_stream &midi_stream_r, int track, bool port,
+               Moment start_mom);

   Audio_staff ();

+  Moment end_mom_;
   bool percussion_;
   bool merge_unisons_;
   vector<Audio_item *> audio_items_;
Index: lily/include/midi-chunk.hh
diff --git a/lily/include/midi-chunk.hh b/lily/include/midi-chunk.hh
index 0786a4871d9678dca3894d4ade297405ca8c6493..8927add2c197458e98ca4caa5345631e34ff515e 100644
--- a/lily/include/midi-chunk.hh
+++ b/lily/include/midi-chunk.hh
@@ -76,6 +76,7 @@ public:

   void add (int, Midi_item *midi);
   virtual string data_string () const;
+  void push_back (int, Midi_item *midi);
 };

 #endif /* MIDI_CHUNK_HH */
Index: lily/include/midi-item.hh
diff --git a/lily/include/midi-item.hh b/lily/include/midi-item.hh
index 57bb2d4da22eb4d7840b0b85b0ac87d9a07a61d8..f2b72b566ee8b44ae261fcb3f15aaa24f34ff036 100644
--- a/lily/include/midi-item.hh
+++ b/lily/include/midi-item.hh
@@ -43,6 +43,16 @@ public:
   virtual string to_string () const = 0;
 };

+class Midi_end_of_track : public Midi_item
+{
+public:
+  virtual string to_string () const
+  {
+    // the literal string's terminating null is part of the MIDI command
+    return string ("\xff\x2f", 3);
+  }
+};
+
 class Midi_channel_item : public Midi_item
 {
 public:
Index: lily/include/midi-walker.hh
diff --git a/lily/include/midi-walker.hh b/lily/include/midi-walker.hh
index f23b7407e89aa8e59f05ff76fe3d307389e8e438..eedf3f8e0d79b0d37390c19c6015a0e24dac889f 100644
--- a/lily/include/midi-walker.hh
+++ b/lily/include/midi-walker.hh
@@ -45,7 +45,7 @@ public:
   void process ();
   void operator ++(int);
   bool ok () const;
-  void finalize ();
+  void finalize (int end_tick);

 private:
   void do_start_note (Midi_note *note);
Index: lily/midi-chunk.cc
diff --git a/lily/midi-chunk.cc b/lily/midi-chunk.cc
index aed9e2b7ddf7bc6fd2ceec5e1cd5a1c8bc92c8cd..c9bc35e0452202530aaa832829b55fb7ed36d7d3 100644
--- a/lily/midi-chunk.cc
+++ b/lily/midi-chunk.cc
@@ -62,10 +62,15 @@ Midi_track::Midi_track (int number, bool port)
       data_string += String_convert::hex2bin (port);
     }

-  char const *footer_str0 = "00" "ff2f" "00";
-  string footer_string = String_convert::hex2bin (footer_str0);
+  set ("MTrk", data_string, "");
+}

-  set ("MTrk", data_string, footer_string);
+void
+Midi_track::push_back (int delta_ticks, Midi_item *midi)
+{
+  assert (delta_ticks >= 0);
+  Midi_event *e = new Midi_event (delta_ticks, midi);
+  events_.push_back (e);
 }

 void
Index: lily/midi-walker.cc
diff --git a/lily/midi-walker.cc b/lily/midi-walker.cc
index d9765c681450931fe85acca5c81213a90a153001..c54bc6a6b458391e91a47812064fc9803d29ae2a 100644
--- a/lily/midi-walker.cc
+++ b/lily/midi-walker.cc
@@ -71,9 +71,11 @@ Midi_walker::~Midi_walker ()
 }

 void
-Midi_walker::finalize ()
+Midi_walker::finalize (int end_tick)
 {
   do_stop_notes (INT_MAX);
+  int delta_ticks = (end_tick >= last_tick_) ? (end_tick - last_tick_) : 0;
+  track_->push_back (delta_ticks, new Midi_end_of_track ());
 }

 /**
Index: lily/performance.cc
diff --git a/lily/performance.cc b/lily/performance.cc
index 9f840efd2524eedc28e7204a13d5c5f47d97a958..c727c2c8f7270be3443518e5cdbc1061b40be4c5 100644
--- a/lily/performance.cc
+++ b/lily/performance.cc
@@ -101,7 +101,7 @@ Performance::output (Midi_stream &midi_stream,
           text->text_string_ = performance_name;
         }
       debug_output ("[" + ::to_string (i), true);
-      s->output (midi_stream, i, ports_, moment_to_ticks (start_mom));
+      s->output (midi_stream, i, ports_, start_mom);
       debug_output ("]", false);
     }
 }
Index: lily/staff-performer.cc
diff --git a/lily/staff-performer.cc b/lily/staff-performer.cc
index 1af71efd86db801f06c6b6222e8e7d73e8eae730..3f4094a35012aa96c1d0339ef872945a195bec86 100644
--- a/lily/staff-performer.cc
+++ b/lily/staff-performer.cc
@@ -214,6 +214,12 @@ Staff_performer::stop_translation_timestep ()
 void
 Staff_performer::finalize ()
 {
+  for (map<string, Audio_staff *>::iterator i = staff_map_.begin ();
+       i != staff_map_.end (); ++i)
+    {
+      i->second->end_mom_ = now_mom ();
+    }
+
   staff_map_.clear ();
   channel_map_.clear ();
   if (staff_performer_count_)





reply via email to

[Prev in Thread] Current Thread [Next in Thread]