mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-08 07:45:00 +01:00
more MIDI editing tweaks ; flip mouse mode buttons around for MIDI so that "object" mode is the most likely mode for both region \& region editing ; frame handle events (from lincoln's region trimming patch) are now handled more explicitly
git-svn-id: svn://localhost/ardour2/branches/3.0@5600 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
710ba02c70
commit
e7e071db1a
14 changed files with 218 additions and 91 deletions
|
|
@ -235,6 +235,7 @@ CanvasNoteEvent::on_event(GdkEvent* ev)
|
||||||
|
|
||||||
case GDK_LEAVE_NOTIFY:
|
case GDK_LEAVE_NOTIFY:
|
||||||
//Keyboard::magic_widget_drop_focus();
|
//Keyboard::magic_widget_drop_focus();
|
||||||
|
_region.note_left (this);
|
||||||
if (!selected()) {
|
if (!selected()) {
|
||||||
hide_velocity();
|
hide_velocity();
|
||||||
}
|
}
|
||||||
|
|
@ -255,7 +256,7 @@ CanvasNoteEvent::on_event(GdkEvent* ev)
|
||||||
|
|
||||||
switch (_state) {
|
switch (_state) {
|
||||||
case Pressed: // Drag begin
|
case Pressed: // Drag begin
|
||||||
if (editor.current_mouse_mode() == Editing::MouseRange && _region.mouse_state() != MidiRegionView::SelectTouchDragging) {
|
if (editor.current_mouse_mode() == Editing::MouseObject && _region.mouse_state() != MidiRegionView::SelectTouchDragging) {
|
||||||
_item->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK,
|
_item->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK,
|
||||||
Gdk::Cursor(Gdk::FLEUR), ev->motion.time);
|
Gdk::Cursor(Gdk::FLEUR), ev->motion.time);
|
||||||
_state = Dragging;
|
_state = Dragging;
|
||||||
|
|
|
||||||
|
|
@ -3366,6 +3366,31 @@ Editor::clamp_verbose_cursor_y (double y)
|
||||||
return y;
|
return y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Editor::show_verbose_canvas_cursor_with (const string & txt)
|
||||||
|
{
|
||||||
|
verbose_canvas_cursor->property_text() = txt.c_str();
|
||||||
|
|
||||||
|
int x, y;
|
||||||
|
double wx, wy;
|
||||||
|
|
||||||
|
track_canvas->get_pointer (x, y);
|
||||||
|
track_canvas->window_to_world (x, y, wx, wy);
|
||||||
|
|
||||||
|
/* move it away from the mouse pointer to avoid an
|
||||||
|
infinite loop of enter/leave events.
|
||||||
|
*/
|
||||||
|
|
||||||
|
wx += 20;
|
||||||
|
wy += 20;
|
||||||
|
|
||||||
|
/* don't get too close to the edge */
|
||||||
|
verbose_canvas_cursor->property_x() = clamp_verbose_cursor_x (wx);
|
||||||
|
verbose_canvas_cursor->property_y() = clamp_verbose_cursor_y (wy);
|
||||||
|
|
||||||
|
show_verbose_canvas_cursor ();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Editor::set_verbose_canvas_cursor (const string & txt, double x, double y)
|
Editor::set_verbose_canvas_cursor (const string & txt, double x, double y)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -420,6 +420,9 @@ class Editor : public PublicEditor
|
||||||
|
|
||||||
void get_regions_corresponding_to (boost::shared_ptr<ARDOUR::Region> region, std::vector<RegionView*>& regions);
|
void get_regions_corresponding_to (boost::shared_ptr<ARDOUR::Region> region, std::vector<RegionView*>& regions);
|
||||||
|
|
||||||
|
void show_verbose_canvas_cursor_with (const std::string& txt);
|
||||||
|
void hide_verbose_canvas_cursor();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void map_transport_state ();
|
void map_transport_state ();
|
||||||
void map_position_change (nframes64_t);
|
void map_position_change (nframes64_t);
|
||||||
|
|
@ -629,7 +632,6 @@ class Editor : public PublicEditor
|
||||||
void set_verbose_canvas_cursor (const std::string &, double x, double y);
|
void set_verbose_canvas_cursor (const std::string &, double x, double y);
|
||||||
void set_verbose_canvas_cursor_text (const std::string &);
|
void set_verbose_canvas_cursor_text (const std::string &);
|
||||||
void show_verbose_canvas_cursor();
|
void show_verbose_canvas_cursor();
|
||||||
void hide_verbose_canvas_cursor();
|
|
||||||
|
|
||||||
bool verbose_cursor_on; // so far unused
|
bool verbose_cursor_on; // so far unused
|
||||||
|
|
||||||
|
|
@ -1359,6 +1361,7 @@ private:
|
||||||
public:
|
public:
|
||||||
|
|
||||||
bool canvas_region_view_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*);
|
bool canvas_region_view_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*);
|
||||||
|
bool canvas_frame_handle_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*);
|
||||||
bool canvas_region_view_name_highlight_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*);
|
bool canvas_region_view_name_highlight_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*);
|
||||||
bool canvas_region_view_name_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*);
|
bool canvas_region_view_name_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*);
|
||||||
bool canvas_stream_view_event (GdkEvent* event,ArdourCanvas::Item*, RouteTimeAxisView*);
|
bool canvas_stream_view_event (GdkEvent* event,ArdourCanvas::Item*, RouteTimeAxisView*);
|
||||||
|
|
|
||||||
|
|
@ -753,6 +753,54 @@ Editor::canvas_selection_end_trim_event (GdkEvent *event, ArdourCanvas::Item* it
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
Editor::canvas_frame_handle_event (GdkEvent* event, ArdourCanvas::Item* item, RegionView* rv)
|
||||||
|
{
|
||||||
|
bool ret = false;
|
||||||
|
|
||||||
|
/* frame handles are not active when in internal edit mode, because actual notes
|
||||||
|
might be in the area occupied by the handle - we want them to be editable as normal.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (internal_editing() || !rv->sensitive()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* NOTE: frame handles pretend to be the colored trim bar from an event handling
|
||||||
|
perspective. XXX change this ??
|
||||||
|
*/
|
||||||
|
|
||||||
|
switch (event->type) {
|
||||||
|
case GDK_BUTTON_PRESS:
|
||||||
|
case GDK_2BUTTON_PRESS:
|
||||||
|
case GDK_3BUTTON_PRESS:
|
||||||
|
clicked_regionview = rv;
|
||||||
|
clicked_control_point = 0;
|
||||||
|
clicked_axisview = &clicked_regionview->get_time_axis_view();
|
||||||
|
clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
|
||||||
|
ret = button_press_handler (item, event, RegionViewNameHighlight);
|
||||||
|
break;
|
||||||
|
case GDK_BUTTON_RELEASE:
|
||||||
|
ret = button_release_handler (item, event, RegionViewNameHighlight);
|
||||||
|
break;
|
||||||
|
case GDK_MOTION_NOTIFY:
|
||||||
|
ret = motion_handler (item, event);
|
||||||
|
break;
|
||||||
|
case GDK_ENTER_NOTIFY:
|
||||||
|
ret = enter_handler (item, event, RegionViewNameHighlight);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GDK_LEAVE_NOTIFY:
|
||||||
|
ret = leave_handler (item, event, RegionViewNameHighlight);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
Editor::canvas_region_view_name_highlight_event (GdkEvent* event, ArdourCanvas::Item* item, RegionView* rv)
|
Editor::canvas_region_view_name_highlight_event (GdkEvent* event, ArdourCanvas::Item* item, RegionView* rv)
|
||||||
|
|
|
||||||
|
|
@ -172,12 +172,12 @@ Editor::which_grabber_cursor ()
|
||||||
|
|
||||||
if (_internal_editing) {
|
if (_internal_editing) {
|
||||||
switch (mouse_mode) {
|
switch (mouse_mode) {
|
||||||
case MouseObject:
|
case MouseRange:
|
||||||
c = midi_pencil_cursor;
|
c = midi_pencil_cursor;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MouseRange:
|
case MouseObject:
|
||||||
c = midi_select_cursor;
|
c = grabber_cursor;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MouseTimeFX:
|
case MouseTimeFX:
|
||||||
|
|
@ -208,12 +208,12 @@ Editor::set_canvas_cursor ()
|
||||||
if (_internal_editing) {
|
if (_internal_editing) {
|
||||||
|
|
||||||
switch (mouse_mode) {
|
switch (mouse_mode) {
|
||||||
case MouseObject:
|
case MouseRange:
|
||||||
current_canvas_cursor = midi_pencil_cursor;
|
current_canvas_cursor = midi_pencil_cursor;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MouseRange:
|
case MouseObject:
|
||||||
current_canvas_cursor = midi_select_cursor;
|
current_canvas_cursor = which_grabber_cursor();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MouseTimeFX:
|
case MouseTimeFX:
|
||||||
|
|
@ -599,9 +599,15 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
|
||||||
}
|
}
|
||||||
|
|
||||||
if (internal_editing()) {
|
if (internal_editing()) {
|
||||||
|
switch (item_type) {
|
||||||
|
case StreamItem:
|
||||||
assert (_drag == 0);
|
assert (_drag == 0);
|
||||||
_drag = new RegionCreateDrag (this, item, clicked_axisview);
|
_drag = new RegionCreateDrag (this, item, clicked_axisview);
|
||||||
_drag->start_grab (event);
|
_drag->start_grab (event);
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return true;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
switch (mouse_mode) {
|
switch (mouse_mode) {
|
||||||
case MouseRange:
|
case MouseRange:
|
||||||
|
|
@ -2552,11 +2558,9 @@ Editor::set_internal_edit (bool yn)
|
||||||
_internal_editing = yn;
|
_internal_editing = yn;
|
||||||
|
|
||||||
if (yn) {
|
if (yn) {
|
||||||
mouse_select_button.set_image (*(manage (new Image (::get_icon("midi_tool_select")))));
|
mouse_select_button.set_image (*(manage (new Image (::get_icon("midi_tool_pencil")))));
|
||||||
mouse_move_button.set_image (*(manage (new Image (::get_icon("midi_tool_pencil")))));
|
|
||||||
} else {
|
} else {
|
||||||
mouse_select_button.set_image (*(manage (new Image (::get_xpm("tool_range.xpm")))));
|
mouse_select_button.set_image (*(manage (new Image (::get_xpm("tool_range.xpm")))));
|
||||||
mouse_move_button.set_image (*(manage (new Image (::get_icon("tool_object")))));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
set_canvas_cursor ();
|
set_canvas_cursor ();
|
||||||
|
|
|
||||||
|
|
@ -209,7 +209,7 @@ MidiRegionView::canvas_event(GdkEvent* ev)
|
||||||
static double last_x, last_y;
|
static double last_x, last_y;
|
||||||
double event_x, event_y;
|
double event_x, event_y;
|
||||||
nframes64_t event_frame = 0;
|
nframes64_t event_frame = 0;
|
||||||
uint8_t d_velocity = 10;
|
bool fine;
|
||||||
|
|
||||||
static ArdourCanvas::SimpleRect* drag_rect = NULL;
|
static ArdourCanvas::SimpleRect* drag_rect = NULL;
|
||||||
|
|
||||||
|
|
@ -219,15 +219,13 @@ MidiRegionView::canvas_event(GdkEvent* ev)
|
||||||
|
|
||||||
switch (ev->type) {
|
switch (ev->type) {
|
||||||
case GDK_SCROLL:
|
case GDK_SCROLL:
|
||||||
if (Keyboard::modifier_state_equals (ev->scroll.state, Keyboard::Level4Modifier)) {
|
fine = Keyboard::modifier_state_equals (ev->scroll.state, Keyboard::Level4Modifier);
|
||||||
d_velocity = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ev->scroll.direction == GDK_SCROLL_UP) {
|
if (ev->scroll.direction == GDK_SCROLL_UP) {
|
||||||
change_velocities (d_velocity, true);
|
change_velocities (true, fine, false);
|
||||||
return true;
|
return true;
|
||||||
} else if (ev->scroll.direction == GDK_SCROLL_DOWN) {
|
} else if (ev->scroll.direction == GDK_SCROLL_DOWN) {
|
||||||
change_velocities(-d_velocity, true);
|
change_velocities (false, fine, false);
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -254,7 +252,7 @@ MidiRegionView::canvas_event(GdkEvent* ev)
|
||||||
bool start = (ev->key.keyval == GDK_comma);
|
bool start = (ev->key.keyval == GDK_comma);
|
||||||
bool end = (ev->key.keyval == GDK_period);
|
bool end = (ev->key.keyval == GDK_period);
|
||||||
bool shorter = Keyboard::modifier_state_contains (ev->key.state, Keyboard::PrimaryModifier);
|
bool shorter = Keyboard::modifier_state_contains (ev->key.state, Keyboard::PrimaryModifier);
|
||||||
bool fine = Keyboard::modifier_state_contains (ev->key.state, Keyboard::SecondaryModifier);
|
fine = Keyboard::modifier_state_contains (ev->key.state, Keyboard::SecondaryModifier);
|
||||||
|
|
||||||
change_note_lengths (fine, shorter, start, end);
|
change_note_lengths (fine, shorter, start, end);
|
||||||
|
|
||||||
|
|
@ -277,19 +275,25 @@ MidiRegionView::canvas_event(GdkEvent* ev)
|
||||||
|
|
||||||
} else if (ev->key.keyval == GDK_Up) {
|
} else if (ev->key.keyval == GDK_Up) {
|
||||||
|
|
||||||
if (Keyboard::modifier_state_equals (ev->key.state, Keyboard::PrimaryModifier)) {
|
bool allow_smush = Keyboard::modifier_state_contains (ev->key.state, Keyboard::SecondaryModifier);
|
||||||
change_velocities (1, true);
|
bool fine = Keyboard::modifier_state_contains (ev->key.state, Keyboard::TertiaryModifier);
|
||||||
|
|
||||||
|
if (Keyboard::modifier_state_contains (ev->key.state, Keyboard::PrimaryModifier)) {
|
||||||
|
change_velocities (true, fine, allow_smush);
|
||||||
} else {
|
} else {
|
||||||
transpose (true, Keyboard::modifier_state_equals (ev->key.state, Keyboard::SecondaryModifier));
|
transpose (true, fine, allow_smush);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
} else if (ev->key.keyval == GDK_Down) {
|
} else if (ev->key.keyval == GDK_Down) {
|
||||||
|
|
||||||
if (Keyboard::modifier_state_equals (ev->key.state, Keyboard::PrimaryModifier)) {
|
bool allow_smush = Keyboard::modifier_state_contains (ev->key.state, Keyboard::SecondaryModifier);
|
||||||
change_velocities (-1, true);
|
fine = Keyboard::modifier_state_contains (ev->key.state, Keyboard::TertiaryModifier);
|
||||||
|
|
||||||
|
if (Keyboard::modifier_state_contains (ev->key.state, Keyboard::PrimaryModifier)) {
|
||||||
|
change_velocities (false, fine, allow_smush);
|
||||||
} else {
|
} else {
|
||||||
transpose (false, Keyboard::modifier_state_equals (ev->key.state, Keyboard::SecondaryModifier));
|
transpose (false, fine, allow_smush);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
|
@ -349,7 +353,7 @@ MidiRegionView::canvas_event(GdkEvent* ev)
|
||||||
case Pressed: // Drag start
|
case Pressed: // Drag start
|
||||||
|
|
||||||
// Select drag start
|
// Select drag start
|
||||||
if (_pressed_button == 1 && editor.current_mouse_mode() == MouseRange) {
|
if (_pressed_button == 1 && editor.current_mouse_mode() == MouseObject) {
|
||||||
group->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK,
|
group->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK,
|
||||||
Gdk::Cursor(Gdk::FLEUR), ev->motion.time);
|
Gdk::Cursor(Gdk::FLEUR), ev->motion.time);
|
||||||
last_x = event_x;
|
last_x = event_x;
|
||||||
|
|
@ -372,7 +376,7 @@ MidiRegionView::canvas_event(GdkEvent* ev)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
// Add note drag start
|
// Add note drag start
|
||||||
} else if (editor.current_mouse_mode() == MouseObject) {
|
} else if (editor.current_mouse_mode() == MouseRange) {
|
||||||
group->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK,
|
group->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK,
|
||||||
Gdk::Cursor(Gdk::FLEUR), ev->motion.time);
|
Gdk::Cursor(Gdk::FLEUR), ev->motion.time);
|
||||||
last_x = event_x;
|
last_x = event_x;
|
||||||
|
|
@ -455,11 +459,11 @@ MidiRegionView::canvas_event(GdkEvent* ev)
|
||||||
switch (_mouse_state) {
|
switch (_mouse_state) {
|
||||||
case Pressed: // Clicked
|
case Pressed: // Clicked
|
||||||
switch (editor.current_mouse_mode()) {
|
switch (editor.current_mouse_mode()) {
|
||||||
case MouseRange:
|
case MouseObject:
|
||||||
case MouseTimeFX:
|
case MouseTimeFX:
|
||||||
clear_selection();
|
clear_selection();
|
||||||
break;
|
break;
|
||||||
case MouseObject:
|
case MouseRange:
|
||||||
create_note_at(event_x, event_y, _default_note_length);
|
create_note_at(event_x, event_y, _default_note_length);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
@ -532,6 +536,8 @@ MidiRegionView::create_note_at(double x, double y, double length)
|
||||||
MidiModel::DeltaCommand* cmd = _model->new_delta_command("add note");
|
MidiModel::DeltaCommand* cmd = _model->new_delta_command("add note");
|
||||||
cmd->add(new_note);
|
cmd->add(new_note);
|
||||||
_model->apply_command(trackview.session(), cmd);
|
_model->apply_command(trackview.session(), cmd);
|
||||||
|
|
||||||
|
play_midi_note (new_note);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -657,17 +663,26 @@ MidiRegionView::redisplay_model()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_model) {
|
if (_model) {
|
||||||
|
|
||||||
|
// Mark all selected notes for selection when model reloads
|
||||||
|
for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) {
|
||||||
|
_marked_for_selection.insert((*i)->note());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
clear_events();
|
clear_events();
|
||||||
_model->read_lock();
|
_model->read_lock();
|
||||||
|
|
||||||
MidiModel::Notes notes = _model->notes();
|
MidiModel::Notes notes = _model->notes();
|
||||||
|
|
||||||
for (size_t i = 0; i < _model->n_notes(); ++i) {
|
for (size_t i = 0; i < _model->n_notes(); ++i) {
|
||||||
add_note(_model->note_at(i));
|
boost::shared_ptr<NoteType> note (_model->note_at (i));
|
||||||
|
if (note_in_visible_range (note)) {
|
||||||
|
add_note (note);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
display_sysexes();
|
display_sysexes();
|
||||||
|
|
||||||
display_program_changes();
|
display_program_changes();
|
||||||
|
|
||||||
_model->read_unlock();
|
_model->read_unlock();
|
||||||
|
|
@ -1092,10 +1107,7 @@ MidiRegionView::add_note(const boost::shared_ptr<NoteType> note)
|
||||||
|
|
||||||
if (event) {
|
if (event) {
|
||||||
if (_marked_for_selection.find(note) != _marked_for_selection.end()) {
|
if (_marked_for_selection.find(note) != _marked_for_selection.end()) {
|
||||||
cerr << "Added note " << *note << " was marked for selection\n";
|
|
||||||
note_selected(event, true);
|
note_selected(event, true);
|
||||||
} else {
|
|
||||||
cerr << "Added note " << *note << " not selected\n";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_marked_for_velocity.find(note) != _marked_for_velocity.end()) {
|
if (_marked_for_velocity.find(note) != _marked_for_velocity.end()) {
|
||||||
|
|
@ -1103,6 +1115,7 @@ MidiRegionView::add_note(const boost::shared_ptr<NoteType> note)
|
||||||
}
|
}
|
||||||
event->on_channel_selection_change(_last_channel_selection);
|
event->on_channel_selection_change(_last_channel_selection);
|
||||||
_events.push_back(event);
|
_events.push_back(event);
|
||||||
|
|
||||||
if (note_in_visible_range(note)) {
|
if (note_in_visible_range(note)) {
|
||||||
event->show();
|
event->show();
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -1839,18 +1852,38 @@ MidiRegionView::change_note_time (CanvasNoteEvent* event, Evoral::MusicalTime de
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MidiRegionView::change_velocities (int8_t velocity, bool relative)
|
MidiRegionView::change_velocities (bool up, bool fine, bool allow_smush)
|
||||||
{
|
{
|
||||||
|
int8_t delta;
|
||||||
|
|
||||||
if (_selection.empty()) {
|
if (_selection.empty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (fine) {
|
||||||
|
delta = 1;
|
||||||
|
} else {
|
||||||
|
delta = 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!up) {
|
||||||
|
delta = -delta;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!allow_smush) {
|
||||||
|
for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) {
|
||||||
|
if ((*i)->note()->velocity() + delta == 0 || (*i)->note()->velocity() + delta == 127) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
start_delta_command(_("change velocities"));
|
start_delta_command(_("change velocities"));
|
||||||
|
|
||||||
for (Selection::iterator i = _selection.begin(); i != _selection.end();) {
|
for (Selection::iterator i = _selection.begin(); i != _selection.end();) {
|
||||||
Selection::iterator next = i;
|
Selection::iterator next = i;
|
||||||
++next;
|
++next;
|
||||||
change_note_velocity (*i, velocity, relative);
|
change_note_velocity (*i, delta, true);
|
||||||
i = next;
|
i = next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1859,7 +1892,7 @@ MidiRegionView::change_velocities (int8_t velocity, bool relative)
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
MidiRegionView::transpose (bool up, bool fine)
|
MidiRegionView::transpose (bool up, bool fine, bool allow_smush)
|
||||||
{
|
{
|
||||||
if (_selection.empty()) {
|
if (_selection.empty()) {
|
||||||
return;
|
return;
|
||||||
|
|
@ -1877,6 +1910,20 @@ MidiRegionView::transpose (bool up, bool fine)
|
||||||
delta = -delta;
|
delta = -delta;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!allow_smush) {
|
||||||
|
for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) {
|
||||||
|
if (!up) {
|
||||||
|
if ((int8_t) (*i)->note()->note() + delta <= 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ((int8_t) (*i)->note()->note() + delta > 127) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
start_delta_command (_("transpose"));
|
start_delta_command (_("transpose"));
|
||||||
|
|
||||||
for (Selection::iterator i = _selection.begin(); i != _selection.end(); ) {
|
for (Selection::iterator i = _selection.begin(); i != _selection.end(); ) {
|
||||||
|
|
@ -2017,6 +2064,16 @@ MidiRegionView::note_entered(ArdourCanvas::CanvasNoteEvent* ev)
|
||||||
if (_mouse_state == SelectTouchDragging) {
|
if (_mouse_state == SelectTouchDragging) {
|
||||||
note_selected(ev, true);
|
note_selected(ev, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PublicEditor& editor (trackview.editor());
|
||||||
|
editor.show_verbose_canvas_cursor_with (Evoral::midi_note_name (ev->note()->note()));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MidiRegionView::note_left (ArdourCanvas::CanvasNoteEvent* ev)
|
||||||
|
{
|
||||||
|
PublicEditor& editor (trackview.editor());
|
||||||
|
editor.hide_verbose_canvas_cursor ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -2231,31 +2288,6 @@ MidiRegionView::goto_previous_note ()
|
||||||
unique_select (*(_events.rbegin()));
|
unique_select (*(_events.rbegin()));
|
||||||
}
|
}
|
||||||
|
|
||||||
MidiModel::DeltaCommand*
|
|
||||||
MidiRegionView::apply (Filter& filter, const std::string& name)
|
|
||||||
{
|
|
||||||
MidiModel::Notes before = _model->notes();
|
|
||||||
MidiModel::Notes after;
|
|
||||||
|
|
||||||
_region->apply (filter);
|
|
||||||
|
|
||||||
redisplay_model ();
|
|
||||||
|
|
||||||
after = _model->notes();
|
|
||||||
|
|
||||||
start_delta_command (name);
|
|
||||||
|
|
||||||
for (MidiModel::Notes::iterator i = before.begin(); i != before.end(); ++i) {
|
|
||||||
_delta_command->add (*i);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (MidiModel::Notes::iterator i = after.begin(); i != after.end(); ++i) {
|
|
||||||
_delta_command->remove (*i);
|
|
||||||
}
|
|
||||||
|
|
||||||
return _delta_command;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
MidiRegionView::selection_as_notelist (NoteList& selected)
|
MidiRegionView::selection_as_notelist (NoteList& selected)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -88,8 +88,6 @@ class MidiRegionView : public RegionView
|
||||||
inline MidiStreamView* midi_stream_view() const
|
inline MidiStreamView* midi_stream_view() const
|
||||||
{ return midi_view()->midi_view(); }
|
{ return midi_view()->midi_view(); }
|
||||||
|
|
||||||
ARDOUR::MidiModel::DeltaCommand* apply (ARDOUR::Filter&, const std::string& name);
|
|
||||||
|
|
||||||
void set_height (double);
|
void set_height (double);
|
||||||
void apply_note_range(uint8_t lowest, uint8_t highest, bool force=false);
|
void apply_note_range(uint8_t lowest, uint8_t highest, bool force=false);
|
||||||
|
|
||||||
|
|
@ -176,6 +174,7 @@ class MidiRegionView : public RegionView
|
||||||
void abort_command();
|
void abort_command();
|
||||||
|
|
||||||
void note_entered(ArdourCanvas::CanvasNoteEvent* ev);
|
void note_entered(ArdourCanvas::CanvasNoteEvent* ev);
|
||||||
|
void note_left(ArdourCanvas::CanvasNoteEvent* ev);
|
||||||
void unique_select(ArdourCanvas::CanvasNoteEvent* ev);
|
void unique_select(ArdourCanvas::CanvasNoteEvent* ev);
|
||||||
void note_selected(ArdourCanvas::CanvasNoteEvent* ev, bool add, bool extend=false);
|
void note_selected(ArdourCanvas::CanvasNoteEvent* ev, bool add, bool extend=false);
|
||||||
void note_deselected(ArdourCanvas::CanvasNoteEvent* ev, bool add);
|
void note_deselected(ArdourCanvas::CanvasNoteEvent* ev, bool add);
|
||||||
|
|
@ -268,9 +267,9 @@ class MidiRegionView : public RegionView
|
||||||
|
|
||||||
void goto_previous_note ();
|
void goto_previous_note ();
|
||||||
void goto_next_note ();
|
void goto_next_note ();
|
||||||
void change_velocities (int8_t velocity, bool relative);
|
|
||||||
void change_note_lengths (bool, bool, bool start, bool end);
|
void change_note_lengths (bool, bool, bool start, bool end);
|
||||||
void transpose (bool up, bool fine);
|
void change_velocities (bool up, bool fine, bool allow_smush);
|
||||||
|
void transpose (bool up, bool fine, bool allow_smush);
|
||||||
void nudge_notes (bool forward);
|
void nudge_notes (bool forward);
|
||||||
|
|
||||||
void show_list_editor ();
|
void show_list_editor ();
|
||||||
|
|
@ -374,7 +373,7 @@ class MidiRegionView : public RegionView
|
||||||
|
|
||||||
/* connection used to connect to model's ContentChanged signal */
|
/* connection used to connect to model's ContentChanged signal */
|
||||||
sigc::connection content_connection;
|
sigc::connection content_connection;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif /* __gtk_ardour_midi_region_view_h__ */
|
#endif /* __gtk_ardour_midi_region_view_h__ */
|
||||||
|
|
|
||||||
|
|
@ -297,6 +297,7 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulThingWithGoingAway
|
||||||
virtual bool canvas_fade_out_event (GdkEvent* event, ArdourCanvas::Item*, AudioRegionView*) = 0;
|
virtual bool canvas_fade_out_event (GdkEvent* event, ArdourCanvas::Item*, AudioRegionView*) = 0;
|
||||||
virtual bool canvas_fade_out_handle_event (GdkEvent* event, ArdourCanvas::Item*, AudioRegionView*) = 0;
|
virtual bool canvas_fade_out_handle_event (GdkEvent* event, ArdourCanvas::Item*, AudioRegionView*) = 0;
|
||||||
virtual bool canvas_region_view_event (GdkEvent* event, ArdourCanvas::Item*, RegionView*) = 0;
|
virtual bool canvas_region_view_event (GdkEvent* event, ArdourCanvas::Item*, RegionView*) = 0;
|
||||||
|
virtual bool canvas_frame_handle_event (GdkEvent* event, ArdourCanvas::Item*, RegionView*) = 0;
|
||||||
virtual bool canvas_region_view_name_highlight_event (GdkEvent* event, ArdourCanvas::Item*, RegionView*) = 0;
|
virtual bool canvas_region_view_name_highlight_event (GdkEvent* event, ArdourCanvas::Item*, RegionView*) = 0;
|
||||||
virtual bool canvas_region_view_name_event (GdkEvent* event, ArdourCanvas::Item*, RegionView*) = 0;
|
virtual bool canvas_region_view_name_event (GdkEvent* event, ArdourCanvas::Item*, RegionView*) = 0;
|
||||||
virtual bool canvas_stream_view_event (GdkEvent* event, ArdourCanvas::Item*, RouteTimeAxisView*) = 0;
|
virtual bool canvas_stream_view_event (GdkEvent* event, ArdourCanvas::Item*, RouteTimeAxisView*) = 0;
|
||||||
|
|
@ -344,6 +345,9 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulThingWithGoingAway
|
||||||
|
|
||||||
virtual TimeAxisView* axis_view_from_route (ARDOUR::Route *) const = 0;
|
virtual TimeAxisView* axis_view_from_route (ARDOUR::Route *) const = 0;
|
||||||
|
|
||||||
|
virtual void show_verbose_canvas_cursor_with (const std::string& txt) = 0;
|
||||||
|
virtual void hide_verbose_canvas_cursor() = 0;
|
||||||
|
|
||||||
/// Singleton instance, set up by Editor::Editor()
|
/// Singleton instance, set up by Editor::Editor()
|
||||||
|
|
||||||
static PublicEditor* _instance;
|
static PublicEditor* _instance;
|
||||||
|
|
|
||||||
|
|
@ -156,10 +156,10 @@ RegionView::init (Gdk::Color const & basic_color, bool wfd)
|
||||||
name_highlight->signal_event().connect (bind (mem_fun (PublicEditor::instance(), &PublicEditor::canvas_region_view_name_highlight_event), name_highlight, this));
|
name_highlight->signal_event().connect (bind (mem_fun (PublicEditor::instance(), &PublicEditor::canvas_region_view_name_highlight_event), name_highlight, this));
|
||||||
|
|
||||||
frame_handle_start->set_data ("regionview", this);
|
frame_handle_start->set_data ("regionview", this);
|
||||||
frame_handle_start->signal_event().connect (bind (mem_fun (PublicEditor::instance(), &PublicEditor::canvas_region_view_name_highlight_event), frame_handle_start, this));
|
frame_handle_start->signal_event().connect (bind (mem_fun (PublicEditor::instance(), &PublicEditor::canvas_frame_handle_event), frame_handle_start, this));
|
||||||
|
|
||||||
frame_handle_end->set_data ("regionview", this);
|
frame_handle_end->set_data ("regionview", this);
|
||||||
frame_handle_end->signal_event().connect (bind (mem_fun (PublicEditor::instance(), &PublicEditor::canvas_region_view_name_highlight_event), frame_handle_end, this));
|
frame_handle_end->signal_event().connect (bind (mem_fun (PublicEditor::instance(), &PublicEditor::canvas_frame_handle_event), frame_handle_end, this));
|
||||||
|
|
||||||
frame_handle_start->raise_to_top();
|
frame_handle_start->raise_to_top();
|
||||||
frame_handle_end->raise_to_top();
|
frame_handle_end->raise_to_top();
|
||||||
|
|
|
||||||
|
|
@ -93,6 +93,7 @@ MidiBuffer::read_from (const Buffer& src, nframes_t nframes, nframes_t dst_offse
|
||||||
const Evoral::MIDIEvent<TimeType> ev(*i, false);
|
const Evoral::MIDIEvent<TimeType> ev(*i, false);
|
||||||
if (ev.time() >= src_offset && ev.time() < (nframes+src_offset)) {
|
if (ev.time() >= src_offset && ev.time() < (nframes+src_offset)) {
|
||||||
push_back (ev);
|
push_back (ev);
|
||||||
|
cerr << "got note " << ev << endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1652,11 +1652,11 @@ MidiDiskstream::get_playback (MidiBuffer& dst, nframes_t start, nframes_t end)
|
||||||
MidiBuffer::iterator this_cycle_start = dst.end();
|
MidiBuffer::iterator this_cycle_start = dst.end();
|
||||||
|
|
||||||
// Translates stamps to be relative to start
|
// Translates stamps to be relative to start
|
||||||
#if 1
|
|
||||||
_playback_buf->read(dst, start, end);
|
_playback_buf->read(dst, start, end);
|
||||||
#else
|
#if 0
|
||||||
const size_t events_read = _playback_buf->read(dst, start, end);
|
const size_t events_read = _playback_buf->read(dst, start, end);
|
||||||
cout << "MDS events read = " << events_read
|
cout << _name << ": MDS events read = " << events_read
|
||||||
<< " start = " << start << " end = " << end
|
<< " start = " << start << " end = " << end
|
||||||
<< " readspace " << _playback_buf->read_space()
|
<< " readspace " << _playback_buf->read_space()
|
||||||
<< " writespace " << _playback_buf->write_space() << endl;
|
<< " writespace " << _playback_buf->write_space() << endl;
|
||||||
|
|
|
||||||
|
|
@ -232,8 +232,6 @@ Processor::configure_io (ChanCount in, ChanCount out)
|
||||||
_configured_output = out;
|
_configured_output = out;
|
||||||
_configured = true;
|
_configured = true;
|
||||||
|
|
||||||
std::cerr << "******* CONF IN for " << _name << " set to " << in << std::endl;
|
|
||||||
|
|
||||||
ConfigurationChanged.emit (in, out);
|
ConfigurationChanged.emit (in, out);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
||||||
|
|
@ -1341,7 +1341,6 @@ Route::configure_processors_unlocked (ProcessorStreams* err)
|
||||||
// We can, so configure everything
|
// We can, so configure everything
|
||||||
list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
|
list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
|
||||||
for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
|
for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
|
||||||
cerr << _name << " Configure " << (*p)->name() << " for " << in << " + " << out << endl;
|
|
||||||
(*p)->configure_io(c->first, c->second);
|
(*p)->configure_io(c->first, c->second);
|
||||||
processor_max_streams = ChanCount::max(processor_max_streams, c->first);
|
processor_max_streams = ChanCount::max(processor_max_streams, c->first);
|
||||||
processor_max_streams = ChanCount::max(processor_max_streams, c->second);
|
processor_max_streams = ChanCount::max(processor_max_streams, c->second);
|
||||||
|
|
|
||||||
|
|
@ -196,5 +196,18 @@ protected:
|
||||||
|
|
||||||
} // namespace Evoral
|
} // namespace Evoral
|
||||||
|
|
||||||
|
|
||||||
|
template<typename Time>
|
||||||
|
std::ostream& operator<<(std::ostream& o, const Evoral::Event<Time>& ev) {
|
||||||
|
o << "Event type = " << ev.event_type() << " @ " << " @ " << ev.time() << "\n\t";
|
||||||
|
o << std::hex;
|
||||||
|
for (uint32_t n = 0; n < ev.size(); ++n) {
|
||||||
|
o << (int) ev.buffer()[n] << ' ';
|
||||||
|
}
|
||||||
|
o << std::dec << std::endl;
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif // EVORAL_EVENT_HPP
|
#endif // EVORAL_EVENT_HPP
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue