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 
62 typedef struct
63 {
64     EAS_I16             m_nRate;
65     EAS_I16             m_nDepth;
66     EAS_I16             m_nLevel;
67 
68 } S_CHORUS_PRESET;
69 
70 typedef 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 */
77 typedef 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 */
125 static 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 */
138 static 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 */
156 static EAS_RESULT ChorusUpdate(S_CHORUS_OBJECT* pChorusData);
157 
158 #endif /* #ifndef _EAS_CHORUSDATA_H */
159 
160 
161