13
0

use SMF track or instrument names in imported MIDI track names, if requested

This commit is contained in:
Paul Davis 2016-12-14 11:44:40 +00:00
parent 6ea7f37c6b
commit f3b3a411d0
2 changed files with 32 additions and 9 deletions

View File

@ -258,7 +258,8 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
*/
RouteList new_route_from_template (uint32_t how_many, PresentationInfo::order_t insert_at, const std::string& template_path, const std::string& name, PlaylistDisposition pd = NewPlaylist);
RouteList new_route_from_template (uint32_t how_many, PresentationInfo::order_t insert_at, XMLNode&, const std::string& name, PlaylistDisposition pd = NewPlaylist);
std::vector<std::string> get_paths_for_new_sources (bool allow_replacing, const std::string& import_file_path, uint32_t channels);
std::vector<std::string> get_paths_for_new_sources (bool allow_replacing, const std::string& import_file_path,
uint32_t channels, std::vector<std::string> const & smf_track_names);
int bring_all_sources_into_session (boost::function<void(uint32_t,uint32_t,std::string)> callback);

View File

@ -118,7 +118,9 @@ open_importable_source (const string& path, framecnt_t samplerate, ARDOUR::SrcQu
}
vector<string>
Session::get_paths_for_new_sources (bool /*allow_replacing*/, const string& import_file_path, uint32_t channels)
Session::get_paths_for_new_sources (bool /*allow_replacing*/, const string& import_file_path, uint32_t channels,
vector<string> const & smf_track_names)
{
vector<string> new_paths;
const string basename = basename_nosuffix (import_file_path);
@ -129,13 +131,19 @@ Session::get_paths_for_new_sources (bool /*allow_replacing*/, const string& impo
string filepath;
switch (type) {
case DataType::MIDI:
if (channels > 1) {
string mchn_name = string_compose ("%1-t%2", basename, n);
filepath = new_midi_source_path (mchn_name);
case DataType::MIDI:
assert (smf_track_names.empty() || smf_track_names.size() == channels);
if (channels > 1) {
string mchn_name;
if (smf_track_names.empty() || smf_track_names[n].empty()) {
mchn_name = string_compose ("%1-t%2", basename, n);
} else {
filepath = new_midi_source_path (basename);
mchn_name = string_compose ("%1-%2", basename, smf_track_names[n]);
}
filepath = new_midi_source_path (mchn_name);
} else {
filepath = new_midi_source_path (basename);
}
break;
case DataType::AUDIO:
filepath = new_audio_source_path (basename, channels, n, false, false);
@ -484,6 +492,7 @@ Session::import_files (ImportStatus& status)
boost::shared_ptr<AudioFileSource> afs;
boost::shared_ptr<SMFSource> smfs;
uint32_t channels = 0;
vector<string> smf_names;
status.sources.clear ();
@ -508,12 +517,25 @@ Session::import_files (ImportStatus& status)
} else {
try {
smf_reader = std::auto_ptr<Evoral::SMF>(new Evoral::SMF());
smf_reader->open(*p);
if (smf_reader->open(*p)) {
throw Evoral::SMF::FileError (*p);
}
if (smf_reader->is_type0 () && status.split_midi_channels) {
channels = smf_reader->channels().size();
} else {
channels = smf_reader->num_tracks();
switch (status.midi_track_name_source) {
case SMFTrackNumber:
break;
case SMFTrackName:
smf_reader->track_names (smf_names);
break;
case SMFInstrumentName:
smf_reader->instrument_names (smf_names);
break;
}
}
} catch (...) {
error << _("Import: error opening MIDI file") << endmsg;
@ -527,7 +549,7 @@ Session::import_files (ImportStatus& status)
continue;
}
vector<string> new_paths = get_paths_for_new_sources (status.replace_existing_source, *p, channels);
vector<string> new_paths = get_paths_for_new_sources (status.replace_existing_source, *p, channels, smf_names);
Sources newfiles;
framepos_t natural_position = source ? source->natural_position() : 0;