1 /*
2  * WavesReverb.h
3  * -------------
4  * Purpose: Implementation of the DMO WavesReverb DSP (for non-Windows platforms)
5  * Notes  : (currently none)
6  * Authors: OpenMPT Devs
7  * The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
8  */
9 
10 
11 #ifndef NO_PLUGINS
12 
13 #include "../PlugInterface.h"
14 
15 OPENMPT_NAMESPACE_BEGIN
16 
17 namespace DMO
18 {
19 
20 class WavesReverb final : public IMixPlugin
21 {
22 protected:
23 	enum Parameters
24 	{
25 		kRvbInGain = 0,
26 		kRvbReverbMix,
27 		kRvbReverbTime,
28 		kRvbHighFreqRTRatio,
29 		kDistNumParameters
30 	};
31 
32 	float m_param[kDistNumParameters];
33 
34 	// Parameters and coefficients
35 	float m_dryFactor;
36 	float m_wetFactor;
37 	float m_coeffs[10];
38 	uint32 m_delay[6];
39 
40 	// State
41 	struct ReverbState
42 	{
43 		uint32 combPos, allpassPos;
44 		float comb[4096][4];
45 		float allpass1[1024][2];
46 		float allpass2[1024][2];
47 	} m_state;
48 
49 public:
50 	static IMixPlugin* Create(VSTPluginLib &factory, CSoundFile &sndFile, SNDMIXPLUGIN *mixStruct);
51 	WavesReverb(VSTPluginLib &factory, CSoundFile &sndFile, SNDMIXPLUGIN *mixStruct);
52 
Release()53 	void Release() override { delete this; }
GetUID()54 	int32 GetUID() const override { return 0x87FC0268; }
GetVersion()55 	int32 GetVersion() const override { return 0; }
Idle()56 	void Idle() override { }
GetLatency()57 	uint32 GetLatency() const override { return 0; }
58 
59 	void Process(float *pOutL, float *pOutR, uint32 numFrames) override;
60 
RenderSilence(uint32)61 	float RenderSilence(uint32) override { return 0.0f; }
62 
GetNumPrograms()63 	int32 GetNumPrograms() const override { return 0; }
GetCurrentProgram()64 	int32 GetCurrentProgram() override { return 0; }
SetCurrentProgram(int32)65 	void SetCurrentProgram(int32) override { }
66 
GetNumParameters()67 	PlugParamIndex GetNumParameters() const override { return kDistNumParameters; }
68 	PlugParamValue GetParameter(PlugParamIndex index) override;
69 	void SetParameter(PlugParamIndex index, PlugParamValue value) override;
70 
71 	void Resume() override;
Suspend()72 	void Suspend() override { m_isResumed = false; }
73 	void PositionChanged() override;
74 
IsInstrument()75 	bool IsInstrument() const override { return false; }
CanRecieveMidiEvents()76 	bool CanRecieveMidiEvents() override { return false; }
ShouldProcessSilence()77 	bool ShouldProcessSilence() override { return true; }
78 
79 #ifdef MODPLUG_TRACKER
GetDefaultEffectName()80 	CString GetDefaultEffectName() override { return _T("WavesReverb"); }
81 
82 	CString GetParamName(PlugParamIndex param) override;
83 	CString GetParamLabel(PlugParamIndex) override;
84 	CString GetParamDisplay(PlugParamIndex param) override;
85 
GetCurrentProgramName()86 	CString GetCurrentProgramName() override { return CString(); }
SetCurrentProgramName(const CString &)87 	void SetCurrentProgramName(const CString &) override { }
GetProgramName(int32)88 	CString GetProgramName(int32) override { return CString(); }
89 
HasEditor()90 	bool HasEditor() const override { return false; }
91 #endif
92 
GetNumInputChannels()93 	int GetNumInputChannels() const override { return 2; }
GetNumOutputChannels()94 	int GetNumOutputChannels() const override { return 2; }
95 
96 protected:
GainInDecibel(float param)97 	static float GainInDecibel(float param) { return -96.0f + param * 96.0f; }
ReverbTime()98 	float ReverbTime() const { return 0.001f + m_param[kRvbReverbTime] * 2999.999f; }
HighFreqRTRatio()99 	float HighFreqRTRatio() const { return 0.001f + m_param[kRvbHighFreqRTRatio] * 0.998f; }
100 	void RecalculateWavesReverbParams();
101 };
102 
103 } // namespace DMO
104 
105 OPENMPT_NAMESPACE_END
106 
107 #endif // !NO_PLUGINS
108