156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * File: 456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * eas_chorus.c 556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Contents and purpose: 756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Contains the implementation of the Chorus effect. 856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 1056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Copyright Sonic Network Inc. 2006 117df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 137df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * you may not use this file except in compliance with the License. 147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * You may obtain a copy of the License at 157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 207df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 217df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * See the License for the specific language governing permissions and 227df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * limitations under the License. 2356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 2456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 2556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Revision Control: 2656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * $Revision: 499 $ 2756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * $Date: 2006-12-11 16:07:20 -0800 (Mon, 11 Dec 2006) $ 2856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 2956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 3056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 3156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_data.h" 3256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_effects.h" 3356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_math.h" 3456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_chorusdata.h" 3556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_chorus.h" 3656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_config.h" 3756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_host.h" 3856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_report.h" 3956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 4056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* prototypes for effects interface */ 4156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT ChorusInit (EAS_DATA_HANDLE pEASData, EAS_VOID_PTR *pInstData); 4256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic void ChorusProcess (EAS_VOID_PTR pInstData, EAS_PCM *pSrc, EAS_PCM *pDst, EAS_I32 numSamples); 4356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT ChorusShutdown (EAS_DATA_HANDLE pEASData, EAS_VOID_PTR pInstData); 4456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT ChorusGetParam (EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 *pValue); 4556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT ChorusSetParam (EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 value); 4656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 4756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* common effects interface for configuration module */ 4856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksconst S_EFFECTS_INTERFACE EAS_Chorus = 4956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 5056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks ChorusInit, 5156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks ChorusProcess, 5256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks ChorusShutdown, 5356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks ChorusGetParam, 5456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks ChorusSetParam 5556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}; 5656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 5756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 5856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 5956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks//LFO shape table used by the chorus, larger table would sound better 6056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks//this is a sine wave, where 32767 = 1.0 6156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic const EAS_I16 EAS_chorusShape[CHORUS_SHAPE_SIZE] = { 6256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 0, 1608, 3212, 4808, 6393, 7962, 9512, 11309, 12539, 14010, 15446, 16846, 18204, 19519, 20787, 22005, 23170, 6356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 24279, 25329, 26319, 27245, 28105, 28898, 29621, 30273, 30852, 31356, 31785, 32137, 32412, 32609, 32728, 6456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 32767, 32728, 32609, 32412, 32137, 31785, 31356, 30852, 30273, 29621, 28898, 28105, 27245, 26319, 25329, 6556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 24279, 23170, 22005, 20787, 19519, 18204, 16846, 15446, 14010, 12539, 11039, 9512, 7962, 6393, 4808, 3212, 6656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 1608, 0, -1608, -3212, -4808, -6393, -7962, -9512, -11309, -12539, -14010, -15446, -16846, -18204, -19519, 6756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks -20787, -22005, -23170, -24279, -25329, -26319, -27245, -28105, -28898, -29621, -30273, -30852, -31356, -31785, 6856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks -32137, -32412, -32609, -32728, -32767, -32728, -32609, -32412, -32137, -31785, -31356, -30852, -30273, -29621, 6956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks -28898, -28105, -27245, -26319, -25329, -24279, -23170, -22005, -20787, -19519, -18204, -16846, -15446, -14010, 7056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks -12539, -11039, -9512, -7962, -6393, -4808, -3212, -1608 7156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}; 7256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 7356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 7456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * InitializeChorus() 7556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 7656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: Initializes chorus parameters 7756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 7856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 7956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 8056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 8156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs: 8256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 8356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 8456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 8556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT ChorusInit (EAS_DATA_HANDLE pEASData, EAS_VOID_PTR *pInstData) 8656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 8756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks S_CHORUS_OBJECT *pChorusData; 8856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks S_CHORUS_PRESET *pPreset; 8956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 index; 9056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 9156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check Configuration Module for data allocation */ 9256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pEASData->staticMemoryModel) 9356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData = EAS_CMEnumFXData(EAS_MODULE_CHORUS); 9456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 9556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* allocate dynamic memory */ 9656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else 9756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData = EAS_HWMalloc(pEASData->hwInstData, sizeof(S_CHORUS_OBJECT)); 9856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 9956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pChorusData == NULL) 10056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 10156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { /* dpp: EAS_ReportEx(_EAS_SEVERITY_FATAL, "Failed to allocate Chorus memory\n"); */ } 10256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_MALLOC_FAILED; 10356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 10456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 10556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* clear the structure */ 10656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_HWMemSet(pChorusData, 0, sizeof(S_CHORUS_OBJECT)); 10756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 10856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks ChorusReadInPresets(pChorusData); 10956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 11056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* set some default values */ 11156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData->bypass = EAS_CHORUS_BYPASS_DEFAULT; 11256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData->preset = EAS_CHORUS_PRESET_DEFAULT; 11356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData->m_nLevel = EAS_CHORUS_LEVEL_DEFAULT; 11456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData->m_nRate = EAS_CHORUS_RATE_DEFAULT; 11556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData->m_nDepth = EAS_CHORUS_DEPTH_DEFAULT; 11656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 11756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //chorus rate and depth need some massaging from preset value (which is sample rate independent) 11856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 11956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //convert rate from steps of .05 Hz to value which can be used as phase increment, 12056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //with current CHORUS_SHAPE_SIZE and rate limits, this fits into 16 bits 12156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //want to compute ((shapeSize * 65536) * (storedRate/20))/sampleRate; 12256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //computing it as below allows rate steps to be evenly spaced 12356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //uses 32 bit divide, but only once when new value is selected 12456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData->m_nRate = (EAS_I16) 12556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks ((((EAS_I32)CHORUS_SHAPE_SIZE<<16)/(20*(EAS_I32)_OUTPUT_SAMPLE_RATE)) * pChorusData->m_nRate); 12656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 12756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //convert depth from steps of .05 ms, to samples, with 16 bit whole part, discard fraction 12856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //want to compute ((depth * sampleRate)/20000) 12956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //use the following approximation since 105/32 is roughly 65536/20000 13056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{704} use shift for performance */ 13156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData->m_nDepth = (EAS_I16) 13256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks (((((EAS_I32)pChorusData->m_nDepth * _OUTPUT_SAMPLE_RATE)>>5) * 105) >> 16); 13356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 13456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData->m_nLevel = pChorusData->m_nLevel; 13556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 13656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //zero delay memory for chorus 13756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for (index = CHORUS_L_SIZE - 1; index >= 0; index--) 13856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 13956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData->chorusDelayL[index] = 0; 14056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 14156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for (index = CHORUS_R_SIZE - 1; index >= 0; index--) 14256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 14356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData->chorusDelayR[index] = 0; 14456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 14556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 14656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //init delay line index, these are used to implement circular delay buffer 14756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData->chorusIndexL = 0; 14856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData->chorusIndexR = 0; 14956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 15056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //init LFO phase 15156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //16 bit whole part, 16 bit fraction 15256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData->lfoLPhase = 0; 15356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData->lfoRPhase = (CHORUS_SHAPE_SIZE << 16) >> 2; // 1/4 of total, i.e. 90 degrees out of phase; 15456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 15556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //init chorus delay position 15656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //right now chorus delay is a compile-time value, as is sample rate 15756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData->chorusTapPosition = (EAS_I16)((CHORUS_DELAY_MS * _OUTPUT_SAMPLE_RATE)/1000); 15856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 15956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //now copy from the new preset into Chorus 16056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pPreset = &pChorusData->m_sPreset.m_sPreset[pChorusData->m_nNextChorus]; 16156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 16256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData->m_nLevel = pPreset->m_nLevel; 16356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData->m_nRate = pPreset->m_nRate; 16456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData->m_nDepth = pPreset->m_nDepth; 16556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 16656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData->m_nRate = (EAS_I16) 16756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks ((((EAS_I32)CHORUS_SHAPE_SIZE<<16)/(20*(EAS_I32)_OUTPUT_SAMPLE_RATE)) * pChorusData->m_nRate); 16856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 16956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{704} use shift for performance */ 17056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData->m_nDepth = (EAS_I16) 17156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks (((((EAS_I32)pChorusData->m_nDepth * _OUTPUT_SAMPLE_RATE)>>5) * 105) >> 16); 17256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 17356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pInstData = pChorusData; 17456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 17556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 17656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} /* end ChorusInit */ 17756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 17856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 17956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * WeightedTap() 18056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 18156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: Does fractional array look-up using linear interpolation 18256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 18356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * first convert indexDesired to actual desired index by taking into account indexReference 18456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * then do linear interpolation between two actual samples using fractional part 18556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 18656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 18756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * array: pointer to array of signed 16 bit values, typically either PCM data or control data 18856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * indexReference: the circular buffer relative offset 18956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * indexDesired: the fractional index we are looking up (16 bits index + 16 bits fraction) 19056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * indexLimit: the total size of the array, used to compute buffer wrap 19156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 19256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs: 19356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Value from the input array, linearly interpolated between two actual data values 19456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 19556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 19656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 19756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_I16 WeightedTap(const EAS_I16 *array, EAS_I16 indexReference, EAS_I32 indexDesired, EAS_I16 indexLimit) 19856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 19956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I16 index; 20056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I16 fraction; 20156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I16 val1; 20256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I16 val2; 20356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 20456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //separate indexDesired into whole and fractional parts 20556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{704} use shift for performance */ 20656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks index = (EAS_I16)(indexDesired >> 16); 20756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{704} use shift for performance */ 20856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks fraction = (EAS_I16)((indexDesired>>1) & 0x07FFF); //just use 15 bits of fractional part 20956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 21056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //adjust whole part by indexReference 21156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks index = indexReference - index; 21256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //make sure we stay within array bounds, this implements circular buffer 21356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks while (index < 0) 21456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 21556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks index += indexLimit; 21656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 21756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 21856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //get two adjacent values from the array 21956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks val1 = array[index]; 22056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 22156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //handle special case when index == 0, else typical case 22256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (index == 0) 22356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 22456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks val2 = array[indexLimit-1]; //get last value from array 22556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 22656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else 22756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 22856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks val2 = array[index-1]; //get previous value from array 22956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 23056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 23156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //compute linear interpolation as (val1 + ((val2-val1)*fraction)) 23256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return(val1 + (EAS_I16)MULT_EG1_EG1(val2-val1,fraction)); 23356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 23456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 23556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 23656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * ChorusProcess() 23756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 23856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: compute the chorus on the input buffer, and mix into output buffer 23956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 24056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 24156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 24256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * src: pointer to input buffer of PCM values to be processed 24356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * dst: pointer to output buffer of PCM values we are to sume the result with 24456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * bufSize: the number of sample frames (i.e. stereo samples) in the buffer 24556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 24656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs: 24756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * None 24856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 24956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 25056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 25156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks//compute the chorus, and mix into output buffer 25256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic void ChorusProcess (EAS_VOID_PTR pInstData, EAS_PCM *pSrc, EAS_PCM *pDst, EAS_I32 numSamples) 25356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 25456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 ix; 25556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 nChannelNumber; 25656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I16 lfoValueLeft; 25756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I16 lfoValueRight; 25856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 positionOffsetL; 25956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 positionOffsetR; 26056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_PCM tapL; 26156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_PCM tapR; 26256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 tempValue; 26356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_PCM nInputSample; 26456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 nOutputSample; 26556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_PCM *pIn; 26656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_PCM *pOut; 26756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 26856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks S_CHORUS_OBJECT *pChorusData; 26956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 27056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData = (S_CHORUS_OBJECT*) pInstData; 27156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 27256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //if the chorus is disabled or turned all the way down 27356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pChorusData->bypass == EAS_TRUE || pChorusData->m_nLevel == 0) 27456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 27556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pSrc != pDst) 27656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_HWMemCpy(pSrc, pDst, numSamples * NUM_OUTPUT_CHANNELS * (EAS_I32) sizeof(EAS_PCM)); 27756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return; 27856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 27956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 28056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pChorusData->m_nNextChorus != pChorusData->m_nCurrentChorus) 28156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 28256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks ChorusUpdate(pChorusData); 28356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 28456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 28556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for (nChannelNumber = 0; nChannelNumber < NUM_OUTPUT_CHANNELS; nChannelNumber++) 28656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 28756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 28856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pIn = pSrc + nChannelNumber; 28956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pOut = pDst + nChannelNumber; 29056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 29156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if(nChannelNumber==0) 29256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 29356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for (ix = 0; ix < numSamples; ix++) 29456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 29556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks nInputSample = *pIn; 29656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pIn += NUM_OUTPUT_CHANNELS; 29756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 29856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //feed input into chorus delay line 29956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData->chorusDelayL[pChorusData->chorusIndexL] = nInputSample; 30056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 30156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //compute chorus lfo value using phase as fractional index into chorus shape table 30256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //resulting value is between -1.0 and 1.0, expressed as signed 16 bit number 30356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks lfoValueLeft = WeightedTap(EAS_chorusShape, 0, pChorusData->lfoLPhase, CHORUS_SHAPE_SIZE); 30456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 30556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //scale chorus depth by lfo value to get relative fractional sample index 30656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //index is expressed as 32 bit number with 16 bit fractional part 30756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{703} use shift for performance */ 30856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks positionOffsetL = pChorusData->m_nDepth * (((EAS_I32)lfoValueLeft) << 1); 30956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 31056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //add fixed chorus delay to get actual fractional sample index 31156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks positionOffsetL += ((EAS_I32)pChorusData->chorusTapPosition) << 16; 31256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 31356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //get tap value from chorus delay using fractional sample index 31456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks tapL = WeightedTap(pChorusData->chorusDelayL, pChorusData->chorusIndexL, positionOffsetL, CHORUS_L_SIZE); 31556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 31656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //scale by chorus level, then sum with input buffer contents and saturate 31756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks tempValue = MULT_EG1_EG1(tapL, pChorusData->m_nLevel); 31856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks nOutputSample = SATURATE(tempValue + nInputSample); 31956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 32056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pOut = (EAS_I16)SATURATE(nOutputSample); 32156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pOut += NUM_OUTPUT_CHANNELS; 32256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 32356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 32456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //increment chorus delay index and make it wrap as needed 32556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //this implements circular buffer 32656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((pChorusData->chorusIndexL+=1) >= CHORUS_L_SIZE) 32756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData->chorusIndexL = 0; 32856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 32956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //increment fractional lfo phase, and make it wrap as needed 33056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData->lfoLPhase += pChorusData->m_nRate; 33156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks while (pChorusData->lfoLPhase >= (CHORUS_SHAPE_SIZE<<16)) 33256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 33356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData->lfoLPhase -= (CHORUS_SHAPE_SIZE<<16); 33456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 33556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 33656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 33756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else 33856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 33956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for (ix = 0; ix < numSamples; ix++) 34056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 34156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks nInputSample = *pIn; 34256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pIn += NUM_OUTPUT_CHANNELS; 34356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 34456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //feed input into chorus delay line 34556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData->chorusDelayR[pChorusData->chorusIndexR] = nInputSample; 34656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 34756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //compute chorus lfo value using phase as fractional index into chorus shape table 34856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //resulting value is between -1.0 and 1.0, expressed as signed 16 bit number 34956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks lfoValueRight = WeightedTap(EAS_chorusShape, 0, pChorusData->lfoRPhase, CHORUS_SHAPE_SIZE); 35056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 35156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //scale chorus depth by lfo value to get relative fractional sample index 35256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //index is expressed as 32 bit number with 16 bit fractional part 35356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{703} use shift for performance */ 35456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks positionOffsetR = pChorusData->m_nDepth * (((EAS_I32)lfoValueRight) << 1); 35556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 35656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //add fixed chorus delay to get actual fractional sample index 35756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks positionOffsetR += ((EAS_I32)pChorusData->chorusTapPosition) << 16; 35856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 35956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //get tap value from chorus delay using fractional sample index 36056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks tapR = WeightedTap(pChorusData->chorusDelayR, pChorusData->chorusIndexR, positionOffsetR, CHORUS_R_SIZE); 36156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 36256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //scale by chorus level, then sum with output buffer contents and saturate 36356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks tempValue = MULT_EG1_EG1(tapR, pChorusData->m_nLevel); 36456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks nOutputSample = SATURATE(tempValue + nInputSample); 36556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 36656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pOut = (EAS_I16)SATURATE(nOutputSample); 36756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pOut += NUM_OUTPUT_CHANNELS; 36856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 36956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //increment chorus delay index and make it wrap as needed 37056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //this implements circular buffer 37156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if ((pChorusData->chorusIndexR+=1) >= CHORUS_R_SIZE) 37256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData->chorusIndexR = 0; 37356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 37456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //increment fractional lfo phase, and make it wrap as needed 37556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData->lfoRPhase += pChorusData->m_nRate; 37656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks while (pChorusData->lfoRPhase >= (CHORUS_SHAPE_SIZE<<16)) 37756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 37856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData->lfoRPhase -= (CHORUS_SHAPE_SIZE<<16); 37956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 38056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 38156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 38256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 38356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 38456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} /* end ChorusProcess */ 38556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 38656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 38756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 38856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 38956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * ChorusShutdown() 39056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 39156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 39256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Initializes the Chorus effect. 39356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 39456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 39556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pInstData - handle to instance data 39656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 39756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs: 39856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 39956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 40056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects: 40156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 40256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 40356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 40456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT ChorusShutdown (EAS_DATA_HANDLE pEASData, EAS_VOID_PTR pInstData) 40556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 40656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check Configuration Module for static memory allocation */ 40756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (!pEASData->staticMemoryModel) 40856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_HWFree(pEASData->hwInstData, pInstData); 40956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 41056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} /* end ChorusShutdown */ 41156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 41256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 41356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * ChorusGetParam() 41456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 41556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 41656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Get a Chorus parameter 41756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 41856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 41956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pInstData - handle to instance data 42056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * param - parameter index 42156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * *pValue - pointer to variable to hold retrieved value 42256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 42356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs: 42456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 42556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 42656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects: 42756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 42856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 42956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 43056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT ChorusGetParam (EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 *pValue) 43156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 43256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks S_CHORUS_OBJECT *p; 43356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 43456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks p = (S_CHORUS_OBJECT*) pInstData; 43556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 43656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks switch (param) 43756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 43856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case EAS_PARAM_CHORUS_BYPASS: 43956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pValue = (EAS_I32) p->bypass; 44056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 44156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case EAS_PARAM_CHORUS_PRESET: 44256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pValue = (EAS_I8) p->m_nCurrentChorus; 44356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 44456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case EAS_PARAM_CHORUS_RATE: 44556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pValue = (EAS_I32) p->m_nRate; 44656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 44756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case EAS_PARAM_CHORUS_DEPTH: 44856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pValue = (EAS_I32) p->m_nDepth; 44956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 45056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case EAS_PARAM_CHORUS_LEVEL: 45156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pValue = (EAS_I32) p->m_nLevel; 45256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 45356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks default: 45456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_INVALID_PARAMETER; 45556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 45656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 45756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} /* end ChorusGetParam */ 45856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 45956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 46056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 46156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * ChorusSetParam() 46256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 46356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 46456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Set a Chorus parameter 46556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 46656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 46756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pInstData - handle to instance data 46856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * param - parameter index 46956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * *pValue - new paramter value 47056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 47156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs: 47256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 47356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 47456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects: 47556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 47656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 47756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 47856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT ChorusSetParam (EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 value) 47956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 48056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks S_CHORUS_OBJECT *p; 48156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 48256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks p = (S_CHORUS_OBJECT*) pInstData; 48356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 48456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks switch (param) 48556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 48656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case EAS_PARAM_CHORUS_BYPASS: 48756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks p->bypass = (EAS_BOOL) value; 48856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 48956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case EAS_PARAM_CHORUS_PRESET: 49056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if(value!=EAS_PARAM_CHORUS_PRESET1 && value!=EAS_PARAM_CHORUS_PRESET2 && 49156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks value!=EAS_PARAM_CHORUS_PRESET3 && value!=EAS_PARAM_CHORUS_PRESET4) 49256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_INVALID_PARAMETER; 49356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks p->m_nNextChorus = (EAS_I8)value; 49456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 49556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case EAS_PARAM_CHORUS_RATE: 49656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if(value<EAS_CHORUS_RATE_MIN || value>EAS_CHORUS_RATE_MAX) 49756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_INVALID_PARAMETER; 49856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks p->m_nRate = (EAS_I16) value; 49956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 50056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case EAS_PARAM_CHORUS_DEPTH: 50156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if(value<EAS_CHORUS_DEPTH_MIN || value>EAS_CHORUS_DEPTH_MAX) 50256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_INVALID_PARAMETER; 50356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks p->m_nDepth = (EAS_I16) value; 50456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 50556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks case EAS_PARAM_CHORUS_LEVEL: 50656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if(value<EAS_CHORUS_LEVEL_MIN || value>EAS_CHORUS_LEVEL_MAX) 50756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_INVALID_PARAMETER; 50856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks p->m_nLevel = (EAS_I16) value; 50956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks break; 51056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 51156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks default: 51256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_ERROR_INVALID_PARAMETER; 51356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 51456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 51556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} /* end ChorusSetParam */ 51656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 51756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 51856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 51956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * ChorusReadInPresets() 52056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 52156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: sets global Chorus preset bank to defaults 52256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 52356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 52456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 52556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs: 52656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 52756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 52856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 52956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT ChorusReadInPresets(S_CHORUS_OBJECT *pChorusData) 53056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 53156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 53256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks int preset = 0; 53356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks int defaultPreset = 0; 53456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 53556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks //now init any remaining presets to defaults 53656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks for (defaultPreset = preset; defaultPreset < CHORUS_MAX_TYPE; defaultPreset++) 53756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 53856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks S_CHORUS_PRESET *pPreset = &pChorusData->m_sPreset.m_sPreset[defaultPreset]; 53956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (defaultPreset == 0 || defaultPreset > CHORUS_MAX_TYPE-1) 54056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 54156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pPreset->m_nDepth = 39; 54256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pPreset->m_nRate = 30; 54356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pPreset->m_nLevel = 32767; 54456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 54556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else if (defaultPreset == 1) 54656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 54756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pPreset->m_nDepth = 21; 54856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pPreset->m_nRate = 45; 54956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pPreset->m_nLevel = 25000; 55056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 55156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else if (defaultPreset == 2) 55256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 55356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pPreset->m_nDepth = 53; 55456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pPreset->m_nRate = 25; 55556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pPreset->m_nLevel = 32000; 55656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 55756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else if (defaultPreset == 3) 55856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 55956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pPreset->m_nDepth = 32; 56056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pPreset->m_nRate = 37; 56156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pPreset->m_nLevel = 29000; 56256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 56356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 56456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 56556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 56656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 56756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 56856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 56956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*---------------------------------------------------------------------------- 57056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * ChorusUpdate 57156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 57256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 57356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Update the Chorus preset parameters as required 57456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 57556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 57656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 57756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs: 57856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 57956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 58056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects: 58156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * - chorus paramters will be changed 58256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * - m_nCurrentRoom := m_nNextRoom 58356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *---------------------------------------------------------------------------- 58456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/ 58556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT ChorusUpdate(S_CHORUS_OBJECT *pChorusData) 58656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{ 58756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks S_CHORUS_PRESET *pPreset = &pChorusData->m_sPreset.m_sPreset[pChorusData->m_nNextChorus]; 58856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 58956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData->m_nLevel = pPreset->m_nLevel; 59056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData->m_nRate = pPreset->m_nRate; 59156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData->m_nDepth = pPreset->m_nDepth; 59256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 59356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData->m_nRate = (EAS_I16) 59456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks ((((EAS_I32)CHORUS_SHAPE_SIZE<<16)/(20*(EAS_I32)_OUTPUT_SAMPLE_RATE)) * pChorusData->m_nRate); 59556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 59656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{704} use shift for performance */ 59756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData->m_nDepth = (EAS_I16) 59856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks (((((EAS_I32)pChorusData->m_nDepth * _OUTPUT_SAMPLE_RATE)>>5) * 105) >> 16); 59956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 60056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pChorusData->m_nCurrentChorus = pChorusData->m_nNextChorus; 60156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 60256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks return EAS_SUCCESS; 60356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 60456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} /* end ChorusUpdate */ 605