diff options
author | Eugene Sandulenko | 2012-02-09 11:20:45 +0200 |
---|---|---|
committer | Eugene Sandulenko | 2012-02-09 11:31:03 +0200 |
commit | 030e155eeb7f82dc89315dbefa43e09a411c6110 (patch) | |
tree | 3b941d9841735fcc9878ab0663406d6be7a025aa /audio/softsynth/mt32/freeverb.h | |
parent | 06b52994619fb9a7ef9e54e50b5cc67d07f6a0a0 (diff) | |
download | scummvm-rg350-030e155eeb7f82dc89315dbefa43e09a411c6110.tar.gz scummvm-rg350-030e155eeb7f82dc89315dbefa43e09a411c6110.tar.bz2 scummvm-rg350-030e155eeb7f82dc89315dbefa43e09a411c6110.zip |
MT32: Update MT-32 emulator to latest Munt code
Several changes against original code were made. They were intentionally
kept to the minimum
Diffstat (limited to 'audio/softsynth/mt32/freeverb.h')
-rw-r--r-- | audio/softsynth/mt32/freeverb.h | 322 |
1 files changed, 135 insertions, 187 deletions
diff --git a/audio/softsynth/mt32/freeverb.h b/audio/softsynth/mt32/freeverb.h index 39ae463970..ae4d48169e 100644 --- a/audio/softsynth/mt32/freeverb.h +++ b/audio/softsynth/mt32/freeverb.h @@ -1,24 +1,32 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ +#ifndef _freeverb_ +#define _freeverb_ + +// Reverb model tuning values +// +// Written by Jezar at Dreampoint, June 2000 +// http://www.dreampoint.co.uk +// This code is public domain + +const int numcombs = 8; +const int numallpasses = 4; +const float muted = 0; +const float fixedgain = 0.015f; +const float scalewet = 3; +const float scaledry = 2; +const float scaledamp = 0.4f; +const float scaleroom = 0.28f; +const float offsetroom = 0.7f; +const float initialroom = 0.5f; +const float initialdamp = 0.5f; +const float initialwet = 1/scalewet; +const float initialdry = 0; +const float initialwidth = 1; +const float initialmode = 0; +const float freezemode = 0.5f; +const int stereospread = 23; + +const int combtuning[] = {1116, 1188, 1277, 1356, 1422, 1491, 1557, 1617}; +const int allpasstuning[] = {556, 441, 341, 225}; // Macro for killing denormalled numbers // @@ -27,215 +35,155 @@ // Based on IS_DENORMAL macro by Jon Watte // This code is public domain -#ifndef FREEVERB_H -#define FREEVERB_H - -// FIXME: Fix this really ugly hack -inline float undenormalise(void *sample) { - if (((*(unsigned int*)sample) & 0x7f800000) == 0) +static inline float undenormalise(float x) { + union { + float f; + unsigned int i; + } u; + u.f = x; + if ((u.i & 0x7f800000) == 0) { return 0.0f; - return *(float*)sample; + } + return x; } -// Comb filter class declaration +// Allpass filter declaration +// +// Written by Jezar at Dreampoint, June 2000 +// http://www.dreampoint.co.uk +// This code is public domain -class comb { +class allpass +{ public: - comb(); - void setbuffer(float *buf, int size); - inline float process(float inp); - void mute(); - void setdamp(float val); - float getdamp(); - void setfeedback(float val); - float getfeedback(); -private: - float feedback; - float filterstore; - float damp1; - float damp2; - float *buffer; - int bufsize; - int bufidx; + allpass(); + void setbuffer(float *buf, int size); + void deletebuffer(); + inline float process(float inp); + void mute(); + void setfeedback(float val); + float getfeedback(); +// private: + float feedback; + float *buffer; + int bufsize; + int bufidx; }; // Big to inline - but crucial for speed -inline float comb::process(float input) { +inline float allpass::process(float input) +{ float output; + float bufout; - output = buffer[bufidx]; - undenormalise(&output); - - filterstore = (output * damp2) + (filterstore * damp1); - undenormalise(&filterstore); + bufout = undenormalise(buffer[bufidx]); - buffer[bufidx] = input + (filterstore * feedback); + output = -input + bufout; + buffer[bufidx] = input + (bufout*feedback); - if (++bufidx >= bufsize) - bufidx = 0; + if (++bufidx>=bufsize) bufidx = 0; return output; } -// Allpass filter declaration +// Comb filter class declaration +// +// Written by Jezar at Dreampoint, June 2000 +// http://www.dreampoint.co.uk +// This code is public domain -class allpass { +class comb +{ public: - allpass(); - void setbuffer(float *buf, int size); - inline float process(float inp); - void mute(); - void setfeedback(float val); - float getfeedback(); + comb(); + void setbuffer(float *buf, int size); + void deletebuffer(); + inline float process(float inp); + void mute(); + void setdamp(float val); + float getdamp(); + void setfeedback(float val); + float getfeedback(); private: - float feedback; - float *buffer; - int bufsize; - int bufidx; + float feedback; + float filterstore; + float damp1; + float damp2; + float *buffer; + int bufsize; + int bufidx; }; // Big to inline - but crucial for speed -inline float allpass::process(float input) { +inline float comb::process(float input) +{ float output; - float bufout; - bufout = buffer[bufidx]; - undenormalise(&bufout); + output = undenormalise(buffer[bufidx]); - output = -input + bufout; - buffer[bufidx] = input + (bufout * feedback); + filterstore = undenormalise((output*damp2) + (filterstore*damp1)); + + buffer[bufidx] = input + (filterstore*feedback); - if (++bufidx >= bufsize) - bufidx = 0; + if (++bufidx>=bufsize) bufidx = 0; return output; } - -// Reverb model tuning values - -const int numcombs = 8; -const int numallpasses = 4; -const float muted = 0; -const float fixedgain = 0.015f; -const float scalewet = 3; -const float scaledry = 2; -const float scaledamp = 0.4f; -const float scaleroom = 0.28f; -const float offsetroom = 0.7f; -const float initialroom = 0.5f; -const float initialdamp = 0.5f; -const float initialwet = 1 / scalewet; -const float initialdry = 0; -const float initialwidth = 1; -const float initialmode = 0; -const float freezemode = 0.5f; -const int stereospread = 23; - -// These values assume 44.1KHz sample rate -// they will probably be OK for 48KHz sample rate -// but would need scaling for 96KHz (or other) sample rates. -// The values were obtained by listening tests. -const int combtuningL1 = 1116; -const int combtuningR1 = 1116 + stereospread; -const int combtuningL2 = 1188; -const int combtuningR2 = 1188 + stereospread; -const int combtuningL3 = 1277; -const int combtuningR3 = 1277 + stereospread; -const int combtuningL4 = 1356; -const int combtuningR4 = 1356 + stereospread; -const int combtuningL5 = 1422; -const int combtuningR5 = 1422 + stereospread; -const int combtuningL6 = 1491; -const int combtuningR6 = 1491 + stereospread; -const int combtuningL7 = 1557; -const int combtuningR7 = 1557 + stereospread; -const int combtuningL8 = 1617; -const int combtuningR8 = 1617 + stereospread; -const int allpasstuningL1 = 556; -const int allpasstuningR1 = 556 + stereospread; -const int allpasstuningL2 = 441; -const int allpasstuningR2 = 441 + stereospread; -const int allpasstuningL3 = 341; -const int allpasstuningR3 = 341 + stereospread; -const int allpasstuningL4 = 225; -const int allpasstuningR4 = 225 + stereospread; - - // Reverb model declaration +// +// Written by Jezar at Dreampoint, June 2000 +// Modifications by Jerome Fisher, 2009 +// http://www.dreampoint.co.uk +// This code is public domain -class revmodel { +class revmodel +{ public: - revmodel(); - 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); - void setroomsize(float value); - float getroomsize(); - void setdamp(float value); - float getdamp(); - void setwet(float value); - float getwet(); - void setdry(float value); - float getdry(); - void setwidth(float value); - float getwidth(); - void setmode(float value); - float getmode(); + revmodel(float scaletuning); + ~revmodel(); + void mute(); + void process(const float *inputL, const float *inputR, float *outputL, float *outputR, long numsamples); + void setroomsize(float value); + float getroomsize(); + void setdamp(float value); + float getdamp(); + void setwet(float value); + float getwet(); + void setdry(float value); + float getdry(); + void setwidth(float value); + float getwidth(); + void setmode(float value); + float getmode(); + void setfiltval(float value); private: - void update(); - - float gain; - float roomsize, roomsize1; - float damp, damp1; - float wet, wet1, wet2; - float dry; - float width; - float mode; - - // The following are all declared inline - // to remove the need for dynamic allocation - // with its subsequent error-checking messiness + void update(); +private: + float gain; + float roomsize,roomsize1; + float damp,damp1; + float wet,wet1,wet2; + float dry; + float width; + float mode; + + // LPF stuff + float filtval; + float filtprev1; + float filtprev2; // Comb filters - comb combL[numcombs]; - comb combR[numcombs]; + comb combL[numcombs]; + comb combR[numcombs]; // Allpass filters allpass allpassL[numallpasses]; 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]; - - // 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]; }; -#endif +#endif//_freeverb_ |