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 56typedef EAS_I16 EAS_SAMPLE; 57#else 58typedef 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*/ 81typedef 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*/ 106typedef 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*/ 118typedef 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*/ 135typedef 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*/ 145typedef 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 165typedef 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*/ 224typedef 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*/ 239typedef 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*/ 250typedef 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 */ 271typedef 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*/ 291typedef 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*/ 308typedef 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*/ 346typedef 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*/ 379typedef 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