Home | History | Annotate | Download | only in lib_src
      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) */
     51 typedef 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 /*
    203 CHUNK_TYPE is a macro that converts the 4 input args into a 32-bit int
    204 where
    205 argument a is placed at the MSB location and
    206 argument d is placed at the LSB location.
    207 This 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
    258 to lowercase, so the following comparison values should all
    259 be in lowercase.
    260 */
    261 #define STRING_NOISE            "noise"
    262 
    263 
    264 /*------------------------------------
    265  * type definitions
    266  *------------------------------------
    267 */
    268 #ifdef _STANDALONE_CONVERTER
    269 typedef 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 */
    283 EAS_RESULT DLSParser (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE fileHandle, EAS_I32 offset, S_DLS **pDLS);
    284 EAS_RESULT DLSCleanup (EAS_HW_DATA_HANDLE hwInstData, S_DLS *pDLS);
    285 void DLSAddRef (S_DLS *pDLS);
    286 EAS_I16 ConvertDelay (EAS_I32 timeCents);
    287 EAS_I16 ConvertRate (EAS_I32 timeCents);
    288 
    289 
    290 #ifdef _STANDALONE_CONVERTER
    291 void DLSConvParams (S_DLS_PARAMS *pParams, EAS_BOOL set);
    292 #endif
    293 
    294 #endif
    295 
    296