eas_mdls.h revision 7df30109963092559d3760c0661a020f9daf1030
1/*----------------------------------------------------------------------------
2 *
3 * File:
4 * eas_mdls.h
5 *
6 * Contents and purpose:
7 * Declarations, interfaces, and prototypes for eas_mdls.c
8 *
9 * Copyright Sonic Network Inc. 2004
10
11 * Licensed under the Apache License, Version 2.0 (the "License");
12 * you may not use this file except in compliance with the License.
13 * You may obtain a copy of the License at
14 *
15 *      http://www.apache.org/licenses/LICENSE-2.0
16 *
17 * Unless required by applicable law or agreed to in writing, software
18 * distributed under the License is distributed on an "AS IS" BASIS,
19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20 * See the License for the specific language governing permissions and
21 * limitations under the License.
22 *
23 *----------------------------------------------------------------------------
24*/
25
26#ifndef _EAS_MDLS_H
27#define _EAS_MDLS_H
28
29/*------------------------------------
30 * includes
31 *------------------------------------
32*/
33#include "eas_data.h"
34
35
36/*------------------------------------
37 * Some defines for dls.h
38 *------------------------------------
39*/
40#ifndef DWORD
41#define DWORD EAS_I32
42#define FAR
43#define SHORT EAS_I16
44#define USHORT EAS_U16
45#define LONG EAS_I32
46#define ULONG EAS_U32
47#endif
48
49
50/* GUID struct (call it DLSID in case GUID is defined elsewhere) */
51typedef struct
52{
53    EAS_U32	Data1;
54    EAS_U16	Data2;
55    EAS_U16	Data3;
56    EAS_U8	Data4[8];
57} DLSID;
58
59#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 } }
60
61/*------------------------------------
62 * defines
63 *------------------------------------
64*/
65
66/* maximum sample memory for DLS query support */
67#ifndef MAX_DLS_MEMORY
68#define MAX_DLS_MEMORY 65536
69#endif
70
71/* size of conditional chunk stack */
72#ifndef CDL_STACK_SIZE
73#define CDL_STACK_SIZE 8
74#endif
75
76/* size of read buffer for sample conversion */
77#ifndef SAMPLE_CONVERT_CHUNK_SIZE
78#define SAMPLE_CONVERT_CHUNK_SIZE 32
79#endif
80
81
82#define	ZERO_TIME_IN_CENTS				-32768
83
84/* Pan calculation macros */
85#define PAN_CONVERSION_FACTOR		4129
86#define MAX_PAN_VALUE				63
87#define MIN_PAN_VALUE				-63
88
89/* multiplier to convert time cents to 10-bit fraction log for EAS_LogToLinear16 */
90#define TIME_CENTS_TO_LOG2			27962
91
92/* conversion factor sustain level from percent to exponent for LogToLinear16 */
93#define SUSTAIN_LOG_CONVERSION_FACTOR	536871
94#define SUSTAIN_LOG_CONVERSION_SHIFT	15
95
96/* conversion factor sustain level from percent to EG full scale */
97#define SUSTAIN_LINEAR_CONVERSION_FACTOR	1073709
98
99/* conversion factor to convert frame period to decay rate */
100#define DECAY_CONVERSION_FACTOR		-16
101
102/*----------------------------------------------------------------------------
103 * These macros define the various characteristics of the defined sample rates
104 *----------------------------------------------------------------------------
105 * DLS_ATTACK_TIME_CONVERT		log offset for conversion from time cents to attack rate
106 * DLS_LFO_FREQUENCY_CONVERT	pitch-cents offset for LFO frequency conversion
107 *----------------------------------------------------------------------------
108*/
109
110#if	defined (_SAMPLE_RATE_8000)
111#define DLS_RATE_CONVERT				-9559
112#define DLS_LFO_FREQUENCY_CONVERT		5921
113
114#elif defined (_SAMPLE_RATE_16000)
115#define DLS_RATE_CONVERT				-9559
116#define DLS_LFO_FREQUENCY_CONVERT		5921
117
118#elif defined (_SAMPLE_RATE_20000)
119#define DLS_RATE_CONVERT				-8745
120#define DLS_LFO_FREQUENCY_CONVERT		5108
121
122#elif defined (_SAMPLE_RATE_22050)
123#define DLS_RATE_CONVERT				-8914
124#define DLS_LFO_FREQUENCY_CONVERT		5277
125
126#elif defined (_SAMPLE_RATE_24000)
127#define DLS_RATE_CONVERT				-9061
128#define DLS_LFO_FREQUENCY_CONVERT		5423
129
130#elif defined (_SAMPLE_RATE_32000)
131#define DLS_RATE_CONVERT				-9559
132#define DLS_LFO_FREQUENCY_CONVERT		5921
133
134#elif defined (_SAMPLE_RATE_44100)
135#define DLS_RATE_CONVERT				-8914
136#define DLS_LFO_FREQUENCY_CONVERT		5277
137
138#elif defined (_SAMPLE_RATE_48000)
139#define DLS_RATE_CONVERT				-9061
140#define DLS_LFO_FREQUENCY_CONVERT		5423
141
142#else
143#error "_SAMPLE_RATE_XXXXX must be defined to valid rate"
144#endif
145
146/*
147 * FILTER_Q_CONVERSION_FACTOR convers the 0.1dB steps in the DLS
148 * file to our internal 0.75 dB steps. The value is calculated
149 * as follows:
150 *
151 * 32768 / (10 * <step-size in dB>)
152 *
153 * FILTER_RESONANCE_NUM_ENTRIES is the number of entries in the table
154*/
155#define FILTER_Q_CONVERSION_FACTOR			4369
156#define FILTER_RESONANCE_NUM_ENTRIES		31
157
158/*
159 * Multiplier to convert DLS gain units (10ths of a dB) to a
160 * power-of-two exponent for conversion to linear gain using our
161 * piece-wise linear approximator. Note that we ignore the lower
162 * 16-bits of the DLS gain value. The result is a 10-bit fraction
163 * that works with the EAS_LogToLinear16 function.
164 *
165 * DLS_GAIN_FACTOR = (2^18) / (200 * log10(2))
166 */
167#define DLS_GAIN_FACTOR			4354
168#define DLS_GAIN_SHIFT			8
169
170/*
171 * Reciprocal of 10 for quick divide by 10's
172 *
173 * DLS_GAIN_FACTOR = (2^18) / (200 * log10(2))
174 */
175#define DLS_DIV_10_FACTOR		3277
176#define DLS_DIV_10_SHIFT		16
177
178/*
179 * Multiplier to convert DLS time cents units to a power-of-two
180 * exponent for conversion to absolute time units using our
181 * piece-wise linear approximator.
182 *
183 * DLS_TIME_FACTOR = (2^22) / 1200
184 */
185#define DLS_TIME_FACTOR			3495
186#define DLS_TIME_SHIFT			22
187
188
189/* LFO limits */
190#define	MAX_LFO_FREQUENCY_IN_HERTZ			20
191#define	MIN_LFO_FREQUENCY_IN_HERTZ			0.1
192#define MAX_LFO_FREQUENCY_IN_PITCHCENTS		1549
193#define MIN_LFO_FREQUENCY_IN_PITCHCENTS		-7624
194#define MAX_LFO_AMPLITUDE_DEPTH				12	/* in dB, DLS2.1 p 31*/
195#define MIN_LFO_AMPLITUDE_DEPTH				-12	/* in dB, DLS2.1 p 31*/
196
197/* add to pitch cents before pow(2.0, n) to convert to frequency */
198#define ABSOLUTE_PITCH_BIAS					238395828
199
200#define	A5_PITCH_OFFSET						6900
201
202/*
203CHUNK_TYPE is a macro that converts the 4 input args into a 32-bit int
204where
205argument a is placed at the MSB location and
206argument d is placed at the LSB location.
207This is useful for determining the DLS chunk types
208*/
209#define	CHUNK_TYPE(a,b,c,d)	(	\
210		( ((EAS_U32)(a) & 0xFF) << 24 ) \
211	+	( ((EAS_U32)(b) & 0xFF) << 16 ) \
212	+	( ((EAS_U32)(c) & 0xFF) <<  8 ) \
213	+	( ((EAS_U32)(d) & 0xFF)       ) )
214
215#define	CHUNK_RIFF					CHUNK_TYPE('R','I','F','F')
216#define	CHUNK_DLS					CHUNK_TYPE('D','L','S',' ')
217#define	CHUNK_CDL					CHUNK_TYPE('c','d','l',' ')
218#define	CHUNK_VERS					CHUNK_TYPE('v','e','r','s')
219#define	CHUNK_DLID					CHUNK_TYPE('d','l','i','d')
220#define	CHUNK_LIST					CHUNK_TYPE('L','I','S','T')
221#define	CHUNK_COLH					CHUNK_TYPE('c','o','l','h')
222#define	CHUNK_LINS					CHUNK_TYPE('l','i','n','s')
223#define	CHUNK_PTBL					CHUNK_TYPE('p','t','b','l')
224#define	CHUNK_WVPL					CHUNK_TYPE('w','v','p','l')
225#define	CHUNK_INFO					CHUNK_TYPE('I','N','F','O')
226#define	CHUNK_INAM					CHUNK_TYPE('I','N','A','M')
227#define	CHUNK_INS					CHUNK_TYPE('i','n','s',' ')
228#define	CHUNK_INSH					CHUNK_TYPE('i','n','s','h')
229#define	CHUNK_LRGN					CHUNK_TYPE('l','r','g','n')
230#define	CHUNK_RGN 					CHUNK_TYPE('r','g','n',' ')
231#define	CHUNK_RGN2					CHUNK_TYPE('r','g','n','2')
232#define	CHUNK_RGNH					CHUNK_TYPE('r','g','n','h')
233#define	CHUNK_WSMP					CHUNK_TYPE('w','s','m','p')
234#define	CHUNK_WLNK					CHUNK_TYPE('w','l','n','k')
235#define	CHUNK_LART					CHUNK_TYPE('l','a','r','t')
236#define	CHUNK_LAR2					CHUNK_TYPE('l','a','r','2')
237#define	CHUNK_ART1					CHUNK_TYPE('a','r','t','1')
238#define	CHUNK_ART2					CHUNK_TYPE('a','r','t','2')
239#define	CHUNK_WAVE					CHUNK_TYPE('w','a','v','e')
240#define	CHUNK_FMT 					CHUNK_TYPE('f','m','t',' ')
241#define	CHUNK_DATA					CHUNK_TYPE('d','a','t','a')
242#define	CHUNK_DMPR					CHUNK_TYPE('d','m','p','r')
243
244
245#define	WAVE_FORMAT_PCM				0x0001 /* Microsoft PCM format, see DLS2.1 p60 */
246#define	WAVE_FORMAT_EXTENSIBLE		0xffff
247
248/* defines for wave table structures */
249
250/* initialize each articulation structure to a harmless state */
251/* change art values after we've determined EAS internals */
252#define DEFAULT_DLS_FILTER_CUTOFF_FREQUENCY		0x7FFF		/* DLS2.1, p 31 means leave filter off */
253
254/**********/
255
256/* define the waves that we expect to generate instead of store */
257/* NOTE: our comparison routine converts the input string
258to lowercase, so the following comparison values should all
259be in lowercase.
260*/
261#define	STRING_NOISE			"noise"
262
263
264/*------------------------------------
265 * type definitions
266 *------------------------------------
267*/
268#ifdef _STANDALONE_CONVERTER
269typedef struct s_dls_params
270{
271	EAS_INT		sampleRate;
272	EAS_INT		samplesPerFrame;
273	EAS_INT		bitDepth;
274	double		ditherLevel;
275	double		ditherFilterCoeff;
276	EAS_BOOL	compatibility;
277	EAS_BOOL	encodeADPCM;
278} S_DLS_PARAMS;
279#endif
280
281
282/* function prototypes */
283EAS_RESULT DLSParser (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE fileHandle, EAS_I32 offset, S_DLS **pDLS);
284EAS_RESULT DLSCleanup (EAS_HW_DATA_HANDLE hwInstData, S_DLS *pDLS);
285void DLSAddRef (S_DLS *pDLS);
286EAS_I16 ConvertDelay (EAS_I32 timeCents);
287EAS_I16 ConvertRate (EAS_I32 timeCents);
288
289
290#ifdef _STANDALONE_CONVERTER
291void DLSConvParams (S_DLS_PARAMS *pParams, EAS_BOOL set);
292#endif
293
294#endif
295
296