#ifndef __REVERB_H__ #define __REVERB_H__ // Velvet noise reverb ("Late Reverberation Synthesis Using Filtered Velvet Noise") #include #include "globals.h" #include "frame.h" #include "stereodelayline.h" #define REVERB_FRAMES (3 * SAMPLE_RATE) #define REVERB_TAPS 256 class Reverb { private: struct Tap { size_t lp, rp; float lg, rg; }; StereoDelayLine dl; Tap taps[REVERB_TAPS]; float lpfL = 0.f, lpfR = 0.f; float hpfL = 0.f, hpfR = 0.f; public: Reverb(); frame tick(frame in) { dl.tick(in); frame out{0, 0}; for(const Tap& tap : taps) { out.l += tap.lg * dl.tap(tap.lp).l; out.r += tap.rg * dl.tap(tap.rp).r; } lpfL += 0.1f * (out.l - lpfL); lpfR += 0.1f * (out.r - lpfR); hpfL += 0.05f * (lpfL - hpfL); hpfR += 0.05f * (lpfR - hpfR); out.l = lpfL - hpfL; out.r = lpfR - hpfR; return out; } }; #endif