diff options
author | David Robillard <d@drobilla.net> | 2009-02-14 20:52:15 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2009-02-14 20:52:15 +0000 |
commit | 80e54c6ea05d35465f50f84897f113e0a48b7afd (patch) | |
tree | 8a70fa384c75569291c0a96bb6c27ffb57189fee /libs/ardour/import.cc | |
parent | b0091c899bfc868de6a19af2f0cc74abca7fe173 (diff) |
MIDI robustness.
- Separate SMF::open and SMF::create, more powerful interface for both.
- Correctly handle note ons with velocity 0 as note offs in sequence.
- Use SMF (i.e. libsmf) for MIDI import
git-svn-id: svn://localhost/ardour2/branches/3.0@4558 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/import.cc')
-rw-r--r-- | libs/ardour/import.cc | 45 |
1 files changed, 28 insertions, 17 deletions
diff --git a/libs/ardour/import.cc b/libs/ardour/import.cc index 76975d8237..97cebf1456 100644 --- a/libs/ardour/import.cc +++ b/libs/ardour/import.cc @@ -37,7 +37,7 @@ #include <pbd/basename.h> #include <pbd/convert.h> -#include <evoral/SMFReader.hpp> +#include <evoral/SMF.hpp> #include <ardour/ardour.h> #include <ardour/session.h> @@ -309,10 +309,11 @@ write_audio_data_to_new_files (ImportableSource* source, Session::import_status& } static void -write_midi_data_to_new_files (Evoral::SMFReader* source, Session::import_status& status, +write_midi_data_to_new_files (Evoral::SMF<double>* source, Session::import_status& status, vector<boost::shared_ptr<Source> >& newfiles) { - Evoral::Event<double> ev(0, 0.0, 4, NULL, true); + uint32_t buf_size = 4; + uint8_t* buf = (uint8_t*)malloc(buf_size); status.progress = 0.0f; @@ -329,15 +330,28 @@ write_midi_data_to_new_files (Evoral::SMFReader* source, Session::import_status& uint32_t size = 0; while (!status.cancel) { + size = buf_size; - if (source->read_event(4, ev.buffer(), &size, &delta_t) < 0) - break; + int ret = source->read_event(&delta_t, &size, &buf); + if (size > buf_size) + buf_size = size; + if (ret < 0) { // EOT + break; + } + t += delta_t; - ev.time() = (double)t / (double)source->ppqn(); - ev.size() = size; - smfs->append_event_unlocked(Beats, ev); + if (ret == 0) { // Meta + continue; + } + + smfs->append_event_unlocked(Beats, Evoral::Event<double>( + 0, + (double)t / (double)source->ppqn(), + size, + buf)); + if (status.progress < 0.99) status.progress += 0.01; } @@ -358,7 +372,7 @@ write_midi_data_to_new_files (Evoral::SMFReader* source, Session::import_status& } } catch (...) { - error << "Corrupt MIDI file " << source->filename() << endl; + error << "Corrupt MIDI file " << source->path() << endl; } } @@ -388,8 +402,8 @@ Session::import_audiofiles (import_status& status) p != status.paths.end() && !status.cancel; ++p, ++cnt) { - boost::shared_ptr<ImportableSource> source; - std::auto_ptr<Evoral::SMFReader> smf_reader; + boost::shared_ptr<ImportableSource> source; + std::auto_ptr< Evoral::SMF<double> > smf_reader; const DataType type = ((*p).rfind(".mid") != string::npos) ? DataType::MIDI : DataType::AUDIO; @@ -405,14 +419,11 @@ Session::import_audiofiles (import_status& status) } else { try { - smf_reader = std::auto_ptr<Evoral::SMFReader>(new Evoral::SMFReader(*p)); + smf_reader = std::auto_ptr< Evoral::SMF<double> >(new Evoral::SMF<double>()); + smf_reader->open(*p); channels = smf_reader->num_tracks(); - } catch (const Evoral::SMFReader::UnsupportedTime& err) { - error << _("Import: unsupported MIDI time stamp format") << endmsg; - status.done = status.cancel = true; - return; } catch (...) { - error << _("Import: error reading MIDI file") << endmsg; + error << _("Import: error opening MIDI file") << endmsg; status.done = status.cancel = true; return; } |