Skip to content

Commit

Permalink
Make Freeverb3 work at all sample rates
Browse files Browse the repository at this point in the history
Cherry-picked from LMMS Project LMMS/lmms@b441bda
  • Loading branch information
tresf committed Oct 31, 2020
1 parent fa6149c commit 53f6bb5
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 53 deletions.
50 changes: 25 additions & 25 deletions src/freeverb/Components/revmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,33 +6,33 @@

#include "revmodel.h"

revmodel::revmodel()
revmodel::revmodel(float sampleratio)
{
// Tie the components to their buffers
combL[0].setbuffer(bufcombL1,combtuningL1);
combR[0].setbuffer(bufcombR1,combtuningR1);
combL[1].setbuffer(bufcombL2,combtuningL2);
combR[1].setbuffer(bufcombR2,combtuningR2);
combL[2].setbuffer(bufcombL3,combtuningL3);
combR[2].setbuffer(bufcombR3,combtuningR3);
combL[3].setbuffer(bufcombL4,combtuningL4);
combR[3].setbuffer(bufcombR4,combtuningR4);
combL[4].setbuffer(bufcombL5,combtuningL5);
combR[4].setbuffer(bufcombR5,combtuningR5);
combL[5].setbuffer(bufcombL6,combtuningL6);
combR[5].setbuffer(bufcombR6,combtuningR6);
combL[6].setbuffer(bufcombL7,combtuningL7);
combR[6].setbuffer(bufcombR7,combtuningR7);
combL[7].setbuffer(bufcombL8,combtuningL8);
combR[7].setbuffer(bufcombR8,combtuningR8);
allpassL[0].setbuffer(bufallpassL1,allpasstuningL1);
allpassR[0].setbuffer(bufallpassR1,allpasstuningR1);
allpassL[1].setbuffer(bufallpassL2,allpasstuningL2);
allpassR[1].setbuffer(bufallpassR2,allpasstuningR2);
allpassL[2].setbuffer(bufallpassL3,allpasstuningL3);
allpassR[2].setbuffer(bufallpassR3,allpasstuningR3);
allpassL[3].setbuffer(bufallpassL4,allpasstuningL4);
allpassR[3].setbuffer(bufallpassR4,allpasstuningR4);
combL[0].setbuffer(bufcombL1,static_cast<int>(combtuningL1 * sampleratio));
combR[0].setbuffer(bufcombR1,static_cast<int>(combtuningR1 * sampleratio));
combL[1].setbuffer(bufcombL2,static_cast<int>(combtuningL2 * sampleratio));
combR[1].setbuffer(bufcombR2,static_cast<int>(combtuningR2 * sampleratio));
combL[2].setbuffer(bufcombL3,static_cast<int>(combtuningL3 * sampleratio));
combR[2].setbuffer(bufcombR3,static_cast<int>(combtuningR3 * sampleratio));
combL[3].setbuffer(bufcombL4,static_cast<int>(combtuningL4 * sampleratio));
combR[3].setbuffer(bufcombR4,static_cast<int>(combtuningR4 * sampleratio));
combL[4].setbuffer(bufcombL5,static_cast<int>(combtuningL5 * sampleratio));
combR[4].setbuffer(bufcombR5,static_cast<int>(combtuningR5 * sampleratio));
combL[5].setbuffer(bufcombL6,static_cast<int>(combtuningL6 * sampleratio));
combR[5].setbuffer(bufcombR6,static_cast<int>(combtuningR6 * sampleratio));
combL[6].setbuffer(bufcombL7,static_cast<int>(combtuningL7 * sampleratio));
combR[6].setbuffer(bufcombR7,static_cast<int>(combtuningR7 * sampleratio));
combL[7].setbuffer(bufcombL8,static_cast<int>(combtuningL8 * sampleratio));
combR[7].setbuffer(bufcombR8,static_cast<int>(combtuningR8 * sampleratio));
allpassL[0].setbuffer(bufallpassL1,static_cast<int>(allpasstuningL1 * sampleratio));
allpassR[0].setbuffer(bufallpassR1,static_cast<int>(allpasstuningR1 * sampleratio));
allpassL[1].setbuffer(bufallpassL2,static_cast<int>(allpasstuningL2 * sampleratio));
allpassR[1].setbuffer(bufallpassR2,static_cast<int>(allpasstuningR2 * sampleratio));
allpassL[2].setbuffer(bufallpassL3,static_cast<int>(allpasstuningL3 * sampleratio));
allpassR[2].setbuffer(bufallpassR3,static_cast<int>(allpasstuningR3 * sampleratio));
allpassL[3].setbuffer(bufallpassL4,static_cast<int>(allpasstuningL4 * sampleratio));
allpassR[3].setbuffer(bufallpassR4,static_cast<int>(allpasstuningR4 * sampleratio));

// Set default values
allpassL[0].setfeedback(0.5f);
Expand Down
53 changes: 28 additions & 25 deletions src/freeverb/Components/revmodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,13 @@
#include "allpass.h"
#include "tuning.h"

// enough for largest possible samplerate, 8 * 96000
const int maxsampleratio = 18;

class revmodel
{
public:
revmodel();
revmodel(float sampleratio);
void mute();
void processmix(float *inputL, float *inputR, float *outputL, float *outputR, long numsamples, int skip);
void processreplace(float *inputL, float *inputR, float *outputL, float *outputR, long numsamples, int skip);
Expand Down Expand Up @@ -54,32 +57,32 @@ class revmodel
allpass allpassR[numallpasses];

// Buffers for the combs
float bufcombL1[combtuningL1];
float bufcombR1[combtuningR1];
float bufcombL2[combtuningL2];
float bufcombR2[combtuningR2];
float bufcombL3[combtuningL3];
float bufcombR3[combtuningR3];
float bufcombL4[combtuningL4];
float bufcombR4[combtuningR4];
float bufcombL5[combtuningL5];
float bufcombR5[combtuningR5];
float bufcombL6[combtuningL6];
float bufcombR6[combtuningR6];
float bufcombL7[combtuningL7];
float bufcombR7[combtuningR7];
float bufcombL8[combtuningL8];
float bufcombR8[combtuningR8];
float bufcombL1[combtuningL1 * maxsampleratio];
float bufcombR1[combtuningR1 * maxsampleratio];
float bufcombL2[combtuningL2 * maxsampleratio];
float bufcombR2[combtuningR2 * maxsampleratio];
float bufcombL3[combtuningL3 * maxsampleratio];
float bufcombR3[combtuningR3 * maxsampleratio];
float bufcombL4[combtuningL4 * maxsampleratio];
float bufcombR4[combtuningR4 * maxsampleratio];
float bufcombL5[combtuningL5 * maxsampleratio];
float bufcombR5[combtuningR5 * maxsampleratio];
float bufcombL6[combtuningL6 * maxsampleratio];
float bufcombR6[combtuningR6 * maxsampleratio];
float bufcombL7[combtuningL7 * maxsampleratio];
float bufcombR7[combtuningR7 * maxsampleratio];
float bufcombL8[combtuningL8 * maxsampleratio];
float bufcombR8[combtuningR8 * maxsampleratio];

// Buffers for the allpasses
float bufallpassL1[allpasstuningL1];
float bufallpassR1[allpasstuningR1];
float bufallpassL2[allpasstuningL2];
float bufallpassR2[allpasstuningR2];
float bufallpassL3[allpasstuningL3];
float bufallpassR3[allpasstuningR3];
float bufallpassL4[allpasstuningL4];
float bufallpassR4[allpasstuningR4];
float bufallpassL1[allpasstuningL1 * maxsampleratio];
float bufallpassR1[allpasstuningR1 * maxsampleratio];
float bufallpassL2[allpasstuningL2 * maxsampleratio];
float bufallpassR2[allpasstuningR2 * maxsampleratio];
float bufallpassL3[allpasstuningL3 * maxsampleratio];
float bufallpassR3[allpasstuningR3 * maxsampleratio];
float bufallpassL4[allpasstuningL4 * maxsampleratio];
float bufallpassR4[allpasstuningR4 * maxsampleratio];
};

#endif//_revmodel_
Expand Down
5 changes: 2 additions & 3 deletions src/freeverb/freeverb.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,8 @@ class Freeverb3 : public CMT_PluginInstance, public revmodel {
public:

Freeverb3(const LADSPA_Descriptor *, unsigned long lSampleRate)
: CMT_PluginInstance(FV_NumPorts) {
/* Richard's note 17/5/2000. Hmm - not sure I like the fact that
lSampleRate isn't actually used in this function! */
: CMT_PluginInstance(FV_NumPorts),
revmodel((float)lSampleRate / 44100.0f) {
}
friend void activateFreeverb3(LADSPA_Handle Instance);
friend void runFreeverb3(LADSPA_Handle Instance,
Expand Down

0 comments on commit 53f6bb5

Please sign in to comment.