Ardour  8.12
midi_track.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2006-2015 David Robillard <d@drobilla.net>
3  * Copyright (C) 2007-2017 Paul Davis <paul@linuxaudiosystems.com>
4  * Copyright (C) 2009-2012 Carl Hetherington <carl@carlh.net>
5  * Copyright (C) 2014-2019 Robin Gareus <robin@gareus.org>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License along
18  * with this program; if not, write to the Free Software Foundation, Inc.,
19  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20  */
21 
22 #ifndef __ardour_midi_track_h__
23 #define __ardour_midi_track_h__
24 
27 #include "ardour/track.h"
28 
29 namespace ARDOUR
30 {
31 
32 class InterThreadInfo;
33 class MidiPlaylist;
34 class RouteGroup;
35 class SMFSource;
36 class Session;
37 class VelocityControl;
38 
40 {
41 public:
42  MidiTrack (Session&, std::string name = "", TrackMode m = Normal);
44 
45  int init ();
46 
47  void realtime_locate (bool);
49 
52 
54  void unfreeze ();
55 
56  bool bounceable (std::shared_ptr<Processor>, bool include_endpoint) const;
57 
58  int export_stuff (BufferSet& bufs,
59  samplepos_t start_sample,
60  samplecnt_t end_sample,
61  std::shared_ptr<Processor> endpoint,
62  bool include_endpoint,
63  bool for_export,
64  bool for_freeze,
65  MidiNoteTracker& tracker);
66 
67  int set_state (const XMLNode&, int version);
68 
69  void midi_panic(void);
70  bool write_immediate_event (Evoral::EventType event_type, size_t size, const uint8_t* buf);
71  bool write_user_immediate_event (Evoral::EventType event_type, size_t size, const uint8_t* buf);
72 
73  std::shared_ptr<VelocityControl> velocity_control() const { return _velocity_control; }
74 
76  struct MidiControl : public AutomationControl {
77  MidiControl(MidiTrack* route, const Evoral::Parameter& param,
78  std::shared_ptr<AutomationList> al = std::shared_ptr<AutomationList>())
79  : AutomationControl (route->session(), param, ParameterDescriptor(param), al)
80  , _route (route)
81  {}
82 
83  bool writable() const { return true; }
84  void restore_value ();
85 
87 
88  private:
90  };
91 
93 
94  NoteMode note_mode() const { return _note_mode; }
96 
98 
99  bool step_editing() const { return _step_editing; }
100  void set_step_editing (bool yn);
101  MidiRingBuffer<samplepos_t>& step_edit_ring_buffer() { return _step_edit_ring_buffer; }
102 
103  PBD::Signal1<void,bool> StepEditStatusChange;
104 
105  std::shared_ptr<SMFSource> write_source (uint32_t n = 0);
106 
107  /* Configure capture/playback channels (see MidiChannelFilter). */
108  void set_capture_channel_mode (ChannelMode mode, uint16_t mask);
109  void set_playback_channel_mode (ChannelMode mode, uint16_t mask);
110  void set_playback_channel_mask (uint16_t mask);
111  void set_capture_channel_mask (uint16_t mask);
112 
113  ChannelMode get_playback_channel_mode() const { return _playback_filter.get_channel_mode(); }
114  ChannelMode get_capture_channel_mode() const { return _capture_filter.get_channel_mode(); }
115  uint16_t get_playback_channel_mask() const { return _playback_filter.get_channel_mask(); }
116  uint16_t get_capture_channel_mask() const { return _capture_filter.get_channel_mask(); }
117 
118  MidiChannelFilter& playback_filter() { return _playback_filter; }
119  MidiChannelFilter& capture_filter() { return _capture_filter; }
120 
121  virtual void filter_input (BufferSet& bufs);
122 
123  std::shared_ptr<MidiPlaylist> midi_playlist ();
124 
125  PBD::Signal1<void, std::weak_ptr<MidiSource> > DataRecorded;
126  std::shared_ptr<MidiBuffer> get_gui_feed_buffer () const;
127 
129  MonitorState get_input_monitoring_state (bool recording, bool talkback) const;
130 
131  MidiBuffer const& immediate_event_buffer () const { return _immediate_event_buffer; }
132  MidiBuffer const& user_immediate_event_buffer () const { return _user_immediate_event_buffer; }
133  MidiRingBuffer<samplepos_t>& immediate_events () { return _immediate_events; }
134  MidiRingBuffer<samplepos_t>& user_immediate_events () { return _user_immediate_events; }
135 
136  void set_input_active (bool);
137  bool input_active () const;
138  PBD::Signal0<void> InputActiveChanged;
139 
140  void set_restore_pgm_on_load (bool yn);
141  bool restore_pgm_on_load () const;
142 
144  void region_edited (std::shared_ptr<Region>);
145 
146 protected:
147 
148  XMLNode& state (bool save_template) const;
149 
150  void act_on_mute ();
152 
154  void write_out_of_band_data (BufferSet& bufs, samplecnt_t /* nframes */) const;
155 
156 
157 private:
169 
170  std::shared_ptr<VelocityControl> _velocity_control;
171 
174 
175  int no_roll_unlocked (pframes_t nframes, samplepos_t start_sample, samplepos_t end_sample, bool state_changing);
177 
179  void map_input_active (bool);
180 
181  void data_recorded (std::weak_ptr<MidiSource> src);
182 
184  void update_controls (BufferSet const& bufs);
186 
189 };
190 
191 } /* namespace ARDOUR*/
192 
193 #endif /* __ardour_midi_track_h__ */
MidiBuffer const & immediate_event_buffer() const
Definition: midi_track.h:131
NoteMode _note_mode
Definition: midi_track.h:163
void realtime_locate(bool)
std::shared_ptr< MidiPlaylist > midi_playlist()
void realtime_handle_transport_stopped()
void region_edited(std::shared_ptr< Region >)
void set_step_editing(bool yn)
MidiRingBuffer< samplepos_t > _immediate_events
Definition: midi_track.h:158
virtual void set_parameter_automation_state(Evoral::Parameter param, AutoState)
PBD::Signal0< void > InputActiveChanged
Definition: midi_track.h:138
std::shared_ptr< VelocityControl > _velocity_control
Definition: midi_track.h:170
void set_state_part_two()
bool write_immediate_event(Evoral::EventType event_type, size_t size, const uint8_t *buf)
virtual void filter_input(BufferSet &bufs)
bool _restore_pgm_on_load
Definition: midi_track.h:166
MidiBuffer _immediate_event_buffer
Definition: midi_track.h:160
void freeze_me(InterThreadInfo &)
MidiChannelFilter _capture_filter
Definition: midi_track.h:168
void set_note_mode(NoteMode m)
MidiBuffer const & user_immediate_event_buffer() const
Definition: midi_track.h:132
bool bounceable(std::shared_ptr< Processor >, bool include_endpoint) const
int no_roll_unlocked(pframes_t nframes, samplepos_t start_sample, samplepos_t end_sample, bool state_changing)
bool write_user_immediate_event(Evoral::EventType event_type, size_t size, const uint8_t *buf)
void midi_panic(void)
NoteMode note_mode() const
Definition: midi_track.h:94
uint16_t get_playback_channel_mask() const
Definition: midi_track.h:115
MidiChannelFilter & capture_filter()
Definition: midi_track.h:119
void non_realtime_locate(samplepos_t)
MonitorState get_input_monitoring_state(bool recording, bool talkback) const
std::shared_ptr< MidiBuffer > get_gui_feed_buffer() const
void set_playback_channel_mode(ChannelMode mode, uint16_t mask)
void playlist_contents_changed()
ChannelMode get_playback_channel_mode() const
Definition: midi_track.h:113
int export_stuff(BufferSet &bufs, samplepos_t start_sample, samplecnt_t end_sample, std::shared_ptr< Processor > endpoint, bool include_endpoint, bool for_export, bool for_freeze, MidiNoteTracker &tracker)
int set_state(const XMLNode &, int version)
void write_out_of_band_data(BufferSet &bufs, samplecnt_t) const
PBD::ScopedConnection playlist_content_change_connection
Definition: midi_track.h:188
PBD::Signal1< void, std::weak_ptr< MidiSource > > DataRecorded
Definition: midi_track.h:125
bool can_be_record_enabled()
MonitorState monitoring_state() const
void map_input_active(bool)
bool can_be_record_safe()
std::shared_ptr< VelocityControl > velocity_control() const
Definition: midi_track.h:73
void snapshot_out_of_band_data(samplecnt_t nframes)
std::string describe_parameter(Evoral::Parameter param)
void push_midi_input_to_step_edit_ringbuffer(samplecnt_t nframes)
MidiRingBuffer< samplepos_t > _user_immediate_events
Definition: midi_track.h:159
void set_playback_channel_mask(uint16_t mask)
ChannelMode get_capture_channel_mode() const
Definition: midi_track.h:114
MidiChannelFilter _playback_filter
Definition: midi_track.h:167
MidiRingBuffer< samplepos_t > & immediate_events()
Definition: midi_track.h:133
bool step_editing() const
Definition: midi_track.h:99
void set_capture_channel_mask(uint16_t mask)
void set_state_part_three()
MidiChannelFilter & playback_filter()
Definition: midi_track.h:118
MidiRingBuffer< samplepos_t > _step_edit_ring_buffer
Definition: midi_track.h:162
void set_restore_pgm_on_load(bool yn)
PBD::Signal1< void, bool > StepEditStatusChange
Definition: midi_track.h:103
MidiRingBuffer< samplepos_t > & user_immediate_events()
Definition: midi_track.h:134
void track_input_active(IOChange, void *)
MidiBuffer _user_immediate_event_buffer
Definition: midi_track.h:161
std::shared_ptr< SMFSource > write_source(uint32_t n=0)
MidiTrack(Session &, std::string name="", TrackMode m=Normal)
void data_recorded(std::weak_ptr< MidiSource > src)
void monitoring_changed(bool, PBD::Controllable::GroupControlDisposition)
void set_capture_channel_mode(ChannelMode mode, uint16_t mask)
void update_controls(BufferSet const &bufs)
void set_input_active(bool)
bool input_active() const
XMLNode & state(bool save_template) const
bool restore_pgm_on_load() const
uint16_t get_capture_channel_mask() const
Definition: midi_track.h:116
MidiRingBuffer< samplepos_t > & step_edit_ring_buffer()
Definition: midi_track.h:101
Definition: xml++.h:114
GtkImageIconNameData name
Definition: gtkimage.h:6
#define LIBARDOUR_API
void session(lua_State *L)
uint32_t pframes_t
Temporal::samplecnt_t samplecnt_t
Temporal::samplepos_t samplepos_t
void actually_set_value(double val, PBD::Controllable::GroupControlDisposition group_override)
MidiControl(MidiTrack *route, const Evoral::Parameter &param, std::shared_ptr< AutomationList > al=std::shared_ptr< AutomationList >())
Definition: midi_track.h:77