X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fmidi_region_view.h;h=c3084aee384a24e1f2d3700ee52dbce91ce8686f;hb=0b0d252acf107dd1498fd212d32677089d20bdc4;hp=7b9af4fe9c8bd409ddae8a13bef91fb6c75db7b7;hpb=711db34a81eed3748684bc52b17a56292ffe4092;p=ardour.git diff --git a/gtk2_ardour/midi_region_view.h b/gtk2_ardour/midi_region_view.h index 7b9af4fe9c..c3084aee38 100644 --- a/gtk2_ardour/midi_region_view.h +++ b/gtk2_ardour/midi_region_view.h @@ -28,7 +28,6 @@ #include "pbd/signals.h" #include "ardour/midi_track.h" -#include "ardour/midi_region.h" #include "ardour/midi_model.h" #include "ardour/diskstream.h" #include "ardour/types.h" @@ -85,8 +84,7 @@ public: virtual void init (Gdk::Color const & basic_color, bool wfd); - inline const boost::shared_ptr midi_region() const - { return boost::dynamic_pointer_cast(_region); } + const boost::shared_ptr midi_region() const; inline MidiTimeAxisView* midi_view() const { return dynamic_cast(&trackview); } @@ -104,7 +102,7 @@ public: void set_frame_color(); void color_handler (); - + void show_step_edit_cursor (Evoral::MusicalTime pos); void move_step_edit_cursor (Evoral::MusicalTime pos); void hide_step_edit_cursor (); @@ -154,6 +152,9 @@ public: */ void next_patch (ArdourCanvas::CanvasPatchChange &); + void previous_bank (ArdourCanvas::CanvasPatchChange &); + void next_bank (ArdourCanvas::CanvasPatchChange &); + /** Displays all patch change events in the region as flags on the canvas. */ void display_patch_changes(); @@ -166,8 +167,6 @@ public: void end_write(); void extend_active_notes(); - void create_note_at(double x, double y, double length, bool); - void display_model(boost::shared_ptr model); void start_note_diff_command (std::string name = "midi edit"); @@ -191,6 +190,8 @@ public: void delete_note (boost::shared_ptr); size_t selection_size() { return _selection.size(); } void select_all_notes (); + void select_range(framepos_t start, framepos_t end); + void invert_selection (); void move_selection(double dx, double dy, double cumulative_dy); void note_dropped (ArdourCanvas::CanvasNoteEvent* ev, ARDOUR::frameoffset_t, int8_t d_note); @@ -217,6 +218,7 @@ public: void update_resizing (ArdourCanvas::CanvasNoteEvent*, bool, double, bool); void commit_resizing (ArdourCanvas::CanvasNoteEvent*, bool, double, bool); + void abort_resizing (); /** Change the channel of the selection. * @param channel - the channel number of the new channel, zero-based @@ -228,6 +230,7 @@ public: Pressed, SelectTouchDragging, SelectRectDragging, + SelectVerticalDragging, AddDragging }; @@ -250,33 +253,46 @@ public: */ framepos_t snap_pixel_to_frame(double x); - ARDOUR::frameoffset_t snap_frame_to_frame (ARDOUR::frameoffset_t); - - /** Convert a timestamp in beats to frames (both relative to region start) */ - framepos_t beats_to_frames(double beats) const; - - /** Convert a timestamp in frames to beats (both relative to region start) */ - double frames_to_beats(framepos_t) const; - - void goto_previous_note (); - void goto_next_note (); + /** Convert a timestamp in beats into frames (both relative to region position) */ + framepos_t region_beats_to_region_frames(double beats) const; + /** Convert a timestamp in beats into absolute frames */ + framepos_t region_beats_to_absolute_frames(double beats) const { + return _region->position() + region_beats_to_region_frames (beats); + } + /** Convert a timestamp in frames to beats (both relative to region position) */ + double region_frames_to_region_beats(framepos_t) const; + + /** Convert a timestamp in beats measured from source start into absolute frames */ + framepos_t source_beats_to_absolute_frames(double beats) const; + /** Convert a timestamp in beats measured from source start into region-relative frames */ + framepos_t source_beats_to_region_frames(double beats) const { + return source_beats_to_absolute_frames (beats) - _region->position(); + } + /** Convert a timestamp in absolute frames to beats measured from source start*/ + double absolute_frames_to_source_beats(framepos_t) const; + + void goto_previous_note (bool add_to_selection); + void goto_next_note (bool add_to_selection); void change_note_lengths (bool, bool, Evoral::MusicalTime beats, bool start, bool end); 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 channel_edit (); void show_list_editor (); void selection_as_notelist (Notes& selected, bool allow_all_if_none_selected = false); void enable_display (bool); - + void set_channel_selector_scoped_note(ArdourCanvas::CanvasNoteEvent* note){ _channel_selection_scoped_note = note; } ArdourCanvas::CanvasNoteEvent* channel_selector_scoped_note(){ return _channel_selection_scoped_note; } void trim_front_starting (); void trim_front_ending (); - + + void create_note_at (framepos_t, double, double, bool); + protected: /** Allows derived types to specify their visibility requirements * to the TimeAxisViewItem parent class. @@ -295,8 +311,18 @@ protected: void reset_width_dependent_items (double pixel_width); + void parameter_changed (std::string const & p); + private: + friend class MidiRubberbandSelectDrag; + friend class MidiVerticalSelectDrag; + + /** Emitted when the selection has been cleared in one MidiRegionView */ + static PBD::Signal1 SelectionCleared; + PBD::ScopedConnection _selection_cleared_connection; + void selection_cleared (MidiRegionView *); + friend class EditNoteDialog; /** Play the NoteOn event of the given note immediately @@ -318,7 +344,7 @@ private: void midi_channel_mode_changed(ARDOUR::ChannelMode mode, uint16_t mask); void midi_patch_settings_changed(std::string model, std::string custom_device_mode); - void change_note_channel (ArdourCanvas::CanvasNoteEvent *, int8_t); + void change_note_channel (ArdourCanvas::CanvasNoteEvent *, int8_t, bool relative=false); void change_note_velocity(ArdourCanvas::CanvasNoteEvent* ev, int8_t vel, bool relative=false); void change_note_note(ArdourCanvas::CanvasNoteEvent* ev, int8_t note, bool relative=false); void change_note_time(ArdourCanvas::CanvasNoteEvent* ev, ARDOUR::MidiModel::TimeType, bool relative=false); @@ -326,9 +352,10 @@ private: void trim_note(ArdourCanvas::CanvasNoteEvent* ev, ARDOUR::MidiModel::TimeType start_delta, ARDOUR::MidiModel::TimeType end_delta); - void clear_selection_except(ArdourCanvas::CanvasNoteEvent* ev); - void clear_selection() { clear_selection_except(NULL); } - void update_drag_selection(double last_x, double x, double last_y, double y); + void clear_selection_except (ArdourCanvas::CanvasNoteEvent* ev, bool signal = true); + void clear_selection (bool signal = true) { clear_selection_except (0, signal); } + void update_drag_selection (double last_x, double x, double last_y, double y, bool extend); + void update_vertical_drag_selection (double last_y, double y, bool extend); void add_to_selection (ArdourCanvas::CanvasNoteEvent*); void remove_from_selection (ArdourCanvas::CanvasNoteEvent*); @@ -336,7 +363,6 @@ private: void show_verbose_cursor (std::string const &, double, double) const; void show_verbose_cursor (boost::shared_ptr) const; - int8_t _force_channel; uint16_t _last_channel_selection; uint8_t _current_range_min; uint8_t _current_range_max; @@ -361,16 +387,11 @@ private: ArdourCanvas::CanvasNote* _ghost_note; double _last_ghost_x; double _last_ghost_y; - double _drag_start_x; - double _drag_start_y; - double _last_x; - double _last_y; - ArdourCanvas::SimpleRect* _drag_rect; ArdourCanvas::SimpleRect* _step_edit_cursor; Evoral::MusicalTime _step_edit_cursor_width; Evoral::MusicalTime _step_edit_cursor_position; ArdourCanvas::CanvasNoteEvent* _channel_selection_scoped_note; - + /** A group used to temporarily reparent _note_group to during start trims, so * that the notes don't move with the parent region view. @@ -435,16 +456,19 @@ private: void display_patch_changes_on_channel (uint8_t); void connect_to_diskstream (); - void data_recorded (boost::shared_ptr, boost::weak_ptr); + void data_recorded (boost::weak_ptr); void remove_ghost_note (); void mouse_mode_changed (); double _last_event_x; double _last_event_y; + framepos_t snap_frame_to_grid_underneath (framepos_t p, framecnt_t &) const; + PBD::ScopedConnection _mouse_mode_connection; - Gdk::Cursor* _pre_enter_cursor; + Gdk::Cursor* pre_enter_cursor; + Gdk::Cursor* pre_press_cursor; };