19 #ifndef EVORAL_SEQUENCE_HPP
20 #define EVORAL_SEQUENCE_HPP
27 #include <boost/shared_ptr.hpp>
28 #include <glibmm/threads.h>
41 template<
typename Time>
class EventSink;
42 template<
typename Time>
class Note;
43 template<
typename Time>
class Event;
64 template<
typename Time>
73 : sequence_lock(new
Glib::Threads::RWLock::WriterLock(s))
74 , control_lock(new
Glib::Threads::Mutex::
Lock(c)) { }
92 virtual ReadLock
read_lock()
const {
return ReadLock(
new Glib::Threads::RWLock::ReaderLock(_lock)); }
93 virtual WriteLock
write_lock() {
return WriteLock(
new WriteLockImpl(_lock, _control_lock)); }
109 void end_write (StuckNoteOption, Time when = Time());
115 inline size_t n_notes()
const {
return _notes.size(); }
120 return a->time() < b->time();
126 return a->note() < b->note();
133 return a->time() < b->time();
141 return a->time() > b->time();
149 return a->end_time() > b->end_time();
153 typedef std::multiset<NotePtr, EarlierNoteComparator>
Notes;
154 inline Notes&
notes() {
return _notes; }
155 inline const Notes&
notes()
const {
return _notes; }
170 void get_notes (Notes&, NoteOperator, uint8_t val,
int chan_mask = 0)
const;
172 void remove_overlapping_notes ();
173 void trim_overlapping_notes ();
174 void remove_duplicate_notes ();
184 void set_overlap_pitch_resolution(OverlapPitchResolution opr);
192 inline bool operator() (constSysExPtr a, constSysExPtr b)
const {
193 return a->time() < b->time();
197 typedef std::multiset<SysExPtr, EarlierSysExComparator>
SysExes;
198 inline SysExes&
sysexes() {
return _sysexes; }
199 inline const SysExes&
sysexes()
const {
return _sysexes; }
205 inline bool operator() (constPatchChangePtr a, constPatchChangePtr b)
const {
206 return a->time() < b->time();
210 typedef std::multiset<PatchChangePtr, EarlierPatchChangeComparator>
PatchChanges;
212 inline const PatchChanges&
patch_changes ()
const {
return _patch_changes; }
214 void dump (std::ostream&)
const;
217 typedef std::priority_queue<NotePtr, std::deque<NotePtr>, LaterNoteEndComparator>
ActiveNotes;
227 const std::set<Evoral::Parameter>& filtered,
228 const std::set<WeakNotePtr>* active_notes=NULL);
230 inline bool valid()
const {
return !_is_end && _event; }
232 void invalidate(std::set<WeakNotePtr>* notes);
248 Time choose_next(Time earliest_t);
274 bool force_discrete =
false,
275 const std::set<Evoral::Parameter>&
f = std::set<Evoral::Parameter>(),
276 const std::set<WeakNotePtr>* active_notes = NULL)
const {
277 return const_iterator (*
this, t, force_discrete,
f, active_notes);
280 const const_iterator&
end()
const {
return _end_iter; }
283 typename Notes::const_iterator note_lower_bound (Time t)
const;
284 typename PatchChanges::const_iterator patch_change_lower_bound (Time t)
const;
285 typename SysExes::const_iterator sysex_lower_bound (Time t)
const;
288 typename Notes::iterator note_lower_bound (Time t);
289 typename PatchChanges::iterator patch_change_lower_bound (Time t);
290 typename SysExes::iterator sysex_lower_bound (Time t);
298 bool overlaps (
const NotePtr& ev,
299 const NotePtr& ignore_this_note)
const;
300 bool contains (
const NotePtr& ev)
const;
302 bool add_note_unlocked (
const NotePtr note,
void* arg = 0);
303 void remove_note_unlocked(
const constNotePtr note);
305 void add_patch_change_unlocked (
const PatchChangePtr);
306 void remove_patch_change_unlocked (
const constPatchChangePtr);
308 void add_sysex_unlocked (
const SysExPtr);
309 void remove_sysex_unlocked (
const SysExPtr);
319 mutable Glib::Threads::RWLock
_lock;
326 typedef std::multiset<NotePtr, NoteNumberComparator>
Pitches;
327 inline Pitches&
pitches(uint8_t chan) {
return _pitches[chan&0xf]; }
328 inline const Pitches&
pitches(uint8_t chan)
const {
return _pitches[chan&0xf]; }
330 virtual void control_list_marked_dirty ();
333 friend class const_iterator;
335 bool overlaps_unlocked (
const NotePtr& ev,
const NotePtr& ignore_this_note)
const;
336 bool contains_unlocked (
const NotePtr& ev)
const;
344 void get_notes_by_pitch (Notes&,
NoteOperator, uint8_t val,
int chan_mask = 0)
const;
345 void get_notes_by_velocity (Notes&,
NoteOperator, uint8_t val,
int chan_mask = 0)
const;
350 Pitches _pitches[16];
354 typedef std::multiset<NotePtr, EarlierNoteComparator>
WriteNotes;
355 WriteNotes _write_notes[16];
373 template<
typename Time> std::ostream& operator<<(std::ostream& o, const Evoral::Sequence<Time>& s) { s.dump (o);
return o; }
376 #endif // EVORAL_SEQUENCE_HPP
bool operator()(const boost::shared_ptr< const Note< Time > > a, const boost::shared_ptr< const Note< Time > > b) const
boost::shared_ptr< const Evoral::Note< Time > > constNotePtr
const PatchChanges & patch_changes() const
std::multiset< NotePtr, EarlierNoteComparator > Notes
OverlapPitchResolution _overlap_pitch_resolution
boost::shared_ptr< const Event< Time > > constSysExPtr
std::multiset< NotePtr, EarlierNoteComparator > WriteNotes
boost::shared_ptr< const PatchChange< Time > > constPatchChangePtr
bool overlapping_pitches_accepted() const
bool operator()(const boost::shared_ptr< const Note< Time > > a, const boost::shared_ptr< const Note< Time > > b) const
std::multiset< NotePtr, NoteNumberComparator > Pitches
bool operator()(const boost::shared_ptr< const Note< Time > > a, const boost::shared_ptr< const Note< Time > > b) const
boost::shared_ptr< Glib::Threads::RWLock::ReaderLock > ReadLock
boost::weak_ptr< Evoral::Note< Time > > WeakNotePtr
const Note< Time > * value_type
boost::shared_ptr< Event< Time > > _event
const SysExes & sysexes() const
PatchChanges _patch_changes
const TypeMap & _type_map
OverlapPitchResolution overlap_pitch_resolution() const
uint8_t highest_note() const
LIBEVORAL_API uint64_t Sequence
const Pitches & pitches(uint8_t chan) const
const const_iterator _end_iter
const Event< Time > & operator*() const
ControlIterator(boost::shared_ptr< const ControlList > al, double ax, double ay)
PatchChanges & patch_changes()
Notes::const_iterator _note_iter
const Sequence< Time > * _seq
ActiveNotes _active_notes
virtual WriteLock write_lock()
const boost::shared_ptr< Event< Time > > get_event_pointer()
const const_iterator & end() const
Glib::Threads::Mutex::Lock * control_lock
SysExes::const_iterator _sysex_iter
boost::shared_ptr< Evoral::Note< Time > > NotePtr
virtual ReadLock read_lock() const
WriteLockImpl(Glib::Threads::RWLock &s, Glib::Threads::Mutex &c)
std::multiset< SysExPtr, EarlierSysExComparator > SysExes
Pitches & pitches(uint8_t chan)
bool _overlapping_pitches_accepted
virtual bool controls_empty() const
uint8_t lowest_note() const
boost::shared_ptr< WriteLockImpl > WriteLock
void set_percussive(bool p)
const_iterator begin(Time t=Time(), bool force_discrete=false, const std::set< Evoral::Parameter > &f=std::set< Evoral::Parameter >(), const std::set< WeakNotePtr > *active_notes=NULL) const
bool operator()(const boost::shared_ptr< const Note< Time > > a, const boost::shared_ptr< const Note< Time > > b) const
PatchChanges::const_iterator _patch_change_iter
static bool note_time_comparator(const boost::shared_ptr< const Note< Time > > &a, const boost::shared_ptr< const Note< Time > > &b)
bool operator!=(const const_iterator &other) const
bool operator==(Range< T > a, Range< T > b)
ControlIterators::iterator _control_iter
Glib::Threads::RWLock _lock
boost::shared_ptr< const ControlList > list
const Note< Time > * value_type
std::multiset< PatchChangePtr, EarlierPatchChangeComparator > PatchChanges
const TypeMap & type_map() const
ControlIterators _control_iters
std::vector< ControlIterator > ControlIterators
virtual int resolve_overlaps_unlocked(const NotePtr, void *=0)
boost::shared_ptr< PatchChange< Time > > PatchChangePtr
std::priority_queue< NotePtr, std::deque< NotePtr >, LaterNoteEndComparator > ActiveNotes
const Notes & notes() const
Glib::Threads::RWLock::WriterLock * sequence_lock
int _active_patch_change_message
void overlapping_pitches_accepted(bool yn)
const boost::shared_ptr< Event< Time > > operator->() const
boost::shared_ptr< Event< Time > > SysExPtr