[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_)
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- Issue 5299: Place the MIDI end-of-track event (issue 340980043 by address@hidden),
nine . fierce . ballads <=