summaryrefslogtreecommitdiffstats
path: root/arm-wt-22k/lib_src/eas_mdls.h
blob: f7dbf2f4fcc58a3ffa5d4437649051a272b81a2e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
/*----------------------------------------------------------------------------
 *
 * File: 
 * eas_mdls.h
 *
 * Contents and purpose:
 * Declarations, interfaces, and prototypes for eas_mdls.c
 *			
 * Copyright Sonic Network Inc. 2004

 * 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.
 *
 *----------------------------------------------------------------------------
*/

#ifndef _EAS_MDLS_H
#define _EAS_MDLS_H

/*------------------------------------
 * includes
 *------------------------------------
*/
#include "eas_data.h"


/*------------------------------------
 * Some defines for dls.h
 *------------------------------------
*/
#ifndef DWORD
#define DWORD EAS_I32
#define FAR
#define SHORT EAS_I16
#define USHORT EAS_U16
#define LONG EAS_I32
#define ULONG EAS_U32
#endif


/* GUID struct (call it DLSID in case GUID is defined elsewhere) */
typedef struct
{
    EAS_U32	Data1;
    EAS_U16	Data2;
    EAS_U16	Data3;
    EAS_U8	Data4[8];
} DLSID;

#define DEFINE_DLSID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) const DLSID name = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }

/*------------------------------------
 * defines
 *------------------------------------
*/

/* maximum sample memory for DLS query support */
#ifndef MAX_DLS_MEMORY
#define MAX_DLS_MEMORY 65536
#endif

/* size of conditional chunk stack */
#ifndef CDL_STACK_SIZE
#define CDL_STACK_SIZE 8
#endif

/* size of read buffer for sample conversion */
#ifndef SAMPLE_CONVERT_CHUNK_SIZE
#define SAMPLE_CONVERT_CHUNK_SIZE 32
#endif


#define	ZERO_TIME_IN_CENTS				-32768

/* Pan calculation macros */
#define PAN_CONVERSION_FACTOR		4129
#define MAX_PAN_VALUE				63
#define MIN_PAN_VALUE				-63

/* multiplier to convert time cents to 10-bit fraction log for EAS_LogToLinear16 */
#define TIME_CENTS_TO_LOG2			27962

/* conversion factor sustain level from percent to exponent for LogToLinear16 */
#define SUSTAIN_LOG_CONVERSION_FACTOR	536871
#define SUSTAIN_LOG_CONVERSION_SHIFT	15

/* conversion factor sustain level from percent to EG full scale */
#define SUSTAIN_LINEAR_CONVERSION_FACTOR	1073709

/* conversion factor to convert frame period to decay rate */
#define DECAY_CONVERSION_FACTOR		-16

/*----------------------------------------------------------------------------
 * These macros define the various characteristics of the defined sample rates
 *----------------------------------------------------------------------------
 * DLS_ATTACK_TIME_CONVERT		log offset for conversion from time cents to attack rate
 * DLS_LFO_FREQUENCY_CONVERT	pitch-cents offset for LFO frequency conversion
 *----------------------------------------------------------------------------
*/

#if	defined (_SAMPLE_RATE_8000)
#define DLS_RATE_CONVERT				-9559
#define DLS_LFO_FREQUENCY_CONVERT		5921

#elif defined (_SAMPLE_RATE_16000)
#define DLS_RATE_CONVERT				-9559
#define DLS_LFO_FREQUENCY_CONVERT		5921

#elif defined (_SAMPLE_RATE_20000)
#define DLS_RATE_CONVERT				-8745
#define DLS_LFO_FREQUENCY_CONVERT		5108

#elif defined (_SAMPLE_RATE_22050)
#define DLS_RATE_CONVERT				-8914
#define DLS_LFO_FREQUENCY_CONVERT		5277

#elif defined (_SAMPLE_RATE_24000)
#define DLS_RATE_CONVERT				-9061
#define DLS_LFO_FREQUENCY_CONVERT		5423

#elif defined (_SAMPLE_RATE_32000)
#define DLS_RATE_CONVERT				-9559
#define DLS_LFO_FREQUENCY_CONVERT		5921

#elif defined (_SAMPLE_RATE_44100)
#define DLS_RATE_CONVERT				-8914
#define DLS_LFO_FREQUENCY_CONVERT		5277

#elif defined (_SAMPLE_RATE_48000)
#define DLS_RATE_CONVERT				-9061
#define DLS_LFO_FREQUENCY_CONVERT		5423

#else
#error "_SAMPLE_RATE_XXXXX must be defined to valid rate"
#endif

/*
 * FILTER_Q_CONVERSION_FACTOR convers the 0.1dB steps in the DLS
 * file to our internal 0.75 dB steps. The value is calculated
 * as follows:
 *
 * 32768 / (10 * <step-size in dB>)
 *
 * FILTER_RESONANCE_NUM_ENTRIES is the number of entries in the table
*/
#define FILTER_Q_CONVERSION_FACTOR			4369
#define FILTER_RESONANCE_NUM_ENTRIES		31

/* 
 * Multiplier to convert DLS gain units (10ths of a dB) to a
 * power-of-two exponent for conversion to linear gain using our
 * piece-wise linear approximator. Note that we ignore the lower
 * 16-bits of the DLS gain value. The result is a 10-bit fraction
 * that works with the EAS_LogToLinear16 function.
 *
 * DLS_GAIN_FACTOR = (2^18) / (200 * log10(2))
 */
#define DLS_GAIN_FACTOR			4354
#define DLS_GAIN_SHIFT			8

/* 
 * Reciprocal of 10 for quick divide by 10's
 *
 * DLS_GAIN_FACTOR = (2^18) / (200 * log10(2))
 */
#define DLS_DIV_10_FACTOR		3277
#define DLS_DIV_10_SHIFT		16

/* 
 * Multiplier to convert DLS time cents units to a power-of-two
 * exponent for conversion to absolute time units using our
 * piece-wise linear approximator.
 *
 * DLS_TIME_FACTOR = (2^22) / 1200
 */
#define DLS_TIME_FACTOR			3495
#define DLS_TIME_SHIFT			22


/* LFO limits */
#define	MAX_LFO_FREQUENCY_IN_HERTZ			20
#define	MIN_LFO_FREQUENCY_IN_HERTZ			0.1
#define MAX_LFO_FREQUENCY_IN_PITCHCENTS		1549
#define MIN_LFO_FREQUENCY_IN_PITCHCENTS		-7624
#define MAX_LFO_AMPLITUDE_DEPTH				12	/* in dB, DLS2.1 p 31*/
#define MIN_LFO_AMPLITUDE_DEPTH				-12	/* in dB, DLS2.1 p 31*/

/* add to pitch cents before pow(2.0, n) to convert to frequency */
#define ABSOLUTE_PITCH_BIAS					238395828

#define	A5_PITCH_OFFSET						6900

/*
CHUNK_TYPE is a macro that converts the 4 input args into a 32-bit int
where 
argument a is placed at the MSB location and 
argument d is placed at the LSB location.
This is useful for determining the DLS chunk types
*/
#define	CHUNK_TYPE(a,b,c,d)	(	\
		( ((EAS_U32)(a) & 0xFF) << 24 ) \
	+	( ((EAS_U32)(b) & 0xFF) << 16 ) \
	+	( ((EAS_U32)(c) & 0xFF) <<  8 ) \
	+	( ((EAS_U32)(d) & 0xFF)       ) )

#define	CHUNK_RIFF					CHUNK_TYPE('R','I','F','F')
#define	CHUNK_DLS					CHUNK_TYPE('D','L','S',' ')
#define	CHUNK_CDL					CHUNK_TYPE('c','d','l',' ')
#define	CHUNK_VERS					CHUNK_TYPE('v','e','r','s')
#define	CHUNK_DLID					CHUNK_TYPE('d','l','i','d')
#define	CHUNK_LIST					CHUNK_TYPE('L','I','S','T')
#define	CHUNK_COLH					CHUNK_TYPE('c','o','l','h')
#define	CHUNK_LINS					CHUNK_TYPE('l','i','n','s')
#define	CHUNK_PTBL					CHUNK_TYPE('p','t','b','l')
#define	CHUNK_WVPL					CHUNK_TYPE('w','v','p','l')
#define	CHUNK_INFO					CHUNK_TYPE('I','N','F','O')
#define	CHUNK_INAM					CHUNK_TYPE('I','N','A','M')
#define	CHUNK_INS					CHUNK_TYPE('i','n','s',' ')
#define	CHUNK_INSH					CHUNK_TYPE('i','n','s','h')
#define	CHUNK_LRGN					CHUNK_TYPE('l','r','g','n')
#define	CHUNK_RGN 					CHUNK_TYPE('r','g','n',' ')
#define	CHUNK_RGN2					CHUNK_TYPE('r','g','n','2')
#define	CHUNK_RGNH					CHUNK_TYPE('r','g','n','h')
#define	CHUNK_WSMP					CHUNK_TYPE('w','s','m','p')
#define	CHUNK_WLNK					CHUNK_TYPE('w','l','n','k')
#define	CHUNK_LART					CHUNK_TYPE('l','a','r','t')
#define	CHUNK_LAR2					CHUNK_TYPE('l','a','r','2')
#define	CHUNK_ART1					CHUNK_TYPE('a','r','t','1')
#define	CHUNK_ART2					CHUNK_TYPE('a','r','t','2')
#define	CHUNK_WAVE					CHUNK_TYPE('w','a','v','e')
#define	CHUNK_FMT 					CHUNK_TYPE('f','m','t',' ')
#define	CHUNK_DATA					CHUNK_TYPE('d','a','t','a')
#define	CHUNK_DMPR					CHUNK_TYPE('d','m','p','r')


#define	WAVE_FORMAT_PCM				0x0001 /* Microsoft PCM format, see DLS2.1 p60 */
#define	WAVE_FORMAT_EXTENSIBLE		0xffff

/* defines for wave table structures */

/* initialize each articulation structure to a harmless state */
/* change art values after we've determined EAS internals */
#define DEFAULT_DLS_FILTER_CUTOFF_FREQUENCY		0x7FFF		/* DLS2.1, p 31 means leave filter off */

/**********/

/* define the waves that we expect to generate instead of store */
/* NOTE: our comparison routine converts the input string
to lowercase, so the following comparison values should all
be in lowercase.
*/
#define	STRING_NOISE			"noise"


/*------------------------------------
 * type definitions
 *------------------------------------
*/
#ifdef _STANDALONE_CONVERTER
typedef struct s_dls_params
{
	EAS_INT		sampleRate;
	EAS_INT		samplesPerFrame;
	EAS_INT		bitDepth;
	double		ditherLevel;
	double		ditherFilterCoeff;
	EAS_BOOL	compatibility;
	EAS_BOOL	encodeADPCM;
} S_DLS_PARAMS;
#endif


/* function prototypes */
EAS_RESULT DLSParser (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE fileHandle, EAS_I32 offset, S_DLS **pDLS);
EAS_RESULT DLSCleanup (EAS_HW_DATA_HANDLE hwInstData, S_DLS *pDLS);
void DLSAddRef (S_DLS *pDLS);
EAS_I16 ConvertDelay (EAS_I32 timeCents);
EAS_I16 ConvertRate (EAS_I32 timeCents);


#ifdef _STANDALONE_CONVERTER
void DLSConvParams (S_DLS_PARAMS *pParams, EAS_BOOL set);
#endif

#endif