Mozzi  alpha 0.01.1t
sound synthesis library for Arduino
 All Classes Functions Typedefs
AudioDelayFeedback.h
00001 #ifndef AUDIODELAY_FEEDBACK_H_
00002 #define AUDIODELAY_FEEDBACK_H_
00003 
00004 #include "Arduino.h"
00005 
00017 template <unsigned int NUM_BUFFER_SAMPLES>
00018 class AudioDelayFeedback
00019 {
00020 
00021 private:
00022                 int delay_array[NUM_BUFFER_SAMPLES];
00023                 unsigned int write_pos;
00024                 char _feedback_level;
00025                 unsigned int _delaytime_cells;
00026 
00027 public:
00030                 AudioDelayFeedback(): write_pos(0), _delaytime_cells(0), _feedback_level(0)
00031                 {}
00032                 
00033                 
00039                 AudioDelayFeedback(unsigned int delaytime_cells): write_pos(0), _feedback_level(0), _delaytime_cells(delaytime_cells)
00040                 {}
00041 
00042                 
00049                 AudioDelayFeedback(unsigned int delaytime_cells, char feedback_level): write_pos(0), _delaytime_cells(delaytime_cells), _feedback_level(feedback_level)
00050                 {}
00051                 
00052                 
00053                 
00057                 inline
00058                 int next(char in_value)
00059                 {
00060                                 ++write_pos &= (NUM_BUFFER_SAMPLES - 1);
00061                                 unsigned int read_pos = (write_pos - _delaytime_cells) & (NUM_BUFFER_SAMPLES - 1);
00062 
00063                                 int delay_sig = delay_array[read_pos];                                                                                                                          // read the delay buffer
00064                                 char feedback_sig = (char) min(max(((delay_sig * _feedback_level)/128),-128),127); // feedback clipped
00065                                 delay_array[write_pos] = (int) in_value + feedback_sig;                                                                         // write to buffer
00066 
00067                                 return delay_sig;
00068                 }
00069                 
00070                 
00071                 
00079                 inline
00080                 int next(char in_value, unsigned int delaytime_cells)
00081                 {
00082                                 ++write_pos &= (NUM_BUFFER_SAMPLES - 1);
00083                                 unsigned int read_pos = (write_pos - delaytime_cells) & (NUM_BUFFER_SAMPLES - 1);
00084 
00085                                 int delay_sig = delay_array[read_pos];                                                                                                                          // read the delay buffer
00086                                 char feedback_sig = (char) min(max(((delay_sig * _feedback_level)/128),-128),127); // feedback clipped
00087                                 delay_array[write_pos] = (int) in_value + feedback_sig;                                                                         // write to buffer
00088 
00089                                 return delay_sig;
00090                 }
00091 
00092                 
00096                 inline
00097                 void write(char in_value)
00098                 {
00099                                 ++write_pos &= (NUM_BUFFER_SAMPLES - 1);
00100                 }
00101                 
00102                 
00107                 inline
00108                 int read(unsigned int delaytime_cells)
00109                 {
00110                                 unsigned int read_pos = (write_pos - delaytime_cells) & (NUM_BUFFER_SAMPLES - 1);
00111                                 int delay_sig = delay_array[read_pos];                                                                                                                          // read the delay buffer
00112 
00113                                 return delay_sig;
00114                 }
00115                 
00116                 
00117 
00121                 inline
00122                 int read()
00123                 {
00124                                 unsigned int read_pos = (write_pos - _delaytime_cells) & (NUM_BUFFER_SAMPLES - 1);
00125                                 int delay_sig = delay_array[read_pos];                                                                                                                          // read the delay buffer
00126 
00127                                 return delay_sig;
00128                 }
00129                 
00130 
00131                 
00137                 inline
00138                 void setDelayTimeCells(unsigned int delaytime_cells)
00139                 {
00140                                 _delaytime_cells = delaytime_cells;
00141                 }
00142                 
00143                 
00147                 inline
00148                 void setFeedbackLevel(char feedback_level)
00149                 {
00150                                 _feedback_level = feedback_level;
00151                 }
00152 
00153 };
00154 
00155 #endif        //  #ifndef AUDIODELAY_FEEDBACK_H_
00156