From 51aec9a331a4fc2f023921c4754000d144b4484d Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 5 Jan 2010 03:52:30 +0000 Subject: [PATCH] get the MIDI list editor working a little better and a little more git-svn-id: svn://localhost/ardour2/branches/3.0@6453 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/midi_list_editor.cc | 84 ++++++++++++++++++++++++++++----- gtk2_ardour/midi_list_editor.h | 7 ++- gtk2_ardour/midi_region_view.cc | 12 ++++- gtk2_ardour/midi_region_view.h | 2 + 4 files changed, 89 insertions(+), 16 deletions(-) diff --git a/gtk2_ardour/midi_list_editor.cc b/gtk2_ardour/midi_list_editor.cc index 026b09b927..c35a944b15 100644 --- a/gtk2_ardour/midi_list_editor.cc +++ b/gtk2_ardour/midi_list_editor.cc @@ -16,6 +16,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include #include "evoral/midi_util.h" #include "ardour/midi_region.h" @@ -40,6 +41,9 @@ MidiListEditor::MidiListEditor (Session* s, boost::shared_ptr r) model = ListStore::create (columns); view.set_model (model); + view.signal_key_press_event().connect (sigc::mem_fun (*this, &MidiListEditor::key_press)); + view.signal_key_release_event().connect (sigc::mem_fun (*this, &MidiListEditor::key_release)); + view.append_column (_("Start"), columns.start); view.append_column (_("Channel"), columns.channel); view.append_column (_("Num"), columns.note); @@ -73,6 +77,47 @@ MidiListEditor::~MidiListEditor () { } +bool +MidiListEditor::key_press (GdkEventKey* ev) +{ + return true; +} + +bool +MidiListEditor::key_release (GdkEventKey* ev) +{ + switch (ev->keyval) { + case GDK_Delete: + delete_selected_note (); + break; + default: + break; + } + + return true; +} + +void +MidiListEditor::delete_selected_note () +{ + Glib::RefPtr selection = view.get_selection(); + TreeView::Selection::ListHandle_Path rows = selection->get_selected_rows (); + + if (rows.empty()) { + return; + } + + TreeView::Selection::ListHandle_Path::iterator i = rows.begin(); + TreeIter iter; + + /* selection mode is single, so rows.begin() is it */ + + if ((iter = model->get_iter (*i))) { + boost::shared_ptr note = (*iter)[columns._note]; + cerr << "Would have deleted " << *note << endl; + } + +} void MidiListEditor::edited (const Glib::ustring& path, const Glib::ustring& /* text */) { @@ -89,6 +134,8 @@ MidiListEditor::edited (const Glib::ustring& path, const Glib::ustring& /* text cerr << "Edited " << *note << endl; redisplay_model (); + + /* keep selected row(s), move cursor there, to allow us to continue editing */ } void @@ -101,34 +148,45 @@ MidiListEditor::redisplay_model () 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(); - row[columns.note_name] = _("Note"); + 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(); BBT_Time bbt; - BBT_Time dur; - stringstream ss; - + double dur; + bbt.bars = 0; + bbt.beats = (uint32_t) floor ((*i)->time()); + bbt.ticks = (uint32_t) lrint (fmod ((*i)->time(), 1.0) * Meter::ticks_per_beat); + _session->tempo_map().bbt_time (region->position(), bbt); - dur.bars = 0; - dur.beats = floor ((*i)->time()); - dur.ticks = 0; - - _session->tempo_map().bbt_duration_at (region->position(), dur, 0); - + ss.str (""); ss << bbt; row[columns.start] = ss.str(); - ss << dur; + + bbt.bars = 0; + dur = (*i)->end_time() - (*i)->time(); + bbt.beats = floor (dur); + bbt.ticks = (uint32_t) lrint (fmod (dur, 1.0) * Meter::ticks_per_beat); + + _session->tempo_map().bbt_duration_at (region->position(), bbt, 0); + + ss.str (""); + ss << bbt; row[columns.length] = ss.str(); + bbt.bars = 0; + bbt.beats = (uint32_t) floor ((*i)->end_time()); + bbt.ticks = (uint32_t) lrint (fmod ((*i)->end_time(), 1.0) * Meter::ticks_per_beat); + _session->tempo_map().bbt_time (region->position(), bbt); - /* XXX get end point */ + ss.str (""); ss << bbt; row[columns.end] = ss.str(); diff --git a/gtk2_ardour/midi_list_editor.h b/gtk2_ardour/midi_list_editor.h index de7b2220bb..b437566cbb 100644 --- a/gtk2_ardour/midi_list_editor.h +++ b/gtk2_ardour/midi_list_editor.h @@ -54,7 +54,7 @@ class MidiListEditor : public ArdourDialog add (start); add (length); add (end); - add (note); + add (_note); }; Gtk::TreeModelColumn channel; Gtk::TreeModelColumn note; @@ -75,6 +75,11 @@ class MidiListEditor : public ArdourDialog void edited (const Glib::ustring&, const Glib::ustring&); void redisplay_model (); + + bool key_press (GdkEventKey* ev); + bool key_release (GdkEventKey* ev); + + void delete_selected_note (); }; #endif /* __ardour_gtk2_midi_list_editor_h_ */ diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index 24f167a6c7..bf6dfa7a2c 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -89,6 +89,7 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView & , _pressed_button(0) , _sort_needed (true) , _optimization_iterator (_events.end()) + , _list_editor (0) { _note_group->raise_to_top(); } @@ -110,6 +111,7 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView & , _pressed_button(0) , _sort_needed (true) , _optimization_iterator (_events.end()) + , _list_editor (0) { _note_group->raise_to_top(); @@ -132,6 +134,7 @@ MidiRegionView::MidiRegionView (const MidiRegionView& other) , _pressed_button(0) , _sort_needed (true) , _optimization_iterator (_events.end()) + , _list_editor (0) { Gdk::Color c; int r,g,b,a; @@ -157,6 +160,7 @@ MidiRegionView::MidiRegionView (const MidiRegionView& other, boost::shared_ptrshow (); + if (!_list_editor) { + _list_editor = new MidiListEditor (trackview.session(), midi_region()); + } + _list_editor->present (); } /** Add a note to the model, and the view, at a canvas (click) coordinate. @@ -938,6 +944,8 @@ MidiRegionView::~MidiRegionView () { in_destructor = true; + delete _list_editor; + RegionViewGoingAway (this); /* EMIT_SIGNAL */ if (_active_notes) { diff --git a/gtk2_ardour/midi_region_view.h b/gtk2_ardour/midi_region_view.h index 66f0393f3d..9a9ea3c265 100644 --- a/gtk2_ardour/midi_region_view.h +++ b/gtk2_ardour/midi_region_view.h @@ -63,6 +63,7 @@ class GhostRegion; class AutomationTimeAxisView; class AutomationRegionView; class MidiCutBuffer; +class MidiListEditor; class MidiRegionView : public RegionView { @@ -397,6 +398,7 @@ class MidiRegionView : public RegionView void update_note (ArdourCanvas::CanvasNote*); void update_hit (ArdourCanvas::CanvasHit*); + MidiListEditor* _list_editor; };