OpenWareLaboratory
DelayProcessor.h
Go to the documentation of this file.
1 #ifndef __DelayProcessor_h__
2 #define __DelayProcessor_h__
3 
4 #include "CircularBuffer.h"
5 #include "SignalProcessor.h"
9 
14 protected:
16  size_t delay;
17 public:
19  DelayProcessor(float* buffer, size_t len) : buffer(buffer, len), delay(0) {}
20  size_t getDelay(){
21  return delay;
22  }
23  void setDelay(size_t samples){
24  delay = samples;
25  buffer.setDelay(samples);
26  }
27  void clear(){
28  buffer.clear();
29  }
30  float process(float input){
31  buffer.write(input);
32  return buffer.read();
33  }
34  void process(FloatArray input, FloatArray output){
35  buffer.delay(input, output, input.getSize(), delay);
36  }
37  static DelayProcessor* create(size_t len){
38  return new DelayProcessor(new float[len], len);
39  }
40  static void destroy(DelayProcessor* obj){
41  delete[] obj->buffer.getData();
42  delete obj;
43  }
44 };
45 
49 template<InterpolationMethod im = LINEAR_INTERPOLATION>
51 protected:
53  float delay;
54 public:
56  FractionalDelayProcessor(float* buffer, size_t len) : buffer(buffer, len), delay(0) {}
57  float getDelay(){
58  return delay;
59  }
60  void setDelay(float samples){
61  delay = samples;
62  }
63  void clear(){
64  buffer.clear();
65  }
66  float process(float input){
67  buffer.setDelay(delay);
68  buffer.write(input);
69  return buffer.read();
70  }
74  void process(FloatArray input, FloatArray output){
75  // buffer.delay(input, output, input.getSize(), buffer.getFractionalDelay(), delay);
76  buffer.delay(input, output, input.getSize(), delay);
77  }
78  static FractionalDelayProcessor* create(size_t len){
79  return new FractionalDelayProcessor(new float[len], len);
80  }
81  static void destroy(FractionalDelayProcessor* obj){
82  delete[] obj->buffer.getData();
83  delete obj;
84  }
85 };
86 
91 protected:
93  float delay;
94 public:
96  FastFractionalDelayProcessor(float* buffer, float* delta, size_t len) : buffer(buffer, delta, len), delay(0) {}
97  float getDelay(){
98  return delay;
99  }
100  void setDelay(float samples){
101  delay = samples;
102  }
103  void clear(){
104  buffer.clear();
105  }
106  float process(float input){
108  buffer.write(input);
109  return buffer.read();
110  }
111  void process(FloatArray input, FloatArray output){
112  smooth(input, output, delay);
113  }
117  void smooth(FloatArray input, FloatArray output, float newDelay){
118  buffer.delay(input, output, input.getSize(), delay, newDelay);
119  delay = newDelay;
120  }
122  return new FastFractionalDelayProcessor(new float[len], new float[len], len);
123  }
125  delete[] obj->buffer.getData();
126  delete[] obj->buffer.getDelta();
127  delete obj;
128  }
129 };
130 
138 protected:
140  float delay = 0;
141 public:
143  : ringbuffer(ringbuffer) {}
144  float getDelay(){
145  return delay;
146  }
147  void setDelay(float samples){
148  delay = samples;
149  }
150  void clear(){
151  ringbuffer->clear();
152  }
153  void process(FloatArray input, FloatArray output){
154  ringbuffer->delay(input, output, input.getSize(), delay);
155  }
156  static CrossFadingDelayProcessor* create(size_t delay_len, size_t buffer_len){
157  return new CrossFadingDelayProcessor(CrossFadingCircularFloatBuffer::create(delay_len, buffer_len));
158  }
161  delete obj;
162  }
163 };
164 
165 #endif // __DelayProcessor_h__
DataType * getData()
void delay(DataType *in, DataType *out, IndexType len, int delay_samples)
Write to buffer and read with a delay.
void write(DataType c)
DataType read()
void setDelay(int samples)
Set the read index.
void delay(T *out, size_t len, int delay_samples)
Read from buffer with a delay.
static CrossFadingCircularBuffer< T > * create(size_t len, size_t blocksize)
static void destroy(CrossFadingCircularBuffer< T > *obj)
Delay line signal processor that crossfades to ensure smooth changes in delay time.
CrossFadingCircularFloatBuffer * ringbuffer
static void destroy(CrossFadingDelayProcessor *obj)
void process(FloatArray input, FloatArray output)
static CrossFadingDelayProcessor * create(size_t delay_len, size_t buffer_len)
void setDelay(float samples)
CrossFadingDelayProcessor(CrossFadingCircularFloatBuffer *ringbuffer)
Delay line signal processor implemented with a circular buffer.
static void destroy(DelayProcessor *obj)
void setDelay(size_t samples)
DelayProcessor(float *buffer, size_t len)
size_t getDelay()
CircularFloatBuffer buffer
float process(float input)
static DelayProcessor * create(size_t len)
void process(FloatArray input, FloatArray output)
Interpolating delay line signal processor with fractional delay times.
void process(FloatArray input, FloatArray output)
void setDelay(float samples)
FractionalCircularFloatBuffer buffer
float process(float input)
static void destroy(FastFractionalDelayProcessor *obj)
static FastFractionalDelayProcessor * create(size_t len)
FastFractionalDelayProcessor(float *buffer, float *delta, size_t len)
void smooth(FloatArray input, FloatArray output, float newDelay)
Delay ramping smoothly from the previous delay time to.
This class contains useful methods for manipulating arrays of floats.
Definition: FloatArray.h:12
void setDelay(float samples)
Set the read index.
void delay(T *in, T *out, size_t len, float delay)
Write to buffer and read with a delay.
Delay line signal processor implemented with a circular buffer, allowing fractional delay times.
float process(float input)
static FractionalDelayProcessor * create(size_t len)
InterpolatingCircularFloatBuffer< im > buffer
void setDelay(float samples)
static void destroy(FractionalDelayProcessor *obj)
FractionalDelayProcessor(float *buffer, size_t len)
void process(FloatArray input, FloatArray output)
Delay smoothly from the previous delay time to.
Base class for signal processors such as Filters.
size_t getSize() const
Definition: SimpleArray.h:31