X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_pt_import.cc;h=55c3b0b43c9782009aa3e616ad7d2823dfe3dba2;hb=a61ae46c82616eff3ec1f8dd1e1385cad227d25e;hp=23a6fd2f066f939223068b564a5040d67166063e;hpb=f03252cf884d5286e73fdf588a3992efc053f3dc;p=ardour.git diff --git a/gtk2_ardour/editor_pt_import.cc b/gtk2_ardour/editor_pt_import.cc index 23a6fd2f06..55c3b0b43c 100644 --- a/gtk2_ardour/editor_pt_import.cc +++ b/gtk2_ardour/editor_pt_import.cc @@ -29,13 +29,12 @@ #include "pbd/shortpath.h" #include "pbd/stateful_diff_command.h" -#include - #include "ardour/audio_track.h" #include "ardour/audiofilesource.h" #include "ardour/audioregion.h" #include "ardour/midi_region.h" #include "ardour/midi_track.h" +#include "ardour/midi_model.h" #include "ardour/operations.h" #include "ardour/region_factory.h" #include "ardour/smf_source.h" @@ -60,7 +59,7 @@ #include "mouse_cursors.h" #include "editor_cursors.h" -#include "i18n.h" +#include "pbd/i18n.h" using namespace std; using namespace ARDOUR; @@ -179,11 +178,25 @@ Editor::do_ptimport (std::string ptpath, msg.run (); } + // Create a dummy midi track first to get a midi Source + list > mt ( + _session->new_midi_track (ChanCount (DataType::MIDI, 1), + ChanCount (DataType::MIDI, 1), + true, + instrument, (Plugin::PresetRecord*) 0, + (RouteGroup*) 0, + 1, + string(), + PresentationInfo::max_order)); + if (mt.empty()) { + return; + } + for (vector::iterator a = ptf.regions.begin(); a != ptf.regions.end(); ++a) { for (vector::iterator p = ptfwavpair.begin(); p != ptfwavpair.end(); ++p) { - if (p->index1 == a->wave.index) { + if ((p->index1 == a->wave.index) && (strcmp(a->wave.filename.c_str(), "") != 0)) { for (SourceList::iterator x = imported.begin(); x != imported.end(); ++x) { if ((*x)->id() == p->id) { @@ -212,6 +225,42 @@ Editor::do_ptimport (std::string ptpath, } } } + if (strcmp(a->wave.filename.c_str(), "") == 0) { + /* Empty wave - assume MIDI region */ + boost::shared_ptr midi_track = mt.back(); + boost::shared_ptr playlist = midi_track->playlist(); + framepos_t f = (framepos_t)a->startpos; + framecnt_t length = (framecnt_t)a->length; + MusicFrame pos (f, 0); + boost::shared_ptr src = _session->create_midi_source_by_stealing_name (midi_track); + PropertyList plist; + plist.add (ARDOUR::Properties::start, 0); + plist.add (ARDOUR::Properties::length, length); + plist.add (ARDOUR::Properties::name, PBD::basename_nosuffix(src->name())); + boost::shared_ptr region = (RegionFactory::create (src, plist)); + /* sets beat position */ + region->set_position (pos.frame, pos.division); + midi_track->playlist()->add_region (region, pos.frame, 1.0, false, pos.division); + + boost::shared_ptr mr = boost::dynamic_pointer_cast(region); + boost::shared_ptr mm = mr->midi_source(0)->model(); + MidiModel::NoteDiffCommand *midicmd; + midicmd = mm->new_note_diff_command ("Import ProTools MIDI"); + + for (vector::iterator + j = a->midi.begin(); + j != a->midi.end(); ++j) { + Evoral::Beats start = (Evoral::Beats)(j->pos/960000.); + Evoral::Beats len = (Evoral::Beats)(j->length/960000.); + // PT C-2 = 0, Ardour C-1 = 0, subtract twelve to convert... + midicmd->add(boost::shared_ptr > + (new Evoral::Note( (uint8_t)1, start, len, j->note - 12, j->velocity ))); + } + mm->apply_command (_session, midicmd); + boost::shared_ptr copy (RegionFactory::create (mr, true)); + playlist->clear_changes (); + playlist->add_region (copy, a->startpos); + } } boost::shared_ptr existing_track; @@ -244,7 +293,7 @@ Editor::do_ptimport (std::string ptpath, } else { // Put on a new track DEBUG_TRACE (DEBUG::FileUtils, string_compose ("\twav(%1) reg(%2) new_tr(%3)\n", a->reg.wave.filename.c_str(), a->reg.index, nth)); - list > at (_session->new_audio_track (1, 2, Normal, 0, 1)); + list > at (_session->new_audio_track (1, 2, 0, 1, string(), PresentationInfo::max_order, Normal)); if (at.empty()) { return; }