X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_audio_import.cc;h=1e8d157f14f1e133023aac9be5361b1537ba5b8c;hb=0310f8997147cc50600a98f05ef1a6c486e688c7;hp=8e2e476d15727095e70947d474640b78b26fa3c7;hpb=cd64f17a9c5442befd32fc52317a44e4ed288b82;p=ardour.git diff --git a/gtk2_ardour/editor_audio_import.cc b/gtk2_ardour/editor_audio_import.cc index 8e2e476d15..1e8d157f14 100644 --- a/gtk2_ardour/editor_audio_import.cc +++ b/gtk2_ardour/editor_audio_import.cc @@ -39,6 +39,7 @@ #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" @@ -262,7 +263,7 @@ Editor::get_nth_selected_midi_track (int nth) const } void -Editor::import_smf_tempo_map (Evoral::SMF const & smf) +Editor::import_smf_tempo_map (Evoral::SMF const & smf, framepos_t pos) { if (!_session) { return; @@ -276,22 +277,33 @@ Editor::import_smf_tempo_map (Evoral::SMF const & smf) const framecnt_t sample_rate = _session->frame_rate (); TempoMap new_map (sample_rate); - bool have_meter = false; + 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 (60 * (1000000 / t->microseconds_per_quarter_note), 4.0); - new_map.add_tempo (tempo, (t->time_pulses/smf.ppqn()) / 4.0, 0, TempoSection::Constant, MusicTime); - + 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_meter) { - bbt = new_map.bbt_at_beat ((t->time_pulses/smf.ppqn())); + + 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; + } - new_map.add_meter (meter, t->time_pulses, bbt, MusicTime); + + last_meter = meter; cerr << "@ " << t->time_pulses/smf.ppqn() << " (" << t->time_seconds << ") Add T " << tempo << " M " << meter << endl; @@ -329,7 +341,7 @@ Editor::do_import (vector paths, continue; } if (smf.num_tempos() > 0) { - import_smf_tempo_map (smf); + import_smf_tempo_map (smf, pos); smf.close (); break; } @@ -617,7 +629,7 @@ Editor::embed_sndfiles (vector paths, SoundFileInfo finfo; CursorContext::Handle cursor_ctx = CursorContext::create(*this, _cursors->wait); - gdk_flush (); + gdk_flush (); for (vector::iterator p = paths.begin(); p != paths.end(); ++p) { @@ -901,33 +913,33 @@ Editor::add_sources (vector paths, boost::shared_ptr ar = boost::dynamic_pointer_cast (*r); if (use_timestamp) { - if (ar) { - - /* get timestamp for this region */ - - const boost::shared_ptr s (ar->sources().front()); - const boost::shared_ptr as = boost::dynamic_pointer_cast (s); - - assert (as); - - if (as->natural_position() != 0) { - pos = as->natural_position(); - } else if (target_tracks == 1) { - /* hmm, no timestamp available, put it after the previous region - */ - if (n == 0) { - pos = get_preferred_edit_position (); - } else { - pos += rlen; - } - } else { - pos = get_preferred_edit_position (); - } - } else { - /* should really get first position in MIDI file, but for now, use edit position*/ - pos = get_preferred_edit_position (); - } - } + if (ar) { + + /* get timestamp for this region */ + + const boost::shared_ptr s (ar->sources().front()); + const boost::shared_ptr as = boost::dynamic_pointer_cast (s); + + assert (as); + + if (as->natural_position() != 0) { + pos = as->natural_position(); + } else if (target_tracks == 1) { + /* hmm, no timestamp available, put it after the previous region + */ + if (n == 0) { + pos = get_preferred_edit_position (); + } else { + pos += rlen; + } + } else { + pos = get_preferred_edit_position (); + } + } else { + /* should really get first position in MIDI file, but for now, use edit position*/ + pos = get_preferred_edit_position (); + } + } finish_bringing_in_material (*r, input_chan, output_chan, pos, mode, track, track_names[n], instrument); @@ -1017,7 +1029,8 @@ Editor::finish_bringing_in_material (boost::shared_ptr region, } else if (mr) { list > mt ( _session->new_midi_track (ChanCount (DataType::MIDI, 1), - ChanCount (DataType::MIDI, 1), + ChanCount (DataType::MIDI, 1), + Config->get_strict_io () || Profile->get_mixbus (), instrument, (Plugin::PresetRecord*) 0, (RouteGroup*) 0, 1, @@ -1027,11 +1040,6 @@ Editor::finish_bringing_in_material (boost::shared_ptr region, if (mt.empty()) { return -1; } - if (Config->get_strict_io ()) { - for (list >::iterator i = mt.begin(); i != mt.end(); ++i) { - (*i)->set_strict_io (true); - } - } // TODO set strict_io from preferences existing_track = mt.front();