From 7b58ea045f6b6b7381f777cfcedd47660f9058ea Mon Sep 17 00:00:00 2001 From: Devon Schudy Date: Mon, 10 Mar 2014 12:20:37 -0400 Subject: [PATCH] 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). --- lily/audio-staff.cc | 4 ++-- lily/include/audio-staff.hh | 2 +- lily/include/midi-walker.hh | 2 +- lily/midi-walker.cc | 6 ++++-- lily/performance.cc | 10 +++++++++- 5 files changed, 17 insertions(+), 7 deletions(-) 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_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); } } -- 2.39.5