eas_chorusdata.h revision a8c89077d78769bf4840fa91609edc51fe2fa02d
1/*----------------------------------------------------------------------------
2 *
3 * File:
4 * eas_chorusdata.h
5 *
6 * Contents and purpose:
7 * Contains the prototypes for the Chorus effect.
8 *
9 *
10 * Copyright Sonic Network Inc. 2006
11
12 * Licensed under the Apache License, Version 2.0 (the "License");
13 * you may not use this file except in compliance with the License.
14 * You may obtain a copy of the License at
15 *
16 *      http://www.apache.org/licenses/LICENSE-2.0
17 *
18 * Unless required by applicable law or agreed to in writing, software
19 * distributed under the License is distributed on an "AS IS" BASIS,
20 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21 * See the License for the specific language governing permissions and
22 * limitations under the License.
23 *
24 *----------------------------------------------------------------------------
25 * Revision Control:
26 *   $Revision: 309 $
27 *   $Date: 2006-09-12 18:52:45 -0700 (Tue, 12 Sep 2006) $
28 *----------------------------------------------------------------------------
29*/
30
31#ifndef _EAS_CHORUS_H
32#define _EAS_CHORUS_H
33
34#include "eas_types.h"
35#include "eas_audioconst.h"
36
37//defines for chorus
38
39#define EAS_CHORUS_BYPASS_DEFAULT   1
40#define EAS_CHORUS_PRESET_DEFAULT   0
41#define EAS_CHORUS_RATE_DEFAULT     30
42#define EAS_CHORUS_DEPTH_DEFAULT    39
43#define EAS_CHORUS_LEVEL_DEFAULT    32767
44
45#define EAS_CHORUS_LEVEL_MIN        0
46#define EAS_CHORUS_LEVEL_MAX        32767
47
48#define EAS_CHORUS_RATE_MIN         10
49#define EAS_CHORUS_RATE_MAX         50
50
51#define EAS_CHORUS_DEPTH_MIN        15
52#define EAS_CHORUS_DEPTH_MAX        60
53
54#define CHORUS_SIZE_MS 20
55#define CHORUS_L_SIZE ((CHORUS_SIZE_MS*_OUTPUT_SAMPLE_RATE)/1000)
56#define CHORUS_R_SIZE CHORUS_L_SIZE
57#define CHORUS_SHAPE_SIZE 128
58#define CHORUS_DELAY_MS 10
59
60#define CHORUS_MAX_TYPE         4   // any Chorus numbers larger than this are invalid
61
62typedef struct
63{
64    EAS_I16             m_nRate;
65    EAS_I16             m_nDepth;
66    EAS_I16             m_nLevel;
67
68} S_CHORUS_PRESET;
69
70typedef struct
71{
72    S_CHORUS_PRESET     m_sPreset[CHORUS_MAX_TYPE]; //array of presets
73
74} S_CHORUS_PRESET_BANK;
75
76/* parameters for each Chorus */
77typedef struct
78{
79    EAS_I32 lfoLPhase;
80    EAS_I32 lfoRPhase;
81    EAS_I16 chorusIndexL;
82    EAS_I16 chorusIndexR;
83    EAS_U16 chorusTapPosition;
84
85    EAS_I16 m_nRate;
86    EAS_I16 m_nDepth;
87    EAS_I16 m_nLevel;
88
89    //delay lines used by the chorus, longer would sound better
90    EAS_PCM chorusDelayL[CHORUS_L_SIZE];
91    EAS_PCM chorusDelayR[CHORUS_R_SIZE];
92
93    EAS_BOOL    bypass;
94    EAS_I8      preset;
95
96    EAS_I16     m_nCurrentChorus;           // preset number for current Chorus
97    EAS_I16     m_nNextChorus;              // preset number for next Chorus
98
99    S_CHORUS_PRESET         pPreset;
100
101    S_CHORUS_PRESET_BANK    m_sPreset;
102
103} S_CHORUS_OBJECT;
104
105
106/*----------------------------------------------------------------------------
107 * WeightedTap()
108 *----------------------------------------------------------------------------
109 * Purpose: Does fractional array look-up using linear interpolation
110 *
111 * first convert indexDesired to actual desired index by taking into account indexReference
112 * then do linear interpolation between two actual samples using fractional part
113 *
114 * Inputs:
115 * array: pointer to array of signed 16 bit values, typically either PCM data or control data
116 * indexReference: the circular buffer relative offset
117 * indexDesired: the fractional index we are looking up (16 bits index + 16 bits fraction)
118 * indexLimit: the total size of the array, used to compute buffer wrap
119 *
120 * Outputs:
121 * Value from the input array, linearly interpolated between two actual data values
122 *
123 *----------------------------------------------------------------------------
124*/
125static EAS_I16 WeightedTap(const EAS_I16 *array, EAS_I16 indexReference, EAS_I32 indexDesired, EAS_I16 indexLimit);
126
127/*----------------------------------------------------------------------------
128 * ChorusReadInPresets()
129 *----------------------------------------------------------------------------
130 * Purpose: sets global Chorus preset bank to defaults
131 *
132 * Inputs:
133 *
134 * Outputs:
135 *
136 *----------------------------------------------------------------------------
137*/
138static EAS_RESULT ChorusReadInPresets(S_CHORUS_OBJECT *pChorusData);
139
140/*----------------------------------------------------------------------------
141 * ChorusUpdate
142 *----------------------------------------------------------------------------
143 * Purpose:
144 * Update the Chorus preset parameters as required
145 *
146 * Inputs:
147 *
148 * Outputs:
149 *
150 *
151 * Side Effects:
152 * - chorus paramters will be changed
153 * - m_nCurrentChorus := m_nNextChorus
154 *----------------------------------------------------------------------------
155*/
156static EAS_RESULT ChorusUpdate(S_CHORUS_OBJECT* pChorusData);
157
158#endif /* #ifndef _EAS_CHORUSDATA_H */
159
160
161