X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fmidi_region_view.h;h=3c001473935a82f0228966dec18ee9ef9cd27102;hb=b713af2083c9da1ab6f82b47abae1da94bc96654;hp=65d88550934ab53a9fa0bf40bec24808af0aec94;hpb=617720539880e62e838f6215c719e5129f98b140;p=ardour.git diff --git a/gtk2_ardour/midi_region_view.h b/gtk2_ardour/midi_region_view.h index 65d8855093..3c00147393 100644 --- a/gtk2_ardour/midi_region_view.h +++ b/gtk2_ardour/midi_region_view.h @@ -22,14 +22,10 @@ #include #include -#include -#include #include "pbd/signals.h" -#include "ardour/midi_track.h" #include "ardour/midi_model.h" -#include "ardour/diskstream.h" #include "ardour/types.h" #include "editing.h" @@ -38,12 +34,6 @@ #include "time_axis_view_item.h" #include "automation_line.h" #include "enums.h" -#include "canvas.h" -#include "canvas-hit.h" -#include "canvas-note.h" -#include "canvas-note-event.h" -#include "canvas_patch_change.h" -#include "canvas-sysex.h" namespace ARDOUR { class MidiRegion; @@ -57,6 +47,10 @@ namespace MIDI { }; }; +class SysEx; +class NoteBase; +class Note; +class Hit; class MidiTimeAxisView; class GhostRegion; class AutomationTimeAxisView; @@ -65,6 +59,7 @@ class MidiCutBuffer; class MidiListEditor; class EditNoteDialog; class NotePlayer; +class PatchChange; class MidiRegionView : public RegionView { @@ -75,7 +70,7 @@ public: MidiRegionView (ArdourCanvas::Group *, RouteTimeAxisView&, boost::shared_ptr, - double initial_samples_per_unit, + double initial_samples_per_pixel, Gdk::Color const & basic_color); MidiRegionView (const MidiRegionView& other); @@ -127,36 +122,36 @@ public: * @key a reference to an instance of MIDI::Name::PatchPrimaryKey whose fields will * will be set according to the result of the lookup */ - void get_patch_key_at (double time, uint8_t channel, MIDI::Name::PatchPrimaryKey& key); + void get_patch_key_at (double time, uint8_t channel, MIDI::Name::PatchPrimaryKey& key) const; - /** Convert a given PatchChange into a PatchPrimaryKey - */ - MIDI::Name::PatchPrimaryKey patch_change_to_patch_key (ARDOUR::MidiModel::PatchChangePtr); + /** Convert a given PatchChange into a PatchPrimaryKey + */ + MIDI::Name::PatchPrimaryKey patch_change_to_patch_key (ARDOUR::MidiModel::PatchChangePtr); /** Change old_patch to new_patch. * @param old_patch the canvas patch change which is to be altered * @param new_patch new patch */ - void change_patch_change (ArdourCanvas::CanvasPatchChange& old_patch, const MIDI::Name::PatchPrimaryKey& new_patch); + void change_patch_change (PatchChange& old_patch, const MIDI::Name::PatchPrimaryKey& new_patch); void change_patch_change (ARDOUR::MidiModel::PatchChangePtr, Evoral::PatchChange const &); void add_patch_change (framecnt_t, Evoral::PatchChange const &); - void move_patch_change (ArdourCanvas::CanvasPatchChange &, Evoral::MusicalTime); - void delete_patch_change (ArdourCanvas::CanvasPatchChange *); - void edit_patch_change (ArdourCanvas::CanvasPatchChange *); + void move_patch_change (PatchChange &, Evoral::MusicalTime); + void delete_patch_change (PatchChange *); + void edit_patch_change (PatchChange *); - void delete_sysex (ArdourCanvas::CanvasSysEx*); + void delete_sysex (SysEx*); /** Alter a given patch to be its predecessor in the MIDNAM file. */ - void previous_patch (ArdourCanvas::CanvasPatchChange &); + void previous_patch (PatchChange &); /** Alters a given patch to be its successor in the MIDNAM file. */ - void next_patch (ArdourCanvas::CanvasPatchChange &); + void next_patch (PatchChange &); - void previous_bank (ArdourCanvas::CanvasPatchChange &); - void next_bank (ArdourCanvas::CanvasPatchChange &); + void previous_bank (PatchChange &); + void next_bank (PatchChange &); /** Displays all patch change events in the region as flags on the canvas. */ @@ -173,24 +168,24 @@ public: void display_model(boost::shared_ptr model); void start_note_diff_command (std::string name = "midi edit"); - void note_diff_add_change (ArdourCanvas::CanvasNoteEvent* ev, ARDOUR::MidiModel::NoteDiffCommand::Property, uint8_t val); - void note_diff_add_change (ArdourCanvas::CanvasNoteEvent* ev, ARDOUR::MidiModel::NoteDiffCommand::Property, Evoral::MusicalTime val); + void note_diff_add_change (NoteBase* ev, ARDOUR::MidiModel::NoteDiffCommand::Property, uint8_t val); + void note_diff_add_change (NoteBase* ev, ARDOUR::MidiModel::NoteDiffCommand::Property, Evoral::MusicalTime val); 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 note_diff_remove_note (NoteBase* ev); void apply_diff (bool as_subcommand = false); void abort_command(); - void note_entered(ArdourCanvas::CanvasNoteEvent* ev); - void note_left(ArdourCanvas::CanvasNoteEvent* ev); - void patch_entered (ArdourCanvas::CanvasPatchChange *); - void patch_left (ArdourCanvas::CanvasPatchChange *); - void sysex_entered (ArdourCanvas::CanvasSysEx* p); - void sysex_left (ArdourCanvas::CanvasSysEx* p); + void note_entered(NoteBase* ev); + void note_left(NoteBase* ev); + void patch_entered (PatchChange *); + void patch_left (PatchChange *); + void sysex_entered (SysEx* p); + void sysex_left (SysEx* p); void note_mouse_position (float xfraction, float yfraction, bool can_set_cursor=true); - void unique_select(ArdourCanvas::CanvasNoteEvent* ev); - void note_selected(ArdourCanvas::CanvasNoteEvent* ev, bool add, bool extend=false); - void note_deselected(ArdourCanvas::CanvasNoteEvent* ev); + void unique_select(NoteBase* ev); + void note_selected(NoteBase* ev, bool add, bool extend=false); + void note_deselected(NoteBase* ev); void delete_selection(); void delete_note (boost::shared_ptr); size_t selection_size() { return _selection.size(); } @@ -199,7 +194,7 @@ public: 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); + void note_dropped (NoteBase* ev, ARDOUR::frameoffset_t, int8_t d_note); void select_matching_notes (uint8_t notenum, uint16_t channel_mask, bool add, bool extend); void toggle_matching_notes (uint8_t notenum, uint16_t channel_mask); @@ -221,8 +216,8 @@ public: */ void begin_resizing(bool at_front); - void update_resizing (ArdourCanvas::CanvasNoteEvent*, bool, double, bool); - void commit_resizing (ArdourCanvas::CanvasNoteEvent*, bool, double, bool); + void update_resizing (NoteBase*, bool, double, bool); + void commit_resizing (NoteBase*, bool, double, bool); void abort_resizing (); /** Change the channel of the selection. @@ -244,8 +239,8 @@ public: void note_button_release (); struct NoteResizeData { - ArdourCanvas::CanvasNote *canvas_note; - ArdourCanvas::SimpleRect *resize_rect; + Note *note; + ArdourCanvas::Rectangle *resize_rect; }; /** Snap a region relative pixel coordinate to pixel units. @@ -258,7 +253,7 @@ public: * @param x a pixel coordinate relative to region start * @return the snapped framepos_t coordinate relative to region start */ - framepos_t snap_pixel_to_frame(double x); + framepos_t snap_pixel_to_sample(double x); /** Convert a timestamp in beats into frames (both relative to region position) */ framepos_t region_beats_to_region_frames(double beats) const; @@ -289,7 +284,7 @@ public: void show_list_editor (); - typedef std::set Selection; + typedef std::set Selection; Selection selection () const { return _selection; } @@ -298,8 +293,8 @@ public: 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 set_channel_selector_scoped_note(NoteBase* note){ _channel_selection_scoped_note = note; } + NoteBase* channel_selector_scoped_note(){ return _channel_selection_scoped_note; } void trim_front_starting (); void trim_front_ending (); @@ -317,7 +312,7 @@ protected: MidiRegionView (ArdourCanvas::Group *, RouteTimeAxisView&, boost::shared_ptr, - double samples_per_unit, + double samples_per_pixel, Gdk::Color& basic_color, TimeAxisViewItem::Visibility); @@ -357,52 +352,50 @@ private: bool canvas_event(GdkEvent* ev); bool note_canvas_event(GdkEvent* ev); - void midi_channel_mode_changed(ARDOUR::ChannelMode mode, uint16_t mask); + void midi_channel_mode_changed (); + PBD::ScopedConnection _channel_mode_changed_connection; void instrument_settings_changed (); PBD::ScopedConnection _instrument_changed_connection; - 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, + void change_note_channel (NoteBase *, int8_t, bool relative=false); + void change_note_velocity(NoteBase* ev, int8_t vel, bool relative=false); + void change_note_note(NoteBase* ev, int8_t note, bool relative=false); + void change_note_time(NoteBase* ev, ARDOUR::MidiModel::TimeType, bool relative=false); + void change_note_length (NoteBase *, ARDOUR::MidiModel::TimeType); + void trim_note(NoteBase* ev, ARDOUR::MidiModel::TimeType start_delta, ARDOUR::MidiModel::TimeType end_delta); - void clear_selection_except (ArdourCanvas::CanvasNoteEvent* ev, bool signal = true); + void clear_selection_except (NoteBase* ev, bool signal = true); 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*); + void add_to_selection (NoteBase*); + void remove_from_selection (NoteBase*); void show_verbose_cursor (std::string const &, double, double) const; void show_verbose_cursor (boost::shared_ptr) const; - ARDOUR::ChannelMode _last_channel_mode; - uint16_t _last_channel_selection; - uint8_t _current_range_min; uint8_t _current_range_max; - typedef std::list Events; - typedef std::vector< boost::shared_ptr > PatchChanges; - typedef std::vector< boost::shared_ptr > SysExes; + typedef std::list Events; + typedef std::vector< boost::shared_ptr > PatchChanges; + typedef std::vector< boost::shared_ptr > SysExes; boost::shared_ptr _model; Events _events; PatchChanges _patch_changes; SysExes _sys_exes; - ArdourCanvas::CanvasNote** _active_notes; + Note** _active_notes; ArdourCanvas::Group* _note_group; ARDOUR::MidiModel::NoteDiffCommand* _note_diff_command; - ArdourCanvas::CanvasNote* _ghost_note; + Note* _ghost_note; double _last_ghost_x; double _last_ghost_y; - ArdourCanvas::SimpleRect* _step_edit_cursor; + ArdourCanvas::Rectangle* _step_edit_cursor; Evoral::MusicalTime _step_edit_cursor_width; Evoral::MusicalTime _step_edit_cursor_position; - ArdourCanvas::CanvasNoteEvent* _channel_selection_scoped_note; + NoteBase* _channel_selection_scoped_note; /** A group used to temporarily reparent _note_group to during start trims, so @@ -413,7 +406,7 @@ private: MouseState _mouse_state; int _pressed_button; - /** Currently selected CanvasNoteEvents */ + /** Currently selected NoteBase objects */ Selection _selection; bool _sort_needed; @@ -434,11 +427,11 @@ private: /** connection used to connect to model's ContentChanged signal */ PBD::ScopedConnection content_connection; - ArdourCanvas::CanvasNoteEvent* find_canvas_note (boost::shared_ptr); + NoteBase* find_canvas_note (boost::shared_ptr); Events::iterator _optimization_iterator; - void update_note (ArdourCanvas::CanvasNote *, bool update_ghost_regions = true); - double update_hit (ArdourCanvas::CanvasHit *); + void update_note (Note *, bool update_ghost_regions = true); + double update_hit (Hit *); void create_ghost_note (double, double); void update_ghost_note (double, double); @@ -446,7 +439,7 @@ private: bool _no_sound_notes; PBD::ScopedConnection note_delete_connection; - void maybe_remove_deleted_note_from_selection (ArdourCanvas::CanvasNoteEvent*); + void maybe_remove_deleted_note_from_selection (NoteBase*); void snap_changed (); PBD::ScopedConnection snap_changed_connection; @@ -482,6 +475,9 @@ private: Gdk::Cursor* pre_press_cursor; NotePlayer* _note_player; + + ARDOUR::ChannelMode get_channel_mode() const; + uint16_t get_selected_channels () const; };