OpenWareLaboratory
FeedbackProcessor.h
Go to the documentation of this file.
1 #ifndef __FeedbackProcessor_h__
2 #define __FeedbackProcessor_h__
3 
4 #include <utility>
5 #include "SignalProcessor.h"
6 #include "DcBlockingFilter.h"
7 
8 template<class Processor>
9 class FeedbackSignalProcessor : public Processor {
10 protected:
13 public:
14  template <typename... Args>
15  FeedbackSignalProcessor(FloatArray buffer, Args&&... args) :
16  Processor(std::forward<Args>(args)...), feedback_buffer(buffer), feedback_amount(0) {}
17  void setFeedback(float amount){
18  feedback_amount = amount;
19  }
20  float getFeedback(){
21  return feedback_amount;
22  }
23  void process(FloatArray input, FloatArray output){
25  input.add(feedback_buffer);
26  Processor::process(input, output);
27  feedback_buffer.copyFrom(output);
28  }
29  template <typename... Args>
30  static FeedbackSignalProcessor<Processor>* create(size_t blocksize, Args&&... args){
31  return new FeedbackSignalProcessor<Processor>(FloatArray::create(blocksize), std::forward<Args>(args)...);
32  }
35  Processor::destroy(obj);
36  }
37 };
38 
40 protected:
46 public:
47  template <typename... Args>
49  FloatArray fbl, FloatArray fbr) :
50  processor_left(left), processor_right(right), feedback_left(fbl), feedback_right(fbr) {}
51  void setFeedback(float amount){
52  feedback_amount = amount;
53  }
54  float getFeedback(){
55  return feedback_amount;
56  }
57  void process(AudioBuffer& input, AudioBuffer& output){
58  FloatArray input_left = input.getSamples(LEFT_CHANNEL);
59  FloatArray output_left = output.getSamples(LEFT_CHANNEL);
61  input_left.add(feedback_left);
62  processor_left->process(input_left, output_left);
63  FloatArray input_right = input.getSamples(RIGHT_CHANNEL);
64  FloatArray output_right = output.getSamples(RIGHT_CHANNEL);
66  input_right.add(feedback_right);
67  processor_right->process(input_right, output_right);
68  feedback_left.copyFrom(output_left);
69  feedback_right.copyFrom(output_right);
70  }
71  static StereoFeedbackProcessor* create(SignalProcessor* left, SignalProcessor* right, size_t blocksize){
72  return new StereoFeedbackProcessor(left, right, FloatArray::create(blocksize), FloatArray::create(blocksize));
73  }
74  static void destroy(StereoFeedbackProcessor* obj){
77  delete obj;
78  }
79 };
80 
82 protected:
90 public:
91  template <typename... Args>
93  FloatArray fbl, FloatArray fbr) :
94  processor_left(left), processor_right(right), feedback_left(fbl), feedback_right(fbr) {}
95  void setFeedback(float amount){
96  feedback_amount = amount;
97  }
98  float getFeedback(){
99  return feedback_amount;
100  }
101  void process(AudioBuffer& input, AudioBuffer& output){
102  FloatArray input_left = input.getSamples(LEFT_CHANNEL);
103  FloatArray output_left = output.getSamples(LEFT_CHANNEL);
105  input_left.add(feedback_left);
106  processor_left->process(input_left, output_left);
107  FloatArray input_right = input.getSamples(RIGHT_CHANNEL);
108  FloatArray output_right = output.getSamples(RIGHT_CHANNEL);
110  input_right.add(feedback_right);
111  processor_right->process(input_right, output_right);
112  feedback_left.copyFrom(output_right);
114  feedback_right.copyFrom(output_left);
116  }
117  static PingPongFeedbackProcessor* create(SignalProcessor* left, SignalProcessor* right, size_t blocksize){
118  return new PingPongFeedbackProcessor(left, right, FloatArray::create(blocksize), FloatArray::create(blocksize));
119  }
123  delete obj;
124  }
125 };
126 
127 #endif // __FeedbackProcessor_h__
@ RIGHT_CHANNEL
Definition: Patch.h:18
@ LEFT_CHANNEL
Definition: Patch.h:17
virtual FloatArray getSamples(int channel)=0
DC Blocking IIR filter, aka Leaky differentiator.
float process(float x)
FeedbackSignalProcessor(FloatArray buffer, Args &&... args)
static FeedbackSignalProcessor< Processor > * create(size_t blocksize, Args &&... args)
void process(FloatArray input, FloatArray output)
void setFeedback(float amount)
static void destroy(FeedbackSignalProcessor< Processor > *obj)
This class contains useful methods for manipulating arrays of floats.
Definition: FloatArray.h:12
void multiply(FloatArray operand2, FloatArray destination)
Element-wise multiplication between arrays.
Definition: FloatArray.cpp:290
void add(FloatArray operand2, FloatArray destination)
Element-wise sum between arrays.
Definition: FloatArray.cpp:231
static void destroy(FloatArray array)
Destroys a FloatArray created with the create() method.
Definition: FloatArray.cpp:472
static FloatArray create(int size)
Creates a new FloatArray.
Definition: FloatArray.cpp:466
SignalProcessor * processor_left
void setFeedback(float amount)
void process(AudioBuffer &input, AudioBuffer &output)
static void destroy(PingPongFeedbackProcessor *obj)
SignalProcessor * processor_right
PingPongFeedbackProcessor(SignalProcessor *left, SignalProcessor *right, FloatArray fbl, FloatArray fbr)
static PingPongFeedbackProcessor * create(SignalProcessor *left, SignalProcessor *right, size_t blocksize)
Base class for signal processors such as Filters.
virtual float process(float input)
void copyFrom(SimpleArray< T > source)
Copies the content of another array into this array.
Definition: SimpleArray.h:86
static void destroy(StereoFeedbackProcessor *obj)
static StereoFeedbackProcessor * create(SignalProcessor *left, SignalProcessor *right, size_t blocksize)
SignalProcessor * processor_left
StereoFeedbackProcessor(SignalProcessor *left, SignalProcessor *right, FloatArray fbl, FloatArray fbr)
void process(AudioBuffer &input, AudioBuffer &output)
void setFeedback(float amount)
SignalProcessor * processor_right