X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fsfdb_ui.cc;h=fd08e1441962791646963e9bd5e26f46020a6eb8;hb=54fd56de755a44420d906ad660b18c2d671f1057;hp=9e5e65625b3feaf7d696a088043b251bc9d0c9ab;hpb=8ff46aa9c695c89182213a5c05a1c9415322e348;p=ardour.git diff --git a/gtk2_ardour/sfdb_ui.cc b/gtk2_ardour/sfdb_ui.cc index 9e5e65625b..fd08e14419 100644 --- a/gtk2_ardour/sfdb_ui.cc +++ b/gtk2_ardour/sfdb_ui.cc @@ -21,7 +21,7 @@ #include "gtk2ardour-config.h" #endif -#include "i18n.h" +#include "pbd/i18n.h" #include #include @@ -57,6 +57,7 @@ #include "ardour/session.h" #include "ardour/session_directory.h" #include "ardour/srcfilesource.h" +#include "ardour/profile.h" #include "ardour_ui.h" #include "editing.h" @@ -84,8 +85,24 @@ using std::string; string SoundFileBrowser::persistent_folder; typedef TreeView::Selection::ListHandle_Path ListPath; +static MidiTrackNameSource +string2miditracknamesource (string const & str) +{ + if (str == _("by track number")) { + return SMFTrackNumber; + } else if (str == _("by track name")) { + return SMFTrackName; + } else if (str == _("by instrument name")) { + return SMFInstrumentName; + } + + warning << string_compose (_("programming error: unknown midi track name source string %1"), str) << endmsg; + + return SMFTrackNumber; +} + static ImportMode -string2importmode (string str) +string2importmode (string const & str) { if (str == _("as new tracks")) { return ImportAsTrack; @@ -120,7 +137,7 @@ importmode2string (ImportMode mode) } SoundFileBox::SoundFileBox (bool /*persistent*/) - : table (6, 2), + : table (7, 2), length_clock ("sfboxLengthClock", true, "", false, false, true, false), timecode_clock ("sfboxTimecodeClock", true, "", false, false, false, false), main_box (false, 6), @@ -152,6 +169,8 @@ SoundFileBox::SoundFileBox (bool /*persistent*/) channels.set_alignment (1, 0.5); samplerate.set_text (_("Sample rate:")); samplerate.set_alignment (1, 0.5); + tempomap.set_text (_("Tempo Map:")); + tempomap.set_alignment (1, 0.5); preview_label.set_max_width_chars (50); preview_label.set_ellipsize (Pango::ELLIPSIZE_END); @@ -169,12 +188,14 @@ SoundFileBox::SoundFileBox (bool /*persistent*/) table.attach (format, 0, 1, 2, 4, FILL, FILL); table.attach (length, 0, 1, 4, 5, FILL, FILL); table.attach (timecode, 0, 1, 5, 6, FILL, FILL); + table.attach (tempomap, 0, 1, 6, 7, FILL, FILL); table.attach (channels_value, 1, 2, 0, 1, FILL, FILL); table.attach (samplerate_value, 1, 2, 1, 2, FILL, FILL); table.attach (format_text, 1, 2, 2, 4, FILL, FILL); table.attach (length_clock, 1, 2, 4, 5, FILL, FILL); table.attach (timecode_clock, 1, 2, 5, 6, FILL, FILL); + table.attach (tempomap_value, 1, 2, 6, 7, FILL, FILL); length_clock.set_mode (ARDOUR_UI::instance()->secondary_clock->mode()); timecode_clock.set_mode (AudioClock::Timecode); @@ -303,11 +324,38 @@ SoundFileBox::setup_labels (const string& filename) tags_entry.set_sensitive (false); if (ms) { - channels_value.set_text (to_string(ms->num_tracks(), std::dec)); + if (ms->is_type0()) { + channels_value.set_text (to_string(ms->channels().size(), std::dec)); + } else { + if (ms->num_tracks() > 1) { + channels_value.set_text (to_string(ms->num_tracks(), std::dec) + _("(Tracks)")); + } else { + channels_value.set_text (to_string(ms->num_tracks(), std::dec)); + } + } length_clock.set (ms->length(ms->timeline_position())); + switch (ms->num_tempos()) { + case 0: + tempomap_value.set_text (_("No tempo data")); + break; + case 1: { + Evoral::SMF::Tempo* t = ms->nth_tempo (0); + assert (t); + tempomap_value.set_text (string_compose (_("%1/%2 \u2669 = %3"), + t->numerator, + t->denominator, + t->tempo ())); + break; + } + default: + tempomap_value.set_text (string_compose (_("map with %1 sections"), + ms->num_tempos())); + break; + } } else { channels_value.set_text (""); length_clock.set (0); + tempomap_value.set_text (_("No tempo data")); } if (_session && ms) { @@ -1348,6 +1396,12 @@ SoundFileOmega::reset_options () return false; } + if (have_a_midi_file) { + smf_tempo_btn.show (); + } else { + smf_tempo_btn.hide (); + } + string existing_choice; vector action_strings; @@ -1393,7 +1447,9 @@ SoundFileOmega::reset_options () action_strings.push_back (importmode2string (ImportAsTrack)); action_strings.push_back (importmode2string (ImportAsRegion)); - action_strings.push_back (importmode2string (ImportAsTapeTrack)); + if (!Profile->get_mixbus()) { + action_strings.push_back (importmode2string (ImportAsTapeTrack)); + } existing_choice = action_combo.get_active_text(); @@ -1428,12 +1484,13 @@ SoundFileOmega::reset_options () vector channel_strings; if (mode == ImportAsTrack || mode == ImportAsTapeTrack || mode == ImportToTrack) { - channel_strings.push_back (_("one track per file")); if (selection_includes_multichannel) { channel_strings.push_back (_("one track per channel")); } + channel_strings.push_back (_("one track per file")); + if (paths.size() > 1) { /* tape tracks are a single region per track, so we cannot sequence multiple files. @@ -1569,14 +1626,23 @@ SoundFileOmega::check_info (const vector& paths, bool& same_size, bool& } else if (SMFSource::valid_midi_file (*i)) { Evoral::SMF reader; - reader.open(*i); - if (reader.num_tracks() > 1) { - multichannel = true; // "channel" == track here... - } - /* XXX we need err = true handling here in case - we can't check the file - */ + if (reader.open (*i)) { + err = true; + } else { + if (reader.is_type0 ()) { + if (reader.channels().size() > 1) { + /* for type-0 files, we can split + * "one track per channel" + */ + multichannel = true; + } + } else { + if (reader.num_tracks() > 1) { + multichannel = true; + } + } + } } else { err = true; @@ -1669,6 +1735,7 @@ SoundFileOmega::SoundFileOmega (string title, ARDOUR::Session* s, Editing::ImportMode mode_hint) : SoundFileBrowser (title, s, persistent) , copy_files_btn ( _("Copy files to session")) + , smf_tempo_btn (_("Use MIDI Tempo Map (if defined)")) , selected_audio_track_cnt (selected_audio_tracks) , selected_midi_track_cnt (selected_midi_tracks) , _import_active (false) @@ -1711,19 +1778,33 @@ SoundFileOmega::SoundFileOmega (string title, ARDOUR::Session* s, options.attach (*l, 1, 2, 3, 4, FILL, SHRINK, 8, 0); options.attach (src_combo, 1, 2, 4, 5, FILL, SHRINK, 8, 0); + l = manage (new Label); + l->set_markup (_("MIDI Track Names")); + options.attach (*l, 2, 3, 0, 1, FILL, SHRINK, 8, 0); + options.attach (midi_track_name_combo, 2, 3, 1, 2, FILL, SHRINK, 8, 0); + + options.attach (smf_tempo_btn, 2, 3, 3, 4, FILL, SHRINK, 8, 0); + l = manage (new Label); l->set_markup (_("Instrument")); options.attach (*l, 3, 4, 0, 1, FILL, SHRINK, 8, 0); options.attach (instrument_combo, 3, 4, 1, 2, FILL, SHRINK, 8, 0); Alignment *hspace = manage (new Alignment ()); - hspace->set_size_request(2, 2); + hspace->set_size_request (2, 2); options.attach (*hspace, 0, 3, 2, 3, FILL, SHRINK, 0, 8); Alignment *vspace = manage (new Alignment ()); - vspace->set_size_request(2, 2); + vspace->set_size_request (2, 2); options.attach (*vspace, 2, 3, 0, 3, EXPAND, SHRINK, 0, 0); + str.clear (); + str.push_back (_("by track number")); + str.push_back (_("by track name")); + str.push_back (_("by instrument name")); + set_popdown_strings (midi_track_name_combo, str); + midi_track_name_combo.set_active_text (str.front()); + str.clear (); str.push_back (_("one track per file")); set_popdown_strings (channel_combo, str); @@ -1863,6 +1944,18 @@ SoundFileOmega::where_combo_changed() preview.set_import_position(get_position()); } +MidiTrackNameSource +SoundFileOmega::get_midi_track_name_source () const +{ + return string2miditracknamesource (midi_track_name_combo.get_active_text()); +} + +bool +SoundFileOmega::get_use_smf_tempo_map () const +{ + return smf_tempo_btn.get_active (); +} + ImportDisposition SoundFileOmega::get_channel_disposition () const { @@ -1935,6 +2028,8 @@ SoundFileOmega::do_something (int action) ImportDisposition chns = get_channel_disposition (); PluginInfoPtr instrument = instrument_combo.selected_instrument(); framepos_t where; + MidiTrackNameSource mts = get_midi_track_name_source (); + MidiTempoMapDisposition mtd = (get_use_smf_tempo_map () ? SMFTempoUse : SMFTempoIgnore); switch (pos) { case ImportAtEditPoint: @@ -1956,7 +2051,7 @@ SoundFileOmega::do_something (int action) _import_active = true; if (copy_files_btn.get_active()) { - PublicEditor::instance().do_import (paths, chns, mode, quality, where, instrument); + PublicEditor::instance().do_import (paths, chns, mode, quality, mts, mtd, where, instrument); } else { PublicEditor::instance().do_embed (paths, chns, mode, where, instrument); } @@ -1968,4 +2063,3 @@ SoundFileOmega::do_something (int action) reset_options (); } } -