X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fmidi_region_view.h;h=d1b646ce61b544f22beb1463650a4d7dfdb929cc;hb=6ae4f104371ed433a79c8845de97428d964edd8b;hp=a6750ef12305920e346e575b4590459c2279d755;hpb=0692e766f8142ee22e0ff1c03969e71f64dbbd5b;p=ardour.git diff --git a/gtk2_ardour/midi_region_view.h b/gtk2_ardour/midi_region_view.h index a6750ef123..d1b646ce61 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; @@ -64,6 +58,8 @@ class AutomationRegionView; class MidiCutBuffer; class MidiListEditor; class EditNoteDialog; +class NotePlayer; +class PatchChange; class MidiRegionView : public RegionView { @@ -74,7 +70,7 @@ public: MidiRegionView (ArdourCanvas::Group *, RouteTimeAxisView&, boost::shared_ptr, - double initial_samples_per_unit, + double initial_frames_per_pixel, Gdk::Color const & basic_color); MidiRegionView (const MidiRegionView& other); @@ -118,11 +114,7 @@ public: void cut_copy_clear (Editing::CutCopyOp); void paste (framepos_t pos, float times, const MidiCutBuffer&); - /** Add a new patch change flag to the canvas. - * @param patch the patch change to add - * @param the text to display in the flag - */ - void add_canvas_patch_change (ARDOUR::MidiModel::PatchChangePtr patch, const std::string& displaytext); + void add_canvas_patch_change (ARDOUR::MidiModel::PatchChangePtr patch, const std::string& displaytext, bool); /** Look up the given time and channel in the 'automation' and set keys accordingly. * @param time the time of the patch change event @@ -130,30 +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); /** 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 (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. */ @@ -170,22 +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 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(); } @@ -194,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); @@ -216,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. @@ -236,9 +236,11 @@ public: MouseState mouse_state() const { return _mouse_state; } + 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. @@ -282,12 +284,17 @@ public: void show_list_editor (); + typedef std::set Selection; + Selection selection () const { + return _selection; + } + 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 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 (); @@ -296,13 +303,7 @@ public: void clear_selection (bool signal = true) { clear_selection_except (0, signal); } - std::string model_name () const { - return _model_name; - } - - std::string custom_device_mode () const { - return _custom_device_mode; - } + ARDOUR::InstrumentInfo& instrument_info() const; protected: /** Allows derived types to specify their visibility requirements @@ -311,7 +312,7 @@ protected: MidiRegionView (ArdourCanvas::Group *, RouteTimeAxisView&, boost::shared_ptr, - double samples_per_unit, + double frames_per_pixel, Gdk::Color& basic_color, TimeAxisViewItem::Visibility); @@ -342,68 +343,59 @@ private: /** Play the NoteOn event of the given note immediately * and schedule the playback of the corresponding NoteOff event. */ - void play_midi_note(boost::shared_ptr note); - void play_midi_chord (std::vector > notes); - - /** Play the NoteOff-Event of the given note immediately - * (scheduled by @ref play_midi_note()). - */ - bool play_midi_note_off(boost::shared_ptr note); + void play_midi_note (boost::shared_ptr note); + void start_playing_midi_note (boost::shared_ptr note); + void start_playing_midi_chord (std::vector > notes); - void clear_events(); + void clear_events (bool with_selection_signal = true); bool canvas_event(GdkEvent* ev); bool note_canvas_event(GdkEvent* ev); - 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, 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 midi_channel_mode_changed (); + PBD::ScopedConnection _channel_mode_changed_connection; + void instrument_settings_changed (); + PBD::ScopedConnection _instrument_changed_connection; + + 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; - uint16_t _last_channel_selection; uint8_t _current_range_min; uint8_t _current_range_max; - /// MIDNAM information of the current track: Model name of MIDNAM file - std::string _model_name; - - /// MIDNAM information of the current track: CustomDeviceMode - std::string _custom_device_mode; - - 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 @@ -414,8 +406,7 @@ private: MouseState _mouse_state; int _pressed_button; - typedef std::set Selection; - /// Currently selected CanvasNoteEvents + /** Currently selected NoteBase objects */ Selection _selection; bool _sort_needed; @@ -436,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); @@ -448,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; @@ -466,7 +457,7 @@ private: 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 display_patch_changes_on_channel (uint8_t, bool); void connect_to_diskstream (); void data_recorded (boost::weak_ptr); @@ -482,6 +473,11 @@ private: Gdk::Cursor* pre_enter_cursor; Gdk::Cursor* pre_press_cursor; + + NotePlayer* _note_player; + + ARDOUR::ChannelMode get_channel_mode() const; + uint16_t get_selected_channels () const; };