summaryrefslogtreecommitdiff
path: root/gtk2_ardour/midi_region_view.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2012-06-06 13:17:53 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2012-06-06 13:17:53 +0000
commit0692e766f8142ee22e0ff1c03969e71f64dbbd5b (patch)
tree5e0259ccc3347182d35e381922868a23bce348ab /gtk2_ardour/midi_region_view.cc
parenta56ab3026187f7e7562df85b255d295345e1833b (diff)
add "v" as a new MIDI editing key for velocity, add velocity dialog, fix crash when quitting with MIDI notes selected
git-svn-id: svn://localhost/ardour2/branches/3.0@12583 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/midi_region_view.cc')
-rw-r--r--gtk2_ardour/midi_region_view.cc69
1 files changed, 53 insertions, 16 deletions
diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc
index 8229c9bc29..592da5aa91 100644
--- a/gtk2_ardour/midi_region_view.cc
+++ b/gtk2_ardour/midi_region_view.cc
@@ -61,6 +61,7 @@
#include "midi_streamview.h"
#include "midi_time_axis.h"
#include "midi_util.h"
+#include "midi_velocity_dialog.h"
#include "mouse_cursors.h"
#include "note_player.h"
#include "public_editor.h"
@@ -736,7 +737,7 @@ MidiRegionView::key_press (GdkEventKey* ev)
bool allow_smush = Keyboard::modifier_state_contains (ev->state, Keyboard::TertiaryModifier);
bool fine = !Keyboard::modifier_state_contains (ev->state, Keyboard::SecondaryModifier);
- bool together = Keyboard::modifier_state_contains (ev->state, Keyboard::PrimaryModifier);
+ bool together = Keyboard::modifier_state_contains (ev->state, Keyboard::Level4Modifier);
if (Keyboard::modifier_state_contains (ev->state, Keyboard::PrimaryModifier)) {
change_velocities (true, fine, allow_smush, together);
@@ -749,14 +750,13 @@ MidiRegionView::key_press (GdkEventKey* ev)
bool allow_smush = Keyboard::modifier_state_contains (ev->state, Keyboard::TertiaryModifier);
bool fine = !Keyboard::modifier_state_contains (ev->state, Keyboard::SecondaryModifier);
- bool together = Keyboard::modifier_state_contains (ev->state, Keyboard::PrimaryModifier);
+ bool together = Keyboard::modifier_state_contains (ev->state, Keyboard::Level4Modifier);
- if (Keyboard::no_modifiers_active (ev->state)) {
- transpose (false, fine, allow_smush);
- } else {
+ if (Keyboard::modifier_state_contains (ev->state, Keyboard::PrimaryModifier)) {
change_velocities (false, fine, allow_smush, together);
+ } else {
+ transpose (false, fine, allow_smush);
}
-
return true;
} else if (ev->keyval == GDK_Left && unmodified) {
@@ -772,6 +772,10 @@ MidiRegionView::key_press (GdkEventKey* ev)
} else if (ev->keyval == GDK_c && unmodified) {
channel_edit ();
return true;
+
+ } else if (ev->keyval == GDK_v && unmodified) {
+ velocity_edit ();
+ return true;
}
return false;
@@ -790,20 +794,15 @@ MidiRegionView::key_release (GdkEventKey* ev)
void
MidiRegionView::channel_edit ()
{
- bool first = true;
- uint8_t current_channel = 0;
-
if (_selection.empty()) {
return;
}
-
- for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) {
- if (first) {
- current_channel = (*i)->note()->channel ();
- first = false;
- }
- }
+ /* pick a note somewhat at random (since Selection is a set<>) to
+ * provide the "current" channel for the dialog.
+ */
+
+ uint8_t current_channel = (*_selection.begin())->note()->channel ();
MidiChannelDialog channel_dialog (current_channel);
int ret = channel_dialog.run ();
@@ -829,6 +828,42 @@ MidiRegionView::channel_edit ()
}
void
+MidiRegionView::velocity_edit ()
+{
+ if (_selection.empty()) {
+ return;
+ }
+
+ /* pick a note somewhat at random (since Selection is a set<>) to
+ * provide the "current" velocity for the dialog.
+ */
+
+ uint8_t current_velocity = (*_selection.begin())->note()->velocity ();
+ MidiVelocityDialog velocity_dialog (current_velocity);
+ int ret = velocity_dialog.run ();
+
+ switch (ret) {
+ case Gtk::RESPONSE_OK:
+ break;
+ default:
+ return;
+ }
+
+ uint8_t new_velocity = velocity_dialog.velocity ();
+
+ start_note_diff_command (_("velocity edit"));
+
+ for (Selection::iterator i = _selection.begin(); i != _selection.end(); ) {
+ Selection::iterator next = i;
+ ++next;
+ change_note_velocity (*i, new_velocity, false);
+ i = next;
+ }
+
+ apply_diff ();
+}
+
+void
MidiRegionView::show_list_editor ()
{
if (!_list_editor) {
@@ -1282,6 +1317,8 @@ MidiRegionView::~MidiRegionView ()
end_write();
}
+ _selection_cleared_connection.disconnect ();
+
_selection.clear();
clear_events();