ardour
midi_source.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_source_h__
21 #define __ardour_midi_source_h__
22 
23 #include <string>
24 #include <time.h>
25 #include <glibmm/threads.h>
26 #include <boost/enable_shared_from_this.hpp>
27 #include "pbd/stateful.h"
28 #include "pbd/xml++.h"
29 #include "evoral/Sequence.hpp"
30 #include "ardour/ardour.h"
31 #include "ardour/buffer.h"
32 #include "ardour/source.h"
34 
35 namespace ARDOUR {
36 
37 class MidiChannelFilter;
38 class MidiStateTracker;
39 class MidiModel;
40 
41 template<typename T> class MidiRingBuffer;
42 
44 class LIBARDOUR_API MidiSource : virtual public Source, public boost::enable_shared_from_this<MidiSource>
45 {
46  public:
48 
49  MidiSource (Session& session, std::string name, Source::Flag flags = Source::Flag(0));
50  MidiSource (Session& session, const XMLNode&);
51  virtual ~MidiSource ();
52 
61  int write_to (const Lock& lock,
65 
75  virtual framecnt_t midi_read (const Lock& lock,
77  framepos_t source_start,
79  framecnt_t cnt,
80  MidiStateTracker* tracker,
81  MidiChannelFilter* filter,
82  const std::set<Evoral::Parameter>& filtered) const;
83 
89  virtual framecnt_t midi_write (const Lock& lock,
91  framepos_t source_start,
92  framecnt_t cnt);
93 
98  virtual void append_event_beats(const Lock& lock,
99  const Evoral::Event<Evoral::Beats>& ev) = 0;
100 
105  virtual void append_event_frames(const Lock& lock,
106  const Evoral::Event<framepos_t>& ev,
107  framepos_t source_start) = 0;
108 
109  virtual bool empty () const;
110  virtual framecnt_t length (framepos_t pos) const;
111  virtual void update_length (framecnt_t);
112 
113  virtual void mark_streaming_midi_write_started (const Lock& lock, NoteMode mode);
114  virtual void mark_streaming_write_started (const Lock& lock);
115  virtual void mark_streaming_write_completed (const Lock& lock);
116 
127  void mark_write_starting_now (framecnt_t position,
128  framecnt_t capture_length,
129  framecnt_t loop_length);
130 
131  /* like ::mark_streaming_write_completed() but with more arguments to
132  * allow control over MIDI-specific behaviour. Expected to be used only
133  * when recording actual MIDI input, rather then when importing files
134  * etc.
135  */
136  virtual void mark_midi_streaming_write_completed (
137  const Lock& lock,
139  Evoral::Beats when = Evoral::Beats());
140 
141  virtual void session_saved();
142 
143  std::string captured_for() const { return _captured_for; }
144  void set_captured_for (std::string str) { _captured_for = str; }
145 
146  static PBD::Signal1<void,MidiSource*> MidiSourceCreated;
147 
148  XMLNode& get_state ();
149  int set_state (const XMLNode&, int version);
150 
151  bool length_mutable() const { return true; }
152 
153  void set_length_beats(TimeType l) { _length_beats = l; }
154  TimeType length_beats() const { return _length_beats; }
155 
156  virtual void load_model(const Glib::Threads::Mutex::Lock& lock, bool force_reload=false) = 0;
157  virtual void destroy_model(const Glib::Threads::Mutex::Lock& lock) = 0;
158 
163  void invalidate(const Glib::Threads::Mutex::Lock& lock,
164  std::set<Evoral::Sequence<Evoral::Beats>::WeakNotePtr>* notes=NULL);
165 
166  void set_note_mode(const Glib::Threads::Mutex::Lock& lock, NoteMode mode);
167 
168  boost::shared_ptr<MidiModel> model() { return _model; }
169  void set_model(const Glib::Threads::Mutex::Lock& lock, boost::shared_ptr<MidiModel>);
170  void drop_model(const Glib::Threads::Mutex::Lock& lock);
171 
173  void set_interpolation_of (Evoral::Parameter, Evoral::ControlList::InterpolationStyle);
174  void copy_interpolation_from (boost::shared_ptr<MidiSource>);
175  void copy_interpolation_from (MidiSource *);
176 
177  AutoState automation_state_of (Evoral::Parameter) const;
178  void set_automation_state_of (Evoral::Parameter, AutoState);
179  void copy_automation_state_from (boost::shared_ptr<MidiSource>);
180  void copy_automation_state_from (MidiSource *);
181 
183  PBD::Signal0<void> ModelChanged;
185  PBD::Signal2<void, Evoral::Parameter, Evoral::ControlList::InterpolationStyle> InterpolationChanged;
187  PBD::Signal2<void, Evoral::Parameter, AutoState> AutomationStateChanged;
188 
189  protected:
190  virtual void flush_midi(const Lock& lock) = 0;
191 
192  virtual framecnt_t read_unlocked (const Lock& lock,
196  framecnt_t cnt,
197  MidiStateTracker* tracker,
198  MidiChannelFilter* filter) const = 0;
199 
205  virtual framecnt_t write_unlocked (const Lock& lock,
208  framecnt_t cnt) = 0;
209 
210  std::string _captured_for;
211 
213  bool _writing;
214 
216  mutable bool _model_iter_valid;
217 
220 
223 
226 
230  typedef std::map<Evoral::Parameter, Evoral::ControlList::InterpolationStyle> InterpolationStyleMap;
231  InterpolationStyleMap _interpolation_style;
232 
236  typedef std::map<Evoral::Parameter, AutoState> AutomationStateMap;
237  AutomationStateMap _automation_state;
238 };
239 
240 }
241 
242 #endif /* __ardour_midi_source_h__ */
NoteMode
Definition: types.h:204
LIBEVORAL_API const Beats MaxBeats
Definition: types.cpp:26
Glib::Threads::Mutex::Lock Lock
Definition: source.h:54
PBD::Signal2< void, Evoral::Parameter, AutoState > AutomationStateChanged
Definition: midi_source.h:187
PBD::Signal0< void > ModelChanged
Definition: midi_source.h:183
std::string _captured_for
Definition: midi_source.h:210
framepos_t _capture_length
Definition: midi_source.h:222
PBD::Signal2< void, Evoral::Parameter, Evoral::ControlList::InterpolationStyle > InterpolationChanged
Definition: midi_source.h:185
bool length_mutable() const
Definition: midi_source.h:151
LIBEVORAL_API const Beats MinBeats
Definition: types.cpp:27
LIBARDOUR_API PBD::PropertyDescriptor< framepos_t > start
Definition: region.cc:63
boost::shared_ptr< MidiModel > model()
Definition: midi_source.h:168
TimeType length_beats() const
Definition: midi_source.h:154
int64_t framecnt_t
Definition: types.h:76
void set_captured_for(std::string str)
Definition: midi_source.h:144
AutomationStateMap _automation_state
Definition: midi_source.h:237
Definition: amp.h:29
static PBD::Signal1< void, MidiSource * > MidiSourceCreated
Definition: midi_source.h:146
Evoral::Beats _length_beats
Definition: midi_source.h:218
Evoral::Beats TimeType
Definition: midi_source.h:47
int64_t framepos_t
Definition: types.h:66
framepos_t _last_read_end
Definition: midi_source.h:219
framepos_t _capture_loop_length
Definition: midi_source.h:225
#define LIBARDOUR_API
void set_length_beats(TimeType l)
Definition: midi_source.h:153
const char * name
Definition: xml++.h:95
LIBARDOUR_API PBD::PropertyDescriptor< framepos_t > position
Definition: region.cc:65
Evoral::Sequence< Evoral::Beats >::const_iterator _model_iter
Definition: midi_source.h:215
std::map< Evoral::Parameter, Evoral::ControlList::InterpolationStyle > InterpolationStyleMap
Definition: midi_source.h:230
boost::shared_ptr< MidiModel > _model
Definition: midi_source.h:212
std::string captured_for() const
Definition: midi_source.h:143
InterpolationStyleMap _interpolation_style
Definition: midi_source.h:231
std::map< Evoral::Parameter, AutoState > AutomationStateMap
Definition: midi_source.h:236
LIBARDOUR_API PBD::PropertyDescriptor< framecnt_t > length
Definition: region.cc:64
AutoState
Definition: types.h:145