You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
1.5 KiB
74 lines
1.5 KiB
#ifndef __DELAYLINE_H__
|
|
#define __DELAYLINE_H__
|
|
|
|
#include <cstddef>
|
|
|
|
template <size_t CAPACITY>
|
|
class DelayLine {
|
|
private:
|
|
float samples[CAPACITY] = {0};
|
|
size_t cursor;
|
|
|
|
public:
|
|
size_t size;
|
|
|
|
DelayLine(size_t size = CAPACITY) : size(size) {}
|
|
|
|
inline float get() {
|
|
while(cursor >= size) {
|
|
cursor -= size;
|
|
}
|
|
return samples[cursor];
|
|
}
|
|
|
|
inline float tick() {
|
|
++cursor;
|
|
while(cursor >= size) {
|
|
cursor -= size;
|
|
}
|
|
return samples[cursor];
|
|
}
|
|
|
|
inline float tick(float in) {
|
|
while(cursor >= size) {
|
|
cursor -= size;
|
|
}
|
|
samples[cursor++] = in;
|
|
if(cursor == size) {
|
|
cursor = 0;
|
|
}
|
|
return samples[cursor];
|
|
}
|
|
|
|
inline void inject(float in, size_t pos) {
|
|
size_t index = cursor + pos;
|
|
while(index >= size) {
|
|
index -= size;
|
|
}
|
|
samples[index] = in;
|
|
}
|
|
|
|
inline void inject(float* in, size_t num, size_t pos = 0) {
|
|
size_t index = cursor + pos;
|
|
while(index >= size) {
|
|
index -= size;
|
|
}
|
|
for(size_t i = 0; i < num; ++i) {
|
|
samples[index++] = *(in++);
|
|
if(index == size) {
|
|
index = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
inline float tap(size_t n) {
|
|
size_t index = cursor + n;
|
|
if(index < size) {
|
|
return samples[index];
|
|
} else {
|
|
return samples[index - size];
|
|
}
|
|
}
|
|
};
|
|
|
|
#endif |