00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef RAUL_TIME_SLICE_HPP
00019 #define RAUL_TIME_SLICE_HPP
00020
00021 #include <cassert>
00022 #include <cmath>
00023 #include <boost/utility.hpp>
00024 #include <raul/TimeStamp.hpp>
00025 #include <raul/lv2_event.h>
00026
00027 namespace Raul {
00028
00029
00030
00031
00050 class TimeSlice : public boost::noncopyable {
00051 public:
00052 TimeSlice(uint32_t rate, double bpm)
00053 : _tick_rate(rate)
00054 , _beat_rate(60.0/bpm)
00055 , _start_ticks(Raul::TimeUnit(Raul::TimeUnit::FRAMES, rate), 0, 0)
00056 , _length_ticks(TimeUnit(TimeUnit::FRAMES, rate), 0, 0)
00057 , _start_beats(TimeUnit(TimeUnit::BEATS, LV2_EVENT_PPQN), 0, 0)
00058 , _length_beats(TimeUnit(TimeUnit::BEATS, LV2_EVENT_PPQN), 0, 0)
00059 , _offset_ticks(TimeUnit(TimeUnit::FRAMES, rate), 0, 0)
00060 {}
00061
00062
00068 void set_window(TimeStamp start, TimeDuration length) {
00069 _start_ticks = start;
00070 _length_ticks = length;
00071 update_beat_time();
00072 }
00073
00074 void set_start(TimeStamp time) { _start_ticks = time; update_beat_time(); }
00075
00076 void set_length(TimeDuration length) { _length_ticks = length; update_beat_time(); }
00077
00078 bool contains(TimeStamp time) {
00079 return (time >= start_ticks() && time < start_ticks() + length_ticks());
00080 }
00081
00082 double tick_rate() { return _tick_rate; }
00083 double beat_rate() { return _beat_rate; }
00084 double bpm() { return 60/_beat_rate; }
00085
00086 void set_tick_rate(double tick_rate) {
00087 _tick_rate = tick_rate;
00088 update_beat_time();
00089 }
00090
00091 void set_bpm(double bpm) {
00092 _beat_rate = 60.0/bpm;
00093 update_beat_time();
00094 }
00095
00096
00097
00098 inline TimeStamp beats_to_seconds(TimeStamp beats) const {
00099
00100 throw;
00101 }
00102
00103 inline TimeStamp beats_to_ticks(TimeStamp beats) const {
00104
00105 throw;
00106 }
00107
00108 inline TimeStamp ticks_to_seconds(TimeStamp ticks) const {
00109
00110 throw;
00111 }
00112
00113 inline TimeStamp ticks_to_beats(TimeStamp ticks) const {
00114
00115 throw;
00116 }
00117
00119 inline TimeStamp start_ticks() const { return _start_ticks; }
00120
00122 inline TimeDuration length_ticks() const { return _length_ticks; }
00123
00125 inline TimeStamp start_beats() const { return _start_beats; }
00126
00128 inline TimeDuration length_beats() const { return _length_beats; }
00129
00131 inline void set_offset(TimeDuration offset) { _offset_ticks = offset; }
00132
00134 inline TimeDuration offset_ticks() const { return _offset_ticks; }
00135
00136 private:
00137
00138 inline void update_beat_time() {
00139 _start_beats = ticks_to_beats(_start_ticks);
00140 _length_beats = ticks_to_beats(_length_ticks);
00141 }
00142
00143
00144 double _tick_rate;
00145 double _beat_rate;
00146
00147
00148 TimeStamp _start_ticks;
00149 TimeDuration _length_ticks;
00150 TimeStamp _start_beats;
00151 TimeDuration _length_beats;
00152
00153 TimeDuration _offset_ticks;
00154 };
00155
00156
00157 }
00158
00159 #endif // RAUL_TIME_SLICE_HPP