#include "ardour/midi_region.h"
#include "ardour/midi_track.h"
#include "ardour/operations.h"
+#include "ardour/profile.h"
#include "ardour/region_factory.h"
#include "ardour/smf_source.h"
#include "ardour/source_factory.h"
#include "mouse_cursors.h"
#include "editor_cursors.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
return mtv->midi_track();
}
+void
+Editor::import_smf_tempo_map (Evoral::SMF const & smf, framepos_t pos)
+{
+ if (!_session) {
+ return;
+ }
+
+ const size_t num_tempos = smf.num_tempos ();
+
+ if (num_tempos == 0) {
+ return;
+ }
+
+ const framecnt_t sample_rate = _session->frame_rate ();
+ TempoMap new_map (sample_rate);
+ Meter last_meter (4.0, 4.0);
+ bool have_initial_meter = false;
+
+ for (size_t n = 0; n < num_tempos; ++n) {
+
+ Evoral::SMF::Tempo* t = smf.nth_tempo (n);
+ assert (t);
+
+ Tempo tempo (t->tempo(), 32.0 / (double) t->notes_per_note);
+ Meter meter (t->numerator, t->denominator);
+ Timecode::BBT_Time bbt; /* 1|1|0 which is correct for the no-meter case */
+
+ if (have_initial_meter) {
+ new_map.add_tempo (tempo, (t->time_pulses/smf.ppqn()) / 4.0, 0, MusicTime);
+ if (!(meter == last_meter)) {
+ bbt = new_map.bbt_at_quarter_note ((t->time_pulses/smf.ppqn()));
+ new_map.add_meter (meter, t->time_pulses, bbt, 0, MusicTime);
+ }
+
+ } else {
+ new_map.replace_meter (new_map.meter_section_at_frame (0), meter, bbt, pos, AudioTime);
+ new_map.replace_tempo (new_map.tempo_section_at_frame (0), tempo, 0.0, pos, AudioTime);
+ have_initial_meter = true;
+
+ }
+
+ last_meter = meter;
+
+ cerr << "@ " << t->time_pulses/smf.ppqn() << " ("
+ << t->time_seconds << ") Add T " << tempo << " M " << meter << endl;
+ }
+
+ cerr << "NEW MAP:\n";
+ new_map.dump (cerr);
+
+ _session->tempo_map() = new_map;
+}
+
void
Editor::do_import (vector<string> paths,
ImportDisposition disposition,
ImportMode mode,
SrcQuality quality,
+ MidiTrackNameSource midi_track_name_source,
+ MidiTempoMapDisposition smf_tempo_disposition,
framepos_t& pos,
ARDOUR::PluginInfoPtr instrument)
{
int nth = 0;
bool use_timestamp = (pos == -1);
+ if (smf_tempo_disposition == SMFTempoUse) {
+ /* Find the first MIDI file with a tempo map, and import it
+ before we do anything else.
+ */
+
+ for (vector<string>::iterator a = paths.begin(); a != paths.end(); ++a) {
+ Evoral::SMF smf;
+ if (smf.open (*a)) {
+ continue;
+ }
+ if (smf.num_tempos() > 0) {
+ import_smf_tempo_map (smf, pos);
+ smf.close ();
+ break;
+ }
+ smf.close ();
+ }
+ }
+
current_interthread_info = &import_status;
import_status.current = 1;
import_status.total = paths.size ();
import_status.all_done = false;
+ import_status.midi_track_name_source = midi_track_name_source;
ImportProgressWindow ipw (&import_status, _("Import"), _("Cancel Import"));
import_status.freeze = false;
import_status.quality = quality;
import_status.replace_existing_source = replace;
+ import_status.split_midi_channels = (disposition == Editing::ImportDistinctChannels);
import_status.mode = mode;
import_status.pos = pos;
gtk_main_iteration ();
}
- import_status.done = true;
+ // wait for thread to terminate
+ while (!import_status.done) {
+ gtk_main_iteration ();
+ }
int result = -1;
if (use_timestamp && boost::dynamic_pointer_cast<AudioRegion>(r)) {
boost::dynamic_pointer_cast<AudioRegion>(r)->special_set_position(sources[0]->natural_position());
- }
+ }
regions.push_back (r);
{
if (!existing_track) {
if (ar) {
- list<boost::shared_ptr<AudioTrack> > at (_session->new_audio_track (in_chans, out_chans, Normal, 0, 1));
+ list<boost::shared_ptr<AudioTrack> > at (_session->new_audio_track (in_chans, out_chans, 0, 1, string(), PresentationInfo::max_order, Normal));
if (at.empty()) {
return -1;
list<boost::shared_ptr<MidiTrack> > mt (
_session->new_midi_track (ChanCount (DataType::MIDI, 1),
ChanCount (DataType::MIDI, 1),
- instrument,
- Normal, 0, 1));
+ Config->get_strict_io () || Profile->get_mixbus (),
+ instrument, (Plugin::PresetRecord*) 0,
+ (RouteGroup*) 0,
+ 1,
+ string(),
+ PresentationInfo::max_order));
if (mt.empty()) {
return -1;
}
- if (Config->get_strict_io ()) {
- for (list<boost::shared_ptr<MidiTrack> >::iterator i = mt.begin(); i != mt.end(); ++i) {
- (*i)->set_strict_io (true);
- }
- }
// TODO set strict_io from preferences
existing_track = mt.front();
return -1;
}
- list<boost::shared_ptr<AudioTrack> > at (_session->new_audio_track (in_chans, out_chans, Destructive));
+ list<boost::shared_ptr<AudioTrack> > at (_session->new_audio_track (in_chans, out_chans, 0, 1, string(), PresentationInfo::max_order, Destructive));
if (!at.empty()) {
boost::shared_ptr<Playlist> playlist = at.front()->playlist();
boost::shared_ptr<Region> copy (RegionFactory::create (region, true));