andrewm@0: /* andrewm@0: This code accompanies the textbook: andrewm@0: andrewm@0: Digital Audio Effects: Theory, Implementation and Application andrewm@0: Joshua D. Reiss and Andrew P. McPherson andrewm@0: andrewm@0: --- andrewm@0: andrewm@0: Reverb: algorithmic reverb effect based on MVerb andrewm@0: See textbook Chapter 11: Reverberation andrewm@0: andrewm@0: Original code by Martin Eastwood: MVerb (see MVerb.h) andrewm@0: Adapted for JUCE by Brecht De Man andrewm@0: andrewm@0: When using this code (or a modified version thereof) please cite: andrewm@0: andrewm@0: R. Stables, S. Enderby, B. De Man, G. Fazekas, J. D. Reiss, "SAFE: andrewm@0: A System for the Extraction and Retrieval of Semantic Audio andrewm@0: Descriptors," 15th International Society for Music Information andrewm@0: Retrieval Conference (ISMIR 2014), 2014. andrewm@0: andrewm@0: --- andrewm@0: andrewm@0: This program is free software: you can redistribute it and/or modify andrewm@0: it under the terms of the GNU General Public License as published by andrewm@0: the Free Software Foundation, either version 3 of the License, or andrewm@0: (at your option) any later version. andrewm@0: andrewm@0: This program is distributed in the hope that it will be useful, andrewm@0: but WITHOUT ANY WARRANTY; without even the implied warranty of andrewm@0: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the andrewm@0: GNU General Public License for more details. andrewm@0: andrewm@0: You should have received a copy of the GNU General Public License andrewm@0: along with this program. If not, see . andrewm@0: */ andrewm@0: andrewm@0: andrewm@0: #ifndef __PLUGINPROCESSOR_H_88534BAA__ andrewm@0: #define __PLUGINPROCESSOR_H_88534BAA__ andrewm@0: andrewm@0: #include "../JuceLibraryCode/JuceHeader.h" andrewm@0: #include "MVerb.h" andrewm@0: #include andrewm@0: andrewm@0: class ReverbAudioProcessor : public AudioProcessor andrewm@0: { andrewm@0: public: andrewm@0: ReverbAudioProcessor(); andrewm@0: ~ReverbAudioProcessor(); andrewm@0: andrewm@0: //============================================================================== andrewm@0: // V S T M E T H O D S andrewm@0: andrewm@0: void prepareToPlay (double sampleRate, int samplesPerBlock); andrewm@0: void releaseResources(); andrewm@0: void processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages); andrewm@0: void updateParameters(int index); andrewm@0: AudioProcessorEditor* createEditor(); andrewm@0: bool silenceInProducesSilenceOut() const; andrewm@0: virtual double getTailLengthSeconds() const {return 0;}; andrewm@0: bool hasEditor() const; andrewm@0: const String getName() const; andrewm@0: int getNumParameters(); andrewm@0: float getParameter (int index); andrewm@0: void setParameter (int index, float newValue); andrewm@0: const String getParameterName (int index); andrewm@0: const String getParameterText (int index); andrewm@0: const String getInputChannelName (int channelIndex) const; andrewm@0: const String getOutputChannelName (int channelIndex) const; andrewm@0: bool isInputChannelStereoPair (int index) const; andrewm@0: bool isOutputChannelStereoPair (int index) const; andrewm@0: bool acceptsMidi() const; andrewm@0: bool producesMidi() const; andrewm@0: int getNumPrograms(); andrewm@0: int getCurrentProgram(); andrewm@0: void setCurrentProgram (int index); andrewm@0: const String getProgramName (int index); andrewm@0: void changeProgramName (int index, const String& newName); andrewm@0: void getStateInformation (MemoryBlock& destData); andrewm@0: void setStateInformation (const void* data, int sizeInBytes); andrewm@0: andrewm@0: andrewm@0: //============================================================================== andrewm@0: // O U R M E T H O D S andrewm@0: andrewm@0: void Reset(); andrewm@0: andrewm@0: private: andrewm@0: andrewm@0: // Accessors and mutators andrewm@0: inline float GetDensity(); andrewm@0: inline void SetDensity(float density); andrewm@0: inline float GetDecay(); andrewm@0: inline void SetDecay(float decay); andrewm@0: inline float GetSize(); andrewm@0: inline void SetSize(float size); andrewm@0: inline float GetDamp(); andrewm@0: inline void SetDamp(float damp); andrewm@0: inline float GetBandwidth(); andrewm@0: inline void SetBandwidth(float bandwith); andrewm@0: inline float GetPredelay(); andrewm@0: inline void SetPredelay(float predelay); andrewm@0: inline float GetGain(); andrewm@0: inline void SetGain(float gain); andrewm@0: inline float GetMix(); andrewm@0: inline void SetMix(float mix); andrewm@0: inline float GetLateEarly(); andrewm@0: inline void SetLateEarly(float lateEarly); andrewm@0: andrewm@0: int _numChannels; andrewm@0: int _numSamples; andrewm@0: int _sampleRate; andrewm@0: andrewm@0: // parameters andrewm@0: float _density; andrewm@0: float _decay; andrewm@0: float _size; andrewm@0: float _damp; andrewm@0: float _bandwidth; andrewm@0: float _predelay; andrewm@0: float _gain; andrewm@0: float _mix; andrewm@0: float _lateEarly; andrewm@0: andrewm@0: MVerb _mverb; andrewm@0: andrewm@0: andrewm@0: bool _isFirstFrame; andrewm@0: andrewm@0: // Buffers andrewm@0: AudioSampleBuffer tempInput, tempOutput; andrewm@0: andrewm@0: int _lastUIWidth, _lastUIHeight; andrewm@0: andrewm@0: friend class ReverbAudioProcessorEditor; andrewm@0: andrewm@0: JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ReverbAudioProcessor); andrewm@0: }; andrewm@0: andrewm@0: //============================================================================= andrewm@0: // I N L I N E F U N C T I O N S C O D E S E C T I O N andrewm@0: andrewm@0: //----------------------------------------------------------------------------- andrewm@0: // andrewm@0: inline float andrewm@0: ReverbAudioProcessor::GetDensity() andrewm@0: { andrewm@0: return _density; andrewm@0: } andrewm@0: andrewm@0: andrewm@0: //----------------------------------------------------------------------------- andrewm@0: // andrewm@0: inline void andrewm@0: ReverbAudioProcessor::SetDensity(float density) andrewm@0: { andrewm@0: _density = density; andrewm@0: } andrewm@0: andrewm@0: andrewm@0: //----------------------------------------------------------------------------- andrewm@0: // andrewm@0: inline float andrewm@0: ReverbAudioProcessor::GetDecay() andrewm@0: { andrewm@0: return _decay; andrewm@0: } andrewm@0: andrewm@0: andrewm@0: //----------------------------------------------------------------------------- andrewm@0: // andrewm@0: inline void andrewm@0: ReverbAudioProcessor::SetDecay(float decay) andrewm@0: { andrewm@0: _decay = decay; andrewm@0: } andrewm@0: andrewm@0: //----------------------------------------------------------------------------- andrewm@0: // andrewm@0: inline float andrewm@0: ReverbAudioProcessor::GetSize() andrewm@0: { andrewm@0: return _size; andrewm@0: } andrewm@0: andrewm@0: andrewm@0: //----------------------------------------------------------------------------- andrewm@0: // andrewm@0: inline void andrewm@0: ReverbAudioProcessor::SetSize(float size) andrewm@0: { andrewm@0: _size = size; andrewm@0: } andrewm@0: andrewm@0: //----------------------------------------------------------------------------- andrewm@0: // andrewm@0: inline float andrewm@0: ReverbAudioProcessor::GetDamp() andrewm@0: { andrewm@0: return _damp; andrewm@0: } andrewm@0: andrewm@0: andrewm@0: //----------------------------------------------------------------------------- andrewm@0: // andrewm@0: inline void andrewm@0: ReverbAudioProcessor::SetDamp(float damp) andrewm@0: { andrewm@0: _damp = damp; andrewm@0: } andrewm@0: andrewm@0: //----------------------------------------------------------------------------- andrewm@0: // andrewm@0: inline float andrewm@0: ReverbAudioProcessor::GetBandwidth() andrewm@0: { andrewm@0: return _bandwidth; andrewm@0: } andrewm@0: andrewm@0: andrewm@0: //----------------------------------------------------------------------------- andrewm@0: // andrewm@0: inline void andrewm@0: ReverbAudioProcessor::SetBandwidth(float bandwidth) andrewm@0: { andrewm@0: _bandwidth = bandwidth; andrewm@0: } andrewm@0: andrewm@0: //----------------------------------------------------------------------------- andrewm@0: // andrewm@0: inline float andrewm@0: ReverbAudioProcessor::GetPredelay() andrewm@0: { andrewm@0: return _predelay; andrewm@0: } andrewm@0: andrewm@0: andrewm@0: //----------------------------------------------------------------------------- andrewm@0: // andrewm@0: inline void andrewm@0: ReverbAudioProcessor::SetPredelay(float predelay) andrewm@0: { andrewm@0: _predelay = predelay; andrewm@0: } andrewm@0: andrewm@0: //----------------------------------------------------------------------------- andrewm@0: // andrewm@0: inline float andrewm@0: ReverbAudioProcessor::GetGain() andrewm@0: { andrewm@0: return _gain; andrewm@0: } andrewm@0: andrewm@0: andrewm@0: //----------------------------------------------------------------------------- andrewm@0: // andrewm@0: inline void andrewm@0: ReverbAudioProcessor::SetGain(float gain) andrewm@0: { andrewm@0: _gain = gain; andrewm@0: } andrewm@0: andrewm@0: //----------------------------------------------------------------------------- andrewm@0: // andrewm@0: inline float andrewm@0: ReverbAudioProcessor::GetMix() andrewm@0: { andrewm@0: return _mix; andrewm@0: } andrewm@0: andrewm@0: andrewm@0: //----------------------------------------------------------------------------- andrewm@0: // andrewm@0: inline void andrewm@0: ReverbAudioProcessor::SetMix(float mix) andrewm@0: { andrewm@0: _mix = mix; andrewm@0: } andrewm@0: andrewm@0: //----------------------------------------------------------------------------- andrewm@0: // andrewm@0: inline float andrewm@0: ReverbAudioProcessor::GetLateEarly() andrewm@0: { andrewm@0: return _lateEarly; andrewm@0: } andrewm@0: andrewm@0: andrewm@0: //----------------------------------------------------------------------------- andrewm@0: // andrewm@0: inline void andrewm@0: ReverbAudioProcessor::SetLateEarly(float lateEarly) andrewm@0: { andrewm@0: _lateEarly = lateEarly; andrewm@0: } andrewm@0: #endif // __PLUGINPROCESSOR_H_88534BAA__