X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fmidi_list_editor.cc;h=c6dfc6c71325295461ada54eea0bdd72758e4921;hb=e12432cc632125821d6ed192d129ef385fb25002;hp=de1331674ed6bf108577bf5944db4b538bb0a27b;hpb=f09524b9d30115e51294edc3af4399194f8478f1;p=ardour.git diff --git a/gtk2_ardour/midi_list_editor.cc b/gtk2_ardour/midi_list_editor.cc index de1331674e..c6dfc6c713 100644 --- a/gtk2_ardour/midi_list_editor.cc +++ b/gtk2_ardour/midi_list_editor.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2009 Paul Davis + Copyright (C) 2009 Paul Davis This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -14,14 +14,17 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ + #include #include "evoral/midi_util.h" +#include "evoral/Note.hpp" #include "ardour/beats_frames_converter.h" +#include "ardour/midi_model.h" #include "ardour/midi_region.h" +#include "ardour/midi_source.h" #include "ardour/session.h" #include "ardour/tempo.h" @@ -38,6 +41,12 @@ MidiListEditor::MidiListEditor (Session* s, boost::shared_ptr r) : ArdourDialog (r->name(), false, false) , region (r) { + /* We do not handle nested sources/regions. Caller should have tackled this */ + + if (r->max_source_level() > 0) { + throw failed_constructor(); + } + set_session (s); model = ListStore::create (columns); @@ -176,7 +185,7 @@ MidiListEditor::edited (const std::string& path, const std::string& /* text */) cerr << "Edited " << *note << endl; redisplay_model (); - + /* keep selected row(s), move cursor there, to allow us to continue editing */ } @@ -187,24 +196,24 @@ MidiListEditor::redisplay_model () model->clear (); if (_session) { - + BeatsFramesConverter conv (_session->tempo_map(), region->position()); MidiModel::Notes notes = region->midi_source(0)->model()->notes(); TreeModel::Row row; stringstream ss; - + for (MidiModel::Notes::iterator i = notes.begin(); i != notes.end(); ++i) { row = *(model->append()); row[columns.channel] = (*i)->channel() + 1; row[columns.note_name] = Evoral::midi_note_name ((*i)->note()); row[columns.note] = (*i)->note(); row[columns.velocity] = (*i)->velocity(); - + Timecode::BBT_Time bbt; double dur; _session->tempo_map().bbt_time (conv.to ((*i)->time()), bbt); - + ss.str (""); ss << bbt; row[columns.start] = ss.str(); @@ -213,19 +222,19 @@ MidiListEditor::redisplay_model () dur = (*i)->end_time() - (*i)->time(); bbt.beats = floor (dur); bbt.ticks = (uint32_t) lrint (fmod (dur, 1.0) * Timecode::BBT_Time::ticks_per_beat); - + _session->tempo_map().bbt_duration_at (region->position(), bbt, 0); ss.str (""); ss << bbt; row[columns.length] = ss.str(); - + _session->tempo_map().bbt_time (conv.to ((*i)->end_time()), bbt); - + ss.str (""); ss << bbt; row[columns.end] = ss.str(); - + row[columns._note] = (*i); } }