|
From: Jerome F. <kin...@us...> - 2009-06-07 18:32:55
|
Update of /cvsroot/munt/mt32emu/src In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv9230/src Modified Files: synth.cpp synth.h Makefile.am Added Files: delayReverb.cpp delayReverb.h Log Message: - Added a new model for "type 3" reverb, based on info from Mok: Simple delay of left/right mix with feedback, with separate output delay to left and right. Index: synth.cpp =================================================================== RCS file: /cvsroot/munt/mt32emu/src/synth.cpp,v retrieving revision 1.61 retrieving revision 1.62 diff -C2 -d -r1.61 -r1.62 *** synth.cpp 7 Jun 2009 06:32:49 -0000 1.61 --- synth.cpp 7 Jun 2009 18:32:20 -0000 1.62 *************** *** 22,25 **** --- 22,27 ---- #include "mt32emu.h" + #include "delayReverb.h" + namespace MT32Emu { *************** *** 105,111 **** --- 107,115 ---- isOpen = false; reverbModel = NULL; + delayReverbModel = NULL; reverbEnabled = true; reverbOverridden = false; setReverbModel(NULL); // Creates a default FreeverbModel + setDelayReverbModel(NULL); // Creates a default DelayReverb. partialManager = NULL; memset(parts, 0, sizeof(parts)); *************** *** 115,118 **** --- 119,123 ---- close(); // Make sure we're closed and everything is freed delete reverbModel; + delete delayReverbModel; } *************** *** 149,152 **** --- 154,166 ---- } + void Synth::setDelayReverbModel(ReverbModel *delayReverbModel) { + delete this->delayReverbModel; + if(delayReverbModel == NULL) + delayReverbModel = new DelayReverb(); + this->delayReverbModel = delayReverbModel; + if(isOpen) + setReverbParameters(mt32ram.system.reverbMode, mt32ram.system.reverbTime, mt32ram.system.reverbLevel); + } + void Synth::setReverbEnabled(bool reverbEnabled) { this->reverbEnabled = reverbEnabled; *************** *** 168,172 **** if(reverbOverridden) return; ! reverbModel->setParameters(mode, time, level); } --- 182,189 ---- if(reverbOverridden) return; ! if(mode == 3) ! delayReverbModel->setParameters(mode, time, level); ! else ! reverbModel->setParameters(mode, time, level); } *************** *** 403,406 **** --- 420,425 ---- reverbModel->reset(); reverbModel->setSampleRate(useProp.sampleRate); + delayReverbModel->reset(); + delayReverbModel->setSampleRate(useProp.sampleRate); myProp = useProp; if (useProp.baseDir != NULL) { *************** *** 1178,1182 **** m++; } ! reverbModel->process(sndbufl, sndbufr, outbufl, outbufr, len); m=0; for (unsigned int i = 0; i < len; i++) { --- 1197,1206 ---- m++; } ! if (mt32ram.system.reverbMode == 3) { ! delayReverbModel->process(sndbufl, sndbufr, outbufl, outbufr, len); ! } ! else { ! reverbModel->process(sndbufl, sndbufr, outbufl, outbufr, len); ! } m=0; for (unsigned int i = 0; i < len; i++) { --- NEW FILE: delayReverb.cpp --- /* Copyright (C) 2003-2009 Dean Beeler, Jerome Fisher * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 2.1 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include <string.h> #include "mt32emu.h" #include "delayReverb.h" using namespace MT32Emu; // All in seconds const float RAMP_TIME = 1.0f / 88.0f; // Time taken to ramp up from 0 to desired reverb/feedback levels after parameter change const float BASE_DELAY = 0.0006875; const float LEFT_DELAY_COEF = 0.056; const float RIGHT_DELAY_COEF = 0.028; DelayReverb::DelayReverb() { sampleRate = 0; buf = NULL; bufSize = 0; leftDelaySeconds = 0; rightDelaySeconds = 0; targetReverbLevel = 0; targetFeedbackLevel = 0; } DelayReverb::~DelayReverb() { delete[] buf; } void DelayReverb::setSampleRate(unsigned int sampleRate) { if(sampleRate != this->sampleRate) { this->sampleRate = sampleRate; delete[] buf; // FIXME: Always 2 second buffer - we could reduce this to what we actually need after we've tweaked the parameters bufSize = 2 * sampleRate; buf = new float[bufSize]; this->rampTarget = (unsigned int)(RAMP_TIME * sampleRate); reset(); } } void DelayReverb::setParameters(Bit8u mode, Bit8u time, Bit8u level) { float oldLeftDelaySeconds = leftDelaySeconds; float oldRightDelaySeconds = rightDelaySeconds; float oldTargetReverbLevel = targetReverbLevel; float oldTargetFeedbackLevel = targetFeedbackLevel; leftDelaySeconds = BASE_DELAY + time * LEFT_DELAY_COEF; rightDelaySeconds = BASE_DELAY + time * RIGHT_DELAY_COEF; targetReverbLevel = level * 6.0f / 127.0f; targetFeedbackLevel = 30.0f / 128.0f; if (leftDelaySeconds != oldLeftDelaySeconds || rightDelaySeconds != oldRightDelaySeconds || targetReverbLevel != oldTargetReverbLevel || targetFeedbackLevel != oldTargetFeedbackLevel) { resetParameters(); } } void DelayReverb::process(const float *inLeft, const float *inRight, float *outLeft, float *outRight, long numSamples) { for (unsigned int sampleIx = 0; sampleIx < numSamples; sampleIx++) { float leftSample = inLeft[sampleIx]; float rightSample = inRight[sampleIx]; bufIx = (bufSize + bufIx - 1) % bufSize; float reverbLeft = buf[(bufIx + leftDelay) % bufSize]; float reverbRight = buf[(bufIx + rightDelay) % bufSize]; outLeft[sampleIx] = (reverbLeft * reverbLevel) + leftSample; outRight[sampleIx] = (reverbRight * reverbLevel) + rightSample; buf[bufIx] = (reverbLeft * feedbackLevel) + (leftSample + rightSample) / 2.0f; if (rampCount < rampTarget) { // Linearly ramp up reverb/feedback levels over RAMP_TIME (after parameter change) rampCount++; if (rampCount == rampTarget) { reverbLevel = targetReverbLevel; feedbackLevel = targetFeedbackLevel; } else { reverbLevel += reverbLevelRampInc; feedbackLevel += feedbackLevelRampInc; } } } } void DelayReverb::reset() { resetBuffer(); resetParameters(); } void DelayReverb::resetBuffer() { bufIx = 0; if (buf != NULL) { memset(buf, 0, bufSize * sizeof(float)); } } void DelayReverb::resetParameters() { leftDelay = leftDelaySeconds * sampleRate; rightDelay = rightDelaySeconds * sampleRate; rampCount = 0; reverbLevel = 0; feedbackLevel = 0; feedbackLevelRampInc = targetFeedbackLevel / rampTarget; reverbLevelRampInc = targetReverbLevel / rampTarget; } Index: Makefile.am =================================================================== RCS file: /cvsroot/munt/mt32emu/src/Makefile.am,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** Makefile.am 24 May 2009 18:39:13 -0000 1.8 --- Makefile.am 7 Jun 2009 18:32:20 -0000 1.9 *************** *** 1,3 **** lib_LIBRARIES = libmt32emu.a ! libmt32emu_a_SOURCES = file.cpp part.cpp partial.cpp partialManager.cpp poly.cpp synth.cpp tables.cpp tva.cpp tvf.cpp tvp.cpp freeverb/allpass.cpp freeverb/comb.cpp freeverb/revmodel.cpp blit/Blit.cpp blit/BlitSaw.cpp blit/BlitSquare.cpp blit/Generator.cpp blit/Stk.cpp nobase_pkginclude_HEADERS = file.h mt32emu.h part.h partial.h partialManager.h poly.h structures.h synth.h tables.h tva.h tvf.h tvp.h freeverb/allpass.h freeverb/comb.h freeverb/denormals.h freeverb/tuning.h freeverb/revmodel.h blit/BlitSaw.h blit/BlitSquare.h blit/Generator.h blit/Stk.h --- 1,3 ---- lib_LIBRARIES = libmt32emu.a ! libmt32emu_a_SOURCES = delayReverb.cpp file.cpp part.cpp partial.cpp partialManager.cpp poly.cpp synth.cpp tables.cpp tva.cpp tvf.cpp tvp.cpp freeverb/allpass.cpp freeverb/comb.cpp freeverb/revmodel.cpp blit/Blit.cpp blit/BlitSaw.cpp blit/BlitSquare.cpp blit/Generator.cpp blit/Stk.cpp nobase_pkginclude_HEADERS = file.h mt32emu.h part.h partial.h partialManager.h poly.h structures.h synth.h tables.h tva.h tvf.h tvp.h freeverb/allpass.h freeverb/comb.h freeverb/denormals.h freeverb/tuning.h freeverb/revmodel.h blit/BlitSaw.h blit/BlitSquare.h blit/Generator.h blit/Stk.h --- NEW FILE: delayReverb.h --- /* Copyright (C) 2003-2009 Dean Beeler, Jerome Fisher * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 2.1 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #ifndef MT32EMU_DELAYREVERB_H #define MT32EMU_DELAYREVERB_H namespace MT32Emu { class DelayReverb : public ReverbModel { private: float *buf; unsigned int sampleRate; unsigned int bufSize; unsigned int bufIx; unsigned int rampCount; unsigned int rampTarget; unsigned int leftDelay; unsigned int rightDelay; float leftDelaySeconds; float rightDelaySeconds; float targetReverbLevel; float reverbLevelRampInc; float reverbLevel; float targetFeedbackLevel; float feedbackLevelRampInc; float feedbackLevel; void resetBuffer(); void resetParameters(); public: DelayReverb(); ~DelayReverb(); void setSampleRate(unsigned int sampleRate); void setParameters(Bit8u mode, Bit8u time, Bit8u level); void process(const float *inLeft, const float *inRight, float *outLeft, float *outRight, long numSamples); void reset(); }; } #endif Index: synth.h =================================================================== RCS file: /cvsroot/munt/mt32emu/src/synth.h,v retrieving revision 1.29 retrieving revision 1.30 diff -C2 -d -r1.29 -r1.30 *** synth.h 5 Jun 2009 23:56:52 -0000 1.29 --- synth.h 7 Jun 2009 18:32:20 -0000 1.30 *************** *** 310,313 **** --- 310,314 ---- ReverbModel *reverbModel; + ReverbModel *delayReverbModel; bool reverbEnabled; bool reverbOverridden; *************** *** 382,385 **** --- 383,387 ---- void setReverbModel(ReverbModel *reverbModel); + void setDelayReverbModel(ReverbModel *reverbModel); void setReverbEnabled(bool reverbEnabled); bool isReverbEnabled() const; |