X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=libs%2Fardour%2Fmidi_model.cc;h=40d2f600c881f0b0a34824e28c753fbe852432f4;hb=204baa31d842d4c2f833d319b6fa55e402a1bfb8;hp=b6500563ba46604a376bd43548cf42baba6efb5a;hpb=a473d630eb165272992e90f8d854b1d66ec0be63;p=ardour.git diff --git a/libs/ardour/midi_model.cc b/libs/ardour/midi_model.cc index b6500563ba..40d2f600c8 100644 --- a/libs/ardour/midi_model.cc +++ b/libs/ardour/midi_model.cc @@ -18,23 +18,28 @@ */ -#include -#include #include +#include +#include #include #include -#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/session.h" #include "ardour/smf_source.h" #include "ardour/types.h" -#include "ardour/session.h" -#include "ardour/midi_automation_list_binder.h" #include "i18n.h" @@ -503,8 +508,8 @@ MidiModel::NoteDiffCommand::unmarshal_note (XMLNode *xml_note) 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; @@ -1415,7 +1420,6 @@ MidiModel::write_section_to (boost::shared_ptr source, Evoral::Music { ReadLock lock(read_lock()); MidiStateTracker mst; - Evoral::MusicalTime extra_note_on_time = end_time; const bool old_percussive = percussive(); set_percussive(false); @@ -1442,36 +1446,20 @@ MidiModel::write_section_to (boost::shared_ptr source, Evoral::Music 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 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); } } @@ -1880,7 +1868,7 @@ MidiModel::midi_source () 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 @@ -1901,6 +1889,18 @@ MidiModel::insert_silence_at_start (TimeType t) 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) { @@ -1963,3 +1963,11 @@ MidiModel::transpose (TimeType from, TimeType to, int semitones) apply_command (s->session (), c); } + +void +MidiModel::control_list_marked_dirty () +{ + AutomatableSequence::control_list_marked_dirty (); + + ContentsChanged (); /* EMIT SIGNAL */ +}