/*---------------------------------------------------------------------------- * * File: * eas_sndlib.h * * Contents and purpose: * Declarations for the sound library * * Copyright Sonic Network Inc. 2005 * 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. * *---------------------------------------------------------------------------- * Revision Control: * $Revision: 550 $ * $Date: 2007-02-02 09:37:03 -0800 (Fri, 02 Feb 2007) $ *---------------------------------------------------------------------------- */ #ifndef _EAS_SNDLIB_H #define _EAS_SNDLIB_H #include "eas_types.h" #include "eas_synthcfg.h" #ifdef _WT_SYNTH #include "eas_wtengine.h" #endif /*---------------------------------------------------------------------------- * This is bit of a hack to allow us to keep the same structure * declarations for the DLS parser. Normally, the data is located * in read-only memory, but for DLS, we store the data in RW * memory. *---------------------------------------------------------------------------- */ #ifndef SCNST #define SCNST const #endif /*---------------------------------------------------------------------------- * sample size *---------------------------------------------------------------------------- */ #ifdef _16_BIT_SAMPLES typedef EAS_I16 EAS_SAMPLE; #else typedef EAS_I8 EAS_SAMPLE; #endif /*---------------------------------------------------------------------------- * EAS Library ID - quick check for valid library and version *---------------------------------------------------------------------------- */ #define _EAS_LIBRARY_VERSION 0x01534145 #define NUM_PROGRAMS_IN_BANK 128 #define INVALID_REGION_INDEX 0xffff /* this bit in region index indicates that region is for secondary synth */ #define FLAG_RGN_IDX_FM_SYNTH 0x8000 #define FLAG_RGN_IDX_DLS_SYNTH 0x4000 #define REGION_INDEX_MASK 0x3fff /*---------------------------------------------------------------------------- * Generic region data structure * * This must be the first element in each region structure *---------------------------------------------------------------------------- */ typedef struct s_region_tag { EAS_U16 keyGroupAndFlags; EAS_U8 rangeLow; EAS_U8 rangeHigh; } S_REGION; /* * Bit fields for m_nKeyGroupAndFlags * Bits 0-2 are mode bits in FM synth * Bits 8-11 are the key group */ #define REGION_FLAG_IS_LOOPED 0x01 #define REGION_FLAG_USE_WAVE_GENERATOR 0x02 #define REGION_FLAG_USE_ADPCM 0x04 #define REGION_FLAG_ONE_SHOT 0x08 #define REGION_FLAG_SQUARE_WAVE 0x10 #define REGION_FLAG_OFF_CHIP 0x20 #define REGION_FLAG_NON_SELF_EXCLUSIVE 0x40 #define REGION_FLAG_LAST_REGION 0x8000 /*---------------------------------------------------------------------------- * Envelope data structure *---------------------------------------------------------------------------- */ typedef struct s_envelope_tag { EAS_I16 attackTime; EAS_I16 decayTime; EAS_I16 sustainLevel; EAS_I16 releaseTime; } S_ENVELOPE; /*---------------------------------------------------------------------------- * DLS envelope data structure *---------------------------------------------------------------------------- */ typedef struct s_dls_envelope_tag { EAS_I16 delayTime; EAS_I16 attackTime; EAS_I16 holdTime; EAS_I16 decayTime; EAS_I16 sustainLevel; EAS_I16 releaseTime; EAS_I16 velToAttack; EAS_I16 keyNumToDecay; EAS_I16 keyNumToHold; } S_DLS_ENVELOPE; /*---------------------------------------------------------------------------- * LFO data structure *---------------------------------------------------------------------------- */ typedef struct s_lfo_params_tag { EAS_I16 lfoFreq; EAS_I16 lfoDelay; } S_LFO_PARAMS; /*---------------------------------------------------------------------------- * Articulation data structure *---------------------------------------------------------------------------- */ typedef struct s_articulation_tag { S_ENVELOPE eg1; S_ENVELOPE eg2; EAS_I16 lfoToPitch; EAS_I16 lfoDelay; EAS_I16 lfoFreq; EAS_I16 eg2ToPitch; EAS_I16 eg2ToFc; EAS_I16 filterCutoff; EAS_I8 lfoToGain; EAS_U8 filterQ; EAS_I8 pan; } S_ARTICULATION; /*---------------------------------------------------------------------------- * DLS articulation data structure *---------------------------------------------------------------------------- */ typedef struct s_dls_articulation_tag { S_LFO_PARAMS modLFO; S_LFO_PARAMS vibLFO; S_DLS_ENVELOPE eg1; S_DLS_ENVELOPE eg2; EAS_I16 eg1ShutdownTime; EAS_I16 filterCutoff; EAS_I16 modLFOToFc; EAS_I16 modLFOCC1ToFc; EAS_I16 modLFOChanPressToFc; EAS_I16 eg2ToFc; EAS_I16 velToFc; EAS_I16 keyNumToFc; EAS_I16 modLFOToGain; EAS_I16 modLFOCC1ToGain; EAS_I16 modLFOChanPressToGain; EAS_I16 tuning; EAS_I16 keyNumToPitch; EAS_I16 vibLFOToPitch; EAS_I16 vibLFOCC1ToPitch; EAS_I16 vibLFOChanPressToPitch; EAS_I16 modLFOToPitch; EAS_I16 modLFOCC1ToPitch; EAS_I16 modLFOChanPressToPitch; EAS_I16 eg2ToPitch; /* pad to 4-byte boundary */ EAS_U16 pad; EAS_I8 pan; EAS_U8 filterQandFlags; #ifdef _REVERB EAS_I16 reverbSend; EAS_I16 cc91ToReverbSend; #endif #ifdef _CHORUS EAS_I16 chorusSend; EAS_I16 cc93ToChorusSend; #endif } S_DLS_ARTICULATION; /* flags in filterQandFlags * NOTE: Q is stored in bottom 5 bits */ #define FLAG_DLS_VELOCITY_SENSITIVE 0x80 #define FILTER_Q_MASK 0x1f /*---------------------------------------------------------------------------- * Wavetable region data structure *---------------------------------------------------------------------------- */ typedef struct s_wt_region_tag { S_REGION region; EAS_I16 tuning; EAS_I16 gain; EAS_U32 loopStart; EAS_U32 loopEnd; EAS_U16 waveIndex; EAS_U16 artIndex; } S_WT_REGION; /*---------------------------------------------------------------------------- * DLS region data structure *---------------------------------------------------------------------------- */ typedef struct s_dls_region_tag { S_WT_REGION wtRegion; EAS_U8 velLow; EAS_U8 velHigh; } S_DLS_REGION; /*---------------------------------------------------------------------------- * FM synthesizer data structures *---------------------------------------------------------------------------- */ typedef struct s_fm_oper_tag { EAS_I16 tuning; EAS_U8 attackDecay; EAS_U8 velocityRelease; EAS_U8 egKeyScale; EAS_U8 sustain; EAS_U8 gain; EAS_U8 flags; } S_FM_OPER; /* defines for S_FM_OPER.m_nFlags */ #define FM_OPER_FLAG_MONOTONE 0x01 #define FM_OPER_FLAG_NO_VIBRATO 0x02 #define FM_OPER_FLAG_NOISE 0x04 #define FM_OPER_FLAG_LINEAR_VELOCITY 0x08 /* NOTE: The first two structure elements are common with S_WT_REGION * and we will rely on that in the voice management code and must * remain there unless the voice management code is revisited. */ typedef struct s_fm_region_tag { S_REGION region; EAS_U8 vibTrem; EAS_U8 lfoFreqDelay; EAS_U8 feedback; EAS_I8 pan; S_FM_OPER oper[4]; } S_FM_REGION; /*---------------------------------------------------------------------------- * Common data structures *---------------------------------------------------------------------------- */ /*---------------------------------------------------------------------------- * Program data structure * Used for individual programs not stored as a complete bank. *---------------------------------------------------------------------------- */ typedef struct s_program_tag { EAS_U32 locale; EAS_U16 regionIndex; } S_PROGRAM; /*---------------------------------------------------------------------------- * Bank data structure * * A bank always consists of 128 programs. If a bank is less than 128 * programs, it should be stored as a spare matrix in the pPrograms * array. * * bankNum: MSB/LSB of MIDI bank select controller * regionIndex: Index of first region in program *---------------------------------------------------------------------------- */ typedef struct s_bank_tag { EAS_U16 locale; EAS_U16 regionIndex[NUM_PROGRAMS_IN_BANK]; } S_BANK; /* defines for libFormat field * bits 0-17 are the sample rate * bit 18 is true if wavetable is present * bit 19 is true if FM is present * bit 20 is true if filter is enabled * bit 21 is sample depth (0 = 8-bits, 1 = 16-bits) * bits 22-31 are reserved */ #define LIBFORMAT_SAMPLE_RATE_MASK 0x0003ffff #define LIB_FORMAT_TYPE_MASK 0x000c0000 #define LIB_FORMAT_WAVETABLE 0x00000000 #define LIB_FORMAT_FM 0x00040000 #define LIB_FORMAT_HYBRID 0x00080000 #define LIB_FORMAT_FILTER_ENABLED 0x00100000 #define LIB_FORMAT_16_BIT_SAMPLES 0x00200000 #ifdef DLS_SYNTHESIZER /*---------------------------------------------------------------------------- * DLS data structure * * pDLSPrograms pointer to array of DLS programs * pDLSRegions pointer to array of DLS regions * pDLSArticulations pointer to array of DLS articulations * pSampleLen pointer to array of sample lengths * ppSamples pointer to array of sample pointers * numDLSPrograms number of DLS programs * numDLSRegions number of DLS regions * numDLSArticulations number of DLS articulations * numDLSSamples number of DLS samples *---------------------------------------------------------------------------- */ typedef struct s_eas_dls_tag { S_PROGRAM *pDLSPrograms; S_DLS_REGION *pDLSRegions; S_DLS_ARTICULATION *pDLSArticulations; EAS_U32 *pDLSSampleLen; EAS_U32 *pDLSSampleOffsets; EAS_SAMPLE *pDLSSamples; EAS_U16 numDLSPrograms; EAS_U16 numDLSRegions; EAS_U16 numDLSArticulations; EAS_U16 numDLSSamples; EAS_U8 refCount; } S_DLS; #endif /*---------------------------------------------------------------------------- * Sound library data structure * * pBanks pointer to array of banks * pPrograms pointer to array of programs * pWTRegions pointer to array of wavetable regions * pFMRegions pointer to array of FM regions * pArticulations pointer to array of articulations * pSampleLen pointer to array of sample lengths * ppSamples pointer to array of sample pointers * numBanks number of banks * numPrograms number of individual program * numRegions number of regions * numArticulations number of articulations * numSamples number of samples *---------------------------------------------------------------------------- */ typedef struct s_eas_sndlib_tag { SCNST EAS_U32 identifier; SCNST EAS_U32 libAttr; SCNST S_BANK *pBanks; SCNST S_PROGRAM *pPrograms; SCNST S_WT_REGION *pWTRegions; SCNST S_ARTICULATION *pArticulations; SCNST EAS_U32 *pSampleLen; SCNST EAS_U32 *pSampleOffsets; SCNST EAS_SAMPLE *pSamples; SCNST S_FM_REGION *pFMRegions; SCNST EAS_U16 numBanks; SCNST EAS_U16 numPrograms; SCNST EAS_U16 numWTRegions; SCNST EAS_U16 numArticulations; SCNST EAS_U16 numSamples; SCNST EAS_U16 numFMRegions; } S_EAS; #endif