summaryrefslogtreecommitdiffstats
path: root/arm-wt-22k/lib_src/eas_mdls.h
diff options
context:
space:
mode:
Diffstat (limited to 'arm-wt-22k/lib_src/eas_mdls.h')
-rw-r--r--arm-wt-22k/lib_src/eas_mdls.h295
1 files changed, 295 insertions, 0 deletions
diff --git a/arm-wt-22k/lib_src/eas_mdls.h b/arm-wt-22k/lib_src/eas_mdls.h
new file mode 100644
index 0000000..f7dbf2f
--- /dev/null
+++ b/arm-wt-22k/lib_src/eas_mdls.h
@@ -0,0 +1,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
+