49 void Init(
float *
mem,
size_t size)
55 state_ = State::EMPTY;
70 inc = state_ == State::EMPTY || state_ == State::REC_FIRST
73 win_ = WindowVal(win_idx_ * kWindowFactor);
76 case State::EMPTY:
sig = 0.0f;
break;
77 case State::REC_FIRST:
79 Write(pos_,
input * win_);
80 if(win_idx_ < kWindowSamps - 1)
84 if(pos_ > buffer_size_ - 1)
86 state_ = State::PLAYING;
96 if(win_idx_ < kWindowSamps - 1)
98 Write(pos_,
sig +
input * (1.f - win_));
103 if(pos_ > recsize_ - 1)
116 if(rec_queue_ && mode_ == Mode::ONETIME_DUB)
119 state_ = State::REC_DUB;
128 case Mode::REPLACE: Write(pos_,
input * win_);
break;
129 case Mode::FRIPPERTRONICS:
130 Write(pos_, (
input * win_) + (
sig * kFripDecayVal));
133 case Mode::ONETIME_DUB:
134 default: Write(pos_, (
input * win_) +
sig);
break;
136 if(win_idx_ < kWindowSamps - 1)
139 if(pos_ > recsize_ - 1)
149 if(
hitloop && mode_ == Mode::ONETIME_DUB)
151 state_ = State::PLAYING;
158 near_beginning_ = state_ != State::EMPTY && !
Recording() && pos_ < 4800
167 inline void Clear() { state_ = State::EMPTY; }
180 state_ = State::REC_FIRST;
184 case State::REC_FIRST:
185 case State::REC_DUB: state_ = State::PLAYING;
break;
187 if(mode_ == Mode::ONETIME_DUB)
190 state_ = State::REC_DUB;
192 default: state_ = State::EMPTY;
break;
201 return state_ == State::REC_DUB || state_ == State::REC_FIRST;
204 inline const bool RecordingQueued()
const {
return rec_queue_; }
209 int m =
static_cast<int>(mode_);
211 if(
m > kNumModes - 1)
213 mode_ =
static_cast<Mode>(
m);
222 inline void ToggleReverse() { reverse_ = !reverse_; }
223 inline void SetReverse(
bool state) { reverse_ = state; }
224 inline bool GetReverse()
const {
return reverse_; }
226 inline void ToggleHalfSpeed() { half_speed_ = !half_speed_; }
227 inline void SetHalfSpeed(
bool state) { half_speed_ = state; }
228 inline bool GetHalfSpeed()
const {
return half_speed_; }
230 inline bool IsNearBeginning() {
return near_beginning_; }
236 static constexpr float kFripDecayVal = 0.7071067811865476f;
237 static constexpr int kNumModes = 4;
238 static constexpr int kNumPlaybackSpeeds = 3;
239 static constexpr int kWindowSamps = 1200;
240 static constexpr float kWindowFactor = (1.f / kWindowSamps);
243 float GetIncrementSize()
248 return reverse_ ? -inc : inc;
252 void InitBuff() { std::fill(&buff_[0], &buff_[buffer_size_ - 1], 0); }
255 inline const float Read(
size_t pos)
const {
return buff_[pos]; }
258 float ReadF(
float pos)
261 uint32_t i_idx =
static_cast<uint32_t
>(pos);
264 b = buff_[(i_idx + 1) % buffer_size_];
265 return a + (b - a) * frac;
269 inline void Write(
size_t pos,
float val) { buff_[pos] = val; }
272 float WindowVal(
float in) {
return sin(HALFPI_F * in); }
296 bool near_beginning_;