| /*---------------------------------------------------------------------------- |
| * |
| * 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 |
| |