X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=gtk2_ardour%2Fmidi_region_view.h;h=c3084aee384a24e1f2d3700ee52dbce91ce8686f;hb=0b0d252acf107dd1498fd212d32677089d20bdc4;hp=846b1651a14b7b21ac5c805a4eccdb0b8b02ad11;hpb=d16bb0b8bc007e805b1c3b386d3595ba0e69938a;p=ardour.git diff --git a/gtk2_ardour/midi_region_view.h b/gtk2_ardour/midi_region_view.h index 846b1651a1..c3084aee38 100644 --- a/gtk2_ardour/midi_region_view.h +++ b/gtk2_ardour/midi_region_view.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2001-2010 Paul Davis + Copyright (C) 2001-2011 Paul Davis This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -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" @@ -68,7 +67,7 @@ class EditNoteDialog; class MidiRegionView : public RegionView { - public: +public: typedef Evoral::Note NoteType; typedef Evoral::Sequence::Notes Notes; @@ -85,30 +84,29 @@ class MidiRegionView : public RegionView 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); } + { return dynamic_cast(&trackview); } inline MidiStreamView* midi_stream_view() const - { return midi_view()->midi_view(); } + { return midi_view()->midi_view(); } void step_add_note (uint8_t channel, uint8_t number, uint8_t velocity, - Evoral::MusicalTime pos, Evoral::MusicalTime len); - void step_sustain (Evoral::MusicalTime beats); + Evoral::MusicalTime pos, Evoral::MusicalTime len); + void step_sustain (Evoral::MusicalTime beats); void set_height (double); void apply_note_range(uint8_t lowest, uint8_t highest, bool force=false); inline ARDOUR::ColorMode color_mode() const { return midi_view()->color_mode(); } 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 (); - void set_step_edit_cursor_width (Evoral::MusicalTime beats); + void color_handler (); + + void show_step_edit_cursor (Evoral::MusicalTime pos); + void move_step_edit_cursor (Evoral::MusicalTime pos); + void hide_step_edit_cursor (); + void set_step_edit_cursor_width (Evoral::MusicalTime beats); void redisplay_model(); @@ -154,6 +152,9 @@ class MidiRegionView : public RegionView */ 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 @@ class MidiRegionView : public RegionView 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"); @@ -176,8 +175,7 @@ class MidiRegionView : public RegionView void note_diff_add_note (const boost::shared_ptr note, bool selected, bool show_velocity = false); void note_diff_remove_note (ArdourCanvas::CanvasNoteEvent* ev); - void apply_diff(); - void apply_diff_as_subcommand(); + void apply_diff (bool as_subcommand = false); void abort_command(); void note_entered(ArdourCanvas::CanvasNoteEvent* ev); @@ -191,6 +189,9 @@ class MidiRegionView : public RegionView void delete_selection(); 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 @@ class MidiRegionView : public RegionView 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 @@ class MidiRegionView : public RegionView Pressed, SelectTouchDragging, SelectRectDragging, + SelectVerticalDragging, AddDragging }; @@ -250,38 +253,47 @@ class MidiRegionView : public RegionView */ framepos_t snap_pixel_to_frame(double x); - /** Snap a region relative frame coordinate to frame units. - * @param x a pixel coordinate relative to region start - * @return the snapped framepos_t coordinate relative to region start - */ - framepos_t snap_frame_to_frame(framepos_t x); - - /** 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 (); - - protected: + + void create_note_at (framepos_t, double, double, bool); + +protected: /** Allows derived types to specify their visibility requirements * to the TimeAxisViewItem parent class. */ @@ -299,7 +311,17 @@ class MidiRegionView : public RegionView void reset_width_dependent_items (double pixel_width); - private: + 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; @@ -307,7 +329,7 @@ class MidiRegionView : public RegionView * and schedule the playback of the corresponding NoteOff event. */ void play_midi_note(boost::shared_ptr note); - void play_midi_chord (std::vector > notes); + void play_midi_chord (std::vector > notes); /** Play the NoteOff-Event of the given note immediately * (scheduled by @ref play_midi_note()). @@ -322,24 +344,25 @@ class MidiRegionView : public RegionView 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); void change_note_length (ArdourCanvas::CanvasNoteEvent *, ARDOUR::MidiModel::TimeType); void trim_note(ArdourCanvas::CanvasNoteEvent* ev, ARDOUR::MidiModel::TimeType start_delta, - ARDOUR::MidiModel::TimeType end_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*); - uint8_t get_channel_for_add () const; + 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; @@ -364,16 +387,11 @@ class MidiRegionView : public RegionView 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::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. @@ -408,48 +426,49 @@ class MidiRegionView : public RegionView ArdourCanvas::CanvasNoteEvent* find_canvas_note (boost::shared_ptr); Events::iterator _optimization_iterator; - void update_note (ArdourCanvas::CanvasNote*); + void update_note (ArdourCanvas::CanvasNote *, bool update_ghost_regions = true); double update_hit (ArdourCanvas::CanvasHit *); void create_ghost_note (double, double); void update_ghost_note (double, double); MidiListEditor* _list_editor; - bool no_sound_notes; + bool _no_sound_notes; - PBD::ScopedConnection note_delete_connection; - void maybe_remove_deleted_note_from_selection (ArdourCanvas::CanvasNoteEvent*); + PBD::ScopedConnection note_delete_connection; + void maybe_remove_deleted_note_from_selection (ArdourCanvas::CanvasNoteEvent*); void snap_changed (); PBD::ScopedConnection snap_changed_connection; - void show_verbose_canvas_cursor (boost::shared_ptr) const; + bool motion (GdkEventMotion*); + bool scroll (GdkEventScroll*); + bool key_press (GdkEventKey*); + bool key_release (GdkEventKey*); + bool button_press (GdkEventButton*); + bool button_release (GdkEventButton*); + bool enter_notify (GdkEventCrossing*); + bool leave_notify (GdkEventCrossing*); - bool motion (GdkEventMotion*); - bool scroll (GdkEventScroll*); - bool key_press (GdkEventKey*); - bool key_release (GdkEventKey*); - bool button_press (GdkEventButton*); - bool button_release (GdkEventButton*); - bool enter_notify (GdkEventCrossing*); - bool leave_notify (GdkEventCrossing*); - - void drop_down_keys (); - void maybe_select_by_position (GdkEventButton* ev, double x, double y); - void get_events (Events& e, Evoral::Sequence::NoteOperator op, uint8_t val, int chan_mask = 0); + void drop_down_keys (); + void maybe_select_by_position (GdkEventButton* ev, double x, double y); + void get_events (Events& e, Evoral::Sequence::NoteOperator op, uint8_t val, int chan_mask = 0); 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; };