ardour
midi_track.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2006 Paul Davis
3  Author: David Robillard
4 
5  This program is free software; you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation; either version 2 of the License, or
8  (at your option) any later version.
9 
10  This program is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU General Public License for more details.
14 
15  You should have received a copy of the GNU General Public License
16  along with this program; if not, write to the Free Software
17  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 */
19 
20 #ifndef __ardour_midi_track_h__
21 #define __ardour_midi_track_h__
22 
25 #include "ardour/track.h"
26 
27 namespace ARDOUR
28 {
29 
30 class InterThreadInfo;
31 class MidiDiskstream;
32 class MidiPlaylist;
33 class RouteGroup;
34 class SMFSource;
35 class Session;
36 
38 {
39 public:
40  MidiTrack (Session&, std::string name, Route::Flag f = Route::Flag (0), TrackMode m = Normal);
41  ~MidiTrack ();
42 
43  int init ();
44 
45  int roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& need_butler);
46 
47  void realtime_handle_transport_stopped ();
48  void realtime_locate ();
49  void non_realtime_locate (framepos_t);
50 
51  boost::shared_ptr<Diskstream> create_diskstream ();
52  void set_diskstream (boost::shared_ptr<Diskstream>);
53  void set_record_enabled (bool yn, void *src);
54 
55  DataType data_type () const {
56  return DataType::MIDI;
57  }
58 
59  void freeze_me (InterThreadInfo&);
60  void unfreeze ();
61 
62  bool bounceable (boost::shared_ptr<Processor>, bool) const { return false; }
65  framepos_t end,
66  InterThreadInfo& iti,
68  bool include_endpoint);
69 
70  int export_stuff (BufferSet& bufs,
71  framepos_t start_frame,
72  framecnt_t end_frame,
74  bool include_endpoint,
75  bool for_export,
76  bool for_freeze);
77 
78  int set_state (const XMLNode&, int version);
79 
80  void midi_panic(void);
81  bool write_immediate_event(size_t size, const uint8_t* buf);
82 
84  struct MidiControl : public AutomationControl {
85  MidiControl(MidiTrack* route, const Evoral::Parameter& param,
87  : AutomationControl (route->session(), param, ParameterDescriptor(param), al)
88  , _route (route)
89  {}
90 
91  void set_value (double val);
92 
94  };
95 
96  virtual void set_parameter_automation_state (Evoral::Parameter param, AutoState);
97 
98  NoteMode note_mode() const { return _note_mode; }
99  void set_note_mode (NoteMode m);
100 
101  std::string describe_parameter (Evoral::Parameter param);
102 
103  bool step_editing() const { return _step_editing; }
104  void set_step_editing (bool yn);
105  MidiRingBuffer<framepos_t>& step_edit_ring_buffer() { return _step_edit_ring_buffer; }
106 
107  PBD::Signal1<void,bool> StepEditStatusChange;
108 
109  boost::shared_ptr<SMFSource> write_source (uint32_t n = 0);
110 
111  /* Configure capture/playback channels (see MidiChannelFilter). */
112  void set_capture_channel_mode (ChannelMode mode, uint16_t mask);
113  void set_playback_channel_mode (ChannelMode mode, uint16_t mask);
114  void set_playback_channel_mask (uint16_t mask);
115  void set_capture_channel_mask (uint16_t mask);
116 
117  ChannelMode get_playback_channel_mode() const { return _playback_filter.get_channel_mode(); }
118  ChannelMode get_capture_channel_mode() const { return _capture_filter.get_channel_mode(); }
119  uint16_t get_playback_channel_mask() const { return _playback_filter.get_channel_mask(); }
120  uint16_t get_capture_channel_mask() const { return _capture_filter.get_channel_mask(); }
121 
122  MidiChannelFilter& playback_filter() { return _playback_filter; }
123  MidiChannelFilter& capture_filter() { return _capture_filter; }
124 
125  boost::shared_ptr<MidiPlaylist> midi_playlist ();
126 
127  PBD::Signal1<void, boost::weak_ptr<MidiSource> > DataRecorded;
128  boost::shared_ptr<MidiBuffer> get_gui_feed_buffer () const;
129 
130  void set_monitoring (MonitorChoice);
131  MonitorState monitoring_state () const;
132 
133  void set_input_active (bool);
134  bool input_active () const;
135  PBD::Signal0<void> InputActiveChanged;
136 
137 protected:
138  XMLNode& state (bool full);
139 
140  void act_on_mute ();
141 
142 private:
150 
151  virtual boost::shared_ptr<Diskstream> diskstream_factory (XMLNode const &);
152 
153  boost::shared_ptr<MidiDiskstream> midi_diskstream () const;
154 
155  void write_out_of_band_data (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, framecnt_t nframes);
156 
157  void set_state_part_two ();
158  void set_state_part_three ();
159 
160 
161  int no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool state_changing);
162  void push_midi_input_to_step_edit_ringbuffer (framecnt_t nframes);
163 
164  void diskstream_data_recorded (boost::weak_ptr<MidiSource>);
166 
167  void track_input_active (IOChange, void*);
168  void map_input_active (bool);
169 
171  void update_controls (const BufferSet& bufs);
172 };
173 
174 } /* namespace ARDOUR*/
175 
176 #endif /* __ardour_midi_track_h__ */
NoteMode
Definition: types.h:204
DataType data_type() const
Definition: midi_track.h:55
NoteMode _note_mode
Definition: midi_track.h:145
uint32_t pframes_t
Definition: types.h:61
tuple f
Definition: signals.py:35
MonitorChoice
Definition: types.h:386
uint16_t get_playback_channel_mask() const
Definition: midi_track.h:119
ChannelMode
Definition: types.h:209
LIBARDOUR_API PBD::PropertyDescriptor< framepos_t > start
Definition: region.cc:63
MidiChannelFilter _capture_filter
Definition: midi_track.h:149
PBD::ScopedConnection _diskstream_data_recorded_connection
Definition: midi_track.h:165
MidiChannelFilter & playback_filter()
Definition: midi_track.h:122
PBD::Signal1< void, bool > StepEditStatusChange
Definition: midi_track.h:107
MidiRingBuffer< framepos_t > _step_edit_ring_buffer
Definition: midi_track.h:144
uint16_t get_capture_channel_mask() const
Definition: midi_track.h:120
TrackMode
Definition: types.h:198
int64_t framecnt_t
Definition: types.h:76
PBD::Signal0< void > InputActiveChanged
Definition: midi_track.h:135
MidiRingBuffer< framepos_t > _immediate_events
Definition: midi_track.h:143
MidiChannelFilter & capture_filter()
Definition: midi_track.h:123
Definition: amp.h:29
MonitorState
Definition: types.h:393
int64_t framepos_t
Definition: types.h:66
NoteMode note_mode() const
Definition: midi_track.h:98
#define LIBARDOUR_API
const char * name
PBD::Signal1< void, boost::weak_ptr< MidiSource > > DataRecorded
Definition: midi_track.h:127
MidiControl(MidiTrack *route, const Evoral::Parameter &param, boost::shared_ptr< AutomationList > al=boost::shared_ptr< AutomationList >())
Definition: midi_track.h:85
Definition: xml++.h:95
ChannelMode get_capture_channel_mode() const
Definition: midi_track.h:118
MidiRingBuffer< framepos_t > & step_edit_ring_buffer()
Definition: midi_track.h:105
bool bounceable(boost::shared_ptr< Processor >, bool) const
Definition: midi_track.h:62
ChannelMode get_playback_channel_mode() const
Definition: midi_track.h:117
MidiChannelFilter _playback_filter
Definition: midi_track.h:148
LIBARDOUR_API bool init(bool with_vst, bool try_optimization, const char *localedir)
Definition: globals.cc:376
bool step_editing() const
Definition: midi_track.h:103
AutoState
Definition: types.h:145