123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155 |
- /*----------------------------------------------------------------------------
- *
- * File:
- * eas_reverb.c
- *
- * Contents and purpose:
- * Contains the implementation of the Reverb effect.
- *
- *
- * Copyright Sonic Network Inc. 2006
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- *----------------------------------------------------------------------------
- * Revision Control:
- * $Revision: 510 $
- * $Date: 2006-12-19 01:47:33 -0800 (Tue, 19 Dec 2006) $
- *----------------------------------------------------------------------------
- */
- /*------------------------------------
- * includes
- *------------------------------------
- */
- #include "eas_data.h"
- #include "eas_effects.h"
- #include "eas_math.h"
- #include "eas_reverbdata.h"
- #include "eas_reverb.h"
- #include "eas_config.h"
- #include "eas_host.h"
- #include "eas_report.h"
- /* prototypes for effects interface */
- static EAS_RESULT ReverbInit (EAS_DATA_HANDLE pEASData, EAS_VOID_PTR *pInstData);
- static void ReverbProcess (EAS_VOID_PTR pInstData, EAS_PCM *pSrc, EAS_PCM *pDst, EAS_I32 numSamples);
- static EAS_RESULT ReverbShutdown (EAS_DATA_HANDLE pEASData, EAS_VOID_PTR pInstData);
- static EAS_RESULT ReverbGetParam (EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 *pValue);
- static EAS_RESULT ReverbSetParam (EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 value);
- /* common effects interface for configuration module */
- const S_EFFECTS_INTERFACE EAS_Reverb =
- {
- ReverbInit,
- ReverbProcess,
- ReverbShutdown,
- ReverbGetParam,
- ReverbSetParam
- };
- /*----------------------------------------------------------------------------
- * InitializeReverb()
- *----------------------------------------------------------------------------
- * Purpose:
- *
- * Inputs:
- *
- * Outputs:
- *
- *----------------------------------------------------------------------------
- */
- static EAS_RESULT ReverbInit(EAS_DATA_HANDLE pEASData, EAS_VOID_PTR *pInstData)
- {
- EAS_I32 i;
- EAS_U16 nOffset;
- EAS_INT temp;
- S_REVERB_OBJECT *pReverbData;
- S_REVERB_PRESET *pPreset;
- /* check Configuration Module for data allocation */
- if (pEASData->staticMemoryModel)
- pReverbData = EAS_CMEnumFXData(EAS_MODULE_REVERB);
- /* allocate dynamic memory */
- else
- pReverbData = EAS_HWMalloc(pEASData->hwInstData, sizeof(S_REVERB_OBJECT));
- if (pReverbData == NULL)
- {
- { /* dpp: EAS_ReportEx(_EAS_SEVERITY_FATAL, "Failed to allocate Reverb memory\n"); */ }
- return EAS_ERROR_MALLOC_FAILED;
- }
- /* clear the structure */
- EAS_HWMemSet(pReverbData, 0, sizeof(S_REVERB_OBJECT));
- ReverbReadInPresets(pReverbData);
- pReverbData->m_nMinSamplesToAdd = REVERB_UPDATE_PERIOD_IN_SAMPLES;
- pReverbData->m_nRevOutFbkR = 0;
- pReverbData->m_nRevOutFbkL = 0;
- pReverbData->m_sAp0.m_zApIn = AP0_IN;
- pReverbData->m_sAp0.m_zApOut = AP0_IN + DEFAULT_AP0_LENGTH;
- pReverbData->m_sAp0.m_nApGain = DEFAULT_AP0_GAIN;
- pReverbData->m_zD0In = DELAY0_IN;
- pReverbData->m_sAp1.m_zApIn = AP1_IN;
- pReverbData->m_sAp1.m_zApOut = AP1_IN + DEFAULT_AP1_LENGTH;
- pReverbData->m_sAp1.m_nApGain = DEFAULT_AP1_GAIN;
- pReverbData->m_zD1In = DELAY1_IN;
- pReverbData->m_zLpf0 = 0;
- pReverbData->m_zLpf1 = 0;
- pReverbData->m_nLpfFwd = 8837;
- pReverbData->m_nLpfFbk = 6494;
- pReverbData->m_nSin = 0;
- pReverbData->m_nCos = 0;
- pReverbData->m_nSinIncrement = 0;
- pReverbData->m_nCosIncrement = 0;
- // set xfade parameters
- pReverbData->m_nXfadeInterval = (EAS_U16)REVERB_XFADE_PERIOD_IN_SAMPLES;
- pReverbData->m_nXfadeCounter = pReverbData->m_nXfadeInterval + 1; // force update on first iteration
- pReverbData->m_nPhase = -32768;
- pReverbData->m_nPhaseIncrement = REVERB_XFADE_PHASE_INCREMENT;
- pReverbData->m_nNoise = (EAS_I16)0xABCD;
- pReverbData->m_nMaxExcursion = 0x007F;
- // set delay tap lengths
- nOffset = ReverbCalculateNoise( pReverbData->m_nMaxExcursion,
- &pReverbData->m_nNoise );
- pReverbData->m_zD1Cross =
- DELAY1_OUT - pReverbData->m_nMaxExcursion + nOffset;
- nOffset = ReverbCalculateNoise( pReverbData->m_nMaxExcursion,
- &pReverbData->m_nNoise );
- pReverbData->m_zD0Cross =
- DELAY1_OUT - pReverbData->m_nMaxExcursion - nOffset;
- nOffset = ReverbCalculateNoise( pReverbData->m_nMaxExcursion,
- &pReverbData->m_nNoise );
- pReverbData->m_zD0Self =
- DELAY0_OUT - pReverbData->m_nMaxExcursion - nOffset;
- nOffset = ReverbCalculateNoise( pReverbData->m_nMaxExcursion,
- &pReverbData->m_nNoise );
- pReverbData->m_zD1Self =
- DELAY1_OUT - pReverbData->m_nMaxExcursion + nOffset;
- // for debugging purposes, allow noise generator
- pReverbData->m_bUseNoise = EAS_FALSE;
- // for debugging purposes, allow bypass
- pReverbData->m_bBypass = EAS_TRUE; //EAS_FALSE;
- pReverbData->m_nNextRoom = 1;
- pReverbData->m_nCurrentRoom = pReverbData->m_nNextRoom + 1; // force update on first iteration
- pReverbData->m_nWet = REVERB_DEFAULT_WET;
- pReverbData->m_nDry = REVERB_DEFAULT_DRY;
- // set base index into circular buffer
- pReverbData->m_nBaseIndex = 0;
- // set the early reflections, L
- pReverbData->m_sEarlyL.m_nLpfFbk = 4915;
- pReverbData->m_sEarlyL.m_nLpfFwd = 27852;
- pReverbData->m_sEarlyL.m_zLpf = 0;
- for (i=0; i < REVERB_MAX_NUM_REFLECTIONS; i++)
- {
- pReverbData->m_sEarlyL.m_nGain[i] = 0;
- pReverbData->m_sEarlyL.m_zDelay[i] = 0;
- }
- // set the early reflections, R
- pReverbData->m_sEarlyR.m_nLpfFbk = 4915;
- pReverbData->m_sEarlyR.m_nLpfFwd = 27852;
- pReverbData->m_sEarlyR.m_zLpf = 0;
- for (i=0; i < REVERB_MAX_NUM_REFLECTIONS; i++)
- {
- pReverbData->m_sEarlyR.m_nGain[i] = 0;
- pReverbData->m_sEarlyR.m_zDelay[i] = 0;
- }
- // clear the reverb delay line
- for (i=0; i < REVERB_BUFFER_SIZE_IN_SAMPLES; i++)
- {
- pReverbData->m_nDelayLine[i] = 0;
- }
- ////////////////////////////////
- ///code from the EAS DEMO Reverb
- //now copy from the new preset into the reverb
- pPreset = &pReverbData->m_sPreset.m_sPreset[pReverbData->m_nNextRoom];
- pReverbData->m_nLpfFbk = pPreset->m_nLpfFbk;
- pReverbData->m_nLpfFwd = pPreset->m_nLpfFwd;
- pReverbData->m_nEarly = pPreset->m_nEarly;
- pReverbData->m_nWet = pPreset->m_nWet;
- pReverbData->m_nDry = pPreset->m_nDry;
- pReverbData->m_nMaxExcursion = pPreset->m_nMaxExcursion;
- //stored as time based, convert to sample based
- temp = pPreset->m_nXfadeInterval;
- /*lint -e{702} shift for performance */
- temp = (temp * _OUTPUT_SAMPLE_RATE) >> 16;
- pReverbData->m_nXfadeInterval = (EAS_U16) temp;
- //gsReverbObject.m_nXfadeInterval = pPreset->m_nXfadeInterval;
- pReverbData->m_sAp0.m_nApGain = pPreset->m_nAp0_ApGain;
- //stored as time based, convert to absolute sample value
- temp = pPreset->m_nAp0_ApOut;
- /*lint -e{702} shift for performance */
- temp = (temp * _OUTPUT_SAMPLE_RATE) >> 16;
- pReverbData->m_sAp0.m_zApOut = (EAS_U16) (pReverbData->m_sAp0.m_zApIn + temp);
- //gsReverbObject.m_sAp0.m_zApOut = pPreset->m_nAp0_ApOut;
- pReverbData->m_sAp1.m_nApGain = pPreset->m_nAp1_ApGain;
- //stored as time based, convert to absolute sample value
- temp = pPreset->m_nAp1_ApOut;
- /*lint -e{702} shift for performance */
- temp = (temp * _OUTPUT_SAMPLE_RATE) >> 16;
- pReverbData->m_sAp1.m_zApOut = (EAS_U16) (pReverbData->m_sAp1.m_zApIn + temp);
- //gsReverbObject.m_sAp1.m_zApOut = pPreset->m_nAp1_ApOut;
- ///code from the EAS DEMO Reverb
- ////////////////////////////////
- *pInstData = pReverbData;
- return EAS_SUCCESS;
- } /* end InitializeReverb */
- /*----------------------------------------------------------------------------
- * ReverbProcess()
- *----------------------------------------------------------------------------
- * Purpose:
- * Reverberate the requested number of samples (block based processing)
- *
- * Inputs:
- * pInputBuffer - src buffer
- * pOutputBuffer - dst buffer
- * nNumSamplesToAdd - number of samples to write to buffer
- *
- * Outputs:
- * number of samples actually written to buffer
- *
- * Side Effects:
- * - samples are added to the presently free buffer
- *
- *----------------------------------------------------------------------------
- */
- static void ReverbProcess(EAS_VOID_PTR pInstData, EAS_PCM *pSrc, EAS_PCM *pDst, EAS_I32 numSamples)
- {
- S_REVERB_OBJECT *pReverbData;
- pReverbData = (S_REVERB_OBJECT*) pInstData;
- //if bypassed or the preset forces the signal to be completely dry
- if (pReverbData->m_bBypass ||
- (pReverbData->m_nWet == 0 && pReverbData->m_nDry == 32767))
- {
- if (pSrc != pDst)
- EAS_HWMemCpy(pSrc, pDst, numSamples * NUM_OUTPUT_CHANNELS * (EAS_I32) sizeof(EAS_PCM));
- return;
- }
- if (pReverbData->m_nNextRoom != pReverbData->m_nCurrentRoom)
- {
- ReverbUpdateRoom(pReverbData);
- }
- ReverbUpdateXfade(pReverbData, numSamples);
- Reverb(pReverbData, numSamples, pDst, pSrc);
- /* check if update counter needs to be reset */
- if (pReverbData->m_nUpdateCounter >= REVERB_MODULO_UPDATE_PERIOD_IN_SAMPLES)
- {
- /* update interval has elapsed, so reset counter */
- pReverbData->m_nUpdateCounter = 0;
- } /* end if m_nUpdateCounter >= update interval */
- /* increment update counter */
- pReverbData->m_nUpdateCounter += (EAS_I16)numSamples;
- } /* end ComputeReverb */
- /*----------------------------------------------------------------------------
- * ReverbUpdateXfade
- *----------------------------------------------------------------------------
- * Purpose:
- * Update the xfade parameters as required
- *
- * Inputs:
- * nNumSamplesToAdd - number of samples to write to buffer
- *
- * Outputs:
- *
- *
- * Side Effects:
- * - xfade parameters will be changed
- *
- *----------------------------------------------------------------------------
- */
- static EAS_RESULT ReverbUpdateXfade(S_REVERB_OBJECT *pReverbData, EAS_INT nNumSamplesToAdd)
- {
- EAS_U16 nOffset;
- EAS_I16 tempCos;
- EAS_I16 tempSin;
- if (pReverbData->m_nXfadeCounter >= pReverbData->m_nXfadeInterval)
- {
- /* update interval has elapsed, so reset counter */
- pReverbData->m_nXfadeCounter = 0;
- // Pin the sin,cos values to min / max values to ensure that the
- // modulated taps' coefs are zero (thus no clicks)
- if (pReverbData->m_nPhaseIncrement > 0)
- {
- // if phase increment > 0, then sin -> 1, cos -> 0
- pReverbData->m_nSin = 32767;
- pReverbData->m_nCos = 0;
- // reset the phase to match the sin, cos values
- pReverbData->m_nPhase = 32767;
- // modulate the cross taps because their tap coefs are zero
- nOffset = ReverbCalculateNoise( pReverbData->m_nMaxExcursion, &pReverbData->m_nNoise );
- pReverbData->m_zD1Cross =
- DELAY1_OUT - pReverbData->m_nMaxExcursion + nOffset;
- nOffset = ReverbCalculateNoise( pReverbData->m_nMaxExcursion, &pReverbData->m_nNoise );
- pReverbData->m_zD0Cross =
- DELAY0_OUT - pReverbData->m_nMaxExcursion - nOffset;
- }
- else
- {
- // if phase increment < 0, then sin -> 0, cos -> 1
- pReverbData->m_nSin = 0;
- pReverbData->m_nCos = 32767;
- // reset the phase to match the sin, cos values
- pReverbData->m_nPhase = -32768;
- // modulate the self taps because their tap coefs are zero
- nOffset = ReverbCalculateNoise( pReverbData->m_nMaxExcursion, &pReverbData->m_nNoise );
- pReverbData->m_zD0Self =
- DELAY0_OUT - pReverbData->m_nMaxExcursion - nOffset;
- nOffset = ReverbCalculateNoise( pReverbData->m_nMaxExcursion, &pReverbData->m_nNoise );
- pReverbData->m_zD1Self =
- DELAY1_OUT - pReverbData->m_nMaxExcursion + nOffset;
- } // end if-else (pReverbData->m_nPhaseIncrement > 0)
- // Reverse the direction of the sin,cos so that the
- // tap whose coef was previously increasing now decreases
- // and vice versa
- pReverbData->m_nPhaseIncrement = -pReverbData->m_nPhaseIncrement;
- } // end if counter >= update interval
- //compute what phase will be next time
- pReverbData->m_nPhase += pReverbData->m_nPhaseIncrement;
- //calculate what the new sin and cos need to reach by the next update
- ReverbCalculateSinCos(pReverbData->m_nPhase, &tempSin, &tempCos);
- //calculate the per-sample increment required to get there by the next update
- /*lint -e{702} shift for performance */
- pReverbData->m_nSinIncrement =
- (tempSin - pReverbData->m_nSin) >> REVERB_UPDATE_PERIOD_IN_BITS;
- /*lint -e{702} shift for performance */
- pReverbData->m_nCosIncrement =
- (tempCos - pReverbData->m_nCos) >> REVERB_UPDATE_PERIOD_IN_BITS;
- /* increment update counter */
- pReverbData->m_nXfadeCounter += (EAS_U16) nNumSamplesToAdd;
- return EAS_SUCCESS;
- } /* end ReverbUpdateXfade */
- /*----------------------------------------------------------------------------
- * ReverbCalculateNoise
- *----------------------------------------------------------------------------
- * Purpose:
- * Calculate a noise sample and limit its value
- *
- * Inputs:
- * nMaxExcursion - noise value is limited to this value
- * pnNoise - return new noise sample in this (not limited)
- *
- * Outputs:
- * new limited noise value
- *
- * Side Effects:
- * - *pnNoise noise value is updated
- *
- *----------------------------------------------------------------------------
- */
- static EAS_U16 ReverbCalculateNoise(EAS_U16 nMaxExcursion, EAS_I16 *pnNoise)
- {
- // calculate new noise value
- *pnNoise = (EAS_I16) (*pnNoise * 5 + 1);
- #if 0 // 1xxx, test
- *pnNoise = 0;
- #endif // 1xxx, test
- // return the limited noise value
- return (nMaxExcursion & (*pnNoise));
- } /* end ReverbCalculateNoise */
- /*----------------------------------------------------------------------------
- * ReverbCalculateSinCos
- *----------------------------------------------------------------------------
- * Purpose:
- * Calculate a new sin and cosine value based on the given phase
- *
- * Inputs:
- * nPhase - phase angle
- * pnSin - input old value, output new value
- * pnCos - input old value, output new value
- *
- * Outputs:
- *
- * Side Effects:
- * - *pnSin, *pnCos are updated
- *
- *----------------------------------------------------------------------------
- */
- static EAS_RESULT ReverbCalculateSinCos(EAS_I16 nPhase, EAS_I16 *pnSin, EAS_I16 *pnCos)
- {
- EAS_I32 nTemp;
- EAS_I32 nNetAngle;
- // -1 <= nPhase < 1
- // However, for the calculation, we need a value
- // that ranges from -1/2 to +1/2, so divide the phase by 2
- /*lint -e{702} shift for performance */
- nNetAngle = nPhase >> 1;
- /*
- Implement the following
- sin(x) = (2-4*c)*x^2 + c + x
- cos(x) = (2-4*c)*x^2 + c - x
- where c = 1/sqrt(2)
- using the a0 + x*(a1 + x*a2) approach
- */
- /* limit the input "angle" to be between -0.5 and +0.5 */
- if (nNetAngle > EG1_HALF)
- {
- nNetAngle = EG1_HALF;
- }
- else if (nNetAngle < EG1_MINUS_HALF)
- {
- nNetAngle = EG1_MINUS_HALF;
- }
- /* calculate sin */
- nTemp = EG1_ONE + MULT_EG1_EG1(REVERB_PAN_G2, nNetAngle);
- nTemp = REVERB_PAN_G0 + MULT_EG1_EG1(nTemp, nNetAngle);
- *pnSin = (EAS_I16) SATURATE_EG1(nTemp);
- /* calculate cos */
- nTemp = -EG1_ONE + MULT_EG1_EG1(REVERB_PAN_G2, nNetAngle);
- nTemp = REVERB_PAN_G0 + MULT_EG1_EG1(nTemp, nNetAngle);
- *pnCos = (EAS_I16) SATURATE_EG1(nTemp);
- return EAS_SUCCESS;
- } /* end ReverbCalculateSinCos */
- /*----------------------------------------------------------------------------
- * Reverb
- *----------------------------------------------------------------------------
- * Purpose:
- * apply reverb to the given signal
- *
- * Inputs:
- * nNu
- * pnSin - input old value, output new value
- * pnCos - input old value, output new value
- *
- * Outputs:
- * number of samples actually reverberated
- *
- * Side Effects:
- *
- *----------------------------------------------------------------------------
- */
- static EAS_RESULT Reverb(S_REVERB_OBJECT *pReverbData, EAS_INT nNumSamplesToAdd, EAS_PCM *pOutputBuffer, EAS_PCM *pInputBuffer)
- {
- EAS_I32 i;
- EAS_I32 nDelayOut;
- EAS_U16 nBase;
- EAS_U32 nAddr;
- EAS_I32 nTemp1;
- EAS_I32 nTemp2;
- EAS_I32 nApIn;
- EAS_I32 nApOut;
- EAS_I32 j;
- EAS_I32 nEarlyOut;
- EAS_I32 tempValue;
- // get the base address
- nBase = pReverbData->m_nBaseIndex;
- for (i=0; i < nNumSamplesToAdd; i++)
- {
- // ********** Left Allpass - start
- // left input = (left dry/4) + right feedback from previous period
- /*lint -e{702} use shift for performance */
- nApIn = ((*pInputBuffer++)>>2) + pReverbData->m_nRevOutFbkR;
- // nApIn = *pInputBuffer++; // 1xxx test and debug ap
- // fetch allpass delay line out
- //nAddr = CIRCULAR(nBase, psAp0->m_zApOut, REVERB_BUFFER_MASK);
- nAddr = CIRCULAR(nBase, pReverbData->m_sAp0.m_zApOut, REVERB_BUFFER_MASK);
- nDelayOut = pReverbData->m_nDelayLine[nAddr];
- // calculate allpass feedforward; subtract the feedforward result
- nTemp1 = MULT_EG1_EG1(nApIn, pReverbData->m_sAp0.m_nApGain);
- nApOut = SATURATE(nDelayOut - nTemp1); // allpass output
- // calculate allpass feedback; add the feedback result
- nTemp1 = MULT_EG1_EG1(nApOut, pReverbData->m_sAp0.m_nApGain);
- nTemp1 = SATURATE(nApIn + nTemp1);
- // inject into allpass delay
- nAddr = CIRCULAR(nBase, pReverbData->m_sAp0.m_zApIn, REVERB_BUFFER_MASK);
- pReverbData->m_nDelayLine[nAddr] = (EAS_PCM) nTemp1;
- // inject allpass output into delay line
- nAddr = CIRCULAR(nBase, pReverbData->m_zD0In, REVERB_BUFFER_MASK);
- pReverbData->m_nDelayLine[nAddr] = (EAS_PCM) nApOut;
- // ********** Left Allpass - end
- // ********** Right Allpass - start
- // right input = (right dry/4) + left feedback from previous period
- /*lint -e{702} use shift for performance */
- nApIn = ((*pInputBuffer++)>>2) + pReverbData->m_nRevOutFbkL;
- // nApIn = *pInputBuffer++; // 1xxx test and debug ap
- // fetch allpass delay line out
- nAddr = CIRCULAR(nBase, pReverbData->m_sAp1.m_zApOut, REVERB_BUFFER_MASK);
- nDelayOut = pReverbData->m_nDelayLine[nAddr];
- // calculate allpass feedforward; subtract the feedforward result
- nTemp1 = MULT_EG1_EG1(nApIn, pReverbData->m_sAp1.m_nApGain);
- nApOut = SATURATE(nDelayOut - nTemp1); // allpass output
- // calculate allpass feedback; add the feedback result
- nTemp1 = MULT_EG1_EG1(nApOut, pReverbData->m_sAp1.m_nApGain);
- nTemp1 = SATURATE(nApIn + nTemp1);
- // inject into allpass delay
- nAddr = CIRCULAR(nBase, pReverbData->m_sAp1.m_zApIn, REVERB_BUFFER_MASK);
- pReverbData->m_nDelayLine[nAddr] = (EAS_PCM) nTemp1;
- // inject allpass output into delay line
- nAddr = CIRCULAR(nBase, pReverbData->m_zD1In, REVERB_BUFFER_MASK);
- pReverbData->m_nDelayLine[nAddr] = (EAS_PCM) nApOut;
- // ********** Right Allpass - end
- // ********** D0 output - start
- // fetch delay line self out
- nAddr = CIRCULAR(nBase, pReverbData->m_zD0Self, REVERB_BUFFER_MASK);
- nDelayOut = pReverbData->m_nDelayLine[nAddr];
- // calculate delay line self out
- nTemp1 = MULT_EG1_EG1(nDelayOut, pReverbData->m_nSin);
- // fetch delay line cross out
- nAddr = CIRCULAR(nBase, pReverbData->m_zD1Cross, REVERB_BUFFER_MASK);
- nDelayOut = pReverbData->m_nDelayLine[nAddr];
- // calculate delay line self out
- nTemp2 = MULT_EG1_EG1(nDelayOut, pReverbData->m_nCos);
- // calculate unfiltered delay out
- nDelayOut = SATURATE(nTemp1 + nTemp2);
- // calculate lowpass filter (mixer scale factor included in LPF feedforward)
- nTemp1 = MULT_EG1_EG1(nDelayOut, pReverbData->m_nLpfFwd);
- nTemp2 = MULT_EG1_EG1(pReverbData->m_zLpf0, pReverbData->m_nLpfFbk);
- // calculate filtered delay out and simultaneously update LPF state variable
- // filtered delay output is stored in m_zLpf0
- pReverbData->m_zLpf0 = (EAS_PCM) SATURATE(nTemp1 + nTemp2);
- // ********** D0 output - end
- // ********** D1 output - start
- // fetch delay line self out
- nAddr = CIRCULAR(nBase, pReverbData->m_zD1Self, REVERB_BUFFER_MASK);
- nDelayOut = pReverbData->m_nDelayLine[nAddr];
- // calculate delay line self out
- nTemp1 = MULT_EG1_EG1(nDelayOut, pReverbData->m_nSin);
- // fetch delay line cross out
- nAddr = CIRCULAR(nBase, pReverbData->m_zD0Cross, REVERB_BUFFER_MASK);
- nDelayOut = pReverbData->m_nDelayLine[nAddr];
- // calculate delay line self out
- nTemp2 = MULT_EG1_EG1(nDelayOut, pReverbData->m_nCos);
- // calculate unfiltered delay out
- nDelayOut = SATURATE(nTemp1 + nTemp2);
- // calculate lowpass filter (mixer scale factor included in LPF feedforward)
- nTemp1 = MULT_EG1_EG1(nDelayOut, pReverbData->m_nLpfFwd);
- nTemp2 = MULT_EG1_EG1(pReverbData->m_zLpf1, pReverbData->m_nLpfFbk);
- // calculate filtered delay out and simultaneously update LPF state variable
- // filtered delay output is stored in m_zLpf1
- pReverbData->m_zLpf1 = (EAS_PCM)SATURATE(nTemp1 + nTemp2);
- // ********** D1 output - end
- // ********** mixer and feedback - start
- // sum is fedback to right input (R + L)
- pReverbData->m_nRevOutFbkL =
- (EAS_PCM)SATURATE((EAS_I32)pReverbData->m_zLpf1 + (EAS_I32)pReverbData->m_zLpf0);
- // difference is feedback to left input (R - L)
- /*lint -e{685} lint complains that it can't saturate negative */
- pReverbData->m_nRevOutFbkR =
- (EAS_PCM)SATURATE((EAS_I32)pReverbData->m_zLpf1 - (EAS_I32)pReverbData->m_zLpf0);
- // ********** mixer and feedback - end
- // ********** start early reflection generator, left
- //psEarly = &(pReverbData->m_sEarlyL);
- nEarlyOut = 0;
- for (j=0; j < REVERB_MAX_NUM_REFLECTIONS; j++)
- {
- // fetch delay line out
- //nAddr = CIRCULAR(nBase, psEarly->m_zDelay[j], REVERB_BUFFER_MASK);
- nAddr = CIRCULAR(nBase, pReverbData->m_sEarlyL.m_zDelay[j], REVERB_BUFFER_MASK);
- nDelayOut = pReverbData->m_nDelayLine[nAddr];
- // calculate reflection
- //nTemp1 = MULT_EG1_EG1(nDelayOut, psEarly->m_nGain[j]);
- nTemp1 = MULT_EG1_EG1(nDelayOut, pReverbData->m_sEarlyL.m_nGain[j]);
- nEarlyOut = SATURATE(nEarlyOut + nTemp1);
- } // end for (j=0; j < REVERB_MAX_NUM_REFLECTIONS; j++)
- // apply lowpass to early reflections
- //nTemp1 = MULT_EG1_EG1(nEarlyOut, psEarly->m_nLpfFwd);
- nTemp1 = MULT_EG1_EG1(nEarlyOut, pReverbData->m_sEarlyL.m_nLpfFwd);
- //nTemp2 = MULT_EG1_EG1(psEarly->m_zLpf, psEarly->m_nLpfFbk);
- nTemp2 = MULT_EG1_EG1(pReverbData->m_sEarlyL.m_zLpf, pReverbData->m_sEarlyL.m_nLpfFbk);
- // calculate filtered out and simultaneously update LPF state variable
- // filtered output is stored in m_zLpf1
- //psEarly->m_zLpf = SATURATE(nTemp1 + nTemp2);
- pReverbData->m_sEarlyL.m_zLpf = (EAS_PCM) SATURATE(nTemp1 + nTemp2);
- // combine filtered early and late reflections for output
- //*pOutputBuffer++ = inL;
- //tempValue = SATURATE(psEarly->m_zLpf + pReverbData->m_nRevOutFbkL);
- tempValue = SATURATE((EAS_I32)pReverbData->m_sEarlyL.m_zLpf + (EAS_I32)pReverbData->m_nRevOutFbkL);
- //scale reverb output by wet level
- /*lint -e{701} use shift for performance */
- tempValue = MULT_EG1_EG1(tempValue, (pReverbData->m_nWet<<1));
- //sum with output buffer
- tempValue += *pOutputBuffer;
- *pOutputBuffer++ = (EAS_PCM)SATURATE(tempValue);
- // ********** end early reflection generator, left
- // ********** start early reflection generator, right
- //psEarly = &(pReverbData->m_sEarlyR);
- nEarlyOut = 0;
- for (j=0; j < REVERB_MAX_NUM_REFLECTIONS; j++)
- {
- // fetch delay line out
- nAddr = CIRCULAR(nBase, pReverbData->m_sEarlyR.m_zDelay[j], REVERB_BUFFER_MASK);
- nDelayOut = pReverbData->m_nDelayLine[nAddr];
- // calculate reflection
- nTemp1 = MULT_EG1_EG1(nDelayOut, pReverbData->m_sEarlyR.m_nGain[j]);
- nEarlyOut = SATURATE(nEarlyOut + nTemp1);
- } // end for (j=0; j < REVERB_MAX_NUM_REFLECTIONS; j++)
- // apply lowpass to early reflections
- nTemp1 = MULT_EG1_EG1(nEarlyOut, pReverbData->m_sEarlyR.m_nLpfFwd);
- nTemp2 = MULT_EG1_EG1(pReverbData->m_sEarlyR.m_zLpf, pReverbData->m_sEarlyR.m_nLpfFbk);
- // calculate filtered out and simultaneously update LPF state variable
- // filtered output is stored in m_zLpf1
- pReverbData->m_sEarlyR.m_zLpf = (EAS_PCM)SATURATE(nTemp1 + nTemp2);
- // combine filtered early and late reflections for output
- //*pOutputBuffer++ = inR;
- tempValue = SATURATE((EAS_I32)pReverbData->m_sEarlyR.m_zLpf + (EAS_I32)pReverbData->m_nRevOutFbkR);
- //scale reverb output by wet level
- /*lint -e{701} use shift for performance */
- tempValue = MULT_EG1_EG1(tempValue, (pReverbData->m_nWet << 1));
- //sum with output buffer
- tempValue = tempValue + *pOutputBuffer;
- *pOutputBuffer++ = (EAS_PCM)SATURATE(tempValue);
- // ********** end early reflection generator, right
- // decrement base addr for next sample period
- nBase--;
- pReverbData->m_nSin += pReverbData->m_nSinIncrement;
- pReverbData->m_nCos += pReverbData->m_nCosIncrement;
- } // end for (i=0; i < nNumSamplesToAdd; i++)
- // store the most up to date version
- pReverbData->m_nBaseIndex = nBase;
- return EAS_SUCCESS;
- } /* end Reverb */
- /*----------------------------------------------------------------------------
- * ReverbShutdown()
- *----------------------------------------------------------------------------
- * Purpose:
- * Initializes the Reverb effect.
- *
- * Inputs:
- * pInstData - handle to instance data
- *
- * Outputs:
- *
- *
- * Side Effects:
- *
- *----------------------------------------------------------------------------
- */
- static EAS_RESULT ReverbShutdown (EAS_DATA_HANDLE pEASData, EAS_VOID_PTR pInstData)
- {
- /* check Configuration Module for static memory allocation */
- if (!pEASData->staticMemoryModel)
- EAS_HWFree(pEASData->hwInstData, pInstData);
- return EAS_SUCCESS;
- } /* end ReverbShutdown */
- /*----------------------------------------------------------------------------
- * ReverbGetParam()
- *----------------------------------------------------------------------------
- * Purpose:
- * Get a Reverb parameter
- *
- * Inputs:
- * pInstData - handle to instance data
- * param - parameter index
- * *pValue - pointer to variable to hold retrieved value
- *
- * Outputs:
- *
- *
- * Side Effects:
- *
- *----------------------------------------------------------------------------
- */
- static EAS_RESULT ReverbGetParam (EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 *pValue)
- {
- S_REVERB_OBJECT *p;
- p = (S_REVERB_OBJECT*) pInstData;
- switch (param)
- {
- case EAS_PARAM_REVERB_BYPASS:
- *pValue = (EAS_I32) p->m_bBypass;
- break;
- case EAS_PARAM_REVERB_PRESET:
- *pValue = (EAS_I8) p->m_nCurrentRoom;
- break;
- case EAS_PARAM_REVERB_WET:
- *pValue = p->m_nWet;
- break;
- case EAS_PARAM_REVERB_DRY:
- *pValue = p->m_nDry;
- break;
- default:
- return EAS_ERROR_INVALID_PARAMETER;
- }
- return EAS_SUCCESS;
- } /* end ReverbGetParam */
- /*----------------------------------------------------------------------------
- * ReverbSetParam()
- *----------------------------------------------------------------------------
- * Purpose:
- * Set a Reverb parameter
- *
- * Inputs:
- * pInstData - handle to instance data
- * param - parameter index
- * *pValue - new paramter value
- *
- * Outputs:
- *
- *
- * Side Effects:
- *
- *----------------------------------------------------------------------------
- */
- static EAS_RESULT ReverbSetParam (EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 value)
- {
- S_REVERB_OBJECT *p;
- p = (S_REVERB_OBJECT*) pInstData;
- switch (param)
- {
- case EAS_PARAM_REVERB_BYPASS:
- p->m_bBypass = (EAS_BOOL) value;
- break;
- case EAS_PARAM_REVERB_PRESET:
- if(value!=EAS_PARAM_REVERB_LARGE_HALL && value!=EAS_PARAM_REVERB_HALL &&
- value!=EAS_PARAM_REVERB_CHAMBER && value!=EAS_PARAM_REVERB_ROOM)
- return EAS_ERROR_INVALID_PARAMETER;
- p->m_nNextRoom = (EAS_I16)value;
- break;
- case EAS_PARAM_REVERB_WET:
- if(value>EAS_REVERB_WET_MAX || value<EAS_REVERB_WET_MIN)
- return EAS_ERROR_INVALID_PARAMETER;
- p->m_nWet = (EAS_I16)value;
- break;
- case EAS_PARAM_REVERB_DRY:
- if(value>EAS_REVERB_DRY_MAX || value<EAS_REVERB_DRY_MIN)
- return EAS_ERROR_INVALID_PARAMETER;
- p->m_nDry = (EAS_I16)value;
- break;
- default:
- return EAS_ERROR_INVALID_PARAMETER;
- }
- return EAS_SUCCESS;
- } /* end ReverbSetParam */
- /*----------------------------------------------------------------------------
- * ReverbUpdateRoom
- *----------------------------------------------------------------------------
- * Purpose:
- * Update the room's preset parameters as required
- *
- * Inputs:
- *
- * Outputs:
- *
- *
- * Side Effects:
- * - reverb paramters (fbk, fwd, etc) will be changed
- * - m_nCurrentRoom := m_nNextRoom
- *----------------------------------------------------------------------------
- */
- static EAS_RESULT ReverbUpdateRoom(S_REVERB_OBJECT *pReverbData)
- {
- EAS_INT temp;
- S_REVERB_PRESET *pPreset = &pReverbData->m_sPreset.m_sPreset[pReverbData->m_nNextRoom];
- pReverbData->m_nLpfFwd = pPreset->m_nLpfFwd;
- pReverbData->m_nLpfFbk = pPreset->m_nLpfFbk;
- pReverbData->m_nEarly = pPreset->m_nEarly;
- pReverbData->m_nWet = pPreset->m_nWet;
- pReverbData->m_nDry = pPreset->m_nDry;
- pReverbData->m_nMaxExcursion = pPreset->m_nMaxExcursion;
- //stored as time based, convert to sample based
- temp = pPreset->m_nXfadeInterval;
- /*lint -e{702} shift for performance */
- temp = (temp * _OUTPUT_SAMPLE_RATE) >> 16;
- pReverbData->m_nXfadeInterval = (EAS_U16) temp;
- //gpsReverbObject->m_nXfadeInterval = pPreset->m_nXfadeInterval;
- pReverbData->m_sAp0.m_nApGain = pPreset->m_nAp0_ApGain;
- //stored as time based, convert to absolute sample value
- temp = pPreset->m_nAp0_ApOut;
- /*lint -e{702} shift for performance */
- temp = (temp * _OUTPUT_SAMPLE_RATE) >> 16;
- pReverbData->m_sAp0.m_zApOut = (EAS_U16) (pReverbData->m_sAp0.m_zApIn + temp);
- //gpsReverbObject->m_sAp0.m_zApOut = pPreset->m_nAp0_ApOut;
- pReverbData->m_sAp1.m_nApGain = pPreset->m_nAp1_ApGain;
- //stored as time based, convert to absolute sample value
- temp = pPreset->m_nAp1_ApOut;
- /*lint -e{702} shift for performance */
- temp = (temp * _OUTPUT_SAMPLE_RATE) >> 16;
- pReverbData->m_sAp1.m_zApOut = (EAS_U16) (pReverbData->m_sAp1.m_zApIn + temp);
- //gpsReverbObject->m_sAp1.m_zApOut = pPreset->m_nAp1_ApOut;
- pReverbData->m_nCurrentRoom = pReverbData->m_nNextRoom;
- return EAS_SUCCESS;
- } /* end ReverbUpdateRoom */
- /*----------------------------------------------------------------------------
- * ReverbReadInPresets()
- *----------------------------------------------------------------------------
- * Purpose: sets global reverb preset bank to defaults
- *
- * Inputs:
- *
- * Outputs:
- *
- *----------------------------------------------------------------------------
- */
- static EAS_RESULT ReverbReadInPresets(S_REVERB_OBJECT *pReverbData)
- {
- int preset = 0;
- int defaultPreset = 0;
- //now init any remaining presets to defaults
- for (defaultPreset = preset; defaultPreset < REVERB_MAX_ROOM_TYPE; defaultPreset++)
- {
- S_REVERB_PRESET *pPreset = &pReverbData->m_sPreset.m_sPreset[defaultPreset];
- if (defaultPreset == 0 || defaultPreset > REVERB_MAX_ROOM_TYPE-1)
- {
- pPreset->m_nLpfFbk = 8307;
- pPreset->m_nLpfFwd = 14768;
- pPreset->m_nEarly = 0;
- pPreset->m_nWet = 27690;
- pPreset->m_nDry = 32767;
- pPreset->m_nEarlyL_LpfFbk = 3692;
- pPreset->m_nEarlyL_LpfFwd = 29075;
- pPreset->m_nEarlyL_Delay0 = 922;
- pPreset->m_nEarlyL_Gain0 = 22152;
- pPreset->m_nEarlyL_Delay1 = 1462;
- pPreset->m_nEarlyL_Gain1 = 17537;
- pPreset->m_nEarlyL_Delay2 = 0;
- pPreset->m_nEarlyL_Gain2 = 14768;
- pPreset->m_nEarlyL_Delay3 = 1221;
- pPreset->m_nEarlyL_Gain3 = 14307;
- pPreset->m_nEarlyL_Delay4 = 0;
- pPreset->m_nEarlyL_Gain4 = 13384;
- pPreset->m_nEarlyR_Delay0 = 502;
- pPreset->m_nEarlyR_Gain0 = 20306;
- pPreset->m_nEarlyR_Delay1 = 1762;
- pPreset->m_nEarlyR_Gain1 = 17537;
- pPreset->m_nEarlyR_Delay2 = 0;
- pPreset->m_nEarlyR_Gain2 = 14768;
- pPreset->m_nEarlyR_Delay3 = 0;
- pPreset->m_nEarlyR_Gain3 = 16153;
- pPreset->m_nEarlyR_Delay4 = 0;
- pPreset->m_nEarlyR_Gain4 = 13384;
- pPreset->m_nMaxExcursion = 127;
- pPreset->m_nXfadeInterval = 6388;
- pPreset->m_nAp0_ApGain = 15691;
- pPreset->m_nAp0_ApOut = 711;
- pPreset->m_nAp1_ApGain = 17999;
- pPreset->m_nAp1_ApOut = 1113;
- pPreset->m_rfu4 = 0;
- pPreset->m_rfu5 = 0;
- pPreset->m_rfu6 = 0;
- pPreset->m_rfu7 = 0;
- pPreset->m_rfu8 = 0;
- pPreset->m_rfu9 = 0;
- pPreset->m_rfu10 = 0;
- }
- else if (defaultPreset == 1)
- {
- pPreset->m_nLpfFbk = 6461;
- pPreset->m_nLpfFwd = 14307;
- pPreset->m_nEarly = 0;
- pPreset->m_nWet = 27690;
- pPreset->m_nDry = 32767;
- pPreset->m_nEarlyL_LpfFbk = 3692;
- pPreset->m_nEarlyL_LpfFwd = 29075;
- pPreset->m_nEarlyL_Delay0 = 922;
- pPreset->m_nEarlyL_Gain0 = 22152;
- pPreset->m_nEarlyL_Delay1 = 1462;
- pPreset->m_nEarlyL_Gain1 = 17537;
- pPreset->m_nEarlyL_Delay2 = 0;
- pPreset->m_nEarlyL_Gain2 = 14768;
- pPreset->m_nEarlyL_Delay3 = 1221;
- pPreset->m_nEarlyL_Gain3 = 14307;
- pPreset->m_nEarlyL_Delay4 = 0;
- pPreset->m_nEarlyL_Gain4 = 13384;
- pPreset->m_nEarlyR_Delay0 = 502;
- pPreset->m_nEarlyR_Gain0 = 20306;
- pPreset->m_nEarlyR_Delay1 = 1762;
- pPreset->m_nEarlyR_Gain1 = 17537;
- pPreset->m_nEarlyR_Delay2 = 0;
- pPreset->m_nEarlyR_Gain2 = 14768;
- pPreset->m_nEarlyR_Delay3 = 0;
- pPreset->m_nEarlyR_Gain3 = 16153;
- pPreset->m_nEarlyR_Delay4 = 0;
- pPreset->m_nEarlyR_Gain4 = 13384;
- pPreset->m_nMaxExcursion = 127;
- pPreset->m_nXfadeInterval = 6391;
- pPreset->m_nAp0_ApGain = 15230;
- pPreset->m_nAp0_ApOut = 708;
- pPreset->m_nAp1_ApGain = 9692;
- pPreset->m_nAp1_ApOut = 1113;
- pPreset->m_rfu4 = 0;
- pPreset->m_rfu5 = 0;
- pPreset->m_rfu6 = 0;
- pPreset->m_rfu7 = 0;
- pPreset->m_rfu8 = 0;
- pPreset->m_rfu9 = 0;
- pPreset->m_rfu10 = 0;
- }
- else if (defaultPreset == 2)
- {
- pPreset->m_nLpfFbk = 5077;
- pPreset->m_nLpfFwd = 12922;
- pPreset->m_nEarly = 0;
- pPreset->m_nWet = 24460;
- pPreset->m_nDry = 32767;
- pPreset->m_nEarlyL_LpfFbk = 3692;
- pPreset->m_nEarlyL_LpfFwd = 29075;
- pPreset->m_nEarlyL_Delay0 = 922;
- pPreset->m_nEarlyL_Gain0 = 22152;
- pPreset->m_nEarlyL_Delay1 = 1462;
- pPreset->m_nEarlyL_Gain1 = 17537;
- pPreset->m_nEarlyL_Delay2 = 0;
- pPreset->m_nEarlyL_Gain2 = 14768;
- pPreset->m_nEarlyL_Delay3 = 1221;
- pPreset->m_nEarlyL_Gain3 = 14307;
- pPreset->m_nEarlyL_Delay4 = 0;
- pPreset->m_nEarlyL_Gain4 = 13384;
- pPreset->m_nEarlyR_Delay0 = 502;
- pPreset->m_nEarlyR_Gain0 = 20306;
- pPreset->m_nEarlyR_Delay1 = 1762;
- pPreset->m_nEarlyR_Gain1 = 17537;
- pPreset->m_nEarlyR_Delay2 = 0;
- pPreset->m_nEarlyR_Gain2 = 14768;
- pPreset->m_nEarlyR_Delay3 = 0;
- pPreset->m_nEarlyR_Gain3 = 16153;
- pPreset->m_nEarlyR_Delay4 = 0;
- pPreset->m_nEarlyR_Gain4 = 13384;
- pPreset->m_nMaxExcursion = 127;
- pPreset->m_nXfadeInterval = 6449;
- pPreset->m_nAp0_ApGain = 15691;
- pPreset->m_nAp0_ApOut = 774;
- pPreset->m_nAp1_ApGain = 15691;
- pPreset->m_nAp1_ApOut = 1113;
- pPreset->m_rfu4 = 0;
- pPreset->m_rfu5 = 0;
- pPreset->m_rfu6 = 0;
- pPreset->m_rfu7 = 0;
- pPreset->m_rfu8 = 0;
- pPreset->m_rfu9 = 0;
- pPreset->m_rfu10 = 0;
- }
- else if (defaultPreset == 3)
- {
- pPreset->m_nLpfFbk = 5077;
- pPreset->m_nLpfFwd = 11076;
- pPreset->m_nEarly = 0;
- pPreset->m_nWet = 23075;
- pPreset->m_nDry = 32767;
- pPreset->m_nEarlyL_LpfFbk = 3692;
- pPreset->m_nEarlyL_LpfFwd = 29075;
- pPreset->m_nEarlyL_Delay0 = 922;
- pPreset->m_nEarlyL_Gain0 = 22152;
- pPreset->m_nEarlyL_Delay1 = 1462;
- pPreset->m_nEarlyL_Gain1 = 17537;
- pPreset->m_nEarlyL_Delay2 = 0;
- pPreset->m_nEarlyL_Gain2 = 14768;
- pPreset->m_nEarlyL_Delay3 = 1221;
- pPreset->m_nEarlyL_Gain3 = 14307;
- pPreset->m_nEarlyL_Delay4 = 0;
- pPreset->m_nEarlyL_Gain4 = 13384;
- pPreset->m_nEarlyR_Delay0 = 502;
- pPreset->m_nEarlyR_Gain0 = 20306;
- pPreset->m_nEarlyR_Delay1 = 1762;
- pPreset->m_nEarlyR_Gain1 = 17537;
- pPreset->m_nEarlyR_Delay2 = 0;
- pPreset->m_nEarlyR_Gain2 = 14768;
- pPreset->m_nEarlyR_Delay3 = 0;
- pPreset->m_nEarlyR_Gain3 = 16153;
- pPreset->m_nEarlyR_Delay4 = 0;
- pPreset->m_nEarlyR_Gain4 = 13384;
- pPreset->m_nMaxExcursion = 127;
- pPreset->m_nXfadeInterval = 6470; //6483;
- pPreset->m_nAp0_ApGain = 14768;
- pPreset->m_nAp0_ApOut = 792;
- pPreset->m_nAp1_ApGain = 15783;
- pPreset->m_nAp1_ApOut = 1113;
- pPreset->m_rfu4 = 0;
- pPreset->m_rfu5 = 0;
- pPreset->m_rfu6 = 0;
- pPreset->m_rfu7 = 0;
- pPreset->m_rfu8 = 0;
- pPreset->m_rfu9 = 0;
- pPreset->m_rfu10 = 0;
- }
- }
- return EAS_SUCCESS;
- }
|