/*---------------------------------------------------------------------------- * * File: * eas_chorusdata.h * * Contents and purpose: * Contains the prototypes for the Chorus 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: 309 $ * $Date: 2006-09-12 18:52:45 -0700 (Tue, 12 Sep 2006) $ *---------------------------------------------------------------------------- */ #ifndef _EAS_CHORUS_H #define _EAS_CHORUS_H #include "eas_types.h" #include "eas_audioconst.h" //defines for chorus #define EAS_CHORUS_BYPASS_DEFAULT 1 #define EAS_CHORUS_PRESET_DEFAULT 0 #define EAS_CHORUS_RATE_DEFAULT 30 #define EAS_CHORUS_DEPTH_DEFAULT 39 #define EAS_CHORUS_LEVEL_DEFAULT 32767 #define EAS_CHORUS_LEVEL_MIN 0 #define EAS_CHORUS_LEVEL_MAX 32767 #define EAS_CHORUS_RATE_MIN 10 #define EAS_CHORUS_RATE_MAX 50 #define EAS_CHORUS_DEPTH_MIN 15 #define EAS_CHORUS_DEPTH_MAX 60 #define CHORUS_SIZE_MS 20 #define CHORUS_L_SIZE ((CHORUS_SIZE_MS*_OUTPUT_SAMPLE_RATE)/1000) #define CHORUS_R_SIZE CHORUS_L_SIZE #define CHORUS_SHAPE_SIZE 128 #define CHORUS_DELAY_MS 10 #define CHORUS_MAX_TYPE 4 // any Chorus numbers larger than this are invalid typedef struct { EAS_I16 m_nRate; EAS_I16 m_nDepth; EAS_I16 m_nLevel; } S_CHORUS_PRESET; typedef struct { S_CHORUS_PRESET m_sPreset[CHORUS_MAX_TYPE]; //array of presets } S_CHORUS_PRESET_BANK; /* parameters for each Chorus */ typedef struct { EAS_I32 lfoLPhase; EAS_I32 lfoRPhase; EAS_I16 chorusIndexL; EAS_I16 chorusIndexR; EAS_U16 chorusTapPosition; EAS_I16 m_nRate; EAS_I16 m_nDepth; EAS_I16 m_nLevel; //delay lines used by the chorus, longer would sound better EAS_PCM chorusDelayL[CHORUS_L_SIZE]; EAS_PCM chorusDelayR[CHORUS_R_SIZE]; EAS_BOOL bypass; EAS_I8 preset; EAS_I16 m_nCurrentChorus; // preset number for current Chorus EAS_I16 m_nNextChorus; // preset number for next Chorus S_CHORUS_PRESET pPreset; S_CHORUS_PRESET_BANK m_sPreset; } S_CHORUS_OBJECT; /*---------------------------------------------------------------------------- * WeightedTap() *---------------------------------------------------------------------------- * Purpose: Does fractional array look-up using linear interpolation * * first convert indexDesired to actual desired index by taking into account indexReference * then do linear interpolation between two actual samples using fractional part * * Inputs: * array: pointer to array of signed 16 bit values, typically either PCM data or control data * indexReference: the circular buffer relative offset * indexDesired: the fractional index we are looking up (16 bits index + 16 bits fraction) * indexLimit: the total size of the array, used to compute buffer wrap * * Outputs: * Value from the input array, linearly interpolated between two actual data values * *---------------------------------------------------------------------------- */ static EAS_I16 WeightedTap(const EAS_I16 *array, EAS_I16 indexReference, EAS_I32 indexDesired, EAS_I16 indexLimit); /*---------------------------------------------------------------------------- * ChorusReadInPresets() *---------------------------------------------------------------------------- * Purpose: sets global Chorus preset bank to defaults * * Inputs: * * Outputs: * *---------------------------------------------------------------------------- */ static EAS_RESULT ChorusReadInPresets(S_CHORUS_OBJECT *pChorusData); /*---------------------------------------------------------------------------- * ChorusUpdate *---------------------------------------------------------------------------- * Purpose: * Update the Chorus preset parameters as required * * Inputs: * * Outputs: * * * Side Effects: * - chorus paramters will be changed * - m_nCurrentChorus := m_nNextChorus *---------------------------------------------------------------------------- */ static EAS_RESULT ChorusUpdate(S_CHORUS_OBJECT* pChorusData); #endif /* #ifndef _EAS_CHORUSDATA_H */