23#include "AbstractField.h"
31template <
size_t COUNT>
49 virtual float at(
float proportion)
override {
52 return _buffer[_trueIndex(LAST_INDEX)];
55 float indexFloat = max(proportion, 0) * LAST_INDEX;
58 size_t prevIndex = floor(indexFloat);
59 float lerpFactor = indexFloat - prevIndex;
62 prevIndex = _trueIndex(prevIndex);
65 size_t nextIndex = (prevIndex + 1) % COUNT;
68 return mapFrom01(lerpFactor, _buffer[prevIndex], _buffer[nextIndex]);
72 virtual float get()
override {
return _lastValue; }
79 virtual float put(
float value)
override {
83 _currentSumValuesStep += value;
98 float period()
const {
return _period; }
101 float atIndex(
size_t index) {
return _buffer[_trueIndex(index)]; }
104 size_t count()
const {
return COUNT; }
107 bool updated() {
return _rolling ? _changed : _full; }
116 _currentSumValuesStep = 0;
142 void _updateBuffer() {
145 float value = (_nValuesStep ? _currentSumValuesStep / _nValuesStep : _lastValue);
148 while (_previousIndex != _index) {
149 _buffer[_previousIndex] = value;
150 _previousIndex = (_previousIndex + 1) % COUNT;
152 _buffer[_index] = value;
155 virtual void step()
override {
157 if (_full && !_rolling)
161 size_t prevIndex = _index;
164 bool needsUpdate =
false;
167 if (phase32Update(_phase32, _period,
sampleRate(),
true)) {
175 _index = floor(fixed32ToFloat(_phase32) * COUNT);
176 needsUpdate = (_index < LAST_INDEX);
180 _changed = (_index != prevIndex);
183 if (needsUpdate && _changed) {
188 _currentSumValuesStep = 0;
196 case EVENT_UPDATE:
return updated();
203 size_t _trueIndex(
size_t index) {
206 if (_full && _rolling)
210 return index % COUNT;
215 static constexpr size_t LAST_INDEX = COUNT - 1;
218 float _buffer[COUNT] = {};
224 size_t _previousIndex;
233 float _currentSumValuesStep;
234 uint16_t _nValuesStep;
Definition AbstractField.h:28
TimeSliceField generic class.
Definition TimeSliceField.h:33
virtual bool eventTriggered(EventType eventType)
Returns true iff an event of a certain type has been triggered.
Definition TimeSliceField.h:194
float period() const
Returns period.
Definition TimeSliceField.h:98
bool updated()
Returns true if the field has been updated and is ready to be used.
Definition TimeSliceField.h:107
size_t count() const
Returns count.
Definition TimeSliceField.h:104
virtual float get() override
Returns value.
Definition TimeSliceField.h:72
float atIndex(size_t index)
Returns value at given index.
Definition TimeSliceField.h:101
bool isFull()
Returns true if the field is full.
Definition TimeSliceField.h:110
virtual float at(float proportion) override
Returns value at given proportion in [0, 1].
Definition TimeSliceField.h:49
void setRolling(bool rolling)
Sets rolling mode.
Definition TimeSliceField.h:126
bool isRolling() const
Returns true if rolling mode is active.
Definition TimeSliceField.h:135
void period(float period)
Sets period over which the time slice occurs.
Definition TimeSliceField.h:95
void noRolling()
Deactivates rolling mode.
Definition TimeSliceField.h:132
TimeSliceField(float period)
Constructor.
Definition TimeSliceField.h:39
void rolling()
Activates rolling mode.
Definition TimeSliceField.h:129
virtual void onUpdate(EventCallback callback)
Registers event callback on update event.
Definition TimeSliceField.h:138
void reset()
Resets the field.
Definition TimeSliceField.h:113
virtual float put(float value) override
Pushes value into the unit.
Definition TimeSliceField.h:79
virtual void onEvent(EventCallback callback, EventType eventType)
Registers event callback.
Definition PqCore.cpp:246
virtual bool eventTriggered(EventType eventType)
Returns true iff an event of a certain type has been triggered.
Definition PqCore.h:371
float sampleRate() const
Returns engine sample rate.
Definition PqCore.h:360