summaryrefslogtreecommitdiff
path: root/gtk2_ardour/editor_mouse.cc
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2007-10-14 05:45:31 +0000
committerDavid Robillard <d@drobilla.net>2007-10-14 05:45:31 +0000
commit14dcc3f0170f8c723bcef0a59562adce0e8e7596 (patch)
treeca173319a68bd575a0721236df90d14a57cbda86 /gtk2_ardour/editor_mouse.cc
parent15af67c179ce336867c8f783388384f3ce214a99 (diff)
Fix displaying of notes in auto-created MIDI region when it's the first region in the track.
Fix crash after recording long phrases of MIDI. Fix MIDI looping (kinda). Add note-off exposure to MidiModel::iterator. Fix first-note-is-stuck-note problem. Fix resolving long notes while recording. Fix several other things I forget now. MIDI works pretty well..... git-svn-id: svn://localhost/ardour2/trunk@2555 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/editor_mouse.cc')
-rw-r--r--gtk2_ardour/editor_mouse.cc111
1 files changed, 92 insertions, 19 deletions
diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc
index da95d50d95..c6bbf5ca5f 100644
--- a/gtk2_ardour/editor_mouse.cc
+++ b/gtk2_ardour/editor_mouse.cc
@@ -28,6 +28,7 @@
#include <pbd/error.h>
#include <gtkmm2ext/utils.h>
#include <pbd/memento_command.h>
+#include <pbd/basename.h>
#include "ardour_ui.h"
#include "editor.h"
@@ -52,6 +53,7 @@
#include <ardour/route.h>
#include <ardour/audio_track.h>
#include <ardour/audio_diskstream.h>
+#include <ardour/midi_diskstream.h>
#include <ardour/playlist.h>
#include <ardour/audioplaylist.h>
#include <ardour/audioregion.h>
@@ -59,6 +61,7 @@
#include <ardour/dB.h>
#include <ardour/utils.h>
#include <ardour/region_factory.h>
+#include <ardour/source_factory.h>
#include <bitset>
@@ -318,22 +321,19 @@ Editor::midi_edit_mode_toggled (MidiEditMode m)
}
switch (m) {
- case MidiEditSelect:
- if (midi_tool_select_button.get_active()) {
+ case MidiEditPencil:
+ if (midi_tool_pencil_button.get_active())
set_midi_edit_mode (m);
- }
break;
-
- case MidiEditPencil:
- if (midi_tool_pencil_button.get_active()) {
+
+ case MidiEditSelect:
+ if (midi_tool_select_button.get_active())
set_midi_edit_mode (m);
- }
break;
-
+
case MidiEditErase:
- if (midi_tool_erase_button.get_active()) {
+ if (midi_tool_erase_button.get_active())
set_midi_edit_mode (m);
- }
break;
default:
@@ -362,14 +362,14 @@ Editor::set_midi_edit_mode (MidiEditMode m, bool force)
ignore_midi_edit_mode_toggle = true;
switch (midi_edit_mode) {
- case MidiEditSelect:
- midi_tool_select_button.set_active (true);
- break;
-
case MidiEditPencil:
midi_tool_pencil_button.set_active (true);
break;
-
+
+ case MidiEditSelect:
+ midi_tool_select_button.set_active (true);
+ break;
+
case MidiEditErase:
midi_tool_erase_button.set_active (true);
break;
@@ -388,12 +388,14 @@ void
Editor::set_midi_edit_cursor (MidiEditMode m)
{
switch (midi_edit_mode) {
- case MidiEditSelect:
- current_canvas_cursor = midi_select_cursor;
- break;
case MidiEditPencil:
current_canvas_cursor = midi_pencil_cursor;
break;
+
+ case MidiEditSelect:
+ current_canvas_cursor = midi_select_cursor;
+ break;
+
case MidiEditErase:
current_canvas_cursor = midi_erase_cursor;
break;
@@ -777,6 +779,10 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp
/* rest handled in motion & release */
break;
+ case MouseNote:
+ start_create_region_grab (item, event);
+ break;
+
default:
break;
}
@@ -1117,7 +1123,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
session->request_transport_speed (0.0);
}
break;
-
+
default:
break;
@@ -1621,6 +1627,7 @@ Editor::motion_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item
case MouseRange:
case MouseZoom:
case MouseTimeFX:
+ case MouseNote:
if (drag_info.item && (event->motion.state & GDK_BUTTON1_MASK ||
(event->motion.state & GDK_BUTTON2_MASK))) {
if (!from_autoscroll) {
@@ -2793,6 +2800,19 @@ Editor::start_region_grab (ArdourCanvas::Item* item, GdkEvent* event)
}
void
+Editor::start_create_region_grab (ArdourCanvas::Item* item, GdkEvent* event)
+{
+ drag_info.copy = false;
+ drag_info.item = item;
+ drag_info.data = clicked_axisview;
+ drag_info.last_trackview = clicked_axisview;
+ drag_info.motion_callback = &Editor::create_region_drag_motion_callback;
+ drag_info.finished_callback = &Editor::create_region_drag_finished_callback;
+
+ start_grab (event);
+}
+
+void
Editor::start_region_copy_grab (ArdourCanvas::Item* item, GdkEvent* event)
{
if (selection->regions.empty() || clicked_regionview == 0) {
@@ -3605,6 +3625,59 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
}
}
+
+void
+Editor::create_region_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
+{
+ if (drag_info.move_threshold_passed) {
+ if (drag_info.first_move) {
+ // TODO: create region-create-drag region view here
+ drag_info.first_move = false;
+ }
+
+ // TODO: resize region-create-drag region view here
+ }
+}
+
+void
+Editor::create_region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event)
+{
+ MidiTimeAxisView* mtv = dynamic_cast<MidiTimeAxisView*> (drag_info.last_trackview);
+ if (!mtv)
+ return;
+
+ const boost::shared_ptr<MidiDiskstream> diskstream =
+ boost::dynamic_pointer_cast<MidiDiskstream>(mtv->view()->trackview().track()->diskstream());
+
+ if (!diskstream) {
+ warning << "Cannot create non-MIDI region" << endl;
+ return;
+ }
+
+ if (drag_info.first_move) {
+ begin_reversible_command (_("create region"));
+ XMLNode &before = mtv->playlist()->get_state();
+
+ nframes_t start = drag_info.grab_frame;
+ snap_to (start, -1);
+ const Meter& m = session->tempo_map().meter_at(start);
+ const Tempo& t = session->tempo_map().tempo_at(start);
+ double length = m.frames_per_bar(t, session->frame_rate());
+
+ boost::shared_ptr<Source> src = session->create_midi_source_for_session(*diskstream.get());
+
+ mtv->playlist()->add_region (boost::dynamic_pointer_cast<MidiRegion>(RegionFactory::create(
+ src, 0, length, PBD::basename_nosuffix(src->name()))), start);
+ XMLNode &after = mtv->playlist()->get_state();
+ session->add_command(new MementoCommand<Playlist>(*mtv->playlist().get(), &before, &after));
+ commit_reversible_command();
+
+ } else {
+ create_region_drag_motion_callback (item, event);
+ // TODO: create region-create-drag region here
+ }
+}
+
void
Editor::region_view_item_click (AudioRegionView& rv, GdkEventButton* event)
{