+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;
+}
+