1 /*---------------------------------------------------------------------------- 2 * 3 * File: 4 * eas_sndlib.h 5 * 6 * Contents and purpose: 7 * Declarations for the sound library 8 * 9 * Copyright Sonic Network Inc. 2005 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 * Revision Control: 25 * $Revision: 550 $ 26 * $Date: 2007-02-02 09:37:03 -0800 (Fri, 02 Feb 2007) $ 27 *---------------------------------------------------------------------------- 28 */ 29 30 #ifndef _EAS_SNDLIB_H 31 #define _EAS_SNDLIB_H 32 33 #include "eas_types.h" 34 #include "eas_synthcfg.h" 35 36 #ifdef _WT_SYNTH 37 #include "eas_wtengine.h" 38 #endif 39 40 /*---------------------------------------------------------------------------- 41 * This is bit of a hack to allow us to keep the same structure 42 * declarations for the DLS parser. Normally, the data is located 43 * in read-only memory, but for DLS, we store the data in RW 44 * memory. 45 *---------------------------------------------------------------------------- 46 */ 47 #ifndef SCNST 48 #define SCNST const 49 #endif 50 51 /*---------------------------------------------------------------------------- 52 * sample size 53 *---------------------------------------------------------------------------- 54 */ 55 #ifdef _16_BIT_SAMPLES 56 typedef EAS_I16 EAS_SAMPLE; 57 #else 58 typedef EAS_I8 EAS_SAMPLE; 59 #endif 60 61 /*---------------------------------------------------------------------------- 62 * EAS Library ID - quick check for valid library and version 63 *---------------------------------------------------------------------------- 64 */ 65 #define _EAS_LIBRARY_VERSION 0x01534145 66 67 #define NUM_PROGRAMS_IN_BANK 128 68 #define INVALID_REGION_INDEX 0xffff 69 70 /* this bit in region index indicates that region is for secondary synth */ 71 #define FLAG_RGN_IDX_FM_SYNTH 0x8000 72 #define FLAG_RGN_IDX_DLS_SYNTH 0x4000 73 #define REGION_INDEX_MASK 0x3fff 74 75 /*---------------------------------------------------------------------------- 76 * Generic region data structure 77 * 78 * This must be the first element in each region structure 79 *---------------------------------------------------------------------------- 80 */ 81 typedef struct s_region_tag 82 { 83 EAS_U16 keyGroupAndFlags; 84 EAS_U8 rangeLow; 85 EAS_U8 rangeHigh; 86 } S_REGION; 87 88 /* 89 * Bit fields for m_nKeyGroupAndFlags 90 * Bits 0-2 are mode bits in FM synth 91 * Bits 8-11 are the key group 92 */ 93 #define REGION_FLAG_IS_LOOPED 0x01 94 #define REGION_FLAG_USE_WAVE_GENERATOR 0x02 95 #define REGION_FLAG_USE_ADPCM 0x04 96 #define REGION_FLAG_ONE_SHOT 0x08 97 #define REGION_FLAG_SQUARE_WAVE 0x10 98 #define REGION_FLAG_OFF_CHIP 0x20 99 #define REGION_FLAG_NON_SELF_EXCLUSIVE 0x40 100 #define REGION_FLAG_LAST_REGION 0x8000 101 102 /*---------------------------------------------------------------------------- 103 * Envelope data structure 104 *---------------------------------------------------------------------------- 105 */ 106 typedef struct s_envelope_tag 107 { 108 EAS_I16 attackTime; 109 EAS_I16 decayTime; 110 EAS_I16 sustainLevel; 111 EAS_I16 releaseTime; 112 } S_ENVELOPE; 113 114 /*---------------------------------------------------------------------------- 115 * DLS envelope data structure 116 *---------------------------------------------------------------------------- 117 */ 118 typedef struct s_dls_envelope_tag 119 { 120 EAS_I16 delayTime; 121 EAS_I16 attackTime; 122 EAS_I16 holdTime; 123 EAS_I16 decayTime; 124 EAS_I16 sustainLevel; 125 EAS_I16 releaseTime; 126 EAS_I16 velToAttack; 127 EAS_I16 keyNumToDecay; 128 EAS_I16 keyNumToHold; 129 } S_DLS_ENVELOPE; 130 131 /*---------------------------------------------------------------------------- 132 * LFO data structure 133 *---------------------------------------------------------------------------- 134 */ 135 typedef struct s_lfo_params_tag 136 { 137 EAS_I16 lfoFreq; 138 EAS_I16 lfoDelay; 139 } S_LFO_PARAMS; 140 141 /*---------------------------------------------------------------------------- 142 * Articulation data structure 143 *---------------------------------------------------------------------------- 144 */ 145 typedef struct s_articulation_tag 146 { 147 S_ENVELOPE eg1; 148 S_ENVELOPE eg2; 149 EAS_I16 lfoToPitch; 150 EAS_I16 lfoDelay; 151 EAS_I16 lfoFreq; 152 EAS_I16 eg2ToPitch; 153 EAS_I16 eg2ToFc; 154 EAS_I16 filterCutoff; 155 EAS_I8 lfoToGain; 156 EAS_U8 filterQ; 157 EAS_I8 pan; 158 } S_ARTICULATION; 159 160 /*---------------------------------------------------------------------------- 161 * DLS articulation data structure 162 *---------------------------------------------------------------------------- 163 */ 164 165 typedef struct s_dls_articulation_tag 166 { 167 S_LFO_PARAMS modLFO; 168 S_LFO_PARAMS vibLFO; 169 170 S_DLS_ENVELOPE eg1; 171 S_DLS_ENVELOPE eg2; 172 173 EAS_I16 eg1ShutdownTime; 174 175 EAS_I16 filterCutoff; 176 EAS_I16 modLFOToFc; 177 EAS_I16 modLFOCC1ToFc; 178 EAS_I16 modLFOChanPressToFc; 179 EAS_I16 eg2ToFc; 180 EAS_I16 velToFc; 181 EAS_I16 keyNumToFc; 182 183 EAS_I16 modLFOToGain; 184 EAS_I16 modLFOCC1ToGain; 185 EAS_I16 modLFOChanPressToGain; 186 187 EAS_I16 tuning; 188 EAS_I16 keyNumToPitch; 189 EAS_I16 vibLFOToPitch; 190 EAS_I16 vibLFOCC1ToPitch; 191 EAS_I16 vibLFOChanPressToPitch; 192 EAS_I16 modLFOToPitch; 193 EAS_I16 modLFOCC1ToPitch; 194 EAS_I16 modLFOChanPressToPitch; 195 EAS_I16 eg2ToPitch; 196 197 /* pad to 4-byte boundary */ 198 EAS_U16 pad; 199 200 EAS_I8 pan; 201 EAS_U8 filterQandFlags; 202 203 #ifdef _REVERB 204 EAS_I16 reverbSend; 205 EAS_I16 cc91ToReverbSend; 206 #endif 207 208 #ifdef _CHORUS 209 EAS_I16 chorusSend; 210 EAS_I16 cc93ToChorusSend; 211 #endif 212 } S_DLS_ARTICULATION; 213 214 /* flags in filterQandFlags 215 * NOTE: Q is stored in bottom 5 bits 216 */ 217 #define FLAG_DLS_VELOCITY_SENSITIVE 0x80 218 #define FILTER_Q_MASK 0x1f 219 220 /*---------------------------------------------------------------------------- 221 * Wavetable region data structure 222 *---------------------------------------------------------------------------- 223 */ 224 typedef struct s_wt_region_tag 225 { 226 S_REGION region; 227 EAS_I16 tuning; 228 EAS_I16 gain; 229 EAS_U32 loopStart; 230 EAS_U32 loopEnd; 231 EAS_U16 waveIndex; 232 EAS_U16 artIndex; 233 } S_WT_REGION; 234 235 /*---------------------------------------------------------------------------- 236 * DLS region data structure 237 *---------------------------------------------------------------------------- 238 */ 239 typedef struct s_dls_region_tag 240 { 241 S_WT_REGION wtRegion; 242 EAS_U8 velLow; 243 EAS_U8 velHigh; 244 } S_DLS_REGION; 245 246 /*---------------------------------------------------------------------------- 247 * FM synthesizer data structures 248 *---------------------------------------------------------------------------- 249 */ 250 typedef struct s_fm_oper_tag 251 { 252 EAS_I16 tuning; 253 EAS_U8 attackDecay; 254 EAS_U8 velocityRelease; 255 EAS_U8 egKeyScale; 256 EAS_U8 sustain; 257 EAS_U8 gain; 258 EAS_U8 flags; 259 } S_FM_OPER; 260 261 /* defines for S_FM_OPER.m_nFlags */ 262 #define FM_OPER_FLAG_MONOTONE 0x01 263 #define FM_OPER_FLAG_NO_VIBRATO 0x02 264 #define FM_OPER_FLAG_NOISE 0x04 265 #define FM_OPER_FLAG_LINEAR_VELOCITY 0x08 266 267 /* NOTE: The first two structure elements are common with S_WT_REGION 268 * and we will rely on that in the voice management code and must 269 * remain there unless the voice management code is revisited. 270 */ 271 typedef struct s_fm_region_tag 272 { 273 S_REGION region; 274 EAS_U8 vibTrem; 275 EAS_U8 lfoFreqDelay; 276 EAS_U8 feedback; 277 EAS_I8 pan; 278 S_FM_OPER oper[4]; 279 } S_FM_REGION; 280 281 /*---------------------------------------------------------------------------- 282 * Common data structures 283 *---------------------------------------------------------------------------- 284 */ 285 286 /*---------------------------------------------------------------------------- 287 * Program data structure 288 * Used for individual programs not stored as a complete bank. 289 *---------------------------------------------------------------------------- 290 */ 291 typedef struct s_program_tag 292 { 293 EAS_U32 locale; 294 EAS_U16 regionIndex; 295 } S_PROGRAM; 296 297 /*---------------------------------------------------------------------------- 298 * Bank data structure 299 * 300 * A bank always consists of 128 programs. If a bank is less than 128 301 * programs, it should be stored as a spare matrix in the pPrograms 302 * array. 303 * 304 * bankNum: MSB/LSB of MIDI bank select controller 305 * regionIndex: Index of first region in program 306 *---------------------------------------------------------------------------- 307 */ 308 typedef struct s_bank_tag 309 { 310 EAS_U16 locale; 311 EAS_U16 regionIndex[NUM_PROGRAMS_IN_BANK]; 312 } S_BANK; 313 314 315 /* defines for libFormat field 316 * bits 0-17 are the sample rate 317 * bit 18 is true if wavetable is present 318 * bit 19 is true if FM is present 319 * bit 20 is true if filter is enabled 320 * bit 21 is sample depth (0 = 8-bits, 1 = 16-bits) 321 * bits 22-31 are reserved 322 */ 323 #define LIBFORMAT_SAMPLE_RATE_MASK 0x0003ffff 324 #define LIB_FORMAT_TYPE_MASK 0x000c0000 325 #define LIB_FORMAT_WAVETABLE 0x00000000 326 #define LIB_FORMAT_FM 0x00040000 327 #define LIB_FORMAT_HYBRID 0x00080000 328 #define LIB_FORMAT_FILTER_ENABLED 0x00100000 329 #define LIB_FORMAT_16_BIT_SAMPLES 0x00200000 330 331 #ifdef DLS_SYNTHESIZER 332 /*---------------------------------------------------------------------------- 333 * DLS data structure 334 * 335 * pDLSPrograms pointer to array of DLS programs 336 * pDLSRegions pointer to array of DLS regions 337 * pDLSArticulations pointer to array of DLS articulations 338 * pSampleLen pointer to array of sample lengths 339 * ppSamples pointer to array of sample pointers 340 * numDLSPrograms number of DLS programs 341 * numDLSRegions number of DLS regions 342 * numDLSArticulations number of DLS articulations 343 * numDLSSamples number of DLS samples 344 *---------------------------------------------------------------------------- 345 */ 346 typedef struct s_eas_dls_tag 347 { 348 S_PROGRAM *pDLSPrograms; 349 S_DLS_REGION *pDLSRegions; 350 S_DLS_ARTICULATION *pDLSArticulations; 351 EAS_U32 *pDLSSampleLen; 352 EAS_U32 *pDLSSampleOffsets; 353 EAS_SAMPLE *pDLSSamples; 354 EAS_U16 numDLSPrograms; 355 EAS_U16 numDLSRegions; 356 EAS_U16 numDLSArticulations; 357 EAS_U16 numDLSSamples; 358 EAS_U8 refCount; 359 } S_DLS; 360 #endif 361 362 /*---------------------------------------------------------------------------- 363 * Sound library data structure 364 * 365 * pBanks pointer to array of banks 366 * pPrograms pointer to array of programs 367 * pWTRegions pointer to array of wavetable regions 368 * pFMRegions pointer to array of FM regions 369 * pArticulations pointer to array of articulations 370 * pSampleLen pointer to array of sample lengths 371 * ppSamples pointer to array of sample pointers 372 * numBanks number of banks 373 * numPrograms number of individual program 374 * numRegions number of regions 375 * numArticulations number of articulations 376 * numSamples number of samples 377 *---------------------------------------------------------------------------- 378 */ 379 typedef struct s_eas_sndlib_tag 380 { 381 SCNST EAS_U32 identifier; 382 SCNST EAS_U32 libAttr; 383 384 SCNST S_BANK *pBanks; 385 SCNST S_PROGRAM *pPrograms; 386 387 SCNST S_WT_REGION *pWTRegions; 388 SCNST S_ARTICULATION *pArticulations; 389 SCNST EAS_U32 *pSampleLen; 390 SCNST EAS_U32 *pSampleOffsets; 391 SCNST EAS_SAMPLE *pSamples; 392 393 SCNST S_FM_REGION *pFMRegions; 394 395 SCNST EAS_U16 numBanks; 396 SCNST EAS_U16 numPrograms; 397 398 SCNST EAS_U16 numWTRegions; 399 SCNST EAS_U16 numArticulations; 400 SCNST EAS_U16 numSamples; 401 402 SCNST EAS_U16 numFMRegions; 403 } S_EAS; 404 405 #endif 406 407