Switch CDFrame grid to use MinSec ruler rather than Sample ruler.
[ardour.git] / gtk2_ardour / editor_pt_import.cc
index 2b659e0369d509417f7a6ffe179acaaeb08a79d0..79dfa22f3af6e8933d9fa43896608ef39b01badf 100644 (file)
 #include "pbd/shortpath.h"
 #include "pbd/stateful_diff_command.h"
 
-#include <gtkmm2ext/choice.h>
-
 #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"
@@ -123,12 +122,12 @@ Editor::do_ptimport (std::string ptpath,
        bool ok = false;
        bool onefailed = false;
        PTFFormat ptf;
-       framepos_t pos = -1;
+       samplepos_t pos = -1;
 
        vector<ptflookup_t> ptfwavpair;
        vector<ptflookup_t> ptfregpair;
 
-       if (ptf.load(ptpath, _session->frame_rate()) == -1) {
+       if (ptf.load(ptpath, _session->sample_rate()) == -1) {
                MessageDialog msg (_("Doesn't seem to be a valid PT session file"));
                msg.run ();
                return;
@@ -179,11 +178,25 @@ Editor::do_ptimport (std::string ptpath,
                msg.run ();
        }
 
+       // Create a dummy midi track first to get a midi Source
+       list<boost::shared_ptr<MidiTrack> > 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<PTFFormat::region_t>::iterator a = ptf.regions.begin();
                        a != ptf.regions.end(); ++a) {
                for (vector<ptflookup_t>::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<MidiTrack> midi_track = mt.back();
+                       boost::shared_ptr<Playlist> playlist = midi_track->playlist();
+                       samplepos_t f = (samplepos_t)a->startpos;
+                       samplecnt_t length = (samplecnt_t)a->length;
+                       MusicSample pos (f, 0);
+                       boost::shared_ptr<Source> 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> region = (RegionFactory::create (src, plist));
+                       /* sets beat position */
+                       region->set_position (pos.sample, pos.division);
+                       midi_track->playlist()->add_region (region, pos.sample, 1.0, false, pos.division);
+
+                       boost::shared_ptr<MidiRegion> mr = boost::dynamic_pointer_cast<MidiRegion>(region);
+                       boost::shared_ptr<MidiModel> mm = mr->midi_source(0)->model();
+                       MidiModel::NoteDiffCommand *midicmd;
+                       midicmd = mm->new_note_diff_command ("Import ProTools MIDI");
+
+                       for (vector<PTFFormat::midi_ev_t>::iterator
+                                       j = a->midi.begin();
+                                       j != a->midi.end(); ++j) {
+                               Temporal::Beats start = (Temporal::Beats)(j->pos/960000.);
+                               Temporal::Beats len = (Temporal::Beats)(j->length/960000.);
+                               // PT C-2 = 0, Ardour C-1 = 0, subtract twelve to convert...
+                               midicmd->add(boost::shared_ptr<Evoral::Note<Temporal::Beats> >
+                                       (new Evoral::Note<Temporal::Beats>( (uint8_t)1, start, len, j->note - 12, j->velocity )));
+                       }
+                       mm->apply_command (_session, midicmd);
+                       boost::shared_ptr<Region> copy (RegionFactory::create (mr, true));
+                       playlist->clear_changes ();
+                       playlist->add_region (copy, a->startpos);
+               }
        }
 
        boost::shared_ptr<AudioTrack> existing_track;