Line data Source code
1 : /** 2 : * \file LowPassReverbFilter.cpp 3 : */ 4 : 5 : #include "LowPassReverbFilter.h" 6 : #include <ATK/Core/Utilities.h> 7 : 8 : #include <iostream> 9 : #include <cmath> 10 : 11 : namespace ATK 12 : { 13 : template<typename DataType_> 14 13 : LowPassReverbFilter<DataType_>::LowPassReverbFilter(gsl::index max_delay) 15 13 : :Parent(1, 1) 16 : { 17 13 : output_delay = max_delay; 18 13 : input_delay = max_delay; 19 13 : } 20 : 21 : template<typename DataType_> 22 6 : void LowPassReverbFilter<DataType_>::set_delay(gsl::index delay) 23 : { 24 6 : if(delay == 0) 25 : { 26 1 : throw ATK::RuntimeError("Delay must be strictly positive"); 27 : } 28 5 : if(delay + 1 >= output_delay) 29 : { 30 1 : throw ATK::RuntimeError("Delay must be less than delay line size - 1"); 31 : } 32 : 33 4 : this->delay = delay; 34 4 : } 35 : 36 : template<typename DataType_> 37 1 : gsl::index LowPassReverbFilter<DataType_>::get_delay() const 38 : { 39 1 : return delay; 40 : } 41 : 42 : template<typename DataType_> 43 6 : void LowPassReverbFilter<DataType_>::set_feedback(DataType_ feedback) 44 : { 45 6 : if(std::abs(feedback + cutoff) >= 1) 46 : { 47 3 : throw ATK::RuntimeError("Sum of Feedback and Cutoff must be between -1 and 1 to avoid divergence"); 48 : } 49 3 : this->feedback = feedback; 50 3 : } 51 : 52 : template<typename DataType_> 53 1 : DataType_ LowPassReverbFilter<DataType_>::get_feedback() const 54 : { 55 1 : return feedback; 56 : } 57 : 58 : template<typename DataType_> 59 5 : void LowPassReverbFilter<DataType_>::set_cutoff(DataType_ cutoff) 60 : { 61 5 : if(std::abs(feedback + cutoff) >= 1) 62 : { 63 2 : throw ATK::RuntimeError("Sum of Feedback and Cutoff must be between -1 and 1 to avoid divergence"); 64 : } 65 3 : this->cutoff = cutoff; 66 3 : } 67 : 68 : template<typename DataType_> 69 1 : DataType_ LowPassReverbFilter<DataType_>::get_cutoff() const 70 : { 71 1 : return cutoff; 72 : } 73 : 74 : template<typename DataType_> 75 12 : void LowPassReverbFilter<DataType_>::process_impl(gsl::index size) const 76 : { 77 12 : const DataType* ATK_RESTRICT input = converted_inputs[0]; 78 12 : DataType* ATK_RESTRICT output = outputs[0]; 79 196620 : for(gsl::index i = 0; i < size; ++i) 80 : { 81 196608 : output[i] = feedback * output[i - delay] + input[i - delay] + cutoff * (output[i - 1] - input[i - delay - 1]); 82 : } 83 12 : } 84 : 85 : #if ATK_ENABLE_INSTANTIATION 86 : template class LowPassReverbFilter<float>; 87 : #endif 88 : template class LowPassReverbFilter<double>; 89 : }