#pragma once #include #include "ModulatedAllpass.h" #include "RandomBuffer.h" #ifndef BUFFER_SIZE #define BUFFER_SIZE 1024 #endif namespace ReverbHallRoom { class AllpassDiffuser { public: static const int MaxStageCount = 12; private: int samplerate; ModulatedAllpass filters[MaxStageCount]; int delay; float modRate; std::vector seedValues; int seed; float crossSeed; public: int Stages; AllpassDiffuser() { crossSeed = 0.0; seed = 23456; UpdateSeeds(); Stages = 1; SetSamplerate(48000); } int GetSamplerate() { return samplerate; } void SetSamplerate(int samplerate) { this->samplerate = samplerate; SetModRate(modRate); } void SetSeed(int seed) { this->seed = seed; UpdateSeeds(); } void SetCrossSeed(float crossSeed) { this->crossSeed = crossSeed; UpdateSeeds(); } bool GetModulationEnabled() { return filters[0].ModulationEnabled; } void SetModulationEnabled(bool value) { for (int i = 0; i < MaxStageCount; i++) filters[i].ModulationEnabled = value; } void SetInterpolationEnabled(bool enabled) { for (int i = 0; i < MaxStageCount; i++) filters[i].InterpolationEnabled = enabled; } void SetDelay(int delaySamples) { delay = delaySamples; Update(); } void SetFeedback(float feedback) { for (int i = 0; i < MaxStageCount; i++) filters[i].Feedback = feedback; } void SetModAmount(float amount) { for (int i = 0; i < MaxStageCount; i++) filters[i].ModAmount = amount * (0.85 + 0.3 * seedValues[MaxStageCount + i]); } void SetModRate(float rate) { modRate = rate; for (int i = 0; i < MaxStageCount; i++) filters[i].ModRate = rate * (0.85 + 0.3 * seedValues[MaxStageCount * 2 + i]) / samplerate; } void Process(float* input, float* output, int bufSize) { float tempBuffer[BUFFER_SIZE]; filters[0].Process(input, tempBuffer, bufSize); for (int i = 1; i < Stages; i++) filters[i].Process(tempBuffer, tempBuffer, bufSize); Utils::Copy(output, tempBuffer, bufSize); } void ClearBuffers() { for (int i = 0; i < MaxStageCount; i++) filters[i].ClearBuffers(); } private: void Update() { for (int i = 0; i < MaxStageCount; i++) { auto r = seedValues[i]; auto d = std::pow(10, r) * 0.1; // 0.1 ... 1.0 filters[i].SampleDelay = (int)(delay * d); } } void UpdateSeeds() { this->seedValues = RandomBuffer::Generate(seed, MaxStageCount * 3, crossSeed); Update(); } }; }