#include "amuse/EffectDelay.hpp" #include #include #include "amuse/Common.hpp" #include "amuse/IBackendVoice.hpp" namespace amuse { template EffectDelayImp::EffectDelayImp(uint32_t initDelay, uint32_t initFeedback, uint32_t initOutput, double sampleRate) { initDelay = std::clamp(10u, initDelay, 5000u); initFeedback = std::clamp(0u, initFeedback, 100u); initOutput = std::clamp(0u, initOutput, 100u); for (int i = 0; i < 8; ++i) { x3c_delay[i] = initDelay; x48_feedback[i] = initFeedback; x54_output[i] = initOutput; } _setup(sampleRate); } template EffectDelayImp::EffectDelayImp(const EffectDelayInfo& info, double sampleRate) { for (int i = 0; i < 8; ++i) { x3c_delay[i] = std::clamp(10u, info.delay[i], 5000u); x48_feedback[i] = std::clamp(0u, info.feedback[i], 100u); x54_output[i] = std::clamp(0u, info.output[i], 100u); } _setup(sampleRate); } template void EffectDelayImp::_setup(double sampleRate) { m_sampsPerMs = std::ceil(sampleRate / 1000.0); m_blockSamples = m_sampsPerMs * 5; _update(); } template void EffectDelayImp::_update() { for (int i = 0; i < 8; ++i) { x0_currentSize[i] = ((x3c_delay[i] - 5) * m_sampsPerMs + 159) / 160; xc_currentPos[i] = 0; x18_currentFeedback[i] = x48_feedback[i] * 128 / 100; x24_currentOutput[i] = x54_output[i] * 128 / 100; x30_chanLines[i].reset(new T[m_blockSamples * x0_currentSize[i]]); memset(x30_chanLines[i].get(), 0, m_blockSamples * x0_currentSize[i] * sizeof(T)); } m_dirty = false; } template void EffectDelayImp::applyEffect(T* audio, size_t frameCount, const ChannelMap& chanMap) { if (m_dirty) _update(); for (size_t f = 0; f < frameCount;) { for (unsigned c = 0; c < chanMap.m_channelCount; ++c) { T* chanAud = audio + c; for (unsigned i = 0; i < m_blockSamples && f < frameCount; ++i, ++f) { T& liveSamp = chanAud[chanMap.m_channelCount * i]; T& samp = x30_chanLines[c][xc_currentPos[c] * m_blockSamples + i]; samp = ClampFull(samp * x18_currentFeedback[c] / 128 + liveSamp); liveSamp = samp * x24_currentOutput[c] / 128; } xc_currentPos[c] = (xc_currentPos[c] + 1) % x0_currentSize[c]; } audio += chanMap.m_channelCount * m_blockSamples; } } template class EffectDelayImp; template class EffectDelayImp; template class EffectDelayImp; } // namespace amuse