*/
-#include <set>
-#include <iostream>
#include <algorithm>
+#include <iostream>
+#include <set>
#include <stdexcept>
#include <stdint.h>
-#include "pbd/error.h"
-#include "pbd/enumwriter.h"
+
#include "pbd/compose.h"
+#include "pbd/enumwriter.h"
+#include "pbd/error.h"
+
+#include "evoral/Control.hpp"
+
#include "midi++/events.h"
+#include "ardour/automation_control.h"
+#include "ardour/midi_automation_list_binder.h"
#include "ardour/midi_model.h"
#include "ardour/midi_source.h"
#include "ardour/midi_state_tracker.h"
-#include "ardour/smf_source.h"
-#include "ardour/types.h"
#include "ardour/session.h"
-#include "ardour/midi_automation_list_binder.h"
+#include "ardour/types.h"
#include "i18n.h"
unsigned int note;
XMLProperty* prop;
unsigned int channel;
- unsigned int time;
- unsigned int length;
+ MidiModel::TimeType time;
+ MidiModel::TimeType length;
unsigned int velocity;
gint id;
{
ReadLock lock(read_lock());
MidiStateTracker mst;
- Evoral::MusicalTime extra_note_on_time = end_time;
const bool old_percussive = percussive();
set_percussive(false);
if (mev->is_note_off()) {
if (!mst.active (mev->note(), mev->channel())) {
-
- /* add a note-on at the start of the range we're writing
- to the file. velocity is just an arbitary reasonable value.
+ /* the matching note-on was outside the
+ time range we were given, so just
+ ignore this note-off.
*/
-
- Evoral::MIDIEvent<Evoral::MusicalTime> on (mev->event_type(), extra_note_on_time, 3, 0, true);
- on.set_type (mev->type());
- on.set_note (mev->note());
- on.set_channel (mev->channel());
- on.set_velocity (mev->velocity());
-
- cerr << "Add note on for odd note off, note = " << (int) on.note() << endl;
- source->append_event_unlocked_beats (on);
- mst.add (on.note(), on.channel());
- mst.dump (cerr);
- extra_note_on_time += 1.0/128.0;
+ continue;
}
- cerr << "MIDI Note off (note = " << (int) mev->note() << endl;
source->append_event_unlocked_beats (*i);
mst.remove (mev->note(), mev->channel());
- mst.dump (cerr);
} else if (mev->is_note_on()) {
- cerr << "MIDI Note on (note = " << (int) mev->note() << endl;
mst.add (mev->note(), mev->channel());
source->append_event_unlocked_beats(*i);
- mst.dump (cerr);
} else {
- cerr << "MIDI other event type\n";
source->append_event_unlocked_beats(*i);
}
}
return _midi_source.lock ();
}
-/** Moves notes, controllers and sys-ex to insert silence at the start of the model.
+/** Moves notes, patch changes, controllers and sys-ex to insert silence at the start of the model.
* Adds commands to the session's current undo stack to reflect the movements.
*/
void
apply_command_as_subcommand (s->session(), c);
}
+ /* Patch changes */
+
+ if (!patch_changes().empty ()) {
+ PatchChangeDiffCommand* c = new_patch_change_diff_command ("insert silence");
+
+ for (PatchChanges::const_iterator i = patch_changes().begin(); i != patch_changes().end(); ++i) {
+ c->change_time (*i, (*i)->time() + t);
+ }
+
+ apply_command_as_subcommand (s->session(), c);
+ }
+
/* Controllers */
for (Controls::iterator i = controls().begin(); i != controls().end(); ++i) {
apply_command (s->session (), c);
}
+
+void
+MidiModel::control_list_marked_dirty ()
+{
+ AutomatableSequence<Evoral::MusicalTime>::control_list_marked_dirty ();
+
+ ContentsChanged (); /* EMIT SIGNAL */
+}