diff options
Diffstat (limited to 'arm-fm-22k/lib_src/eas_synth.h')
-rw-r--r-- | arm-fm-22k/lib_src/eas_synth.h | 766 |
1 files changed, 383 insertions, 383 deletions
diff --git a/arm-fm-22k/lib_src/eas_synth.h b/arm-fm-22k/lib_src/eas_synth.h index b242b03..6274b7d 100644 --- a/arm-fm-22k/lib_src/eas_synth.h +++ b/arm-fm-22k/lib_src/eas_synth.h @@ -1,12 +1,12 @@ -/*----------------------------------------------------------------------------
- *
- * File:
- * eas_synth.h
- *
- * Contents and purpose:
- * Declarations, interfaces, and prototypes for synth.
- *
- * Copyright Sonic Network Inc. 2004, 2005
+/*---------------------------------------------------------------------------- + * + * File: + * eas_synth.h + * + * Contents and purpose: + * Declarations, interfaces, and prototypes for synth. + * + * Copyright Sonic Network Inc. 2004, 2005 * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,377 +19,377 @@ * 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: 718 $
- * $Date: 2007-06-08 16:43:16 -0700 (Fri, 08 Jun 2007) $
- *----------------------------------------------------------------------------
-*/
-
-#ifndef _EAS_SYNTH_H
-#define _EAS_SYNTH_H
-
-#include "eas_types.h"
-#include "eas_sndlib.h"
-
-#ifdef _WT_SYNTH
-#include "eas_wtsynth.h"
-#endif
-
-#ifdef _FM_SYNTH
-#include "eas_fmsynth.h"
-#endif
-
-#ifndef NUM_OUTPUT_CHANNELS
-#define NUM_OUTPUT_CHANNELS 2
-#endif
-
-#ifndef MAX_SYNTH_VOICES
-#define MAX_SYNTH_VOICES 64
-#endif
-
-#ifndef MAX_VIRTUAL_SYNTHESIZERS
-#define MAX_VIRTUAL_SYNTHESIZERS 4
-#endif
-
-/* defines */
-#ifndef NUM_PRIMARY_VOICES
-#define NUM_PRIMARY_VOICES MAX_SYNTH_VOICES
-#elif !defined(NUM_SECONDARY_VOICES)
-#define NUM_SECONDARY_VOICES (MAX_SYNTH_VOICES - NUM_PRIMARY_VOICES)
-#endif
-
-#if defined(EAS_WT_SYNTH)
-#define NUM_WT_VOICES MAX_SYNTH_VOICES
-
-/* FM on MCU */
-#elif defined(EAS_FM_SYNTH)
-#define NUM_FM_VOICES MAX_SYNTH_VOICES
-
-/* wavetable drums on MCU, wavetable melodic on DSP */
-#elif defined(EAS_SPLIT_WT_SYNTH)
-#define NUM_WT_VOICES MAX_SYNTH_VOICES
-
-/* wavetable drums and FM melodic on MCU */
-#elif defined(EAS_HYBRID_SYNTH)
-#define NUM_WT_VOICES NUM_PRIMARY_VOICES
-#define NUM_FM_VOICES NUM_SECONDARY_VOICES
-
-/* wavetable drums on MCU, FM melodic on DSP */
-#elif defined(EAS_SPLIT_HYBRID_SYNTH)
-#define NUM_WT_VOICES NUM_PRIMARY_VOICES
-#define NUM_FM_VOICES NUM_SECONDARY_VOICES
-
-/* FM synth on DSP */
-#elif defined(EAS_SPLIT_FM_SYNTH)
-#define NUM_FM_VOICES MAX_SYNTH_VOICES
-
-#else
-#error "Unrecognized architecture option"
-#endif
-
-#define NUM_SYNTH_CHANNELS 16
-
-#define DEFAULT_SYNTH_VOICES MAX_SYNTH_VOICES
-
-/* use the following values to specify unassigned channels or voices */
-#define UNASSIGNED_SYNTH_CHANNEL NUM_SYNTH_CHANNELS
-#define UNASSIGNED_SYNTH_VOICE MAX_SYNTH_VOICES
-
-
-/* synth parameters are updated every SYNTH_UPDATE_PERIOD_IN_SAMPLES */
-#define SYNTH_UPDATE_PERIOD_IN_SAMPLES (EAS_I32)(0x1L << SYNTH_UPDATE_PERIOD_IN_BITS)
-
-/* stealing weighting factors */
-#define NOTE_AGE_STEAL_WEIGHT 1
-#define NOTE_GAIN_STEAL_WEIGHT 4
-#define CHANNEL_POLY_STEAL_WEIGHT 12
-#define CHANNEL_PRIORITY_STEAL_WEIGHT 2
-#define NOTE_MATCH_PENALTY 128
-#define SYNTH_PRIORITY_WEIGHT 8
-
-/* default synth master volume */
-#define DEFAULT_SYNTH_MASTER_VOLUME 0x7fff
-
-#define DEFAULT_SYNTH_PRIORITY 5
-
-/* default tuning values */
-#define DEFAULT_PITCH_BEND_SENSITIVITY 200 /* 2 semitones */
-#define DEFAULT_FINE_PITCH 0 /* 0 cents */
-#define DEFAULT_COARSE_PITCH 0 /* 0 semitones */
-
-/* default drum channel is 10, but is internally 9 due to unit offset */
-#define DEFAULT_DRUM_CHANNEL 9
-
-/* drum channel can simultaneously play this many voices at most */
-#define DEFAULT_CHANNEL_POLYPHONY_LIMIT 2
-
-/* default instrument is acoustic piano */
-#define DEFAULT_MELODY_BANK_MSB 0x79
-#define DEFAULT_RHYTHM_BANK_MSB 0x78
-#define DEFAULT_MELODY_BANK_NUMBER (DEFAULT_MELODY_BANK_MSB << 8)
-#define DEFAULT_RHYTHM_BANK_NUMBER (DEFAULT_RHYTHM_BANK_MSB << 8)
-#define DEFAULT_SYNTH_PROGRAM_NUMBER 0
-
-#define DEFAULT_PITCH_BEND 0x2000 /* 0x2000 == (0x40 << 7) | 0x00 */
-#define DEFAULT_MOD_WHEEL 0
-#define DEFAULT_CHANNEL_VOLUME 0x64
-#define DEFAULT_PAN 0x40 /* decimal 64, center */
-
-#ifdef _REVERB
-#define DEFAULT_REVERB_SEND 40 /* some reverb */
-#endif
-
-#ifdef _CHORUS
-#define DEFAULT_CHORUS_SEND 0 /* no chorus */
-#endif
-
-#define DEFAULT_EAS_FILTER_CUTOFF_FREQUENCY 0 /* EAS synth uses a different default */
-#define DEFAULT_FILTER_RESONANCE 0
-#define DEFAULT_EXPRESSION 0x7F
-
-#define DEFAULT_CHANNEL_PRESSURE 0
-
-#define DEFAULT_REGISTERED_PARAM 0x3FFF
-
-#define DEFAULT_CHANNEL_STATIC_GAIN 0
-#define DEFAULT_CHANNEL_STATIC_PITCH 0
-
-#define DEFAULT_LFO_MOD_WHEEL_TO_PITCH_CENTS 50
-#define DEFAULT_LFO_CHANNEL_PRESSURE_TO_PITCH_CENTS 50
-
-#define DEFAULT_KEY_NUMBER 0x69
-#define DEFAULT_VELOCITY 0x64
-#define DEFAULT_REGION_INDEX 0
-#define DEFAULT_ARTICULATION_INDEX 0
-#define DEFAULT_VOICE_GAIN 0
-#define DEFAULT_AGE 0
-#define DEFAULT_SP_MIDI_PRIORITY 16
-
-
-/* filter defines */
-#define DEFAULT_FILTER_ZERO 0
-#define FILTER_CUTOFF_MAX_PITCH_CENTS 1919
-#define FILTER_CUTOFF_MIN_PITCH_CENTS -4467
-#define A5_PITCH_OFFSET_IN_CENTS 6900
-
-/*------------------------------------
- * S_SYNTH_CHANNEL data structure
- *------------------------------------
-*/
-
-/* S_SYNTH_CHANNEL.m_nFlags */
-#define CHANNEL_FLAG_SUSTAIN_PEDAL 0x01
-#define CHANNEL_FLAG_MUTE 0x02
-#define CHANNEL_FLAG_UPDATE_CHANNEL_PARAMETERS 0x04
-#define CHANNEL_FLAG_RHYTHM_CHANNEL 0x08
-#define CHANNEL_FLAG_EXTERNAL_AUDIO 0x10
-#define DEFAULT_CHANNEL_FLAGS 0
-
-/* macros for extracting virtual synth and channel numbers */
-#define GET_VSYNTH(a) ((a) >> 4)
-#define GET_CHANNEL(a) ((a) & 15)
-
-typedef struct s_synth_channel_tag
-{
- /* use static channel parameters to reduce MIPs */
- /* parameters shared by multiple voices assigned to same channel */
- EAS_I32 staticPitch; /* (pitch bend * pitch sens) + fine pitch */
- EAS_I16 staticGain; /* (CC7 * CC11 * master vol)^2 */
-
- EAS_U16 regionIndex; /* index of first region in program */
-
- EAS_U16 bankNum; /* play programs from this bank */
- EAS_I16 pitchBend; /* pitch wheel value */
- EAS_I16 pitchBendSensitivity;
- EAS_I16 registeredParam; /* currently selected registered param */
-
-
-#if defined(_FM_SYNTH)
- EAS_I16 lfoAmt; /* amount of LFO to apply to voice */
-#endif
-
- EAS_U8 programNum; /* play this instrument number */
- EAS_U8 modWheel; /* CC1 */
- EAS_U8 volume; /* CC7 */
- EAS_U8 pan; /* CC10 */
-
- EAS_U8 expression; /* CC11 */
-
- /* the following parameters are controlled by RPNs */
- EAS_I8 finePitch;
- EAS_I8 coarsePitch;
-
- EAS_U8 channelPressure; /* applied to all voices on a given channel */
-
- EAS_U8 channelFlags; /* bit field channelFlags for */
- /* CC64, SP-MIDI channel masking */
-
- EAS_U8 pool; /* SPMIDI channel voice pool */
- EAS_U8 mip; /* SPMIDI MIP setting */
-
-#ifdef _REVERB
- EAS_U8 reverbSend; /* CC91 */
-#endif
-
-#ifdef _CHORUS
- EAS_U8 chorusSend; /* CC93 */
-#endif
-} S_SYNTH_CHANNEL;
-
-/*------------------------------------
- * S_SYNTH_VOICE data structure
- *------------------------------------
-*/
-
-/* S_SYNTH_VOICE.m_nFlags */
-#define VOICE_FLAG_UPDATE_VOICE_PARAMETERS 0x01
-#define VOICE_FLAG_SUSTAIN_PEDAL_DEFER_NOTE_OFF 0x02
-#define VOICE_FLAG_DEFER_MIDI_NOTE_OFF 0x04
-#define VOICE_FLAG_NO_SAMPLES_SYNTHESIZED_YET 0x08
-#define VOICE_FLAG_DEFER_MUTE 0x40
-#define DEFAULT_VOICE_FLAGS 0
-
-/* S_SYNTH_VOICE.m_eState */
-typedef enum {
-
- eVoiceStateFree = 0,
- eVoiceStateStart,
- eVoiceStatePlay,
- eVoiceStateRelease,
- eVoiceStateMuting,
- eVoiceStateStolen,
- eVoiceStateInvalid /* should never be in this state! */
-
-} E_VOICE_STATE;
-#define DEFAULT_VOICE_STATE eVoiceStateFree
-
-typedef struct s_synth_voice_tag
-{
-
-/* These parameters are common to both wavetable and FM
- * synthesizers. The voice manager should only access this data.
- * Any other data should be manipulated by the code that is
- * specific to that synthesizer and reflected back through the
- * common state data available here.
- */
- EAS_U16 regionIndex; /* index to wave and playback params */
- EAS_I16 gain; /* current gain */
- EAS_U16 age; /* large value means old note */
- EAS_U16 nextRegionIndex; /* index to wave and playback params */
- EAS_U8 voiceState; /* current voice state */
- EAS_U8 voiceFlags; /* misc flags/bit fields */
- EAS_U8 channel; /* this voice plays on this synth channel */
- EAS_U8 note; /* 12 <= key number <= 108 */
- EAS_U8 velocity; /* 0 <= velocity <= 127 */
- EAS_U8 nextChannel; /* play stolen voice on this channel */
- EAS_U8 nextNote; /* 12 <= key number <= 108 */
- EAS_U8 nextVelocity; /* 0 <= velocity <= 127 */
-} S_SYNTH_VOICE;
-
-/*------------------------------------
- * S_SYNTH data structure
- *
- * One instance for each MIDI stream
- *------------------------------------
-*/
-
-/* S_SYNTH.m_nFlags */
-#define SYNTH_FLAG_RESET_IS_REQUESTED 0x01
-#define SYNTH_FLAG_SP_MIDI_ON 0x02
-#define SYNTH_FLAG_UPDATE_ALL_CHANNEL_PARAMETERS 0x04
-#define SYNTH_FLAG_DEFERRED_MIDI_NOTE_OFF_PENDING 0x08
-#define DEFAULT_SYNTH_FLAGS SYNTH_FLAG_UPDATE_ALL_CHANNEL_PARAMETERS
-
-typedef struct s_synth_tag
-{
- struct s_eas_data_tag *pEASData;
- const S_EAS *pEAS;
-
-#ifdef DLS_SYNTHESIZER
- S_DLS *pDLS;
-#endif
-
-#ifdef EXTERNAL_AUDIO
- EAS_EXT_PRG_CHG_FUNC cbProgChgFunc;
- EAS_EXT_EVENT_FUNC cbEventFunc;
- EAS_VOID_PTR *pExtAudioInstData;
-#endif
-
- S_SYNTH_CHANNEL channels[NUM_SYNTH_CHANNELS];
- EAS_I32 totalNoteCount;
- EAS_U16 maxPolyphony;
- EAS_U16 numActiveVoices;
- EAS_U16 masterVolume;
- EAS_U8 channelsByPriority[NUM_SYNTH_CHANNELS];
- EAS_U8 poolCount[NUM_SYNTH_CHANNELS];
- EAS_U8 poolAlloc[NUM_SYNTH_CHANNELS];
- EAS_U8 synthFlags;
- EAS_I8 globalTranspose;
- EAS_U8 vSynthNum;
- EAS_U8 refCount;
- EAS_U8 priority;
-} S_SYNTH;
-
-/*------------------------------------
- * S_VOICE_MGR data structure
- *
- * One instance for each EAS library instance
- *------------------------------------
-*/
-typedef struct s_voice_mgr_tag
-{
- S_SYNTH *pSynth[MAX_VIRTUAL_SYNTHESIZERS];
- EAS_PCM voiceBuffer[SYNTH_UPDATE_PERIOD_IN_SAMPLES];
-
-#ifdef _FM_SYNTH
- EAS_PCM operMixBuffer[SYNTH_UPDATE_PERIOD_IN_SAMPLES];
- S_FM_VOICE fmVoices[NUM_FM_VOICES];
-#endif
-
-#ifdef _WT_SYNTH
- S_WT_VOICE wtVoices[NUM_WT_VOICES];
-#endif
-
-#ifdef _REVERB
- EAS_PCM reverbSendBuffer[NUM_OUTPUT_CHANNELS * SYNTH_UPDATE_PERIOD_IN_SAMPLES];
-#endif
-
-#ifdef _CHORUS
- EAS_PCM chorusSendBuffer[NUM_OUTPUT_CHANNELS * SYNTH_UPDATE_PERIOD_IN_SAMPLES];
-#endif
- S_SYNTH_VOICE voices[MAX_SYNTH_VOICES];
-
- EAS_SNDLIB_HANDLE pGlobalEAS;
-
-#ifdef DLS_SYNTHESIZER
- S_DLS *pGlobalDLS;
-#endif
-
-#ifdef _SPLIT_ARCHITECTURE
- EAS_FRAME_BUFFER_HANDLE pFrameBuffer;
-#endif
-
-#if defined(_SECONDARY_SYNTH) || defined(EAS_SPLIT_WT_SYNTH)
- EAS_U16 maxPolyphonyPrimary;
- EAS_U16 maxPolyphonySecondary;
-#endif
-
- EAS_I32 workload;
- EAS_I32 maxWorkLoad;
-
- EAS_U16 activeVoices;
- EAS_U16 maxPolyphony;
-
- EAS_U16 age;
-
-/* limits the number of voice starts in a frame for split architecture */
-#ifdef MAX_VOICE_STARTS
- EAS_U16 numVoiceStarts;
-#endif
-} S_VOICE_MGR;
-
-#endif /* #ifdef _EAS_SYNTH_H */
-
-
+ * + *---------------------------------------------------------------------------- + * Revision Control: + * $Revision: 718 $ + * $Date: 2007-06-08 16:43:16 -0700 (Fri, 08 Jun 2007) $ + *---------------------------------------------------------------------------- +*/ + +#ifndef _EAS_SYNTH_H +#define _EAS_SYNTH_H + +#include "eas_types.h" +#include "eas_sndlib.h" + +#ifdef _WT_SYNTH +#include "eas_wtsynth.h" +#endif + +#ifdef _FM_SYNTH +#include "eas_fmsynth.h" +#endif + +#ifndef NUM_OUTPUT_CHANNELS +#define NUM_OUTPUT_CHANNELS 2 +#endif + +#ifndef MAX_SYNTH_VOICES +#define MAX_SYNTH_VOICES 64 +#endif + +#ifndef MAX_VIRTUAL_SYNTHESIZERS +#define MAX_VIRTUAL_SYNTHESIZERS 4 +#endif + +/* defines */ +#ifndef NUM_PRIMARY_VOICES +#define NUM_PRIMARY_VOICES MAX_SYNTH_VOICES +#elif !defined(NUM_SECONDARY_VOICES) +#define NUM_SECONDARY_VOICES (MAX_SYNTH_VOICES - NUM_PRIMARY_VOICES) +#endif + +#if defined(EAS_WT_SYNTH) +#define NUM_WT_VOICES MAX_SYNTH_VOICES + +/* FM on MCU */ +#elif defined(EAS_FM_SYNTH) +#define NUM_FM_VOICES MAX_SYNTH_VOICES + +/* wavetable drums on MCU, wavetable melodic on DSP */ +#elif defined(EAS_SPLIT_WT_SYNTH) +#define NUM_WT_VOICES MAX_SYNTH_VOICES + +/* wavetable drums and FM melodic on MCU */ +#elif defined(EAS_HYBRID_SYNTH) +#define NUM_WT_VOICES NUM_PRIMARY_VOICES +#define NUM_FM_VOICES NUM_SECONDARY_VOICES + +/* wavetable drums on MCU, FM melodic on DSP */ +#elif defined(EAS_SPLIT_HYBRID_SYNTH) +#define NUM_WT_VOICES NUM_PRIMARY_VOICES +#define NUM_FM_VOICES NUM_SECONDARY_VOICES + +/* FM synth on DSP */ +#elif defined(EAS_SPLIT_FM_SYNTH) +#define NUM_FM_VOICES MAX_SYNTH_VOICES + +#else +#error "Unrecognized architecture option" +#endif + +#define NUM_SYNTH_CHANNELS 16 + +#define DEFAULT_SYNTH_VOICES MAX_SYNTH_VOICES + +/* use the following values to specify unassigned channels or voices */ +#define UNASSIGNED_SYNTH_CHANNEL NUM_SYNTH_CHANNELS +#define UNASSIGNED_SYNTH_VOICE MAX_SYNTH_VOICES + + +/* synth parameters are updated every SYNTH_UPDATE_PERIOD_IN_SAMPLES */ +#define SYNTH_UPDATE_PERIOD_IN_SAMPLES (EAS_I32)(0x1L << SYNTH_UPDATE_PERIOD_IN_BITS) + +/* stealing weighting factors */ +#define NOTE_AGE_STEAL_WEIGHT 1 +#define NOTE_GAIN_STEAL_WEIGHT 4 +#define CHANNEL_POLY_STEAL_WEIGHT 12 +#define CHANNEL_PRIORITY_STEAL_WEIGHT 2 +#define NOTE_MATCH_PENALTY 128 +#define SYNTH_PRIORITY_WEIGHT 8 + +/* default synth master volume */ +#define DEFAULT_SYNTH_MASTER_VOLUME 0x7fff + +#define DEFAULT_SYNTH_PRIORITY 5 + +/* default tuning values */ +#define DEFAULT_PITCH_BEND_SENSITIVITY 200 /* 2 semitones */ +#define DEFAULT_FINE_PITCH 0 /* 0 cents */ +#define DEFAULT_COARSE_PITCH 0 /* 0 semitones */ + +/* default drum channel is 10, but is internally 9 due to unit offset */ +#define DEFAULT_DRUM_CHANNEL 9 + +/* drum channel can simultaneously play this many voices at most */ +#define DEFAULT_CHANNEL_POLYPHONY_LIMIT 2 + +/* default instrument is acoustic piano */ +#define DEFAULT_MELODY_BANK_MSB 0x79 +#define DEFAULT_RHYTHM_BANK_MSB 0x78 +#define DEFAULT_MELODY_BANK_NUMBER (DEFAULT_MELODY_BANK_MSB << 8) +#define DEFAULT_RHYTHM_BANK_NUMBER (DEFAULT_RHYTHM_BANK_MSB << 8) +#define DEFAULT_SYNTH_PROGRAM_NUMBER 0 + +#define DEFAULT_PITCH_BEND 0x2000 /* 0x2000 == (0x40 << 7) | 0x00 */ +#define DEFAULT_MOD_WHEEL 0 +#define DEFAULT_CHANNEL_VOLUME 0x64 +#define DEFAULT_PAN 0x40 /* decimal 64, center */ + +#ifdef _REVERB +#define DEFAULT_REVERB_SEND 40 /* some reverb */ +#endif + +#ifdef _CHORUS +#define DEFAULT_CHORUS_SEND 0 /* no chorus */ +#endif + +#define DEFAULT_EAS_FILTER_CUTOFF_FREQUENCY 0 /* EAS synth uses a different default */ +#define DEFAULT_FILTER_RESONANCE 0 +#define DEFAULT_EXPRESSION 0x7F + +#define DEFAULT_CHANNEL_PRESSURE 0 + +#define DEFAULT_REGISTERED_PARAM 0x3FFF + +#define DEFAULT_CHANNEL_STATIC_GAIN 0 +#define DEFAULT_CHANNEL_STATIC_PITCH 0 + +#define DEFAULT_LFO_MOD_WHEEL_TO_PITCH_CENTS 50 +#define DEFAULT_LFO_CHANNEL_PRESSURE_TO_PITCH_CENTS 50 + +#define DEFAULT_KEY_NUMBER 0x69 +#define DEFAULT_VELOCITY 0x64 +#define DEFAULT_REGION_INDEX 0 +#define DEFAULT_ARTICULATION_INDEX 0 +#define DEFAULT_VOICE_GAIN 0 +#define DEFAULT_AGE 0 +#define DEFAULT_SP_MIDI_PRIORITY 16 + + +/* filter defines */ +#define DEFAULT_FILTER_ZERO 0 +#define FILTER_CUTOFF_MAX_PITCH_CENTS 1919 +#define FILTER_CUTOFF_MIN_PITCH_CENTS -4467 +#define A5_PITCH_OFFSET_IN_CENTS 6900 + +/*------------------------------------ + * S_SYNTH_CHANNEL data structure + *------------------------------------ +*/ + +/* S_SYNTH_CHANNEL.m_nFlags */ +#define CHANNEL_FLAG_SUSTAIN_PEDAL 0x01 +#define CHANNEL_FLAG_MUTE 0x02 +#define CHANNEL_FLAG_UPDATE_CHANNEL_PARAMETERS 0x04 +#define CHANNEL_FLAG_RHYTHM_CHANNEL 0x08 +#define CHANNEL_FLAG_EXTERNAL_AUDIO 0x10 +#define DEFAULT_CHANNEL_FLAGS 0 + +/* macros for extracting virtual synth and channel numbers */ +#define GET_VSYNTH(a) ((a) >> 4) +#define GET_CHANNEL(a) ((a) & 15) + +typedef struct s_synth_channel_tag +{ + /* use static channel parameters to reduce MIPs */ + /* parameters shared by multiple voices assigned to same channel */ + EAS_I32 staticPitch; /* (pitch bend * pitch sens) + fine pitch */ + EAS_I16 staticGain; /* (CC7 * CC11 * master vol)^2 */ + + EAS_U16 regionIndex; /* index of first region in program */ + + EAS_U16 bankNum; /* play programs from this bank */ + EAS_I16 pitchBend; /* pitch wheel value */ + EAS_I16 pitchBendSensitivity; + EAS_I16 registeredParam; /* currently selected registered param */ + + +#if defined(_FM_SYNTH) + EAS_I16 lfoAmt; /* amount of LFO to apply to voice */ +#endif + + EAS_U8 programNum; /* play this instrument number */ + EAS_U8 modWheel; /* CC1 */ + EAS_U8 volume; /* CC7 */ + EAS_U8 pan; /* CC10 */ + + EAS_U8 expression; /* CC11 */ + + /* the following parameters are controlled by RPNs */ + EAS_I8 finePitch; + EAS_I8 coarsePitch; + + EAS_U8 channelPressure; /* applied to all voices on a given channel */ + + EAS_U8 channelFlags; /* bit field channelFlags for */ + /* CC64, SP-MIDI channel masking */ + + EAS_U8 pool; /* SPMIDI channel voice pool */ + EAS_U8 mip; /* SPMIDI MIP setting */ + +#ifdef _REVERB + EAS_U8 reverbSend; /* CC91 */ +#endif + +#ifdef _CHORUS + EAS_U8 chorusSend; /* CC93 */ +#endif +} S_SYNTH_CHANNEL; + +/*------------------------------------ + * S_SYNTH_VOICE data structure + *------------------------------------ +*/ + +/* S_SYNTH_VOICE.m_nFlags */ +#define VOICE_FLAG_UPDATE_VOICE_PARAMETERS 0x01 +#define VOICE_FLAG_SUSTAIN_PEDAL_DEFER_NOTE_OFF 0x02 +#define VOICE_FLAG_DEFER_MIDI_NOTE_OFF 0x04 +#define VOICE_FLAG_NO_SAMPLES_SYNTHESIZED_YET 0x08 +#define VOICE_FLAG_DEFER_MUTE 0x40 +#define DEFAULT_VOICE_FLAGS 0 + +/* S_SYNTH_VOICE.m_eState */ +typedef enum { + + eVoiceStateFree = 0, + eVoiceStateStart, + eVoiceStatePlay, + eVoiceStateRelease, + eVoiceStateMuting, + eVoiceStateStolen, + eVoiceStateInvalid /* should never be in this state! */ + +} E_VOICE_STATE; +#define DEFAULT_VOICE_STATE eVoiceStateFree + +typedef struct s_synth_voice_tag +{ + +/* These parameters are common to both wavetable and FM + * synthesizers. The voice manager should only access this data. + * Any other data should be manipulated by the code that is + * specific to that synthesizer and reflected back through the + * common state data available here. + */ + EAS_U16 regionIndex; /* index to wave and playback params */ + EAS_I16 gain; /* current gain */ + EAS_U16 age; /* large value means old note */ + EAS_U16 nextRegionIndex; /* index to wave and playback params */ + EAS_U8 voiceState; /* current voice state */ + EAS_U8 voiceFlags; /* misc flags/bit fields */ + EAS_U8 channel; /* this voice plays on this synth channel */ + EAS_U8 note; /* 12 <= key number <= 108 */ + EAS_U8 velocity; /* 0 <= velocity <= 127 */ + EAS_U8 nextChannel; /* play stolen voice on this channel */ + EAS_U8 nextNote; /* 12 <= key number <= 108 */ + EAS_U8 nextVelocity; /* 0 <= velocity <= 127 */ +} S_SYNTH_VOICE; + +/*------------------------------------ + * S_SYNTH data structure + * + * One instance for each MIDI stream + *------------------------------------ +*/ + +/* S_SYNTH.m_nFlags */ +#define SYNTH_FLAG_RESET_IS_REQUESTED 0x01 +#define SYNTH_FLAG_SP_MIDI_ON 0x02 +#define SYNTH_FLAG_UPDATE_ALL_CHANNEL_PARAMETERS 0x04 +#define SYNTH_FLAG_DEFERRED_MIDI_NOTE_OFF_PENDING 0x08 +#define DEFAULT_SYNTH_FLAGS SYNTH_FLAG_UPDATE_ALL_CHANNEL_PARAMETERS + +typedef struct s_synth_tag +{ + struct s_eas_data_tag *pEASData; + const S_EAS *pEAS; + +#ifdef DLS_SYNTHESIZER + S_DLS *pDLS; +#endif + +#ifdef EXTERNAL_AUDIO + EAS_EXT_PRG_CHG_FUNC cbProgChgFunc; + EAS_EXT_EVENT_FUNC cbEventFunc; + EAS_VOID_PTR *pExtAudioInstData; +#endif + + S_SYNTH_CHANNEL channels[NUM_SYNTH_CHANNELS]; + EAS_I32 totalNoteCount; + EAS_U16 maxPolyphony; + EAS_U16 numActiveVoices; + EAS_U16 masterVolume; + EAS_U8 channelsByPriority[NUM_SYNTH_CHANNELS]; + EAS_U8 poolCount[NUM_SYNTH_CHANNELS]; + EAS_U8 poolAlloc[NUM_SYNTH_CHANNELS]; + EAS_U8 synthFlags; + EAS_I8 globalTranspose; + EAS_U8 vSynthNum; + EAS_U8 refCount; + EAS_U8 priority; +} S_SYNTH; + +/*------------------------------------ + * S_VOICE_MGR data structure + * + * One instance for each EAS library instance + *------------------------------------ +*/ +typedef struct s_voice_mgr_tag +{ + S_SYNTH *pSynth[MAX_VIRTUAL_SYNTHESIZERS]; + EAS_PCM voiceBuffer[SYNTH_UPDATE_PERIOD_IN_SAMPLES]; + +#ifdef _FM_SYNTH + EAS_PCM operMixBuffer[SYNTH_UPDATE_PERIOD_IN_SAMPLES]; + S_FM_VOICE fmVoices[NUM_FM_VOICES]; +#endif + +#ifdef _WT_SYNTH + S_WT_VOICE wtVoices[NUM_WT_VOICES]; +#endif + +#ifdef _REVERB + EAS_PCM reverbSendBuffer[NUM_OUTPUT_CHANNELS * SYNTH_UPDATE_PERIOD_IN_SAMPLES]; +#endif + +#ifdef _CHORUS + EAS_PCM chorusSendBuffer[NUM_OUTPUT_CHANNELS * SYNTH_UPDATE_PERIOD_IN_SAMPLES]; +#endif + S_SYNTH_VOICE voices[MAX_SYNTH_VOICES]; + + EAS_SNDLIB_HANDLE pGlobalEAS; + +#ifdef DLS_SYNTHESIZER + S_DLS *pGlobalDLS; +#endif + +#ifdef _SPLIT_ARCHITECTURE + EAS_FRAME_BUFFER_HANDLE pFrameBuffer; +#endif + +#if defined(_SECONDARY_SYNTH) || defined(EAS_SPLIT_WT_SYNTH) + EAS_U16 maxPolyphonyPrimary; + EAS_U16 maxPolyphonySecondary; +#endif + + EAS_I32 workload; + EAS_I32 maxWorkLoad; + + EAS_U16 activeVoices; + EAS_U16 maxPolyphony; + + EAS_U16 age; + +/* limits the number of voice starts in a frame for split architecture */ +#ifdef MAX_VOICE_STARTS + EAS_U16 numVoiceStarts; +#endif +} S_VOICE_MGR; + +#endif /* #ifdef _EAS_SYNTH_H */ + + |