Files
UnrealEngine/Engine/Source/Runtime/SignalProcessing/Public/DSP/Flanger.h
2025-05-18 13:04:45 +08:00

60 lines
1.8 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "DSP/BufferVectorOperations.h"
#include "DSP/Delay.h"
namespace Audio
{
class FFlanger
{
public:
SIGNALPROCESSING_API FFlanger();
SIGNALPROCESSING_API ~FFlanger();
SIGNALPROCESSING_API void Init(const float InSampleRate);
SIGNALPROCESSING_API void SetModulationRate(const float InModulationRate);
SIGNALPROCESSING_API void SetModulationDepth(const float InModulationDepth);
SIGNALPROCESSING_API void SetCenterDelay(const float InCenterDelay);
SIGNALPROCESSING_API void SetMixLevel(const float InMixLevel);
SIGNALPROCESSING_API void ProcessAudio(const FAlignedFloatBuffer& InBuffer, const int32 InNumSamples, FAlignedFloatBuffer& OutBuffer);
protected:
static SIGNALPROCESSING_API const float MaxDelaySec;
static SIGNALPROCESSING_API const float MaxModulationRate;
static SIGNALPROCESSING_API const float MaxCenterDelay;
// LFO parameters
// LFO frequency
float ModulationRate = 0.5f;
// Modulation depth is clamped to CenterDelayMsec to avoid clipping
float ModulationDepth = 0.5f;
float CenterDelayMsec = 0.5f;
// Balance between original and delayed signal
// (Should be between 0 and 1.0;
// 0.5 is equal amounts of each and
// > 0.5 is more delayed signal than non-delayed signal)
float MixLevel = 0.5f;
float DelayedSignalLevel = 0.5f;
float NonDelayedSignalLevel = 0.5f;
// Internal delay buffer
FDelay DelayBuffer;
// Scratch buffer used for accumulating delay samples per block
FAlignedFloatBuffer ScratchBuffer;
// Delay sample generated from LFO per block
float DelaySample = 0.0f;
// Internal LFO for delay amount
FSinOsc2DRotation LFO;
// The audio sample rate, Init() must be called to initialize this
float SampleRate = 48000.0f;
};
}