![]() |
Mozzi
alpha 0.01.1t
sound synthesis library for Arduino
|
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