Home | History | Annotate | Download | only in lib_src
      1 /*----------------------------------------------------------------------------
      2  *
      3  * File:
      4  * eas_synth.h
      5  *
      6  * Contents and purpose:
      7  * Declarations, interfaces, and prototypes for synth.
      8  *
      9  * Copyright Sonic Network Inc. 2004, 2005
     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: 718 $
     26  *   $Date: 2007-06-08 16:43:16 -0700 (Fri, 08 Jun 2007) $
     27  *----------------------------------------------------------------------------
     28 */
     29 
     30 #ifndef _EAS_SYNTH_H
     31 #define _EAS_SYNTH_H
     32 
     33 #include "eas_types.h"
     34 #include "eas_sndlib.h"
     35 
     36 #ifdef _WT_SYNTH
     37 #include "eas_wtsynth.h"
     38 #endif
     39 
     40 #ifdef _FM_SYNTH
     41 #include "eas_fmsynth.h"
     42 #endif
     43 
     44 #ifndef NUM_OUTPUT_CHANNELS
     45 #define NUM_OUTPUT_CHANNELS         2
     46 #endif
     47 
     48 #ifndef MAX_SYNTH_VOICES
     49 #define MAX_SYNTH_VOICES            64
     50 #endif
     51 
     52 #ifndef MAX_VIRTUAL_SYNTHESIZERS
     53 #define MAX_VIRTUAL_SYNTHESIZERS    4
     54 #endif
     55 
     56 /* defines */
     57 #ifndef NUM_PRIMARY_VOICES
     58 #define NUM_PRIMARY_VOICES      MAX_SYNTH_VOICES
     59 #elif !defined(NUM_SECONDARY_VOICES)
     60 #define NUM_SECONDARY_VOICES    (MAX_SYNTH_VOICES - NUM_PRIMARY_VOICES)
     61 #endif
     62 
     63 #if defined(EAS_WT_SYNTH)
     64 #define NUM_WT_VOICES           MAX_SYNTH_VOICES
     65 
     66 /* FM on MCU */
     67 #elif defined(EAS_FM_SYNTH)
     68 #define NUM_FM_VOICES           MAX_SYNTH_VOICES
     69 
     70 /* wavetable drums on MCU, wavetable melodic on DSP */
     71 #elif defined(EAS_SPLIT_WT_SYNTH)
     72 #define NUM_WT_VOICES           MAX_SYNTH_VOICES
     73 
     74 /* wavetable drums and FM melodic on MCU */
     75 #elif defined(EAS_HYBRID_SYNTH)
     76 #define NUM_WT_VOICES           NUM_PRIMARY_VOICES
     77 #define NUM_FM_VOICES           NUM_SECONDARY_VOICES
     78 
     79 /* wavetable drums on MCU, FM melodic on DSP */
     80 #elif defined(EAS_SPLIT_HYBRID_SYNTH)
     81 #define NUM_WT_VOICES           NUM_PRIMARY_VOICES
     82 #define NUM_FM_VOICES           NUM_SECONDARY_VOICES
     83 
     84 /* FM synth on DSP */
     85 #elif defined(EAS_SPLIT_FM_SYNTH)
     86 #define NUM_FM_VOICES           MAX_SYNTH_VOICES
     87 
     88 #else
     89 #error "Unrecognized architecture option"
     90 #endif
     91 
     92 #define NUM_SYNTH_CHANNELS      16
     93 
     94 #define DEFAULT_SYNTH_VOICES    MAX_SYNTH_VOICES
     95 
     96 /* use the following values to specify unassigned channels or voices */
     97 #define UNASSIGNED_SYNTH_CHANNEL    NUM_SYNTH_CHANNELS
     98 #define UNASSIGNED_SYNTH_VOICE      MAX_SYNTH_VOICES
     99 
    100 
    101 /* synth parameters are updated every SYNTH_UPDATE_PERIOD_IN_SAMPLES */
    102 #define SYNTH_UPDATE_PERIOD_IN_SAMPLES  (EAS_I32)(0x1L << SYNTH_UPDATE_PERIOD_IN_BITS)
    103 
    104 /* stealing weighting factors */
    105 #define NOTE_AGE_STEAL_WEIGHT           1
    106 #define NOTE_GAIN_STEAL_WEIGHT          4
    107 #define CHANNEL_POLY_STEAL_WEIGHT       12
    108 #define CHANNEL_PRIORITY_STEAL_WEIGHT   2
    109 #define NOTE_MATCH_PENALTY              128
    110 #define SYNTH_PRIORITY_WEIGHT           8
    111 
    112 /* default synth master volume */
    113 #define DEFAULT_SYNTH_MASTER_VOLUME     0x7fff
    114 
    115 #define DEFAULT_SYNTH_PRIORITY          5
    116 
    117 /* default tuning values */
    118 #define DEFAULT_PITCH_BEND_SENSITIVITY      200     /* 2 semitones */
    119 #define DEFAULT_FINE_PITCH                  0       /* 0 cents */
    120 #define DEFAULT_COARSE_PITCH                0       /* 0 semitones */
    121 
    122 /* default drum channel is 10, but is internally 9 due to unit offset */
    123 #define DEFAULT_DRUM_CHANNEL            9
    124 
    125 /* drum channel can simultaneously play this many voices at most */
    126 #define DEFAULT_CHANNEL_POLYPHONY_LIMIT 2
    127 
    128 /* default instrument is acoustic piano */
    129 #define DEFAULT_MELODY_BANK_MSB         0x79
    130 #define DEFAULT_RHYTHM_BANK_MSB         0x78
    131 #define DEFAULT_MELODY_BANK_NUMBER      (DEFAULT_MELODY_BANK_MSB << 8)
    132 #define DEFAULT_RHYTHM_BANK_NUMBER      (DEFAULT_RHYTHM_BANK_MSB << 8)
    133 #define DEFAULT_SYNTH_PROGRAM_NUMBER    0
    134 
    135 #define DEFAULT_PITCH_BEND      0x2000  /* 0x2000 == (0x40 << 7) | 0x00 */
    136 #define DEFAULT_MOD_WHEEL       0
    137 #define DEFAULT_CHANNEL_VOLUME  0x64
    138 #define DEFAULT_PAN             0x40    /* decimal 64, center */
    139 
    140 #ifdef _REVERB
    141 #define DEFAULT_REVERB_SEND     40      /* some reverb */
    142 #endif
    143 
    144 #ifdef _CHORUS
    145 #define DEFAULT_CHORUS_SEND     0       /* no chorus */
    146 #endif
    147 
    148 #define DEFAULT_EAS_FILTER_CUTOFF_FREQUENCY 0           /* EAS synth uses a different default */
    149 #define DEFAULT_FILTER_RESONANCE        0
    150 #define DEFAULT_EXPRESSION              0x7F
    151 
    152 #define DEFAULT_CHANNEL_PRESSURE        0
    153 
    154 #define DEFAULT_REGISTERED_PARAM        0x3FFF
    155 
    156 #define DEFAULT_CHANNEL_STATIC_GAIN     0
    157 #define DEFAULT_CHANNEL_STATIC_PITCH    0
    158 
    159 #define DEFAULT_LFO_MOD_WHEEL_TO_PITCH_CENTS            50
    160 #define DEFAULT_LFO_CHANNEL_PRESSURE_TO_PITCH_CENTS     50
    161 
    162 #define DEFAULT_KEY_NUMBER          0x69
    163 #define DEFAULT_VELOCITY            0x64
    164 #define DEFAULT_REGION_INDEX        0
    165 #define DEFAULT_ARTICULATION_INDEX  0
    166 #define DEFAULT_VOICE_GAIN          0
    167 #define DEFAULT_AGE                 0
    168 #define DEFAULT_SP_MIDI_PRIORITY    16
    169 
    170 
    171 /* filter defines */
    172 #define DEFAULT_FILTER_ZERO     0
    173 #define FILTER_CUTOFF_MAX_PITCH_CENTS       1919
    174 #define FILTER_CUTOFF_MIN_PITCH_CENTS       -4467
    175 #define A5_PITCH_OFFSET_IN_CENTS            6900
    176 
    177 /*------------------------------------
    178  * S_SYNTH_CHANNEL data structure
    179  *------------------------------------
    180 */
    181 
    182 /* S_SYNTH_CHANNEL.m_nFlags */
    183 #define CHANNEL_FLAG_SUSTAIN_PEDAL                      0x01
    184 #define CHANNEL_FLAG_MUTE                               0x02
    185 #define CHANNEL_FLAG_UPDATE_CHANNEL_PARAMETERS          0x04
    186 #define CHANNEL_FLAG_RHYTHM_CHANNEL                     0x08
    187 #define CHANNEL_FLAG_EXTERNAL_AUDIO                     0x10
    188 #define DEFAULT_CHANNEL_FLAGS                           0
    189 
    190 /* macros for extracting virtual synth and channel numbers */
    191 #define GET_VSYNTH(a) ((a) >> 4)
    192 #define GET_CHANNEL(a) ((a) & 15)
    193 
    194 typedef struct s_synth_channel_tag
    195 {
    196     /* use static channel parameters to reduce MIPs */
    197     /* parameters shared by multiple voices assigned to same channel */
    198     EAS_I32     staticPitch;        /* (pitch bend * pitch sens) + fine pitch */
    199     EAS_I16     staticGain;         /* (CC7 * CC11 * master vol)^2  */
    200 
    201     EAS_U16     regionIndex;        /* index of first region in program */
    202 
    203     EAS_U16     bankNum;            /* play programs from this bank */
    204     EAS_I16     pitchBend;          /* pitch wheel value */
    205     EAS_I16     pitchBendSensitivity;
    206     EAS_I16     registeredParam;    /* currently selected registered param */
    207 
    208 
    209 #if defined(_FM_SYNTH)
    210     EAS_I16     lfoAmt;             /* amount of LFO to apply to voice */
    211 #endif
    212 
    213     EAS_U8      programNum;         /* play this instrument number */
    214     EAS_U8      modWheel;           /* CC1 */
    215     EAS_U8      volume;             /* CC7 */
    216     EAS_U8      pan;                /* CC10 */
    217 
    218     EAS_U8      expression;         /* CC11 */
    219 
    220     /* the following parameters are controlled by RPNs */
    221     EAS_I8      finePitch;
    222     EAS_I8      coarsePitch;
    223 
    224     EAS_U8      channelPressure;    /* applied to all voices on a given channel */
    225 
    226     EAS_U8      channelFlags;       /* bit field channelFlags for */
    227                                     /* CC64, SP-MIDI channel masking */
    228 
    229     EAS_U8      pool;               /* SPMIDI channel voice pool */
    230     EAS_U8      mip;                /* SPMIDI MIP setting */
    231 
    232 #ifdef  _REVERB
    233     EAS_U8      reverbSend;         /* CC91 */
    234 #endif
    235 
    236 #ifdef  _CHORUS
    237     EAS_U8      chorusSend;         /* CC93 */
    238 #endif
    239 } S_SYNTH_CHANNEL;
    240 
    241 /*------------------------------------
    242  * S_SYNTH_VOICE data structure
    243  *------------------------------------
    244 */
    245 
    246 /* S_SYNTH_VOICE.m_nFlags */
    247 #define VOICE_FLAG_UPDATE_VOICE_PARAMETERS              0x01
    248 #define VOICE_FLAG_SUSTAIN_PEDAL_DEFER_NOTE_OFF         0x02
    249 #define VOICE_FLAG_DEFER_MIDI_NOTE_OFF                  0x04
    250 #define VOICE_FLAG_NO_SAMPLES_SYNTHESIZED_YET           0x08
    251 #define VOICE_FLAG_DEFER_MUTE                           0x40
    252 #define DEFAULT_VOICE_FLAGS                             0
    253 
    254 /* S_SYNTH_VOICE.m_eState */
    255 typedef enum {
    256 
    257     eVoiceStateFree = 0,
    258     eVoiceStateStart,
    259     eVoiceStatePlay,
    260     eVoiceStateRelease,
    261     eVoiceStateMuting,
    262     eVoiceStateStolen,
    263     eVoiceStateInvalid          /* should never be in this state! */
    264 
    265 } E_VOICE_STATE;
    266 #define DEFAULT_VOICE_STATE     eVoiceStateFree
    267 
    268 typedef struct s_synth_voice_tag
    269 {
    270 
    271 /* These parameters are common to both wavetable and FM
    272  * synthesizers. The voice manager should only access this data.
    273  * Any other data should be manipulated by the code that is
    274  * specific to that synthesizer and reflected back through the
    275  * common state data available here.
    276  */
    277     EAS_U16             regionIndex;        /* index to wave and playback params */
    278     EAS_I16             gain;               /* current gain */
    279     EAS_U16             age;                /* large value means old note */
    280     EAS_U16             nextRegionIndex;    /* index to wave and playback params */
    281     EAS_U8              voiceState;         /* current voice state */
    282     EAS_U8              voiceFlags;         /* misc flags/bit fields */
    283     EAS_U8              channel;            /* this voice plays on this synth channel */
    284     EAS_U8              note;               /* 12 <= key number <= 108 */
    285     EAS_U8              velocity;           /* 0 <= velocity <= 127 */
    286     EAS_U8              nextChannel;        /* play stolen voice on this channel */
    287     EAS_U8              nextNote;           /* 12 <= key number <= 108 */
    288     EAS_U8              nextVelocity;       /* 0 <= velocity <= 127 */
    289 } S_SYNTH_VOICE;
    290 
    291 /*------------------------------------
    292  * S_SYNTH data structure
    293  *
    294  * One instance for each MIDI stream
    295  *------------------------------------
    296 */
    297 
    298 /* S_SYNTH.m_nFlags */
    299 #define SYNTH_FLAG_RESET_IS_REQUESTED                   0x01
    300 #define SYNTH_FLAG_SP_MIDI_ON                           0x02
    301 #define SYNTH_FLAG_UPDATE_ALL_CHANNEL_PARAMETERS        0x04
    302 #define SYNTH_FLAG_DEFERRED_MIDI_NOTE_OFF_PENDING       0x08
    303 #define DEFAULT_SYNTH_FLAGS     SYNTH_FLAG_UPDATE_ALL_CHANNEL_PARAMETERS
    304 
    305 typedef struct s_synth_tag
    306 {
    307     struct s_eas_data_tag   *pEASData;
    308     const S_EAS             *pEAS;
    309 
    310 #ifdef DLS_SYNTHESIZER
    311     S_DLS                   *pDLS;
    312 #endif
    313 
    314 #ifdef EXTERNAL_AUDIO
    315     EAS_EXT_PRG_CHG_FUNC    cbProgChgFunc;
    316     EAS_EXT_EVENT_FUNC      cbEventFunc;
    317     EAS_VOID_PTR            *pExtAudioInstData;
    318 #endif
    319 
    320     S_SYNTH_CHANNEL         channels[NUM_SYNTH_CHANNELS];
    321     EAS_I32                 totalNoteCount;
    322     EAS_U16                 maxPolyphony;
    323     EAS_U16                 numActiveVoices;
    324     EAS_U16                 masterVolume;
    325     EAS_U8                  channelsByPriority[NUM_SYNTH_CHANNELS];
    326     EAS_U8                  poolCount[NUM_SYNTH_CHANNELS];
    327     EAS_U8                  poolAlloc[NUM_SYNTH_CHANNELS];
    328     EAS_U8                  synthFlags;
    329     EAS_I8                  globalTranspose;
    330     EAS_U8                  vSynthNum;
    331     EAS_U8                  refCount;
    332     EAS_U8                  priority;
    333 } S_SYNTH;
    334 
    335 /*------------------------------------
    336  * S_VOICE_MGR data structure
    337  *
    338  * One instance for each EAS library instance
    339  *------------------------------------
    340 */
    341 typedef struct s_voice_mgr_tag
    342 {
    343     S_SYNTH                 *pSynth[MAX_VIRTUAL_SYNTHESIZERS];
    344     EAS_PCM                 voiceBuffer[SYNTH_UPDATE_PERIOD_IN_SAMPLES];
    345 
    346 #ifdef _FM_SYNTH
    347     EAS_PCM                 operMixBuffer[SYNTH_UPDATE_PERIOD_IN_SAMPLES];
    348     S_FM_VOICE              fmVoices[NUM_FM_VOICES];
    349 #endif
    350 
    351 #ifdef _WT_SYNTH
    352     S_WT_VOICE              wtVoices[NUM_WT_VOICES];
    353 #endif
    354 
    355 #ifdef _REVERB
    356     EAS_PCM                 reverbSendBuffer[NUM_OUTPUT_CHANNELS * SYNTH_UPDATE_PERIOD_IN_SAMPLES];
    357 #endif
    358 
    359 #ifdef _CHORUS
    360     EAS_PCM                 chorusSendBuffer[NUM_OUTPUT_CHANNELS * SYNTH_UPDATE_PERIOD_IN_SAMPLES];
    361 #endif
    362     S_SYNTH_VOICE           voices[MAX_SYNTH_VOICES];
    363 
    364     EAS_SNDLIB_HANDLE       pGlobalEAS;
    365 
    366 #ifdef DLS_SYNTHESIZER
    367     S_DLS                   *pGlobalDLS;
    368 #endif
    369 
    370 #ifdef _SPLIT_ARCHITECTURE
    371     EAS_FRAME_BUFFER_HANDLE pFrameBuffer;
    372 #endif
    373 
    374 #if defined(_SECONDARY_SYNTH) || defined(EAS_SPLIT_WT_SYNTH)
    375     EAS_U16                 maxPolyphonyPrimary;
    376     EAS_U16                 maxPolyphonySecondary;
    377 #endif
    378 
    379     EAS_I32                 workload;
    380     EAS_I32                 maxWorkLoad;
    381 
    382     EAS_U16                 activeVoices;
    383     EAS_U16                 maxPolyphony;
    384 
    385     EAS_U16                 age;
    386 
    387 /* limits the number of voice starts in a frame for split architecture */
    388 #ifdef MAX_VOICE_STARTS
    389     EAS_U16                 numVoiceStarts;
    390 #endif
    391 } S_VOICE_MGR;
    392 
    393 #endif /* #ifdef _EAS_SYNTH_H */
    394 
    395 
    396