1/*---------------------------------------------------------------------------- 2 * 3 * File: 4 * eas_fmengine.h 5 * 6 * Contents and purpose: 7 * Declarations, interfaces, and prototypes for FM synthesize low-level. 8 * 9 * Copyright Sonic Network Inc. 2004 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: 664 $ 26 * $Date: 2007-04-25 13:11:22 -0700 (Wed, 25 Apr 2007) $ 27 *---------------------------------------------------------------------------- 28*/ 29 30/* sentinel */ 31#ifndef _FMENGINE_H 32#define _FMENGINE_H 33 34/* check for split architecture */ 35#if defined (EAS_SPLIT_HYBRID_SYNTH) || defined(EAS_SPLIT_FM_SYNTH) 36#define FM_OFFBOARD 37#endif 38 39/* output level to mix buffer (3 = -24dB) */ 40#define FM_GAIN_SHIFT 3 41#define FM_MONO_GAIN_SHIFT 9 42 43/* voice output level for stereo 15 = +6dB */ 44#define FM_STEREO_PRE_GAIN_SHIFT 11 45#define FM_STEREO_POST_GAIN_SHIFT 10 46 47/* modulator input level shift (21 = -30dB) */ 48#define FM_MODULATOR_INPUT_SHIFT 21 49 50/* feedback control level shift (7 = 0dB) */ 51#define FM_FEEDBACK_SHIFT 7 52 53/* synth final output level */ 54#define SYNTH_POST_GAIN_SHIFT 14 55 56/* LFO modulation to gain control */ 57#define FM_LFO_GAIN_SHIFT 12 58 59/* sine table is always a power of 2 - saves cycles in inner loop */ 60#define SINE_TABLE_SIZE_IN_BITS 11 61#define SINE_TABLE_SIZE 2048 62 63/* operator structure for FM engine */ 64typedef struct 65{ 66 EAS_U32 phase; /* current waveform phase */ 67 EAS_U16 gain; /* current internal gain */ 68 EAS_U16 outputGain; /* current output gain */ 69} S_FM_ENG_OPER; 70 71typedef struct 72{ 73 S_FM_ENG_OPER oper[4]; /* operator data */ 74 EAS_I16 op1Out; /* op1 output for feedback loop */ 75 EAS_I16 op3Out; /* op3 output for feedback loop */ 76 EAS_U16 voiceGain; /* LFO + channel parameters */ 77#if (NUM_OUTPUT_CHANNELS == 2) 78 EAS_U16 gainLeft; /* left gain multiplier */ 79 EAS_U16 gainRight; /* right gain multiplier */ 80#endif 81 EAS_U8 flags; /* mode bits and noise waveform flags */ 82 EAS_U8 feedback; /* feedback for Op1 and Op3 */ 83} S_FM_ENG_VOICE; 84 85typedef struct 86{ 87 EAS_U16 gain[4]; /* initial operator gain value */ 88 EAS_U16 outputGain[4]; /* initial operator output gain value */ 89 EAS_U16 voiceGain; /* initial voice gain */ 90 EAS_U8 flags; /* mode bits and noise waveform flags */ 91 EAS_U8 feedback; /* feedback for Op1 and Op3 */ 92#if (NUM_OUTPUT_CHANNELS == 2) 93 EAS_I8 pan; /* pan value +/-64 */ 94#endif 95} S_FM_VOICE_CONFIG; 96 97typedef struct 98{ 99 EAS_U16 gain[4]; /* new operator gain value */ 100 EAS_I16 pitch[4]; /* new pitch value */ 101 EAS_U16 voiceGain; /* new voice gain */ 102} S_FM_VOICE_FRAME; 103 104/* bit definitions for S_FM_ENG_VOICE.flags */ 105#define FLAG_FM_ENG_VOICE_OP1_NOISE 0x10 /* operator 1 source is PRNG */ 106#define FLAG_FM_ENG_VOICE_OP2_NOISE 0x20 /* operator 2 source is PRNG */ 107#define FLAG_FM_ENG_VOICE_OP3_NOISE 0x40 /* operator 3 source is PRNG */ 108#define FLAG_FM_ENG_VOICE_OP4_NOISE 0x80 /* operator 4 source is PRNG */ 109 110#ifdef FM_OFFBOARD 111extern EAS_BOOL FM_StartFrame (EAS_FRAME_BUFFER_HANDLE pFrameBuffer); 112extern EAS_BOOL FM_EndFrame (EAS_FRAME_BUFFER_HANDLE pFrameBuffe, EAS_I32 *pMixBuffer, EAS_I16 masterGain); 113#endif 114 115/* FM engine prototypes */ 116extern void FM_ConfigVoice (EAS_I32 voiceNum, S_FM_VOICE_CONFIG *vCfg, EAS_FRAME_BUFFER_HANDLE pFrameBuffer); 117extern void FM_ProcessVoice (EAS_I32 voiceNum, S_FM_VOICE_FRAME *pFrame, EAS_I32 numSamplesToAdd, EAS_PCM *pTempBuffer, EAS_PCM *pBuffer, EAS_I32 *pMixBuffer, EAS_FRAME_BUFFER_HANDLE pFrameBuffer); 118 119#endif 120/* #ifndef _FMENGINE_H */ 121 122