You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
172 lines
5.9 KiB
172 lines
5.9 KiB
/*----------------------------------------------------------------------------
|
|
*
|
|
* File:
|
|
* eas_wtengine.h
|
|
*
|
|
* Contents and purpose:
|
|
* This file defines the interface for wavetable synthesis engine
|
|
*
|
|
* 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.
|
|
*
|
|
*----------------------------------------------------------------------------
|
|
* Revision Control:
|
|
* $Revision: 818 $
|
|
* $Date: 2007-08-02 15:19:41 -0700 (Thu, 02 Aug 2007) $
|
|
*----------------------------------------------------------------------------
|
|
*/
|
|
|
|
#ifndef _EAS_WTENGINE_H
|
|
#define _EAS_WTENGINE_H
|
|
|
|
/* option sanity check */
|
|
#if defined(_OPTIMIZED_MONO) && defined(_FILTER_ENABLED)
|
|
#error "Incompatible build settings: _OPTIMIZED_MONO cannot be used with _FILTER_ENABLED"
|
|
#endif
|
|
|
|
#if defined(_OPTIMIZED_MONO) && (NUM_OUTPUT_CHANNELS != 1)
|
|
#error "Incompatible build settings: _OPTIMIZED_MONO can only be used with NUM_OUTPUT_CHANNELS = 1"
|
|
#endif
|
|
|
|
#include "eas_wt_IPC_frame.h"
|
|
|
|
/*----------------------------------------------------------------------------
|
|
* defines
|
|
*----------------------------------------------------------------------------
|
|
*/
|
|
#define WT_NOISE_GENERATOR 0xffffffff
|
|
|
|
/*----------------------------------------------------------------------------
|
|
* typedefs
|
|
*----------------------------------------------------------------------------
|
|
*/
|
|
|
|
/*----------------------------------------------------------------------------
|
|
* S_WT_INT_FRAME
|
|
*
|
|
* This structure includes S_WT_FRAME plus the bus mixing
|
|
* parameters for the internal voices.
|
|
*----------------------------------------------------------------------------
|
|
*/
|
|
typedef struct s_wt_int_frame_tag
|
|
{
|
|
S_WT_FRAME frame;
|
|
EAS_PCM *pAudioBuffer;
|
|
EAS_I32 *pMixBuffer;
|
|
EAS_I32 numSamples;
|
|
EAS_I32 prevGain;
|
|
} S_WT_INT_FRAME;
|
|
|
|
#if defined(_FILTER_ENABLED)
|
|
/*----------------------------------------------------------------------------
|
|
* S_FILTER_CONTROL data structure
|
|
*----------------------------------------------------------------------------
|
|
*/
|
|
typedef struct s_filter_control_tag
|
|
{
|
|
EAS_I16 z1; /* 1 sample delay state variable */
|
|
EAS_I16 z2; /* 2 sample delay state variable */
|
|
} S_FILTER_CONTROL;
|
|
#endif
|
|
|
|
/*------------------------------------
|
|
* S_LFO_CONTROL data structure
|
|
*------------------------------------
|
|
*/
|
|
typedef struct s_lfo_control_tag
|
|
{
|
|
EAS_I16 lfoValue; /* LFO current output value */
|
|
EAS_I16 lfoPhase; /* LFO current phase */
|
|
} S_LFO_CONTROL;
|
|
|
|
/* bit definitions for S_WT_VOICE:flags */
|
|
#define WT_FLAGS_ADPCM_NIBBLE 1 /* high/low nibble flag */
|
|
#define WT_FLAGS_ADPCM_READY 2 /* first 2 samples are decoded */
|
|
#define WT_FLAGS_USE_ADPCM 4 /* sample is ADPCM encoded */
|
|
|
|
/* eg1State and eg2State */
|
|
typedef enum {
|
|
eEnvelopeStateInit = 0,
|
|
eEnvelopeStateDelay,
|
|
eEnvelopeStateAttack,
|
|
eEnvelopeStateHold,
|
|
eEnvelopeStateDecay,
|
|
eEnvelopeStateSustain,
|
|
eEnvelopeStateRelease,
|
|
eEnvelopeStateMuting,
|
|
eEnvelopeStateMuted,
|
|
eEnvelopeStateInvalid /* should never be in this state! */
|
|
} E_ENVELOPE_STATE;
|
|
|
|
#define DEFAULT_EG1_STATE eEnvelopeStateAttack
|
|
#define DEFAULT_EG1_VALUE 0
|
|
#define DEFAULT_EG1_INCREMENT 0
|
|
#define DEFAULT_EG2_STATE eEnvelopeStateAttack
|
|
#define DEFAULT_EG2_VALUE 0
|
|
#define DEFAULT_EG2_INCREMENT 0
|
|
|
|
/*----------------------------------------------------------------------------
|
|
* S_WT_VOICE
|
|
*
|
|
* This structure contains state data for the wavetable engine
|
|
*----------------------------------------------------------------------------
|
|
*/
|
|
typedef struct s_wt_voice_tag
|
|
{
|
|
EAS_U32 loopEnd; /* points to last PCM sample (not 1 beyond last) */
|
|
EAS_U32 loopStart; /* points to first sample at start of loop */
|
|
EAS_U32 phaseAccum; /* current sample, integer portion of phase */
|
|
EAS_U32 phaseFrac; /* fractional portion of phase */
|
|
|
|
#if (NUM_OUTPUT_CHANNELS == 2)
|
|
EAS_I16 gainLeft; /* current gain, left ch */
|
|
EAS_I16 gainRight; /* current gain, right ch */
|
|
#endif
|
|
|
|
#if defined(_FILTER_ENABLED)
|
|
S_FILTER_CONTROL filter; /* low pass filter */
|
|
#endif
|
|
|
|
S_LFO_CONTROL modLFO; /* modulator LFO */
|
|
|
|
#ifdef DLS_SYNTHESIZER
|
|
S_LFO_CONTROL vibLFO; /* vibrato LFO */
|
|
#endif
|
|
|
|
/* envelope control */
|
|
EAS_I16 eg1Value;
|
|
EAS_I16 eg2Value;
|
|
EAS_I16 eg1Increment;
|
|
EAS_I16 eg2Increment;
|
|
EAS_U8 eg1State;
|
|
EAS_U8 eg2State;
|
|
|
|
EAS_U16 artIndex; /* index to articulation params */
|
|
|
|
} S_WT_VOICE;
|
|
|
|
/*----------------------------------------------------------------------------
|
|
* prototypes
|
|
*----------------------------------------------------------------------------
|
|
*/
|
|
EAS_BOOL WT_CheckSampleEnd (S_WT_VOICE *pWTVoice, S_WT_INT_FRAME *pWTIntFrame, EAS_BOOL update);
|
|
void WT_ProcessVoice (S_WT_VOICE *pWTVoice, S_WT_INT_FRAME *pWTIntFrame);
|
|
|
|
#ifdef EAS_SPLIT_WT_SYNTH
|
|
void WTE_ConfigVoice (EAS_I32 voiceNum, S_WT_CONFIG *pWTConfig, EAS_FRAME_BUFFER_HANDLE pFrameBuffer);
|
|
void WTE_ProcessVoice (EAS_I32 voiceNum, S_WT_FRAME *pWTParams, EAS_FRAME_BUFFER_HANDLE pFrameBuffer);
|
|
#endif
|
|
|
|
#endif
|